EA em choque ao usar múltiplos pares... - página 2

 
DomGilberto:
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á ele 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. A partir daí, 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?

Acho que você vai ter que fazer isso da maneira difícil e trabalhosa . . imprimir as variáveis relevantes, mover-se através do tempo no Testador de Estratégia, marcar por marcar se necessário, verificando quais são as variáveis . . então se você achar que elas devem fazer algo acontecer e elas não podem ser focalizadas naquele código.

É relativamente fácil detectar problemas de sintaxe simples no código de outra pessoa, é mais difícil e muito mais demorado detectar erros na codificação de sua estratégia, por um lado, para poder fazer com que a estratégia também tenha que ser entendida, se não melhor, que a pessoa que faz a codificação.

 
Sim, você está certo! Vou fazer exatamente isso agora :) obrigado Raptor!
 
Uma coisa que eu preciso esclarecer na minha cabeça é: este código aqui, no loop, como faço para ter certeza de que ele está realizando a função OrderDelete() e o loop está fazendo loop em cada fechamento do H1? Isso é porque eu tenho isso no "int start" que mostra se o loop é feito ou não na base do H1? (A "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:
Uma coisa que eu preciso esclarecer na minha cabeça é: este código aqui, no loop, como faço para ter certeza de que ele está realizando a função OrderDelete() e o loop está fazendo loop em cada fechamento do H1? Isso é porque eu tenho isso no "int start" que mostra se o loop é feito ou não na base do H1? (A "IsNewCandle()") ?


CheckForMATrade() é chamado uma vez por nova barra, se você estiver rodando em um gráfico H1 que será uma vez no início da nova barra H1 ... o resto é executado a cada tick.

Você está calculando o valor ATR correto, para o início da nova barra ? tendo em mente que você acabou de iniciar a barra 0, você realmente quer ter o MA baseado nos indicadores da barra 0 ? não são a minha coisa, então não assuma que eu estou dizendo que você está errado, eu só estou perguntando

 
Sim, eu acabei de fazer uma impressão para verificar duas vezes a matemática MA-ATR. Está correto. Estou fazendo isso no Bar 1 (O mais recente bar H1 fechado). A matemática está correta, só acho que os cálculos não estão sendo feitos consistentemente em TODOS os bares H1 fechados.
 
DomGilberto:
Sim, eu acabei de fazer uma impressão para verificar duas vezes a matemática MA-ATR. Está correto. Estou fazendo isso no Bar 1 (O mais recente bar H1 fechado). A matemática está correta, só acho que os cálculos não estão sendo feitos consistentemente em TODOS os bares H1 fechados.

O MA não está na barra 1, no entanto . . .

iMA(NULL, 60, MA_Period, 0, 1, 0, 0   ) - ATR)  
 
Bom lugar - obrigado :) Acho que sei porque não está apagando o pedido... SE o OrderStopLoss NÃO for > do que o MA-ATR, então ele não fará nada... Portanto, faz sentido... Só às vezes eu olho para ele, e é como se ele não quisesse apagar o pedido e colocar um novo quando ele deveria?

Uma última pergunta se você não se importa - eu ainda estou recebendo esta ordem poxy Modifique o erro 1 ! Acontece que ele vem daqui quando eu imprimo-o? Alguma idéia?

//+----------------------------------------------------------------------------------------------------------------------------------------+  
//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:
Bom lugar - obrigado :) Acho que sei porque não está apagando o pedido... SE o OrderStopLoss NÃO for > do que o MA-ATR, então ele não fará nada... Portanto, faz sentido... Só às vezes eu olho para ele, e é como se ele não quisesse apagar o pedido e colocar um novo quando ele deveria?

Uma última pergunta se você não se importa - eu ainda estou recebendo esta ordem poxy Modifique o erro 1 ! Acontece que ele vem daqui quando eu imprimo-o? Alguma idéia?

Esta é a questão . . . (semelhante para o OP_SELL)

if( OrderStopLoss() < BuyStopPrice )

... e quando você recebe um erro 1 é porque OrderStopLoss() == BuyStopPrice então você está modificando o pedido para ter o mesmo valor StopLoss, daí o erro 1 então agora você está se perguntando como por um lado OrderStopLoss() == BuyStopPrice e por outro lado OrderStopLoss() < BuyStopPrice

Você seguiu o link no post e o leu até seus olhos sangrarem? Aposto que você não ... https://www. mql5.com/en/forum/146380 se você continuar ignorando este assunto, ele vai continuar te pegando e você vai continuar perdendo tempo ... pegue-o, entenda-o, não sofra mais com ele, seja feliz

 

Ok, vou ler tudo isso novamente - voltando ao assunto com o vídeo anexo, como eu acho que resolvi isso está abaixo, COMO, não funciona no lado da compra? Por alguma razão, nenhum negócio será acionado. Entretanto, no lado da venda, está funcionando EXATAMENTE como eu quero que funcione?

Tudo é EXATAMENTE invertido para o lado da Compra. Tudo isso se as declarações forem apenas médias móveis. A linha específica que mudei é "triggerBarTime+H1_high>= ema21". No lado da compra pareceria = "triggerBarTime+H1_low<= ema21" - Se eu tirar "triggerBarTime", então funcionará tanto em ordens de compra quanto de venda. Entretanto, se eu sair no "triggerBarTime" ele funcionará perfeitamente no lado de Venda (como em, feche os pedidos em TODAS as barras, recalcule-o perfeitamente e coloque um novo pedido com parâmetros ajustados!?) MAS não colocar QUALQUER pedido é tentativa de fazer algo no lado da Compra? Este é um ajuste realmente importante que eu preciso fazer...

Confira este vídeo: http: //screencast.com/t/uJu3nlNxAXDF - Espero que isto realmente explique bem!! :D


Não se preocupe se você não puder ajudar :)

     // 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.
      }
 
Alguma idéia?
Razão: