Automated Trading Championship 2011: Подготовка эксперта к Чемпионату - страница 3

 

Interesting

Спасибо за информацию. В своем советнике уже предусмотрел обработчик торговых ошибок.

Есть еще вопрос. Помогите, пожалуйста.
На стадии инициализации пытаюсь выбрать рабочие инструменты:

input string inWorkSymbols  = "USDCHF; GBPUSD; EURUSD; USDJPY; USDCAD; AUDUSD; EURGBP; EURAUD; EURCHF; EURJPY; GBPJPY; GBPCHF"; // Рабочие инструменты
string Symbols[]; // Основной массив, с которым далее будет работать советник.


int OnInit() {
  if (!SetSymbols(Symbols, inWorkSymbols)) {
    Alert("Неверное значение входного параметра \"Рабочие инструменты\"."); return 1; }
}

bool SetSymbols(string &Destination[], string Source) {
  int SymbolCount_1 = 0;
  for (int i = 0; i < SymbolsTotal(false); i++)
    if (StringFind(Source, SymbolName(i, false)) != -1) SymbolCount_1++;

  if (!SymbolCount_1 || (ArrayResize(Destination, SymbolCount_1) != SymbolCount_1)) return false;

  int SymbolCount_2 = 0;
  for (int i = 0; i < SymbolsTotal(false); i++)
    if (StringFind(Source, SymbolName(i, false)) != -1)
      Destination[SymbolCount_2++] = SymbolName(i, false);

  return SymbolCount_1 == SymbolCount_2;
}

Вот ломаю голову как параноик: насколько вероятен случай ошибки функции ArrayResize?

Закливать ли инициализацию в попытках изменить размер массива?

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

 

 

 

voix_kas:

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

Может, для этого и придуман режим "Произвольная задержка" (на котором по сути и нужно отлаживать советники).
 
papaklass:

Попробуйте инициализацию проводить явным образом. Например так:

Теперь работайте с sy[number] - где number - порядковый номер инструмента. 

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

Идея может и правильная, а вот реализация не очень на мой взгляд (паранойя вещица опасная и обычно до добра не доводит).

voix_kas:

Interesting

Вот ломаю голову как параноик: насколько вероятен случай ошибки функции ArrayResize?

Закливать ли инициализацию в попытках изменить размер массива?

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

Отпишите в личку, а то тут не очень целесообразно обсуждать частные вопросы.

 

Кто-нить подскажите как правильно написать код посылки трёх ордеров по 5 лотов каждый. Я в прошлом чемпионате использовал так 

 for(int i=0;i<3;i++)

{

Trade.PositionOpen(symbol,OrderType,5,price,SL,TP); 

 

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

 
gpwr:

Кто-нить подскажите как правильно написать код посылки трёх ордеров по 5 лотов каждый. Я в прошлом чемпионате использовал так 

 for(int i=0;i<3;i++)

{

Trade.PositionOpen(symbol,OrderType,5,price,SL,TP); 

 

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

А каковы были причины игнорорирования?
 
Yedelkin:
А каковы были причины игнорорирования?
Причины не знаю так как мой советник не проверял ошибок исполнения ордеров. Я тот же советник параллельно гнал на другом счету. Оба советника должны быть открыть позицию в 5 лотов двумя ордерами по 2.5 лота каждый. Мой параллельный советник так и сделал, а чемпинатовский открыл позицию в 2.5 лота, т.е. сработал только один из ордеров. Единственное что я вижу в журнале так это сообщение о Requote, которое пришло 2 часа после посылки этих двух ордеров. Может нужно было обновить price  перед посылкой каждого ордера? Может по каким-то причинам нельзя посылать один ордер сразу за другим? Неплохо бы елси разработчики обьяснили как избежать подобных ситуаций.
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
 
gpwr:
Причины не знаю так как мой советник не проверял ошибок исполнения ордеров. Я тот же советник параллельно гнал на другом счету. Оба советника должны быть открыть позицию в 5 лотов двумя ордерами по 2.5 лота каждый. Мой параллельный советник так и сделал, а чемпинатовский открыл позицию в 2.5 лота, т.е. сработал только один из ордеров. Единственное что я вижу в журнале так это сообщение о Requote, которое пришло 2 часа после посылки этих двух ордеров. Может нужно было обновить price  перед посылкой каждого ордера? Может по каким-то причинам нельзя посылать один ордер сразу за другим? Неплохо бы елси разработчики обьяснили как избежать подобных ситуаций.

Все очень просто - нужно проверять код и обрабатывать реквоту.

Не будет корректной обработки будут проблемы (возможно и дисквалификация).

 
Interesting:

Все очень просто - нужно проверять код и обрабатывать реквоту.

Не будет корректной обработки будут проблемы (возможно и дисквалификация).

 

 

Что-такое "обрабатывать реквоты"? Как это делать или где про это можно почитать? Кто-нить может показать на примере? 

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

 
gpwr:

 

Что-такое "обрабатывать реквоты"? Как это делать или где про это можно почитать? Кто-нить может показать на примере? 

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

for(int i=0;i<3;i++)
{
Trade.PositionOpen(symbol,OrderType,5,price,SL,TP); 
} 

Не знаю насколько это корректный пример, но в нем нет проверки на корректность до отправки торгового запроса, а тем более нет проверки ответа от сервера.

Если даже предположить что внутри PositionOpen есть проверка осуществляемая перед отправкой запроса, то как минимум следует поинтересоваться а чем все дело кончилось.

PS

Думаю не лишним будет ознакомиться вот с этой статьей - Класс торговых операций для ATC 2011

Класс торговых операций для ATC 2011 - Automated Trading Championship 2011
  • championship.mql5.com
В этой публикации рассматриваются ограничения, накладываемые на торговые операции Правилами Чемпионата по автоматической торговле - Automated Trading Championship 2011. Также в ней описана реализация готового класса проверки торговых операций. При включении в эксперта, класс перехватывает его торговые запросы и проверяет их на соответствие торговым условиям Чемпионата.
 

Вопрос такого плана

Как я понял разница между временем сервера и временем по GMT равна +1 и существует переход лето/зима. По какому типу осуществятся переход (Европа-Россия / США-Канада / Другие варианты)?

Заодно хочется узнать как это дело будет обстоять на том железе где будут расположены эксперты.