Como encontrar o tempo da barra onde as médias móveis cruzaram? (código dentro)

 

Olá a todos!

Eu estava esperando por alguma ajuda no meu código - atualmente preso nesta maldita parte!


Este é o processo que eu estou tentando escrever em código abaixo:

1) Se todos os MA's forem "fã" e cruzados de modo que o preço esteja acima de todas as médias móveis e que estejam indicando um longo potencial.

2) Quero então saber a barra exata (usando o Tempo) de que as médias móveis estão "afastadas" na cruz das médias móveis.

3) Se 1 e 2 forem verdadeiros, eu espero então que qualquer barra volte para baixo (no caso de uma posição longa) e toque o 21 EMA.

4) Desde a primeira barra (onde o MA é cruzado e desdobrado) até a barra que agora tocou o 21 EMA - eu quero uma ordem pendente OU no mercado de comércio colocou ABOVE os máximos desta faixa (1 & 3).

5) Se o preço em QUALQUER ponto FECHAR abaixo dos 60 EMA, ANTES de acionar a ordem - então a ordem deve ser cancelada.

Este não é obviamente todo o código, mas esta é a parte principal com que estou puxando meus cabelos para fora. Por favor, verifique o código com o "<<<<<<<<<<<<<". Estes são os pontos com os quais estou confuso.

Eu poderia REALMENTE fazer com a ajuda de alguém - isso seria realmente apreciado!

Muito obrigado de antemão!

datetime          triggerBarTime;   <<<<< Global settings.
datetime          triggerBarTime1;  <<<<< Global settings.	



void CheckForMaTrade()
{

//+-----------------------------------------------------------------------------------------------------------------------+ 
    //Small and Big Fish on the H1 Time Frame.                                                                           |
//+-----------------------------------------------------------------------------------------------------------------------+              

   {
   double PreviousSmallFish1  =  iMA(NULL,60,3,0,1,0,2); 
   double CurrentSmallFish1   =  iMA(NULL,60,3,0,1,0,1);
   double PreviousSmallFish2  =  iMA(NULL,60,5,0,1,0,2);
   double CurrentSmallFish2   =  iMA(NULL,60,5,0,1,0,1);
   double PreviousSmallFish3  =  iMA(NULL,60,8,0,1,0,2);
   double CurrentSmallFish3   =  iMA(NULL,60,8,0,1,0,1);
   double PreviousSmallFish4  =  iMA(NULL,60,10,0,1,0,2);
   double CurrentSmallFish4   =  iMA(NULL,60,10,0,1,0,1);  
   double PreviousSmallFish5  =  iMA(NULL,60,12,0,1,0,2);
   double CurrentSmallFish5   =  iMA(NULL,60,12,0,1,0,1);
   double PreviousSmallFish6  =  iMA(NULL,60,15,0,1,0,2);
   double CurrentSmallFish6   =  iMA(NULL,60,15,0,1,0,1);  
   
      double PreviousBigFish1  =  iMA(NULL,60,30,0,1,0,2); 
      double CurrentBigFish1   =  iMA(NULL,60,30,0,1,0,1);
      double PreviousBigFish2  =  iMA(NULL,60,35,0,1,0,2);
      double CurrentBigFish2   =  iMA(NULL,60,35,0,1,0,1);
      double PreviousBigFish3  =  iMA(NULL,60,40,0,1,0,2);
      double CurrentBigFish3   =  iMA(NULL,60,40,0,1,0,1);
      double PreviousBigFish4  =  iMA(NULL,60,45,0,1,0,2);
      double CurrentBigFish4   =  iMA(NULL,60,45,0,1,0,1);
      double PreviousBigFish5  =  iMA(NULL,60,50,0,1,0,2);
      double CurrentBigFish5   =  iMA(NULL,60,50,0,1,0,1);
      double PreviousBigFish6  =  iMA(NULL,60,60,0,1,0,2);
      double CurrentBigFish6   =  iMA(NULL,60,60,0,1,0,1); 
      
            if(PreviousBigFish1<CurrentBigFish2 && CurrentBigFish1>PreviousBigFish2)
               if(PreviousBigFish2<CurrentBigFish3 && CurrentBigFish2>PreviousBigFish3)
                  if(PreviousBigFish3<CurrentBigFish4 && CurrentBigFish3>PreviousBigFish4)
                     if(PreviousBigFish4<CurrentBigFish5 && CurrentBigFish4>PreviousBigFish5)
                        if(PreviousBigFish5<CurrentBigFish6 && CurrentBigFish5>PreviousBigFish6)  
                           
                           if(PreviousSmallFish1<CurrentSmallFish2 && CurrentSmallFish1>PreviousSmallFish2)
                        if(PreviousSmallFish2<CurrentSmallFish3 && CurrentSmallFish2>PreviousSmallFish3)
                     if(PreviousSmallFish3<CurrentSmallFish4 && CurrentSmallFish3>PreviousSmallFish4)
                  if(PreviousSmallFish4<CurrentSmallFish5 && CurrentSmallFish4>PreviousSmallFish5)
                if(PreviousSmallFish5<CurrentSmallFish6 && CurrentSmallFish5>PreviousSmallFish6)triggerBarTime = Time[1];  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
      
      
      double ema21 = iMA(NULL,60,21,0,1,0,1); 
       
        
         if (Low[1]<ema21)
         {
         
           OrderEntry(0); // BUY 
            }     
      
      
                
     if(PreviousBigFish1>CurrentBigFish2 && CurrentBigFish1<PreviousBigFish2)
      if(PreviousBigFish2>CurrentBigFish3 && CurrentBigFish2<PreviousBigFish3)
         if(PreviousBigFish3>CurrentBigFish4 && CurrentBigFish3<PreviousBigFish4)
            if(PreviousBigFish4>CurrentBigFish5 && CurrentBigFish4<PreviousBigFish5)
               if(PreviousBigFish5>CurrentBigFish6 && CurrentBigFish5<PreviousBigFish6)
               
               if(PreviousSmallFish1>CurrentSmallFish2 && CurrentSmallFish1<PreviousSmallFish2)
            if(PreviousSmallFish2>CurrentSmallFish3 && CurrentSmallFish2<PreviousSmallFish3)
         if(PreviousSmallFish3>CurrentSmallFish4 && CurrentSmallFish3<PreviousSmallFish4)
       if(PreviousSmallFish4>CurrentSmallFish5 && CurrentSmallFish4<PreviousSmallFish5)
     if(PreviousSmallFish5>CurrentSmallFish6 && CurrentSmallFish5<PreviousSmallFish6)triggerBarTime = Time[1]; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
   
    double ema21_2 = iMA(NULL,60,21,0,1,0,1); 
  
            if(High[1]>ema21_2)
            {
             
              OrderEntry(1); // SELL
             }  
   
       }

}


//+------------------------------------------------------------------+  
//+------------------------------------------------------------------+
//| Order Enter Function                                             |
//+------------------------------------------------------------------+

