Обучение языку MQL4 под MetaTrader 4📌

От xbms, 13 апреля, 2013 в Уголок Программиста

#3751



Здравствуйте! Выполняя задание по 5 уроку MQL4, столкнулся в с проблемой.
Задание: написать трейлинг-стоп по Parabolic SAR.
Пятый день не могу понять свою ошибку. В журнале пишет: OrderModify error 1 (то есть "Нет ошибки, но результат неизвестен").
Мог бы кто-нибудь помочь разобраться с заданием?


Добрый день! Принтуйте SAR и OrderStopLoss(), посмотрите у них разное количество знаков после запятой, поэтому проверка SAR > OrderStopLoss() дает true и осуществляется модификация ордера по той же цене.
Лекарство: SAR = NormalizeDouble(iSAR(Symbol(), 0, 0.02, 0.2, 1), _Digits);
Удачи!


Спасибо, SilverKZ. Уже который раз помогаете.
Что касается данного замечания, то, мне кажется, количество ошибок происходит не из-за этого.
В код добавил: double SL = NormalizeDouble(SAR, Digits); но все-равно выводит море ошибок.
Все дело вот, как я думаю, в таких ордерах (в прикрепленном файле есть пример). Что можно сделать в таком случае? Как вы думаете?

2016-09-03_20-04-47.png

Изменено 3 сентября, 2016 пользователем iPerevalov

#3752

iPerevalov,
1) мое лекарство относилось к OrderModify error 1, нормализация цен избавляет от данной ошибки. Это проблема решена?
2) Ошибку 130 (неправильные цены) я видел, но не стал обращать внимания, т.к. думал что написание кода продолжится и эта ошибка будет исключена.
В данном случае ошибка в логике, а именно в этой строке: if((Bid > SAR && SAR > OrderStopLoss()) || OrderStopLoss() == 0).
Идем по шагам: 1) открылся бай, 2) SAR выше Bid, 3) Условие в первых скобках (Bid > SAR && SAR > OrderStopLoss()) -> false, 4) второе условие (OrderStopLoss() == 0) -> true, 5) выполняется if(!OrderModify(OrderTicket(), OrderOpenPrice(), SAR, 0, 0)), где SAR - неверная цена для стоплосса.

Что сделать? 1) Проверить чтобы Bid > SAR, если меньше, то не модифицировать ордер; 2) или в таких случаях выставлять фиксированный стоплосс.

Изменено 3 сентября, 2016 пользователем SilverKZ

#3753


iPerevalov,
1) мое лекарство относилось к OrderModify error 1, нормализация цен избавляет от данной ошибки. Это проблема решена?
2) Ошибку 130 (неправильные цены) я видел, но не стал обращать внимания, т.к. думал что написание кода продолжится и эта ошибка будет исключена.
В данном случае ошибка в логике, а именно в этой строке: if((Bid > SAR && SAR > OrderStopLoss()) || OrderStopLoss() == 0).
Идем по шагам: 1) открылся бай, 2) SAR выше Bid, 3) Условие в первых скобках (Bid > SAR && SAR > OrderStopLoss()) -> false, 4) второе условие (OrderStopLoss() == 0) -> true, 5) выполняется if(!OrderModify(OrderTicket(), OrderOpenPrice(), SAR, 0, 0)), где SAR - неверная цена для стоплосса.


[list type=decimal]
  • К сожалению, проблема с 1-ошибкой не решена. Код на модификацию ордера преобразовал в следующий:
    if((Bid > SAR && SAR > OrderStopLoss()) || OrderStopLoss() == 0)
    {
    double SL = NormalizeDouble(SAR, Digits);
    if(!OrderModify(OrderTicket(), OrderOpenPrice(), SL, 0, 0))
    Print("Ошибка модификации ордера на покупку");
    }


  • По поводу ошибки 130 я вас понял. Логика сломана. Изменил условия на открытие ордера следующим образом:
    if(Ask > SAR && CountBuy() == 0 && iHigh(Symbol(),0,1) > SAR)
    Что тоже не помогло (




  • Я не знаю, в чем дело. Ваше решение с нормализацией должно помогать, я знаю это. Но в журнале ошибка в модификации ордера происходит очень странно: в 10:59, 21:59 и т.д. А как наступает 11:00 или 22:00, то ордер модифицируется без проблем...

    P.S. если прогнать советник по ценам открытия, то советник не выдает ни одной ошибки. Раньше тестировал по всем тикам.

    Изменено 3 сентября, 2016 пользователем iPerevalov

    #3754


    [list type=decimal]

  • К сожалению, проблема с 1-ошибкой не решена. Код на модификацию ордера преобразовал в следующий:
    if((Bid > SAR && SAR > OrderStopLoss()) || OrderStopLoss() == 0)
    {
    double SL = NormalizeDouble(SAR, Digits);
    if(!OrderModify(OrderTicket(), OrderOpenPrice(), SL, 0, 0))
    Print("Ошибка модификации ордера на покупку");
    }



  • Нормализовать SAR надо перед данным блоком, как я ранее написал, т.е должно быть
    SAR = NormalizeDouble(iSAR(Symbol(), 0, 0.02, 0.2, 1), _Digits);
    ......
    if((Bid > SAR && SAR > OrderStopLoss()) || OrderStopLoss() == 0)
    {
    double SL = NormalizeDouble(SAR, Digits);
    if(!OrderModify(OrderTicket(), OrderOpenPrice(), SL, 0, 0))
    Print("Ошибка модификации ордера на покупку");
    }
    Это решит проблему ошибки 1.

    #3755

    Спасибо, помогло. Не совсем я верно вас понял.
    Также убрал проверку на OrderStopLoss() == 0. Вроде бы помогло. Но еще буду тестироваться. Спасибо большое, вам!

    Изменено 3 сентября, 2016 пользователем iPerevalov

    #3756

    iPerevalov, подкорректировал советник, 130 ошибку вроде убрал. Если возникнут проблемы, пишите.

    test5SAR_2.mq411 скач.

    #3757


    iPerevalov, подкорректировал советник, 130 ошибку вроде убрал. Если возникнут проблемы, пишите.


    Да, все сработало. Без помарок. Спасибо!
    Вы использовали вместо "Bid > SAR" условие - "(Bid - SAR) > MarketInfo(Symbol(), MODE_STOPLEVEL) * Point)". Я не знал, что это такое, поэтому Comment'ал все значения MarketInfo(Symbol(), MODE_STOPLEVEL) * Point с каждым входом на модификацию ордера. И значение этой функции было неизменным на всем промежутке тестирования и равнялось оно 0.0. То есть минимально допустимый уровень стоп-лосса/тейк-профита в пунктах равен 0. Я правильно понял? Если так, то ведь можно оставить как было, то есть Bid > SAR. Или я не прав?

    И такой вопрос: чтобы модифицировать ордер на продажу условие поменять, аналогично как у покупок, не получится, так как OrderStopLoss() нулевой. То есть if(SAR

    Изменено 4 сентября, 2016 пользователем iPerevalov

    #3758

    Добрый день!
    Моя формула:

    double Level_quaternary(int step = 250)
    {
    double vol = Close[0] * 100;
    return(MathFloor(vol) / 100 + step * _Point * (MathFloor((vol - MathFloor(vol)) / (_Point * 100 * step)) + 1));
    }
    #3759

    К сожалению, мои познания в mql4 не такие глубокие что бы понять этот код) Но спасибо, за помощь. Буду разбираться.

    #3760

    https://www.mql5.com/ru/blogs/post/661065

    #3761

    Всем добрый день.
    У меня возник такой вопрос: Как мне определить уровни Фибоначчи не растягивая сетку вручную, т.е. растянуть сетку виртуально с целью определить расположение уровней относительно цены сугубо автоматически.

    #3762


    Всем добрый день.
    У меня возник такой вопрос: Как мне определить уровни Фибоначчи не растягивая сетку вручную, т.е. растянуть сетку виртуально с целью определить расположение уровней относительно цены сугубо автоматически.


    Здравствуйте. Возможно это поможет вам:
    [list type=decimal]
  • https://docs.mql4.com/ru/objects/objectsetdouble

  • https://docs.mql4.com/ru/constants/objectconstants/enum_object/obj_fibo

  • #3763



    Всем добрый день.
    У меня возник такой вопрос: Как мне определить уровни Фибоначчи не растягивая сетку вручную, т.е. растянуть сетку виртуально с целью определить расположение уровней относительно цены сугубо автоматически.


    Здравствуйте. Возможно это поможет вам:
    [list type=decimal]
  • https://docs.mql4.com/ru/objects/objectsetdouble

  • https://docs.mql4.com/ru/constants/objectconstants/enum_object/obj_fibo



  • Объекты мне вот и не нужны как раз. Хотелось бы все делать виртуально без отрисовки. Хотя бы понять с какой стороны начать свою реализацию расчета фибосетки
    #3764

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

    #3765


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


    Формула же это по сути расстояние от высшой до низшей цены переведенное в проценты?
    #3766


    Формула же это по сути расстояние от высшой до низшей цены переведенное в проценты?


    Добрый день!
    Алгоритм действий:
    1) Получить Price_1 (например, по ZigZag)
    2) Получить Price_2
    3) Рассчитать расстояние Distance = Price_2 - Price_1
    4) Рассчитать уровень (например, 161,8%) Fibo = Price_1 + Distance * 1,618

    EURUSDH14.png

    #3767

    Здравствуйте, нужно написать простой индикатор для МТ4.

    Индикатор в отдельном окне должен отображать дельту от разницы двух валютных пар. В Экселе это все очень просто делается, хотелось бы перенести в терминал.


    Внешние настройки:

    Pair1: GBPUSD
    Pair2: GBPAUD
    Тип мувинга: Simply, Exponential ....
    Применить к: Оупен, клоуз ....
    Период мувинга: 14

    Как это должно выглядеть:

    1) (GBPUSD - GBPAUD) = N1, N2.... Nn - после нахождения разницы между каждым баром по ценам клоуз индикатор "рисует" мувинг по этим значениям

    2) Delta = MA(14) - N

    Вот эту дельту необходимо отобразить в виде индикатора.

    Должно получится что-то подобное:


    Изменено 5 сентября, 2016 пользователем Noname1

    #3768

    Добрый день, попробую сделать ... one moment please

    Настройки индикатора

    Pair_1    = "GBPUSD"; // Финансовый инструмент №1
    Pair_2 = "GBPAUD"; // Финансовый инструмент №2
    Period_MA = 14; // Период МА
    Method_MA = 0; // Метод расчета МА
    Price_MA = 0; // Используемая цена


    Удачных торгов!

    GBPUSDH166.png
    indPair.mq47 скач.

    Изменено 6 сентября, 2016 пользователем SilverKZ

    #3769

    Со стандартными парами (фунтдол фунтауд) работает, попробовал изменить на GBPUSD- GBPCAD и он перестал работать.

    #3770

    Индикатор простой и не подгружает котировки автоматически. Возможно данная пара отсутствует в обзоре рынка, подгрузите котировки, откройте график данной пары. После всего перегрузите индикатор или смените таймфрейм и затем обратно вернитесь. Если не получиться буду думать дальше.
    Удачи!

    #3771

    Помогло добавление в обзор рынка, спасибо!

    Хотел бы спросить, будет ли индикатор корректно считать дельту между такими парами как EURUSD и USDCHF?

    Дело в том, что в экселе для правильного отображения я "переворачиваю" пару с Франком и выглядит это так:

    (Eurusd - (1/usdchf)

    Изменено 6 сентября, 2016 пользователем Noname1

    #3772

    Нет, первый вариант корректно считать дельту с переворотом не будет. Подкрутил реверс, теперь будет. Если true - перевернуть вторую пару.

    Revers    = false;    // Перевернуть Pair_2

    Посмотрите правильно ли считает?

    indPair_revers.mq44 скач.

    #3773

    Он почему-то переворачивает весь индикатор, но реверс работает.

    По паре EURUSD - USDCHF он должен выглядеть так:




    Еще есть небольшая (как мне кажется) просьба :

    Добавить звуковое оповещение когда гистограмма достигает некого уровня, на скрине я выделил зеленую линию как пример.

    Хотелось бы иметь возможность нарисовать 2-3 линии-алерты на индикаторе и иметь возможность не следить за ним постоянно.

    Заранее спасибо!

    Изменено 6 сентября, 2016 пользователем Noname1

    #3774

    Подправил, теперь правильно показывает?

    Screenshot_1.png
    indPair_revers2.mq417 скач.

    #3775

    Как всетаки расчитать профит в валюте счета от открытия ордера до тек профита.?

    Для публикации сообщений создайте учётную запись или авторизуйтесь

    Перейти к списку тем
    Форум · 2.0.20260627.0025