Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1646

 
EVGENII SHELIPOV #:

Макар доброго времени суток !!!

По Вашей рекомендации я нашел место в функции void OnTick() куда можно прикрутить функцию TrailingGroupOrder() для отсылки команды на модификацию трала групповых ордеров и о чудо трал групповых ордеров заработал. Но радость была не долгой . Присмотревшись я увидел что тралится только ордер с мин тикетом. 

Могу с большой долей вероятности предположить что проблема в в модификации только первого (минимального) ордера а не всех сразу.

Макар подскажите как сделать так чтобы модифицировались  сразу все ордера в сетке????

 

Покажи где ты прикрутил TrailingGroupOrder() в функции void OnTick() ?
 
MakarFX #:
Покажи где ты прикрутил TrailingGroupOrder() в функции void OnTick() ?


void OnTick()
{
     double JAW = iAlligator(Symbol(),TimeframesIndicators,13,8,5,8,5,3,MODE_SMMA,PRICE_MEDIAN,MODE_GATORJAW,0);
     double TEETH = iAlligator(Symbol(),TimeframesIndicators,13,8,5,8,5,3,MODE_SMMA,PRICE_MEDIAN,MODE_GATORTEETH,0);
     double LIPS = iAlligator(Symbol(),TimeframesIndicators,13,8,5,8,5,3,MODE_SMMA,PRICE_MEDIAN,MODE_GATORLIPS,0);
     double DI_PLUSCurrent=iADX(Symbol(),TimeframesIndicators,14, PRICE_CLOSE,MODE_PLUSDI,0);
     double DI_MINUSCurrent=iADX(Symbol(),TimeframesIndicators,14, PRICE_CLOSE,MODE_MINUSDI,0);
     double MacdCurrent=iMACD(Symbol(),TimeframesIndicators,12,26,9, PRICE_CLOSE,MODE_MAIN,0);
     double MacdPrevious=iMACD(Symbol(),TimeframesIndicators,12,26,9, PRICE_CLOSE,MODE_MAIN,2 ); 
     double ATR = iATR(Symbol(), TimeframesVolatility, BarCount, 0);
     {
      if (CountTrade() == 0)
      {
        if((UseHour==1&&Hour()>=StartTime&&Hour()<=StopTime)||UseHour==0)
        if(LIPS>TEETH&& TEETH>JAW&&DI_PLUSCurrent>18&&DI_PLUSCurrent>DI_MINUSCurrent&&MacdCurrent>MacdPrevious)                              
         {
           FirstLots = Lots();
           tp = NormalizeDouble(Ask + TakeProfitFirstOrder*Point, Digits);
           ticket = OrderSend(Symbol(), OP_BUY, FirstLots, Ask, slip, 0, tp, "1-ый ордер", Magic, 0, Blue); 
         }
        if((UseHour==1&&Hour()>=StartTime&&Hour()<=StopTime)||UseHour==0)
        if(LIPS<TEETH&& TEETH<JAW&&DI_MINUSCurrent>18&&DI_MINUSCurrent>DI_PLUSCurrent&&MacdCurrent<MacdPrevious)                            
         {
           FirstLots = Lots();
           tp = NormalizeDouble(Bid - TakeProfitFirstOrder*Point, Digits);
           ticket = OrderSend(Symbol(), OP_SELL, FirstLots, Bid, slip, 0, tp, "1-ый ордер", Magic, 0, Red); 
         }
       }
      if (CountTrade() == 1) Trailing();
     }
      if (CountTrade() < MaxOrders)                                                           
       {
           int order_type = FindLastOrderType();
           if (order_type == OP_BUY)
           { 
              price = FindLastOrderPrice(OP_BUY);  
              if(Ask<= price - Step()*Point)
              {
                  lastlot = NormalizeDouble(GetMinLotOrder()*MathPow( MultiplierParameter, OrdersTotal()), 2);
                  ticket = OrderSend(Symbol(), OP_BUY, lastlot, Ask, slip, 0, 0, "Групповой ордер", Magic, 0, Blue);
                  if (ticket < 1)
                      Print ("Ошибка ордера на покупку");
                            ModifyOrders(OP_BUY);
              }
           }
             if (order_type == OP_SELL)
           { 
              price = FindLastOrderPrice(OP_SELL);  
              if(Bid>= price + Step()*Point)
              {
                  lastlot = NormalizeDouble(GetMinLotOrder()*MathPow( MultiplierParameter, OrdersTotal()), 2);
                  ticket = OrderSend(Symbol(), OP_SELL, lastlot, Bid, slip, 0, 0, "Групповой ордер", Magic, 0, Red);
                  if (ticket < 1)
                      Print ("Ошибка ордера на продажу!");
                            ModifyOrders(OP_SELL);
              }
           }
         }
         if(CountTrade()>1)
          {
           TrailingGroupOrder();
          } 
         double op = CalculiteProfit(); 
         if (op > FindLastLots() && Drawdown > DrawdownClosingMinMaxOrders)
           {
           ClosseMinMaxOrders();
           } 
      Comment("Всего открыто ордеров : " + DoubleToStr(OrdersHistoryTotal(), 0)+ "\n" +
              "Максимальное количество : " + DoubleToStr(MaxOrders, 0)+ "\n" +
              "Количество открытых ордеров: " + DoubleToStr(OrdersTotal(), 0)+ "\n" +
              "Осталось ордеров: " + DoubleToStr((MaxOrders - OrdersTotal()), 0)+ "\n" +
              "Баланс средств счета: " + DoubleToStr(AccountBalance(), 0)+ "\n" +
              "Свободные средства: " + DoubleToStr(AccountFreeMargin(), 0)+ "\n" +
              "Относительная текущая просадка: " + DoubleToStr(((AccountBalance() - AccountFreeMargin())/AccountBalance())*100, 2)+ "\n" +
              "Относительная максимальная просадка: " + DoubleToStr(GetMaxDrawdown(), 2)+ "\n" +
              "Текущая прибыль/убыток: " + DoubleToStr(AccountProfit(), 2)+ "\n" +
              "Абсолютная максимальная прибыль: " + DoubleToStr(GetMaxProfit(), 2)+ "\n" +
              "Абсолютный максимальный убыток (просадка): " + DoubleToStr(GetMaxLoss(), 2)+ "\n" +
              "Плечо: " + DoubleToStr(AccountLeverage(), 0)+ "\n" + 
              "Своп: " + DoubleToStr(OrderSwap(), 2)+ "\n" + 
              "Коммссия: " + DoubleToStr(OrderCommission(), 2)+ "\n" + 
              "Шаг: "  + DoubleToStr(Step(), 0)+ "\n" + 
              "Минимальный тикет ордера: " + DoubleToStr(GetTicketMinOrder(), 0)+ "\n" + 
              "Максимальный тикет ордера: " + DoubleToStr(GetTicketMaxOrder(), 0)+ "\n" + 
              "Профит минимальный  ордера: " + DoubleToStr(GetProfitMinOrder(), 2)+ "\n" +  
              "Профит максимального  ордера: " + DoubleToStr(GetProfitMaxOrder(), 2)+ "\n" +
              "Профит суммарный: " + DoubleToStr(CalculiteProfit(),2));       
}
 
