[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. No puedo ir a ningún sitio sin ti - 4. - página 129

 
Me pueden decir dónde está el error - no lo encuentro.
Ya reescribí el código de modificación de la orden y el error permanece.
Subrayo que el error no es del registro - no hay un solo error en el registro.
Encontré el error en los resultados al ejecutar una prueba.
Ejemplo:
Abrí una posición de compra (orden número 1) con el precio 1.4654
luego en los resultados dice modificar (orden número 1) precio 1.4654 y TakeProfit 1.4752
luego en los resultados dice cerrar (orden número 1) precio 1.4704 y TakeProfit 1.4752
Beneficio = 50.00

Ejemplo de posición con pérdidas aunque debería cerrar sólo en TakeProfit porque no he puesto Stop Loss.
Abrí una posición de compra (orden número 271) a 1,4820
y en los Resultados dice modificar (orden número 271) precio 1,4820 y TakeProfit 1,4918
y en los Resultados dice cerrar (orden número 1) precio 1,4737 y TakeProfit 1,4918
Beneficio = - 83,46

Puse un TakeProfit de 100 en todas partes.

No he puesto StopLoss.

No sé cómo arreglarlo.

Al compilar este código EA = 0 errores y 0 advertencias.

He utilizado este código para modificar los pedidos:

//|  Описание : Модификация ордера. Версия функции для тестов на истории.      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    pp - цена открытия позиции, установки ордера                            |
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//|    ex - дата истечения                                                     |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0){
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er;
  double op=NormalizeDouble(OrderOpenPrice() , dg);
  double os=NormalizeDouble(OrderStopLoss()  , dg);
  double ot=NormalizeDouble(OrderTakeProfit(), dg);
  color  cl;

  if (pp<=0) pp=OrderOpenPrice();
  if (sl<0 ) sl=OrderStopLoss();
  if (tp<0 ) tp=OrderTakeProfit();
  
  pp=NormalizeDouble(pp, dg);
  sl=NormalizeDouble(sl, dg);
  tp=NormalizeDouble(tp, dg);

  if (pp!=op || sl!=os || tp!=ot) {
    if (MathMod(OrderType(), 2)==0) cl=clModifyBuy;
    if (!OrderModify(OrderTicket(), pp, sl, tp, ex, cl)) {
      er=GetLastError();
      Print("Error(",er,") modifying order: ",Error(error_code));
      Print("Ask=",Ask," Bid=",Bid," sy=",OrderSymbol(),
            " op="+GetNameOP(OrderType())," pp=",pp," sl=",sl," tp=",tp);
    }
  }
}
 
Me olvidé de mencionar que este EA funciona a través de una hoja de cálculo de Excel - el archivo Orders.csv guardado en el \experts\file
 
alex12:
Me pueden decir dónde está el error - no lo encuentro.
Ya he reescrito el código de modificación de la orden y el error persiste.
Subrayo que el error no es del registro - no hay un solo error en el registro.
He encontrado el error en los resultados durante la prueba.
Ejemplo:
He abierto una posición de compra (orden número 1) a 1,4654
A continuación, en los Resultados dice modificar (orden número 1) precio 1,4654 y TakeProfit 1,4752.
A continuación, en los Resultados dice precio de cierre (orden número 1) 1.4704 y TakeProfit 1.4752
Beneficio = 50,00

Un ejemplo de una posición perdedora aunque debería cerrar sólo en Take Profit porque no he puesto Stop Loss.
He abierto una posición de compra (orden número 271) a 1,4820
A continuación, en los Resultados dice modificar (orden número 271) precio 1.4820 y TakeProfit 1.4918
a continuación, dice cerrar (orden número 1) precio 1,4737 y TakeProfit 1,4918 en los resultados
Beneficio = - 83,46

He puesto el TakeProfit a 100 en todas partes.

No he puesto StopLoss.

No sé cómo arreglarlo.

Al compilar este código EA = 0 errores y 0 advertencias.

He utilizado este código para modificar los pedidos:

Cuando el cierre de las operaciones en el probador se escribe como se muestra aquí, lo más probable es que sea el resultado de la función orderclose (TP y SL no tienen nada que ver)
 

Por favor, ayúdenme a encontrar los valores de

1 Volatilidad máxima diaria (máxima diaria menos mínima) en los últimos X=5 días .

2 Volatilidad media diaria durante losúltimos X=130 días

3 Y cómo se pueden escribir estos valores en la condición si la Volatilidad Diaria Máxima se encuentra en el rango A=75 a B=150- Volatilidad Diaria Media

double Dmax= 0.0; 
double DAvg= 0.0;
int a = 0; 
int d =d+1;  
while(a < 5) 
  { 
    Dmax = iHigh(Symbol(),PERIOD_D1,d)-iLow(Symbol(),PERIOD_D1,d); 
    a++; 
  } 
//Comment( "T ("+Dmax+")");

while(a < 130) 
   {  
 
DAvg += (iHigh(Symbol(),PERIOD_D1,d-1)-iLow(Symbol(),PERIOD_D1,d-1))/130; 
    a++; 
}
Comment( "T ("+DAvg+")");
 
sergeev:

1. Primero hay que averiguar cuántas barras se necesitan en la ventana https://docs.mql4.com/ru/windows/WindowBarsPerChart.

2. Entonces obtendrá la fecha de la primera barra https://docs.mql4.com/ru/windows/WindowFirstVisibleBar.

3. Conociendo esta barra inicial y el número de barras - recorre estas barras y determina el máximo y el mínimo entre ellas

4. beneficios


Variante 2

https://docs.mql4.com/ru/windows/WindowPriceMaxтво

https://docs.mql4.com/ru/windows/WindowPriceMinВторой variante

Me inclinaba por la primera opción, pero no sabía cómo calcular el número de barras de la ventana. La segunda opción es más lacónica.

Pero, ¿cómo "coger" el último máximo y mínimo de la barra anterior? ¡Gracias de antemano!

 
MK07:


Pero, ¿cómo "atrapar" el último máximo y mínimo de la barra anterior?

Basta con memorizar el máximo y el mínimo alcanzado en la barra actual, y cuando aparezca una nueva barra que se convierta en la anterior, tomará el máximo y el mínimo de las variables memorizadas.

 
sergeev:

Basta con recordar el máximo y el mínimo alcanzado en la barra actual, y cuando aparezca una nueva barra que se convierta en la anterior, tomará el máximo y el mínimo de las variables recordadas.


¿Pero cómo? Supongamos que asignamos un valor máximo a la variable Z y aparece una nueva barra (que puede ser comprobada) y a Z se le asigna inmediatamente un nuevo valor, mientras que el valor (Z-1) se "pierde". Probablemente, debería haber alguna comprobación a la hora de asignar un nuevo valor a Z (puede ser que aparezca una nueva barra), ¡confío en tu profesionalidad y paciencia! Gracias por sus esfuerzos.
 

declarar la variable zet como estática, o declararla en la zona global.

Antes de asignarle un nuevo valor, comprueba si hay una nueva barra, y comprueba la diferencia entre su valor y el valor actual, y luego le asigna un nuevo valor.

 
smshev:
Cuando el cierre de las operaciones en el probador se escribe como usted ha enumerado, lo más probable es el resultado de la función orderclose (TP y SL no tienen nada que ver con él)

Gracias, pero parece que no hay errores en el código:

int CloseOrder(int ticket, double lots)
              {
               int err,i1;
               double price;
               OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
               if (lots<MarketInfo(Symbol(),MODE_MINLOT))lots=MarketInfo(Symbol(),MODE_MINLOT);
               while(i1<10)
                   {
                    RefreshRates();
                    if (OrderType()==0)price=Bid;
                    if (OrderType()==1)price=Ask;
                    if (OrderType()>1){OrderDelete(ticket);return(0);}
                    OrderClose(ticket,lots,NormalizeDouble(price,Digits),Slippage,Goldenrod);
                    err = GetLastError();
                    if (err == 0) break;
                    Print(WindowExpertName(),Symbol(),Error(err),"  при закрытии ордера");
                    Sleep(100);
                    i1++;
                   }
               return(0);
              }
 

pero hay otro código en el EA:

int CloseMarket()
   {
    for (int j=0; j<OrdersTotal(); j++)
      {
       OrderSelect(j,SELECT_BY_POS,MODE_TRADES);
       if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()<2)
         {
          CloseOrder(OrderTicket(),OrderLots());
          j--;
         }
      }
   }