//+------------------------------------------------------------------+ //| iK_pair-tr.mq4 | //| Ivan Katsko | //| ICQ:372739628 | //+------------------------------------------------------------------+ #property copyright "Ivan Katsko" #property link "ICQ:372739628" #property indicator_separate_window #property indicator_buffers 4 #property indicator_color1 Red #property indicator_color2 Green #property indicator_color3 Blue //---- indicator parameters extern string bas_SYMB="EURUSD"; extern string sec_SYMB="USDCHF"; extern int History=288; extern double Precision=5; extern int MA_Period=1; //---- indicator buffers double Delta[]; double delta_coef_cor[]; double up[]; double dn[]; double ExtMapBuffer[]; double ExtMapBuffer1[]; double coef_cor[256]; //---- bool New_Bar=false; // Флаг нового бара static datetime New_Time; int ExtCountedBars=0; double coef=0, cor_ind, bas_spread, sec_spread, pt; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- IndicatorBuffers(6); int draw_begin; string short_name; //---- indicator buffers mapping SetIndexBuffer(0,Delta); SetIndexBuffer(1,delta_coef_cor); SetIndexBuffer(2,up); SetIndexBuffer(3,dn); SetIndexBuffer(4,ExtMapBuffer); SetIndexBuffer(5,ExtMapBuffer1); //---- drawing settings SetIndexStyle(0,DRAW_HISTOGRAM,0,2); SetIndexStyle(1,DRAW_LINE); SetIndexStyle(2,DRAW_LINE); SetIndexStyle(3,DRAW_LINE); IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)); draw_begin=MA_Period-1; //---- indicator short name SetIndexDrawBegin(0,draw_begin); SetIndexDrawBegin(1,draw_begin); //---- initialization done bas_spread = MarketInfo(bas_SYMB,MODE_SPREAD)*Point; sec_spread = MarketInfo(sec_SYMB,MODE_SPREAD)*Point; cor_ind = correl(bas_SYMB, sec_SYMB, 0, History); return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { ObjectsDeleteAll(); return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { IndicatorShortName(bas_SYMB+"/"+sec_SYMB+" pt="+DoubleToStr(pt/Point,0)+" cor="+DoubleToStr(cor_ind,4)); Fun_New_Bar(); if(Bars<=MA_Period) return(0); ExtCountedBars=IndicatorCounted(); //---- check for possible errors if (ExtCountedBars<0) return(-1); //---- last counted bar will be recounted if (ExtCountedBars>0) ExtCountedBars--; //---- if (New_Bar) { ObjectsDeleteAll(); SetIndexStyle(0,DRAW_HISTOGRAM,0,2); cor_ind = correl(bas_SYMB, sec_SYMB, 0, History); } //---- done return(0); } //------------------вычисляем корреляцию------------------------------------------------------- double correl(string symb1, string symb2, int tf, int hst) { double a1,a2; double thisl1_2; double sumraz_1, sumraz_2; double znamen1_2, correl_1_2; double signal1[256]; double signal2[256]; ArrayResize(signal1, hst); ArrayResize(signal2, hst); ArrayResize(coef_cor, hst); ArrayCopySeries(signal1,MODE_CLOSE,symb1,tf); ArrayCopySeries(signal2,MODE_CLOSE,symb2,tf); for (int q=0;q 0) { for (q3=0;q3= min+(q5-q6)*Point) { if (coef_cor[q3] <= min+(q5+q6)*Point) { cnt++; } } } if (cnt > cnt_max) { cnt_max = cnt; coef = min+q5*Point; } } if (cnt_max > Precision*0.01*hst) break; } for (q3=0;q3 1) { for (q3=0;q30;q3--) { if (delta_coef_cor[q3] >= dn[q3] && delta_coef_cor[q3] <= up[q3]) work = true; double bas_delta, sec_delta; if (work) { switch (start_variant) { case 1: bas_delta = bas_start_price-iClose(bas_SYMB,0,q3+1); if (MarketInfo(bas_SYMB,MODE_DIGITS) < 4) bas_delta /= 100; sec_delta = iClose(sec_SYMB,0,q3+1)-sec_start_price; if (MarketInfo(sec_SYMB,MODE_DIGITS) < 4) sec_delta /= 100; Delta[q3] = bas_delta + sec_delta; if (Delta[q3] > 0 && delta_coef_cor[q3] > delta_coef_cor[q3+1] && delta_coef_cor[q3+1] < 0 && start) { ObjectCreate(DoubleToStr(q3,0),OBJ_VLINE,0,Time[q3],0,0,0,0,0); ObjectSet(DoubleToStr(q3,0),OBJPROP_COLOR,DarkTurquoise); pt += Delta[q3]; start = false; } break; case 2: bas_delta = iClose(bas_SYMB,0,q3+1)-bas_start_price; if (MarketInfo(bas_SYMB,MODE_DIGITS) < 4) bas_delta /= 100; sec_delta = sec_start_price-iClose(sec_SYMB,0,q3+1); if (MarketInfo(sec_SYMB,MODE_DIGITS) < 4) sec_delta /= 100; Delta[q3] =bas_delta + sec_delta; if (Delta[q3] > 0 && delta_coef_cor[q3] < delta_coef_cor[q3+1] && delta_coef_cor[q3+1] > 0 && start) { ObjectCreate(DoubleToStr(q3,0),OBJ_VLINE,0,Time[q3],0,0,0,0,0); ObjectSet(DoubleToStr(q3,0),OBJPROP_COLOR,Magenta); pt += Delta[q3]; start = false; } break; case 3: bas_delta = bas_start_price-iClose(bas_SYMB,0,q3+1); if (MarketInfo(bas_SYMB,MODE_DIGITS) < 4) bas_delta /= 100; sec_delta = sec_start_price-iClose(sec_SYMB,0,q3+1); if (MarketInfo(sec_SYMB,MODE_DIGITS) < 4) sec_delta /= 100; Delta[q3] = bas_delta + sec_delta; if (Delta[q3] > 0 && delta_coef_cor[q3] > delta_coef_cor[q3+1] && delta_coef_cor[q3+1] < 0 && start) { ObjectCreate(DoubleToStr(q3,0),OBJ_VLINE,0,Time[q3],0,0,0,0,0); ObjectSet(DoubleToStr(q3,0),OBJPROP_COLOR,DarkTurquoise); pt += Delta[q3]; start = false; } break; case 4: bas_delta = iClose(bas_SYMB,0,q3+1)-bas_start_price; if (MarketInfo(bas_SYMB,MODE_DIGITS) < 4) bas_delta /= 100; bas_delta = iClose(bas_SYMB,0,q3+1)-bas_start_price; if (MarketInfo(sec_SYMB,MODE_DIGITS) < 4) sec_delta /= 100; Delta[q3] =bas_delta + sec_delta; if (Delta[q3] > 0 && delta_coef_cor[q3] < delta_coef_cor[q3+1] && delta_coef_cor[q3+1] > 0 && start) { ObjectCreate(DoubleToStr(q3,0),OBJ_VLINE,0,Time[q3],0,0,0,0,0); ObjectSet(DoubleToStr(q3,0),OBJPROP_COLOR,Magenta); pt += Delta[q3]; start = false; } break; } if (delta_coef_cor[q3] < delta_coef_cor[q3+1] && delta_coef_cor[q3+1] > 0 && !start) { if (correl_1_2 > 0) { bas_start_price = iClose(bas_SYMB,0,q3+1)-bas_spread; sec_start_price = iClose(sec_SYMB,0,q3+1)+sec_spread; start_variant = 1; // bas_SYMB продаем, sec_SYMB покупаем } if (correl_1_2 < 0) { bas_start_price = iClose(bas_SYMB,0,q3+1)-bas_spread; sec_start_price = iClose(sec_SYMB,0,q3+1)-sec_spread; start_variant = 3; // bas_SYMB продаем, sec_SYMB покупаем } ObjectCreate(DoubleToStr(q3,0),OBJ_VLINE,0,Time[q3],0,0,0,0,0); ObjectSet(DoubleToStr(q3,0),OBJPROP_COLOR,Green); start = true; } if (delta_coef_cor[q3] > delta_coef_cor[q3+1] && delta_coef_cor[q3+1] < 0 && !start) { if (correl_1_2 > 0) { bas_start_price = iClose(bas_SYMB,0,q3+1)+bas_spread; sec_start_price = iClose(sec_SYMB,0,q3+1)-sec_spread; start_variant = 2; // bas_SYMB покупаем, sec_SYMB продаем } if (correl_1_2 < 0) { bas_start_price = iClose(bas_SYMB,0,q3+1)+bas_spread; sec_start_price = iClose(sec_SYMB,0,q3+1)+sec_spread; start_variant = 4; // bas_SYMB покупаем, sec_SYMB продаем } ObjectCreate(DoubleToStr(q3,0),OBJ_VLINE,0,Time[q3],0,0,0,0,0); start = true; } } } double h = NormalizeDouble(History,0); double p = NormalizeDouble(Period(),0); pt = pt/(h*p/60/24); return(correl_1_2); } //+------------------------------------------------------------------+ void Fun_New_Bar() // Ф-ия обнаружения нового бара { New_Bar=false; // Нового бара нет if(New_Time!=Time[0]) { // Сравниваем время New_Time=Time[0]; // Теперь время такое New_Bar=true; // Поймался новый бар } }