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

 
Mihail Matkovskij #:

Трал должен срабатывать если цена пошла в направлении ТП и ничего не делать если цена откатилась назад. Уровень СЛ при этом должен идти только в направлении ТП и не откатываться назад.

я знаю

я же написал

происходит мгновенное перемещение стопа и тейка бесконечное число раз

2021.12.23 21:07:51.634 2021.12.21 12:12:20  111 AUDUSD,M15: Модификации ордера на покупку успешна!

2021.12.23 21:07:51.634 2021.12.21 12:12:20  111 AUDUSD,M15: modify #2 buy 0.02 AUDUSD at 0.71028 sl: 0.71288 tp: 0.72038 ok

2021.12.23 21:07:51.634 2021.12.21 12:12:18  111 AUDUSD,M15: Модификации ордера на покупку успешна!

2021.12.23 21:07:51.634 2021.12.21 12:12:18  111 AUDUSD,M15: modify #2 buy 0.02 AUDUSD at 0.71028 sl: 0.71268 tp: 0.72018 ok

2021.12.23 21:07:51.634 2021.12.21 12:12:16  111 AUDUSD,M15: Модификации ордера на покупку успешна!

2021.12.23 21:07:51.634 2021.12.21 12:12:16  111 AUDUSD,M15: modify #2 buy 0.02 AUDUSD at 0.71028 sl: 0.71248 tp: 0.71998 ok

2021.12.23 21:07:51.634 2021.12.21 12:12:15  111 AUDUSD,M15: Модификации ордера на покупку успешна!

2021.12.23 21:07:51.634 2021.12.21 12:12:15  111 AUDUSD,M15: modify #2 buy 0.02 AUDUSD at 0.71028 sl: 0.71228 tp: 0.71978 ok

2021.12.23 21:07:51.634 2021.12.21 12:12:13  111 AUDUSD,M15: Модификации ордера на покупку успешна!

2021.12.23 21:07:51.634 2021.12.21 12:12:13  111 AUDUSD,M15: modify #2 buy 0.02 AUDUSD at 0.71028 sl: 0.71208 tp: 0.71958 ok

2021.12.23 21:07:51.634 2021.12.21 12:12:11  111 AUDUSD,M15: Модификации ордера на покупку успешна!

2021.12.23 21:07:51.634 2021.12.21 12:12:11  111 AUDUSD,M15: modify #2 buy 0.02 AUDUSD at 0.71028 sl: 0.71188 tp: 0.71938 ok

2021.12.23 21:07:51.634 2021.12.21 12:12:10  111 AUDUSD,M15: Модификации ордера на покупку успешна!

2021.12.23 21:07:51.634 2021.12.21 12:12:10  111 AUDUSD,M15: modify #2 buy 0.02 AUDUSD at 0.71028 sl: 0.71168 tp: 0.71918 ok

2021.12.23 21:07:51.634 2021.12.21 12:12:08  111 AUDUSD,M15: Модификации ордера на покупку успешна!

2021.12.23 21:07:51.634 2021.12.21 12:12:08  111 AUDUSD,M15: modify #2 buy 0.02 AUDUSD at 0.71028 sl: 0.71148 tp: 0.71898 ok

2021.12.23 21:07:51.634 2021.12.21 12:12:06  111 AUDUSD,M15: Модификации ордера на покупку успешна!

2021.12.23 21:07:51.634 2021.12.21 12:12:06  111 AUDUSD,M15: modify #2 buy 0.02 AUDUSD at 0.71028 sl: 0.71128 tp: 0.71878 ok

2021.12.23 21:07:51.634 2021.12.21 12:12:05  111 AUDUSD,M15: Модификации ордера на покупку успешна!

2021.12.23 21:07:51.634 2021.12.21 12:12:05  111 AUDUSD,M15: modify #2 buy 0.02 AUDUSD at 0.71028 sl: 0.71108 tp: 0.71858 ok

2021.12.23 21:07:51.634 2021.12.21 12:12:00  111 AUDUSD,M15: Модификации ордера на покупку успешна!

2021.12.23 21:07:51.634 2021.12.21 12:12:00  111 AUDUSD,M15: modify #2 buy 0.02 AUDUSD at 0.71028 sl: 0.71088 tp: 0.71838 ok

2021.12.23 21:07:51.634 2021.12.21 12:11:53  111 AUDUSD,M15: Модификации ордера на покупку успешна!

2021.12.23 21:07:51.634 2021.12.21 12:11:53  111 AUDUSD,M15: modify #2 buy 0.02 AUDUSD at 0.71028 sl: 0.71068 tp: 0.71818 ok

2021.12.23 21:07:51.634 2021.12.21 12:11:52  111 AUDUSD,M15: Модификации ордера на покупку успешна!


 
законопослушный гражданин #:

я знаю

я же написал

происходит мгновенное перемещение стопа и тейка бесконечное число раз

Вам следует получить СЛ модифицируемого ордера и сравнивать его с расчётным СЛ. Если они окажутся равными то робот должен ничего не делать пока расчётный СЛ не превысит СЛ обрабатываемого ордера. Как сравнить два значения double: либо сравнить NodmalizeDouble(value, Digits) (каждого из значений) либо EqualDoubles https://www.mql5.com/ru/docs/basis/types/double

Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Вещественные типы (double, float) - Типы данных - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
законопослушный гражданин #:

я знаю


Ты поставил ее правильно. А ты что-то менял внутри функции TrailingOrders()?

 
Mihail Matkovskij #:

Вам следует получить СЛ модифицируемого ордера и сравнивать его с расчётным СЛ. ...

В общем, правила следующие.

  • Расчётный СЛ меньше СЛ ордера (менее выгодный) - ничего не делать
  • Расчётный СЛ равен СЛ ордера - ничего не делать
  • Расчётный СЛ превысил СЛ ордера (более выгодный) - модифицировать СЛ расчётным значением
Данные правила построения трала подойдут для создания практически любого трала с любыми алгоритмами вычислений уровня СЛ.
 
Tretyakov Rostyslav #:

Ты поставил ее правильно. А ты что-то менял внутри функции TrailingOrders()?

и менял и ставил "как есть" результат был одинаков.

 
законопослушный гражданин #:

и менял и ставил "как есть" результат был одинаков.

Надо видеть входные параметры, т.к. судя по журналу трал работает правильно
 
Tretyakov Rostyslav #:
Надо видеть входные параметры, т.к. судя по журналу трал работает правильно

2021.12.24 16:10:14.788 2021.12.17 00:00:00  111 - копия inputs: Lot=0.01; StopLoss=200; TakeProfit=560; Slippage=3; Magic=1; K_Martin1=0.01; K_Martin2=1.9; K_Martin3=1.4; OrdersClose=3; OrdersClose2=5; DigitsLot=2; PeriodMA=21; MovingShift=1; 


 
законопослушный гражданин #:

2021.12.24 16:10:14.788 2021.12.17 00:00:00  111 - копия inputs: Lot=0.01; StopLoss=200; TakeProfit=560; Slippage=3; Magic=1; K_Martin1=0.01; K_Martin2=1.9; K_Martin3=1.4; OrdersClose=3; OrdersClose2=5; DigitsLot=2; PeriodMA=21; MovingShift=1; 


может я не правильно поставил функцию в код?

void OnTick()
  {
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.
   TrailingOrders();
// Если нет открытых ордеров, то входим в условие
      if(CountOrders()==0)
     {

// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     } 
       DrawLABEL("nextlot",1,5,0,Color1(),StringConcatenate("CURRENT LOT: ",DoubleToStr(LOT(),2)));
       DrawLABEL("currentlot",1,5,0,Color2(),StringConcatenate("NEXT LOT: ",DoubleToStr(LOT(),2))); 
  }

а саму функцию поставил отдельно

//-------------------------------------------------------------------+

void TrailingOrders()
  {
   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)
              {
               if(Bid >= OrderOpenPrice()+(TakeProfit*0.75*_Point) && OrderStopLoss()<OrderOpenPrice()-20*_Point)
                 {
                  if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss()+20*_Point, OrderTakeProfit()+20*_Point, 0))
                     Print("Модификации ордера на покупку успешна!");
                  else
                     Print("Ошибка модификации ордера на покупку! - ",GetLastError());
                 }
               if(Bid >= OrderOpenPrice()+(TakeProfit*0.9*_Point) && OrderStopLoss()>=OrderOpenPrice()-20*_Point)
                 {
                  if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss()+30*_Point, OrderTakeProfit()+10*_Point, 0))
                     Print("Модификации ордера на покупку успешна!");
                  else
                     Print("Ошибка модификации ордера на покупку! - ",GetLastError());
                 }
              }
           }
        }
     }
  }
 
законопослушный гражданин #:

может я не правильно поставил функцию в код?

а саму функцию поставил отдельно

//-------------------------------------------------------------------+

void TrailingOrders()
  {
   
   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)
              {
               if(Bid >= OrderOpenPrice()+(TakeProfit*0.75*_Point) && OrderStopLoss()<=OrderOpenPrice()-StopLoss*_Point)
                 {
                  if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()-(StopLoss+20)*_Point, OrderTakeProfit()+20*_Point, 0))
                     Print("Модификации ордера на покупку успешна!");
                  else
                     Print("Ошибка модификации ордера на покупку! - ",GetLastError());
                 }
               if(Bid >= OrderOpenPrice()+(TakeProfit*0.9*_Point) && OrderStopLoss()>=OrderOpenPrice()-(StopLoss+20)*_Point)
                 {
                  if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss()+30*_Point, OrderTakeProfit()+10*_Point, 0))
                     Print("Модификации ордера на покупку успешна!");
                  else
                     Print("Ошибка модификации ордера на покупку! - ",GetLastError());
                 }
              }
           }
        }
     }
  }

Трал стоит правильно.

Попробуй так

 
Tretyakov Rostyslav #:

Трал стоит правильно.

Попробуй так

тейк улетел в космос

стоп сначала стоит, потом мгновенно улетает в космос вслед за тейком (по пути закрывая ордер)

не в этом дело как я понимаю. 

поправьте если ошибаюсь: void OnTick()

если нет открытых ордеров и есть сигнал  то vOrderOpenBuy() /  vOrderOpenSell()

далее идет void vOrderModify(int iOTi) - то есть выставляются стопы и тейки и далее проверка на ошибки. всё.

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

да он и не нужен по сути. нужно одно (максиммум двух) кратное перемещение стопа и тейка. 

я несколько трейл советников проанализировал- схема у всех примерно как у вас.

сам пока думаю, как это реализовать. 

Файлы:
111.mq4  25 kb
Причина обращения: