算法的''离心机'' - 页 13

 
Aleksei Stepanenko:

好的,...

- 也许是其他的东西...

我们需要用GA以某种方式找到IT(理想点)。我正在考虑这个问题。
 
Igor Makanu:

历史上理想的进入点--ZigZag,你已经拒绝了

我不想用ZigZag,因为它亵渎了这个想法。如果ZZ是一个完美的完美点指标,那么它就是所有指标中最理想的,因为它比其他任何指标都更准确地击中了完美点。事实证明--ZigZag应该出现在所有策略的每一个贸易信号构建中。而这是无稽之谈。

我认为,历史上的交易区域应该由以下标准决定:时间/利润/风险和使用GA。

 
Реter Konow:

我不想用ZigZag,因为它亵渎了这个想法。如果ZZ是一个完美的完美点指标,那么它就是所有指标中最理想的,因为它比其他任何指标都更准确地击中了完美点。事实证明--ZigZag应该出现在所有策略的每一个贸易信号构建中。而这是无稽之谈。

我认为,历史上的交易领域应该由以下标准决定:时间/利润/风险和使用GA。

我不反对

我看不出有什么可讨论的,我先走了。

 
Реter Konow:
我们需要以某种方式让大会参与寻找IT(理想点)。我正在考虑这个问题。

我不明白,完美点在历史上已经是众所周知的了。 它们是极值,你可以用眼睛看到它们。它不需要复杂的算法来寻找极值。我们只需要确定识别它们的条件(例如,在两个相对相邻的极值之间超过一定数量的点)。然后我们可以创建一个由这些极值(价格,日期)组成的数组,并使用相同的历史记录检查每个极值点(或其接近点)的任何指标的值。对吗?

这里有一个 "不成功便成仁 "的代码,用于搜索和存储历史的极值(没有性能保证)。

input double Distance=100;

//каждый элемент массива будет содержать три поля: дата, цена и положение экстремума (верх, низ) 
struct sextr{datetime time; double price; int position;} Extremes[];

void OnStart()
   {
   int Total=iBars(Symbol(),0);
   for(int i=Total-1; i>=0; i--)
      {
      WriteExtremum(Extremes,Distance,Symbol(),0,i);
      }
   }   

//здесь записываем экстремумы в массив
void WriteExtremum(sextr &eExtremes[], double eDistance, string eSymbol, int eTimeFrame, int eShift)
   {
   int eFinish=ArraySize(eExtremes)-1;
   double eHigh=iHigh(eSymbol,eTimeFrame,eShift);
   double eLow=iLow(eSymbol,eTimeFrame,eShift);
   datetime eTime=iTime(eSymbol,eTimeFrame,eShift);
   //если массив пустой
   if(eFinish<0)
      {
      ArrayResize(eExtremes,++eFinish+1);
      eExtremes[eFinish].time=eTime;
      //пока мы не знаем какой из экстремумов будет в первом элементе, поэтому берём цену по середине
      //можно сделать более грамотнее, но лень. Поэтому первый экстремум у нас будет бракованный 
      //и мы его потом затрём 
      eExtremes[eFinish].price=(eHigh+eLow)/2;
      eExtremes[eFinish].position=0;
      }
   //если в массиве есть элементы
   else
      {
      //текущий элемент - максимум
      if(eExtremes[eFinish].position==1)
         {
         //произошло обновление текущего экстремума
         if(eHigh-eExtremes[eFinish].price>0)
            {
            eExtremes[eFinish].time=eTime;
            eExtremes[eFinish].price=eHigh;
            }         
         //произошло превышение расстояния между противоположными экстремумами
         if(eExtremes[eFinish].price-eLow>eDistance)
            {
            ArrayResize(eExtremes,++eFinish+1);
            eExtremes[eFinish].time=eTime;
            eExtremes[eFinish].price=eLow;
            eExtremes[eFinish].position=-1;
            }
         }
      //текущий элемент - минимум
      if(eExtremes[eFinish].position==-1)
         {
         //произошло обновление текущего экстремума
         if(eExtremes[eFinish].price-eLow>0)
            {
            eExtremes[eFinish].time=eTime;
            eExtremes[eFinish].price=eLow;
            }         
         //произошло превышение расстояния между противоположными экстремумами
         if(eHigh-eExtremes[eFinish].price>eDistance)
            {
            ArrayResize(eExtremes,++eFinish+1);
            eExtremes[eFinish].time=eTime;
            eExtremes[eFinish].price=eHigh;
            eExtremes[eFinish].position=1;
            }
         }
      //эта ситуация, когда первый элемент не закрылся, и не понятно максимум это будет или минимум
      //если произошло превышение в любую сторону, тогда затираем значения первого элемента
      if(extremes[eFinish].position==0)
         {
         //произошло превышение расстояния между противоположными экстремумами
         if(eHigh-eExtremes[eFinish].price>eDistance)
            {
            eExtremes[eFinish].time=eTime;
            eExtremes[eFinish].price=eHigh;
            eExtremes[eFinish].position=1;
            }            
         if(eExtremes[eFinish].price-eLow>eDistance)
            {
            eExtremes[eFinish].time=eTime;
            eExtremes[eFinish].price=eLow;
            eExtremes[eFinish].position=-1;
            }
         }
      }   
   }

此外,这段代码应该捕捉和处理螺柱--也就是说,当一个蜡烛同时与最大值和最小值重叠时,以及极值之间的最小时间。

现在,带有极值的数组被填满了,你知道在哪里和什么时候看你的指标。但对其有用性的怀疑仍然存在:)

 
Реter Konow:

我不想用ZigZag,因为它亵渎了这个想法。如果ZZ是一个完美点的指标,那么它就是所有指标中最理想的,因为它比其他任何指标都更准确地击中了完美点。事实证明--ZigZag应该出现在所有策略的每一个贸易信号构建中。而这是无稽之谈。

我认为,历史上的交易区域应该由以下标准决定:时间/利润/风险和使用GA。

你不了解Zig-Zag指标的BIT...

ZZ指标确实是一个理想的指标,但只是 作为 其他指标的 一个设置

 
Serqey Nikitin:

你不明白Zig-Zag指标的意义...

ZZ指标确实是一个理想的指标,但只是 作为 其他指标的 一个设置

ZZ的问题是,它没有考虑到交易的时间/利润/风险比率。
ZZ的进入点将产生不相称的交易。他们不会考虑到趋势/浮动。走廊将与山峰一起被放置在各行业的内部。
ZZ容纳了所有的动态,用它来挑选其他指标似乎毫无意义。至少它是不聪明的。

我们需要另一种方法。不仅要有理想的进入/退出点,还要遵守交易的内部比例--头寸持续的时间,其利润和风险。

这里所说的风险,我指的不是手数、止损和存款的比率,而是未平仓头寸 中价格变化的稳定性。变化越不稳定(锤击),损失利润的风险越大。

因此,不应根据 "利润越高越好 "的原则寻求理想的进入/退出点,而应根据 "理想的交易是时间、利润和风险比例最佳的交易 "的原则。

这是我的看法。
 
Aleksei Stepanenko:

我不明白,理想的点在历史上已经知道了。 这些是极点,可以用眼睛看到。它不需要复杂的算法来寻找极值。我们只需要确定识别它们的条件(例如,在两个相对相邻的极值之间超过一定数量的点)。然后我们可以创建一个由这些极值(价格、日期)组成的数组,并使用相同的历史记录检查每个极值点(或其接近点)的任何指标的值。对吗?

这里有一个搜索和存储历史极值 的碎裂的代码例子(不保证性能)。

此外,这段代码应该捕捉和处理尖峰--当一个蜡烛图同时覆盖最大和最小,以及极值之间的最小时间。

现在,带有极值的数组已经填好,你知道在什么地方和什么时候看你的指标。但对其有用性仍有疑问:)

谢谢你的代码。不过,不知道找到信息技术有多容易。
 

彼得,你能在图表上画出几个手绘交易的例子吗?进入和退出。最好是取一块有各种价格变动的图表。并在这些点上解释原因。交易的时间/利润/风险比率是多少?

因为我不太理解你对理想点的看法。

 
Aleksei Stepanenko:

彼得,你能在图表上画出几个手绘交易的例子吗?进入和退出。最好是取一块有各种价格变动的图表。并在这些点上解释原因。交易的时间/利润/风险比率是多少?

因为我不太理解你对理想点的看法。

是的,我以后会这样做。我自己还没有完全搞清楚。我可能会改变我的观点。所以,如果有什么事的话,对不起。))
 

没问题。

你把气撒在Zig-Zag身上,这很有意义。Zig-Zag对这个趋势一无所知。它就像时钟一样,既是趋势又是平坦的。 他的波浪(膝盖)不是趋势波。趋势波是根据以下规则建立的:如果一个趋势征服了新的山峰,则被认为是持续的。这意味着下一个趋势波总是超过前一个趋势波,如果它没有,那么它就不是一个波。