EA em choque ao usar múltiplos pares...

 
Em primeiro lugar, eu sei Raptor que você já levantou esta questão comigo antes, mas não consigo lembrar onde você a escreveu, e, mais importante ainda, entender onde estou indo errado?

Tanto quanto sei, eu o escrevi corretamente para que a EA anexada a qualquer par correspondente possa sempre trabalhar apenas com esse par. No momento, notei que o GBPCAD e o GBPUSD parecem não funcionar, o que significa que o GBPCAD acha que o cálculo é feito pelo par GBPUSD... assim, quando uma ordem pendente é acionada, o stop loss flickers dos valores do GBPCAD para o cabo....

Eu uso o magicnumber==1234;

Quaisquer sugestões ou áreas com as quais estou sendo um idiota, por favor, sinta-se à vontade para 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:
Em primeiro lugar, eu sei Raptor que você já levantou esta questão comigo antes, mas não consigo lembrar onde você a escreveu, e, mais importante ainda, entender onde estou indo errado?

Tanto quanto sei, eu o escrevi corretamente para que a EA anexada a qualquer par correspondente possa sempre trabalhar apenas com esse par. No momento, notei que o GBPCAD e o GBPUSD parecem não funcionar, o que significa que o GBPCAD acha que o cálculo é feito pelo par GBPUSD... assim, quando uma ordem pendente é acionada, o stop loss flickers dos valores do GBPCAD para o cabo....

Eu uso o magicnumber==1234;

Quaisquer sugestões ou áreas com as quais estou sendo um idiota, por favor, sinta-se à vontade para destacar :(

Seu problema é claro, mas pode ser um pouco difícil de ver por causa da forma como você usa as travessões e condições do aparelho. . você faz isso:

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

Eu acho que o que você quis dizer foi isto . .

     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 - uma coisinha tão pequena que eu perdi lá. Além disso, quando a primeira função OrderSend() é chamada, eu estou fazendo algo errado lá? Pergunto isto porque estou tentando pensar logicamente sobre se sabe ou não, naquele momento, para qual par o OrderSend() deve ser enviado? Essa pode ser uma pergunta estúpida, mas eu não estou fazendo nada de errado com essa parte, estou? A parte da função de envio da "BuyTicketOrder"?

Obrigada por me teres descoberto essa parte :)
 
DomGilberto:
Ah ok - uma coisinha tão pequena que eu perdi lá. Além disso, quando a primeira função OrderSend() é chamada, eu estou fazendo algo errado lá? Pergunto isto porque estou tentando pensar logicamente sobre se sabe ou não, naquele momento, para qual par o OrderSend() deve ser enviado o pedido? Essa pode ser uma pergunta estúpida, mas eu não estou fazendo nada de errado com essa parte, estou? A parte da função de envio da "BuyTicketOrder"?

Obrigada por me teres descoberto essa parte :)
Símbolo() é o símbolo do gráfico que a EA está rodando . . . não pode errar, só pode ser um 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 - eu acho que era isto que estava causando o problema. Acabei de atualizar o código nesta parte e parece que agora parou de piscar cada tique do cabo para os preços do GBPCAD... Agora está preso no preço de uma parada até que se atualize neste fechamento horário... então vou confirmar.

Isso lhe parece bem? Além disso, como tenho estes fechamentos parciais, presumo que provavelmente preciso verificar duas vezes se os aparelhos estão na posição correta em relação a "OrderSymbol()==Symbol())"?
 
if(OpenOrdersThisPair(Symbol()) == 0
Quantas vezes você quer chamar isso? Para cada pedido (seu código)? Para cada pedido pendente no gráfico atual (código do RaptorUK)? Ou UMA VEZ DEPOIS de você armazenar e excluir os pedidos pendentes?
 
DomGilberto:
Ok - eu acho que era isto que estava causando o problema. Acabei de atualizar o código nesta parte e parece que agora parou de piscar cada tique do cabo para os preços do GBPCAD... Agora está preso no preço de uma parada até que se atualize neste fechamento horário... então vou confirmar.

Isso lhe parece bem? Além disso, como tenho estes fechamentos parciais, presumo que provavelmente preciso verificar duas vezes se os aparelhos estão na posição correta em relação a "OrderSymbol()==Symbol())"?

Parece OK, sim, sempre verifique seus aparelhos e facilite a sua vida onde quer que você possa, se isso significa adicionar aparelhos então o faça, mas tente ser consistente com os aparelhos e as recuos.

Você não precisa de duas voltas, uma serve ...

//+----------------------------------------------------------------------------------------------------------------------------------------+  
//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() devolve um bool, verdadeiro ou falso, não um int . . . portanto, SellModify nunca será inferior a 0 . . Eu digitei a mesma coisa ontem na ForexFactory

 

Cada vez que o pedido for excluído - o que eu quero que o pedido pendente seja excluído TODAS as barras de 1 hora fechadas e então um novo pedido aberto com os mesmos parâmetros, OU se aplicável, novas paradas, alvos e tamanho de lote baseado em "if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR) "

A única coisa que preciso armazenar para o NOVO pedido pendente (após a exclusão), é o preço inicial de entrada naquela configuração específica.(Stored_BuyPrice = OrderOpenPrice();)


É engraçado porque aquele primeiro pedaço de código acima também está em conexão com outro tópico que eu estava prestes a postar. Ao invés de postar um novo tópico com uma pergunta semelhante, eu vou perguntar aqui, se estiver tudo bem? Confira o link abaixo - apenas um vídeo de alguns minutos explicando o problema que eu tenho e estou achando difícil de resolver...

Escrevi tanto código, mas agora estou começando a perceber que é um caso das ineficiências que estou tendo que reparar...

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

Se eu fiz isto realmente ambíguo com apenas uma quantidade limitada de código, então eu vou enfiar mais algum?

 
Obrigado Raptor - Sim, acabei de notar isso. Passei algum tempo limpando meu código, pois estava uma bagunça. Erros amadores como tentar usar as impressões como o exemplo que você deu acima rs.
 
DomGilberto:

Cada vez que o pedido for excluído - o que eu quero que o pedido pendente seja excluído TODAS as barras de 1 hora fechadas e então um novo pedido aberto com os mesmos parâmetros, OU se aplicável, novas paradas, alvos e tamanho de lote baseado em "if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR) "

A única coisa que preciso armazenar para o NOVO pedido pendente (após a exclusão), é o preço inicial de entrada naquela configuração específica.(Stored_BuyPrice = OrderOpenPrice();)


É engraçado porque aquele primeiro pedaço de código acima também está em conexão com outro tópico que eu estava prestes a postar. Ao invés de postar um novo tópico com uma pergunta semelhante, eu vou perguntar aqui, se estiver tudo bem? Confira o link abaixo - apenas um vídeo de alguns minutos explicando o problema que eu tenho e estou achando difícil de resolver...

Escrevi tanto código, mas agora estou começando a perceber que é um caso das ineficiências que estou tendo que reparar...

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

Se eu fiz isto realmente ambíguo com apenas uma quantidade limitada de código, então eu vou enfiar mais algum?

Corrija-me se entendi mal ... mas para a maioria das barras no vídeo você não conseguiu uma rechaçada para o 21 EMA
 
Desculpe - A culpa é minha por não ter explicado corretamente. Eu olho para D1, 4Hr e finalmente 1Hr para que os MA's sejam separados (entre uma carga de outros filtros) - Uma vez todos alinhados, no H1 ele esperará até que qualquer barra retorne ao 21 EMA ONCE, e então de lá colocará um pedido acima dos máximos e uma parada abaixo dos 60 EMA - ATR.

O recuo para a 21 EMA acontece apenas uma vez. De lá, ele deixará de procurar por qualquer recuo para o 21 EMA. O que deve fazer, no entanto, é certificar-se de que a ordem PENDENTE aberta atual esteja precisamente atualizada com os lotes, pare e obtenha lucros APÓS cada hora de fechamento. Entretanto, eu não posso trabalhar, porque às vezes funciona sem falhas, e atualiza a ordem pendente após cada fechamento de H1, e outras vezes não? A razão pela qual a ordem pendente será atualizada por si mesma é devido a"if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR) ".

Se isso não for verdade, então não será - COMO, há inúmeras vezes em que isso é verdade, mas não apagará a ordem e colocará uma nova ordem com os novos valores?

Não tem certeza se você pode ver algo nesse código acima em relação ao vídeo? (Primeiro código que você corrigiu). Espero que isso seja mais claro?