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

 
在生活中,有许多事情一开始看起来很重要或不重要。就像一个原始的专家顾问的结果,根据Avals的说法,虽然从直觉上看,它背后的想法是正确的,但一开始就必须要有理由。但对我来说,把它放在现实中进行测试比试图反驳它更容易。如果它能持续到年底--那么我可能会着手在测试器中测试它 :)
<br / translate="no">
摘要。
存款/提款: 5,000.00 信用额度: 0.00
关闭交易盈亏:1 186.63 浮动盈亏:560.29 保证金:961.62
余额:6 186.63 股本:6 746.92 自由保证金:5 785.30

毛利:3 669.45 毛损:2 482.82 总净利润:1 186.63
盈利因素:1.48 预期回报:23.27
绝对回撤:143.75 最大回撤(%):858.39(13.20%)。

总交易量: 51 空头头寸(赢利%): 26 (42.31%) 多头头寸(赢利%): 25 (56.00%)
盈利交易(占总数的百分比):25(49.02%)亏损交易(占总数的百分比):26(50.98%)。
最大的盈利交易:540.94 亏损交易:-292.62
平均盈利交易:146.78 亏损交易:-95.49
最大连胜(美元):6(1,099.13)连败(美元):4(-744.95)。
最大连续盈利(计数):1,099.13(6)连续损失(计数):-744.95(4)。
平均连胜:2连败:2
 
在放宽市场进入条件方面对我的专家顾问进行了一些调整,并增加了一个可变手数。
结果在这里https://c.mql5.com/mql4/forum/2006/06/new_results.zip
地段大小从5美元到80美元不等。
进入/退出算法是考虑到欧元兑美元而开发的,所以专家顾问在3年的历史上显示了相当大的成果。由于计算量大,我只是把估计通道的样本限制在可预见的时间内只有300条。这就是12.5个交易日。事实上,我们应该考虑更长的样本,以增加一个入口点的可靠性。我将再次运行专家顾问的长样本,以获得我的假设的实验证明,但这需要一些时间来计算。在获得文件中显示的欧元兑美元的结果后,我以相同的参数(甚至包括追踪止损参数!)运行专家顾问,在英镑兑美元和美元兑加元上对欧元兑美元进行优化。当然,我们没有设法在其他2对上获得明显的结果,但我认为获得的结果仍然是积极的偏向。因此,我可以得出两个结论。第一个是弗拉迪斯拉夫提出的系统在准确的技术实现下很可能是有利可图的。也许弗拉迪斯拉夫成功地找到了在所有货币对上工作的通用特性,而没有进行修正。如果我们比较这3种货币对,我们可以发现以下差异。与欧元兑美元相比,美元兑加元有更快的运动。也就是说,如果欧元兑美元需要3个小时才能通过1.5的数字,美元兑加元可能需要1个小时才能通过1.5的数字,这导致了严重的滞后问题,至少对于时间框架H1,我们得到的结果是这样的。一般来说,我将在这个方向上继续研究。我现在认为合理地收紧止损是最重要的。在交易时,何时以及以何种方式将其拉升。因为很明显,标准追踪止损不允许采取太多。我们将进一步分析它。
 
下午好,Solandr!

你能告诉我你放宽了哪些条件吗?
 
你能告诉我你放宽了哪些条件吗?

我减少了计算的样本量,也减少了计算 美利水平指标 的周期。如果你的样本量很短,就会有更多的局部高点和低点满足进入点。另外,如果默里水平的计算时间较短,它们的位置就会比较接近,增加了进入市场的概率。比较前一个文件的31个交易和新文件的80个交易。因此,交易的数量增加了,但其质量却相应下降。然而,引入像弗拉迪斯拉夫这样的可变手数,能够在相同的时间段内,以相同的风险量,超过以前的文件所获得的结果。
 
