El choque de EA cuando se utilizan varios pares...

 
En primer lugar, sé Raptor que me has planteado esta cuestión antes, pero no puedo recordar dónde lo escribiste y, lo que es más importante, entender dónde me estoy equivocando?

Por lo que sé, lo estaba escribiendo correctamente para que el EA unido a cualquier par correspondiente pueda trabajar siempre sólo en ese par. Por el momento, me he dado cuenta de que GBPCAD y GBPUSD parecen no llevarse bien, lo que significa que el stoploss de GBPCAD piensa que su cálculo lo realiza el par GBPUSD... así que cuando se dispara una orden pendiente, el stop loss parpadea de los valores de GBPCAD a cable....

Yo uso magicnumber==1234;

Cualquier sugerencia o áreas que estoy siendo un idiota con, por favor no dude en destacar :(

//+-------------------------------------------------------------------------------------+
//| Order Buy Function                                                                  |
//+-------------------------------------------------------------------------------------+   

//Place a pending buystop if no orders exists.. pending or otherwise.
if(direction==0)
{ 
      double btp=buy_takeprofit_price;
      
      double Min_Lot = MarketInfo(Symbol(),MODE_MINLOT);

      double Lot_Step = MarketInfo(Symbol(),MODE_LOTSTEP);

      double BuyLotSize =(RiskedAmount/(pips_to_bsl/pips))/10;
      double Lots = NormalizeDouble(BuyLotSize,2);
      LotSize = MathFloor(Lots/Lot_Step)*Lot_Step;

  
      static double Stored_BuyPrice;

      if(OpenOrdersThisPair(Symbol())==0)
         {
         int BuyTicketOrder= OrderSend(Symbol(),OP_BUYSTOP,LotSize,buyPrice,3,BuyStopPrice,btp,NULL,MagicNumber,0,Green);  >>>>// I am not sure if its this part? There is no way for this first OrderSend to tell what pair it is?
         if(BuyTicketOrder == -1)Print("First Buy Order Last Error = ",GetLastError());
         } 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



      for(int b=OrdersTotal()-1; b>=0; b--)
         {
         if(!OrderSelect(b,SELECT_BY_POS,MODE_TRADES))continue;
           
         if(OrderType()==OP_BUYSTOP) 
            if(OrderMagicNumber()==MagicNumber)
               if(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==True)// 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());
            }
      }
} 
 
DomGilberto:
En primer lugar, sé Raptor que me has planteado esta cuestión antes, pero no puedo recordar dónde lo escribiste, y, lo que es más importante, entender dónde me estoy equivocando?

Por lo que sé, lo estaba escribiendo correctamente para que el EA vinculado a cualquier par correspondiente pueda trabajar siempre sólo en ese par. Por el momento, me he dado cuenta de que GBPCAD y GBPUSD parecen no llevarse bien, lo que significa que el stoploss de GBPCAD piensa que su cálculo lo realiza el par GBPUSD... así que cuando se dispara una orden pendiente, el stop loss parpadea de los valores de GBPCAD a cable....

Yo uso magicnumber==1234;

Cualquier sugerencia o áreas que estoy siendo un idiota con, por favor no dude en destacar :(

Tu problema es claro, pero puede ser un poco difícil de ver debido a la forma en que utilizas la sangría de las llaves y las condiciones . . haces esto:

      for(int b=OrdersTotal()-1; b>=0; b--)
         {
         if(!OrderSelect(b,SELECT_BY_POS,MODE_TRADES))continue;
           
         if(OrderType()==OP_BUYSTOP) 
            if(OrderMagicNumber()==MagicNumber)
               if(OrderSymbol()==Symbol())                                  // if the symbol matches do . . . 
                   if(OrderStopLoss()<iMA(NULL,60,MA_Period,0,1,0,0)-ATR)   //  . . . .  this
                        {
                        Stored_BuyPrice = OrderOpenPrice();                 // and this
                        DeleteOrder = OrderDelete(OrderTicket());           // and this
                        }

         if(OpenOrdersThisPair(Symbol())==0 && DeleteOrder==True)// If there are no open orders = place a new order.   //  this happens even if the symbol didn't match . . .
            {
            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());
            }
      }

Creo que lo que querías decir era esto. . .

     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());
               }
            }
         }
 
Ah, ok - una pequeña cosa que se me pasó por alto allí. Además, cuando se llama a la primera función OrderSend(), ¿estoy haciendo algo mal ahí? Lo pregunto porque estoy tratando de pensar lógicamente si en ese momento sabe o no a qué par debe enviarse el OrderSend. Puede que sea una pregunta estúpida, pero no estoy haciendo nada mal con esa parte, ¿verdad? ¿La parte de la función de envío "BuyTicketOrder"?

Gracias por descubrirme esa parte :)
 
DomGilberto:
Ah, ok - una pequeña cosa que se me pasó por alto allí. Además, cuando se llama a la primera función OrderSend(), ¿estoy haciendo algo mal ahí? Lo pregunto porque estoy tratando de pensar lógicamente si en ese momento sabe o no a qué par debe enviarse el OrderSend. Puede que sea una pregunta estúpida, pero no estoy haciendo nada mal con esa parte, ¿verdad? ¿La parte de la función de envío "BuyTicketOrder"?

Gracias por haberme descubierto esa parte :)
Symbol() es el símbolo del gráfico en el que se ejecuta el EA... no puede equivocarse, sólo puede ser un símbolo
 
//+----------------------------------------------------------------------------------------------------------------------------------------+  
//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);

//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.
   for(int b=OrdersTotal()-1; b>=0; b--)
     {
      if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               if(OrderType()==OP_BUY)
               {
                 if(OrderStopLoss() > BuyStopPrice)break; 
                  if(OrderStopLoss() < BuyStopPrice)
                    bool BuyModify = OrderModify(OrderTicket(),OrderOpenPrice(),BuyStopPrice,OrderTakeProfit(),0,CLR_NONE);
                    if(BuyModify < 0)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.     
   for(int s=OrdersTotal()-1; s>=0; s--)
     {
      if(OrderSelect(s,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               if(OrderType()==OP_SELL)
               {
                 if(OrderStopLoss() < SellStopPrice)break; 
                   if(OrderStopLoss() > SellStopPrice)
                    bool SellModify = OrderModify(OrderTicket(),OrderOpenPrice(),SellStopPrice,OrderTakeProfit(),0,CLR_NONE);
                    if(SellModify < 0)Print(" Sell Trailing Stop Failed: ", GetLastError());
               }   
     }

  }
Ok - Creo que esto es lo que estaba causando el problema. Acabo de actualizar el código en esta parte y parece que ahora ha dejado de cambiar en cada garrapata de los precios de cable a GBPCAD ... Ahora está atascado en un precio de parada hasta que se actualice en este cierre horario ... así que voy a confirmar.

¿Te parece bien? Además, debido a que tengo estos cierres parciales de órdenes, asumo que probablemente tengo que volver a comprobar que los corchetes están en la posición correcta en relación con "OrderSymbol()==Symbol())"?
 
if(OpenOrdersThisPair(Symbol()) == 0
¿Cuántas veces quiere llamar a esto? ¿Para cada orden (su código)? ¿Para cada orden pendiente en el gráfico actual (código de RaptorUK)? ¿O una vez, después de almacenar y borrar la pendiente?
 
DomGilberto:
Ok - Creo que esto es lo que estaba causando el problema. Acabo de actualizar el código en esta parte y parece que ahora ha dejado de oscilar en cada tick de los precios de cable a GBPCAD ... Ahora está atascado en un precio de parada hasta que se actualice en este cierre horario ... así que voy a confirmar.

¿Te parece bien? Además, debido a que tengo estos cierres parciales de órdenes, asumo que probablemente tengo que volver a comprobar que los corchetes están en la posición correcta en relación con "OrderSymbol()==Symbol())"?

Se ve bien, sí, siempre revisa tus llaves, y hazte la vida más fácil siempre que puedas, si eso significa añadir llaves entonces hazlo, pero trata de ser consistente con las llaves y la sangría.

No necesitas dos bucles, uno será suficiente...

//+----------------------------------------------------------------------------------------------------------------------------------------+  
//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());
                  }
               }   
     }

OrderModify() devuelve un bool, verdadero o falso, no un int . . . así que SellModify nunca será menor que 0 . . . Escribí lo mismo ayer en ForexFactory

 

Cada vez que la orden ha sido eliminada - que estoy queriendo que la orden pendiente sea eliminada CADA cierre de barra de 1 hora y luego una nueva orden abierta con los mismos parámetros, O si es aplicable, nuevas paradas, objetivos y tamaño de lote basado en "if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR) "

Lo único que necesito almacenar para la NUEVA orden pendiente (después de la eliminación), es el precio de entrada inicial en esa configuración particular.(Stored_BuyPrice = OrderOpenPrice();)


Es curioso porque ese primer trozo de código de arriba también está en relación con otro hilo que iba a publicar. En lugar de publicar un nuevo tema con una pregunta similar voy a preguntar aquí, si eso está bien? Mira el enlace de abajo - sólo un par de minutos de vídeo que explica el problema que tengo y estoy encontrando difícil de resolver ...

He escrito mucho código, pero ahora estoy empezando a darse cuenta de que es un caso de las ineficiencias que tengo que reparar ...

Vídeo: http://screencast.com/t/4nl8AaH8Sag

Si he hecho esto realmente ambiguo con sólo proporcionar una cantidad limitada de código, entonces voy a pegar un poco más?

 
Gracias Raptor - Sí, me di cuenta de eso. He pasado algún tiempo limpiando mi código, ya que era un desastre. Errores de aficionado como tratar de usar Prints como el ejemplo que dio anteriormente lol.
 
DomGilberto:

Cada vez que la orden ha sido eliminada - que estoy queriendo que la orden pendiente sea eliminada CADA cierre de barra de 1 hora y luego una nueva orden abierta con los mismos parámetros, O si es aplicable, nuevas paradas, objetivos y tamaño de lote basado en "if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR) "

Lo único que necesito almacenar para la NUEVA orden pendiente (después de la eliminación), es el precio de entrada inicial en esa configuración particular.(Stored_BuyPrice = OrderOpenPrice();)


Es curioso porque ese primer trozo de código de arriba también está en relación con otro hilo que iba a publicar. En lugar de publicar un nuevo tema con una pregunta similar voy a preguntar aquí, si eso está bien? Mira el enlace de abajo - sólo un par de minutos de vídeo que explica el problema que tengo y estoy encontrando difícil de resolver ...

He escrito mucho código, pero ahora estoy empezando a darse cuenta de que es un caso de las ineficiencias que tengo que reparar ...

Vídeo: http://screencast.com/t/4nl8AaH8Sag

Si he hecho esto realmente ambiguo con sólo proporcionar una cantidad limitada de código, entonces voy a pegar un poco más?

Corrígeme si me equivoco... pero en la mayoría de las barras del vídeo no has conseguido un pullback a la 21 EMA
 
Lo siento - Eso es mi culpa por no explicar correctamente. 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.