Мультивалютный советник. Желательно мнение разработчиков. - страница 3

 
Reshetov:
LeoV:
YuraZ писал (а): честно говоря и это не совсем красиво ... представим что тик не пришел по указанным парам и вы опять пролетите мимо

если бы Вы показали кусок кода по которому формируется вход - можно было бы найти быстрее ошибку в логике

Но должно же быть какое-то общепринятое решение в MQL? Как "синхронизовать" начало открытия баров по разным инструментам? Нужно, по всей видимости, ждать открытия нового бара по всем инструментам которые используешь. Но только как это сделать правильно?

Не надо никаких синхронизаций и изобретений прочих велосипедов. Все давно уже изобретено. Наличие нового сформировавшегося бара проверяется только на том инструменте, на котором установлен советник по приходу первого тика. И событие start(), тоже срабатывает только на этом самом инструменте по приходу нового тика. Я вам привел кусок кода, где выполняется такая проверка, чтобы следующая позиция в случае реквот не открывалась на следующем баре, а после неудач, совершались попытки открытия на этом же баре. У меня все это нормально работает как сингловом, так и в мультивалютном режиме. Сделка в случае реквоты открывается на том же самом баре, но только с некоторой задержкой, а потому не всегда по цене открытия бара, а с некоторым смещением. Т.е. различия с тестером будут, но не в барах, а в цене открытия.


Юрий начало нового часа! произойдет даже если тик не пришел!

потому как время его не остановить а вот тики могут не прийти минут 5


поэтому считать новый бар можно по тику в новом баре ЛЮБОГО инструмента


LeoV - же похоже ждет новый тик синхронно по всем используемым парам

 
YuraZ:
thecore:

YuraZ писал (а):

честно говоря и это не совсем красиво ... представим что тик не пришел по указанным парам и вы опять пролетите мимо

Если тик не пришел, то и выставить ордер сиюминутно Вам не удастся, разве что с помощью скрипта,

да и то только тогда если тики в ДЦ приходят, а они их на терминал не транслируют (в дневное время суток).

Поэтому я, когда реализовывал мультивалютный советник, делал Стейт Машину состояний Мили (или Мура),

которая отслеживала состояния открытости ордеров по нужным парам. Естественно не всегда получалось

открыть по нужной цене, но зато такой подход гарантировал, что ордера ТОЧНО будут открыты.

запросто! можно выставить ордер :-) если не пришел тик

вы подумайте ! если не придумаете я подскажу

Обычно с мультивалютными советниками обычно ситуация такая, что если нет гарантии прихода ордера на 100%,

то рассыпается логика работы советника.

Кстати, не забывайте, что Ваш советник работает по тикам той пары, на которой висит,

поэтому, даже если по другой паре был тик, а по паре, на которой прикреплен советник не было,

то увы синхронизация будет нарушена.

Да не забывайте еще такую неприятную штуку, как потерю связи с ДЦ и реквоты (если Вы на реале).

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

Даже в ручном режиме. Ждет чего -то, ждет...

Поэтому я давно отказался от систем, основаных на парных ордерах.

Больно хлопотно.

 
thecore:
YuraZ:
thecore:

YuraZ писал (а):

честно говоря и это не совсем красиво ... представим что тик не пришел по указанным парам и вы опять пролетите мимо

Если тик не пришел, то и выставить ордер сиюминутно Вам не удастся, разве что с помощью скрипта,

да и то только тогда если тики в ДЦ приходят, а они их на терминал не транслируют (в дневное время суток).

Поэтому я, когда реализовывал мультивалютный советник, делал Стейт Машину состояний Мили (или Мура),

которая отслеживала состояния открытости ордеров по нужным парам. Естественно не всегда получалось

открыть по нужной цене, но зато такой подход гарантировал, что ордера ТОЧНО будут открыты.

запросто! можно выставить ордер :-) если не пришел тик

вы подумайте ! если не придумаете я подскажу

Обычно с мультивалютными советниками обычно ситуация такая, что если нет гарантии прихода ордера на 100%,

то рассыпается логика работы советника.

Кстати, не забывайте, что Ваш советник работает по тикам той пары, на которой висит,

поэтому, даже если по другой паре был тик, а по паре, на которой прикреплен советник не было,

то увы синхронизация будет нарушена.

Да не забывайте еще такую неприятную штуку, как потерю связи с ДЦ и реквоты (если Вы на реале).

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

Даже в ручном режиме. Ждет чего -то, ждет...

Поэтому я давно отказался от систем, основаных на парных ордерах.

Больно хлопотно.

Вы наверно хотели написать ТИК... а написали ордер


даже если советник стоит на EURUSD Вы же понимате что войти он может по USDCHF

достаточно написать

LevelOpenBUY = MarketInfo("USDCHF",MODE_ASK);

... = OrderSend ( "USDCHF",Lot, LevelOpenBUY, ...



кусок из работающего кода

OpenLevel = MarketInfo( sSymbol, MODE_BID );
if ( TDARELOCK == 0 )
ticket=OrderSend ( sSymbol,OP_SELL,Lots,OpenLevel,3,0,0,sComment,mMagic,0,Red);


----

при этом ТИК по USDCHF может не приходить достаточно получить тик по любой ПАРЕ


КСТАТИ надеюсь что в MQL5 не надо будет получать никаких тиков для работы программы

там обещали сделать события а значит по событию можно пустить любой кусок кода

----



вот второй вопрос касающийся зависаний терминала - при которой проблема лечится перезагрузкой -это уже скорее к разработчикам

я встречал тоже такое -

это тоже лечиться и тут на форуме есть пример

Ну вот и все - отлично работает процедруа программного реконнекта :)
НЕ ЗАБУДЬТЕ ВКЛЮЧИТЬ ГАЛОЧКУ "Разрешить импорт ДЛЛ" в настройках МТ4.
//В начале советника подключаем необходимые ДЛЛ-ки и модули
#include <winuser32.mqh>
#import "user32.dll"
int GetParent(int hWnd);
#import
 
//Копируем процедуру в наш советник или библиотеку и вызываем ее там, где вам нравиться
//Лично я вызываю перед рассчетом данных - но можно перед установкой ордеров. Правда тогда
//возможно нужно будет делать задержку в пару секунд
//У меня все работает
int Reconnect()
{
int result;
int hwnd = WindowHandle(Symbol(), Period()); // получаем хендл окна графика
hwnd = GetParent(hwnd); // получаем хендл родительского окна
hwnd = GetParent(hwnd); // ...
hwnd = GetParent(hwnd); //добираемся до главного окна
result = SendMessageA(hwnd, WM_COMMAND, 37400, 0);
Print("SendMessageA = " + result); //посылаем сообщене
return;
}

---

так что если вы послали ордер о он не окрылся можно конечно и подобный кусок кода пустить на отработку

 

YuraZ писал (а):

Обычно с мультивалютными советниками обычно ситуация такая, что если нет гарантии прихода ордера на 100%,

Вы наверно хотели написать ТИК... а написали ордер

Я имел в виду выставление ордера на 100%.

 
thecore:

YuraZ писал (а):

Обычно с мультивалютными советниками обычно ситуация такая, что если нет гарантии прихода ордера на 100%,

Вы наверно хотели написать ТИК... а написали ордер

Я имел в виду выставление ордера на 100%.


Но Вы же понимаете что это не только в мультивалютной системе

а и в обычном советнике 100% -я гарантия не бывает, вы не получите... никогда гарантированные 100%

т к есть факторы

ИНТЕРНЕТ

ВАШ ПРОВАЙДЕР

ПРОВАЙДЕР ДЦ

ваша аппаратура

аппаратура ДЦ

и т д

---

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

---


а вот если это ошибка логике в программе!!! то это уже как раз другое дело и это лечится

---


и логика не должна рассыпаться из за того, что вход произошел не в 15 часов а в 15:05 или 15:02

Мы это как раз и наблюдаем у автора ветки! он пытается войти имеенно четь ли не в 15:00:00 00.00.00

( цифры условные )


у него ж не пипсовка какая нибудь, потому вход в 15:00 или 15:01 - 15:07 для него не должен быть слишком существенным


о чем и идет речь, нельзя завязываться жестко на начало бара по всем нужным инструментам - достаточно получить начало бара на любом из них

 
YuraZ:
thecore:
YuraZ:
thecore:

YuraZ писал (а):

честно говоря и это не совсем красиво ... представим что тик не пришел по указанным парам и вы опять пролетите мимо

Если тик не пришел, то и выставить ордер сиюминутно Вам не удастся, разве что с помощью скрипта,

да и то только тогда если тики в ДЦ приходят, а они их на терминал не транслируют (в дневное время суток).

Поэтому я, когда реализовывал мультивалютный советник, делал Стейт Машину состояний Мили (или Мура),

которая отслеживала состояния открытости ордеров по нужным парам. Естественно не всегда получалось

открыть по нужной цене, но зато такой подход гарантировал, что ордера ТОЧНО будут открыты.

запросто! можно выставить ордер :-) если не пришел тик

вы подумайте ! если не придумаете я подскажу

Обычно с мультивалютными советниками обычно ситуация такая, что если нет гарантии прихода ордера на 100%,

то рассыпается логика работы советника.

Кстати, не забывайте, что Ваш советник работает по тикам той пары, на которой висит,

поэтому, даже если по другой паре был тик, а по паре, на которой прикреплен советник не было,

то увы синхронизация будет нарушена.

Да не забывайте еще такую неприятную штуку, как потерю связи с ДЦ и реквоты (если Вы на реале).

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

Даже в ручном режиме. Ждет чего -то, ждет...

Поэтому я давно отказался от систем, основаных на парных ордерах.

Больно хлопотно.

Вы наверно хотели написать ТИК... а написали ордер

даже если советник стоит на EURUSD Вы же понимате что войти он может по USDCHF

достаточно написать

LevelOpenBUY = MarketInfo("USDCHF",MODE_ASK);

... = OrderSend ( "USDCHF",Lot, LevelOpenBUY, ...

кусок из работающего кода

OpenLevel = MarketInfo( sSymbol, MODE_BID ); if ( TDARELOCK == 0 ) ticket=OrderSend ( sSymbol,OP_SELL,Lots,OpenLevel,3,0,0,sComment,mMagic,0,Red);

----

при этом ТИК по USDCHF может не приходить достаточно получить тик по любой ПАРЕ

КСТАТИ надеюсь что в MQL5 не надо будет получать никаких тиков для работы программы

там обещали сделать события а значит по событию можно пустить любой кусок кода

----

вот второй вопрос касающийся зависаний терминала - при которой проблема лечится перезагрузкой -это уже скорее к разработчикам

я встречал тоже такое -

это тоже лечиться и тут на форуме есть пример

Ну вот и все - отлично работает процедруа программного реконнекта :)
НЕ ЗАБУДЬТЕ ВКЛЮЧИТЬ ГАЛОЧКУ "Разрешить импорт ДЛЛ" в настройках МТ
4.
//В начале советника подключаем необходимые ДЛЛ-ки и модули
#include <winuser32.mqh>
#import "user32.dll"
int GetParent(int hWnd);
#import

//Копируем процедуру в наш советник или библиотеку и вызываем ее там, где вам нравиться
//Лично я вызываю перед рассчетом данных - но можно перед установкой ордеров. Правда тогда
//возможно нужно будет делать задержку в пару секунд
//У меня все работает
int Reconnect()
{
int result;
int hwnd = WindowHandle(Symbol(), Period()); // получаем хендл окна графика
hwnd = GetParent(hwnd); // получаем хендл родительского окна
hwnd = GetParent(hwnd); // ...
hwnd = GetParent(hwnd); //добираемся до главного окна
result = SendMessageA(hwnd, WM_COMMAND, 37400, 0);
Print("SendMessageA = " + result); //посылаем сообщене
return;
}

---

так что если вы послали ордер о он не окрылся можно конечно и подобный кусок кода пустить на отработку

Перезагрузка терминала это здорово, а что делать другим советникам в этот момент, которые висят, но на других окнах

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

которые мы так долго копили.

даже если советник стоит на EURUSD Вы же понимате что войти он может по USDCHF

достаточно написать

LevelOpenBUY = MarketInfo("USDCHF",MODE_ASK);

... = OrderSend ( "USDCHF",Lot, LevelOpenBUY, ...

Естественно понимаю. В мультивалютном советнике именно так и контролируются другие пары.

Но если по основной паре последний тик прошлого часа  пришел, например,  в 7.50, а первый тик часа пришел,

в 8.10, а по второстепенной паре первый тик часа пришел в 8.00,

то сложно надеяться, что советник, висящий на основной паре выставит ордер по второстепенной

в 8.00, в лучшем случае в 8.10.

Случай, когда советник работает как скрипт, т.е. не дает системе продыхнуть, а молотит, молотит,

не взирая на тики я не рассматриваю. Лучше уж тогда писать скрипт.

 
thecore:
YuraZ:
thecore:
YuraZ:
thecore:

YuraZ писал (а):

честно говоря и это не совсем красиво ... представим что тик не пришел по указанным парам и вы опять пролетите мимо

Если тик не пришел, то и выставить ордер сиюминутно Вам не удастся, разве что с помощью скрипта,

да и то только тогда если тики в ДЦ приходят, а они их на терминал не транслируют (в дневное время суток).

Поэтому я, когда реализовывал мультивалютный советник, делал Стейт Машину состояний Мили (или Мура),

которая отслеживала состояния открытости ордеров по нужным парам. Естественно не всегда получалось

открыть по нужной цене, но зато такой подход гарантировал, что ордера ТОЧНО будут открыты.

запросто! можно выставить ордер :-) если не пришел тик

вы подумайте ! если не придумаете я подскажу

Обычно с мультивалютными советниками обычно ситуация такая, что если нет гарантии прихода ордера на 100%,

то рассыпается логика работы советника.

Кстати, не забывайте, что Ваш советник работает по тикам той пары, на которой висит,

поэтому, даже если по другой паре был тик, а по паре, на которой прикреплен советник не было,

то увы синхронизация будет нарушена.

Да не забывайте еще такую неприятную штуку, как потерю связи с ДЦ и реквоты (если Вы на реале).

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

Даже в ручном режиме. Ждет чего -то, ждет...

Поэтому я давно отказался от систем, основаных на парных ордерах.

Больно хлопотно.

Вы наверно хотели написать ТИК... а написали ордер

даже если советник стоит на EURUSD Вы же понимате что войти он может по USDCHF

достаточно написать

LevelOpenBUY = MarketInfo("USDCHF",MODE_ASK);

... = OrderSend ( "USDCHF",Lot, LevelOpenBUY, ...

кусок из работающего кода

OpenLevel = MarketInfo( sSymbol, MODE_BID ); if ( TDARELOCK == 0 ) ticket=OrderSend ( sSymbol,OP_SELL,Lots,OpenLevel,3,0,0,sComment,mMagic,0,Red);

----

при этом ТИК по USDCHF может не приходить достаточно получить тик по любой ПАРЕ

КСТАТИ надеюсь что в MQL5 не надо будет получать никаких тиков для работы программы

там обещали сделать события а значит по событию можно пустить любой кусок кода

----

вот второй вопрос касающийся зависаний терминала - при которой проблема лечится перезагрузкой -это уже скорее к разработчикам

я встречал тоже такое -

это тоже лечиться и тут на форуме есть пример

Ну вот и все - отлично работает процедруа программного реконнекта :)
НЕ ЗАБУДЬТЕ ВКЛЮЧИТЬ ГАЛОЧКУ "Разрешить импорт ДЛЛ" в настройках МТ4.
//В начале советника подключаем необходимые ДЛЛ-ки и модули
#include <winuser32.mqh>
#import "user32.dll"
int GetParent(int hWnd);
#import
 
//Копируем процедуру в наш советник или библиотеку и вызываем ее там, где вам нравиться
//Лично я вызываю перед рассчетом данных - но можно перед установкой ордеров. Правда тогда
//возможно нужно будет делать задержку в пару секунд
//У меня все работает
int Reconnect()
{
int result;
int hwnd = WindowHandle(Symbol(), Period()); // получаем хендл окна графика
hwnd = GetParent(hwnd); // получаем хендл родительского окна
hwnd = GetParent(hwnd); // ...
hwnd = GetParent(hwnd); //добираемся до главного окна
result = SendMessageA(hwnd, WM_COMMAND, 37400, 0);
Print("SendMessageA = " + result); //посылаем сообщене
return;
}

---

так что если вы послали ордер о он не окрылся можно конечно и подобный кусок кода пустить на отработку

Перезагрузка терминала это здорово, а что делать другим советникам в этот момент, которые висят, но на других окнах

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

которые мы так долго копили.

даже если советник стоит на EURUSD Вы же понимате что войти он может по USDCHF

достаточно написать

LevelOpenBUY = MarketInfo("USDCHF",MODE_ASK);

... = OrderSend ( "USDCHF",Lot, LevelOpenBUY, ...

Естественно понимаю. В мультивалютном советнике именно так и контролируются другие пары.

Но если по основной паре последний тик прошлого часа пришел, например, в 7.50, а первый тик часа пришел,

в 8.10, а по второстепенной паре первый тик часа пришел в 8.00,

то сложно надеяться, что советник, висящий на основной паре выставит ордер по второстепенной

в 8.00, в лучшем случае в 8.10.

Случай, когда советник работает как скрипт, т.е. не дает системе продыхнуть, а молотит, молотит,

не взирая на тики я не рассматриваю. Лучше уж тогда писать скрипт.



1 а Вы считате что Реконнект вызывает функцию Init () ? и перезапускает советника ?


Вы ошибаетесь...


Кроме того расчетные и ценные переменные разумно сохранять


если у меня не сложный код я храню их в ГЛОБАЛЬНЫХ ПЕРЕМЕННЫХ

если код сложный то пишу на диск и читаю при перезапуске - если перезапуск был по ошибке я их просто восстанавливаю

кстати определить по ошибке он был или не по ошибке достаточно лекго




---

2 Если наступил новый час по какой либо паре ! а тиков по другим парам нет - то независимо от того когда там появится тик

НОВЫЙ БАР - а точнее новый час можно считать наступившим


и поэтому вполне можно обсчитать запоздавшие пары по CLOSE считая что они тоже прикрыты


тики там прийдут позже и бар будет смещен по времени !!! но реально ЧАС прошел

---


выставить ордер по паре по которой не пришел тик МОЖНО, вы же знаете как

я не говорю что он будет выставлен в 8:00 - ( условная цифра )


он может быть выставлен СРАЗУ как только прийдет НОВЫЙ ТИК в новый бар по любой паре


---


>о если по основной паре последний тик прошлого часа пришел, например, в 7.50, а первый тик часа пришел,

>в 8.10, а по второстепенной паре первый тик часа пришел в 8.00,

>то сложно надеяться, что советник, висящий на основной паре выставит ордер по второстепенной

>в 8.00, в лучшем случае в 8.10.


работая в мультивалютке не надо считать время по основной паре или не по основной

надо просто ловить тик начала нового бара по любой паре - и обсчитывать индикаторы по CLOSE а не по закрытию бара

и входит- выходить


потому что вход будет имеено по тику нового бара любой контролируемой пары поскольку это будет сигналом нового часа! ( в нашем случае нового часа )





 
YuraZ:

работая в мультивалютке не надо считать время по основной паре или не по основной

надо просто ловить тик начала нового бара по любой паре - и обсчитывать индикаторы по CLOSE а не по закрытию бара

и входит- выходить


потому что вход будет имеено по тику нового бара любой контролируемой пары поскольку это будет сигналом нового часа! ( в нашем случае нового часа )

Скорее всего так.......

 
LeoV:
YuraZ:

работая в мультивалютке не надо считать время по основной паре или не по основной

надо просто ловить тик начала нового бара по любой паре - и обсчитывать индикаторы по CLOSE а не по закрытию бара

и входит- выходить


потому что вход будет имеено по тику нового бара любой контролируемой пары поскольку это будет сигналом нового часа! ( в нашем случае нового часа )

Скорее всего так.......

Переделайте советника по этой логике у ВАС вероятность ПРОБЛЕМЫ снизится в разы

если добавите ловлю нового часа по ВСЕМ парам какие есть в окне ОБЗОР рынка особенно по йеновым то практически у вас сбоев быть не должно


1 ПРОСТО не ловите новый бар синхронно по всем парам !!!

2 ЛОВИТЕ НОВЫЙ БАР по любой из КОНТРОЛИРУЕМЫХ пар, запускайте пересчет всех нужных пар по текущему CLOSE ...

( кстати возможно потребуется переделка некоторых ВАШИХ индикаторов )


и принимайте решение на вход - выход - или на продолжение удержания

 
YuraZ:

Переделайте советника по этой логике у ВАС вероятность ПРОБЛЕМЫ снизится в разы

если добавите ловлю нового часа по ВСЕМ парам какие есть в окне ОБЗОР рынка особенно по йеновым то практически у вас сбоев быть не должно

1 ПРОСТО не ловите новый бар синхронно по всем парам !!!

2 ЛОВИТЕ НОВЫЙ БАР по любой из КОНТРОЛИРУЕМЫХ пар, запускайте пересчет всех нужных пар по текущему CLOSE ...

( кстати возможно потребуется переделка некоторых ВАШИХ индикаторов )

и принимайте решение на вход - выход - или на продолжение удержания

Сэнкью вери мача)))))))))))))

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