我已经发布了专家顾问的新测试结果https://c.mql5.com/mql4/forum/2006/06/new_results2.zip
结果显示了欧元兑美元在不同样本长度下获得的数据,在此基础上搜索通道。我已经在H1时期的300和1000条上进行了测试。正如预期的那样,更长的样本改善了测试专家顾问的报告。然而,这并不十分显著。将样本长度增加3倍以上,最终利润只增加了4%。正如预期的那样,在较长的样本中,交易的数量变少了(减少了19%),但交易的质量却提高了,盈利指数增长14%就是证明。因此,交易数量的减少和利润率的提高还是造成了总利润的一些增加。

这个文件还包含了为欧元兑美元开发的专家顾问的结果,在H1的300条时间框架内对美元兑瑞郎和美元兑日元进行交易。在美元兑瑞郎货币对,结果有一个明显的积极转变。而在整个测试期间,美元兑日元的结果一直在零左右徘徊。同时,所进行的交易量比在其他货币对上进行同期测试时少了约3倍。基于这一点,我可以得出结论,美元兑日元的性质与那些已经进行过测试的货币对有很大的不同。因此,如果我的策略版本对美元兑日元有效,它将需要一些努力,可能还需要对该货币对的进入/退出算法进行修改。
顺便说一下,Vladislav由于某些原因没有在演示中的所有货币对上进行交易(尽管没有技术问题或可以解决),但他只在3个货币对上进行交易 - EURUSD, USDCHF, GBPUSD。而我认为,也许这不仅仅是为了好玩,但他有一些原因。
 
大家好!MTSinka已经完成了;)- 正如我先前所说,周一我将关闭对Lites账户的直接访问--用于向帝国上传的账户。我可能只是改变了投资者的密码,甚至可能把它留作测试用--白白运行电脑是没有意义的:我打算在真实的账户上测试。接下来会发生什么--我们会看到。
我希望许多人已经进展到了实际的实现?

好运和良好的趋势。
 
下午好,Vladislav!

你能回到这个话题中来真是太好了。
你不在的时候,有很多人在讨论几个问题。

1.
Jhonny 16.06.06 16:48 <br / translation="no">
弗拉迪斯拉夫,能否请你回答几个问题....
1)渠道选择标准的重要程度是相同的(即你找到了这些标准的最佳组合),或者存在着从较重要的标准到较不重要的标准的一致选择。
2)读了很多聪明的书后,我忘记了要找什么:)。如果我没有理解错,你的意思是在势能函数的概念下,不清楚为什么我们要搜索它,因为搜索的结果将是一个运动轨迹的方程(不是值,而是函数!),在运动中,势能的变化(在运动中,而不是在实现一个终点!)。我明白,价格正是沿着这条轨迹运动的,我们已经选择了近似这条轨迹的方程(回归方程),剩下的只是总结我们对这条轨迹的近似程度。但是,如果我们无论如何寻找,我们实际上可能找到一个二次函数,如果方程Ах^2+Вх+С中的系数В和С与回归方程中的系数相等(或非常接近),也许这就是必要的渠道,尽管我已经进入了怀疑:)


2. 关于渠道中的分配问题...

Vladislav 13.03.06 21:38

....还有一个中心极限定理,它说任何自由度增加的收敛分布都会收敛到正态分布(所以我们并不关心它里面是什么,只要它收敛就可以了;)....

我对这句话的理解是,我们接受渠道中的分布是正常的,并使用正态分布函数计算置信区间。但也有其他逻辑上合理的意见......


solandr 18.06.06 08:42

老实说,只是在不同的N值下的差异是我感兴趣的地方。学生分布的形式在质量上保持不变,但它的数量参数随着自由度的不同而改变。当自由度的数量非常大时,它应该与正态分布相吻合。当自由度数较小时,它与正态分布不同。
学生分布有不同的自由度。
对于99%的概率。
q(30巴)=2.750
q(100巴)=2.626
q(300巴)=2.593
q(1000巴)=2.581
如果你认为30根柱子和1000根柱子的量化值相差6%,不值得付出额外的努力,那么这是你的个人选择。我有一个稍微不同的看法。


3. 还有一个关于赫斯特系数的问题


Jhonny 17.06.06 16:49

...实际上,对于采样小于80的通道,我的Hearst值大于1,所以一定是在某个地方出了错...

但在http://www.xaoc.ru/index.php?option=com_forum&Itemid=0&page=viewtopic&p=2380,有这样一个关于它的声明。
只是在寻找指数时有一个线性近似的误差,把它看成是1

我们可以认为这种说法是真的,还是我的算法更有可能出现错误?

P.S. 我希望我的这些问题没有过多地打扰到你,我期待着你的答复。
 
下午好Vladislav!

你很好地再次查看了这个主题。
当你不在的时候,有几个问题在网上被积极讨论。

1.
Jhonny 16.06.06 16:48

弗拉迪斯拉夫,能否请你回答几个问题....
1)选择渠道的标准的重要程度在你身上是一致的(即你找到这些标准的最佳组合),或者有一个连续的选择,从更重要的标准到不太重要的标准。

不是的--每个人都有不同的权重因素。

2)读了很多聪明的书后,我忘记了我应该找什么:)。如果我没有理解错,你的意思是在势能函数的概念下,不清楚为什么我们要搜索它,因为搜索的结果将是运动势能变化的轨迹的方程(不是值,而是函数!)(在运动过程中,而不是在实现一个终点!)。我明白,价格正是沿着这条轨迹运动的,我们已经选择了近似这条轨迹的方程(回归方程),剩下的只是总结我们对这条轨迹的近似程度。但如果我们无论如何寻找,我们可能会发现一个二次函数,如果方程Ah^2+Bx+C中的系数B和C与回归方程中的系数相等(或非常接近),也许这就是必要的渠道,尽管我已经开始感到怀疑:)


我以前曾多次写过这个问题。当你在寻找一个样本来构建一个回归通道时,你会发现这个样本在某个时间点上可能不是以唯一的方式构建的。必须以某种方式做出选择。我选择了这一点作为我的主要标准--其理由已在该主题的上方列出。算法很简单:建立它,检查它,选择极端的一个。

2. 关于渠道中的分配问题...

Vladislav 13.03.06 21:38

....还有一个中心极限定理,它说任何自由度增加的收敛分布都会收敛到正态分布(所以我们并不关心它里面是什么,只要它收敛就可以了;)....

我对这句话的理解是,我们把通道中的分布当作正态分布,用正态分布函数计算出置信区间。但也有其他逻辑上合理的意见......


不--它被认为是最差的收敛性:)(随着自由度的增加,它也会收敛到正常值)。我写过这个问题,索兰特很正确地理解了它。

solandr 18.06.06 08:42

说实话,我感兴趣的只是在不同的N值下的差异。学生分布的形式在质量上保持不变,但它的数量参数随着自由度的不同而改变。当自由度的数量非常大时,它应该与正态分布相吻合。当自由度数较小时,它与正态分布不同。
学生分布有不同的自由度。
对于99%的概率。
q(30巴)=2.750
q(100巴)=2.626
q(300巴)=2.593
q(1000巴)=2.581
如果你认为30根柱子和1000根柱子的量化值相差6%,不值得付出额外的努力,那么这是你的个人选择。我有一个稍微不同的看法。



3 还有一个关于赫斯特系数的问题


Jhonny 17.06.06 16:49

...实际上,对于采样小于80的通道,我的Hearst值大于1,所以一定是在某个地方出了错...

但在http://www.xaoc.ru/index.php?option=com_forum&Itemid=0&page=viewtopic&p=2380,有这样的说法。
只是在通过线性近似法寻找指数时有一个错误,把它看作是1

我们可以认为这种说法是真的,还是我的算法更有可能出现错误?

P.S. 我希望我的这些问题没有过多地打扰到你,我期待着你的答复。



当然,在计算过程中,会出现错误。主要标准是高于/低于0.5的值(它在公式的版本中,K值为0.5,如果你把它移到0或1,那么分别相对于移位参数)。关于你算法中的错误--可能是;)。除了你,还有谁能检查呢?

好运和良好的趋势。
 
谢谢你,弗拉迪斯拉夫。你会原谅我的,而我已经如此厚颜无耻了......
但关于funkitsonal的问题,至少对我来说,仍然是开放的。我将尝试自己在这个领域发明一些东西:)。再次感谢!
 
来这个话题已经很久了,但那时还没有第四个话题,所有有趣的东西都是从这里开始的。感谢所有参与者,为自己学到了很多有趣的东西。但正如他们所说,很多知识并不是那么多的不幸,而是很多的问题。

在阅读了关于计算赫斯特指数的其他材料后,我看到了费德的一项研究。他声称,经验法则--H=Log(R/S)/Log(0.5*N)的效果相当差,只对小样本给出相对正确的数据(尽管没有说这些样本的大小)。因此,我决定严格按照方法材料实施赫斯特指数的计算(似乎结果比费德先生警告的还要糟糕)。

我意识到,就性能而言,这段代码可能不是最理想的(大量的函数调用和一切),但主要是另一件事--我想澄清我是否正确理解了它的计算逻辑,因为结果在我看来是有问题的,我决定问问有知识的人。

在我的计算中,我只考虑到了手册中的公式,没有任何额外的东西。

实现起来相当简单,以脚本的形式。只有八个函数,我把它们的描述附在下面,还有源代码中的注释。从函数中获取带有计算数据的数组,实现方式如下。每个函数都接收双out[]数组,数组在函数主体中被初始化,根据函数的目的,计算数据被写入数组中。

void GetVn(double out[], int N, int i)
I形成 "流入"-v[]。我把收盘价作为流入。结果被写入数组out[]

void SetArrayMv(double v[], double out[], int N)
我计算了所有观测值的平均流入量-mv[]。该函数接收流入量和观察数 - N

void SetArrayDv(double v[], double out[], double mv[], int N)
我计算流入量的累积偏差 - dv[]。我传递数组 "流入量"、"平均流入量 "和观察数

void SetArrayR(double dv[], int N, double out[])
我计算传播-r[]。我把流入量和观察值的数量传给函数。

void SetArrayS(double v[], double mv[], double out[], int N)
我计算标准偏差 s[]。我传递 "流入量"、"平均流入量 "和观察值的数量

void SetArrayRS(double r[], double s[], double out[], int N)
我计算归一化传播。我把R/S的值写进rs[]数组。我传递函数 "传播"、"标准差 "和观察值的数量

void LogN(double out[], int N)
从N计算数组对数

void GetLine(double x[],double y[], int N)
我计算了近似线的系数。

//+------------------------------------------------------------------+
//|                                                        HERST.mq4 |
//+------------------------------------------------------------------+
#property copyright ""
#property link      "grasn@rambler.ru"

int start()
{
   int i=0;
   int N=100;

   double v[];                         // Приток
   
   double mv[];                        // Средний приток
   double dv[];                        // Накопившееся отклонение
   
   double r[];                         // Размах
   double s[];                         // Стандартное отклонение
   
   double rs[];                        // Нормированный размах
   double logN[];                      // логарифм от N
   
   GetVn(v, N, i);
   SetArrayMv(v, mv, N);
   SetArrayDv(v, dv, mv, N);

   SetArrayR(dv, N, r);
   SetArrayS(v, mv, s, N);
   SetArrayRS(r, s, rs, N);
   
   LogN(logN, N);
            
   GetLine(logN, rs, N);
   
   return(0);
}

// Приток
// ________________________________________________________________________________________
// "Приток".....................................................................double out[]
// Длина выборки......................................................................int N
// номер бара с которого выполняется выборка..........................................int i

void GetVn(double out[], int N, int i)
{
   int n;
   int k;      

   double x[];

   ArrayResize(x, N);
   ArrayInitialize(x, 0.0);

   ArrayResize(out, N);
   ArrayInitialize(out, 0.0);

   k=i+N-1;
      
   for(n=0; n<=N-1; n++)
   {
      x[n]=Close[k];
      k=k-1;
   }

   ArrayCopy(out, x, 0, 0, WHOLE_ARRAY);
      
   return(0);
}

// Средний приток 
// ________________________________________________________________________________________
// Приток ........................................................................double v[]
// Средний приток ..............................................................double out[]
// Число наблюдений...................................................................int N

void SetArrayMv(double v[], double out[], int N)
{
   int n;
   int i;
   
   double SUM;
   double mv[];

   ArrayResize(mv, N);
   ArrayInitialize(mv, 0.0);

   ArrayResize(out, N);
   ArrayInitialize(out, 0.0);
      
   for(n=0; n<=N-1; n++)
   {
      SUM=0.0;   
      
      for(i=0; i<=n; i++)
      {
         SUM=SUM+v[i];
      }
      
      mv[n]=(1.0/(n+1))*SUM;
   }
   
   ArrayCopy(out, mv, 0, 0, WHOLE_ARRAY);
 
   return(0);
}

// Накопившееся отклонение притока от среднего
// ________________________________________________________________________________________
// Приток ........................................................................double v[]
// Накопившееся отклонение притока..............................................double out[]
// Средний приток................................................................double mv[]
// Число наблюдений...................................................................int N

void SetArrayDv(double v[], double out[], double mv[], int N)
{
   int n;
   int i;
   
   double dv[];
   double SUM;

   ArrayResize(dv, N);
   ArrayInitialize(dv, 0.0);

   ArrayResize(out, N);
   ArrayInitialize(out, 0.0);

   for(n=0; n<=N-1; n++)
   {
      SUM=0.0;
      
      for(i=0; i<=n; i++)
      {
         SUM=SUM+(v[i]-mv[i]);
      }
      
      dv[n]=SUM;
   }
   
   ArrayCopy(out, dv, 0, 0, WHOLE_ARRAY);
      
   return(0);   
}

// Размах
// ________________________________________________________________________________________
// Накопившееся отклонение притока от среднего...................................double dv[]
// Размах.......................................................................double out[]
// Число наблюдений...................................................................int N

void SetArrayR(double dv[], int N, double out[])
{
   int n;
   
   int idMax;
   int idMin;
   
   double rn[];
      
   double max;
   double min;

   ArrayResize(rn, N);
   ArrayInitialize(rn, 0.0);

   ArrayResize(out, N);
   ArrayInitialize(out, 0.0);   

   for(n=1; n<=N; n++)
   {
      idMax=ArrayMaximum(dv, n, 0);
      idMin=ArrayMinimum(dv, n, 0);
      
      max=dv[idMax];
      min=dv[idMin];
      
      rn[n]=MathAbs(max-min);
   }
   
   ArrayCopy(out, rn, 0, 0, WHOLE_ARRAY);
   
   return(0);
}

// Стандартное отклонение
// ________________________________________________________________________________________
// Приток.........................................................................double v[]
// Среднее приток................................................................double mv[]
// Стандартное отклонение.......................................................double out[]
// Число наблюдений...................................................................int N

void SetArrayS(double v[], double mv[], double out[], int N)
{
   int n;
   int i;
   
   double sn[];
   double SUM;

   ArrayResize(sn, N);
   ArrayInitialize(sn, 0.0);

   ArrayResize(out, N);
   ArrayInitialize(out, 0.0);   
   
   for(n=0; n<=N-1; n++)
   {
      SUM=0.0;
      
      for(i=0; i<=n; i++)
      {
         SUM=SUM+MathPow((v[i]-mv[i]), 2);
      }
     
      sn[n]=MathSqrt((1.0/(n+1))*SUM);
   }
   
   ArrayCopy(out, sn, 0, 0, WHOLE_ARRAY);
   
   return(0);
}

// Нормированный размах
// ________________________________________________________________________________________
// Размах.........................................................................double r[]
// Стандартное отклонение.........................................................double s[]
// Нормированный размах.........................................................double out[]
// Число наблюдений...................................................................int N
void SetArrayRS(double r[], double s[], double out[], int N)
{
   int n;
   
   double rs[];

   ArrayResize(rs, N);
   ArrayInitialize(rs, 0.0);

   ArrayResize(out, N);
   ArrayInitialize(out, 0.0);  
      
   for(n=3; n<=N-1; n++)
   {  
      if(s[n]==0)
      {
         rs[n]=0.0;
      }
      else 
      {
         rs[n]=MathLog(r[n]/s[n]);
//         Print("rs ", rs[n]);
      }
   }
   
   ArrayCopy(out, rs, 0, 0, WHOLE_ARRAY);
   
   return(0);
}

// Логарифм N
// ________________________________________________________________________________________
// Логарифм N...................................................................double out[]
// Число наблюдений...................................................................int N
void LogN(double out[], int N)
{
   int n;
      
   double logN[];
   
   ArrayResize(logN, N);
   ArrayInitialize(logN, 0.0);

   ArrayResize(out, N);
   ArrayInitialize(out, 0.0);   
   
   for(n=3; n<=N-1; n++)
   {
      logN[n]=MathLog(n);
//      Print("n ", logN[n]);
   }
   
   ArrayCopy(out, logN, 0, 0, WHOLE_ARRAY);
   
   return(0);   
}

// Расчет коэффициентов аппроксимирующей линии
// ______________________________________________________________
// log(R/S).......................................................................double x[]
// log(N)................................................................................y[]
// Число наблюдений...................................................................int N
void GetLine(double x[],double y[], int N)
{
   double m=0;
   double b=0;
   double tan = 0;
      
   int size=N;
   double sum_x=0.0;
   double sum_y=0.0;
   double sum_xy=0.0;
   double sum_xx=0.0;
      
   for (int i=3; i<size; i++)
   {
      sum_x=sum_x+x[i];
      sum_y=sum_y+y[i];
      sum_xy=sum_xy+(x[i]*y[i]);
      sum_xx=sum_xx+(x[i]*x[i]);
   }

   m = (size*sum_xy - sum_x*sum_y) / (size*sum_xx - sum_x*sum_x);
   b = sum_y/size - m * sum_x / size;

           
   Print("Аппроксимирующая прямая: y(x)=", m, "x+", b);
   Print("Показатель Херста= ", m);
   
   return(0);
}



下面是随机系列和欧元兑美元每日报价的log(R/S)和log(N)图 随机系列是用MathRand()生成的,参数如下。 N=100 结果: H=0.5454 Y(x)=0.5454x+0.2653 随着N的增加,Hurst指数接近0.5 EURUSD D1计算的参数如下: i=0(从27.06开始) N=100 计算结果H=1.0107(为什么这么大?) y(x)=1.0197x-0.5885 有几个问题。1.流入的时候要带什么?全价、模数差,还是只有正数差?换句话说,有关方法中的 "流入 "概念是否对数据的预先准备有任何影响?还是应该把要调查的数据作为流入的数据。例如,我凭直觉,在计算中采取了收盘价。 2.如果价差尤其是标准差的值为零,如何确定归一化价差。对于小的数组索引来说,这几乎总是存在的。为了防止检测到零,现在我也把归一化的差值定为零。这是否正确?现在,放弃对第一个数值的计算。3.我不喜欢这些结果本身。下面是欧元兑美元的几个计算变体的例子: 所有条形上的流入(Close[] D1)Hurst指数0.9069 流入(Close[] D1)i=0,N=200 Hurst指数0.8264 这些数字太乐观了,与Vladislava的数据不一致(整个系列为0.64),但也有非常低的数值。对于所有酒吧的价格差异,我得到了赫斯特指数0.5119 4。我对平均流入量的计算是否正确。所有迭代都是一个值,还是应该根据当前的N而改变?5.有一种可能是我把它弄混了,数字的计算方式是错误的。请解释一下我哪里弄错了 :o( PS: 我希望这个论坛的成员能帮助我理解这个问题。如果弗拉迪斯拉夫能花点时间解释一下我在这样一个简单的方法论上哪里出了问题,我将非常感激。




































原因: