Помогите написать советника. Пожалуйста! [на Advanced ADX, Awesome Oscilator, ColorStochastic, Heiken Ashi ]

 

У меня есть торговая стратегия. Я пробовал написать для нее советника, но для меня это сложновато. Прошу помощи у программистов.

На рисунке 1 приведена ситуация на продажу.

Условия открытия ордера SELL:

1. Индикатор Advanced ADX - красный, текущий бар выше предыдущего. Но при этом предыдущий бар не должен быть выше ему предшествующего.

2. Индикатор Awesome Oscilator должен быть красный. Все остальное не важно.

3. Индикатор ColorStochastic должен быть красный. Линия KPeriod должна быть ниже DPeriod.

4. Индикатор Heiken Ashi должен быть красный.

На рисунке 2 приведена ситуация на покупку.

Условия открытия ордера BUY:

1. Индикатор Advanced ADX - зеленый, текущий бар выше предыдущего. Но при этом предыдущий бар не должен быть выше ему предшествующего.

2. Индикатор Awesome Oscilator должен быть зеленый. Все остальное не важно.

3. Индикатор ColorStochastic должен быть зеленый. Линия KPeriod должна быть выше DPeriod.

4. Индикатор Heiken Ashi должен быть зеленый.

Все необходимые индикаторы прикрепляю к теме.

Теперь об открытии самих ордеров.

Открываются три ордера по 0,01 лот каждый. При этом для первого ордера STOPLOSS - 20 пунктов, TAKEPROFIT - 20 пунктов.

Для второго ордера STOPLOSS тот же, TAKEPROFIT - 100 пунктов, при этом когда прибыль достигает 20 пунктов, STOPLOSS переносится на 1 пункт выше цены открытия ордера.

Для третьего ордера опять STOPLOSS тот же, а по TAKEPROFIT выставляется трейлинг стоп в 30 пунктов. При этом когда прибыль достигает 20 пунктов, STOPLOSS тоже переносится на 1 пункт выше цены открытия ордера.

На этом все. Жду ваших комментариев по созданию данного советника.

Заранее премного благодарен за помощь или за комментарии относительно возможности создания такого советника.

Файлы:
 
Vight:

У меня есть торговая стратегия. Я пробовал написать для нее советника, но для меня это сложновато.

На этом все. Жду ваших комментариев по созданию данного советника.

Заранее премного благодарен за помощь или за комментарии относительно возможности создания такого советника.


познакомьтесь с этим разделом учебника - там уже практически все выполнено в коде - см. приложения - в конце странички - качайте инклюды и самого сОва и правьте, далее в первую очередь внесите правки (замените существующие условия входа по стохастику и МАСД) на условия входа в рынок по Вашим индикаторам в этом инклюде сОва... Далее - посмотрим...
 

Спасибо за совет. Изменил инклюд Criterion, когда компилирую вроде нормально. Остальные инклюды кроме Check взял из учебника.Немного изменил Lot. При его компиляции тоже вроде все норм. Остальные инклюды не изменял. Но когда компилирую самого советника пишет '(' - function definition unexpected.

Код Criterion

//--------------------------------------------------------------------
// Criterion.mqh
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------- 1 --
// Функция вычисления торговых критериев.
// Возвращаемые значения:
// 10 - открытие Buy  
// 20 - открытие Sell 
// 11 - закрытие Buy
// 21 - закрытие Sell
// 0  - значимых критериев нет
// -1 - используется другой финансовый инструмент
//--------------------------------------------------------------- 2 --
// Внешние переменные:
  //--------------------------------------------------------------- 3 --
int Criterion()                            // Пользовательская функция
 {
   string Sym=Symbol();
   double
   ADX0_0, ADX0_1,                         // Значение ADX0 на 0 и 1 барах
   ADX1_0, ADX1_1,                         // Значение +DI на 0 и 1 барах
   ADX2_0, ADX2_1,                         // Значение -DI на 0 и 1 барах
   AO_0, AO_1,                             // Значение AO на 0 и 1 барах
   St_M_0, St_M_1,                         // Значение MAIN на 0 и 1 барах
   St_S_0, St_S_1;                         // Значение SIGNAL на 0 и 1 барах
//--------------------------------------------------------------- 4 --
   // Параметры технич. индикат:
   ADX0_0=iADX(NULL, 0, 13, PRICE_CLOSE, MODE_MAIN, 0);                                   // 0 бар
   ADX0_1=iADX(NULL, 0, 13, PRICE_CLOSE, MODE_MAIN, 1);                                   // 1 бар
   ADX1_0=iADX(NULL, 0, 13, PRICE_CLOSE, MODE_PLUSDI, 0);                                 // 0 бар
   ADX1_1=iADX(NULL, 0, 13, PRICE_CLOSE, MODE_PLUSDI, 1);                                 // 1 бар
   ADX2_0=iADX(NULL, 0, 13, PRICE_CLOSE, MODE_MINUSDI, 0);                                // 0 бар
   ADX2_1=iADX(NULL, 0, 13, PRICE_CLOSE, MODE_MINUSDI, 1);                                // 1 бар
   
   AO_0=iMA(NULL,0,5,0,MODE_SMA,PRICE_MEDIAN,0)-iMA(NULL,0,34,0,MODE_SMA,PRICE_MEDIAN,0);  //0 бар
   AO_1=iMA(NULL,0,5,0,MODE_SMA,PRICE_MEDIAN,1)-iMA(NULL,0,34,0,MODE_SMA,PRICE_MEDIAN,1);  //1 бар

   St_M_0=iStochastic(NULL,PERIOD_M15,14,6,4,MODE_SMA,0,MODE_MAIN,0);                     //Значение MAIN на 0 баре;
   St_M_1=iStochastic(NULL,PERIOD_M15,14,6,4,MODE_SMA,0,MODE_MAIN,1);                     //Значение MAIN на 1 баре
   St_S_0=iStochastic(NULL,PERIOD_M15,14,6,4,MODE_SMA,0,MODE_MAIN,0);                     //Значение SIGNAL на 0 баре;
   St_S_1=iStochastic(NULL,PERIOD_M15,14,6,4,MODE_SMA,0,MODE_MAIN,1);                     //Значение SIGNAL на 1 баре;
//--------------------------------------------------------------- 5 --
   // Вычисление торговых критериев
   if(ADX0_0>ADX0_1 && ADX1_0>ADX2_0 && AO_0>AO_1 && St_M_0>St_S_0)
      return(10);                      // Открытие Buy    
   if(ADX0_0>ADX0_1 && ADX1_0<ADX2_0 && AO_0<AO_1 && St_M_0<St_S_0)
      return(20);                      // Открытие Sell 
   if(ADX0_0<ADX0_1 && AO_0<AO_1)
      return(11);                      // Закрытие Buy    
   if(ADX0_0<ADX0_1 && AO_0>AO_1)
      return(21);                      // Закрытие Sell         
//--------------------------------------------------------------- 6 --
   return(0);                          // Выход из пользов. функции
  }
//--------------------------------------------------------------- 7 --

Код lot

//--------------------------------------------------------------------
// Lot.mqh
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------- 1 --
// Функция вычисления количества лотов.
// Глобальные переменные:
// double Lots_New - количество лотов для новых ордеров (вычисляется)
// double Lots     - желаемое количество лотов, заданное пользовател.
// int Percent     - процент средств, заданный пользователем
// Возвращаемые значения:
// true  - если средств хватает на минимальный лот
// false - если средств не хватает на минимальный лот
//--------------------------------------------------------------- 2 --
bool Lot()                                     // Позовательская ф-ия
  {
   string Symb   =Symbol();                    // Финансовый инструм.
   double One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);//Стоим. 1 лота
   double Min_Lot=MarketInfo(Symb,MODE_MINLOT);// Мин. размер. лотов
   double Step   =MarketInfo(Symb,MODE_LOTSTEP);//Шаг изменен размера
   double Free   =AccountFreeMargin();         // Свободные средства
//--------------------------------------------------------------- 3 --
   if (Lots>0)                                 // Лоты заданы явно..
     {                                         // ..проверим это
      double Money=Lots*One_Lot;               // Стоимость ордера
      if(Money<=AccountFreeMargin())           // Средств хватает..
         Lots_New=Lots;                        // ..принимаем заданное
      else                                     // Если не хватает..
         Lots_New=MathFloor(Free/One_Lot/Step)*Step;// Расчёт лотов
     }
   return(true);                               // Выход из польз. ф-ии
  }
  //------------------------------------------------------------- 4 --
 
Vight:

Спасибо за совет. Изменил инклюд Criterion, когда компилирую вроде нормально. Остальные инклюды кроме Check взял из учебника.Немного изменил Lot. При его компиляции тоже вроде все норм. Остальные инклюды не изменял. Но когда компилирую самого советника пишет '(' - function definition unexpected.

Код Criterion

Код lot


Инкдюды компилировать не надо. Это включаемые файлы. Компилится только сам сОв. Инклюд Check я вообще удалил за не нужностью. Cегодня/завтра посмотрю код полностью. Результаты - выложу в эту ветку.
 
Vight:

Спасибо за совет. Изменил инклюд Criterion, когда компилирую вроде нормально. Остальные инклюды кроме Check взял из учебника.Немного изменил Lot. При его компиляции тоже вроде все норм. Остальные инклюды не изменял. Но когда компилирую самого советника пишет '(' - function definition unexpected.

Код Criterion

Код lot


Значит где-то ошиблись - см. прицеп - я поменял эти два инклюда учебника на Ваши - все нормально компилится...

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

Файлы:
1_3.zip  118 kb
 

По этому вопросу: "Открываются три ордера по 0,01 лот каждый. При этом для первого ордера STOPLOSS - 20 пунктов, TAKEPROFIT - 20 пунктов.

Для второго ордера STOPLOSS тот же, TAKEPROFIT - 100 пунктов, при этом когда прибыль достигает 20 пунктов, STOPLOSS переносится на 1 пункт выше цены открытия ордера.

Для третьего ордера опять STOPLOSS тот же, а по TAKEPROFIT выставляется трейлинг стоп в 30 пунктов. При этом когда прибыль достигает 20 пунктов, STOPLOSS тоже переносится на 1 пункт выше цены открытия ордера."

Смотрите и правьте эти три включаемых файла в сов: trade, Open_Ord.mqh, Tral_Stop.mqh - т.е. если Вы открываете по сигналу на вход в рынок сразу три ордера, то значит и в Open_Ord.mqh - надо открывать три ордера,... далее и трал менять соответственно Вашим условиям...

На выходных подробнее сам гляну.

П.С. При трактовке индикаторов не используйте нулевой бар, т.к. из значения на нем "пляшут", т.е. поменяйте соответствующий участок кода на этот...

// Параметры технич. индикат:
   ADX0_0=iADX(NULL, 0, 13, PRICE_CLOSE, MODE_MAIN, 1);                                   // 0 бар
   ADX0_1=iADX(NULL, 0, 13, PRICE_CLOSE, MODE_MAIN, 2);                                   // 1 бар
   ADX1_0=iADX(NULL, 0, 13, PRICE_CLOSE, MODE_PLUSDI, 1);                                 // 0 бар
   ADX1_1=iADX(NULL, 0, 13, PRICE_CLOSE, MODE_PLUSDI, 2);                                 // 1 бар
   ADX2_0=iADX(NULL, 0, 13, PRICE_CLOSE, MODE_MINUSDI, 1);                                // 0 бар
   ADX2_1=iADX(NULL, 0, 13, PRICE_CLOSE, MODE_MINUSDI, 2);                                // 1 бар
   
   AO_0=iMA(NULL,0,5,0,MODE_SMA,PRICE_MEDIAN,1)-iMA(NULL,0,34,0,MODE_SMA,PRICE_MEDIAN,1);  //0 бар
   AO_1=iMA(NULL,0,5,0,MODE_SMA,PRICE_MEDIAN,2)-iMA(NULL,0,34,0,MODE_SMA,PRICE_MEDIAN,2);  //1 бар

   St_M_0=iStochastic(NULL,PERIOD_M15,14,6,4,MODE_SMA,0,MODE_MAIN,1);                     //Значение MAIN на 0 баре;
   St_M_1=iStochastic(NULL,PERIOD_M15,14,6,4,MODE_SMA,0,MODE_MAIN,2);                     //Значение MAIN на 1 баре
   St_S_0=iStochastic(NULL,PERIOD_M15,14,6,4,MODE_SMA,0,MODE_MAIN,1);                     //Значение SIGNAL на 0 баре;
   St_S_1=iStochastic(NULL,PERIOD_M15,14,6,4,MODE_SMA,0,MODE_MAIN,2);                     //Значение SIGNAL на 1 баре;
Значения индикаторов можно использовать на нулевом баре только, если берете значения цен открытий, т.е. не PRICE_CLOSE, но PRICE_OPEN.
 
А можно в формуле ADX PRICE_CLOSE изменить на PRICE_OPEN?
 
Vight:
А можно в формуле ADX PRICE_CLOSE изменить на PRICE_OPEN?

Конечно. Разбирайтесь еще как трактовать показания HeikenmAshi.mq4 (3.91 KB) в сОве.
 

То то и оно. Подумываю может его убрать. Думаю добавить полосы Боллинджера для определения волатильности. Чтобы на их основе флэт определять и сОв тоговал тогда когда они расходятся, и не торговал когда сходятся или параллельны и близки друг к другу.

А насчет трейлинг стопа нашел на этом форуме советник который делает как раз то что надо: тралит и переводит в безубыток.

 
Vight:

То то и оно. Подумываю может его убрать. Думаю добавить полосы Боллинджера для определения волатильности. Чтобы на их основе флэт определять и сОв тоговал тогда когда они расходятся, и не торговал когда сходятся или параллельны и близки друг к другу.

А насчет трейлинг стопа нашел на этом форуме советник который делает как раз то что надо: тралит и переводит в безубыток.


Кроме этого, у Вас здесь это условие не полностью раскрыто:

Условия открытия ордера BUY:

1. Индикатор Advanced ADX - зеленый, текущий бар выше предыдущего. Но при этом предыдущий бар не должен быть выше ему предшествующего.

у Вас

 if(ADX0_0>ADX0_1 && ADX1_0>ADX2_0)

правильно так

 // Параметры технич. индикат:
   ADX0_0=iADX(NULL, 0, 13, PRICE_CLOSE, MODE_MAIN, 1);                                   // 1 бар
   ADX0_1=iADX(NULL, 0, 13, PRICE_CLOSE, MODE_MAIN, 2);                                   // 2 бар
   ADX0_2=iADX(NULL, 0, 13, PRICE_CLOSE, MODE_MAIN, 3);                                   // 3 бар
 
   ADX1_0=iADX(NULL, 0, 13, PRICE_CLOSE, MODE_PLUSDI, 1);                                 // 1 бар
   ADX1_1=iADX(NULL, 0, 13, PRICE_CLOSE, MODE_PLUSDI, 2);                                 // 2 бар
   ADX1_2=iADX(NULL, 0, 13, PRICE_CLOSE, MODE_PLUSDI, 3);                                 // 3 бар

   ADX2_0=iADX(NULL, 0, 13, PRICE_CLOSE, MODE_MINUSDI, 1);                                // 1 бар
   ADX2_1=iADX(NULL, 0, 13, PRICE_CLOSE, MODE_MINUSDI, 2);                                // 2 бар   
   ADX2_2=iADX(NULL, 0, 13, PRICE_CLOSE, MODE_MINUSDI, 3);                                // 3 бар

   AO_0=iMA(NULL,0,5,0,MODE_SMA,PRICE_MEDIAN,0)-iMA(NULL,0,34,0,MODE_SMA,PRICE_MEDIAN,0);  //0 бар
   AO_1=iMA(NULL,0,5,0,MODE_SMA,PRICE_MEDIAN,1)-iMA(NULL,0,34,0,MODE_SMA,PRICE_MEDIAN,1);  //1 бар

   St_M_0=iStochastic(NULL,PERIOD_M15,14,6,4,MODE_SMA,0,MODE_MAIN,0);                     //Значение MAIN на 0 баре;
   St_M_1=iStochastic(NULL,PERIOD_M15,14,6,4,MODE_SMA,0,MODE_MAIN,1);                     //Значение MAIN на 1 баре
   St_S_0=iStochastic(NULL,PERIOD_M15,14,6,4,MODE_SMA,0,MODE_MAIN,0);                     //Значение SIGNAL на 0 баре;
   St_S_1=iStochastic(NULL,PERIOD_M15,14,6,4,MODE_SMA,0,MODE_MAIN,1);                     //Значение SIGNAL на 1 баре;
//--------------------------------------------------------------- 5 --
   // Вычисление торговых критериев
   if(ADX0_0>ADX0_1 && ADX0_2>ADX0_1 && ADX1_0>ADX2_0 && ADX1_2>ADX2_2)
      return(10);                      // Открытие Buy    

Знакомьтесь с этим разделом учебника, формируйте формализованные правила торговли своего советника - правьте соответствующие инклюды и вперед...

 

Индикатор АО - расчитывается сразу - см. здесь.

Вместо Вашей конструкции

  AO_0=iMA(NULL,0,5,0,MODE_SMA,PRICE_MEDIAN,0)-iMA(NULL,0,34,0,MODE_SMA,PRICE_MEDIAN,0);  //0 бар
   AO_1=iMA(NULL,0,5,0,MODE_SMA,PRICE_MEDIAN,1)-iMA(NULL,0,34,0,MODE_SMA,PRICE_MEDIAN,1);  //1 бар
Причина обращения: