Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Узнай принцип работы Торговых Сигналов для MetaTrader
elibrarius
1687
elibrarius 2016.02.01 21:08 

Здравствуйте,

есть ли возможность отследить изменения в MarketWatch (т.е. получить вызов функции, при изменении цены любого символа в MarketWatch).

  1. Была идея использовать MarketBookAdd, добавив отслеживание для всех символов, но оказалось, что не все брокеры его предоставляют его для валют (вот обсуждение https://www.mql5.com/ru/forum/68295/page3)
  2. Есть еще идея использовать    EventSetMillisecondTimer(1) - т.е. раз в 1 мс. проверять все пары на изменение от предыдущего значения (которое сохраняем от предыдущего изменения), но из справки следует что
    при работе в режиме реального времени события таймера генерируются не чаще 1 раза в 10-16 миллисекунд, что связано с аппаратными ограничениями. https://www.mql5.com/ru/docs/eventfunctions/eventsetmillisecondtimer
    Конечно 10-16 миллисекунд тоже неплохо, но хотелось бы более точное решение.
  3. Запуск скрипта на 10 - 50 графиках, который будет ловить OnTick - будет самым точным решением, но исполнять его достаточно трудоемко.

Может есть другие варианты?

Konstantin Gruzdev
13436
Konstantin Gruzdev 2016.02.01 21:20  
Есть еще такой способ.
elibrarius
1687
elibrarius 2016.02.01 21:38  
Konstantin Gruzdev:
Есть еще такой способ.
Классно придумано! Думаю это будет иметь идеальную точность при меньшей загрузке, чем используя EventSetMillisecondTimer(1).
Спасибо!
elibrarius
1687
elibrarius 2016.02.01 23:47  
Konstantin Gruzdev:
Есть еще такой способ.

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

Вот прямо сейчас торгов и тиков по XAUUSD нет, а события генерируются:

Время, Ask, Bid, Volume
2016.02.02 00:26:47.470,1128.630,1128.270,4
2016.02.02 00:32:10.548,1128.630,1128.270,4
2016.02.02 00:33:09.736,1128.630,1128.270,4

Значения приходят от последнего известного тика 2016.02.01 23:58
Пришлось все-таки сверять с предыдущим вызовом по инструменту и при совпадении отсеивать.

elibrarius
1687
elibrarius 2016.02.02 16:20  
Konstantin Gruzdev:
Есть еще такой способ.

Пишу сборщик тиковых данных.

При запуске по всем символам (71 шт) эксперт сделанный по вашей модели с 71 индикаторами, перегружает эксперт. По каждому символу отлавливается 1 - 5 тиков в минуту, а иногда и не одного.

Вариант с таймером, запускается примерно каждые 15-20 мс и все тики, по всем символам сохраняет, например по EURUSD 100 - 200 тиков за минуту.

Видимо при вызове пользовательского индикатора происходит очень много вычислений. Умножим это на 71 символ.

И видимо это намного больше, чем перебор в цикле 71 символов и считывание по ним текущих Ask, Bid и Voluve через СopyTickVolume(simм,PERIOD_M1,0,1,arr).

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

Результат по EURUSD иногда абсолютно одинаковый, а иногда ВПС теряет 1-3 тика за минуту.

Но если запустить эксперт на индикаторах на 8 символах, то он фиксирует большее количество тиков и очевидно с большей точностью. Но через 2 - 3 минуты начинает терять тики и доходит до 1-5 в минуту.

elibrarius
1687
elibrarius 2016.02.02 17:08  

По вашей методике использую такой индикатор

input long            chart_id=0;
input long n_symbol=0;//number of symbol in array
int OnCalculate (const int rates_total,const int prev_calculated,const int begin,const double& price[]){
   Print("ind ",_Symbol, " ",TimeCurrent());
   EventChartCustom(chart_id,0,n_symbol,0.0,_Symbol);
   return(rates_total);
}

в эксперте

void OnChartEvent(const int id,  const long&   lparam,const double& dparam, const string& sparam ){
 Print(TimeCurrent()," ",sparam,id); 
}

При запуске на ВПС вначале в логах вижу вызовы и OnCalculate и OnChartEvent. Через 2-3 минуты остаются только  вызовы OnCalculate. До OnChartEvent событие не доходит, в логах печатаются только вызовы индикатора

KI    0    16:06:26.452    history_multi (USDCHF.e,H1)    ind USDCHF.e 2016.02.02 18:06:26
NG    0    16:06:26.514    history_multi (XAUUSD.e,H1)    ind XAUUSD.e 2016.02.02 18:06:26
NM    0    16:06:26.514    history_multi (AUDUSD.e,H1)    ind AUDUSD.e 2016.02.02 18:06:26
HK    0    16:06:26.781    history_multi (USDJPY.e,H1)    ind USDJPY.e 2016.02.02 18:06:26
IQ    0    16:06:26.782    history_multi (GBPUSD.e,H1)    ind GBPUSD.e 2016.02.02 18:06:26
IO    0    16:06:26.782    history_multi (USDCHF.e,H1)    ind USDCHF.e 2016.02.02 18:06:26

И лишь иногда проскакивают несколько вызовов OnChartEvent

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

Решил остановиться на сборщике, на основе таймера, думаю ошибка в 10-15 миллисекунд - не критична.

Vasiliy Sokolov
19285
Vasiliy Sokolov 2016.02.03 10:32  
elibrarius:

Может есть другие варианты?

Лучше для этих целей дергать OnBookEvent. Так как это единственное событие, которое позволяет быть подписанным на изменения сразу всех инструментов. Если стакан не доступен, тогда лучше разделить сборщик тиков на каждый конкретный инструмент - работать быстрее будет.

Также Вы сможете без труда организовать сборщик тиков на базе вот этого статьи: https://www.mql5.com/ru/articles/2169#c1 Там событийная модель изначально мультиинструментальная. Т.е. создаете эксперта и подписываете его на событие OnTick сразу по всем инструментам. Далее в одном из обработчиков получаете текущий тик и сохраняете его.

Универсальный торговый эксперт: Событийная модель и прототип торговой стратегии (Часть 2)
Универсальный торговый эксперт: Событийная модель и прототип торговой стратегии (Часть 2)
  • 2016.01.14
  • Vasiliy Sokolov
  • www.mql5.com
Данная статья продолжает серию заметок, посвященных универсальной модели эксперта. В этой части описывается оригинальная событийная модель на основе централизованной обработки данных, а также рассматривается структура базового класса движка — CStrategy.
elibrarius
1687
elibrarius 2016.02.03 11:30  
Vasiliy Sokolov:

Если стакан не доступен, тогда лучше разделить сборщик тиков на каждый конкретный инструмент - работать быстрее будет.

Т.е. открывать график каждого инструмента, и на него цеплять эксперт, работающий по OnTick? На мой взгляд слишком много ручной работы, особенно если собирать буду от 10 и более инструментов. Мой эксперт на основе таймера, все 71 инструментов тянет.

Вчера запустил сбор по 15 инструментам. Пока все идет нормально. 2х ядерный проц. 2,4 гг на ВПС нагружен на 25%

Vasiliy Sokolov
19285
Vasiliy Sokolov 2016.02.03 11:42  
elibrarius:

Т.е. открывать график каждого инструмента, и на него цеплять эксперт, работающий по OnTick? На мой взгляд слишком много ручной работы, особенно если собирать буду от 10 и более инструментов. Мой эксперт на основе таймера, все 71 инструментов тянет.

Вчера запустил сбор по 15 инструментам. Пока все идет нормально. 2х ядерный проц. 2,4 гг на ВПС нагружен на 25%

Разбиение на независимые потоки все равно лучше сделать, потому что иначе сильно будет нагружено одно ядро ЦП и файловая система. Конечно, 71 график это перебор. А вот какое-нибудь промежуточное решение вполне можно создать.

elibrarius
1687
elibrarius 2016.02.03 12:06  
Vasiliy Sokolov:

Разбиение на независимые потоки все равно лучше сделать, потому что иначе сильно будет нагружено одно ядро ЦП и файловая система. Конечно, 71 график это перебор. А вот какое-нибудь промежуточное решение вполне можно создать.

Ну на ВПС у меня всего 2 ядра, (при заказе ВПС часто бывает и 1) так что делить по ядрам - нет смысла.

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

Пробовал варианты со скидыванием на диск 1 раз в секунду, 1 раз в минуту и 1 раз в день в 0:00.

Решил остановиться на 1 раз в день, т.к. 1 раз в секунду будет убивать диск, 1 раз в минуту занимает 50 - 200 мс (в зависимости от кол-ва символов) и приходится тормозить новые вызовы функции по Sleep(1), пока не закончится запись. Но боюсь, что когда сразу несколько вызовов  функций продолжат работу, после окончания записи, то порядок их обработки может перемешаться.
А сброс 1 раз в 0:00 будет дольше, но вряд ли в это время потеряем много тиков.

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

Но сбой или перезагрузка, в любом случае приведет к потере 2 - 3х  минут, даже при посекундной или поминутной записи. Так что для надежной записи нужно 2 сервера, и моменты сбоев замещать результатами от другого сервера. Вероятность сбоя 2-х серверов одновременно и даже в 1 день, стремится к 0.

elibrarius
1687
elibrarius 2016.02.03 12:33  
А нет, ошибся, штатная перезагрузка сервера, видимо приводит к штатному выключению терминала и он скинул данные на диск. Только что проверил перезагрузкой сервера, из панели управления хостингом. Но 2 -3 минуты будут теряться все равно.
/ /12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий