Скачать MetaTrader 5

Новые функции в MQL4 или почему не работает iCustom()?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Forex Trader
114280
Forex Trader  
Здравствуйте. Скачал с Кроуфа индикатор:

#property copyright "GrayMan77"
#property link      ""

#property indicator_separate_window
#property indicator_buffers 5
#property indicator_color1 Green
#property indicator_color2 Blue
#property indicator_color3 Red
#property indicator_color4 LightGray
#property indicator_color5 Maroon

#property indicator_level1 30
#property indicator_level2 50
#property indicator_level3 70
//#property indicator_minimum 0
//#property indicator_maximum 100

//---- Внешние параметры

extern int RSIPeriod=12;
extern int Smooth=10;
extern int PeriodFirstEMA=3; // Первичное сглаживание - период
extern int PriceFirstEMA=6;  // Первичное сглаживание - цена:
                             //  0-Close; 1-Open; 2-High; 3-Low; 4-(H+L)/2; 5-(H+L+C)/3; 6-(H+L+C+C)/4.

//---- Буферы индикатора

double IndexBuffer0[],Buffer0[],RSIBuffer0[];
double IndexBuffer1[],Buffer1[],RSIBuffer1[];
double IndexBuffer2[],Buffer2[],RSIBuffer2[];
double IndexBuffer3[],Buffer3[],RSIBuffer3[];
double IndexBuffer4[],Buffer4[],RSIBuffer4[];

//---- Переменные

int BarsMin;
double div;
int indBars; // храним значение Bars

