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

 
Есть мультивалютный советник. В кратце смысл таков. По одному инструменту происходит весь расчёт, а торговля ведётся по другому инструменту. Советник работает с явным контролем открытия нового бара. Так происходит следующая пренеприятнейшая вещь. На реале советник может не открыть сделку(пропустить), хотя когда проверяешь в тестере - то эта сделка есть. Или советник может открыть сделку на реале на бар позже чем нужно, хотя опять, когда проверяешь в тестере - то сделка стоит там где нужно. С чем это может быть связано?
 
LeoV:
Есть мультивалютный советник. В кратце смысл таков. По одному инструменту происходит весь расчёт, а торговля ведётся по другому инструменту. Советник работает с явным контролем открытия нового бара. Так происходит следующая пренеприятнейшая вещь. На реале советник может не открыть сделку(пропустить), хотя когда проверяешь в тестере - то эта сделка есть. Или советник может открыть сделку на реале на бар позже чем нужно, хотя опять, когда проверяешь в тестере - то сделка стоит там где нужно. С чем это может быть связано?

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

 
kharko:

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

Я понял, что вы имеете ввиду, но советник отрабатывает эту ситуацию. Просто по журналу - нет сигнала вообще. То есть сам советник не сработал(не даёт запрос на открытие позы). Или сработал только на следующем баре. И то это происходит не всегда. А только иногда. И с чем связанно вообще не понятно...... Хотя в тестере - всё отлично и всё правильно открывается и закрывается

 
на каком графике советник, на котором анализирует или на котором торгует? Используется ли функция iBarShift(), с каким флагом, или не используется вообще?
 
LeoV:
Есть мультивалютный советник. В кратце смысл таков. По одному инструменту происходит весь расчёт, а торговля ведётся по другому инструменту. Советник работает с явным контролем открытия нового бара. Так происходит следующая пренеприятнейшая вещь. На реале советник может не открыть сделку(пропустить), хотя когда проверяешь в тестере - то эта сделка есть. Или советник может открыть сделку на реале на бар позже чем нужно, хотя опять, когда проверяешь в тестере - то сделка стоит там где нужно. С чем это может быть связано?

Распринтовку попробуйте

Print(...



до сигнала, после, на открытии, после открытия

принтуйте явные условия

типа



// Print( " ждем MyOPEN == 1 " + MyOPEN );


if ( MyOPEN == 1 )

{

Print( " вошли по MyOPEN == 1 " );


...


}



---

да и еще про открытие новых БАРОВ !!!

учтите что бывают пропущеные бары! А ТЕСТЕР не формирует пропущеные бары

тупо искать бар не стоит, логично искать просто новый БАР

---

сейчас у меня в реальном времени

на графике EURUSD M5 с начала дня сформированно 140 баров а вот на CHF 137 баров, т е 3 бара утеряно :-)

если тупо искать бар соответсвующий евре на чифе то нарвавшись на пропуск бара, можно пролететь

---


кроме того бывают реквоты



если у вас был СИГНАЛ!!! и его нельзя пропускать формуруйте условие на вход в рынок или на выход!

и проверяйте ИСПОЛНЕН ли ваш сигнал!

и пока он не исполнем - пускайте код на исполнение - что бы не попасть в цикл делайте счетчик

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

и если надо опять пускайте



----

кроме того торговый код

не может быть простым!


( имеется чисто код который отвечает за работу механики - открытия закрытия трала безубытка т е работа с ордерами после получения сигналов )

 
LeoV:
Есть мультивалютный советник. В кратце смысл таков. По одному инструменту происходит весь расчёт, а торговля ведётся по другому инструменту. Советник работает с явным контролем открытия нового бара. Так происходит следующая пренеприятнейшая вещь. На реале советник может не открыть сделку(пропустить), хотя когда проверяешь в тестере - то эта сделка есть. Или советник может открыть сделку на реале на бар позже чем нужно, хотя опять, когда проверяешь в тестере - то сделка стоит там где нужно. С чем это может быть связано?

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




static int prevtime = 0; // Время начала бара



...


int start() {


if (Time[0] == prevtime) return(0); // Бар прежний, а следовательно выходим

prevtime = Time[0]; // Свежий бар, запоминаем время


...


int ticket = -1;


...


ticket = OrderSend(...); // Пытаемся открыть позицию

if (ticket < 0) { // Позиция по какой-то причине не был открыта.

Sleep(30000);

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

prevtime = Time[1];

}


}

 

Советник работает на часовых барах. Дело не в реквотах - советник следит за этим и если нужно пошлёт новый запрос. Я писал о том, что даже не происходит срабатывание советника для того, чтобы он хотя бы попытался начать открывать ордер. То есть 2-3 ордера он открывает хорошо(как и должно быть), а на четвёртый(или третий) может вообще либо даже не начать его открывать либо открыть на час позже. Хотя если проверить на тестере этот момент - то там этот ордер будет в нужном месте.

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

 
У Вас в советнике подразумевается, что часовые свечи на разных инструментах открываются синхронно. То есть, при появлении новой часовой счечи на EURUSD запускается советник, который проверяет значения на часовом таймфрейме GBPUSD. Но если в этот момент новая часовка на фунте не началась - все летит в тар-тары. В общем, необходимо немного перестроить логику советника.
 
Rosh:
У Вас в советнике подразумевается, что часовые свечи на разных инструментах открываются синхронно. То есть, при появлении новой часовой счечи на EURUSD запускается советник, который проверяет значения на часовом таймфрейме GBPUSD. Но если в этот момент новая часовка на фунте не началась - все летит в тар-тары. В общем, необходимо немного перестроить логику советника.

Спасибо за ответ, я так и думал, что причина в этом. Пожалуйста, подскажите как? Потому что это большая проблема. Вот скрин, с реала. На нём видно, что в тестере поза открыта в 15.00, а на реале она открылась только в 16.00. Хотя в тестере и на реале параметры одни и теже.

 
LeoV:

Советник работает на часовых барах. Дело не в реквотах - советник следит за этим и если нужно пошлёт новый запрос. Я писал о том, что даже не происходит срабатывание советника для того, чтобы он хотя бы попытался начать открывать ордер. То есть 2-3 ордера он открывает хорошо(как и должно быть), а на четвёртый(или третий) может вообще либо даже не начать его открывать либо открыть на час позже. Хотя если проверить на тестере этот момент - то там этот ордер будет в нужном месте.

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

считать что новый тик ЛЮБОГО часового бара ( на любом инстументе ) и есть начало часа

---

поправьте логику в этом ключе...

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

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

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


---

допустим вы обсчитываете 2 или 3 инструмента

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



 
// ---  практически гарантия ловли начала часа двумя БОДРЫМИ парами
   if ( TimeSaveBehchH1 == iTime("GBJJPY",PERIOD_H1,0) )
   {
       TimeSaveBehchH1 = iTime("GBJJPY",PERIOD_H1,0); // новый бар  
   }
   if ( TimeSaveBehchH1 == iTime("USDJPY",PERIOD_H1,0) )
   {
       TimeSaveBehchH1 = iTime("USDJPY",PERIOD_H1,0); // новый бар  
   }
//---
   if ( TimeSaveBehchH1 == iTime("EURUSD",PERIOD_H1,0) ) // в довершении ловим на своей рабоче паре
   {
       TimeSaveBehchH1 = iTime("EURUSD",PERIOD_H1,0); // новый бар  
   }
   if ( TimeSaveBehchH1 == iTime("USDCHF",PERIOD_H1,0) ) // ловим на второй паре 
   {
       TimeSaveBehchH1 = iTime("USDCHF",PERIOD_H1,0); // новый бар 
   }


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

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

 
LeoV:
Rosh:
У Вас в советнике подразумевается, что часовые свечи на разных инструментах открываются синхронно. То есть, при появлении новой часовой счечи на EURUSD запускается советник, который проверяет значения на часовом таймфрейме GBPUSD. Но если в этот момент новая часовка на фунте не началась - все летит в тар-тары. В общем, необходимо немного перестроить логику советника.

Спасибо за ответ, я так и думал, что причина в этом. Пожалуйста, подскажите как? Потому что это большая проблема. Вот скрин, с реала. На нём видно, что в тестере поза открыта в 15.00, а на реале она открылась только в 16.00. Хотя в тестере и на реале параметры одни и теже.

...

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

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