Гуру подскажите!!! iCustom и тестирование

 

Всем здрасте!

Суть в счем: есть идюк с тремя буферами по гистаграммам, либо -1 (по умолчанию) либо 1 .

Построен на нем советник. Если к графику его прикрепить он честно выдает где-то единицу, то есть трех -1 не должно быть в принципе.

А вот если в тестере, то все -1.

В связи с этим вопрос это такие ограничения в тестере mt4? Или я где-то затупливаю?

 
Точно к экстрасенсам надо
 
Хотите помощи - помочь только код может. И индикатора, и советника
 
uprogs:

Всем здрасте!

Суть в счем: есть идюк с тремя буферами по гистаграммам, либо -1 (по умолчанию) либо 1 .

Построен на нем советник. Если к графику его прикрепить он честно выдает где-то единицу, то есть трех -1 не должно быть в принципе.

А вот если в тестере, то все -1.

В связи с этим вопрос это такие ограничения в тестере mt4? Или я где-то затупливаю?

Если в индюке используются обращения к данными типа iTime,iClose,iOpen и т.д. то такой индикатор в тестере будет выдавать уже конечные данные т.е. смотреть в будущее, может по этому в тестере такие результаты.
 

ИНДИКАТОР 



#property strict
#property indicator_buffers 3
#property indicator_minimum 0.0
#property indicator_maximum 1.0
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_color3 clrGray

// ---- input parameters
// париод АМА
input int periodAMA = 30;
extern ENUM_APPLIED_PRICE PriceType=PRICE_CLOSE;
// Коэффициент умножения отклонения АМА за период АМА
input double K=1.0;
// количество баров истории для определения Макс. и Мин. АМА (развороты рынка)
input int DetectMinMax=60;

double SellBuf[], BuyBuf[], StopBuf[], StdAMA[], AMAbuffer[];
//------------------------------------------------------------------
int init()
{
// ---- indicators
IndicatorBuffers(5);
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0,SellBuf);
   SetIndexEmptyValue(0,-1);
   
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexBuffer(1,BuyBuf);
   SetIndexEmptyValue(1,-1);
   
   SetIndexStyle(2,DRAW_HISTOGRAM);
   SetIndexBuffer(2,StopBuf);
   SetIndexEmptyValue(2,-1);
   
SetIndexBuffer(3, AMAbuffer);
SetIndexBuffer(4, StdAMA);

   return(INIT_SUCCEEDED);
}
// ------------------------------------------------------------------
int deinit() {return (0);}
// ------------------------------------------------------------------
int start()
{
int counted_bars = IndicatorCounted();
// ----
int i,j, limit;
double Signal, Noise, ER, SSC;
double AMAmax, AMAmin, Filter;
if (Bars< DetectMinMax || Bars < periodAMA) return(0);

   limit = Bars - counted_bars-(DetectMinMax+periodAMA)-1;
   
for (i = limit; i >= 0; i--)
{  
   // Абслютное значение разности текущей цены и ценой в начале периода
Signal = MathAbs(Price(i) - Price(i + periodAMA));

// Сумма абсолютных приращений цены в течении вычисляемого периода
Noise=0;
for (j=i; j<=i+periodAMA-1; j++) Noise+= MathAbs(Price(j) - Price(j + 1));
// Коэффициент эффективности ER
if (Noise != 0)
   ER = Signal/Noise;
else
ER = 0;
// сглаживающая константа в квадрате
   SSC = MathPow(ER*0.60215+0.06452, 2);
   // Значение адаптивной скользящей Кауфмана
   AMAbuffer[i] = AMAbuffer[i + 1] + SSC*(Price(i)- AMAbuffer[i + 1]) ;
}
// данные стандартного отклонения АМА
for (i = limit; i >= 0; i--)
StdAMA[i] = iStdDevOnArray(AMAbuffer,0,periodAMA,0,MODE_SMA,i);
   
   // заполнение индикатора
   for (i = limit; i >= 0; i--)
   {
      //Print("i=",i);
      BuyBuf[i] = -1;
      SellBuf[i]= -1;
      StopBuf[i]= -1;
      AMAmin=100;
      AMAmax=  0;
      for (j=i; j<i+DetectMinMax; j++)
      {
        AMAmax=MathMax(AMAmax, AMAbuffer[j]);
        AMAmin=MathMin(AMAmin, AMAbuffer[j]);
      }
      Filter=K*StdAMA[i];
      if ((AMAbuffer[i]-AMAmin)>Filter)  BuyBuf[i]= 1;
      if ((AMAmax-AMAbuffer[i])>Filter) SellBuf[i]= 1;
      if (SellBuf[i]>0 && BuyBuf[i]>0)
      {
        BuyBuf[i] = -1;
        SellBuf[i]= -1;
        StopBuf[i]=  1;
      }
   } 
   
return (0);
}
//
// +------------------------------------------------------------------+
// | возвращает цену                                                  |
// +------------------------------------------------------------------+
double Price(int shift)
{
// ----
double res;
// ----
switch (PriceType)
{
case PRICE_OPEN:
res = Open[shift];
break;
case PRICE_HIGH:
res = High[shift];
break;
case PRICE_LOW:
res = Low[shift];
break;
case PRICE_MEDIAN:
res = (High[shift] + Low[shift]) / 2.0;
break;
case PRICE_TYPICAL:
res = (High[shift] + Low[shift] + Close[shift]) / 3.0;
break;
case PRICE_WEIGHTED:
res = (High[shift] + Low[shift] + 2 * Close[shift]) / 4.0;
break;
default:
res = Close[shift];
break;
}
return (res);

}

 

 

СОВЕТНИК (та часть где значения присваиваются)

      int LetsSell = (int)iCustom(Symbol(),PERIOD_M30,"AMA_SELL_BUY_STOP2",periodAMA,PriceType,K,DetectMinMax,0,0);

      int LetsBuy = (int)iCustom(Symbol(),PERIOD_M30,"AMA_SELL_BUY_STOP2",periodAMA,PriceType,K,DetectMinMax,1,0);

      int Flat = (int)iCustom(Symbol(),PERIOD_M30,"AMA_SELL_BUY_STOP2",periodAMA,PriceType,K,DetectMinMax,2,0);

      

      Print(LetsSell,LetsBuy,Flat);

 

 
Ответил на пятерке