Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 65

 

¡Buenos días a todos! Si he intentado colocar un stop loss en un arrastre, no he visto este problema en el Probador de Estrategias. Cuando en el Probador de Estrategias cuando el EA debería colocar un Stop Loss no lo hace sin embargo lo hace periódicamente, pero no he encontrado ninguna regularidad y por lo tanto la precisión de la prueba se resiente considerablemente. El mismo Asesor Experto en el depósito de demostración muestra que el arrastre funciona. El terminal no informa de ningún error. ¿Es un error en el código o un error en el terminal? ¿Puede ayudarme a entenderlo? He probado todo el código y no entiendo qué es lo que falla, no quiero cambiar la estrategia de rastro. He adjuntado el código completo de Expert Advisor y a continuación el código de arrastre (ligeramente modificado trailing on candlestick shadow por Yury Dzyuban)

void TrailingByShadows(int ticket,int tmfrm,int bars_n, int indent) {  
   int i;
   double new_extremum;

   if ((bars_n<1) || (indent<0) || (ticket==0) || ((tmfrm!=1) && (tmfrm!=5) && (tmfrm!=15) && (tmfrm!=30) && (tmfrm!=60) && (tmfrm!=240) && (tmfrm!=1440) && (tmfrm!=10080) && (tmfrm!=43200)) || (!OrderSelect(ticket,SELECT_BY_TICKET))) {
      Print("Трейлинг функцией TrailingByShadows() невозможен из-за некорректности значений переданных ей аргументов.");
      return(0);
   } 
   if (OrderType()==OP_BUY) {
      for(i=1;i<=bars_n;i++) {
         if (i==1) new_extremum = iLow(Symbol(),tmfrm,i); else if (new_extremum>iLow(Symbol(),tmfrm,i)) new_extremum = iLow(Symbol(),tmfrm,i);
      }  
  
      if ((((new_extremum - indent*Point)>OrderStopLoss() + 1.0 * Point) || (OrderStopLoss()==0)) && ((new_extremum - indent*Point)>OrderOpenPrice()) && (new_extremum - indent*Point<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point) && (getLots(new_extremum) > 0))
      if (!OrderModify(ticket,OrderOpenPrice(),new_extremum-indent*Point,OrderTakeProfit(),OrderExpiration()))
         Print("Не удалось модифицировать ордер №",OrderTicket(),". Ошибка: ",GetLastError());
   }
   if (OrderType()==OP_SELL) {
      for(i=1;i<=bars_n;i++) {
         if (i==1) new_extremum = iHigh(Symbol(),tmfrm,i); else if (new_extremum<iHigh(Symbol(),tmfrm,i)) new_extremum = iHigh(Symbol(),tmfrm,i);
      }         
      if ((((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point)<OrderStopLoss() - 1.0 * Point) || (OrderStopLoss()==0)) && ((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point)<OrderOpenPrice()) && (new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point) && (getLots(new_extremum) > 0))
      if (!OrderModify(ticket,OrderOpenPrice(),new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration()))
         Print("Не удалось модифицировать ордер №",OrderTicket(),". Ошибка: ",GetLastError());     
   }      
}

double getLots(double newSL) {
   int opnTime = 0; // время открытия трейда для цикла пересчета позиций
   double lotSum = 0; 
   for (int i = 0; i <= OrdersTotal()-1; i++) {
      OrderSelect(i, SELECT_BY_POS);     
      if ((OrderOpenTime() > opnTime) && (OrderType() == OP_BUY) || (OrderType() == OP_SELL)) { 
         opnTime = OrderOpenTime(); 
         if (OrderType() == OP_BUY)    { lotSum += OrderLots() * (newSL - OrderOpenPrice()) / Point; }
         if (OrderType() == OP_SELL)   { lotSum -= OrderLots() * (newSL - OrderOpenPrice()) / Point; }
      }
   }   
   return(lotSum);
}
Archivos adjuntos:
avalanche.mq4  12 kb
 
¿En qué plazo se hacen las pruebas y con qué calidad?
 

EURUSD, M1, 99%, 90%

Al principio utilicé el historial de ticks estándar, cargado con MT, he encontrado este problema, así como lagunas inexplicables en el historial de cotizaciones, por lo que he cambiado a Tick Data Suite, he descargado las cotizaciones de Dukascopy, la calidad aumentó de 90 a 99, pero el problema persiste.

ZS: Probablemente la misma situación en la vida real, o no probé el tiempo suficiente (alrededor de 3 semanas), durante ese período tuve que cerrar manualmente varias veces porque el arrastre no estaba instalado, pero pensé que era porque tenía que desconectar la máquina terminal periódicamente y de alguna manera afectaba el funcionamiento de EA, recientemente lo moví a VPS tal vez hace una semana y ahora parece estar dibujando la misma situación

 

¿Se realiza la prueba en un marco temporal que es igual al valor de la variable tmfrm o no?

si no es así, debes asegurarte de que hay un historial en el marco temporal de tmfrm...

y el número de tanques transmitidos en la variable bars_n corresponde al marco temporal transmitido en la variable tmfrm ?

 
keekkenen:

¿Se realiza la prueba en un marco temporal que es igual al valor de la variable tmfrm o no?

si no es así, debes asegurarte de que hay un historial en el marco temporal de tmfrm...

y el número de depósitos pasados en la variable bars_n corresponde al marco temporal pasado en la variable tmfrm ?


Sí, supongo que tienes razón, he descuidado el código de la función de otra persona, no he mirado en profundidad y no he tenido en cuenta ese parámetro. En consecuencia, el stop loss se fijó para un periodo diferente. Gracias por su ayuda.

ZS: Siempre es así: algún pequeño detalle hace que el código no funcione como me gustaría.

 

¡Buenas tardes! ¡Quién sabe qué demonios pasa con el ladrillo rojo del tronco!

2013.08.05 08:00:41 '9291791': Señal - no se encuentra la señal de actualización - 7400 en la base

¡No hay nada malo en mi código! Y además con señales. ¿Qué significa esto?

 
Mepkypuu:


Sí, parece que tienes razón, descuidé el código de la función de otro, no profundicé en él y no tuve en cuenta este parámetro. En consecuencia, el stop loss se fijó para un periodo diferente. Gracias por su ayuda.

ZS: Siempre es así: algún pequeño detalle hace que el código no funcione como me gustaría.


Me alegré demasiado pronto, el arrastre ha empezado a funcionar mejor, pero en el historial todavía hay casos en los que no funciona, es decir, el problema está resuelto sólo parcialmente.
 
splxgf:

¿Se fija el spread? Porque durante las corridas se toma el spread actual, pero durante las noticias y por la noche difiere del spread diario.

¿Cómo se arregla el diferencial? Al fin y al cabo, OrderSend especifica el Ask o el Bid.
 
Mepkypuu:

Todavía no estoy contento, el arrastre funciona mejor, pero todavía hay casos en los que no funciona, es decir, el problema está resuelto sólo parcialmente.

Lo que usted llama Trailing no es realmente Trailing, se calcula de una manera diferente y su comportamiento puede ser ilógico.
 
Leo59:

¿Cómo se puede arreglar el diferencial? Al fin y al cabo, OrderSend especifica el Ask o el Bid.
¡En el probador bajo el TF!
Razón de la queja: