Полезные советы для Участников ЧемпионатаВ правилах Чемпионата объявлены 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
Страницы:
1
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
vol=NormalizeDouble(AccountFreeMargin()*ExtMaximumRisk/AccountLeverage()/10.0,2);
Ето, не надо будь так?: vol=NormalizeDouble(AccountFreeMargin()*ExtMaximumRisk/AccountLeverage()/10.0/Ask, 2); Renat писал(а): chern писал(а): Так как эксперты будут работать на нашем оборудовании, то мы
не разрешаем использовать DLL ради безопасности.Вопрос - почему нельзя использовать DLL? В своей работе Вы можете использовать любые DLL, но только не в Чемпионате. С моей точки зрения можно было бы разрешить предоставлять один DLL индикатор поставляемый в виде Си текста 08.09.2006 10:02
chern писал(а): Так как эксперты будут работать на нашем оборудовании, то мы
не разрешаем использовать DLL ради безопасности.Вопрос - почему нельзя использовать DLL? В своей работе Вы можете использовать любые DLL, но только не в Чемпионате. 08.09.2006 09:55
Вопрос - почему нельзя использовать DLL? 08.09.2006 08:59
Michel_S писал(а): А при каких значениях Volume случается ошибка недостачи денег?
Наверняка, когда денег на самом деле нет, но объем выравнивается
на нижнюю границу в 0.10 . Из-за редких возвратов ERR_NOT_ENOUGH_MONEY (#134)
никаких дисквалификаций не будет. Почему, несмотря на применение контроля над свободными средствами,
которые вы рекомендовали [vol=NormalizeDouble(AccountFreeMargin()*ExtMaximumRisk/AccountLeverage()/10.0,2);], всё-таки проскакивает ошибка
134. Я для подстраховки вставил уменьшение допустимого размера
лота еще на 0,1 и всё равно проскакивает код ошибки 134 (хотя очень
редко). Не будет ли из-за разовых случаев проскакивания кода
134 дисквалифицирован участник Чемпионата? Дисквалификация возможна, если выяснится полная неспособность эксперта правильно управлять своими объемами. 01.09.2006 22:54
Почему, несмотря на применение контроля над свободными средствами,
которые вы рекомендовали [vol=NormalizeDouble(AccountFreeMargin()*ExtMaximumRisk/AccountLeverage()/10.0,2);], всё-таки проскакивает ошибка
134. Я для подстраховки вставил уменьшение допустимого размера
лота еще на 0,1 и всё равно проскакивает код ошибки 134 (хотя очень
редко). Не будет ли из-за разовых случаев проскакивания кода
134 дисквалифицирован участник Чемпионата? ANG3110 писал(а): В данном конкретном случае эти 3 параметра можно использовать
жестко заданными. Но сильно не рекомендую делать такое в экспертах.
На скорость работы эксперта это практически не повлияет.У меня вопрос к организаторам по поводу формулы расчета количества
лотов. Если чтобы не понижать скорость работы эксперта, а прописать сразу
или в глобальных переменных 30.08.2006 20:40
roman писал(а): Торговой системой является как раз эксперт, но не скрипт. Запуск
скрипта - это ручная операция, а не автоматическая.Так вот вопрос в следующем : Если Вы организовали этот замечательный конкурс, не считаете ли Вы, что на нём должны присутствовать торговые системы, а не только эксперты. Поэтому у меня будет просьба к организаторам, чтобы мне не переписывать и не утежелять советник рассчётами дать возможность работать и индикатору и скрипту, ведь только в целом это торговая система. Это что я не смогу 3 ордера иметь ? в 1 лот 0,5 лота и 2 лота если рынок удачно поворачивается ? :)) а должен буду с шагом 0,1 лот ползти к 5 лотам ???? Подробнее можно пожалуйста. Объем сделки может быть любым в промежутке от 0.1 до 5.0 с шагом 0.1 лота. Извините за поздний ответ, не заметил вопросов вовремя. 30.08.2006 20:32
У меня вопрос к организаторам по поводу формулы расчета количества
лотов. Если чтобы не понижать скорость работы эксперта, а прописать сразу
или в глобальных переменных |
|





vol=NormalizeDouble(AccountFreeMargin()*ExtMaximumRisk/AccountLeverage()/10.0,2);
Ето, не надо будь так?:
vol=NormalizeDouble(AccountFreeMargin()*ExtMaximumRisk/AccountLeverage()/10.0/Ask, 2);
Если нужно расчитывать абсолютно точные объемы с точным учетом маржевых требований, то эта функция серьезно распухнет из-за необходимости перерасчета любых кросс-курсов в базовую валюту.