Млин, разобрался.. всему виной отсутствие графиков необходимых пар.. но ведь что интересно, индикатор работает и без них.. Вопрос: откуда он тогда что берет? Млин, не МТ4, а чудеса в решете.. :)
Еще раз, здравствуйте. Ну что, никто не смотрел? Почему индикатор показывает, а функцией iCustom() значение получить невозможно, если котировок нет.. Что показывает индикатор?
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
#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()..