![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Я вызвал свою функцию DoubleRound с MODE_TICKVALUE (который равен 12.50) вместо MODE_TICKSIZE (0.25).
Я исправил это, но это не заставило #130 исчезнуть
.
Вот лог ошибки с обновленной строкой DoubleRound:
Для сравнения, вот лог, где все работало:
В любом случае, похоже, теперь это работает чаще, мы определенно приближаемся :)
В любом случае, кажется, что теперь это работает чаще, мы определенно приближаемся :)
Я не могу понять, почему модификация не удалась ... Вы получаете свежий Bid/Ask между OrderSend и OrderModify?
Все, что я могу предложить сейчас, это то, что когда вы получаете ошибку 130... печатайте все заново, Bid, Ask (используя MarketInfo), OOP, StopLevel, SL, который вы пытаетесь установить, и т.д. и т.п.
Я вызвал свою функцию DoubleRound с MODE_TICKVALUE (который равен 12,50) вместо MODE_TICKSIZE (0,25).
Ошибка #130 stoploss больше не появляется. Последние шаги, похоже, окончательно определили проблему.
После этого я опубликую еще одно сообщение, в котором подытожу все предпринятые шаги. Чтобы другие участники форума, столкнувшиеся с ошибкой #130, могли использовать эту тему в качестве справочника.
Спасибо за вашу постоянную помощь :).
shinobi
Спасибо за вашу постоянную помощь :).
шиноби
Самым важным приемом борьбы с ошибками является чрезмерное протоколирование. Делайте вывод для всего, что может быть удаленно связано с ошибкой. Если вы определите функцию логирования, которую можно включать и выключать, вы сможете сохранить код после решения проблемы.
При инициализации вашего эксперта вы должны записывать в журнал всю информацию, которую может сообщить вам MarketInfo: https://docs.mql4.com/constants/marketinfo.
Также всегда проверяйте возвращаемые значения функций, например, для OrderModify:
ECN Broker требует, чтобы вы создавали отдельные ордера на покупку/продажу и стоплосс/тейкпрофит. Поэтому вам нужно разделить ваш код на два ордера следующим образом:
Для ордеров на продажу вам нужно заменить OP_BUY на OP_SELL. Вы также должны проверить возвращаемые значения OrderSelect и OrderModify (см. Общие советы выше).
Некоторые брокеры требуют, чтобы стоплосс, тейкпрофит и проскальзывание были скорректированы до 4/5 цифр. Вы можете сделать это, поместив следующий код в функцию init() (спасибо WHRoeder):
Затем вам нужно умножить стоплосс, тейкпрофит и проскальзывание на pips2db1 перед отправкой брокеру.
Другая возможная причина заключается в том, что рыночные курсы изменились между тиком, активировавшим советника (EA), и выполнением советником OrderSend() или OrderModify(). Чтобы избежать этой проблемы, есть два возможных решения:
Первое - использовать: RefreshRates() перед использованием предопределенных рыночных переменных, таких как: Ask и Bid. (эти переменные получают свои значения, когда тик активирует советника).
Второй - не использовать предопределенные рыночные переменные вообще. Вместо этого вы можете использовать текущие рыночные значения с помощью функции MarketInfo(). Вместо Ask, Bid и Point используйте
Если стоплосс или тейкпрофит находятся слишком близко к цене входа, ордер будет отклонен. Чтобы избежать этой проблемы, необходимо учитывать текущий спред между Ask и Bid. И снова есть два решения:
Первое - рассчитать спред и прибавить/вычесть его к стоплоссу/такепрофиту.
Второе решение - неявно учитывать спред, используя Ask и Bid, при расчете стоплосса или тейкпрофита:
У брокеров есть определенный уровень стопа. Если ваш стоплосс ниже этого уровня, ваш ордер будет отклонен. Вы можете проверить уровень стопа с помощью MarketInfo(Symbol(), MODE_STOPLEVEL).
Чтобы избежать этого, сверьте свой стоплосс с уровнем стопа брокера и при необходимости скорректируйте его:
Freeze Level - это аналогичная концепция. Ваш стоплосс также должен быть больше, чем уровень заморозки брокера. Вы можете проверить уровень заморозки с помощью MarketInfo(Symbol(), MODE_FREEZELEVEL).
Чтобы избежать этого, снова проверьте свой стоплосс на соответствие уровню заморозки брокера:
Наконец, ваш стоплосс или тейкпрофит может быть отклонен, потому что символ поддерживает только те стоплоссы/тейкпрофиты, которые соответствуют его тиковому размеру. Тиковый размер - это минимальное расстояние, на которое цена символа может подниматься и опускаться. Например, если цена равна 1000, а размер тика 0,25, то цена может подняться или опуститься только на величину, кратную 0,25 (0,25 * n, где n - натуральное число). Таким образом, цена может вырасти на 0,25 до 1000,25 или упасть на 1,75 до 998,25.
Чтобы учесть размер тиков, нужна функция для округления двойных значений до определенного шага (например, ближайшего 0,25). Вот такая функция:
Например, вызов DoubleRound с числом = 1023.81234 и шагом = 0.25 вернет 1023.75. Вызов функции с числом 1023.967834 вернет 1024.00.
Теперь перед отправкой стоплосса или тейкпрофита округлите его до размера тика символа с помощью:
Вот полный небольшой пример, учитывающий все вышеперечисленные меры противодействия:
Надеюсь, это поможет избавиться от #130. Если модификация кода не помогает, используйте сначала минимальный пример, подобный приведенному выше. А затем, когда ошибка исчезнет, перенесите измененный пример в свой код.
Удачи,
шиноби
Моя благодарность Raptor, WHRoeder, SDC, BigAl, gjol и 35806 за помощь в избавлении от ошибки и составлении этой справки.