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

 

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

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

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

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

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

 
Вам бы лучше к экстрасенсам обратиться. Если что - ссылку дам
 
"или где-то"
 

ИНДИКАТОР 

#property strict
#property indicator_separate_window
#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);
 

Вставляйте код правильно: Правильно вставляем код на форуме.  И перед вставкой кода в MetaEditore применяйте стилизацию кода: Работа с исходным кодом: Стилизатор - Разработка программ.

Ваш код я уже вставил правильно.

 
uprogs:

ИНДИКАТОР 


У Вас в индикаторе расчет производится по истории. 

Переменная limit на текущих данных меньше нуля

limit=Bars-counted_bars-(DetectMinMax+periodAMA)-1;

 Поставьте Print() и проверьте. Но только когда рынок будет работать

 
То есть в тестере погонять я его не смогу, ничего не меняя? Так? А так хотелось... Может что-то поменять можно? И вообще тестер же на истории и работает или как?
 
uprogs:
То есть в тестере погонять я его не смогу, ничего не меняя? Так? А так хотелось... Может что-то поменять можно? И вообще тестер же на истории и работает или как?

Попробуй

 

#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_minimum 0.0
#property indicator_maximum 1.0
#property indicator_label1  "BUY"
#property indicator_color1 clrBlue
#property indicator_label2  "SELL"
#property indicator_color2 clrRed
#property indicator_label3  "STOP"
#property indicator_color3 clrGray

// ---- input parameters
// париод АМА
input int periodAMA=30;
input 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;
   double Signal,Noise,ER,SSC;
   double AMAmax,AMAmin,Filter;
   if(Bars< DetectMinMax || Bars < periodAMA) return(0);

   int limit1=Bars-counted_bars;
   int limit2=limit1;
   int limit3=limit1;

   if(limit1>1)
     {
      limit1=Bars-periodAMA-1;
      limit2=limit1-periodAMA;
      limit3=limit2-DetectMinMax;
     }

   for(i=limit1; 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=limit2; i>=0; i--)
      StdAMA[i]=iStdDevOnArray(AMAbuffer,0,periodAMA,0,MODE_SMA,i);

// заполнение индикатора
   for(i=limit3; 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);
  }
//+------------------------------------------------------------------+
 
Благодарю!! Попробую!
Причина обращения: