Полезные советы для Участников ЧемпионатаВ правилах Чемпионата объявлены 4 важных ограничения:
Эти ограничения обеспечиваются настройками торгового сервера, на
котором проводится чемпионат. Торговый сервер не будет пропускать
торговые операции, нарушающие ограничения Чемпионата. При этом вся
информация о таких нарушениях будет сохраняться в логах сервера.
Эксперт, регулярно допускающий нарушения вышеперечисленных ограничений,
может быть дисквалифицирован и снят с участия в чемпионате. Все эти ограничения связаны с функцией OrderSend. Нужно программно отслеживать ограничения и не допускать ошибочного вызова этой функции. При неправильном значении объема (количество лотов меньше минимально допустимого значения, либо больше максимального значения, либо ошибка грануляции) функция вернет ошибку. GetLastError() вернет код 131(ERR_INVALID_TRADE_VOLUME). В большинстве случаев используется некая функция для расчета объема сделки с учетом стратегии управления средствами (money management). Обычно в расчетах учитываются: баланс, эквити, свободные средства, кредитное плечо(leverage) и процент риска. Эта функция может выглядеть так: //--- extern variables extern double ExtMaximumRisk=0.05; // 5% by default //--- calculate current volume double CalculateVolume() { double lot_min =MarketInfo(Symbol(),MODE_MINLOT); double lot_max =MarketInfo(Symbol(),MODE_MAXLOT); double lot_step=MarketInfo(Symbol(),MODE_LOTSTEP); double contract=MarketInfo(Symbol(),MODE_LOTSIZE); double vol; //--- check data if(lot_min<0 || lot_max<=0.0 || lot_step<=0.0) { Print("CalculateVolume: invalid MarketInfo() results [",lot_min,",",lot_max,",",lot_step,"]"); return(0); } if(AccountLeverage()<=0) { Print("CalculateVolume: invalid AccountLeverage() [",AccountLeverage(),"]"); return(0); } //--- basic formula vol=NormalizeDouble(AccountFreeMargin()*ExtMaximumRisk*AccountLeverage()/contract,2); //--- additional calculation // ... //--- check min, max and step vol=NormalizeDouble(vol/lot_step,0)*lot_step; if(vol<lot_min) vol=lot_min; if(vol>lot_max) vol=lot_max; //--- return(vol); } Не рекомендуется сохранять важные рыночные характеристики в функции init(), а лучше запрашивать рыночные условия по месту использования и обязательно их проверять на пустые/нулевые значения. Иначе, при попытке запуска скрипта на неактивных аккаунтах можно столкнуться с неправильными значениями. Например, в данной функции можно получить фатальный "Zero divide" как при lot_step=0, так и при AccountLeverage()=0. Теперь обсудим общее количество открытых позиций и отложенных ордеров. Это количество возвращается функцией OrdersTotal(). В случае срабатывания ограничения суммарного количества открытых позиций и отложенных ордеров функция OrderSend() закончится неудачей, и значение, возвращаемое функцией GetLastError(), будет равно 148 (ERR_TRADE_TOO_MANY_ORDERS). Чтобы избежать этой ошибки, достаточно проверять количество открытых позиций перед любой операцией SendOrder(): //--- extern variables int ExtMaxOrders=3; ... //--- check before SendOrder if(OrdersTotal() >= ExtMaxOrders) return(...); //--- send order int ticket=OrderSend(...); ... Очень серьезную опасность как для самого трейдера, так и для торгового сервера составляют "скрипты-убийцы", которые без осознанного контроля посылают множество торговых транзакций на сервер. Особенно часто это бывает в виде зацикленных попыток раз за разом протолкнуть свою некорректную заявку на сервер. Рассмотрим несколько случаев:
В разделе документации "Справочник MQL4 - Торговые функции - Ошибки исполнения" приведены рекомендации по обработке торговых ошибок. Создана: 10.08.2006 Автор: MetaQuotes
Страницы:
2
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Вопрос организаторам :
У меня торговая система построена из 3-х частей : 1. сам советник (основные рассчёты, выставление, закрытие и ведение ордеров) 2. индикатор (свой), который ведает частью рассчётов и передаёт результаты эксперту 3. скрипт, который выводит необходимую информацию для трейдера для принятия решения Так вот я понял из условий что мне придётся объединять все функции в эксперте. Если не будет скрипта то эксперт будет только чёрным ящиком для людей, а вот если не будет индикатора тут уже по сложнее, придётся отказаться от ряда нужных рассчётов или нагрузить этими рассчётами эксперта.. Так вот вопрос в следующем : Если Вы организовали этот замечательный конкурс, не считаете ли Вы, что на нём должны присутствовать торговые системы, а не только эксперты. Поэтому у меня будет просьба к организаторам, чтобы мне не переписывать и не утежелять советник рассчётами дать возможность работать и индикатору и скрипту, ведь только в целом это торговая система. С уважением Роман Пожалуйста, хотя бы комментарии в коде пишите по-русски. :-)
На самом деле страшно - 3 ошибки:
17.08.2006 16:46
Что-то мне уже страшно =) , такой код будет работать корректно? Itso писал(а): Да, верно. Спасибо за поправку!Ошибка: Код не будеть работать. Вскорее сего имелось в виду: 14.08.2006 15:34
Ошибка: for(int i=0; i < OrdersTotal()-1; i--)
for(int i=OrdersTotal()-1; i >=0 ; i--)
|
|





проясните пожалуйста пока не поздно (ещё не 25 сентября :)) эту фразу :
-ШАГ ИЗМЕНЕНИЯ КОЛИЧЕСТВО ЛОТОВ 0,1 ???????
Это что я не смогу 3 ордера иметь ? в 1 лот 0,5 лота и 2 лота если рынок удачно поворачивается ? :)) а должен буду с шагом 0,1 лот ползти к 5 лотам ???? Подробнее можно пожалуйста.
С уважением
Роман