Изучаем MQL : Трейлинг-стоп

Как вставить в советник Трейлинг стоп

Доброго времени суток, юные падаваны программисты!

Мы продолжаем цикл уроков по MQL4. По Вашим просьбам, которые были озвучены на форуме, сегодня мы с Вами будем писать трейлинг-стоп для советников. В этом уроке мы рассмотрим несколько вариантов следящего стопа и, возможно, один из них Вы успешно примените на практике при создании своего торгового эксперта.

Домашнее задание

PUBLISHED by catsmob.com

Используя знания, которые Вы приобрели после этого видео-урока, прошу Вас написать трейлинг-стоп по :

  • фракталам (Fractals);
  • параболику (Parabolic SAR).

P.S. Если вы только что к нам присоединились, начните с просмотра предыдущих уроков:

Тема на форуме

С уважением, Сергей aka xbms
TradeLikeaPro.ru

Обучение, Уроки по MQL , ,
  • Гост

    Павел привет. возник такой вопрос у меня. а вы удалять не будете все темы и видео уроки которое есть на вашем форуме? у меня проста тут времени маловато хотел начать все серьезно с сентября.

  • hasan

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

  • Александр

    А не проще учет ордеров вести вот этой функцией:

    void Uchet_orderov (int Mag, string Symb, int &mas[8])
    {
    ArrayInitialize(mas, 0);
    int tip;
    for (int pos=0; pos<OrdersTotal(); pos++)
    {
    OrderSelect(pos, SELECT_BY_POS, MODE_TRADES);
    tip = OrderType();
    switch(tip)
    {
    case 0: {mas [0]++; mas[6]++; break;}
    case 1: {mas [1]++; mas[6]++; break;}
    case 2: {mas [2]++; mas[7]++; break;}
    case 3: {mas [3]++; mas[7]++; break;}
    case 4: {mas [4]++; mas[7]++; break;}
    case 5: {mas [5]++; mas[7]++; break;}
    }
    }
    }

  • Александр

    А не проще учет ордеров вести такой функцией:

    • Александр

      0 — buy
      1 — sell
      …..
      6 — ордера в рынке
      7 — отложки

    • Сергей

      Каждый волен сам решать как ему считать ордера…

      • Александр

        Так у видео для подсчета только CountBuy и CountSell сколько строк занимает, а если прибавить отложники еще у два раза строк больше будет

      • Сергей

        и что с этого?
        это повлияет на качество работы советника? 😉

      • Александр

        Не повлияет, но как принято надо стараться абы строк кода по возможности было бы меньше

  • Михаил

    Почему перебор ордеров в функциях CountBuy и CountSell идет с конца, а в функции трейлинга — с начала? Это принципиально?

    • Сергей

      Нет, не принципиально

  • Гость

    Павел, спасибо огромное за ваши труды!
    У меня такой вопрос: Раскажите пжл про функцию iCustom () подробнее.
    Как применять индикаторы типа MACD , Zigzag в советниках
    Заранее спасибо!!!

  • Юрий

    Здравствуйте Сергей! Подскажите пожалуйста в чем проблема!
    Trailing включается только за sell… пробовал переписать по разному но без толку….. Помогите))

    • Юрий

      все решилось….

      • Никита

        какая была причина?

      • игорь

        извиняюсь!!! как решилось?

      • Сергей

        Была почти та же ерунда, только для продаж.
        Решил самым простым способом — добавил первоначальное выставление Стопа при открытии ордера. После этого трейлинг его цепляет без проблем.

  • Вячеслав

    Павел, спасибо огромное за ваши труды!
    У меня такой вопрос:написал код трейлинг стопа в советник по вашему видео. Комптлируется без ошибок но при тестировании выдает ошибку
    invalid stoploss for OrderModify function error 4051. Цена пятизначная.
    Могли бы вы подсказать в чем дело.

  • евгений

    ‘Slippage’ — unexpected token C:Program Files (x86)MetaTrader — E-Global Trade & Finance Groupsimpel treiling.mq4 (13, 8)
    ‘Slippage’ — variable not defined C:Program Files (x86)MetaTrader — E-Global Trade & Finance Groupsimpel treiling.mq4 (29, 6)
    ‘Slippage’ — variable not defined C:Program Files (x86)MetaTrader — E-Global Trade & Finance Groupsimpel treiling.mq4 (52, 46)
    ‘Slippage’ — variable not defined C:Program Files (x86)MetaTrader — E-Global Trade & Finance Groupsimpel treiling.mq4 (55, 47)
    помогите пожалуйста устранить эти ошибки

    • Сергей

      Неизвестная переменная, а последние три ошибки — переменная не определена. Скорее всего забыл добавить Slippage в список внешних параметров и дать ей значение.
      extern int Slippage = 5;

  • Сергей

    Не очень понял вот эту часть
    if (timeprev==time[0]) return(0);
    timeprev = time[0];

    Получается, если timeprev равен времени открытия свечи, то мы выходим из обработчика тика и не открываем ордера, а если не равен, то мы его уравниваем, пробуем открыть ордера и в дальнейшем будем проскакивать попытки открыть ордер до тех пор, пока в массив time[] не попадёт время открытия новой свечи. Как то так вроде.
    Суть в том, что в данном месте возникают две ошибки:
    — рассогласование типов переменных при сравнении
    — попытка функции типа void вернуть значение
    Может это нюансы новых билдов MQL, не знаю. Решил таким образом:
    Объявил переменные
    datetime timeprev;
    bool newbar;

    А дальше так
    void OnTick()
    {
    Trailing();
    newbar=(Time[0]!=timeprev);
    timeprev=Time[0];
    if(newbar)

    {
    //----
    Открытие ордеров
    //----
    }
    }

  • Egor Kamenev

    Для нахождения максимальных/минимальных значений в наборах ценовых массивов за период, лучше использовать функции iHighest/iLowest

  • Maksim Polskiy

    Всем привет. Практикую трейлинг стоп. При тралле для нескольких позиций так будет выглядеть код:

    void ModifyOrder_Sell_Trend()

    {

    for (int i = OrdersTotal() — 1; i >= 0; i—)

    {

    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

    {

    if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)

    {

    if (OrderType() == OP_SELL && Bid<ima8 && ima8<ima31)
    {
    if (Ask=NormalizeDouble(OrderOpenPrice()+TrailingStop*Point,Digits))
    if (pr>0)
    CloseThisSymbolAll(Magic);
    }
    }
    }
    }
    }

    Прошу помочь.

  • Павел

    Здравствуйте , Павел! Спасибо вам за ваши уроки. У меня возникла проблема. На истории вовремя тестирования советник работает нормально а на демке входит на часов графике по несколько раз на одной свечке одним и тем же алгоритмом, а мне нужно только один раз в течении часа. Подскажите пожалуйста где у меня ошибка. Благодарю заранее.

  • Обновили урок под новые билды

  • NEW GEN

    Создайте урок как сделать так чтобы советник совершил обратные сделки ? вместо покупки продажу и так далее.

  • Илья

    Здравствуйте. Почему трейлинг стоп в советнике передвигает стоп не за ценой как обычный трейлинг стоп, а с задержкой в 2-3 свечи?

  • nadejda-stav

    Здравствуйте Павел. При написании данного советника программа выдает следующие ошибки ‘CountBuy’ — function not definedб ‘CountSell’ — function not defined и ‘Trailing’ — function not defined. Как их исправить?

    • Игорь Румянцев

      Здравствуйте Павел! Ситуация такая: я не хочу чтобы при открытии ордера ставился сразу фиксированный стоп, я хочу чтобы он выставился по прошествии цены на эту самую величину стопа, т.е. стоп ставится, когда ордер уже в безубытке, и поэтому в строке открытия ордера запись Ask-StopLoss*Point,
      OrderSend(Symbol(), OP_BUY, Lot, Ask, Slippage, Ask-StopLoss*Point, 0, «», Magic, 0, Blue);
      ставлю 0. И вот что происходит. На ордерах которые открываются на покупку все замечательно и все срабатывает. А вот на ордерах на продажу стоп вообще не срабатывает. Подскажите пожалуйста почему так происходит и где в коде возможно ошибка???? очень нужно чтобы работало как на покупку , так и на продажу.

  • Игорь Румянцев

    Здравствуйте Павел! Ситуация такая: я не хочу чтобы при открытии ордера ставился сразу фиксированный стоп, я хочу чтобы он выставился по прошествии цены на эту самую величину стопа, т.е. стоп ставится, когда ордер уже в безубытке, и поэтому в строке открытия ордера запись Ask-StopLoss*Point,

    OrderSend(Symbol(), OP_BUY, Lot, Ask, Slippage, Ask-StopLoss*Point, 0, «», Magic, 0, Blue);

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

  • Евгений Литвин

    У Вас ошибка на 84 строке
    if(OrderStopLoss() < Bid — (TralStep + TralStop)*Point || OrderStopLoss() == 0)
    а у Вас написано
    if(OrderStopLoss() < Bid — (TralStep + TralStep)*Point || OrderStopLoss() == 0)
    тоесть шаг к шагу прибавили , а не к тралингстопу