![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Реал. Использую MT4Orders, виртуальное окружение через Virtual, виртуал синхронизирую с реалом. Для этого на каждом тике прохожусь по открытым в реале ордерам несколько раз. Для этого на первом проходе формирую список интересующих ордеров, на остальных проходах уже работаю с этим списком.
Раньше был такой код:
Практика показала, что так делать не стоит. Частично залитый лимитник породит 2 ордера с одинаковым тикетом, и на втором проходе будет печаль.
Сейчас перешёл на такой код
Дополнительно делается снапшот перед работой. Так будет работать корректно или может ещё что-то вылезти?
Реал. Использую MT4Orders, виртуальное окружение через Virtual, виртуал синхронизирую с реалом. Для этого на каждом тике прохожусь по открытым в реале ордерам несколько раз. Для этого на первом проходе формирую список интересующих ордеров, на остальных проходах уже работаю с этим списком.
Раньше был такой код:
Практика показала, что так делать не стоит. Частично залитый лимитник породит 2 ордера с одинаковым тикетом, и на втором проходе будет печаль.
Печали не будет, если делать так.
AddToArray(OrderTickets, (OrderType() <= OP_SELL) ? OrderTicket() : -OrderTicket());
Это фича MT4Orders. Однако, SELECT_BY_TICKET - это небыстрый механизм в MT4/5 и виртуалке. Одна из причин - если не найдет среди живых, полезет в историю (MODE_TRADES-флаг - только указание приоритета, где сначала искать).
Сейчас перешёл на такой код
Дополнительно делается снапшот перед работой. Так будет работать корректно или может ещё что-то вылезти?
Здесь уже речь о дополнении от Virtual.mqh. Безусловно, снепшоты очень круто ускорят работу, если торгуется много символов/мэджиков.
Снепшот сводит работу с внешним для советника окружением (торговый API) к минимуму. Т.е. самые тормозные функции вызываются единожды для изначального считывания, а далее вся работа с торговым окружением идет внутри советника незаметно для программиста, т.к. все тот же MT4-style.
Имеет смысл использовать один из этих вариантов снепшота.
Можно тысячу раз подряд вызвать VIRTUAL::Snapshot(), но он не будет взаимодействать с внешним торговым API чаще, чем задано в VIRTUAL_SNAPSHOT_REFRESHTIME (в примере это одна миллисекунда - мне хватает). Поэтому ничего не требуется запоминать, код, грубо говоря, становится таким.
Вот мой код синхронизации (вызывается для каждой подТС) с виртуальными окружениями.
Из выделенного видно создание снепшота. Его следует вызывать после тормозных функций. Например, OrderSend. Если лишний раз вызвать - ничего страшного, как показал в коде выше.
Однако, исходник привел по другой причине. Все потенциально тормозные функции при синхронизации облачаю в макрос, который полностью останавливает синхронизацию, если во время нее пришел новый тик (SymbolInfoTick или CopyTicks), т.к. требуется сначала новые тики пробросить через все виртуалки, а только потом синхронизировать с реалом. Все точно также, как должно работать у торговых копиров и на внешних крипто-биржах.
Словил OrderBug22 В чем может бить проблема? RP 0 19:00:01.733 Pip Funnels 1.0 (AUDJPY,H2) Line = 1537 NF 0 19:00:01.733 Pip Funnels 1.0 (AUDJPY,H2) Before MT4ORDERS::HistoryDealSelect(Result): DP 0 19:00:01.733 Pip Funnels 1.0 (AUDJPY,H2) MT4ORDERS::OrderSendBug = 22 CL 0 19:00:01.733 Pip Funnels 1.0 (AUDJPY,H2) Result.deal = 0
Нет проблемы.
какой-то баг
какой-то баг
Это норма.