Проверить стратегию в MT4 просто!

 

Есть статья от Rosh "MetaEditor: Опираясь на силу шаблонов" по линку https://www.mql5.com/ru/articles/1514

Я взял оттуда советник-пример "Osc_test.mq4" и разбил его на два модуля. Один модуль назвал "Common.mq4", где будут находится все общие функции, которые достаточно написать один раз и возможно иногда лишь править при необходимости. Во второй модуль я перенёс тот код, который связан с применением индикаторов, и который каждый раз будет разным.
Приведу этот код:

//+------------------------------------------------------------------+
 //| XTest.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()
 {
   // 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) return(OP_BUY);
   if (currValue<UpLevel && prevValue>UpLevel) return(OP_SELL);
 //----
   return(OP_BALANCE);  
 }

 //+------------------------------------------------------------------+
 //| 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" определил добавочно к OP_BALANCE две константы OP_BUYCLOSE и OP_SELLCLOSE.
Желающие могут проверить приведённые модули в деле. Если имеются ошибки, то и поправить код.

 

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

Чтобы сигналы можно было комбинировать, определил их так:

#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);   
}
Файлы:
 
yuripk >>:

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

Чтобы сигналы можно было комбинировать, определил их так:


Интересное решение.

 

Дальнейшая модификация.

Добавил сигналов для полноты

#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".
Файлы:
 

А вы не могли бы какой нибудь советник записать сюда для примера, и оригинал тоже выложить из чего что получилось и как это делается?

В качестве учебного пособия для первоклашек...

 
Nail_Saby >>:

А вы не могли бы какой нибудь советник записать сюда для примера, и оригинал тоже выложить из чего что получилось и как это делается?

В качестве учебного пособия для первоклашек...

Последняя вставка кода (со стохастиком) и есть пример советника. Разве нет?

Вместо стохастика попробуйте какой другой индикатор прописать.

 
yuripk писал(а) >>

Последняя вставка кода (со стохастиком) и есть пример советника. Разве нет?

Вместо стохастика попробуйте какой другой индикатор прописать.

т.е. нужно только условия входа выхода в модуле менять, а модуль Common.mq4", вообще не нужно менять?

 
Nail_Saby >>:

т.е. нужно только условия входа выхода в модуле менять, а модуль Common.mq4", вообще не нужно менять?

Да.

Но есть варианты, например как исполняют покупку/продажу брокеры. Может что-то и нужно поменять под конкретного брокера.

Или если ошибки попали в код общего модуля. Проверяйте на деле.

Конкретно сейчас недоделана работа с отложками, их пока нельзя применять.

Причина обращения: