Библиотеки: Virtual - страница 21

 
traveller00:
Видимо, включение BestInterval автоматически тянет за собой и включение Virtual. А он лишний раз коды ошибок не ставит. Раз фича, то и ладно. Отписал, чтоб знали, если кто вдруг ещё налетит.

VIrtual включится только в том случае, если сами прописали его инклуд.

Вы говорите о якобы ошибке в MT4Orders, при этом совершаете торговые операции в виртуальной среде через Virtual.

В общем, лучше сначала по отдельности разобраться по каждой библиотеке. А потом дебажить BestInterval.

 
fxsaber:

VIrtual включится только в том случае, если сами прописали его инклуд.

А его инклуд нельзя не прописывать, иначе при попытке включить BestInterval, он отругается

BestInterval Action is OFF: #include <fxsaber\Virtual\Virtual.mqh> - is required!
fxsaber:

Вы говорите о якобы ошибке в MT4Orders, при этом совершаете торговые операции в виртуальной среде через Virtual.

Не-не-не, коды ошибок не выставляет именно Virtual, когда цена не проходит описанные выше проверки в Order.mqh. К MT4Orders претензий нет, она всё выставляет верно. Я ошибся, когда в ту ветку про MT4Orders репорт запостил.

Но раз разобрались, что это фича, то и ладно.

Документация по MQL5: Константы, перечисления и структуры / Коды ошибок и предупреждений
Документация по MQL5: Константы, перечисления и структуры / Коды ошибок и предупреждений
  • www.mql5.com
Константы, перечисления и структуры / Коды ошибок и предупреждений - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
traveller00:

А его инклуд нельзя не прописывать, иначе при попытке включить BestInterval, он отругается

Можно, если не пользоваться action-режимом. Инфа должна быть в описании и ветке.

Не-не-не, коды ошибок не выставляет именно Virtual, когда цена не проходит описанные выше проверки в Order.mqh. К MT4Orders претензий нет, она всё выставляет верно. Я ошибся, когда в ту ветку про MT4Orders репорт запостил.

Virtual никаких кодов ошибок создавать не должна. Это же виртуальное торговое окружение.

 
traveller00:

А его инклуд нельзя не прописывать, иначе при попытке включить BestInterval, он отругается

Это просто констатация факта, что режим выключен. Звучит немного пугающе из-за восклицательного знака, согласен)

 

Разбираюсь с Virtual, ибо не всё работает. И есть вопрос. В Sync.mqh есть функция

static void Positions( const int Handle = 0, const bool Reverse = false )

В ней берётся цена

const double Price = ::SymbolInfoDouble(_Symbol, Type ? SYMBOL_BID : SYMBOL_ASK);

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

Я поясню, в чём проблема: кривые исторические тиковые данные. Хотя брались с брокера стандартно через историю MetaTrader, и это биржа, акции, некоторые котировки не выровнены на шаг цены. Я это руками проверяю, правлю и отсылаю корректные данные на OrderSend, в результате без включённого BestInterval(и как следствие Virtual) всё работает. А когда я его подключаю, он начинает получать цену сам, коррекций не делает и по сути на каждом тике сделку не заключает, а пишет в лог, что invalid price и сделка не прошла, генерируя за минуты гигабайты лога.

 

Ни одна моя библиотека не создает сообщение "invalid price".

По поводу Sync.mqh. Тупо не помню, но это просто демонстрационная приблуда к Virtual.

Пишу свои библиотеки так, чтобы не требовалось помнить саму реализацию, а можно было пользоваться.

По Virtual есть много примеров, где хорошо показано, как это можно делать. Ее плюс только в одном - нужно минимальное изучение для использования.

 

Да, библиотека не кидает сообщение. Кидает сам MetaTrader, когда ему приходит невыровненная цена. От брокера приходят корявые невыровненные котировки, я в своём скрипте пользуюсь BestInterval, он для своего включения тянет за собой Virtual и дальше схема такая:

1. BestInterval выключен. Мой скрипт получает котировки и ровняет цену->мой скрипт отсылает ордер->он уходит в MetaTrader->профит.

2. BestInterval включён. Мой скрипт получает котировки и ровняет цену->мой скрипт отсылает ордер->его перехватывает BestInterval->он уходит в Sync.mqh->Sync.mqh подхватывает цену из корявых котировок и заполняет ордер сам->он уходит в MetaTrader->ругань на невыровненную цену->невозможность тестирования и гигабайты логов с ошибкой.

Но я Вас понял, сам разберусь, исправлю.

 
traveller00:

Да, библиотека не кидает сообщение. Кидает сам MetaTrader, когда ему приходит невыровненная цена. От брокера приходят корявые невыровненные котировки, я в своём скрипте пользуюсь BestInterval, он для своего включения тянет за собой Virtual и дальше схема такая:

1. BestInterval выключен. Мой скрипт получает котировки и ровняет цену->мой скрипт отсылает ордер->он уходит в MetaTrader->профит.

2. BestInterval включён. Мой скрипт получает котировки и ровняет цену->мой скрипт отсылает ордер->его перехватывает BestInterval->он уходит в Sync.mqh->Sync.mqh подхватывает цену из корявых котировок и заполняет ордер сам->он уходит в MetaTrader->ругань на невыровненную цену->невозможность тестирования и гигабайты логов с ошибкой.

Но я Вас понял, сам разберусь, исправлю.

Ни Вы, ни библиотека ничего не должны выравнивать. Битые цены нужно устранять до тестов, а не во время.

Вы же в Тестере работаете, так создайте нормальную среду для себя сначала, где цены корректные. Зачем заниматься исследованиями на битой истории, каждый раз тратя вычислительные ресурсы на ее коррекцию, когда это можно сделать один раз?!


Virtual принципиально никогда не будет заниматься пустыми проверками. Хочешь открыться по EURUSD по цене 1.239854634 - пожалуйста. И синхронизатор именно эту цену будет пихать в MT5, которая будет вызывать ступор. Но это не проблема синхронизатора. Тем более, написанного в качества примера.

 

Ну и докину заодно в копилку особенностей работы. Править вряд ли кто будет, скорее если кто ещё наткнётся.

Если использовать связку с BestInterval, который и подтянет Virtual, то при включенной BESTINTERVAL_LIMITSYNC_NETTING не будут работать даже и лимитники. Дело в том, что при проходе через Orders.mqh/Order.mqh, а именно функцию IsChange, лимитник, будучи выставлен по текущей цене, перейдёт в рыночное состояние. И уже в таком виде придёт в Sync.mqh, который при дефайне BESTINTERVAL_LIMITSYNC_NETTING работает только с лимитниками и слабо учитывает рыночные ордера.

 
С отложками по текущей цене целая невидимая эпопея. В частности, в одной из КБ работ можно найти такое
// https://www.mql5.com/ru/forum/1111/page2336#comment_9660624
// Нужно для BestInterval
#define TICKS_CORRECT_TIME // время тиков, кратное секунде, будет скорректировано на миллисекунду вперед
Так же и другие вещи присутствуют, которые писались только для себя. Не зря здесь такой комментарий
#define BESTINTERVAL_LIMITSYNC_NETTING // Для ТС на лимитниках и неттинге - сильно ограниченный вариант

И нигде в примерах в паблике этот вариант не приводился. Т.е. этот режим не закладывался для всех и даже не планировался допиливаться, т.к. никому это не нужно совсем.


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

Причина обращения: