Нужна помощь в создании АТС на базе индикатора YangTrader (АТС не открывает позиции, ошибок при компиляции нет)

 

Здравствуйте уважаемые программисты - трейдеры. Вот уже почти год тестю индикатор YangTrader и очень доволен данным индикатором. Код данного индикатора прикладывается ниже ( автор: yangshu).

//--  Original Author : yangshu --//
//--  copyright YangShu 2011    --//
//--  Email:yangshu@yangshu.net --//
//--  Web: http://yangshu.net   --//
#property copyright "СоКчґґУЪ2011Дк1ФВ9ИХЈ¬2011Дк6ФВ25ИХФЩРЮёД" 
#property link      "http://yangshu.net" 
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1  DeepSkyBlue

#property indicator_level1 15
#property indicator_level2 35
#property indicator_level3 80
#property indicator_levelcolor Gray

#property indicator_minimum 0
#property indicator_maximum 100
extern int TimeWindow=34;
extern int Sensitive=8;
double buf[];
double buf2[];

int init()
  {
   SetIndexBuffer(0,buf);
   ArraySetAsSeries(buf,true);
   SetIndexStyle(0,DRAW_LINE);
   IndicatorShortName("YangTrader (13,21,34,55,89,144) - http://yangshu.net");
   return(0);
  }

int start()
  {
   int limit=Bars;

   ArrayResize(buf2,limit); 
   ArraySetAsSeries(buf2,true);
   for(int i=0; i<limit; i++)
    {
       double HHV=High[iHighest(NULL,0,MODE_HIGH,TimeWindow,i)];
       double LLV=Low[iLowest(NULL,0,MODE_LOW,TimeWindow,i)]; 
       buf2[i]=100*(Close[i]-LLV)/(HHV-LLV);
    }
   ArrayResize(buf,limit); 
   ArraySetAsSeries(buf,true);
   for(i=0; i<limit; i++) buf[i]=iMAOnArray(buf2,limit,Sensitive,0,MODE_LWMA,i);  
   return(0);
  }

Хочу сразу сказать огромное спасибо участникам данного форума, а именно: Alekseu Fedotov, Aleksey Rodionov, Vitaly Muzichenko, за посильную помощь в разборе ошибок в коде MQL4.

Вот решил на основе вышеуказанного индикатора создать АТС. Код советника располагается ниже. Условие открытие позиций, пересечение сигнальной уровней 15,80 с права. 

#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

//------------------параметры советника -------------------------------
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1  DeepSkyBlue
#property indicator_minimum 0
#property indicator_maximum 100
#property indicator_levelcolor Gray
extern int     LevelSell            = 80;
extern int     LevelBuy             = 15;
extern int     LevelStop            = 35;// sellstop. baustop
extern double lots=0.01; //
extern int Magic=111111111;
extern int Slippage=1;
extern int TimeWindow=34;
extern int Sensitive=8;
double HHV=0;
double LLV=0;
//----------------------------------------------------------------------
double buf[];
double buf2[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
      if(Digits==3 || Digits==5)//EURJPY 125.429, EURUSD 1.32164
      if(Digits==2 || Digits==4)// AUDJPY 87.75,  EURAUD 1,4271
        {
         Slippage*=10;
        }
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
  {
   int limit=Bars;
   int ticket;//

   ArrayResize(buf2,limit); 
   ArraySetAsSeries(buf2,true);
   for(int i=0; i<limit; i++)
    {
       HHV=High[iHighest(NULL,0,MODE_HIGH,TimeWindow,i)];
       LLV=Low[iLowest(NULL,0,MODE_LOW,TimeWindow,i)]; 
       buf2[i]=100*(Close[i]-LLV)/(HHV-LLV);
    }
   ArrayResize(buf,limit); 
   ArraySetAsSeries(buf,true);
   for(int i=0; i<limit; i++) buf[i]=iMAOnArray(buf2,limit,Sensitive,0,MODE_LWMA,i);
  //+------------------------------------------------------------------+ 
   
     if(CountSell()==0 && HHV>LevelSell && LLV>LevelSell)// открытие продаж
     {
      ticket=OrderSend(Symbol(),OP_SELL,lots,Bid,Slippage,0,0,"ATR for YangTrader",Magic,0,clrNONE);
     }
   //
     if(CountSell()>0 && HHV<LevelBuy && LLV<LevelBuy)// закрытие продаж
     {
      for(int i=OrdersTotal()-1; i>=0; i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
           {
            if(OrderMagicNumber()==Magic && OrderType()==OP_SELL)
               if(OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,clrNONE))
                  Print("Ошибка открытия ордера на покупку !");
           }
        }
     }
//+------------------------------------------------------------------+  
  if(CountBuy()==0 && HHV<LevelBuy && LLV<LevelBuy)// открытие покупок
     {
      ticket=OrderSend(Symbol(),OP_BUY,lots,Ask,Slippage,0,0,"советник",Magic,0,clrNONE);
     }
//  
     if(CountBuy()>0 && HHV>LevelSell && LLV>LevelSell)// закрытие покупок
     {
      for(int i=OrdersTotal()-1; i>=0; i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
           {
            if(OrderMagicNumber()==Magic && OrderType()==OP_BUY)
               if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,clrNONE))
                  Print("Ошибка открытия ордера на продажу!");
           }
        }
     }   
    return(0);
  }
 //+------------------------------------------------------------------+
int CountSell()//проверкна открытие ордеров на продажу
  {
   int count=0;

   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES)==true)
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_SELL)
           {
            if(OrderType()==OP_SELL)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
int CountBuy()// проверкна открытие ордеров на покупку
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES)==true)
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
           {
            if(OrderType()==OP_BUY)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+

Если не трудно, подскажите пожалуйста, в чём проблема.

 
Это же самый обычный стохастик с периодом 34, замедлением 1 и сигнальной LWMA периода 8, рисуется только сигнальная. В кодобазе стотыщ сов на стохастике, попробуйте их.
 
SeriousRacoon:
Это же самый обычный стохастик с периодом 34, замедлением 1 и сигнальной LWMA периода 8, рисуется только сигнальная. В кодобазе стотыщ сов на стохастике, попробуйте их.
Нашел и посмотрел предложенную Вами АТС. Идея похожа, но смысл немного не тот. 
 
Игорь:
Нашел и посмотрел предложенную Вами АТС. Идея похожа, но смысл немного не тот. 

Допилите условия входа в сделку в соответствие со своей стратегией, дел-то на 2 минуты.

Смысл в том, что YangTrader - это формула стохастика в чистом виде. Вы год тестировали стохастик с нестандартными настройками, только и всего.

 
SeriousRacoon:

Допилите условия входа в сделку в соответствие со своей стратегией, дел-то на 2 минуты.

Смысл в том, что YangTrader - это формула стохастика в чистом виде. Вы год тестировали стохастик с нестандартными настройками, только и всего.

Извините, но может, что то я не понимаю, но если АТС основан на стохастике, то там формируют 3 параметра.

sto_main_curr  = iStochastic (Symbol() ,PERIOD_CURRENT ,k_period ,d_period ,slowing ,ma_method ,price_field ,MODE_MAIN   ,0);
   sto_sign_curr  = iStochastic (Symbol() ,PERIOD_CURRENT ,k_period ,d_period ,slowing ,ma_method ,price_field ,MODE_SIGNAL ,0);
   sto_main_prev1 = iStochastic (Symbol() ,PERIOD_CURRENT ,k_period ,d_period ,slowing ,ma_method ,price_field ,MODE_MAIN   ,1);
   sto_sign_prev1 = iStochastic (Symbol() ,PERIOD_CURRENT ,k_period ,d_period ,slowing ,ma_method ,price_field ,MODE_SIGNAL ,1);
   sto_main_prev2 = iStochastic (Symbol() ,PERIOD_CURRENT ,k_period ,d_period ,slowing ,ma_method ,price_field ,MODE_MAIN   ,2);
   sto_sign_prev2 = iStochastic (Symbol() ,PERIOD_CURRENT ,k_period ,d_period ,slowing ,ma_method ,price_field ,MODE_SIGNAL ,2);

У меня же АТС "ближе" к Демакеру (который встроен в мт4 по умолчанию).

Это мой 2 советник который основан на осцилляторах. Условие входа вот такое

 if(CountSell()==0 && HHV>LevelSell && LLV>LevelSell)// открытие продаж
     {
      ticket=OrderSend(Symbol(),OP_SELL,lots,Bid,Slippage,0,0,"ATR for YangTrader",Magic,0,clrNONE);
     }

Закрытие позиции происходит вот так

 if(CountSell()>0 && HHV<LevelBuy && LLV<LevelBuy)// закрытие продаж
     {
      for(int i=OrdersTotal()-1; i>=0; i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
           {
            if(OrderMagicNumber()==Magic && OrderType()==OP_SELL)
               if(OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,clrNONE))
                  Print("Ошибка открытия ордера на покупку !");
           }
        }
     }

То есть позиция закрывается и открывается автоматически противоположная сделка.  В АТС нет стопа и тейка.

Дело в том, что структура данной АТС, уже мною отработана и она работоспособна (был создана работоспособная АТС на базе Демарка). В выше представленном мною коде (АТС на основе индикатора YangTrader) есть логическая ошибка, которую я не могу увидеть.  По причине того, что при компиляции советника, ошибок и предупреждений нет. 

 
Игорь:

Извините, но может, что то я не понимаю, но если АТС основан на стохастике, то там формируют 3 параметра.

У меня же АТС "ближе" к Демакеру (который встроен в мт4 по умолчанию).

Это мой 2 советник который основан на осцилляторах. Условие входа вот такое

Закрытие позиции происходит вот так

То есть позиция закрывается и открывается автоматически противоположная сделка.  В АТС нет стопа и тейка.

Дело в том, что структура данной АТС, уже мною отработана и она работоспособна (был создана работоспособная АТС на базе Демарка). В выше представленном мною коде (АТС на основе индикатора YangTrader) есть логическая ошибка, которую я не могу увидеть.  По причине того, что при компиляции советника, ошибок и предупреждений нет. 

Тут две логические ошибки.

Во-1, как я сказал выше, янгтрейдер - это сигнальная стохастика, т.е. вызов с такими параметрами (по умолчанию для янгтрейдера):

iStochastic(NULL, 0, 34, 8, 1, MODE_LWMA, 0, MODE_SIGNAL, nBar);

где nBar - требуемый бар.

Поместите на график стохастик с такими настройками и попробуйте найти разницу:


Во-2, смотрите, что вы делаете.

if (HHV > LevelSell && LLV > LevelSell) - вы берёте highest high и lowest low баров за период TimeWindow и сравниваете их со значениями уровней индикатора. Наверное, вы хотели сравнивать значения индикатора.

Сам индюк написан безобразно, он на каждом тике пересчитывает все значения. Уберите его код из совы и замените на этот вызов стохастика.

 
Игорь:

Извините, но может, что то я не понимаю, но если АТС основан на стохастике, то там формируют 3 параметра.

У меня же АТС "ближе" к Демакеру (который встроен в мт4 по умолчанию).

Это мой 2 советник который основан на осцилляторах. Условие входа вот такое

Закрытие позиции происходит вот так

То есть позиция закрывается и открывается автоматически противоположная сделка.  В АТС нет стопа и тейка.

Дело в том, что структура данной АТС, уже мною отработана и она работоспособна (был создана работоспособная АТС на базе Демарка). В выше представленном мною коде (АТС на основе индикатора YangTrader) есть логическая ошибка, которую я не могу увидеть.  По причине того, что при компиляции советника, ошибок и предупреждений нет. 

Зачем вы, весь код индикатора засунули в советник

достаточно

double YangTrader=iCustom(NULL,0,"YangTrader",0,1);
 
SeriousRacoon:

Тут две логические ошибки.

Во-1, как я сказал выше, янгтрейдер - это сигнальная стохастика, т.е. вызов с такими параметрами (по умолчанию для янгтрейдера):

где nBar - требуемый бар.

Поместите на график стохастик с такими настройками и попробуйте найти разницу:


Во-2, смотрите, что вы делаете.

if (HHV > LevelSell && LLV > LevelSell) - вы берёте highest high и lowest low баров за период TimeWindow и сравниваете их со значениями уровней индикатора. Наверное, вы хотели сравнивать значения индикатора.

Сам индюк написан безобразно, он на каждом тике пересчитывает все значения. Уберите его код из совы и замените на этот вызов стохастика.

Да, Вы правильно меня поняли  (Наверное, вы хотели сравнивать значения индикатора.). Я попробую изменить код.Спасибо.

 
Alekseu Fedotov:

Зачем вы, весь код индикатора засунули в советник

достаточно

Спасибо за помощь.
Причина обращения: