//+------------------------------------------------------------------+ //| MI_Spread.mq4 | //| Орешкин А.В. | //| http://www.vk.com/mtforex | //+------------------------------------------------------------------+ #property copyright "Орешкин А.В." #property link "http://www.vk.com/mtforex" #property indicator_separate_window #property indicator_buffers 1 #property indicator_color1 Aqua #property indicator_style1 0 #property indicator_width1 1 extern string Pairs1= "GBPUSD"; extern string Pairs2= "EURUSD"; extern bool Invert1= false;//Инвертирование пары extern bool Invert2= false;//Инвертирование пары extern double Power1= 1; //возведение в степень extern double Power2= 1; //возведение в степень extern double Multi1= 1; //множитель extern double Multi2= 1; //множитель extern double Plus1= 0; //это число добавляется к цене extern double Plus2= 0; //это число добавляется к цене extern int MA= 0;//Сглаживать или нет данные. 0-нет, не 0 - период сглаживания по МА simple extern bool Ln= true;//применять логарифмирование цены или нет extern string Action= "-"; //Аналогичные действия над результатом extern bool R_Invert= false; extern double R_Power= 1; //возведение в степень extern double R_Multi= 1; //множитель extern double R_Plus= 0; //это число добавляется к цене //Общие настройки extern double MaxLagPercent=3;//Если изменение между клоузами более указанного % то это шпилька //и она удаляется - берёться среднее между соседними. 0 - не используется extern int Only_bars= 14400; //Сколько баров считать. 0-без ограничений. extern int Print_text= 0; //Вывод указанного количества строк на экран. Выводиться значения итогового массива. //Нужно только для проверки правильности работы int LastTime=0;//время самого старого бара на текущем графике double PC[],//массив спреда RSm[][4];//0-время,1-цена1, 2-цена2, 3 (пока не используется) int init() { SetIndexBuffer(0,PC); string name; if (Invert1) name="Inv("+Pairs1+")";else name=Pairs1; if (Multi2!=0) { name=name+Action; if (Invert2) name=name+"Inv("+Pairs2+")";else name=name+Pairs2; } if (MA>1) name=name+" MA("+MA+")"; if (Ln) name=name+" Ln ON"; if (R_Invert) name=name+" Result Invert"; IndicatorShortName(name); IndicatorDigits(7); //синхронизация истории CALCULATE(); MINUS_SHPILKI(); CHANGE_NULL(); return(0); } int deinit() { return(0); } int start() { //синхронизация текущих котировок int LastTime;//Самое новое время которое есть в синхронизированном массиве LastTime=RSm[0,0]; double pr1=0,pr2=0; while (LastTime<=MathMax(iTime(Pairs1,Period(),0),iTime(Pairs2,Period(),0))) {//true; pr1=iClose(Pairs1,Period(),iBarShift(Pairs1,Period(),LastTime,false)); pr2=iClose(Pairs2,Period(),iBarShift(Pairs2,Period(),LastTime,false)); if (RSm[0,0]!=LastTime) { ArraySetAsSeries(RSm,true); ArrayResize(RSm,ArrayRange(RSm,0)+1); ArraySetAsSeries(RSm,false); } RSm[0,0]= LastTime; RSm[0,1]= pr1; RSm[0,2]= pr2; LastTime+=Period()*60; }//true; //Вывод результатов LastTime=IndicatorCounted(); if(LastTime>0) LastTime--; LastTime=Bars-LastTime; for(int i=0; i0) { string txt=""; for (i=0;i1) { maprice=0; for (i=0;i1) { maprice=0; for (i=0;i0;i--) if (RSm[i,j]!=0 && RSm[i-1,j]!=0) if (MathAbs((RSm[i-1,j]/RSm[i,j]-1)*100)>=MaxLagPercent) {//for i Print("Убрана шпилька на паре ",para,". Время: ",TimeToStr(RSm[i-1,0])); RSm[i-1,j]=RSm[i,j]; }//for i }//for j } //Получение исходных данных и заполнение конечного массива. Вместо пропуска вставяться 0. Все данные синхронизированны по времени void CALCULATE() { //Массивы исходных данных по обоим выбранным парам double Sm1Rates[][6],Sm2Rates[][6]; int Sm1All=ArrayCopyRates(Sm1Rates,Pairs1,Period()); int Sm2All=ArrayCopyRates(Sm2Rates,Pairs2,Period()); //индексы масивов. Для каждого свои. Изначально данные беруться начиная с элемента 1, так как текущий //всё равно будет пересчитан и если пока идёт подсчёт появиться новая свечка чтобы она была корректно позже общитана int ism1=1,ism2=1,irsm=0; //Обнуляем на всякий пожарный итоговый массив ArrayResize(RSm,0); while(true) {//for if (Only_bars==0) { if (ism1>=Sm1All) break; if (ism2>=Sm2All) break; } else if (MathMin(ism1,ism2)>=MathMin(MathMin(Sm1All,Sm2All),Only_bars)) break; ArrayResize(RSm,irsm+1); if (Sm1Rates[ism1,0]==Sm2Rates[ism2,0]) {//if == RSm[irsm,0]=Sm1Rates[ism1,0]; RSm[irsm,1]=Sm1Rates[ism1,4]; RSm[irsm,2]=Sm2Rates[ism2,4]; ism1++;ism2++;irsm++; continue; }//if == if (Sm1Rates[ism1,0]>Sm2Rates[ism2,0]) {//> RSm[irsm,0]=Sm1Rates[ism1,0]; RSm[irsm,1]=Sm1Rates[ism1,4]; RSm[irsm,2]=0; ism1++;irsm++; continue; }//> if (Sm1Rates[ism1,0]