Так как я не понимаю необходимость проверки if(size-2!=0) - это раз. И хотя я смутно вспоминаю использование оценок по выборке и не буду сильно спорить против disper=disper/(size-2) (вместо disper=disper/(size)) , уверен, что нет смысла затачивать форумулу(то есть, разницы между ними нет в данном случае) - это два.
谢谢你...我在书中找到了相关章节。顺便说一句,如果有人在我的代码中发现了任何程度的错误,如果你能戳中我的痛处,我将非常感激......以防我错过。:-)
PS:我尽量少提问题。:-)
总的来说,我认为这种编程上的琐事不值得在这个问题上讨论。
是的,他们是。
因为我不明白检查if(size-2!=0)的必要性--这就是一个。
虽然我依稀记得使用了抽样估计,也不会强烈反对disper=disper/(size-2)(而不是disper=disper/(size))。 ,我相信磨砺论坛的意义不大(也就是说,在这种情况下,两者之间没有区别)--这是两个。
我不是数学家,但在我看来,随着规模趋于无限大,方差将趋于0。因此,如果你要估计一个400条的样本,那么无论你从其中减去1或2,还是根本不减,最终的结果都不会受到很大影响......尽管如此,公式就是公式,如果我叔叔在一本聪明的书上写了 "N-2",那么我个人倾向于遵循他的建议......:-)
当然,原则上这个条件是完全没有必要的。我只是在最初写代码时做的--我删除了除法前的检查,因为0不可能是因为样本明显更大。但后来随着代码的发展,除以零的错误开始时有发生。由于MT4中没有调试器,所以很难找出这个零点是在哪里发生的。直到我检查了在所有除法中检查除以0的条件,我才明白到底是在什么除法中发现了0!那么,在未来,当然,你可以删除这个额外的检查。虽然我怀疑这在计算时间上会有任何好处,因为基本的时间是花在计算本身,而不是花在一些多余的代码稳定性检查上。对于我们的问题来说,这些公式没有根本的区别,最终的利润不太可能受到任何明显的影响。但是,为什么不完全按照数学上应该有的方式来做呢?我们弗拉迪斯拉瓦系统只是想摆脱主观性,在数学方法的基础上获得对当前市场形势
最客观 的评估。
你是对的!但只是在你声明的第一部分;o)))
所以,现在你可以清楚地看到区别--如果你把第一个参数设置为 "真",你将根据旧的算法得到八度空间,也就是使用内置函数搜索极值。如果你把它设置为false(默认设置),你会得到,IMHO,你需要的东西。区别如下。极限值是为定义样本而定义的--在一个特定的区域,最高的高点和最低的低点。这确保我们有最小的概率捕捉到部分的过度趋势。然后与最后一个条形图上的最高/最低值进行比较--这只是设定范围的一边--如果我们处于趋势中,我们很容易突破设定的水平,我们将需要及时重建八度空间。
//+------------------------------------------------------------------+ //| MMLevls_VG.mq4 | //| Copyright © 2006, Vladislav Goshkov (VG). | //| 4vg@mail.ru | //| Many thanks to Tim Kruzel | //+------------------------------------------------------------------+ #property copyright "Vladislav Goshkov (VG)." #property link "4vg@mail.ru" #property indicator_chart_window // ============================================================================================ // * Линии 8/8 и 0/8 (Окончательное сопротивление). // * Эти линии самые сильные и оказывают сильнейшие сопротивления и поддержку. // ============================================================================================ //* Линия 7/8 (Слабая, место для остановки и разворота). Weak, Stall and Reverse //* Эта линия слаба. Если цена зашла слишком далеко и слишком быстро и если она остановилась около этой линии, //* значит она развернется быстро вниз. Если цена не остановилась около этой линии, она продолжит движение вверх к 8/8. // ============================================================================================ //* Линия 1/8 (Слабая, место для остановки и разворота). Weak, Stall and Reverse //* Эта линия слаба. Если цена зашла слишком далеко и слишком быстро и если она остановилась около этой линии, //* значит она развернется быстро вверх. Если цена не остановилась около этой линии, она продолжит движение вниз к 0/8. // ============================================================================================ //* Линии 6/8 и 2/8 (Вращение, разворот). Pivot, Reverse //* Эти две линии уступают в своей силе только 4/8 в своей способности полностью развернуть ценовое движение. // ============================================================================================ //* Линия 5/8 (Верх торгового диапазона). Top of Trading Range //* Цены всех рынков тратят 40% времени, на движение между 5/8 и 3/8 линиями. //* Если цена двигается около линии 5/8 и остается около нее в течении 10-12 дней, рынок сказал что следует //* продавать в этой «премиальной зоне», что и делают некоторые люди, но если цена сохраняет тенденцию оставаться //* выше 5/8, то она и останется выше нее. Если, однако, цена падает ниже 5/8, то она скорее всего продолжит //* падать далее до следующего уровня сопротивления. // ============================================================================================ //* Линия 3/8 (Дно торгового диапазона). Bottom of Trading Range //* Если цены ниже этой лини и двигаются вверх, то цене будет сложно пробить этот уровень. //* Если пробивают вверх эту линию и остаются выше нее в течении 10-12 дней, значит цены останутся выше этой линии //* и потратят 40% времени двигаясь между этой линией и 5/8 линией. // ============================================================================================ //* Линия 4/8 (Главная линия сопротивления/поддержки). Major Support/Resistance //* Эта линия обеспечивает наибольшее сопротивление/поддержку. Этот уровень является лучшим для новой покупки или продажи. //* Если цена находится выше 4/8, то это сильный уровень поддержки. Если цена находится ниже 4/8, то это прекрасный уровень //* сопротивления. // ============================================================================================ extern bool OldVersion = false; extern int P = 90; extern int MMPeriod = 1440; extern int StepBack = 0; extern color mml_clr_m_2_8 = White; // [-2]/8 extern color mml_clr_m_1_8 = White; // [-1]/8 extern color mml_clr_0_8 = Aqua; // [0]/8 extern color mml_clr_1_8 = Yellow; // [1]/8 extern color mml_clr_2_8 = Red; // [2]/8 extern color mml_clr_3_8 = Green; // [3]/8 extern color mml_clr_4_8 = Blue; // [4]/8 extern color mml_clr_5_8 = Green; // [5]/8 extern color mml_clr_6_8 = Red; // [6]/8 extern color mml_clr_7_8 = Yellow; // [7]/8 extern color mml_clr_8_8 = Aqua; // [8]/8 extern color mml_clr_p_1_8 = White; // [+1]/8 extern color mml_clr_p_2_8 = White; // [+2]/8 extern int mml_wdth_m_2_8 = 2; // [-2]/8 extern int mml_wdth_m_1_8 = 1; // [-1]/8 extern int mml_wdth_0_8 = 2; // [0]/8 extern int mml_wdth_1_8 = 1; // [1]/8 extern int mml_wdth_2_8 = 1; // [2]/8 extern int mml_wdth_3_8 = 1; // [3]/8 extern int mml_wdth_4_8 = 2; // [4]/8 extern int mml_wdth_5_8 = 1; // [5]/8 extern int mml_wdth_6_8 = 1; // [6]/8 extern int mml_wdth_7_8 = 1; // [7]/8 extern int mml_wdth_8_8 = 2; // [8]/8 extern int mml_wdth_p_1_8 = 1; // [+1]/8 extern int mml_wdth_p_2_8 = 2; // [+2]/8 extern color MarkColor = Blue; extern int MarkNumber = 217; double dmml = 0, dvtl = 0, sum = 0, v1 = 0, v2 = 0, mn = 0, mx = 0, x1 = 0, x2 = 0, x3 = 0, x4 = 0, x5 = 0, x6 = 0, y1 = 0, y2 = 0, y3 = 0, y4 = 0, y5 = 0, y6 = 0, octave = 0, fractal = 0, range = 0, finalH = 0, finalL = 0, mml[13]; string ln_txt[13], buff_str = ""; int bn_Lo = -1, bn_Hi = -1, extr_bn_Lo = -1, extr_bn_Hi = -1, OctLinesCnt = 13, mml_thk = 8, mml_clr[13], mml_wdth[13], mml_shft = 35, nT = 0, nB = 0, nP = 0, nDigits = 0, i = 0; int NewPeriod=0; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators if(MMPeriod>0) NewPeriod = P*MathCeil(MMPeriod/Period()); else NewPeriod = P; ln_txt[0] = "[-2/8]P";// "extremely overshoot [-2/8]";// [-2/8] ln_txt[1] = "[-1/8]P";// "overshoot [-1/8]";// [-1/8] ln_txt[2] = "[0/8]P";// "Ultimate Support - extremely oversold [0/8]";// [0/8] ln_txt[3] = "[1/8]P";// "Weak, Stall and Reverse - [1/8]";// [1/8] ln_txt[4] = "[2/8]P";// "Pivot, Reverse - major [2/8]";// [2/8] ln_txt[5] = "[3/8]P";// "Bottom of Trading Range - [3/8], if 10-12 bars then 40% Time. BUY Premium Zone";//[3/8] ln_txt[6] = "[4/8]P";// "Major Support/Resistance Pivotal Point [4/8]- Best New BUY or SELL level";// [4/8] ln_txt[7] = "[5/8]P";// "Top of Trading Range - [5/8], if 10-12 bars then 40% Time. SELL Premium Zone";//[5/8] ln_txt[8] = "[6/8]P";// "Pivot, Reverse - major [6/8]";// [6/8] ln_txt[9] = "[7/8]P";// "Weak, Stall and Reverse - [7/8]";// [7/8] ln_txt[10] = "[8/8]P";// "Ultimate Resistance - extremely overbought [8/8]";// [8/8] ln_txt[11] = "[+1/8]P";// "overshoot [+1/8]";// [+1/8] ln_txt[12] = "[+2/8]P";// "extremely overshoot [+2/8]";// [+2/8] //mml_shft = 3; mml_thk = 3; // Начальная установка цветов уровней октав и толщины линий mml_clr[0] = mml_clr_m_2_8; mml_wdth[0] = mml_wdth_m_2_8; // [-2]/8 mml_clr[1] = mml_clr_m_1_8; mml_wdth[1] = mml_wdth_m_1_8; // [-1]/8 mml_clr[2] = mml_clr_0_8; mml_wdth[2] = mml_wdth_0_8; // [0]/8 mml_clr[3] = mml_clr_1_8; mml_wdth[3] = mml_wdth_1_8; // [1]/8 mml_clr[4] = mml_clr_2_8; mml_wdth[4] = mml_wdth_2_8; // [2]/8 mml_clr[5] = mml_clr_3_8; mml_wdth[5] = mml_wdth_3_8; // [3]/8 mml_clr[6] = mml_clr_4_8; mml_wdth[6] = mml_wdth_4_8; // [4]/8 mml_clr[7] = mml_clr_5_8; mml_wdth[7] = mml_wdth_5_8; // [5]/8 mml_clr[8] = mml_clr_6_8; mml_wdth[8] = mml_wdth_6_8; // [6]/8 mml_clr[9] = mml_clr_7_8; mml_wdth[9] = mml_wdth_7_8; // [7]/8 mml_clr[10] = mml_clr_8_8; mml_wdth[10]= mml_wdth_8_8; // [8]/8 mml_clr[11] = mml_clr_p_1_8; mml_wdth[11]= mml_wdth_p_1_8; // [+1]/8 mml_clr[12] = mml_clr_p_2_8; mml_wdth[12]= mml_wdth_p_2_8; // [+2]/8 //---- return(0); } //+------------------------------------------------------------------+ //| Custor indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- TODO: add your code here Comment(" "); for(i=0;i<OctLinesCnt;i++) { buff_str = "mml"+i; ObjectDelete(buff_str); buff_str = "mml_txt"+i; ObjectDelete(buff_str); } //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ //========================================================================= int FindeExtrHi_bn(int n_bg, int n_nd ){ int ext_bn = -1; double ext_Hi = -10000000000000000000.0; int k = 0; int stop_bn = -1; int start_bn = -1; int cur_bn = n_bg; //Print(" FindeExtrHi_bn : n_bg = ", n_bg," n_nd = ", n_nd); if(n_bg<n_nd){ start_bn = n_bg+1; stop_bn = n_nd; //Print(" FindeExtrHi_bn (n_bg<n_nd): start_bn = ", start_bn," stop_bn = ", stop_bn); for(int j=start_bn;j<stop_bn;j++){ if( (High[j]>High[j+1])&&(High[j]>High[j-1])&&(High[j]>ext_Hi) ){ ext_bn = j; ext_Hi = High[j]; } }//for(int j=start_bn;j<stop_bn;j++){ }//if(n_bg<n_nd){ if(n_bg>n_nd){ start_bn = n_bg; stop_bn = n_nd+1; //Print(" FindeExtrHi_bn (n_bg>n_nd): start_bn = ", start_bn," stop_bn = ", stop_bn); for( j=start_bn;j>stop_bn;j--){ if( (High[j]>High[j+1])&&(High[j]>High[j-1])&&(High[j]>ext_Hi) ){ ext_bn = j; ext_Hi = High[j]; } }//for(int j=start_bn;j>stop_bn;j--){ }//if(n_bg>n_nd){ //Print(" FindeExtrHi_bn:=> ext_bn = ",ext_bn); return(ext_bn); } //========================================================================= int FindeExtrLo_bn(int n_bg, int n_nd ){ int ext_bn = -1; double ext_Lo = 10000000000000000000.0; int stop_bn = -1; int start_bn = -1; int cur_bn = n_bg; //Print(" FindeExtrLo_bn : n_bg = ", n_bg," n_nd = ", n_nd); if(n_bg<n_nd){ start_bn = n_bg+1; stop_bn = n_nd; //Print(" FindeExtrLo_bn (n_bg<n_nd): start_bn = ", start_bn," stop_bn = ", stop_bn); for(int j=start_bn;j<stop_bn;j++){ if( (Low[j]<Low[j+1])&&(Low[j]<Low[j-1])&&(Low[j]<ext_Lo) ){ ext_bn = j; ext_Lo = Low[j]; } }//for(int j=start_bn;j<stop_bn;j++){ }//if(n_bg<n_nd){ if(n_bg>n_nd){ start_bn = n_bg; stop_bn = n_nd+1; //Print(" FindeExtrLo_bn (n_bg>n_nd): start_bn = ", start_bn," stop_bn = ", stop_bn); for( j=start_bn;j>stop_bn;j--){ if( (Low[j]<Low[j+1])&&(Low[j]<Low[j-1])&&(Low[j]<ext_Lo) ){ ext_bn = j; ext_Lo = Low[j]; } }//for(int j=start_bn;j>stop_bn;j--){ }//if(n_bg>n_nd){ //Print(" FindeExtrLo_bn:=> ext_bn = ",ext_bn); return(ext_bn); } int start() { //---- TODO: add your code here if( (nT!=Time[0])||(nP!=Period())||(nB!=Bars) ) { //price //Print("MMLevls : NewPeriod = ",NewPeriod); if(OldVersion){ bn_Lo = Lowest(NULL,0,MODE_LOW,NewPeriod,StepBack); bn_Hi = Highest(NULL,0,MODE_HIGH,NewPeriod,StepBack); } else {// if(OldVersion){ extr_bn_Lo = FindeExtrLo_bn(NewPeriod+StepBack,StepBack); extr_bn_Hi = FindeExtrHi_bn(NewPeriod+StepBack,StepBack); //Print("MMLevls : NewPeriod = ",NewPeriod," extr_bn_Lo = ",extr_bn_Lo ," extr_bn_Hi = ",extr_bn_Hi); //Print("MMLevls : NewPeriod = ",NewPeriod," High[extr_bn_Lo] = ",High[extr_bn_Lo] ," extr_bn_Hi = ",extr_bn_Hi); if(extr_bn_Lo>=0){ bn_Lo = extr_bn_Lo; for(int k=0;k<1;k++){ if(Low[k]<Low[extr_bn_Lo]) { bn_Lo = k; break; } } } else bn_Lo = Lowest(NULL,0,MODE_LOW,NewPeriod,StepBack); if(extr_bn_Hi>=0){ bn_Hi = extr_bn_Hi; for(k=0;k<1;k++){ if(High[k]>High[extr_bn_Hi]) {//ошибка была здесь bn_Lo = k; break; } } } else bn_Hi = Highest(NULL,0,MODE_HIGH,NewPeriod,StepBack); // Пусть будет на всякий случай :). if(High[bn_Hi]<Low[bn_Lo]){ //Print("MM ??? HiLo :High[",bn_Hi,"] = ",High[bn_Hi]," Low",bn_Lo,"] = ",Low[bn_Lo]); bn_Lo = Lowest(NULL,0,MODE_LOW,NewPeriod,StepBack); bn_Hi = Highest(NULL,0,MODE_HIGH,NewPeriod,StepBack); } }//} else {// if(OldVersion){ v1 = Low[bn_Lo]; v2 = High[bn_Hi]; //determine fractal..... if( v2<=250000 && v2>25000 ) fractal=100000; else if( v2<=25000 && v2>2500 ) fractal=10000; else if( v2<=2500 && v2>250 ) fractal=1000; else if( v2<=250 && v2>25 ) fractal=100; else if( v2<=25 && v2>12.5 ) fractal=12.5; else if( v2<=12.5 && v2>6.25) fractal=12.5; else if( v2<=6.25 && v2>3.125 ) fractal=6.25; else if( v2<=3.125 && v2>1.5625 ) fractal=3.125; else if( v2<=1.5625 && v2>0.390625 ) fractal=1.5625; else if( v2<=0.390625 && v2>0) fractal=0.1953125; range=(v2-v1); //Print(" v2 = ",v2," v1 = ",v1," range = ",range ); sum=MathFloor(MathLog(fractal/range)/MathLog(2)); octave=fractal*(MathPow(0.5,sum)); mn=MathFloor(v1/octave)*octave; if( (mn+octave)>v2 ) mx=mn+octave; else mx=mn+(2*octave); // calculating xx //x2 if( (v1>=(3*(mx-mn)/16+mn)) && (v2<=(9*(mx-mn)/16+mn)) ) x2=mn+(mx-mn)/2; else x2=0; //x1 if( (v1>=(mn-(mx-mn)/8))&& (v2<=(5*(mx-mn)/8+mn)) && (x2==0) ) x1=mn+(mx-mn)/2; else x1=0; //x4 if( (v1>=(mn+7*(mx-mn)/16))&& (v2<=(13*(mx-mn)/16+mn)) ) x4=mn+3*(mx-mn)/4; else x4=0; //x5 if( (v1>=(mn+3*(mx-mn)/8))&& (v2<=(9*(mx-mn)/8+mn))&& (x4==0) ) x5=mx; else x5=0; //x3 if( (v1>=(mn+(mx-mn)/8))&& (v2<=(7*(mx-mn)/8+mn))&& (x1==0) && (x2==0) && (x4==0) && (x5==0) ) x3=mn+3*(mx-mn)/4; else x3=0; //x6 if( (x1+x2+x3+x4+x5) ==0 ) x6=mx; else x6=0; finalH = x1+x2+x3+x4+x5+x6; // calculating yy //y1 if( x1>0 ) y1=mn; else y1=0; //y2 if( x2>0 ) y2=mn+(mx-mn)/4; else y2=0; //y3 if( x3>0 ) y3=mn+(mx-mn)/4; else y3=0; //y4 if( x4>0 ) y4=mn+(mx-mn)/2; else y4=0; //y5 if( x5>0 ) y5=mn+(mx-mn)/2; else y5=0; //y6 if( (finalH>0) && ((y1+y2+y3+y4+y5)==0) ) y6=mn; else y6=0; finalL = y1+y2+y3+y4+y5+y6; for( i=0; i<OctLinesCnt; i++) { mml[i] = 0; } dmml = (finalH-finalL)/8; //Print("MMLevls : NewPeriod = ",NewPeriod," dmml = ",dmml," finalL = ",finalL); mml[0] =(finalL-dmml*2); //-2/8 for( i=1; i<OctLinesCnt; i++) { mml[i] = mml[i-1] + dmml; } for( i=0; i<OctLinesCnt; i++ ){ buff_str = "mml"+i; if(ObjectFind(buff_str) == -1) { ObjectCreate(buff_str, OBJ_HLINE, 0, Time[0], mml[i]); ObjectSet(buff_str, OBJPROP_STYLE, STYLE_SOLID); ObjectSet(buff_str, OBJPROP_COLOR, mml_clr[i]); ObjectSet(buff_str, OBJPROP_WIDTH, mml_wdth[i]); ObjectMove(buff_str, 0, Time[0], mml[i]); } else { ObjectMove(buff_str, 0, Time[0], mml[i]); } buff_str = "mml_txt"+i; if(ObjectFind(buff_str) == -1) { ObjectCreate(buff_str, OBJ_TEXT, 0, Time[mml_shft], mml_shft); ObjectSetText(buff_str, ln_txt[i], 8, "Arial", mml_clr[i]); ObjectMove(buff_str, 0, Time[mml_shft], mml[i]); } else { ObjectMove(buff_str, 0, Time[mml_shft], mml[i]); } } // for( i=1; i<=OctLinesCnt; i++ ){ string buff_str = "LR_LatestCulcBar"; if(ObjectFind(buff_str) == -1) { ObjectCreate(buff_str, OBJ_ARROW,0, Time[StepBack], Low[StepBack]-2*Point ); ObjectSet(buff_str, OBJPROP_ARROWCODE, MarkNumber); ObjectSet(buff_str, OBJPROP_COLOR, MarkColor); } else { ObjectMove(buff_str, 0, Time[StepBack], Low[StepBack]-2*Point ); } nT = Time[0]; nB = Bars; nP = Period(); }//if( (nT!=Time[0])||(nP!=Period())||(nB!=Bars) ) { //---- End Of Program return(0); } //+------------------------------------------------------------------+好运和良好的趋势。HZZ有一个错误--我已经重写了代码--现在差别不是那么明显了:)。
И хотя я смутно вспоминаю использование оценок по выборке и не буду сильно спорить против disper=disper/(size-2) (вместо disper=disper/(size)) , уверен, что нет смысла затачивать форумулу(то есть, разницы между ними нет в данном случае) - это два.
当然,在原则上,这个条件是完全没有必要的。
当我在写代码时,我最初是这样做的--我删除了除法前的检查,因为0不可能是因为样本明显更大。但后来随着代码的发展,除以零的错误开始时有发生。由于MT4中没有调试器,所以很难找出这个零点是在哪里发生的。直到我实现了在所有除法中检查除以0的条件,我也没能理解到底在什么除法中发现了0!那么,在未来,当然,你可以删除这个额外的检查。虽然我怀疑这在计算时间上会有任何好处,因为基本的时间是花在计算本身,而不是花在一些多余的代码稳定性检查上。
对于我们的问题来说,这些公式没有根本的区别,最终的利润不太可能受到任何明显的影响。但是,为什么不完全按照数学上应该有的方式来做呢?我们弗拉基斯拉瓦系统只是想摆脱主观性,并根据数学方法对当前的市场形势进行最客观的评估。
事实上,根本没有区别,因为误差可以忽略不计,当然,每个人都可以用自己的方式计算。
事实上,我们现在可以看到该指标表现的差异。
非常感谢你的改进!现在,"所有水平都被规范到日线时间框架 "这句话可能已经在最终确定的指标中得到了充分的执行。
请看这种情况是多么正确?USDCAD H4,偏移40。
https://c.mql5.com/mql4/forum/2006/06/new_indicator.zip
你可以看到价格是如何走到最低指标线以下的一个半数字。不应该是这样的吗?
https://c.mql5.com/mql4/forum/2006/06/new_indicator.zip
你可以看到,价格已经在最低指标线下移动了一个半数字。不应该是这样的吗?
不,它不应该。对不起--那里有一个错误--是一个打字错误的结果--当与范围的右边缘进行比较时。我已经纠正了它。现在差异不是那么明显了:)。在这里,"高 "的条数不是极端 "高 "的条数,而是极端 "低 "的条数。当我开始详细地竞读故事时发现了它。
我将重新安排代码。
好运和快乐的趋势。
ZS重新挂起。