基于艾略特波浪理论的交易策略 - 页 28

 
另外,关于计算的问题。我最近想到需要使用正态分布密度函数,但我还没有开始。我也想过怎么做,不管是用棘手的函数还是用表格的方法,我更倾向于在Excel中用千分之一(或万分之一)的增量来填充表格,并将其保存为一个txt文件,其中包含填充大数组的mq4代码。现在,由于Vladislav的努力,它也节省了CPU资源。
总而言之,我学到了很多有用的东西。:)
 
<br/ translate="no"> 你的一个公理是,有一个真正的(即单一的)轨迹,这是由优化过程决定的。一条轨迹怎么会产生多个通道?


再次抱歉,回答得太晚了。当对一个轨迹进行近似时,你永远不可能知道一个近似值对轨迹本身的描述有多好,如果它们处于同一个置信区间 的话。因此,所有落在置信区间内的近似值都可以被认为是等同的。原则上说,情况就是这样。要从一组可能的近似值中进行预测(通常没有一个满足选择标准,因为误差界限已经设定),最好选择 "最 "理想的近似值,可以这样说。当我研究这个算法时,我又意识到一个特殊性--尽管近似值不同,但在绝大多数情况下,预测结果是相同的。我再次提醒你,轨迹本身是不需要的,我也没有在寻找它。关于渠道--渠道的独特性与所研究的结构的 "详细程度"(让我们这样称呼它)有关。因此,如果有趋势,我们可以确定回撤区,并估计趋势结束的概率,反转区的突破,等等。或者只是为了确定不确定的领域,这时最好不要进入市场。另外,你应该永远记住样本量的限制,否则结果的不确定性率会太高。好运和良好的趋势。
 
亲爱的Vladislav!

我对赫斯特系数的计算有一个误解。
在线性回归的情况下,我们有2种S和R计算的变体。

变体1。
S - 我们可以计算出沿线性回归线全长的偏差差异之和。
这意味着:

S=0.0;
for (n=0; n<Period; n++) { S+ = MathPow( Close[n] - (a+b*n) , 2) ; }
S=MathSqrt( S / Period );

而我们可以将R计算为沿线性回归整条线的最大偏差和最小偏差之差。
即:

pMax=0.0; pMin=0.0;
for (n=0; n<Period; n++)
{
dc=Close[n] - (a+b*n);
if ( dc > pMax) pMax = dc;
if ( dc < pMin) pMin = dc
}
R=MathAbs( pMax - pMin);

选项2。
我们可以使用标准技术指标 集中的iStdDev( )来计算相对于上一棒的S。但在这种情况下,我们将有相对于最后一个条形图的S计算,这相当于相对于线性回归线中间的值的S计算。

而R--作为水平投影中的最大值和最小值之差:

pMax=High[Highest(NULL,0,MODE_HIGH,Period,i)];
pMin=Low[Lowest(NULL,0,MODE_Low,Period,i)];

这不是很正确,如果我们最初使用Close的话,使用MODE_CLOSE会更正确。

据我所知,在你的案例中使用的是第二种变体?或者我一定是搞错了?

所以我的问题是:为了更准确地计算Hurst系数,哪种变量更正确?

提前感谢您的回答--亚历山大。
 
所有落在置信区间内的近似值都可以被认为是等价的。

谢谢你,弗拉迪斯拉夫,我不知为何没有考虑到这一点。但这确实是事实。这意味着事实上我们得到的不是几个通道,而是一个由最大和最小角度的线条限定的整个范围。
人们应该始终牢记样本量的限制,否则结果会有太大的不确定性。

我不太清楚你说的是什么不确定性。然而,另一件事对我来说是清楚的。样本应该定义一个回归通道,而回归通道就是一个趋势通道。如果我们把趋势和平坦都归入一个样本,这样的样本很难给我们带来任何有用的东西。因此,我们面临着将市场划分为不同阶段的问题,更重要的是,在早期阶段,即在真正的市场中,识别趋势和平局。在我看来,这是一项非常不简单的任务。
 
紫荆花。
在这里,我想说的是,我们的标准指数是由我们自己来决定的,而不是由别人来决定的。



我们的目标是,让所有的人都能享受到我们的服务。

//+------------------------------------------------------------------+
//|                                                   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 3
#property indicator_color1 Red
#property indicator_color2 White
#property indicator_color3 Blue

//---- input parameters
extern int       PriceBars=350;
extern int       Shift;
extern bool      Comments=false;

double Support[];
double StdDev[];
double Resistance[];

//---- 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
   IndicatorBuffers(3);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,Resistance);
   SetIndexDrawBegin(0,0);
   SetIndexEmptyValue(0,0);
   SetIndexShift(0,0);
   SetIndexLabel(0,"Standart Deviation Support-");
//----
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,StdDev);
   SetIndexDrawBegin(1,0);
   SetIndexEmptyValue(1,0);
   SetIndexShift(1,0);
   SetIndexLabel(1,"Standart Deviation");
//----
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,Support);
   SetIndexDrawBegin(2,0);
   SetIndexEmptyValue(2,0);
   SetIndexShift(2,0);
   SetIndexLabel(2,"Standart Deviation Resistance+");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int counter,counter2;
   double DevAvg=0;
   double DevPlus1=0;
   double DevMinus1=0;
   double DevPlusStart=0;
   double DevMinusStart=0;
   double DevAvgStart=0;
   double DevPlusEnd=0;
   double DevMinusEnd=0;
   double DevAvgEnd=0;
   double DevPlus2=0;
   double DevMinus2=0;
   double DevAvg1=0;
   double DevAvg2=0;
   double PriceDiff;
   double deviance,Max,Min;
   int DrawBegin = Shift;   
   int DrawEnd;
   int counted_bars=IndicatorCounted();
   DrawEnd=Bars-counted_bars;
   
   if ( DrawEnd < DrawBegin + PriceBars) DrawEnd = DrawBegin + PriceBars;
   
   if (Bars < (PriceBars * 2 + Shift)) return(0);
   
   for (counter=DrawBegin-1;counter<=DrawEnd;counter++)
   {
   deviance=iMA(Symbol(),Period(),PriceBars,0,MODE_SMA,PRICE_MEDIAN,counter);
   Max=High [Highest (NULL,0,MODE_HIGH,PriceBars,counter)];
   Min=Low [Lowest (NULL,0,MODE_LOW,PriceBars,counter)];
   //DevAvg=MathPow((Max + Min + deviance) / 3,2);  
   DevAvg=(Max + Min + deviance) / 3;  

   for (counter2=(PriceBars + counter);counter2 >=counter;counter2--)
   {
   PriceDiff = (Max + Min + Open[counter2]) / 3;
   deviance+= MathPow((PriceDiff - DevAvg),2);   
   }

   // Calculate average deviation
   deviance = deviance / (PriceBars + 1);
   DevAvg = MathSqrt(deviance/Point) * Point; 

   // Calculate deviation channel starting/current average deviation prices
   DevAvg1 = (DevPlus1 + DevMinus1 + (Max + Min + Open[PriceBars + counter]) / 3) / 3;

   // Calculate deviation channel +/- starting points
   DevPlus1 = (Min+Max + Open[PriceBars + counter]) / 3 + DevAvg;
   DevMinus1 = (Min+Max + Open[PriceBars + counter]) / 3 - DevAvg;     

  // Calculate deviation channel current +/- points
   DevPlus2 = (Max + DevAvg1) / 2 + DevAvg;
   DevMinus2 = (Min + DevAvg1) / 2 - DevAvg;

   DevAvg2 = (DevPlus2 + DevMinus2 + (Max + Min + DevAvg1) / 3) / 3;
   
   Resistance[counter]=DevMinus2;
   Support[counter]=DevPlus2;
   StdDev[counter]=DevAvg2;   
   //if (counter == DrawEnd && Symbol() == "EURUSD" ) Print ("DevMinus2=",DevMinus2," DevPlus2=",DevPlus2," DevAvg2=",DevAvg2);

   if (counter == DrawBegin)
   {
   DevPlusEnd=Resistance[counter];
   DevMinusEnd=Support[counter];
   DevAvgEnd=StdDev[counter];
//   if (Symbol() == "EURUSD" ) Print ("DrawBegin=",DrawBegin," DrawEnd=",DrawEnd," DevMinus2=",DevMinus2," DevPlus2=",DevPlus2," DevAvg2=",DevAvg2);
   }      
   
   if (counter == DrawBegin + PriceBars)
   {
   DevPlusStart=Resistance[counter];
   DevMinusStart=Support[counter];
   DevAvgStart=StdDev[counter];
   }      

   }
//----

   if (Comments) Comment(Symbol()," DevAvg=",DevAvg," DevAvgStart=",DevAvgStart," DevAvgEnd=",DevAvgEnd," DevPlusStart=",DevPlusStart," DevPlusEnd=",DevPlusEnd," DevMinusStart=",DevMinusStart," DevMinusEnd=",DevMinusEnd);
   //Draw channel
   SetObject(Symbol()+"_StdDev+",OBJ_TREND,Time[PriceBars + Shift],DevPlusStart,Time[Shift],DevPlusEnd,Blue,1,STYLE_SOLID);
   ObjectSetText(Symbol()+"_StdDev+","Standart Deviation Resistance", 8, "Arial", Green);
   SetObject(Symbol()+"_StdDev-",OBJ_TREND,Time[PriceBars + Shift],DevMinusStart,Time[Shift],DevMinusEnd,Red,1,STYLE_SOLID);
   ObjectSetText(Symbol()+"_StdDev-","Standart Deviation Support", 8, "Arial", Green);
   SetObject(Symbol()+"_StdDevAvg",OBJ_TREND,Time[PriceBars + Shift],DevAvgStart,Time[Shift],DevAvgEnd,White,1,STYLE_SOLID);
   ObjectSetText(Symbol()+"_StdDevAvg","Standart Deviation Average", 8, "Arial", Green);
   
   return(0);
  }
//+------------------------------------------------------------------+
 
2 ANG3110 实际上,我已经在上面回答了这个问题。我再回答一遍--最后一个问题--因为我也很懒;)。标准偏差 应相对于近似值和实际获得的价格进行计算。如果你用muving来近似收盘价,那么它应该是Klose和每个柱子上的 muving值之间的差异。而你可以使用标准算法--iStdDev( )。如果通过线性回归渠道,那么在回归线的值和klose之间。如果通过其他方式,那么差值就是近似函数的值和实际得到的值之间的差值。如果你近似于其他东西,如交易的盈利能力,那么你应该选择其他变量。我在计算中不使用iStdDev( )。

这并不十分正确,如果我们最初使用Close,使用MODE_CLOSE会更正确。

这里的关键是:如果最初由Close

2Yurixx计算 关于不确定性--如果一个样本的自由度数量不足,它的收敛性就不能可靠地估计,因此你可以将只适用于收敛性样本的统计分析方法应用于分歧性样本。因此,结果是不确定的。

PS 这里的 "样本 "是指分布。也就是说,更正确的说法是 "样本的自由度数会影响确定对该样本有效的分布的收敛性的可靠性程度"。对收敛分布有效的方法可以应用于发散分布(或没有已知收敛事实的分布)。

祝您好运,并祝您在趋势方面好运。
 
紫荆花。

在这个问题上,我们要做的是,通过对参数的分析,来确定我们的目标。

   deviance=iMA(Symbol(),Period(),PriceBars,0,MODE_SMA,PRICE_MEDIAN,counter); Max=High [Highest (NULL,0,MODE_HIGH,PriceBars,counter)]; Min=Low [Lowest (NULL,0,MODE_LOW,PriceBars,counter)]; DevAvg=(Max + Min + deviance)/3;



准确无误的指示器和图片 :-D

 
亲爱的Vladislav!<br/ translate="no">
我对赫斯特系数的计算有一个误解。
在线性回归的情况下,我们有2种S和R计算的变体。


现在这是个有趣的问题 :)假设我们有一个
线性回归 通道,例如上升通道,它满足RMS收敛准则。一方面,如果通道是上升的,那么包含在其中的条形图上的计算有效值将趋向于1.0(因为转移很明显)。另一方面,如果我们相对于回归线计算RMS(从而去除偏移),那么RMS将趋于0.5,因为RMS接近于正态分布。我认为每个人都应该自己检查一下(这样做更有趣)。
 
我忍不住了,修改了solandr的脚本。包括RMS提取,使用内置的iStdDevOnArray更正确,因为除以(幂数-1)只对30个元素以下的样本是合理的。
//+------------------------------------------------------------------+
//|                                                     Herst-II.mq4 |
//|                             solandr (обработал напильником Rosh) |
//|                       http://www.metaquotes.ru/forum/6839/page11 |
//+------------------------------------------------------------------+
#property copyright "solandr (обработал напильником Rosh)"
#property link      "http://www.metaquotes.ru/forum/6839/page11"
#property show_inputs

extern int start_bar=500;
extern int end_bar=0;

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
{
double viborka[];
int size_of_array,i;

size_of_array=start_bar-end_bar+1;
ArrayResize(viborka, size_of_array);
for(i=size_of_array-1;i>=0;i--) viborka[i]=Open[i+end_bar];

double S_A=iMAOnArray(viborka,0,size_of_array,0,MODE_SMA,0);
Print("Среднее арифметическое выборки = ",DoubleToStr(S_A,8));

double S=iStdDevOnArray(viborka,0,size_of_array,MODE_SMA,0,0);

Print("СКО выборки (размах) = ",DoubleToStr(S,8));

double pMax=viborka[ArrayMaximum(viborka)];
double pMin=viborka[ArrayMinimum(viborka)];

double R=pMax-pMin;
Print("pMin = ",pMin," pMax = ",pMax, " R = ",R);

double Hrst;
if( (R>0)&&(S>0)) Hrst = MathLog(R/S)/MathLog(size_of_array*0.5);
Print("Хёрст = ",DoubleToStr(Hrst ,8));
  
  return(0);
}
//+------------------------------------------------------------------+



极限搜索 是基于原始数据,而不是基于位置和突破。 因此,标准有些不同:


2006.05.28 14:53:08 Herst EURUSD,M15: remove<br/ translate="no"> 2006.05.28 14:53:08 Herst EURUSD,M15: Hearst = 0.27582880
2006.05.28 14:53:08 Herst EURUSD,M15: pMin = 1.2691 pMax = 1.2892 R = 0.0201
28 14:53:08 Herst EURUSD,M15: 取样有效值(点差)=0.00438062
2006.05.28 14:53:08 Herst EURUSD,M15: 取样方差=0.00001919
2006.05.28 14:53:08 Herst EURUSD,M15: 取样平均值=1.27924631
2006.5.28 14:53:06 Herst EURUSD,M15: 载入成功
2006.05.28 14:52:59 Herst-II EURUSD,M15: 删除
2006.05.28 14:52:59 Herst-II EURUSD,M15: Hurst = 0.26196806
2006.05.28 14:52:59 Herst-II EURUSD,M15: pMin = 1.2696 pMax = 1.2882 R = 0.0186
2006.05.28 14:52:59 Herst-II EURUSD,M15:样本RMS(点差)=0.00437625
2006.05.28 14:52:59 Herst-II EURUSD,M15:样本Mean=1.27924631
2006.05.28 14:52:59 Herst-II EURUSD,M15:加载成功
2006.05.28 14:52:54 编译'Herst-II'

 
亲爱的Vladislav!
谢谢你的全面答复。