Функция обработки ошибок. Нужна помощь! - страница 2

 

Алексей, вы слишком замарачиваетесь по поводу ошибок. "Рынок закрыт" - это значит тиков нет. Нет тиков, нет функции OnTick() - сов не работает просто. Неправильные стопы, новые цены и т.д. это все неверные параметры отправки ордера (либо логические, где вы чего-то не учли, либо параметры недопустимы, типа как открывать BUY по цене BID). Выявляются всего раз. Если вы напишите шаблон для функции OpenOrder(...) работоспособный, больше проблем не будет никогда. 

Все прогеры делают по разному. Кто делает кол-во попыток на открытие ордера, кто-то всего разово запускает эту функцию, т.к. тики происходят часто и на каждом тике будет проверяться условия и если на предыдущем тике у вас ордер не открылся из-за например проскальзывания (малое значение), то на этом может запросто открыться, даже ошибки не будет. Для некоторых случае необходимо чтобы ордер открылся во что бы то не стало. Можно сделать по-тупому, через функцию while(условие) которая будет бесконечно пулять ордер, пока тот не откроется.. Можно сделать умно. Либо заранее разместить отложку, либо учесть "не открытие" в коде и соотв. действия из-за этого.

А то что вы с этой обработкой ошибок танцуете, это не оч. хороший путь. Лет 5 или 6 назад я, будучи новичком в mql4 спорил с очень хороший прогером на одном форуме о целесообразности функции обработки ошибок, и он мне доказывал о ее значимости и важности. Но на деле оказалось, что это лишние миллисекунды, отнятые на каждом тике у процессора

Единственно что хочу добавить, что торговые функции должны быть грамотные, без спама на торговый сервер. Тестер вам поможет проверить ваши функции. Проверьте на тестере в рабочий день. Затем проверьте на тестере в выходные. Потом погоняйте на демке. Попробуйте пипсовку. Трейлинг-стоп. Работу с отложками. Разные типы счетов с инстант и маркет исполнением. И все станет понятным. Просто так "начитавшись книжек"  (я утрирую)  у вас мало что получится. Практика подскажет. Удачи. Если что, обращайтесь с конкретными вопросами, помогу)

 
Sergey Odnoromanenko:

Алексей, вы слишком замарачиваетесь по поводу ошибок. "Рынок закрыт" - это значит тиков нет. Нет тиков, нет функции OnTick() - сов не работает просто. Неправильные стопы, новые цены и т.д. это все неверные параметры отправки ордера (либо логические, где вы чего-то не учли, либо параметры недопустимы, типа как открывать BUY по цене BID). Выявляются всего раз. Если вы напишите шаблон для функции OpenOrder(...) работоспособный, больше проблем не будет никогда. 

Все прогеры делают по разному. Кто делает кол-во попыток на открытие ордера, кто-то всего разово запускает эту функцию, т.к. тики происходят часто и на каждом тике будет проверяться условия и если на предыдущем тике у вас ордер не открылся из-за например проскальзывания (малое значение), то на этом может запросто открыться, даже ошибки не будет. Для некоторых случае необходимо чтобы ордер открылся во что бы то не стало. Можно сделать по-тупому, через функцию while(условие) которая будет бесконечно пулять ордер, пока тот не откроется.. Можно сделать умно. Либо заранее разместить отложку, либо учесть "не открытие" в коде и соотв. действия из-за этого.

А то что вы с этой обработкой ошибок танцуете, это не оч. хороший путь. Лет 5 или 6 назад я, будучи новичком в mql4 спорил с очень хороший прогером на одном форуме о целесообразности функции обработки ошибок, и он мне доказывал о ее значимости и важности. Но на деле оказалось, что это лишние миллисекунды, отнятые на каждом тике у процессора

Единственно что хочу добавить, что торговые функции должны быть грамотные, без спама на торговый сервер. Тестер вам поможет проверить ваши функции. Проверьте на тестере в рабочий день. Затем проверьте на тестере в выходные. Потом погоняйте на демке. Попробуйте пипсовку. Трейлинг-стоп. Работу с отложками. Разные типы счетов с инстант и маркет исполнением. И все станет понятным. Просто так "начитавшись книжек"  (я утрирую)  у вас мало что получится. Практика подскажет. Удачи. Если что, обращайтесь с конкретными вопросами, помогу)

Спасибо большое! Просто учусь и хочется разобраться. Я человек очень вдумчивый и дотошный, хочу понимать что и как. Именно понимать, а не просто делать.
 
Alexey Zykov:
Спасибо большое! Просто учусь и хочется разобраться. Я человек очень вдумчивый и дотошный, хочу понимать что и как. Именно понимать, а не просто делать.

Не берите к рассмотрению вопрос об отказе проверок на ошибки - потом боком выйдет. И не забывайте, что хороший советник не будет пытаться отправить ордер при закрытом рынке. А то, что вам тут говорят об отсутствии тиков при закрытом рынке, учтите, что ордер можно попытаться отправить и без тика (OnTimer(), OnChartEvent()), а если в конечном итоге придёте к продаже коммерческих продуктов, то за такие поделки, которые бомбят сервер когда нужно, и когда не нужно, вам руки обломают покупатели ;)

Думайте, не ленитесь, решайте, понимайте и учитывайте в коде по-возможности больше - это моё мнение, а мнение "да пофиг" мне не нравится ... Например, неверный стоп может возникнуть и при правильных параметрах, но при быстром и сильном изменении уровня StopLevel - ваша функция при получении ошибки 130, обязана скорректировать стоп-приказы под новые условия и повторить отправку ордера, а не плевать на ошибку и продолжать долбить сервер пока StopLevel не вернётся в нормальные значения - это глупость и "подход школьника" к программированию, которая в лучшем случае загадит вам журнал и, соответственно, место на диске, а в более неприятной ситуации приведёт к запрету автоторговли на сервере. При этом советник продолжит попытки открыть позиции. Смешно же...

 
Sergey Odnoromanenko:
...

Вы с таким подходом пишете на заказ?

facepalm

 

Sergey Odnoromanenko:

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

Поддерживаю Артёма (artmedia70). Лично сталкивался с тем, как брокеры адресно отключают автоторговлю клиентам на счетах, где роботы с такой логикой применяются :)

Если уж и спамить сервер (но я не говорю, что это вообще правильно!), то хотя бы с нарастающей паузой между попытками...

 
Sergey Eremin:

Поддерживаю Артёма (artmedia70). Лично сталкивался с тем, как брокеры адресно отключают автоторговлю клиентам на счетах, где роботы с такой логикой применяются :)

Если уж и спамить сервер (но я не говорю, что это вообще правильно!), то хотя бы с нарастающей паузой между попытками...

Так зачем отсылать на сервер ордер, если не соответствует запрограммированным условиям? Конечно, в журнал строчит, но в конце дня стираю. Особенно в тестере, в котором не работает Sleep(), по 6 попыток в минуту проходит, но в Реале незачем наращивать паузы, необходимо поймать момент, когда, наконец, выполнятся все условия и отправится ордер на сервер, после чего да, бывают реквоты, но не так часто.

Полный контроль ошибок внутри терминала необходим, чтобы лишний раз не беспокоить сервер!

 
Boris:

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

Вы внимательно посмотрите на чьей я стороне (Артёма) :)

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

А так с Вами я согласен, но почти то же самое выше сказал Артём, с чем я как раз и согласился в цитируемом Вами сообщении. Так что не пытайтесь со мной спорить, я изначально на Вашей стороне :)

 
Artyom Trishkin:

Примерная структура функции OpenOrder(тут передаваемые в функцию параметры)

int err=ERR_NO_ERROR, ticket=EMPTY;

Цикл по количеству попыток открытия ордера при неудачной попытке

Сбрасываем переменные --> ResetLastError(); err=GetLastError(); Отсылаем запрос --> ticket=OrderSend()

Если ticket больше ноля -->останавливаем цикл --> break; Иначе проверяем код ошибки в err

Если в err содержится непреодолимая ошибка --> return(EMPTY); Иначе обрабатываем ошибку

Обработка ошибки индивидуальная для каждого типа.

В конце функции за пределами тела цикла возвращаем значение переменной тикета --> return(ticket);


Вызываем функцию примерно так:

TicketOpenPos=OpenOrder(тут необходимые параметры);

if(TicketOpenPos<0)

   {
    // функция OpenOrder() нарвалась на непреодолимую ошибку или не смогла открыть позицию за заданное количество попыток
    // (можно дополнительно возвращать значение err из OpenOrder и здесь его проверить   и обработать)
   }

Артем, спасибо! Если Вам не трудно, напишите пожалуйста в виде кода, мне так понятнее будет. А я уже подгоню под свою задачу. У меня пока так написано, а дальше не пойму че делать

int OpenOrder (int Error=0, double price=0, color clr=clrBlack)        // Вызов функции OpenOrder
{
 int typeOrder=-1;
 switch(Signal())                                                      // Принимаем сигнал из другой функции
  {
  case 1: typeOrder=OP_SELL;price=Bid;clr=clrRed;break;                // Выбираем тип ордера
  case 2: typeOrder=OP_BUY;price=Ask;clr=clrGreen;break; 
  }
  RefreshRates();                                                      // Обновляем котировки                                              
  int Order=OrderSend(_Symbol,typeOrder,Lot,NormalizeDouble(price,_Digits),30,0,0,comment,Magic,0,clr);    // Отправляем ордер
  return(Order);  
}
 // Ну а дальше функция обработки ошибок
  if (Order<0)                                                         // Проверка наличия ошибок 
  Error=GetLastError();                                                // Получаем номер ошибки 
 switch(Error)
 {
 case 4:   Print("Ошибка № 4");   Sleep(200); RefreshRates();return (true);
 case 130:   Print("Ошибка № 130");   return (false); 
 }

А дальше как, да и вообще можно ли так?

 
Alexey Zykov:

Артем, спасибо! Если Вам не трудно, напишите пожалуйста в виде кода, мне так понятнее будет. А я уже подгоню под свою задачу. У меня пока так написано, а дальше не пойму че делать

А дальше как, да и вообще можно ли так?

Коды в сообщения форума нужно вставлять так: Правильно вставляем код на форуме. Ваш пост Выше исправлен.
 
Sergey Eremin:

Вы внимательно посмотрите на чьей я стороне (Артёма) :)

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

А так с Вами я согласен, но почти то же самое выше сказал Артём, с чем я как раз и согласился в цитируемом Вами сообщении. Так что не пытайтесь со мной спорить, я изначально на Вашей стороне :)

Я поспорил с Вами только в части замедления попыток отправки ордера, что может привести в запоздалому входу в рынок! Извините, если что не так понято!
Причина обращения: