Полезные советы для Участников Чемпионата


В правилах Чемпионата объявлены 4 важных ограничения:
  • минимальный объем сделки - 0.1 лота
  • шаг изменения количества лотов - 0.1
  • максимальный объем сделки - 5 лотов
  • максимальное суммарное количество открытых позиций и отложенных ордеров - 3

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

Все эти ограничения связаны с функцией 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(...);
  ...

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

  • Грубое пренебрежение контролем над ошибками с зацикливанием

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

    while(OrderSend(...)<1) RefreshRates();
  • Отсутствие контроля за OrderSelect - асинхронность процессов в действии

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

  • Пропуск функции обновления рыночного окружения через RefreshRates()

    Эта ошибка бывает в серии последовательных торговых операций или повторении сделки после предыдущей неудачи. Ошибка не сразу понимается, так как код иногда работает, а иногда нет. Вот пара примеров:

    //--- close all positions
    for(int i=OrdersTotal()-1; i >= 0; i--)
      {
       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
       switch(OrderType())
         {
          case OP_BUY:  OrderClose(...); break;
          case OP_SELL: OrderClose(...); break;
         }
      }
     
    if(SendOrder(...) < 1)
      {
       if(GetLastError()!=ERR_REQUOTE) return(false);
       //--- lets try again!
       if(SendOrder(...) < 1) return(false);
      }
  • Гридеры: массовые отложенные ордеры с массовыми отменами

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

В разделе документации "Справочник MQL4 - Торговые функции - Ошибки исполнения" приведены рекомендации по обработке торговых ошибок.

Создана: 10.08.2006  Автор: MetaQuotes
Одна неделя и сотня Участников

Регистрация Участников чемпионата Automated Trading Championship 2006 идет полным ходом. Уже более ста разработчиков механических торговых систем заявили о своем участии в чемпионате.

Интервью с Сергеем Ковалевым

Сергей Ковалев о трейдинге, механических торговых системах, Чемпионате Automated Trading Championship и о своей книге.

Предыдущая Следующая
Страницы: 
1
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
FOREXMAN писал(а):
vol=NormalizeDouble(AccountFreeMargin()*ExtMaximumRisk/AccountLeverage()/10.0,2);

Ето, не надо будь так?:

vol=NormalizeDouble(AccountFreeMargin()*ExtMaximumRisk/AccountLeverage()/10.0/Ask, 2);
Нет, деление на Ask можно использовать только в частном случае. Функция CalculateVolume в данном случае сделана под явное использование управления рисками, когда ExtMaximumRisk сильно меньше 0.50 (50%) и точным расчетом маржевых требований можно принебречь.

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

Ето, не надо будь так?:

vol=NormalizeDouble(AccountFreeMargin()*ExtMaximumRisk/AccountLeverage()/10.0/Ask, 2);
255
12.09.2006 12:48
Renat писал(а):
chern писал(а):

Вопрос - почему нельзя использовать DLL?
Язык метатрейдера безусловно хорош для написания реализатора стратегии, но для описания серьезного технического индикатора он не подходит.
Он не проходит как по объему вычислений, так и по стандартным временным осям и так далее. В данном случае оптимально - это использование кода как на метатрейдер - для стратегии, так и DLL для индикации.

Так как эксперты будут работать на нашем оборудовании, то мы не разрешаем использовать DLL ради безопасности.

В своей работе Вы можете использовать любые DLL, но только не в Чемпионате.

С моей точки зрения можно было бы разрешить предоставлять один DLL индикатор поставляемый в виде Си текста
08.09.2006 10:02
chern писал(а):

Вопрос - почему нельзя использовать DLL?
Язык метатрейдера безусловно хорош для написания реализатора стратегии, но для описания серьезного технического индикатора он не подходит.
Он не проходит как по объему вычислений, так и по стандартным временным осям и так далее. В данном случае оптимально - это использование кода как на метатрейдер - для стратегии, так и DLL для индикации.

Так как эксперты будут работать на нашем оборудовании, то мы не разрешаем использовать DLL ради безопасности.

В своей работе Вы можете использовать любые DLL, но только не в Чемпионате.
08.09.2006 09:55

Вопрос - почему нельзя использовать DLL?
Язык метатрейдера безусловно хорош для написания реализатора стратегии, но для описания серьезного технического индикатора он не подходит.
Он не проходит как по объему вычислений, так и по стандартным временным осям и так далее. В данном случае оптимально - это использование кода как на метатрейдер - для стратегии, так и DLL для индикации.

08.09.2006 08:59
Michel_S писал(а):

Почему, несмотря на применение контроля над свободными средствами, которые вы рекомендовали [vol=NormalizeDouble(AccountFreeMargin()*ExtMaximumRisk/AccountLeverage()/10.0,2);], всё-таки проскакивает ошибка 134. Я для подстраховки вставил уменьшение допустимого размера лота еще на 0,1 и всё равно проскакивает код ошибки 134 (хотя очень редко). Не будет ли из-за разовых случаев проскакивания кода 134 дисквалифицирован участник Чемпионата?

А при каких значениях Volume случается ошибка недостачи денег? Наверняка, когда денег на самом деле нет, но объем выравнивается на нижнюю границу в 0.10 . Из-за редких возвратов ERR_NOT_ENOUGH_MONEY (#134) никаких дисквалификаций не будет.

Дисквалификация возможна, если выяснится полная неспособность эксперта правильно управлять своими объемами.
01.09.2006 22:54

Почему, несмотря на применение контроля над свободными средствами, которые вы рекомендовали [vol=NormalizeDouble(AccountFreeMargin()*ExtMaximumRisk/AccountLeverage()/10.0,2);], всё-таки проскакивает ошибка 134. Я для подстраховки вставил уменьшение допустимого размера лота еще на 0,1 и всё равно проскакивает код ошибки 134 (хотя очень редко). Не будет ли из-за разовых случаев проскакивания кода 134 дисквалифицирован участник Чемпионата?

148
01.09.2006 22:39
ANG3110 писал(а):

У меня вопрос к организаторам по поводу формулы расчета количества лотов. Если

минимальный объем сделки - 0.1 лота, шаг изменения количества лотов - 0.1, максимальный объем сделки - 5 лотов,
и если эти условия меняться не будут,
то можно ли в коде эксперта не запрашивать постоянно эту информацию через MarketInfo,

чтобы не понижать скорость работы эксперта, а прописать сразу или в глобальных переменных
или в extern?

В данном конкретном случае эти 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

У меня вопрос к организаторам по поводу формулы расчета количества лотов. Если

минимальный объем сделки - 0.1 лота, шаг изменения количества лотов - 0.1, максимальный объем сделки - 5 лотов,
и если эти условия меняться не будут,
то можно ли в коде эксперта не запрашивать постоянно эту информацию через MarketInfo,

чтобы не понижать скорость работы эксперта, а прописать сразу или в глобальных переменных
или в extern?

217
30.08.2006 20:15