Forex / Форекс Инвестиции, доверительное управление, интернет трейдинг – NEUIMEX ::Обучение MQL : MQL Support
NEUIMEX TEAM
   
FOREX FUTURES CFD's АНАЛИТИКА

EN | DE
Компания
Главная страница
О компании
Международные офисы
Клиентам
Открыть счёт
Демо счёт
Конкурс Трейдеров
Пополнить счёт
Отзыв средств
Платформы
NEXTT Trading Terminal
NEXTT Signal Base
NEXTT PDA Terminal
Как связаться
Обратная связь
Швейцария >>
Германия >>
Россия >>

MQL II Support
Советиники Форма Заказа

Содержание | назад | далее   
 

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

Принципы торговли:

  • вход в Long (BUY) - индикатор MACD ниже нуля, идет снизу вверх, а его сверху вниз пересекает сигнальная линия.
    MACD пересекается с сигнальной линией
  • вход в Short (SELL) - индикатор MACD выше нуля, идет вверху вниз, а его снизу вверх пересекает сигнальная линия.
    MACD пересекается с сигнальной линией
  • выход из Long - по тейкпрофиту, по трейлинг-стопу или при пересечении MACD со своей сигнальной линией (MACD выше нуля, идет вверху вниз, а его снизу вверх пересекает сигнальная линия).
  • выход из Short - по тейкпрофиту, по трейлинг-стопу или при пересечении MACD со своей сигнальной линией (MACD ниже нуля, идет снизу вверх, а его сверху вниз пересекает сигнальная линия).
Важное замечание: для исключения из анализа незначительных(мелкие 'бугорки' на графике) изменений индикатора MACD, введем дополнительный контроль за размером рисуемых 'бугров' в виде следующего условия - величина индикатора должна составлять не менее 5 единиц минимальной цены (5*Point, что для USD/CHF равно 0.0005, для USD/JPY = 0.05).

Пример графика

1-й этап - создание описания эксперта

Добавление нового советника в список
    В окне Navigator устанавливаем курсор мыши на разделе Expert Advisors, нажимаем на правую кнопку мыши и в появившемся меню выбираем команду Create a new Expert. Мастер первоначальных настроек эксперта предложит ввести некоторые данные. В появившемся окне указываем имя(Name) эксперта - MACD Sample , автора(Author) - укажите ваше имя , ссылку(Link) - ссылка на ваш веб-сайт , в примечаниях(Notes) - Тестовый пример эксперта на MACD.

2-й этап - создание первичной структуры программы

    Код тестового эксперта будет занимать всего несколько страниц, но и такой объем зачастую бывает труден для восприятия. Особенно, если мы с вами не профессиональные программисты... Так ведь? Иначе этого описания не пришлось бы писать :)

Для ознакомления со структурой стандартного эксперта взглянем на предлагаемое описание:
  1. Первичные проверки данных
    • проверка графика, количество баров на графике
    • проверка значений внешних переменных Lots, S/L, T/P, T/S
  2. Установка внутренних переменных для быстрого доступа к данным
  3. Проверка торгового терминала - пустой ли? если да, то:
    • проверки: если ли деньги на счету и тд...
    • можно встать в длинную позицию(BUY)?
      • открыть длинную позицию и выйти
    • можно встать в короткую позицию(SELL)?
      • открыть короткую позицию и выйти
    выход из эксперта...
  4. Контроль ранее открытых позиций в цикле
    • если это длинная позиция
      • нужно ли закрыть?
      • нужно ли передвинуть трейлинг-стоп?
    • если это короткая позиция
      • нужно ли закрыть?
      • нужно ли передвинуть трейлинг-стоп?

Получилось достаточно просто, всего 4 основных блока.
Теперь попробуем по шагам сформировать куски кода под каждый раздел структурной схемы:

  1. Первичные проверки данных
    Этот кусок кода обычно кочует из одного эксперта в другой с мелкими изменениями - практически стандартный блок проверок:
    If Bars<200 Then Exit; // на графике менее 200 баров - выходим
    If TakeProfit<10 Then Exit; // неверные параметры тейкпрофита
    
  2. Установка внутренних переменных для быстрого доступа к данным
    В коде программы приходится достаточно часто обращаться к значениям индикаторов или оперировать вычисляемыми значениями. Для облегчения кодирования и ускорения доступа применяется предварительное помещение данных во внутренние переменные.
    MacdCurrent=iMACD(12,26,9,MODE_MAIN,0);     // значение MACD на текущем баре
    MacdPrevious=iMACD(12,26,9,MODE_MAIN,1);    // значение MACD на предыдущем баре
    SignalCurrent=iMACD(12,26,9,MODE_SIGNAL,0); // значение сигнальной линии на текущем баре
    SignalPrevious=iMACD(12,26,9,MODE_SIGNAL,1);// значение сигнальной линии на предыдущем баре
    MaCurrent=iMA(MATrendPeriod,MODE_EMA,0);    // значение скользящей средней на текущем баре
    MaPrevious=iMA(MATrendPeriod,MODE_EMA,1);   // значение скользящей средней на предыдущем баре
    
    Теперь вместо громадной записи iMACD(12,26,9,MODE_MAIN,0) в тексте программы можно использовать MacdCurrent. Все переменные, которые будут использоваться в программе-эксперте должны быть предварительно описаны, как это описано в описании языка MetaQuotes Language II Поэтому в начале программы вставляем описание этих переменных
    var: MacdCurrent(0), MacdPrevious(0), SignalCurrent(0), SignalPrevious(0);
    var: MaCurrent(0), MaPrevious(0);
    
    В MetaQuotes Language II введено такое понятие, как дополнительные пользовательские переменные, которые могут быть установлены извне, без вмешательства в исходный текст программы-эксперта. Это придает дополнительную гибкость. Переменная MATrendPeriod как раз и является такой пользовательской переменной. В начале программы вставляем описание этой переменной.
    defines: MATrendPeriod(56);
    
  3. Проверка торгового терминала - пустой ли? если да, то:
    В нашем эксперте мы используем только позиции, открытые по маркету и не трогаем отложенные ордеры. Но для безопасности лучше внесем проверку торгового терминала на наличие выставленных ордеров:
    If TotalTrades<1 then   // нет ни одного открытого ордера
      {
    
    • проверки: если ли деньги на счету и тд...
      Перед анализом рыночной ситуации желательно проверить состояние своего счета - есть ли свободные деньги для открытия позиции?
      If FreeMargin<1000 then Exit;  // денег нет - выходим
      
    • проверка возможности встать в длинную позицию(BUY)
      Условие входа в длинную позицию: MACD ниже нуля, идет снизу вверх, а его сверху вниз пересекает сигнальная линия. Как это записывается на MQL II (обратите внимание что работа идет с сохраненными ранее в переменных значениями индикаторов):
      If MacdCurrent<0 and MacdCurrent>SignalCurrent and
         MacdPrevious<SignalPrevious and              // есть пересечение
         Abs(MacdCurrent)>(MACDevel*Point) and   // индикатор отрисовал хороший 'бугор'
         MaCurrent>MaPrevious then                    // 'бычий' тренд
        {
            SetOrder(OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,RED); // исполняем
            Exit; // выходим, так как все равно после совершения торговой операции
                  // наступил 10-ти секундный таймаут на совершение торговых операций
        };
      
      Выше говорилось о дополнительном контроле за размером рисуемых 'бугров'. Переменная MACDevel является 'пользовательской' переменной, которую можно менять, не трогая текста программы, для гибкости контроля. В начале программы вставляем описание этой переменной (заодно и описание переменной, используемой ниже).
      defines: MACDevel(3), MACDCloseLevel(2);
      

    • проверка возможности встать в короткую позицию(SELL)
      Условие входа в короткую позицию: MACD выше нуля, идет сверху вниз, а его снизу вверх пересекает сигнальная линия. Как это записывается:
      If MacdCurrent>0 and MacdCurrent<SignalCurrent and
         MacdPrevious>SignalPrevious and MacdCurrent>(MACDevel*Point) and
         MaCurrent<MaPrevious then
        {
            SetOrder(OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,RED); // исполняем
            Exit; // выходим
        };
      
       Exit;   // новые позиции открыты не были - просто выходим
      };
  4. Контроль открытых ранее позиций в цикле
    for cnt=1 to TotalTrades
      {
       if OrderValue(cnt,VAL_TYPE)<=OP_SELL and   // это открытая позиция?
          OrderValue(cnt,VAL_SYMBOL)=Symbol then  // позиция с 'нашего' графика?
         {
    
    Cnt - это переменная цикла, которая должна быть описана в начале программы следующим образом :
    var: Cnt(0);

    • если это длинная позиция
      If OrderValue(cnt,VAL_TYPE)=OP_BUY then // открыта длинная позиция
        {
      • нужно ли закрыть?
        Условие выхода из длииной позиции: при пересечении MACD со своей сигнальной линией, когда MACD выше нуля, идет вверху вниз, а его снизу вверх пересекает сигнальная линия.
        If MacdCurrent>0 and MacdCurrent<SignalCurrent and
           MacdPrevious>SignalPrevious and MacdCurrent>(MACDCloseLevel*Point) then
          {
            CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Bid,3,Violet);
            Exit; // выходим
          };
        
      • нужно ли передвинуть трейлинг-стоп?
        Трейлинг-стоп выставляем только тогда, когда у позиции уже есть прибыль, превышающая величину трейлинг-стопа в пунктах и если новый уровень стопа лучше предыдущего.
        If TrailingStop>0 then // если трейлинг-стопы используются
          {
            If (Bid-OrderValue(cnt,VAL_RICE))>(Point*TrailingStop) then
              {
                If OrderValue(cnt,VAL_STOPLOSS)<(Bid-Point*TrailingStop) then
                  {
                     ModifyOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_RICE),
                                 Bid-Point*TrailingStop,OrderValue(cnt,VAL_TAKEPROFIT),Red);
                     Exit;
                  };
              };
          };
        }
      
    • если это короткая позиция
      else // иначе это короткая позиция
        {
      • нужно ли закрыть?
        Условие выхода из короткой позиции: при пересечении MACD со своей сигнальной линией, когда MACD ниже нуля, идет снизу вверх, а его сверху вниз пересекает сигнальная линия.
        If MacdCurrent<0 and MacdCurrent>SignalCurrent and 
           MacdPrevious<SignalPrevious and Abs(MacdCurrent)>(MACDCloseLevel*Point) then
          {
            CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Ask,3,Violet);
            Exit; // выходим
          };
        
      • нужно ли передвинуть трейлинг-стоп?
        Трейлинг-стоп выставляем только тогда, когда у позиции уже есть прибыль, превышающая величину трейлинг-стопа в пунктах и если новый уровень стопа лучше предыдущего.
        If TrailingStop>0 then  // пользователь выставил в настройках трейлинг-стоп
          {                // значит мы идем его проверять
            If (OrderValue(cnt,VAL_RICE)-Ask)>(Point*TrailingStop) then
              {
                If OrderValue(cnt,VAL_STOPLOSS)=0 or 
                   OrderValue(cnt,VAL_STOPLOSS)>(Ask+Point*TrailingStop) then
                  {
                    ModifyOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_RICE),
                                Ask+Point*TrailingStop,OrderValue(cnt,VAL_TAKEPROFIT),Red);
                    Exit;
                  };
              };
          };
        
        // конец. закрываем все оставшиеся открытые операторные скобки
          };
        };
      };
      
Вот так, шаг за шагом и написан эксперт...

3-й этап - сборка результирующего кода программы

    Откроем настройки эксперта (кнопка или строка меню Properties.... Перед нами появится окно, в котором необходимо выставить внешние настройки параметров работы:
Окно ввода текста программы

Соберем весь код из предыдущего раздела воедино...
defines: MACDevel(3),MACDCloseLevel(2);
defines: MATrendPeriod(56);
var: MacdCurrent(0),MacdPrevious(0),SignalCurrent(0),SignalPrevious(0);
var: MaCurrent(0),MaPrevious(0);
var: cnt(0);

// первичные проверки данных
// важно удостовериться что эксперт работает на нормальном графике и
// пользователь правильно выставил внешние переменные (Lots, StopLoss,
// TakeProfit, TrailingStop)
// в нашем случае проверяем только TakeProfit
If Bars<200 or TakeProfit<10 then Exit;  // на графике менее 200 баров

// ради упрощения и ускорения кода, сохраним необходимые
// данные индикаторов во временных переменных
MacdCurrent=iMACD(12,26,9,MODE_MAIN,0);
MacdPrevious=iMACD(12,26,9,MODE_MAIN,1);
SignalCurrent=iMACD(12,26,9,MODE_SIGNAL,0);
SignalPrevious=iMACD(12,26,9,MODE_SIGNAL,1);
MaCurrent=iMA(MATrendPeriod,MODE_EMA,0);
MaPrevious=iMA(MATrendPeriod,MODE_EMA,1);

// теперь надо определиться - в каком состоянии торговый терминал?
// проверим, есть ли ранее открытые позиции или ордеры?
If TotalTrades<1 then
  {// нет ни одного открытого ордера
   // на всякий случай проверим, если у нас свободные деньги на счету?
   // значение 1000 взято для примера, обычно можно открыть 1 лот
   If FreeMargin<1000 then Exit;  // денег нет - выходим

   // проверяем на возможность встать в длинную позицию (BUY)
   If MacdCurrent<0 and MacdCurrent>SignalCurrent and
      MacdPrevious<SignalPrevious and Abs(MacdCurrent)>(MACDevel*Point) and
      MaCurrent>MaPrevious then
     {
      SetOrder(OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,RED); // исполняем
      Exit; // выходим, так как все равно после совершения торговой операции
            // наступил 10-ти секундный таймаут на совершение торговых операций
     };
   // проверяем на возможность встать в короткую позицию (SELL)
   If MacdCurrent>0 and MacdCurrent<SignalCurrent and
      MacdPrevious>SignalPrevious and MacdCurrent>(MACDevel*Point) and
      MaCurrent<MaPrevious then
     {
      SetOrder(OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,RED); // исполняем
      Exit; // выходим
     };
   // здесь мы завершили проверку на возможность открытия новых позиций.
   // новые позиции открыты не были и просто выходим по Exit, так как
   // все равно анализировать нечего
   Exit;
  };
// переходим к важной части эксперта - контролю открытых позиций
// 'важно правильно войти в рынок, но выйти - еще важнее...'
for cnt=1 to TotalTrades
  {
   if OrderValue(cnt,VAL_TYPE)<=OP_SELL and   // это открытая позиция? OP_BUY или OP_SELL 
      OrderValue(cnt,VAL_SYMBOL)=Symbol then  // инструмент совпадает?
     {
      If OrderValue(cnt,VAL_TYPE)=OP_BUY then // открыта длинная позиция
        {
         // проверим, может уже пора закрываться?
         If MacdCurrent>0 and MacdCurrent<SignalCurrent and
            MacdPrevious>SignalPrevious and MacdCurrent>(MACDCloseLevel*Point) then
           {
             CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Bid,3,Violet);
             Exit; // выходим
           };
         // проверим - может можно/нужно уже трейлинг-стоп ставить?
         If TrailingStop>0 then  // пользователь выставил в настройках трейлинг-стоп
           {>                     // значит мы идем его проверять
            If (Bid-OrderValue(cnt,VAL_RICE))>(Point*TrailingStop) then
              {
               If OrderValue(cnt,VAL_STOPLOSS)<(Bid-Point*TrailingStop) then
                 {
                   ModifyOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_RICE),
                               Bid-Point*TrailingStop,OrderValue(cnt,VAL_TAKEPROFIT),Red);
                   Exit;
                 };
              };
           };
        }
      else // иначе это короткая позиция
        {
         // проверим, может уже пора закрываться?
         If MacdCurrent<0 and MacdCurrent>SignalCurrent and 
            MacdPrevious<SignalPrevious and Abs(MacdCurrent)>(MACDCloseLevel*Point) then
            {
             CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Ask,3,Violet);
             Exit; // выходим
            };
         // проверим - может можно/нужно уже трейлинг-стоп ставить?
         If TrailingStop>0 then  // пользователь выставил в настройках трейлинг-стоп
     	   {                // значит мы идем его проверять
            If (OrderValue(cnt,VAL_RICE)-Ask)>(Point*TrailingStop) then
             {
               If OrderValue(cnt,VAL_STOPLOSS)=0 or 
                  OrderValue(cnt,VAL_STOPLOSS)>(Ask+Point*TrailingStop) then
                 {
                   ModifyOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_RICE),
                               Ask+Point*TrailingStop,OrderValue(cnt,VAL_TAKEPROFIT),Red);
                   Exit;
                 };
              };
           };
        };
     };
  };
// the end.
    Для финальной настройки эксперта необходимо лишь указать значения внешних переменных Lots = 1, Stop Loss (S/L) = 0 (не используется), Take Profit (T/P) = 120 (для часовок подходит), Trailing Stop (T/S) = 30. Конечно же, значения вы можете поставить свои.
Нажмите на кнопку Verify и если не обнаружатся ошибки (кстати, в редактор MetaEditor можно скопировать текст из вышеприведенной распечатки программы на сером фоне), нажмите на кнопку Save, чтобы эксперт сохранился.
4-й этап - тестирование эксперта на исторических данных

Запуск эксперта на графике
    Эксперта написали и теперь не терпится оценить его, прогнав на исторических данных. Для примера возьмем пятнадцатиминутки по EUR/USD, примерно 4000 баров.
    Откроем график EURUSD,M15 в Neurex Direct, прикрепим эксперта MACD Sample к графику командой Attach to a chart (в окне Navigator выделяем курсором мыши строку MACD Sample, нажимаем на правую кнопку мыши и в появившемся меню выбираем команду). Затем перейдем в настройки советника, где можно поменять предопределённые внешние переменные Lots, Stop loss, Take profit, Trailing stop, а также определенные пользователем переменные. Чтобы эксперт мог не только давать советы, а самостоятельно играть на торговом счету в реальном режиме времени, необходимо включить кнопку Allow Live trading. Но нам необходимо тестирование на истории, поэтому оставляем значения настроек без изменений, переключаемся во вкладку Strategy Tester, включаем галочку Arrows on the chart (показ стрелок на графике) и запускаем тест с помощью кнопки Start:

Testing




Содержание | назад | далее   
 














о компании | контакты © NEUIMEX TEAM ® Главная   о компании   Вверх
Forex / Форекс Инвестиции, доверительное управление, интернет трейдинг – NEUIMEX :: Articles catalogue

transmaster-omsk.ru v 4_2