//----

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators

   SetIndexBuffer(0,RSIBuffer0);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(1,RSIBuffer1);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(2,RSIBuffer2);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(3,RSIBuffer3);
   SetIndexStyle(3,DRAW_LINE);
   SetIndexBuffer(4,RSIBuffer4);
   SetIndexStyle(4,DRAW_LINE);   


   ArraySetAsSeries(IndexBuffer0,true);
   ArraySetAsSeries(IndexBuffer1,true);
   ArraySetAsSeries(IndexBuffer2,true);
   ArraySetAsSeries(IndexBuffer3,true);
   ArraySetAsSeries(IndexBuffer4,true);
   ArraySetAsSeries(Buffer0,true);
   ArraySetAsSeries(Buffer1,true);
   ArraySetAsSeries(Buffer2,true);
   ArraySetAsSeries(Buffer3,true);
   ArraySetAsSeries(Buffer4,true);
   
   IndicatorShortName("USD:Зеленый; EUR:Синий; GBP:Красный; CHF:Серый; JPY:Коричневый");
   SetIndexLabel(0,"USD");
   SetIndexLabel(1,"EUR");
   SetIndexLabel(2,"GBP");
   SetIndexLabel(3,"CHF");
   SetIndexLabel(4,"JPY");

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{//1
   int limit,i;
   int counted_bars=IndicatorCounted();
   //---- проверка на возможные ошибки
   if(counted_bars<0) return(-1);
   //---- вычисление минимального кол-ва баров (длины отображаемого графика)

   if(counted_bars==0)
   {//2
      BarsMin=iBars("GBPUSD",NULL);
      if(BarsMin>iBars("USDCHF",NULL)) BarsMin=iBars("USDCHF",NULL);
      if(BarsMin>iBars("EURUSD",NULL)) BarsMin=iBars("EURUSD",NULL);
      if(BarsMin>iBars("USDJPY",NULL)) BarsMin=iBars("USDJPY",NULL);
      if(BarsMin>iBars("EURGBP",NULL)) BarsMin=iBars("EURGBP",NULL);
      if(BarsMin>iBars("EURCHF",NULL)) BarsMin=iBars("EURCHF",NULL);
      if(BarsMin>iBars("EURJPY",NULL)) BarsMin=iBars("EURJPY",NULL);
      if(BarsMin>iBars("GBPCHF",NULL)) BarsMin=iBars("GBPCHF",NULL);
      if(BarsMin>iBars("GBPJPY",NULL)) BarsMin=iBars("GBPJPY",NULL);
      if(BarsMin>iBars("CHFJPY",NULL)) BarsMin=iBars("CHFJPY",NULL);
   }//2

   // Если появился новый бар, увеличиваем размерность массива и сдвигаем значения на единицу

   if (isNewBar()) 
   {//3
      ArrayResize(IndexBuffer0,Bars);
      ArrayResize(IndexBuffer1,Bars);
      ArrayResize(IndexBuffer2,Bars);
      ArrayResize(IndexBuffer3,Bars);
      ArrayResize(IndexBuffer4,Bars);
      ArrayResize(Buffer0,Bars);
      ArrayResize(Buffer1,Bars);
      ArrayResize(Buffer2,Bars);
      ArrayResize(Buffer3,Bars);
      ArrayResize(Buffer4,Bars);
      for(i=Bars-1;i>0;i--)
      {//4
         IndexBuffer0[i] = IndexBuffer0[i-1];
         IndexBuffer1[i] = IndexBuffer1[i-1];
         IndexBuffer2[i] = IndexBuffer2[i-1];
         IndexBuffer3[i] = IndexBuffer3[i-1];
         IndexBuffer4[i] = IndexBuffer4[i-1];
         Buffer0[i] = Buffer0[i-1];
         Buffer1[i] = Buffer1[i-1];
         Buffer2[i] = Buffer2[i-1];
         Buffer3[i] = Buffer3[i-1];
         Buffer4[i] = Buffer4[i-1];
      }//4
      IndexBuffer0[0] = 0.;
      IndexBuffer1[0] = 0.;
      IndexBuffer2[0] = 0.;
      IndexBuffer3[0] = 0.;
      IndexBuffer4[0] = 0.;
      Buffer0[0]  = 0.;
      Buffer1[0] = 0.;
      Buffer2[0] = 0.;
      Buffer3[0] = 0.;
      Buffer4[0] = 0.;
   }//3

     
   //---- последний посчитанный бар будет пересчитан
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
   if(limit>BarsMin-2) limit=BarsMin-2;
  
  //---- основной цикл: Вычисление индексов

   for(i=limit;i>=0;i--)
   {//5
      IndexBuffer0[i] = USD(i);
      IndexBuffer1[i] = EUR(i);
      IndexBuffer2[i] = GBP(i);
      IndexBuffer3[i] = CHF(i);
      IndexBuffer4[i] = JPY(i);
   }//5
     
   //---- Вычисление RSI от индексов

   for(i=limit;i>=0;i--)
   {//6
      Buffer0[i] = iRSIOnArray(IndexBuffer0,0,RSIPeriod,i);
      Buffer1[i] = iRSIOnArray(IndexBuffer1,0,RSIPeriod,i);
      Buffer2[i] = iRSIOnArray(IndexBuffer2,0,RSIPeriod,i);
      Buffer3[i] = iRSIOnArray(IndexBuffer3,0,RSIPeriod,i);
      Buffer4[i] = iRSIOnArray(IndexBuffer4,0,RSIPeriod,i);
   }//6
       
     //---- Сглаживание RSI


   for(i=limit;i>=0;i--)
   {//7
      RSIBuffer0[i] = iMAOnArray(Buffer0,0,Smooth,0,MODE_EMA,i);
      RSIBuffer1[i] = iMAOnArray(Buffer1,0,Smooth,0,MODE_EMA,i);
      RSIBuffer2[i] = iMAOnArray(Buffer2,0,Smooth,0,MODE_EMA,i);
      RSIBuffer3[i] = iMAOnArray(Buffer3,0,Smooth,0,MODE_EMA,i);
      RSIBuffer4[i] = iMAOnArray(Buffer4,0,Smooth,0,MODE_EMA,i);
   }//7

//   Comment("USD: "+IndexBuffer[0]+" EUR: "+IndexBuffer1[0]);

   return(0);
}//1




//+------------------------------------------------------------------+
double USD(int j)
{//1
   double value;
   datetime TimeBar=Time[j];
   double GBP_USD=iMA("GBPUSD",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("GBPUSD",NULL,TimeBar,false));
   double USD_CHF=iMA("USDCHF",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("USDCHF",NULL,TimeBar,false));
   double EUR_USD=iMA("EURUSD",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("EURUSD",NULL,TimeBar,false));
   double USD_JPY=iMA("USDJPY",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("USDJPY",NULL,TimeBar,false));
   // Проверка для исключения деления на 0
   if(GBP_USD==0) GBP_USD=1.;
   if(EUR_USD==0) EUR_USD=1.;
   value = MathPow(USD_CHF*USD_JPY/GBP_USD/EUR_USD,0.2);
   return(value);
}//1
//+------------------------------------------------------------------+
double GBP(int j)
{//1
   double value;
   datetime TimeBar=Time[j];
   double GBP_USD=iMA("GBPUSD",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("GBPUSD",NULL,TimeBar,false));
   double EUR_GBP=iMA("EURGBP",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("EURGBP",NULL,TimeBar,false));
   double GBP_CHF=iMA("GBPCHF",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("GBPCHF",NULL,TimeBar,false));
   double GBP_JPY=iMA("GBPJPY",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("GBPJPY",NULL,TimeBar,false));
   // Проверка для исключения деления на 0
   if(EUR_GBP==0) EUR_GBP=1.;
   value = MathPow(GBP_USD*GBP_CHF*GBP_JPY/EUR_GBP,0.2);
   return(value);
}//1
//+------------------------------------------------------------------+
double EUR(int j)
{//1
   double value;
   datetime TimeBar=Time[j];
   double EUR_USD=iMA("EURUSD",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("EURUSD",NULL,TimeBar,false));
   double EUR_GBP=iMA("EURGBP",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("EURGBP",NULL,TimeBar,false));
   double EUR_CHF=iMA("EURCHF",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("EURCHF",NULL,TimeBar,false));
   double EUR_JPY=iMA("EURJPY",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("EURJPY",NULL,TimeBar,false));
   value = MathPow(EUR_USD*EUR_GBP*EUR_CHF*EUR_JPY,0.2);
   return(value);
}//1
//+------------------------------------------------------------------+
double CHF(int j)
{//1
   double value;
   datetime TimeBar=Time[j];
   double USD_CHF=iMA("USDCHF",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("USDCHF",NULL,TimeBar,false));
   double EUR_CHF=iMA("EURCHF",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("EURCHF",NULL,TimeBar,false));
   double GBP_CHF=iMA("GBPCHF",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("GBPCHF",NULL,TimeBar,false));
   double CHF_JPY=iMA("CHFJPY",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("CHFJPY",NULL,TimeBar,false));
   // Проверка для исключения деления на 0
   if(USD_CHF==0) USD_CHF=1.;
   if(EUR_CHF==0) EUR_CHF=1.;
   if(GBP_CHF==0) GBP_CHF=1.;
   value = MathPow(CHF_JPY/USD_CHF/EUR_CHF/GBP_CHF,0.2);
   return(value);
}//1
//+------------------------------------------------------------------+
double JPY(int j)
{//1
   double value;
   datetime TimeBar=Time[j];
   double USD_JPY=iMA("USDJPY",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("USDJPY",NULL,TimeBar,false));
   double EUR_JPY=iMA("EURJPY",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("EURJPY",NULL,TimeBar,false));
   double GBP_JPY=iMA("GBPJPY",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("GBPJPY",NULL,TimeBar,false));
   double CHF_JPY=iMA("CHFJPY",NULL,PeriodFirstEMA,0,1,PriceFirstEMA,iBarShift("CHFJPY",NULL,TimeBar,false));
   // Проверка для исключения деления на 0
   if(USD_JPY==0) USD_JPY=1.;
   if(EUR_JPY==0) EUR_JPY=1.;
   if(GBP_JPY==0) GBP_JPY=1.;
   if(CHF_JPY==0) CHF_JPY=1.;
   value = MathPow(1./USD_JPY/EUR_JPY/GBP_JPY/CHF_JPY,0.2);
   return(value);
}//1
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| возвращает true если появлися новый бар, иначе false             |
//+------------------------------------------------------------------+
bool isNewBar()
{//1
   bool res=false; 
   if (indBars!=Bars) 
   {//2
      indBars=Bars;
      res=true;
   }//2 
   return(res);
}//2



..вроде нормально работает, но не получить его значение функцией iCustom().. комментом проверяю массив связанный с буфером индикатора - есть значения.. однако iCustom() вместо значения возвращает double, заполенный до отказа.. Что тут не так, не подскажите? Скорее всего это связано, видимо, с функциями iMAOnArray() и iRSIOnArray()..

Forex Trader
114280
Forex Trader  
Млин, разобрался.. всему виной отсутствие графиков необходимых пар.. но ведь что интересно, индикатор работает и без них.. Вопрос: откуда он тогда что берет? Млин, не МТ4, а чудеса в решете.. :)
Forex Trader
114280
Forex Trader  
Еще раз, здравствуйте. Ну что, никто не смотрел? Почему индикатор показывает, а функцией iCustom() значение получить невозможно, если котировок нет.. Что показывает индикатор?
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий