Столкновение экспертов при использовании нескольких пар... - страница 2

 
DomGilberto:
Извините - это моя вина, что я не объяснил это должным образом. Я смотрю на D1, 4Hr и, наконец, 1Hr, чтобы MA's были разнесены (среди кучи других фильтров) - Как только они все выстроились, на H1 он будет ждать, пока любой бар не отступит к 21 EMA ОДИН раз, а затем оттуда он разместит ордер выше максимумов и стоп ниже 60 EMA - ATR.

Откат к 21 ЕМА происходит только один раз. После этого он перестанет искать любые откаты к 21 ЕМА. Однако, что он должен делать, так это следить за тем, чтобы текущий открытый ордер PENDING точно соответствовал лотам, стопам и тейк-профитам ПОСЛЕ каждого часового закрытия. Однако я не могу понять, почему иногда он работает безупречно и обновляет отложенный ордер после каждого закрытия H1, а иногда нет? Причина, по которой отложенный ордер обновляется, заключается в том, что ""if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0, 0.) - ATR) ".

Если это не так, то он не обновится - КАК бы то ни было, есть бесчисленное количество случаев, когда это так, но он не удалит ордер и не поставит новый с новыми значениями?

Не уверен, что вы можете увидеть что-то в этом коде выше относительно видео? (Первый код, который вы исправили). Надеюсь, так понятнее?

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

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

 
Да, вы правы! Теперь я так и сделаю :) спасибо Raptor!
 
Мне нужно прояснить одну вещь: этот код здесь, в цикле, как мне убедиться, что он выполняет функцию OrderDelete() и цикл выполняется при каждом закрытии H1? Это потому, что у меня есть это в "int start", которое показывает, выполняется ли цикл на основе H1 или нет? (The "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:
Мне нужно прояснить одну вещь: этот код здесь, в цикле, как мне убедиться, что он выполняет функцию OrderDelete() и цикл зацикливается на каждом закрытии H1? Это потому, что у меня есть это в "int start", которое показывает, выполняется ли цикл на основе H1 или нет? (The "IsNewCandle()") ?


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

Вы вычисляете правильное значение ATR для начала нового бара? Учитывая, что вы только что начали бар 0, вы действительно хотите получить MA на основе бара 0? Индикаторы - не мой конек, поэтому не думайте, что я говорю, что вы ошибаетесь, я просто спрашиваю .

 
Да, я только что сделал печать, чтобы дважды проверить математику MA-ATR. Все правильно. Я делаю это на баре 1 (самый последний закрытый бар H1). Математика верна, просто я не думаю, что расчеты последовательно выполняются на КАЖДОМ закрытии бара H1...
 
DomGilberto:
Да, я только что сделал печать, чтобы дважды проверить математику MA-ATR. Все правильно. Я делаю это на баре 1 (последний закрытый бар H1). Математика верна, просто я не думаю, что расчеты последовательно выполняются на КАЖДОМ закрытии бара H1...

MA не находится на баре 1, хотя ...

iMA(NULL, 60, MA_Period, 0, 1, 0, 0   ) - ATR)  
 
Хорошее место - спасибо :) Кажется, я знаю, почему он не удаляет ордер... Если OrderStopLoss НЕ > MA-ATR, то он ничего не делает... Так что это имеет смысл... Просто иногда я смотрю на него, и он как будто не хочет удалять ордер и ставить новый, когда он должен?

И последний вопрос, если вы не против - я все еще получаю эту ошибку 1 при изменении заказа! Оказывается, она возникает здесь, когда я распечатываю его? Есть идеи?

//+----------------------------------------------------------------------------------------------------------------------------------------+  
//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:
Хорошее замечание - спасибо :) Кажется, я знаю, почему он не удаляет ордер... Если OrderStopLoss НЕ > MA-ATR, то он ничего не делает... Так что это имеет смысл... Просто иногда я смотрю на него, и он как будто не хочет удалять ордер и ставить новый, когда он должен?

И последний вопрос, если вы не против - я все еще получаю эту ошибку 1 при изменении заказа! Оказывается, она возникает здесь, когда я распечатываю его? Есть идеи?

Это проблема ... (аналогично для OP_SELL)

if( OrderStopLoss() < BuyStopPrice )

... и когда вы получаете ошибку 1, это потому, что OrderStopLoss() == BuyStopPrice, поэтому вы изменяете ордер, чтобы иметь то же значение StopLoss, отсюда и ошибка 1, и теперь вы задаетесь вопросом, как с одной стороны OrderStopLoss() == BuyStopPrice, а с другой стороны OrderStopLoss() < BuyStopPrice.

Вы перешли по ссылке в посте и читали его до крови? Держу пари, что нет... https://www. mql5.com/en/forum/146380 если вы будете продолжать игнорировать эту проблему, она будет продолжать вас ловить и вы будете продолжать терять время... разберитесь с ней, поймите ее, не страдайте от нее больше, будьте счастливы.

 

Хорошо, я прочитаю все это снова - возвращаясь к проблеме с прикрепленным видео, как я думаю, я решил ее ниже, КАК, однако, это не работает на стороне покупки? По какой-то причине сделки вообще не срабатывают. Однако на стороне продажи все работает именно так, как я хочу?

На стороне покупки все происходит точно так же, как и на стороне продажи. Все эти утверждения if - это просто скользящие средние. Конкретная строка, которую я изменил, это "triggerBarTime+H1_high>= ema21". На стороне покупки это будет выглядеть как = "triggerBarTime+H1_low<= ema21" - Если я уберу "triggerBarTime", то это будет работать как с ордерами на покупку, так и на продажу. Однако, если я оставлю "triggerBarTime", то он будет отлично работать на стороне продажи (как в случае, закрывать ордера на КАЖДОМ баре, пересчитывать его идеально и выставлять новый ордер с настроенными параметрами!) НО не выставлять НИКАКИХ ордеров, не пытаться ничего сделать на стороне покупки? Это действительно важная настройка, которую мне нужно сделать...

Посмотрите это видео: http: //screencast.com/t/uJu3nlNxAXDF - Надеюсь, это действительно должно хорошо объяснить это!!! :D


Не беспокойтесь, если вы не можете помочь :)

     // 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.
      }
 
Есть идеи?
Причина обращения: