Ошибки, баги, вопросы - страница 3447

 
Carl Schreiber #:

Я вижу, что в OnInit() структура заполняется, но только там(?) и только один раз(?). Что делать, если OnInit() вызывается в то время, когда соединение с сервером было слишком медленным или временно разорвано, так что функции MQ возвращают ноль вместо реального значения брокера?

Допустим, случилась ситуация, когда SymbolInfoDouble один раз (не с первого вызова) вернул верное значение, а затем по какой-то причине стал выдавать ошибочное. В этом случае метод структуры будет выдавать верное значение каждый раз.

Структура находится в режиме заполнения до тех пор, пока не вернется верное значение.

 
fxsaber #:

Честно говоря, SymbolInfo-функции работают без соединения с торговым сервером, потому что Обзор рынка со всеми спецификациями хранится в терминале (конфигурационные файлы).

Не представляю, что нужно сделать, чтобы SymbolInfo-функция вернула ошибку.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Carl Schreiber, 2024.01.02 20:15

SymbolInfoDouble() returns only these Errors:

The value of double type. In case of execution failure, information about the error can be obtained using GetLastError() function:
•5040 – invalid string parameter for specifying a symbol name,
•4301 – unknown symbol (financial instrument),
•4302 – symbol is not selected in "Market Watch" (not found in the list of available ones),
•4303 – invalid identifier of a symbol property.

No Error in case of connection problem.


Потому что нет такой проблемы.

 
Artyom Trishkin #:

Такую "идею" MQ много раз уже озвучивали. Так что это и не идея вовсе, а давняя рекомендация.

Данные получены - работаем, не получены - выход до следующего тика.

а когда они стали некорректны, то всё равно работаем но по прежним данным :-)

отличная затейка, ради которой пропущен тик, который вообще к этим данным отношения не имеет (он физически от другого сервера/сервиса/порта)

в функциях платформы SymbolGetXXX() данные и так мемоизированы (memoized) по самое-самое, насколько это возможно.

Максимум хорошего что можно сделать - в начале OnTick (или иного торгового цикла) прочесть необходимое, чтобы внутри одного обработчика "два раза не вставать" :-) То есть тот-же приём что у fxsaber, но "ненавсегда". 

Многие данные в справочнике НЕ ЯВЛЯЮТСЯ КОНСТАНТАМИ. При взбрыках котировок, повышенной нагрузке, внутренних траблах DC, внешних указаниях им - они меняются. 

Ещё раз - не только STOP_LEVEL, FREEZE_LEVEL . Минимальный и максимальный лот, шаг лота, маржа для открытия позиции точно меняются. Ранее были прецеденты когда и полностью плечо снижалось, со всеми эффектами маржин-колов. 

 
Не так давно был прецедент, когда дата экспирации во время торговой сессии поменялась.
 
Maxim Kuznetsov #:

а когда они стали некорректны, то всё равно работаем но по прежним данным :-)

отличная затейка, ради которой пропущен тик, который вообще к этим данным отношения не имеет (он физически от другого сервера/сервиса/порта)

в функциях платформы SymbolGetXXX() данные и так мемоизированы (memoized) по самое-самое, насколько это возможно.

Максимум хорошего что можно сделать - в начале OnTick (или иного торгового цикла) прочесть необходимое, чтобы внутри одного обработчика "два раза не вставать" :-) То есть тот-же приём что у fxsaber, но "ненавсегда". 

Многие данные в справочнике НЕ ЯВЛЯЮТСЯ КОНСТАНТАМИ. При взбрыках котировок, повышенной нагрузке, внутренних траблах DC, внешних указаниях им - они меняются. 

Ещё раз - не только STOP_LEVEL, FREEZE_LEVEL . Минимальный и максимальный лот, шаг лота, маржа для открытия позиции точно меняются. Ранее были прецеденты когда и полностью плечо снижалось, со всеми эффектами маржин-колов. 

Прежде, чем пытаться начать спорить и что-либо доказывать, прочитайте о чём речь, и о чём был ответ. Вопрос - ответ.

Просто: вопрос - ответ.

Ещё раз: вопрос - ответ.

Без придумываний новых проблем и начала их разрешения.

Вопроса о корректности данных, возможно меняющихся далее, не было. Был бы - был бы и ответ.

 
Maxim Kuznetsov #:

а когда они стали некорректны, то всё равно работаем но по прежним данным :-)

отличная затейка, ради которой пропущен тик, который вообще к этим данным отношения не имеет (он физически от другого сервера/сервиса/порта)

в функциях платформы SymbolGetXXX() данные и так мемоизированы (memoized) по самое-самое, насколько это возможно.

Максимум хорошего что можно сделать - в начале OnTick (или иного торгового цикла) прочесть необходимое, чтобы внутри одного обработчика "два раза не вставать" :-) То есть тот-же приём что у fxsaber, но "ненавсегда". 

Многие данные в справочнике НЕ ЯВЛЯЮТСЯ КОНСТАНТАМИ. При взбрыках котировок, повышенной нагрузке, внутренних траблах DC, внешних указаниях им - они меняются. 

Ещё раз - не только STOP_LEVEL, FREEZE_LEVEL . Минимальный и максимальный лот, шаг лота, маржа для открытия позиции точно меняются. Ранее были прецеденты когда и полностью плечо снижалось, со всеми эффектами маржин-колов. 

В этом случае я могу использовать только обновленные значения снова и снова, даже если они были одинаковыми 1000 раз, но потом вдруг перестали. Спасибо!

In this case, I can only use updated values again and again, even if they were the same 1000 times, but then suddenly no longer. Thank you.

 
Artyom Trishkin #:

Прежде, чем пытаться начать спорить и что-либо доказывать, прочитайте о чём речь, и о чём был ответ. Вопрос - ответ.

Просто: вопрос - ответ.

Ещё раз: вопрос - ответ.

Без придумываний новых проблем и начала их разрешения.

Вопроса о корректности данных, возможно меняющихся далее, не было. Был бы - был бы и ответ.

спорить с модератором без толку. 

хотел помочь, но раз вы сильно умнее, значит не надо и впредь

 
Maxim Kuznetsov #:

спорить с модератором без толку. 

хотел помочь, но раз вы сильно умнее, значит не надо и впредь

Дело не в модераторе - никогда оппонента банить не буду за его мнение - это полная дурь. Наверное, это сила привычки - видеть в Ваших сообщениях негатив. Приручили... ))

Хорошо. Вы пишете, что у сабера всё правильно, но его конструкция не позволит отследить внезапное изменение на стороне сервера значений, получаемых от SymbolInfoDouble:

struct STRUCT_SYMBOL_INFO_DOUBLE
{
  double Prop[100];
  
  double Get( const ENUM_SYMBOL_INFO_DOUBLE Prop_ID )
  {
    return(this.Prop[Prop_ID] ? this.Prop[Prop_ID]
                              : this.Prop[Prop_ID] = ::SymbolInfoDouble(_Symbol, Prop_ID));        
  }
} SymbolDouble = {};


void OnInit()
{
  Print(SymbolDouble.Get(SYMBOL_VOLUME_MIN));
  Print(SymbolDouble.Get(SYMBOL_VOLUME_MAX));
  Print(SymbolDouble.Get(SYMBOL_VOLUME_STEP));
}

Т.е., у него проверяется на лишь ненулевое значение, но никак не на корректное на данный момент - один раз заполнено ненулевым, и на том всё - постоянно выдаёт первое ненулевое значение.

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

 

Я же правильно понял что при оптимизации на 10 агентах, функция TesterStop() завершит тестирование (например при просадке выше 10%), на каждом агенте а не в тестере - и исполнится только на том агенте где это условие исполнится, а остальные агенты доработают до конца.

Не понял есть ли функция завершения тестирования без записывания статистики тестирования?

 
Aleksei Skrypnev #:

Я же правильно понял что при оптимизации на 10 агентах, функция TesterStop() завершит тестирование (например при просадке выше 10%), на каждом агенте а не в тестере - и исполнится только на том агенте где это условие исполнится, а остальные агенты доработают до конца.

История появлений этой функции. Остановится расчет прохода. Агент дальше будет работать.

Не понял есть ли функция завершения тестирования без записывания статистики тестирования?

Идея этой функции - создать INIT_FAILED вне OnInit. Поэтому подходит.

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