EVGENII SHELIPOV #:

Выделенное красным удали

void OnTick()
{
     double JAW = iAlligator(Symbol(),TimeframesIndicators,13,8,5,8,5,3,MODE_SMMA,PRICE_MEDIAN,MODE_GATORJAW,0);
     double TEETH = iAlligator(Symbol(),TimeframesIndicators,13,8,5,8,5,3,MODE_SMMA,PRICE_MEDIAN,MODE_GATORTEETH,0);
     double LIPS = iAlligator(Symbol(),TimeframesIndicators,13,8,5,8,5,3,MODE_SMMA,PRICE_MEDIAN,MODE_GATORLIPS,0);
     double DI_PLUSCurrent=iADX(Symbol(),TimeframesIndicators,14, PRICE_CLOSE,MODE_PLUSDI,0);
     double DI_MINUSCurrent=iADX(Symbol(),TimeframesIndicators,14, PRICE_CLOSE,MODE_MINUSDI,0);
     double MacdCurrent=iMACD(Symbol(),TimeframesIndicators,12,26,9, PRICE_CLOSE,MODE_MAIN,0);
     double MacdPrevious=iMACD(Symbol(),TimeframesIndicators,12,26,9, PRICE_CLOSE,MODE_MAIN,2 ); 
     double ATR = iATR(Symbol(), TimeframesVolatility, BarCount, 0);
     {
      if (CountTrade() == 0)
      {
        if((UseHour==1&&Hour()>=StartTime&&Hour()<=StopTime)||UseHour==0)
        if(LIPS>TEETH&& TEETH>JAW&&DI_PLUSCurrent>18&&DI_PLUSCurrent>DI_MINUSCurrent&&MacdCurrent>MacdPrevious)                              
         {
           FirstLots = Lots();
           tp = NormalizeDouble(Ask + TakeProfitFirstOrder*Point, Digits);
           ticket = OrderSend(Symbol(), OP_BUY, FirstLots, Ask, slip, 0, tp, "1-ый ордер", Magic, 0, Blue); 
         }
        if((UseHour==1&&Hour()>=StartTime&&Hour()<=StopTime)||UseHour==0)
        if(LIPS<TEETH&& TEETH<JAW&&DI_MINUSCurrent>18&&DI_MINUSCurrent>DI_PLUSCurrent&&MacdCurrent<MacdPrevious)                            
         {
           FirstLots = Lots();
           tp = NormalizeDouble(Bid - TakeProfitFirstOrder*Point, Digits);
           ticket = OrderSend(Symbol(), OP_SELL, FirstLots, Bid, slip, 0, tp, "1-ый ордер", Magic, 0, Red); 
         }
       }
      if (CountTrade() == 1) Trailing();
     }
      if (CountTrade() < MaxOrders)                                                           
       {
           int order_type = FindLastOrderType();
           if (order_type == OP_BUY)
           { 
              price = FindLastOrderPrice(OP_BUY);  
              if(Ask<= price - Step()*Point)
              {
                  lastlot = NormalizeDouble(GetMinLotOrder()*MathPow( MultiplierParameter, OrdersTotal()), 2);
                  ticket = OrderSend(Symbol(), OP_BUY, lastlot, Ask, slip, 0, 0, "Групповой ордер", Magic, 0, Blue);
                  if (ticket < 1)
                      Print ("Ошибка ордера на покупку");
                            ModifyOrders(OP_BUY);
              }
           }
             if (order_type == OP_SELL)
           { 
              price = FindLastOrderPrice(OP_SELL);  
              if(Bid>= price + Step()*Point)
              {
                  lastlot = NormalizeDouble(GetMinLotOrder()*MathPow( MultiplierParameter, OrdersTotal()), 2);
                  ticket = OrderSend(Symbol(), OP_SELL, lastlot, Bid, slip, 0, 0, "Групповой ордер", Magic, 0, Red);
                  if (ticket < 1)
                      Print ("Ошибка ордера на продажу!");
                            ModifyOrders(OP_SELL);
              }
           }
         }
         if(CountTrade()>1)
          {
           TrailingGroupOrder();
          } 
         double op = CalculiteProfit(); 
         if (op > FindLastLots() && Drawdown > DrawdownClosingMinMaxOrders)
           {
           ClosseMinMaxOrders();
           } 
      Comment("Всего открыто ордеров : " + DoubleToStr(OrdersHistoryTotal(), 0)+ "\n" +
              "Максимальное количество : " + DoubleToStr(MaxOrders, 0)+ "\n" +
              "Количество открытых ордеров: " + DoubleToStr(OrdersTotal(), 0)+ "\n" +
              "Осталось ордеров: " + DoubleToStr((MaxOrders - OrdersTotal()), 0)+ "\n" +
              "Баланс средств счета: " + DoubleToStr(AccountBalance(), 0)+ "\n" +
              "Свободные средства: " + DoubleToStr(AccountFreeMargin(), 0)+ "\n" +
              "Относительная текущая просадка: " + DoubleToStr(((AccountBalance() - AccountFreeMargin())/AccountBalance())*100, 2)+ "\n" +
              "Относительная максимальная просадка: " + DoubleToStr(GetMaxDrawdown(), 2)+ "\n" +
              "Текущая прибыль/убыток: " + DoubleToStr(AccountProfit(), 2)+ "\n" +
              "Абсолютная максимальная прибыль: " + DoubleToStr(GetMaxProfit(), 2)+ "\n" +
              "Абсолютный максимальный убыток (просадка): " + DoubleToStr(GetMaxLoss(), 2)+ "\n" +
              "Плечо: " + DoubleToStr(AccountLeverage(), 0)+ "\n" + 
              "Своп: " + DoubleToStr(OrderSwap(), 2)+ "\n" + 
              "Коммссия: " + DoubleToStr(OrderCommission(), 2)+ "\n" + 
              "Шаг: "  + DoubleToStr(Step(), 0)+ "\n" + 
              "Минимальный тикет ордера: " + DoubleToStr(GetTicketMinOrder(), 0)+ "\n" + 
              "Максимальный тикет ордера: " + DoubleToStr(GetTicketMaxOrder(), 0)+ "\n" + 
              "Профит минимальный  ордера: " + DoubleToStr(GetProfitMinOrder(), 2)+ "\n" +  
              "Профит максимального  ордера: " + DoubleToStr(GetProfitMaxOrder(), 2)+ "\n" +
              "Профит суммарный: " + DoubleToStr(CalculiteProfit(),2));       
}

Выделенное желтым подними в начало

void OnTick()
{
      if (CountTrade() == 1) Trailing();
      if (CountTrade() > 1 ) TrailingGroupOrder();

     double JAW = iAlligator(Symbol(),TimeframesIndicators,13,8,5,8,5,3,MODE_SMMA,PRICE_MEDIAN,MODE_GATORJAW,0);
 
MakarFX #:

Выделенное красным удали

Выделенное желтым подними в начало

Макар это тот вариант который Вы мне прислали вчера  - это было бы очень просто в том Варианте ордера закрываются  тоже не правильно

 
EVGENII SHELIPOV #:

Макар это тот вариант который Вы мне прислали вчера  - это было бы очень просто в том Варианте ордера закрываются не правильно

Мои корректировки на закрытие никак не влияют.

И еще - чему равен "тр" в функции TrailingGroupOrder()

if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid - TrailingStopGroupOrder*Point, Digits), tp, 0))
 
EVGENII SHELIPOV #:

Макар это тот вариант который Вы мне прислали вчера  - это было бы очень просто в том Варианте ордера закрываются  тоже не правильно

А что значит "закрываются не правильно"?
 
MakarFX #:
А что значит "закрываются не правильно"?

Закрываются не все ордера сразу от трала а только ордер с мин тикетом и так поочереди

 
EVGENII SHELIPOV #:

Закрываются не все ордера сразу от трала а только ордер с мин тикетом и так поочереди

Завтра посмотрю
 

Всем доброго времени суток пишу код для трала групповых ордеров . Логика кода для трала следующая :

После открытия второго и следующих ордеров уходит команда на модификацию ордеров ModifyOrders()  где с начало функцией рассчитываем среднюю  потом расчет  тейкпрофита  и модификация всех ордеров только тейкпрофита.

Потом из функции  void OnTick() вызываем функцию TrailingGroupOrder() где происходит модификация Стоп лосс в трейлинг стоп. 

Вопрос состоит в том что модифицируется только один ордер с минимальным тикетом это не правильно должны модифицироваться все  ордера в сетке и закрыться по ТР или SL. Помогите разобраться с этим. Заранее спасибо.

//+----------------------------------------------------------------------------+
//| Модификация групповых ордеров                                              |
//+----------------------------------------------------------------------------+
void ModifyOrders(int otype)
  {
   for(int i = OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
           {
            if(otype == OP_BUY)
               tp = NormalizeDouble(GetAveragePrice() + TakeProfitGroupOrder*Point, Digits);
            if(otype == OP_SELL)
               tp = NormalizeDouble(GetAveragePrice() - TakeProfitGroupOrder*Point, Digits);
            if((otype == OP_BUY || otype == OP_SELL) && (Drawdown > DrawdownClosingTakeprofitZero))
               tp = NormalizeDouble(GetAveragePrice(), Digits);
           }
        }
     }
   for(int i = OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
           {
            if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, tp, 0))
               Print("Ордера успешно модифицированы!");
            else
               Print("Ошибка модификации ордеров!");
           }
        }
     }
  }
//+----------------------------------------------------------------------------+
//| Трейлинг стоп групповых ордеров                                            |
//+----------------------------------------------------------------------------+
void TrailingGroupOrder()
  {
   for(int i = OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
           {
            if(OrderType() == OP_BUY && Bid - GetAveragePrice() > TrailingStopGroupOrder*Point)
              {
               if(Bid - GetAveragePrice() > TrailingStopGroupOrder*Point || OrderStopLoss() == 0)
                 {
                  if(OrderStopLoss() < Bid - (TrailingStep + TrailingStopGroupOrder)*Point || OrderStopLoss() == 0)
                    {
                     if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid - TrailingStopGroupOrder*Point, Digits), tp, 0))
                        Print("Ошибка модификации групповых ордеров на покупку!");
                    }
                 }
              }
            if(OrderType() == OP_SELL && GetAveragePrice() - Ask > TrailingStopGroupOrder*Point)
              {
               if(GetAveragePrice() - Ask > TrailingStopGroupOrder*Point || OrderStopLoss() == 0)
                 {
                  if(OrderStopLoss() > Ask + (TrailingStep + TrailingStopGroupOrder)*Point || OrderStopLoss() == 0)
                    {
                     if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask + TrailingStopGroupOrder*Point, Digits), tp, 0))
                        Print("Ошибка модификации групповых ордеров на продажу!");
                    }
                 }
              }
           }
        }
     }
  }

  


 
EVGENII SHELIPOV #:

Всем доброго времени суток пишу код для трала групповых ордеров . Логика кода для трала следующая :

Зачем это дублирование

            if(OrderType() == OP_BUY && Bid - GetAveragePrice() > TrailingStopGroupOrder*Point)
              {
               if(Bid - GetAveragePrice() > TrailingStopGroupOrder*Point || OrderStopLoss() == 0)
                 {
                  if(OrderStopLoss() < Bid - (TrailingStep + TrailingStopGroupOrder)*Point || OrderStopLoss() == 0)
                    {

Можно так

            if(OrderType() == OP_BUY && Bid - GetAveragePrice() > TrailingStopGroupOrder*Point)
              {
               if(OrderStopLoss() < Bid - (TrailingStep + TrailingStopGroupOrder)*Point || OrderStopLoss() == 0)
                  {


И еще покажи какие параметры

TrailingStep                
TakeProfitGroupOrder        
TrailingStopGroupOrder      
Причина обращения: