在Metatrader 5中你的符号和你的数据源 - 页 11

 

我将添加另一个测试函数,包含两个均匀的最高值的高原。

z = abs(tanh(x) + tanh(y))

z = abs(tanh(x) + tanh(y))

如果你将X,Y从-20改为+20,步长为0.1,那么完整的迭代需要160801次。

在测试中,这两个高原在1400次迭代中出现,这还不到完整搜索的百分之一。

有人会在GA上运行这个吗?有意思的是要进行比较。

 
event:

我将添加另一个测试函数,包含两个均匀的最高值的高原。

z = abs(tanh(x) + tanh(y))

如果你将X,Y从-20改为+20,步长为0.1,那么完整的迭代需要160801次。

在测试中,这两个高原在1400次迭代中出现,这还不到完整搜索的百分之一。

有人会在GA上运行这个吗?有意思的是要进行比较。

你不是在用GA看吗?

用优化后的函数的两个参数来工作,一点也不说明问题。不仅是因为搜索空间小,而且还因为搜索算法本身的 "坏 "属性会出现。

将公式转换成至少有10个参数的形式,算法的所有正负属性都会显示出来。

 
joo:

你不是在找GA吗?

用一个优化的函数的两个参数来工作,一点也不说明问题。不仅是因为搜索空间小,而且还因为搜索算法本身的 "坏 "属性会出现。

将公式转换为至少10个参数的形式--算法的所有正负属性将一次性出现。

这不是GA,在这个主题里有一个文章的链接。

上面我贴了一个有六个参数的例子。显示大量参数的整个困难。

如果你建议一个有更多参数的函数--我将做一个测试。

 
event:

如果你建议一个有更多参数的函数--我会做一个测试。

Y=a+b。

其中。

a=皮肤(x1,y1)+皮肤(x2,y2)+皮肤(x3,y3)+皮肤(x4,y4)+皮肤(x5,y5)。

b=皮肤(x6,y6)+皮肤(x7,y7)+皮肤(x8,y8)+皮肤(x9,y9)+皮肤(x10,y10)。

你已经知道在哪里可以找到 "皮肤 "功能。

所以有20个变量,Y函数非常容易可视化。你可以利用这一原则建立一个参数数量无限的函数,但仍然能够将其可视化。

而相应地,最后的结果是以Y*2/n与已知的极值进行核对,其中n是参数的总数。

 
Laryx:

你能给我一个算法的例子,在 "转向不足 "中,完全的转向过度只需十几个小时,而在MT中则需要几个月?

完整的搜索比优化启发式更快,这也是现实的。在MT中,一个完整的蛮力攻击被表示为一组独立的运行。事实上,总是有可能将优化视为一个单一的计算问题,并对其应用算法优化。

在这种方法中,传递的顺序非常重要,因为几乎所有的计算都是缓存的。对于TC的几乎每一个(所有独立的)输入参数,在优化器中总是有全局缓冲区来存储以前的值。

例如,你使用MA MA和PriceChannel。对于这些指标中的每一个都有自己独立的输入参数。这就是为什么我们为每个指标规定(实际上只有几行,用OOP应该更漂亮)函数来填充其全局缓冲区。然后我们比较每个指标的资源强度(PriceChannel比MA更重)。较重指标的输入参数在外部循环(第一个for)中开始列举,简单指标在内部循环(嵌套for)中列举。

这就是我们获得巨大收益的地方。此外,还有C++、整数计算和我们自己的订单系统,没有不必要的检查。这就是你如何得到的结果。因此,单次运行至少比MT快一个数量级。而且优化的速度也快了好几个数量级。

在MT-优化器中缺少的是OnOptimization功能,它可以提供对所获得的优化结果 矩阵的完全访问。我在那里对获得的矩阵进行各种分析:过滤,合并交易时间不重叠的订单,等等。但是,更有用的是计算每个通道的权重系数,以适当的投资组合形式组成一个元TS。为此,OnOptimization为每一个非 "无望 "的通行证都有一个向量-平等。

但是,在寻找工作中的TS的阶段,并没有发明底层测试者,而是当它已经被发现时,不幸的是。搜索本身是一个完全不同的阶段:没有描述。
 
event:

有人会在GA上运行这个吗?有意思的是要进行比较。

 
joo:

Y=a+b。

其中。

a=皮肤(x1,y1)+皮肤(x2,y2)+皮肤(x3,y3)+皮肤(x4,y4)+皮肤(x5,y5)。

b=皮肤(x6,y6)+皮肤(x7,y7)+皮肤(x8,y8)+皮肤(x9,y9)+皮肤(x10,y10)。

你已经知道在哪里可以找到 "皮肤 "功能。

所以有20个变量,Y函数非常容易可视化。你可以利用这一原则建立一个参数数量无限的函数,但仍然能够将其可视化。

而相应地,最后的结果是以Y*2/n与已知的极值进行核对,其中n是参数的总数。

可怕的事情...)那你能解释一下"函数Y非常容易被视觉化"吗?
 
Serj_Che:
计算时要经过多少次,以什么样的可变间距?
 
event:
计算时要经过多少次,用哪一步的变量?

如果你不喜欢这幅画,谁会在乎呢?

MT5中的64位GA非常好,它可以解决任何问题,主要是要正确表述问题。

我不知道你在这个关于GA的主题中所说的书呆子是什么样的人。

我不认为问题出在GA上,但测试器本身是无用的,特别是在交易所,因为错误的报价历史存储和不可能保存自己的历史。

我希望这个问题能得到解决,但我恐怕要等上3-5年。

 
zaskok:

例如,你使用MA和PriceChannel。这些指标中的每一个都有自己独立的输入参数。因此,对于每个指标都有一个写好的(实际上只有几行,用OOP肯定更漂亮)函数来填充其相应的全局缓冲区。然后我们比较每个指标的资源强度(PriceChannel比MA更重)。较重的指标的输入参数在外部循环(第一个for)中开始列举,简单的指标在内部循环(嵌套for)中列举。

直觉告诉我,这种方法也可以在GA下轻松完成。工作量是差不多的。内循环 "每次都会通过...

但是,最重要的是--那会有多少需求?正如我猜想的那样,不是每个人都会使用甚至是简单的自定义OnTester()函数。但这是一个非常强大的优化工具。

例如,这里是我的一个实施方案。

double CDoublePeakBottomAdvisorPartsFactory::MyOnTester(CMyExpertT* pmeExpert)
{
   ulong ulTickedTime = pmeExpert.GetTickedTime();
   uint  uiTotalNumberOfSL = pmeExpert.GetNumOfLosePositions();

   double dDDPercent = TesterStatistics(STAT_EQUITY_DDREL_PERCENT);
   double dStartBalance = TesterStatistics(STAT_INITIAL_DEPOSIT);
   double dProfit = TesterStatistics(STAT_PROFIT);
   double dNumOfTrades = TesterStatistics(STAT_TRADES);
   double dNumOfProfitTrades = TesterStatistics(STAT_PROFIT_TRADES);
   double dMaxNumOfSL = TesterStatistics(STAT_MAX_CONLOSS_TRADES);
   double dRecoveryFactor = TesterStatistics(STAT_RECOVERY_FACTOR);
   double dProfitTradesPerWeek = dNumOfProfitTrades/ulTickedTime*SECS_IN_WEEK;
   double dProfitPerDay = dProfit/ulTickedTime*SECS_IN_DAY;
  

   Print("Ticked time (days): ",DoubleToString(ulTickedTime/SECS_IN_DAY,2));

   Print("Number Of Trades: ",DoubleToString(dNumOfTrades,1));

   if(dNumOfTrades == 0)
      {
      Print("Ни одного трейда !");
      return(-100000);
      };


   if(dMaxNumOfSL > uiIMaxNumOfSeqSL)
      return(-10000 - dMaxNumOfSL*100 + dProfit/1000);
  
   
   double dBarsPerTrade = ((double)ulTickedTime/PeriodSeconds(m_didData.m_etTimeFrame))/dNumOfTrades;

   if((bILongAllow == false) || (bIShortAllow == false))
      dBarsPerTrade /= 2;
   
   if(dBarsPerTrade < MIN_BARS_PER_TRADE)
      return(dBarsPerTrade-MIN_BARS_PER_TRADE + dRecoveryFactor);

   Print("Max number Of SL: ",DoubleToString(dMaxNumOfSL,1));

   if(iIMaxNumOfSeqSLForQualify > 0 && dMaxNumOfSL > iIMaxNumOfSeqSLForQualify)
      {
      Print("Слишком много СЛ подряд !");
      return(dRecoveryFactor - (dMaxNumOfSL-iIMaxNumOfSeqSLForQualify)*1000)-10000;
      };

   Print("Bars Per Trade (half): ",DoubleToString(dBarsPerTrade,1));
        
   if(dBarsPerTrade > MAX_BARS_PER_TRADE)
      {
      Print("Слишком редкие трейды !");
      return(dRecoveryFactor - dBarsPerTrade/100);
      };
     

   Print("Profit: ",DoubleToString(dProfit,3));
   Print("Profit per day: ",DoubleToString(dProfitPerDay,3));
   Print("Число СЛ: ",IntegerToString(uiTotalNumberOfSL));


   Print("Приемлемая торговля.");
   
   return(dRecoveryFactor + (1-(uiTotalNumberOfSL/dNumOfTrades))*100);
};

在这里,它是基于恢复因子,但它突出了连续SL的最低数量和相当频繁的交易的运行。

然而,在我看来--大多数人使用的是标准选项。