Обсуждение статьи "Как создать свой Trailing Stop"

 

Опубликована статья Как создать свой Trailing Stop:

Основное правило трейдера - дай прибыли расти, обрезай убытки! В статье рассматривается один из основных технических приемов, позволяющий следовать этому правилу - перемещение уровня защитной остановки (уровня Stoploss) вслед за растущей прибылью позиции, другими словами - скользящий стоп или трейлинг стоп (trailingstop). Приводится пошаговая процедура создания класса для трейлинг стопа на индикаторах SAR и NRTR, который каждый желающий сможет за 5-ть минут встроить в своего эксперта или использовать независимо для управления позициями на своем счете.

Автор: Дмитрий

 

Вылетает с ошибкой пример трейлинга.

 

 
Уточните, пожалуйста, какой именно.

 

Программисты, помогите с mql5, пожалуйста!!!

Возможно ли использовать просто ОБЫЧНУЮ ФУНКЦИЮ трэйлинга как в mql4 без всяких классов? Точно также, как , например, реализована функция TradeSizeOptimized в Moving Averages.mq5.

Я уже все перерыл, в примерах, статьях, форуме - ничего не нашел. Сам что-то уже совсем запарился.... Может у кого есть готовый вариант, буду очень Благодарен!!!  - Очень хочется в чемпионате поучаствовать.

 
Setslav:

Программисты, помогите с mql5, пожалуйста!!!

Возможно ли использовать просто ОБЫЧНУЮ ФУНКЦИЮ трэйлинга как в mql4 без всяких классов? Точно также, как , например, реализована функция TradeSizeOptimized в Moving Averages.mq5.

Я уже все перерыл, в примерах, статьях, форуме - ничего не нашел. Сам что-то уже совсем запарился.... Может у кого есть готовый вариант, буду очень Благодарен!!!  - Очень хочется в чемпионате поучаствовать.


держи

int TrailingStop()
  {
   if(PositionSelect(Symbol())) // выбираем позицию
     {
      //MqlTradeRequest   m_request;                                                 // объявляем структуру запроса на сервер
      //MqlTradeResult    m_result;                                                  // объявляем структуру ответа сервера
      double Bid = SymbolInfoDouble(Symbol(), SYMBOL_BID);                         // записываем в переменную цену бид
      double Ask = SymbolInfoDouble(Symbol(), SYMBOL_ASK);                         // записываем в переменную цену аск
      double OpenPrice=PositionGetDouble(POSITION_PRICE_OPEN);                     // записываем в переменную цену открытия позиции
      double PositionSL=PositionGetDouble(POSITION_SL);                            // записываем в переменную уровень стоплосса
      double PositionTP=PositionGetDouble(POSITION_TP);                            // записываем в переменную уровень тейкпрофита

      if((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY) // определяем тип позиции
        {
         if(TrailWhileMinus==true || Bid-OpenPrice>_Point*Trail) //не тралим, пока не можем достичь безубытка первым переносом стопа
           {
            if(Bid-PositionSL>Trail*_Point) //основное условие необходимости перемещения стоп-лосса
              {
               //--- записываем данные в структуру
               request.action = TRADE_ACTION_SLTP;
               request.symbol = Symbol();
               request.sl     = NormalizeDouble(Bid-Trail*_Point,_Digits);
               request.tp     = NormalizeDouble(PositionTP,_Digits);
               //---
               return(OrderSend(request,result));                              // отправляем запрос на сервер
              }
           }
        }
      else
        {
         if(TrailWhileMinus==true || OpenPrice-Ask>_Point*Trail) //не тралим, пока не можем достичь безубытка первым переносом стопа
           {
            if(PositionSL-Ask>Trail*_Point) //основное условие необходимости перемещения стоп-лосса
              {
               //--- записываем данные в структуру
               request.action = TRADE_ACTION_SLTP;
               request.symbol = Symbol();
               request.sl     = NormalizeDouble(Ask+Trail*_Point,_Digits);
               request.tp     = NormalizeDouble(PositionTP,_Digits);
               //---
               return(OrderSend(request,result));                            // отправляем запрос на сервер
              }
           }
        }
     }
   return(0);
  }
 
sergey1294:

держи

Я так полагаю (наверное не без основании) что result лучше передавать как параметр :)

А то нет возможности его анализировать. Не хорошо как-то это...

PS

Я бы еще создал две функции - TrailingStopBuy и TrailingStopSell

 
Interesting:

Я так полагаю (наверное не без основании) что result лучше передавать как параметр :)

А то нет возможности его анализировать. Не хорошо как-то это...

PS

Я бы еще создал две функции - TrailingStopBuy и TrailingStopSell

ну я человеку пример привел а то он уже мозг себе вынес как обычный трейлинг написать, ну а дальше пускай немножко подумает, что бы без косяков работал, в тестере в принципе и эта конструкция работает нормально. на реале не проверял
 
sergey1294:
ну я человеку пример привел а то он уже мозг себе вынес как обычный трейлинг написать, ну а дальше пускай немножко подумает, что бы без косяков работал, в тестере в принципе и эта конструкция работает нормально. на реале не проверял
Как пример конечно сойдет, но если без анализа result будет куча ошибок (рано или поздно)...
 
sergey1294:

держи

спасибо!
 

sergey1294,

Спасибо еще раз, все работает!!!

Возник еще один маленький вопрос, как в функцию добавить проверку по магическому номеру? Я пытаюсь вставить такую проверку:

if (OrderGetInteger(ORDER_MAGIC)==EA_Magic)
{
.....
}
..... но что-то это ломает всю торговлю...



 
Setslav:

sergey1294,

Спасибо еще раз, все работает!!!

Возник еще один маленький вопрос, как в функцию добавить проверку по магическому номеру? Я пытаюсь вставить такую проверку:

..... но что-то это ломает всю торговлю...



Почитай эту статью Использование ORDER_MAGIC для торговли разными экспертами на одном инструменте
Причина обращения: