Форум трейдеров » Торговые роботы, советники, индикаторы » Проверить стратегию в МТ4 легко и быстро!
+ Подписаться
Страница 1 из 2 12 ПоследняяПоследняя
  1. 959
    Комментарии
    25
    Темы
    967
    Репутация Pro
     
    В начале пути

    4 Медалей

    Проверить стратегию в МТ4 легко и быстро!

    Есть статья от Rosh "MetaEditor: Опираясь на силу шаблонов" по линку http://articles.mql4.com/ru/573

    Я взял оттуда советник-пример "Osc_test.mq4" и разбил его на два модуля. Один модуль назвал "Common.mq4", где будут находится все общие функции, которые достаточно написать один раз и возможно иногда лишь править при необходимости. Во второй модуль я перенёс тот код, который связан с применением индикаторов, и который каждый раз будет разным.
    Приведу этот код:
    Код:
    //---- input parameters
    extern int       Kperiod=5;
    extern int       Dperiod=3;
    extern int       slowPeriod=3;
    extern int       UpLevel=90;
    extern int       DownLevel=10;
    
    //-- Подключаемые модули --
    #include  "Common.mq4" 
    
    //+----------------------------------------------------------------------------+
    //|  Возвращает торговый сигнал.                                              |
    //+----------------------------------------------------------------------------+
    int GetSignal()
    {
       int res = SIG_NO;
       // your code
       double prevValue = iStochastic(Symbol(),NULL,Kperiod,Dperiod,slowPeriod,MODE_SMA,0,MODE_SIGNAL,2);
       double currValue = iStochastic(Symbol(),NULL,Kperiod,Dperiod,slowPeriod,MODE_SMA,0,MODE_SIGNAL,1);
       if (currValue>DownLevel && prevValue<DownLevel) res = res | OP_BUY;
       if (currValue<UpLevel && prevValue>UpLevel) res = res | OP_SELL;
    //----
       return (res);   
    }
    
    //+------------------------------------------------------------------+
    //| expert start function                                            |
    //+------------------------------------------------------------------+
    int start()
    {
      if (AllowSignal())
       Start(GetSignal());
    //----
       return(0);
    }
    
    //+------------------------------------------------------------------+
    //| expert initialization function                                   |
    //+------------------------------------------------------------------+
    int init()
    {
       int res = Init();
    //----
       //your code
    //----
       return(res);
    }
    
    //+------------------------------------------------------------------+
    //| expert deinitialization function                                 |
    //+------------------------------------------------------------------+
    int deinit()
    {
       int res = Deinit();
    //----
       //your code
    //----
       return(res);
    }
    Как видите, достаточно всего лишь заполнить функцию "GetSignal" да задать входные параметры сверху.
    На броко-счетах тестировать будет, но чтобы работал на счетах, нужно конечно подправить код в "Common.mq4".
    Желающие могут этим заняться, да и проверить приведённые модули в деле. Если имеются ошибки, то поправить код.
    Вложения Вложения
    Недоступно! Pro 0
    Поделиться
    Просмотров: 9,823
  2. 959
    Комментарии
    25
    Темы
    967
    Репутация Pro
     
    В начале пути

    4 Медалей
    Переделал немного код, чтобы возможно было за один раз передать более одного сигнала, например закрыть короткую позицию и открыть длинную.

    Чтобы сигналы можно было комбинировать, определил их так:
    Код:
    #define SIG_NO          0
    #define SIG_BUY         1
    #define SIG_SELL        2
    #define SIG_BUYLIMIT    4
    #define SIG_SELLLIMIT   8
    #define SIG_BUYSTOP    16
    #define SIG_SELLSTOP   32
    #define SIG_BUYCLOSE   64
    #define SIG_SELLCLOSE 128
    И чтобы открыть длинную и закрыть короткую позиции, код должен выглядеть так:
    Код:
    int res = SIG_NO;
    if (...) res = res | SIG_BUY;
    if (...) res = res | SIG_SELLCLOSE;
    Функция GetSignal из советника-примера теперь выглядит так:
    Код:
    int GetSignal()
    {
       int res = SIG_NO;
       // your code
       double prevValue = iStochastic(Symbol(),NULL,Kperiod,Dperiod,slowPeriod,MODE_SMA,0,MODE_SIGNAL,2);
       double currValue = iStochastic(Symbol(),NULL,Kperiod,Dperiod,slowPeriod,MODE_SMA,0,MODE_SIGNAL,1);
       if (currValue>DownLevel && prevValue<DownLevel) res = res | OP_BUY;
       if (currValue<UpLevel && prevValue>UpLevel) res = res | OP_SELL;
    //----
       return (res);   
    }
    Файлы в первом сообщении.
  3. 959
    Комментарии
    25
    Темы
    967
    Репутация Pro
     
    В начале пути

    4 Медалей
    Дальнейшая модификация.
    Добавил сигналов для полноты
    Код:
    #define SIG_NO               0
    #define SIG_BUY              1
    #define SIG_SELL             2
    #define SIG_BUYLIMIT         4
    #define SIG_SELLLIMIT        8
    #define SIG_BUYSTOP         16
    #define SIG_SELLSTOP        32
    #define SIG_BUYCLOSE        64
    #define SIG_SELLCLOSE      128
    #define SIG_BUYLIMITCLOSE  256
    #define SIG_SELLLIMITCLOSE 512
    #define SIG_BUYSTOPCLOSE  1024
    #define SIG_SELLSTOPCLOSE 2048
    Добавил функций под каждый сигнал
    Код:
    void OrderBuy()
    {
       trSignal = trSignal | SIG_BUY;
    }
    void OrderSell()
    {
       trSignal = trSignal | SIG_SELL;
    }
    void OrderBuyLimit()
    {
       trSignal = trSignal | SIG_BUYLIMIT;
    }
    void OrderSellLimit()
    {
       trSignal = trSignal | SIG_SELLLIMIT;
    }
    void OrderBuyStop()
    {
       trSignal = trSignal | SIG_BUYSTOP;
    }
    void OrderSellStop()
    {
       trSignal = trSignal | SIG_SELLSTOP;
    }
    void OrderBuyClose()
    {
       trSignal = trSignal | SIG_BUYCLOSE;
    }
    void OrderSellClose()
    {
       trSignal = trSignal | SIG_SELLCLOSE;
    }
    void OrderBuyLimitClose()
    {
       trSignal = trSignal | SIG_BUYLIMITCLOSE;
    }
    void OrderSellLimitClose()
    {
       trSignal = trSignal | SIG_SELLLIMITCLOSE;
    }
    void OrderBuyStopClose()
    {
       trSignal = trSignal | SIG_BUYSTOPCLOSE;
    }
    void OrderSellStopClose()
    {
       trSignal = trSignal | SIG_SELLSTOPCLOSE;
    }
    Советник, который использует модуль "Common" выглядит так
    Код:
    //---- input parameters
    extern int       Kperiod=5;
    extern int       Dperiod=3;
    extern int       slowPeriod=3;
    extern int       UpLevel=90;
    extern int       DownLevel=10;
    
    //-- Подключаемые модули --
    #include  "Common.mq4" 
    
    //+----------------------------------------------------------------------------+
    //|  Формирует торговые сигналы.                                              |
    //+----------------------------------------------------------------------------+
    void GetSignal()
    {
    // your code
       double prevValue = iStochastic(Symbol(),NULL,Kperiod,Dperiod,slowPeriod,MODE_SMA,0,MODE_SIGNAL,2);
       double currValue = iStochastic(Symbol(),NULL,Kperiod,Dperiod,slowPeriod,MODE_SMA,0,MODE_SIGNAL,1);
       if (currValue>DownLevel && prevValue<DownLevel) OrderBuy();
       if (currValue<UpLevel && prevValue>UpLevel) OrderSell();
    //----
    }
    
    //+------------------------------------------------------------------+
    //| expert start function                                            |
    //+------------------------------------------------------------------+
    int start()
    {
      if (AllowSignal())
      {
       GetSignal();
       Start();
      }
    //----
       return(0);
    }
    
    //+------------------------------------------------------------------+
    //| expert initialization function                                   |
    //+------------------------------------------------------------------+
    int init()
    {
       int res = Init();
    //----
       //your code
    //----
       return(res);
    }
    
    //+------------------------------------------------------------------+
    //| expert deinitialization function                                 |
    //+------------------------------------------------------------------+
    int deinit()
    {
       int res = Deinit();
    //----
       //your code
    //----
       return(res);
    }
    Минимум кода требуется для написания советника, практически все общие функции находятся в модуле "Common".
    Файлы в первом сообщении.
  4. 959
    Комментарии
    25
    Темы
    967
    Репутация Pro
     
    В начале пути

    4 Медалей
    Переделал и доделал.
    Функций оставил всего четыре вместо двенадцати.
    Код:
    int Buy(double price = 0)
    {
       if (price == 0)
       {
          trSignal = trSignal | SIG_BUY;
          return(0);
       }
       int stop_level = MarketInfo(Symbol(),MODE_STOPLEVEL);
       if (price > Ask + stop_level*Point) 
       {
          trSignal = trSignal | SIG_BUYSTOP;
          BuyStopPrice = price;
          return(0);
       }
       if (price < Bid - stop_level*Point)
       {
          trSignal = trSignal | SIG_BUYLIMIT;
          BuyLimitPrice = price;
          return(0);
       }
       return(stop_level);
    }
    
    int Sell(double price = 0)
    {
       if (price == 0)
       {
          trSignal = trSignal | SIG_SELL;
          return(0);
       }
       int stop_level = MarketInfo(Symbol(),MODE_STOPLEVEL);
       if (price > Ask + stop_level*Point) 
       {
          trSignal = trSignal | SIG_SELLLIMIT;
          SellLimitPrice = price;
          return(0);
       }
       if (price < Bid - stop_level*Point)
       {
          trSignal = trSignal | SIG_SELLSTOP;
          SellStopPrice = price;
          return(0);
       }
       return(stop_level);
    }
    
    void BuyClose(int order = 0)
    {
       if (order == 0)
       {
          trSignal = trSignal | SIG_BUYCLOSE;
          return;
       }
       trSignal = trSignal | SIG_BUYLIMITCLOSE | SIG_BUYSTOPCLOSE;
    }
    
    void SellClose(int order = 0)
    {
       if (order == 0)
       {
          trSignal = trSignal | SIG_SELLCLOSE;
          return;
       }
       trSignal = trSignal | SIG_SELLLIMITCLOSE | SIG_SELLSTOPCLOSE;
    }
    Просто Buy() и Sell() означают купить/продать по рыночной цене.
    Если в скобки вписать цену, то значит будет выставляться отложенный ордер по этой цене. Если возвращается нуль, то всё нормально, и возвращается значение уровня стопов, если цена задана слишком близко к рыночной для отложенного ордера.
    Соответственно просто BuyClose() и SellClose() означают закрыть открытые ордера. Если в скобки вписать ненулевое значение (например 1), то будут закрываться отложенные ордера.
    Работу с отложенными ордерами нужно проверить, а с рыночными работает нормально вроде бы. Приведу две картинки: эксперта самого по себе и с использованием модуля "Common", перенесены были условия открытия и закрытия в функцию получения сигналов.
    Файлы в первом сообщении.
     
  5. 959
    Комментарии
    25
    Темы
    967
    Репутация Pro
     
    В начале пути

    4 Медалей
    второй рисунок:
     
  6. 959
    Комментарии
    25
    Темы
    967
    Репутация Pro
     
    В начале пути

    4 Медалей
    Ну что же, удалось проверить одну стратегию. Обнаружил её на компе, пересматривая сохранённые когда то файлы. Стратегия называется "8 из 10", прицепляю PDF файл. Я её переработал немного, добавил фильтр, увеличил стоп и профит, притом профит сделал больше по размеру стопа. Стратегия напоминет OpenTiks, там тоже рассматриваются 3 последовательные свечи.
    Ниже прицепляю результаты тестов на часовках за полгода на USDJPY.
     
    Изображения Изображения
  7. 959
    Комментарии
    25
    Темы
    967
    Репутация Pro
     
    В начале пути

    4 Медалей
    Проверка индикатора Heiken_Ashi MA T3 new[Alert]
    http://radikal.ru/F/i001.radikal.ru/...037c7.jpg.html

    1 вариант
    Покупаем и продаём по стрелкам (Aqua цветом вверх, Magenta цветом вниз) закрытие по обратному сигналу.
     
  8. 959
    Комментарии
    25
    Темы
    967
    Репутация Pro
     
    В начале пути

    4 Медалей
    2 вариант, всё с точностью наоборот.
     
  9. 959
    Комментарии
    25
    Темы
    967
    Репутация Pro
     
    В начале пути

    4 Медалей
    Интересная картинка получилась по FDAX. :greedy:
     
  10. 345
    Комментарии
    11
    Темы
    345
    Репутация Pro
    Аватар для LBL  
    В начале пути

    4 Медалей
    а как ты по даксу торгуешь советником?

Вверх
РегистрацияX

чтобы писать, читать, комментировать