Как найти время бара, в котором пересеклись скользящие средние? (код внутри)

 

Привет всем!

Я надеялся на некоторую помощь по моему коду - В настоящее время застрял на этой одной чертовой части!


Вот процесс, который я пытаюсь записать в коде ниже:

1) Если все MA "расходятся веером" и пересекаются так, что цена находится выше всех скользящих средних и они указывают на потенциал длинной позиции.

2) Затем я хочу узнать точный бар (используя Time), на котором скользящие средние "расходятся веером" при пересечении скользящих средних.

3) Если 1 и 2 верны, то я жду, когда любой бар вернется вниз (в случае длинной позиции) и коснется 21 EMA.

4) От первого бара (где MA пересеклись и разошлись веером) до бара, который сейчас коснулся 21 EMA - я хочу, чтобы отложенный ордер ИЛИ на рыночной сделке был размещен ВЫШЕ максимумов этого диапазона (1 и 3).

5) Если цена в ЛЮБОЙ момент закроется ниже 60 EMA, ДО срабатывания ордера - ордер будет отменен.

Это, очевидно, не весь код, но это основная часть, над которой я ломаю голову. Пожалуйста, проверьте код на "<<<<<<<<<<<<<". Это те моменты, в которых я запутался.

Мне бы РЕАЛЬНО не помешала чья-то помощь - я был бы очень признателен!

Большое спасибо заранее!

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:

Привет всем!

Это явно не весь код, но это основная часть, над которой я ломаю голову. Пожалуйста, проверьте код по ссылке "<<<<<<<<<<<<<". Это те моменты, в которых я запутался.

Пожалуйста, прочитайте документацию к функциям, которые вы используете. ...iHighest() не возвращает цену. ... она возвращает int"Возвращает сдвиг максимального значения за определенное количество периодов в зависимости от типа".
 

Спасибо, RaptorUK - В самом добром смысле, это ничего мне не объясняет? В терминах непрофессионала?

Это форум, где кто-то действительно может помочь мне, кроме повторения определений функций (которые я читал 100 раз в разделе "помощь"...).

В конце концов, я не чувствую, что то, о чем я прошу (по сравнению с некоторыми темами здесь!), достаточно, чтобы кто-то взял плату за свое время...?

 

Перевод на непрофессиональные термины поможет вам... один раз, сегодня, с этим конкретным вопросом... и займет некоторое количество времени для объясняющего.

Если вы скажете, какие из определений вам непонятны, возможно, в следующий раз вы сможете решить свои собственные проблемы, а через некоторое время станете одним из тех, кто решает проблемы других людей.

Если вы попытаетесь самостоятельно изучить проблему, вы также узнаете гораздо больше. Например, попробуйте сделать следующее:

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

и вы увидите, какое значение возвращается функцией... (как говорит Raptor, это не цена)... и, возможно, вам будет легче понять определение функции.

Такие вещи помогут вам больше, чем надежда на то, что у кого-то на форуме найдется время протестировать ваш код и устранить неполадки, которые вы должны научиться делать сами.

 

А? Я так запутался - Я слишком много прошу о помощи?

В конце концов, я построил весь мой советник с нуля (которому я сам себя обучил...) Просто хочу получить руководство от кого-то, кто имеет больше знаний, чем я... :s

 

"Такие вещи, как эта, помогут вам больше, чем надежда на то, что у кого-то на форуме найдется время протестировать ваш код и заняться устранением неполадок, которые вы должны научиться делать сами".

Какого черта... Я ни от кого не ожидал такого!?

Ваш пост пролил больше света на ситуацию - благодарю.

Этот форум действительно забавный... Я не собирался ни от кого отмазываться! Я просто хотел получить разъяснения, как правильно идентифицировать бар, который пересекается с EMA...

Jeez....

 

когда я читаю ответ raptor'а, он говорит о том, что у вас именно та проблема, которую вы создали.

цены хранятся как двойные переменные, например, 1.12345

функции iHighest возвращают целое число (int), например, 1 или 2 или -100 ...., что явно не является ценой.

Я не знаю, чего вы пытаетесь достичь, но функция iHighest, вероятно, не та, которую вы хотите использовать.

Вы бы обнаружили это сами, если бы в метаэдиторе щелкнули на iHighest в вашем коде, затем нажали F1... вы увидите, что она возвращает целое число (что Raptor также сказал вам).

Я не знаю источник вашей путаницы. Если вы не знаете разницы между переменными int и double, вам не хватает некоторых жизненно важных базовых знаний, что означает, что вы пытаетесь бежать, прежде чем вы сможете ходить, и вы хотите, чтобы кто-то другой нес вас :/

EDIT: Вы не ожидали, что вы должны сделать свой собственный поиск неисправностей, прежде чем спрашивать кого-то еще?!?

 

Несколько скользящих средних не пересекутся одновременно.

Почему вы дважды постите? На ваш вопрос уже был дан ответ.

Найдите самый ранний бар, где все они были в правильном порядке.

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.
}
 

Я понимаю разницу между int и double...

После того, как утверждения If истинны, я хочу найти бар, который пересекся в точке, где MA находятся на расстоянии друг от друга. Я подумал, что если я использую:

"triggerBarTime = Time[1];" - после операторов "If", то triggerBarTime можно использовать в сочетании с iBarShift для фиксации первого бара интересующего меня диапазона?

Затем, используя iHighest, я мог бы преобразовать эту информацию в int и использовать ее в моей функции ордера (Buy_Price)?

 

Возможно, вы понимаете разницу между int и double, но вы не понимаете разницы между номером бара (int) и ценой (double).

iHighest позволит вам преобразовать дату в номер бара (int.), но OrderSend принимает только цену (double), поэтому нет смысла открывать ордер на 9.

 

А! Попалась!

Спасибо большое :) Я действительно ценю это!

Спасибо за терпение - я не хотел показаться таким образом, чтобы ожидать, что кто-то сделает что-то для меня; просто дать мне некоторые разъяснения по поводу помощи (нажатие F1 на все не всегда так понятно для меня.) - это все, что я хотел.