Samo opisanije sdies' - "Канал Стандартных Отклонений"
A formuly netu....
Mozet kto v MQL4 napisat' kak custom indicator ili xot' formulu ras4itanija to4ek linij dat'? :-)
A formuly netu....
Mozet kto v MQL4 napisat' kak custom indicator ili xot' formulu ras4itanija to4ek linij dat'? :-)
Формула простая, Ищем сумму [ Close[i]-Y(i) ]^2, где Y=A+B*i, и требуем чтобы эта сумма была минимальна , то есть диффиренцируем. Получаем систему из двух уравнений. Решаем ее и получаем коэффициенты А и В.
int n=m_pos[1]-m_pos[0]+1; //---- рассчитаем значения цен double value=close[m_pos[0]]; double a,b; double sumy=value; double sumx=0.0; double sumxy=0.0; double sumx2=0.0; for(i=1; i<n; i++) { value=close[m_pos[0]+i]; sumy+=value; sumxy+=value*i; sumx+=i; sumx2+=i*i; } b=(sumxy*n-sumx*sumy)/(sumx2*n-sumx*sumx); a=(sumy-sumx*b)/n; m_value[0]=a; m_value[1]=a+b*n; //---- найдём максимальное отклонение double sma=sumy/n; double maxdev=0; double deviation=0; for(i=0; i<n; i++) { deviation=close[m_pos[0]+i]-sma; maxdev+=deviation*deviation; } deviation=maxdev/n; maxdev=sqrt(deviation)*m_scale/100.0;
где m_pos[0] и m_pos[1] - номера начального и конечного баров канала
m_value[0] и m_value[1] - соответствующие ценовые значения для средней линии канала
maxdev - половина ширины канала
ps все формулы взяты из открытых источников. так что, яндекс Вам в руки и вперёд
Spasibo.
Paproboval napisat' svoju versiju:
Paproboval napisat' svoju versiju:
//+------------------------------------------------------------------+ //| StdDevChan.mq4 | //| Copyright © 2005, Arunas Pranckevicius | //| irc://irc.omnitel.net/forex | //+------------------------------------------------------------------+ #property copyright "Copyright © 2005, Arunas Pranckevicius(T-1000), Lithuania" #property link "irc://irc.omnitel.net/forex" #property indicator_chart_window #property indicator_buffers 0 //---- input parameters extern int PriceBars=350; extern int Shift; extern bool Comments=true; //---- buffers //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ void SetObject(string ObjName,int ObjType,datetime ObjTime1,double ObjPrice1,datetime ObjTime2=0,double ObjPrice2=0,color ObjColor=Red,int ObjSize=1,int ObjStyle=STYLE_SOLID,datetime ObjTime3=0,double ObjPrice3=0) { if (ObjectFind(ObjName) != -1) ObjectDelete(ObjName); ObjectCreate(ObjName, ObjType, 0,ObjTime1 , ObjPrice1, ObjTime2, ObjPrice2, ObjTime3, ObjPrice3); ObjectSet(ObjName,OBJPROP_COLOR,ObjColor); ObjectSet(ObjName,OBJPROP_STYLE,ObjStyle); ObjectSet(ObjName,OBJPROP_WIDTH,ObjSize); } int init() { //---- indicators //---- return(0); } //+------------------------------------------------------------------+ //| Custor indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counter; double DevAvg=0; double DevPlus1=0; double DevMinus1=0; double DevPlus2=0; double DevMinus2=0; double DevAvg1=0; double DevAvg2=0; double PriceDiff; double HighLow; if (Bars < (PriceBars * 2 + Shift)) return(0); // Calculate mean price and Highest/Lowest price difference for entire period DevAvg=iMA(Symbol(),Period(),PriceBars+Shift,0,MODE_SMA,PRICE_MEDIAN,Shift); HighLow=High [Highest (NULL,0,MODE_HIGH,PriceBars,Shift)] - Low [Lowest (NULL,0,MODE_HIGH,PriceBars,Shift)]; // Calculate sum of squared deviations for (counter=(PriceBars + Shift);counter >=Shift;counter--) { //PriceDiff = (High[counter] + Low[counter] + Open[counter]) / 3; PriceDiff = (HighLow + Open[counter]) / 3; DevAvg+= MathPow((PriceDiff - DevAvg),2); } // Calculate average deviation DevAvg = MathSqrt(DevAvg) / PriceBars; // Calculate deviation channel +/- starting points DevPlus1 = (HighLow + Open[PriceBars + Shift]) / 3 + DevAvg; DevMinus1 = (HighLow + Open[PriceBars + Shift]) / 3 - DevAvg; // Calculate deviation channel current +/- points DevPlus2 = (HighLow + Open[Shift]) / 3 + DevAvg; DevMinus2 = (HighLow + Open[Shift]) / 3 - DevAvg; // Calculate deviation channel starting/current average deviation prices DevAvg1 = (DevPlus1 + DevMinus1 + (HighLow + Open[PriceBars + Shift]) / 3) / 3; DevAvg2 = (DevPlus2 + DevMinus2 + (HighLow + Open[Shift]) / 3) / 3; if (Comments) Comment(Symbol()," DevAvg=",DevAvg," DevAvg1=",DevAvg1," DevAvg2=",DevAvg2," DevPlus1=",DevPlus1," DevMinus1=",DevMinus1," DevPlus2=",DevPlus2," DevMinus2=",DevMinus2); //Draw channel SetObject(Symbol()+"_StdDev+",OBJ_TREND,Time[PriceBars + Shift],DevPlus1,Time[Shift],DevPlus2,Blue,1,STYLE_SOLID); ObjectSetText(Symbol()+"_StdDev+","Standart Deviation Resistance", 8, "Arial", Green); SetObject(Symbol()+"_StdDev-",OBJ_TREND,Time[PriceBars + Shift],DevMinus1,Time[Shift],DevMinus2,Blue,1,STYLE_SOLID); ObjectSetText(Symbol()+"_StdDev-","Standart Deviation Support", 8, "Arial", Green); SetObject(Symbol()+"_StdDevAvg",OBJ_TREND,Time[PriceBars + Shift],DevAvg1,Time[Shift],DevAvg2,Red,1,STYLE_SOLID); ObjectSetText(Symbol()+"_StdDevAvg","Standart Deviation Average", 8, "Arial", Green); //---- //---- return(0); } //+------------------------------------------------------------------+
Posle zapuska niponiatnyje 4isla vidny v komentarii - "1.INF", "1.IND" i t.d... 4to eto za..? :-)
Kompilirujetsia bez oshybok. Gde oshybka?
Я вообще не понял алгоритма (идею). А числа "1.INF", "1.IND" означают или слишком большие по модулю значения, или неопределнное значение типа 0/0 (я так думаю).
Ideja ot siuda:
http://www.stockcharts.com/education/IndicatorAnalysis/indic_standardDev.html
Ja tol'ko beru ni samuju cenu, a uklonenije ceny ot (High-Low) / 2
Paprobuite zapustit' na svajom MT4.
http://www.stockcharts.com/education/IndicatorAnalysis/indic_standardDev.html
Ja tol'ko beru ni samuju cenu, a uklonenije ceny ot (High-Low) / 2
Paprobuite zapustit' na svajom MT4.
А числа "1.INF", "1.IND" означают или слишком большие по модулю значения, или неопределнное значение типа 0/0 (я так думаю).
да, именно так. это - переполнение порядка float (1.INF) и переполнение порядка double (1.IND). перед делением надо проверять делитель на 0
Ideja ot siuda:
http://www.stockcharts.com/education/IndicatorAnalysis/indic_standardDev.html
Ja tol'ko beru ni samuju cenu, a uklonenije ceny ot (High-Low) / 2
Paprobuite zapustit' na svajom MT4.
http://www.stockcharts.com/education/IndicatorAnalysis/indic_standardDev.html
Ja tol'ko beru ni samuju cenu, a uklonenije ceny ot (High-Low) / 2
Paprobuite zapustit' na svajom MT4.
Мне честно говоря, времени жалко все проверять, я и так честно старался понять твой код, почти понял что в нем задумано, но нет желания копать и показывать где ошибка. Если бы сам привел комментарии , что типа здесь я делаю то-то, то есть описание идеи. А так, идей много в жизни, и проверить их все жизни не хватит. Так что извини.
Hi,
Nashol oshybki, popravil :-)
Etot idikator xorosho saidiot tem, kto zanimajutsia support/resist urovniami. Kokda cena probivajut support/resist granicy mojevo indikatora i xodit dalshe - imejem stabil'nyj trend... :-)
Nashol oshybki, popravil :-)
Etot idikator xorosho saidiot tem, kto zanimajutsia support/resist urovniami. Kokda cena probivajut support/resist granicy mojevo indikatora i xodit dalshe - imejem stabil'nyj trend... :-)
//+------------------------------------------------------------------+ //| StdDevChan.mq4 | //| Copyright © 2005, Arunas Pranckevicius | //| irc://irc.omnitel.net/forex | //+------------------------------------------------------------------+ #property copyright "Copyright © 2005, Arunas Pranckevicius(T-1000), Lithuania" #property link "irc://irc.omnitel.net/forex" #property indicator_chart_window #property indicator_buffers 0 //---- input parameters extern int PriceBars=350; extern int Shift; extern bool Comments=false; //---- buffers //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ void SetObject(string ObjName,int ObjType,datetime ObjTime1,double ObjPrice1,datetime ObjTime2=0,double ObjPrice2=0,color ObjColor=Red,int ObjSize=1,int ObjStyle=STYLE_SOLID,datetime ObjTime3=0,double ObjPrice3=0) { if (ObjectFind(ObjName) != -1) ObjectDelete(ObjName); ObjectCreate(ObjName, ObjType, 0,ObjTime1 , ObjPrice1, ObjTime2, ObjPrice2, ObjTime3, ObjPrice3); ObjectSet(ObjName,OBJPROP_COLOR,ObjColor); ObjectSet(ObjName,OBJPROP_STYLE,ObjStyle); ObjectSet(ObjName,OBJPROP_WIDTH,ObjSize); } int init() { //---- indicators //---- return(0); } //+------------------------------------------------------------------+ //| Custor indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counter; double DevAvg=0; double DevPlus1=0; double DevMinus1=0; double DevPlus2=0; double DevMinus2=0; double DevAvg1=0; double DevAvg2=0; double PriceDiff; double deviance,Max,Min; if (Bars < (PriceBars * 2 + Shift)) return(0); // Calculate mean price and Highest/Lowest price difference for entire period deviance=iMA(Symbol(),Period(),PriceBars+Shift,0,MODE_SMA,PRICE_MEDIAN,Shift); Max=High [Highest (NULL,0,MODE_HIGH,PriceBars,Shift)]; Min=Low [Lowest (NULL,0,MODE_HIGH,PriceBars,Shift)]; DevAvg=MathPow((Max + Min + deviance) / 3,2); // Calculate sum of squared deviations for (counter=(PriceBars + Shift);counter >=Shift;counter--) { PriceDiff = (Max + Min + Open[counter]) / 3; deviance+= MathPow((PriceDiff - DevAvg),2); } // Calculate average deviation deviance = deviance / (PriceBars + 1); DevAvg = MathSqrt(deviance/Point) * Point; //DevAvg = deviance; //if (IndicatorCounted() == 0) Print(Symbol()," Max=",Max," Min=",Min," deviance=",deviance); // Calculate deviation channel +/- starting points DevPlus1 = (Min+Max + Open[PriceBars + Shift]) / 3 + DevAvg; DevMinus1 = (Min+Max + Open[PriceBars + Shift]) / 3 - DevAvg; // Calculate deviation channel current +/- points DevPlus2 = (Min+Max + Open[Shift]) / 3 + DevAvg; DevMinus2 = (Min+Max + Open[Shift]) / 3 - DevAvg; // Calculate deviation channel starting/current average deviation prices DevAvg1 = (DevPlus1 + DevMinus1 + (Max + Min + Open[PriceBars + Shift]) / 3) / 3; DevAvg2 = (DevPlus2 + DevMinus2 + (Max + Min + Open[Shift]) / 3) / 3; if (Comments) Comment(Symbol()," DevAvg=",DevAvg," DevAvg1=",DevAvg1," DevAvg2=",DevAvg2," DevPlus1=",DevPlus1," DevMinus1=",DevMinus1," DevPlus2=",DevPlus2," DevMinus2=",DevMinus2); //Draw channel SetObject(Symbol()+"_StdDev+",OBJ_TREND,Time[PriceBars + Shift],DevPlus1,Time[Shift],DevPlus2,Blue,1,STYLE_SOLID); ObjectSetText(Symbol()+"_StdDev+","Standart Deviation Resistance", 8, "Arial", Green); SetObject(Symbol()+"_StdDev-",OBJ_TREND,Time[PriceBars + Shift],DevMinus1,Time[Shift],DevMinus2,Blue,1,STYLE_SOLID); ObjectSetText(Symbol()+"_StdDev-","Standart Deviation Support", 8, "Arial", Green); SetObject(Symbol()+"_StdDevAvg",OBJ_TREND,Time[PriceBars + Shift],DevAvg1,Time[Shift],DevAvg2,Red,1,STYLE_SOLID); ObjectSetText(Symbol()+"_StdDevAvg","Standart Deviation Average", 8, "Arial", Green); //---- return(0); } //+------------------------------------------------------------------+
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Jiesli nislozno, bylo by xorosho uznat' formuly i drugix standartnyx grafi4eskix objektax.