El choque de EA cuando se utilizan varios pares... - página 2

 
DomGilberto:
Lo siento - Es mi culpa por no explicarlo bien. Miro en D1, 4Hr y finalmente 1Hr para que las MA's se separen en abanico (entre un montón de otros filtros) - Una vez que todos se alinearon, en el H1 esperará hasta que cualquier barra retroceda a la 21 EMA UNA VEZ, y luego desde allí colocará una orden por encima de los máximos y una parada por debajo de la 60 EMA - ATR.

El retroceso a la EMA 21 sólo ocurre una vez. A partir de ahí, dejará de buscar cualquier retroceso a la EMA 21. Lo que debería hacer, sin embargo, es asegurarse de que la orden pendiente abierta actual esté precisamente al día con los lotes, stops y tomas de beneficios DESPUÉS del cierre de cada hora. Sin embargo, no puedo entender por qué a veces funciona perfectamente, y actualiza la orden pendiente después de cada cierre H1, y otras veces no lo hace. La razón por la que la orden pendiente se actualiza es porque ""if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR) ".

Si eso no es cierto entonces no lo hará - SIN EMBARGO, hay innumerables veces en las que eso es cierto, sin embargo no eliminará la orden y colocará una nueva con los nuevos valores?

No estoy seguro de si se puede ver algo en ese código de arriba en relación con el vídeo? (Primer código que corrigió). Espero que sea más claro.

Creo que vas a tener que hacerlo de la manera difícil y laboriosa... imprimir las variables relevantes, moverte a través del tiempo en el Probador de Estrategias, tick por tick si es necesario, verificando cuales son las variables... entonces si encuentras que deberían hacer que algo suceda y no lo hicieron puedes enfocarte en ese código.

Es relativamente fácil detectar simples problemas de sintaxis en el código de otra persona, es más difícil y consume mucho más tiempo detectar errores en la codificación de su estrategia, por un lado, para poder hacer eso la estrategia tiene que ser entendida tan bien, si no mejor, que la persona que hace la codificación.

 
Sí, tienes razón. Voy a hacer exactamente eso ahora :) ¡gracias Raptor!
 
Una cosa que necesito tener clara en mi cabeza es; este código aquí, en el bucle, ¿cómo me aseguro de que está llevando a cabo la función OrderDelete() y el bucle está haciendo un bucle en cada cierre H1? ¿Es porque tengo esto en el "int start" que representa si el bucle se hace o no en una base H1? (El "IsNewCandle()") ?

int start()
 {
   if(IsNewCandle())
      {
      CheckForMaTrade();//signals, deletions and candle trails only need checked on a new candle.
      }

   if(OpenOrdersThisPair(Symbol())>0)
      {
      if(UseMoveToBreakEven)MoveToBreakEven();//Move to b/e, normal trail and MA_trail need to trail on each tick
      if(Use_MA_Trail)MA_Trail();
      }
   
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  
if(OrderSelect(OrderTicket(),SELECT_BY_TICKET, MODE_TRADES)==True)
{  
            
      if(OpenOrdersThisPair(Symbol())>0 && OrderSymbol()==Symbol() && OrderType()==OP_SELL)
         {
         CloseHalfOrder1(); 
         }
   
      if(OpenOrdersThisPair(Symbol())>0 && OrderSymbol()==Symbol() && OrderType()==OP_BUY)
         {
         CloseHalfOrder(); 
         }   
     }
}
 for(int b=OrdersTotal()-1; b>=0; b--)
         {
         if(!OrderSelect(b, SELECT_BY_POS, MODE_TRADES)) continue;
           
         if( OrderType() == OP_BUYSTOP &&
            OrderMagicNumber() == MagicNumber &&
            OrderSymbol() == Symbol() )        
            {
            if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR)  
               {
               Stored_BuyPrice = OrderOpenPrice();   
               DeleteOrder = OrderDelete(OrderTicket()); 
               }

            if(OpenOrdersThisPair(Symbol()) == 0 && DeleteOrder)  // If there are no open orders = place a new order. 
               {
               int NewBuyOrder = OrderSend(Symbol(), OP_BUYSTOP, LotSize, Stored_BuyPrice, 3, BuyStopPrice, btp, NULL, MagicNumber, 0, Green);
               if(NewBuyOrder == -1) Print("New Buy Order Last Error = ", GetLastError());
               }
            }
         }
bool IsNewCandle()
   {
   static datetime  Bar1Time;
   if(Bar1Time == Time[1]) //"Time" used to be "Bars" with no brackets 
      return(false);
      
   Bar1Time = Time[1]; //"Time" used to be "Bars" with no brackets 
   return(true);
   }
 
DomGilberto:
Una cosa que necesito tener clara en mi cabeza es; este código aquí, en el bucle, ¿cómo me aseguro de que se está llevando a cabo la función OrderDelete() y el bucle es el bucle en cada cierre H1? ¿Es porque tengo esto en el "int start" que representa si el bucle se hace o no en una base H1? (El "IsNewCandle()") ?


CheckForMATrade() se llama una vez por cada barra nueva, si está ejecutando en un gráfico H1 que será una vez al comienzo de la nueva barra H1... el resto se ejecuta cada tick.

¿Está calculando el valor correcto de ATR para el inicio de la nueva barra? Teniendo en cuenta que acaba de empezar la barra 0, ¿realmente quiere obtener el MA basado en la barra 0? Los indicadores no son lo mío, así que no asuma que estoy diciendo que está equivocado, sólo estoy preguntando

 
Sí, acabo de hacer una impresión para volver a comprobar las matemáticas MA-ATR. Es correcta. Lo estoy haciendo en la barra 1 (la barra H1 cerrada más recientemente). La matemática es correcta, sólo que no creo que los cálculos se hagan consistentemente en CADA cierre de barra H1...
 
DomGilberto:
Sí, acabo de hacer una impresión para volver a comprobar las matemáticas MA-ATR. Es correcto. Lo estoy haciendo en la barra 1 (la barra H1 cerrada más recientemente). La matemática es correcta, sólo que no creo que los cálculos se hagan consistentemente en CADA cierre de barra H1...

Sin embargo, la MA no está en la barra 1...

iMA(NULL, 60, MA_Period, 0, 1, 0, 0   ) - ATR)  
 
Buen punto, gracias :) Creo que sé por qué no se borra la orden... Si el OrderStopLoss no es > que el MA-ATR, entonces no hará nada... Así que tiene sentido... Solo que a veces lo miro, y es como si no quisiera borrar la orden y colocar una nueva cuando debería?

Una última pregunta, si no te importa, es que me sigue apareciendo el error 1 de modificación de pedidos. Resulta que viene de aquí cuando lo imprimo? ¿Alguna idea?

//+----------------------------------------------------------------------------------------------------------------------------------------+  
//Moving Average Trailing Stop Function
//+----------------------------------------------------------------------------------------------------------------------------------------+   
void MA_Trail()

{

   double ATR = iATR(NULL,60,14,1);
   double MA = iMA(NULL,60,MA_Period,0,1,0,1);
   
   double BuyStopPriceMath = MA - ATR;
   double SellStopPriceMath = MA + ATR;
   
   double BuyStopPrice = NormalizeDouble(BuyStopPriceMath,5);
   double SellStopPrice = NormalizeDouble(SellStopPriceMath,5);

   for(int b=OrdersTotal()-1; b>=0; b--)
     {
      if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               {
               //buy order section - This is where the stop will trail based 
               // upon a fixed point value stated on the EA. It will trail with price.
               if(OrderType()==OP_BUY)
                  {
                  if(OrderStopLoss() > BuyStopPrice) break; 
                  if(OrderStopLoss() < BuyStopPrice)
                     bool BuyModify = OrderModify(OrderTicket(),OrderOpenPrice(),BuyStopPrice,OrderTakeProfit(),0,CLR_NONE);
                   if(!BuyModify)Print(" Buy Trailing Stop Failed: ", GetLastError());
                   }     

               // sell order section - This is where the stop will trail based 
               // upon a fixed point value stated on the EA. It will trail with price.     
               if(OrderType()==OP_SELL)
                  {
                  if(OrderStopLoss() < SellStopPrice) break; 
                  if(OrderStopLoss() > SellStopPrice)
                     bool SellModify = OrderModify(OrderTicket(),OrderOpenPrice(),SellStopPrice,OrderTakeProfit(),0,CLR_NONE);
                  if(!SellModify)Print(" Sell Trailing Stop Failed: ", GetLastError());
                  }
               }   
     }
}
 
DomGilberto:
Buen punto, gracias :) Creo que ya sé por qué no se borra la orden... SI el OrderStopLoss NO es > que el MA-ATR, entonces no hará nada... Así que tiene sentido... Solo que a veces lo miro, y es como si no quisiera borrar la orden y colocar una nueva cuando debería?

Una última pregunta, si no te importa, es que sigo recibiendo el error 1 de modificación de pedidos. Resulta que viene de aquí cuando lo imprimo? ¿Alguna idea?

Esta es la cuestión... (similar para la OP_SELL)

if( OrderStopLoss() < BuyStopPrice )

. . y cuando obtienes un error 1 es porque OrderStopLoss() == BuyStopPrice por lo que estás modificando la orden para que tenga el mismo valor de StopLoss, de ahí el error 1 por lo que ahora te preguntas cómo por un lado OrderStopLoss() == BuyStopPrice y por otro OrderStopLoss() < BuyStopPrice

¿Has seguido el enlace del post y lo has leído hasta que te sangren los ojos? Apuesto a que no lo hiciste... https://www. mql5.com/en/forum/146380 si sigues ignorando este tema te seguirá atrapando y seguirás perdiendo el tiempo... entiéndelo, no lo sufras más, sé feliz

 

Ok voy a leer todo eso de nuevo - volviendo a la cuestión con el vídeo adjunto, cómo creo que he resuelto es a continuación, sin embargo, no funciona en el lado de la compra? Por alguna razón, no hay operaciones se activa en absoluto. Sin embargo, en el lado de la venta, está trabajando EXACTAMENTE como yo quiero?

Todo es EXACTAMENTE inverso para el lado de la compra. Todas esas declaraciones "if" son sólo promedios móviles. La línea específica que he cambiado es "triggerBarTime+H1_high>= ema21". En el lado de la compra se vería como = "triggerBarTime+H1_low<= ema21" - Si quito "triggerBarTime" entonces funcionará tanto en órdenes de compra como de venta. ¡Sin embargo, si dejo en "triggerBarTime" funcionará perfectamente en el lado de la venta (como en, cerrar las órdenes en CADA barra, recalcularla perfectamente y colocar una nueva orden con los parámetros ajustados!) PERO no colocará NINGUNA orden son intentar hacer nada en el lado de la Compra? Este es un ajuste realmente importante que necesito hacer...

Mira este video: http: //screencast.com/t/uJu3nlNxAXDF - ¡Espero que esto lo explique bien! :D


No te preocupes si no puedes ayudar :)

     // Check for Moving Averages Fanned up ON THE DAILY TIME FRAME, creating an UP bias.   
    if(D1_Bias=="None") 
      if(Daily_3<Daily_5)
         if(Daily_5<Daily_8)
            if(Daily_8<Daily_10)
               if(Daily_10<Daily_12)
                  if(Daily_12<Daily_15)
                     if(Daily_15<Daily_30)
                        if(Daily_30<Daily_35)
                           if(Daily_35<Daily_40)
                              if(Daily_40<Daily_45)
                                 if(Daily_45<Daily_50)
                                    if(Daily_50<Daily_60)
                                       {
                                       D1_Bar=Time[1];
                                       D1_Bias="Daily is Down";
                                       Comment("Bias is: "+D1_Bias+" since: "+TimeToStr(D1_Bar,TIME_DATE|TIME_MINUTES));
                                       }
   
   // Check for Moving Averages Fanned up ON THE 4 HOUR TIME FRAME, creating an UP bias.  
    if(H4_Bias=="None") 
      if(Hour4_3<Hour4_5)
         if(Hour4_5<Hour4_8)
            if(Hour4_8<Hour4_10)
               if(Hour4_10<Hour4_12)
                  if(Hour4_12<Hour4_15)
                     if(Hour4_15<Hour4_30)
                        if(Hour4_30<Hour4_35)
                           if(Hour4_35<Hour4_40)
                              if(Hour4_40<Hour4_45)
                                 if(Hour4_45<Hour4_50)
                                    if(Hour4_50<Hour4_60)
                                       {
                                       H4_Bar=Time[1];
                                       H4_Bias="4 Hour is Down";
                                       Comment("Bias is: "+H4_Bias+" since: "+TimeToStr(H4_Bar,TIME_DATE|TIME_MINUTES));
                                       }
   
   // Check for Moving Averages Fanned down creating an DOWN bias.  
   if(D1_Bias=="Daily is Down" && H4_Bias=="4 Hour is Down" && H1_Bias=="None")
      if(CurrentSmallFish1<CurrentSmallFish2)
         if(CurrentSmallFish2<CurrentSmallFish3)
            if(CurrentSmallFish3<CurrentSmallFish4)
               if(CurrentSmallFish4<CurrentSmallFish5)
                  if(CurrentSmallFish5<CurrentSmallFish6)
                     if(CurrentSmallFish6<CurrentBigFish1)
                        if(CurrentBigFish1<CurrentBigFish2)
                           if(CurrentBigFish2<CurrentBigFish3)
                              if(CurrentBigFish3<CurrentBigFish4)
                                 if(CurrentBigFish4<CurrentBigFish5)
                                    if(CurrentBigFish5<CurrentBigFish6)
                                       {
                                       triggerBarTime=Time[1];
                                       H1_Bias="Down";
                                       Comment("Bias is: "+H1_Bias+" since: "+TimeToStr(triggerBarTime,TIME_DATE|TIME_MINUTES));
                                       H4_Bias="4 Hour is Down";
                                       Comment("Bias is: "+H4_Bias+" since: "+TimeToStr(H4_Bar,TIME_DATE|TIME_MINUTES));
                                       D1_Bias="Daily is Down";
                                       Comment("Bias is: "+D1_Bias+" since: "+TimeToStr(D1_Bar,TIME_DATE|TIME_MINUTES));
                                       }
   
   ///////////////////////////////////////////////////////////////////////////////////////
   
   H1_high  = iHigh(NULL, PERIOD_H1, 1);
   H1_close = iClose(NULL, PERIOD_H1, 1);
   if(H1_Bias=="Down" && H4_Bias=="4 Hour is Down" && D1_Bias=="Daily is Down" && triggerBarTime+H1_high >= ema21 && H1_close < CurrentBigFish6)
      {
      OrderEntry(1); // Sell function is called.
      }
 
¿Alguna idea?
Razón de la queja: