Достаточные условия работы мультивалютного эксперта

 
Просвятите, уважаемые форумяне.
Вопрос следующий - каковы достаточные условия для работы мультивалютного советника?
Что я хочу узнать: имеется советник (на конкурсе его клон) - он мультивалютный. Сделки открывает, выбирая пару, которая на это время наиболее перепродана или перекуплена (в денежном эквиваленте) относительно других пар. Поэтому пытаюсь его прооптимизировать на как можно большее число пар. Но вот возникает вопрос - открыв 20 графиков - терминал начинает заметно притормаживать (просто терминалов несколько, и каждый жрёт не совсем мало ресурсов). До сих пор, для каждой пары, которую учитывает эксперт, открывал соответствующий график. А нужно ли? Или достаточно открыть один график и повесить на него эксперта, а остальные графики можно закрыть, главное чтобы пары были в market watch? Или открыть график сначала (для подгрузки истории), а потом можно закрыть?

К тому же извечная (сколько помню) проблема - если удалить вроде бы лишние пары, и, например, оставить только одну EURGBP, и депозит в USD, то MarketInfo относительно TICK_VALUE и MARGINREQUIRED выдаёт неадекватные значения (я видел такие: 1.Inf, -9999346434 (цыфры приблизительные)). Добавление EURUSD спасает от 1.Inf, добавление GBPUSD испровляет и вторую ошибку (может и наоборот - не важно). Следовательно, кроме торгуемых экспертом пар должны быть в market watch ещё и основные пары, чтобы можно было правильно считать.

Но, у одного ДЦ видел пару EURTRY, депозит в USD, но пары USDTRY у них нет - поэтому мой советник на такой паре в таком ДЦ не сможет работать по определению.

А теперь пример: Хочу торговать только EURGBP, EURAUD, EURCHF, EURJPY, повесив советник на EURGBP. Какой минимальный набор пар должен быть в market watch, если счёт в USD? Нужно ли мне открыть другие графики, кроме EURGBP, если для всех пар используется PERIOD_H4?

P. S. На первый вопрос ответ очевиден, но может я ошибаюсь, потому и спрашиваю :) На второй вопрос хотелось бы получить ответ, хотя к вечеру понедельника частично буду его знать, но хотелось бы подтвержднения/опровержения от других форумян.  Спасибо
 
Значит никому не интересно. Но на всякий случай, может когда кому пригодится.

На первый вопрос: в market watch должны быть EURGBP, EURAUD, EURCHF, EURJPY, GBPUSD, AUDUSD, USDCHF, USDJPY, EURUSD

На второй вопрос точного ответа не знаю, но за текущие сутки видно, что графики открывать не обязательно - всё и так прекрасно работает, возможно из-за того, что терминалы работают практически круглосуточно, а перед этим графики всё-же открывались, и необходимая история была подкачана
 
notused >>:
Значит никому не интересно. Но на всякий случай, может когда кому пригодится.

На первый вопрос: в market watch должны быть EURGBP, EURAUD, EURCHF, EURJPY, GBPUSD, AUDUSD, USDCHF, USDJPY, EURUSD

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

Столкнулись с такой же проблемой при работе мультивалютного советника:

если открыты все необходимые графики, то расчет идет правильно;

если оставить один график с прикрепленным советником, а остальные закрыть, то через некоторое время в расчете

начинаются глюки: одна и та же функция в двух разных местах советника дает противоположные значения и по знаку и по

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

Как вариант кода - советник 600573 ( но с другой торговой стратегией ). Если имеется опыт в мультивалютниках - предложите

какое - либо решение работы при одном открытом графике.

 
VNIK писал(а) >>

Столкнулись с такой же проблемой при работе мультивалютного советника:

если открыты все необходимые графики, то расчет идет правильно;

если оставить один график с прикрепленным советником, а остальные закрыть, то через некоторое время в расчете

начинаются глюки: одна и та же функция в двух разных местах советника дает противоположные значения и по знаку и по

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

Как вариант кода - советник 600573 ( но с другой торговой стратегией ). Если имеется опыт в мультивалютниках - предложите

какое - либо решение работы при одном открытом графике.

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

2. На каждом тике обращаться к данному символу-периоду (например, при помощи функции iClose), независимо от того, используете ли Вы эти данные. Это необходимо для того, чтобы как можно дольше оставить исторические данные в памяти клиентского терминала. Естественно, при этом контролировать ошибку 4066, так как возможна ситуация долгого отсутствия тиков (например после выходных).

 
stringo писал(а) >>

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

2. На каждом тике обращаться к данному символу-периоду (например, при помощи функции iClose), независимо от того, используете ли Вы эти данные. Это необходимо для того, чтобы как можно дольше оставить исторические данные в памяти клиентского терминала. Естественно, при этом контролировать ошибку 4066, так как возможна ситуация долгого отсутствия тиков (например после выходных).

Ошибку 4066 смог получить только от функции iBarShift. В каких случаях функция iClose может вернуть эту ошибку?

Вот пример, скрипт обновляющий данные по 12 парам:

string symbols[12]={"AUDUSD","EURAUD","EURCHF","EURGBP","EURJPY","EURUSD","GBPCHF","GBPJPY","GBPUSD","USDCAD","USDCHF","USDJPY"};
int start()
{
for (int i=0;i<12;i++)
{
  int tick=GetTickCount();
  int bar=iBarShift(symbols[i],0,Time[0],true);//функция вернёт -1 если такого бара нет в истории
  if (bar==-1)
  {
   if (GetLastError()==4066)
   {
    Print("Loading ",symbols[i],"...");
    while(bar==-1)
    {
     bar=iBarShift(symbols[i],0,Time[0],true);
     Sleep(100);
    }
   }
   Print("Loading ",symbols[i]," = ",GetTickCount()-tick," ms");
  }
  Print("Open ",symbols[i]," = ",iOpen(symbols[i],0,bar)," Time = ",TimeToStr(iTime(symbols[i],0,bar)));
} 
return(0);
}
 

Ошибка 4066 может возникнуть при любом обращении к чужим данным - ArrayCopySeries, ArrayCopyRates, iClose, ...

https://docs.mql4.com/ru/series

 

Вопрос снят. Просто нужно в любом случае контролировать значение last_error.

string symbols[6]={"AUDUSD","EURUSD","GBPUSD","USDCAD","USDCHF","USDJPY"};
int start()
{
for (int i=0;i<6;i++)
{
  for (int n=0;n<5;n++)
  {
   double open=iOpen(symbols[i],0,0);
   int error=GetLastError();
   Print(symbols[i]," Open ",open," Time ",TimeToStr(iTime(symbols[i],0,0))," Error #",error);
   if (error==0) break;
   Print("Sleep...");
   Sleep(10000);
  }
} 
return(0);
}

Лог скрипта:

16:43:24 test2 EURUSD,M15: AUDUSD Open 0.676 Time 2008.10.16 14:30 Error #4066
16:43:24 test2 EURUSD,M15: Sleep...
16:43:24 test2 EURUSD,M15: AUDUSD Open 0.676 Time 2008.10.16 14:30 Error #0
16:43:24 test2 EURUSD,M15: EURUSD Open 1.35 Time 2008.10.16 14:30 Error #0
16:43:24 test2 EURUSD,M15: GBPUSD Open 1.7234 Time 2008.10.16 14:00 Error #4066
16:43:24 test2 EURUSD,M15: Sleep...
16:43:34 test2 EURUSD,M15: GBPUSD Open 1.7254 Time 2008.10.16 14:30 Error #0
16:43:34 test2 EURUSD,M15: USDCAD Open 1.1836 Time 2008.10.16 13:00 Error #4066
16:43:34 test2 EURUSD,M15: Sleep...
16:43:44 test2 EURUSD,M15: USDCAD Open 1.1878 Time 2008.10.16 14:30 Error #0
16:43:44 test2 EURUSD,M15: USDCHF Open 1.1316 Time 2008.10.16 14:30 Error #4066
16:43:44 test2 EURUSD,M15: Sleep...
16:44:04 test2 EURUSD,M15: USDCHF Open 1.1316 Time 2008.10.16 14:30 Error #0
16:44:04 test2 EURUSD,M15: USDJPY Open 100.59 Time 2008.10.16 13:45 Error #4066
16:44:04 test2 EURUSD,M15: Sleep...
16:44:04 test2 EURUSD,M15: USDJPY Open 100.57 Time 2008.10.16 14:30 Error #0

 

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

 

Сначала пару примеров работы обычных (не мультивалютных) советников, работающих только по одной валютной паре:

1) Я уже писал на форуме, что от количества отображаемых баров в окне графика напрямую зависит скорость работы эксперта. У меня эксперт по появлению нового бара выполнял достаточно увесистые расчеты беря для обработки показания различных индикаторов. Тогда экспериментальным путем установил, что для правильной и максимально быстрой работы того моего советника достаточно отображения 500 баров в окне графика.

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

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

Попробовал увеличить количество отображаемых баров в окне графика (от первого эксперта у меня остались настройки в отображение 500 баров). Увеличил количество баров в окне графика до 5000 и что удивительно значения переменных стали совпадать. Эксперт начал вести себя одинаково как в тестере, так и на реале.

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

 

Сейчас появилось желание написать эксперта, который будет работать по мультивалютному принципу. Для работы ему будет нужно получать котировки по разным валютным парам.

 

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

--------------------------------

P.S. Прошу прощения, если этот вопрос уже где-то обсуждался, а я его снова повторяю. Искал на него ответ, но почему-то остаются сомнения...

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