void OrderEntry (int direction)
{    
   double LotSize=0;
   double Equity=AccountEquity();
   double RiskedAmount=Equity*RiskPercent*0.01;
   int buyStopCandle = iLowest(NULL,0,1,CandlesBack,1); 
   int sellStopCandle = iHighest(NULL,0,2,CandlesBack,1);
   
   double buyPrice = iHighest(Symbol(), 0, MODE_HIGH, iBarShift(Symbol(), 0, triggerBarTime, true), 0);    <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
   double sellPrice = iLowest(Symbol(), 0, MODE_LOW, iBarShift(Symbol(), 0, triggerBarTime1, true), 0);   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
   
   double buy_stop_price = iMA(NULL,60,60,0,1,0,1)-PadAmount*pips; 
   double pips_to_bsl = Ask-buy_stop_price;         //double pips_to_bsl = Ask-buy_stop_price;   --- Old code
   double buy_takeprofit_price = Ask+pips_to_bsl*RewardRatio;   
   double sell_stop_price = iMA(NULL,60,60,0,1,0,1)+PadAmount*pips; //- Greyed out, this is an old code line.
   double pips_to_ssl = sell_stop_price-Bid;     ////double pips_to_ssl = sell_stop_price-Bid;   --- Old code
   double sell_takeprofit_price = Bid-pips_to_ssl*RewardRatio;   
   
  
   if (direction==0)//<< "0" pushes out a Buy direction
   {
      //double buyPrice = iHighest(Symbol(), 60, MODE_HIGH, iBarShift(Symbol(), 0, triggerBarTime, true), 0);//-PadAmount*pips; // new line
      int Buy_Price = buyPrice;
      
      double bsl=buy_stop_price;
      double btp=buy_takeprofit_price;
      //LotSize = (100/(0.00500/0.00010))/10
      LotSize = (RiskedAmount/(pips_to_bsl/pips))/10;
      if(OpenOrdersThisPair(Symbol())==0) //--- This means that it will not open a new order if there is one already open!If greyed out, it will take everything.
      int buyticket = OrderSend(Symbol(),Buy_Price,LotSize,Ask,3,0,0,NULL,MagicNumber,0,Green); //ask
      if(buyticket>0)OrderModify(buyticket,OrderOpenPrice(),bsl,btp,0,CLR_NONE);
   }
            
   if (direction==1) //<< "1" pushes out a Sell direction
   {
      
      //double sellPrice = iLowest(Symbol(), 60, MODE_LOW, iBarShift(Symbol(), 0, triggerBarTime1, true), 0);//+PadAmount*pips;   // new line.
      int Sell_Price = sellPrice;
      
      double ssl=sell_stop_price;
      double stp=sell_takeprofit_price; 
      //LotSize = (100/(0.00500/0.00010))/10;
      LotSize = (RiskedAmount/(pips_to_ssl/pips))/10;    
      if(OpenOrdersThisPair(Symbol())==0)  //--- This means that it will not open a new order if there is one already open! If greyed out, it will take everything.
      int sellticket = OrderSend(Symbol(),Sell_Price,LotSize,Bid,3,ssl,stp,NULL,MagicNumber,0,Red); //bid
      if(sellticket>0)OrderModify(sellticket,OrderOpenPrice(),ssl,stp,0,CLR_NONE);
   }
   
}

return(0);

 
DomGilberto:

Olá a todos!

Este obviamente não é todo o código, mas esta é a parte principal com a qual estou puxando meus cabelos para fora. Por favor, verifique o código com o "<<<<<<<<<<<<<". Estes são os pontos com os quais estou confuso.

Favor ler a documentação para as funções que você está usando . .iHighest() não retorna um preço . . . retorna um int"Retorna o deslocamento do valor máximo durante um número específico de períodos, dependendo do tipo".
 

Obrigado RaptorUK - Da maneira mais gentil possível, isso não me explica nada... Em termos leigos?

Este é um fórum onde alguém pode realmente me ajudar além de repetir as definições de funções (no qual eu li 100's de vezes da seção "ajuda"...)

Depois de tudo, eu não sinto que o que estou pedindo (em comparação com alguns dos tópicos aqui!) seja suficiente para garantir que alguém cobre pelo seu tempo...?

 

Traduzir para termos leigos o ajudará... uma vez, hoje, com esta questão em particular... e levará algum tempo para o explicador.

Se você disser quais da definição você não entende, talvez da próxima vez você possa resolver seus próprios problemas, e depois de um tempo, você pode ser um dos que resolvem os problemas de outros povos.

Se você mesmo tentar investigar o problema, você também aprenderá muito mais. Por exemplo, experimente isto:

Alert(iHighest(Symbol(), 0, MODE_HIGH, iBarShift(Symbol(), 0, triggerBarTime, true), 0));

e você verá que valor está sendo devolvido pela função... (como diz Raptor, não é um preço)... e você provavelmente entenderá mais facilmente a definição da função.

Coisas como esta o ajudarão mais do que esperar que alguém no quadro tenha tempo para testar seu código e fazer a mesma solução de problemas que você deveria estar aprendendo a fazer por si mesmo.

 

O que é isso? Estou tão confuso - Estou pedindo demais por alguma ajuda?

Depois de tudo, construí todo o meu EA desde o início (o que eu mesmo ensinei...) Só quero alguma orientação de alguém que tenha mais conhecimento do que eu... :s

 

"Coisas como esta o ajudarão mais do que esperar que alguém no quadro tenha tempo para testar seu código e fazer a mesma solução de problemas que você deveria estar aprendendo a fazer por si mesmo".

Que diabos... Eu não estava esperando isso de ninguém!?

Seu posto lançou mais luz sobre a situação - Aprecie isso.

Este fórum é realmente engraçado... Eu não estava planejando descarregar ninguém! Eu simplesmente queria algum esclarecimento sobre como identificar corretamente a barra que cruza com o EMA...

Jeez....

 

quando leio a resposta do Raptor, ela está lhe dizendo o problema exato que você criou.

Os preços são armazenados como variáveis duplas, por exemplo, 1.12345

as funções iHighest retorna um número inteiro (int), por exemplo 1 ou 2 ou -100 .... claramente não um preço.

Não sei o que você está tentando alcançar, mas a função iHighest provavelmente não é aquela que você quer usar.

Você teria descoberto isto por si mesmo se, no metaeditor, você clicar no iHighest em seu código, então pressione F1... você verá que ele retorna um inteiro (o que o Raptor também lhe disse)

Não conheço a fonte de sua confusão. Se você não sabe a diferença entre int e variáveis duplas, você está perdendo alguns conhecimentos básicos vitais, ou seja, você está tentando correr antes de poder andar, e você quer que outra pessoa o carregue :/

EDIT: Você não estava esperando que tivesse que fazer sua própria solução de problemas antes de perguntar a outra pessoa?!?

 

As médias móveis múltiplas não se cruzarão ao mesmo tempo.

Por que você está postando duas vezes? Sua pergunta foi respondida anteriormente.

Encontre a barra mais antiga onde estavam todos na ordem correta.

int DIR = 0;
for(int iBar = 0; iBar < Bar; iBar++){
   double MA20 = ... iBar), 
           MA5 = ... iBar);
          :
   if(     MA20 > MA5 && MA5 > ...) DIR = -1;
   else if(MA20 < MA5 && MA5 < ...) DIR = +1; // All fanning up.
   else if (DIR != 0){ iBar--; break; }       // Last one was cross.
}
 

Entendo a diferença entre int e duplo...

depois das afirmações serem verdadeiras, quero encontrar a barra que cruzou no ponto em que os MA estão espaçados. Eu pensei que se eu usasse:

"triggerBarTime = Tempo[1];" - depois das afirmações "Se" então o BarTime poderia ser usado em conjunto com o iBarShift para travar na primeira barra do intervalo em que estou interessado?

Então, usando o iHighest, me permitiria converter esta informação em uma int e usá-la em minha função de pedido? (Buy_Price)?

 

Você pode compreender a diferença entre int e duplo, mas não compreende a diferença entre um número de barras (int) e um preço (duplo).

iHighest lhe permitiria converter a data em um número de barra (int.) Mas o OrderSend só aceita um preço (o dobro) não faz sentido abrir um pedido a 9

 

Ah! Gotch-ya!

Muito obrigado :) Eu realmente aprecio isso!

Obrigado por ter sido paciente comigo - não pretendia me deparar de forma a esperar que alguém fizesse algo por mim; apenas me dar alguns esclarecimentos sobre a ajuda (pressionar F1 em tudo nem sempre é tão claro para mim) era tudo o que eu queria.