文章 "可控优化: 模拟退火"

 

新文章 可控优化: 模拟退火已发布:

MetaTrader 5 交易平台中的策略测试器只提供两种优化选项: 参数完整搜索和遗传算法。 本文提出了一种交易策略优化的新方法 — 模拟退火。 该方法的算法, 其实现和集成到任何智能交易系统的方方面面均加以考虑。 开发出的算法已在移动平均 EA 上进行了测试。

我们来研究算法的实现, 以及将其集成到含有可优化参数的智能系统之中的过程。

算法的实现需要两个新类, 应该包含在优化的智能交易系统中:

  • AnnealingMethod.mqh 类 — 包含一组算法分步实现的方法;
  • FrameAnnealingMethod.mqh 类 — 包含在终端图表中显示操作图形界面的方法。

此外, 算法的操作需要将附加代码包含在 OnInit 函数中, 并将函数 OnTester, OnTesterInit, OnTesterDeInit, OnTesterPass 添加到 EA 代码中。 将算法集成到智能系统的过程如图例 2 所示。


图例 2. 将算法包含在智能交易系统中

作者:Aleksey Zinovik

 

这篇文章很有趣,对我很有帮助。不过,我有一个问题:在这段代码中,实数比较的正确性如何?

double AnnealingMethod::FindValue(double val,double step)
  {
   double buf=0;
   if(val==step)
      return val;
   if(step==1)
      return round(val);
 
缺席
Images\AnnealingMethod\back.bmp
Images\AnnealingMethod\pause.bmp
Images\AnnealingMethod\play.bmp
Images\AnnealingMethod\stop.bmp
Images\AnnealingMethod\forward.bmp
 

感谢您的留言,已更正

AnnealingMethod.zip
Zip-файл с картинками для создания интерфейса плеера. Файлы нужно разместить в папке MQL5/Images/AnnealingMethod


 

这是一篇好文章。感谢作者!

我还是有点困惑,但我想说说我的看法

Несмотря на значительные преимущества, алгоритм метода отжига имеет следующие недостатки реализации:

  • 无法在云测试中运行算法;
  • 连接到智能交易系统的复杂性,以及选择参数以获得最佳结果的必要性。

我建议对文章稍作调整,这样您就可以连接任何移动幅度较小的智能交易系统。

例如,您可以将标准移动平均线.mq5 与所介绍的退火法实施连接起来,如下所示

//+------------------------------------------------------------------+
//|移动平均线。mq5
//| 版权所有 2009-2017, MetaQuotes Software Corp.
//|http://www.mql5.com | |
//+------------------------------------------------------------------+
#property copyright "Copyright 2009-2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"

#include <Trade\Trade.mqh>

input double MaximumRisk        = 0.02;    // 以百分比表示的最大风险
input double DecreaseFactor     = 3;       // 减缩因子。
input int    MovingPeriod       = 12;      // 移动平均周期
input int    MovingShift        = 6;       // 移动平均数移动

// 在所有输入之后插入
#include <AddAnnealingMethod.mqh>
#define  MaximumRisk         Inputs[0]
#define  DecreaseFactor      Inputs[1]
#define  MovingPeriod   (int)Inputs[2]
#define  MovingShift    (int)Inputs[3]

//---
int    ExtHandle=0;
bool   ExtHedging=false;
CTrade ExtTrade;

#define  MA_MAGIC 1234501

仅此而已!无需更多操作。为了使其正常工作,我们必须对一个函数稍作改动

// 设置优化参数的函数
uint AnnealingMethod::RunOptimization(string &InputParams[],int count,double F0,double T)
  {
   Input Mass[];
   ArrayResize(Mass, ArraySize(InputParams));
   
   ResetLastError();
   bool Enable=false;
   double Start= 0;
   double Stop = 0;
   double Step = 0;
   double Value= 0;
   int j=0;
   Alg.HQRndRandomize(&state);//初始化
   for(int i=0;i<ArraySize(InputParams);i++)
     {
      if(!ParameterGetRange(InputParams[i],Enable,Value,Start,Step,Stop))
         return GetLastError();
// if(Enable)
        {
// ArrayResize(Mass,ArraySize(Mass)+1);
         Mass[j].num=i;
// Mass[j].Value=UniformValue(Start,Stop,Step);
         Mass[j].Value=Enable ? UniformValue(Start,Stop,Step) : Value;
         Mass[j].BestValue=Mass[j].Value;
         Mass[j].Start=Start;
         Mass[j].Stop=Stop;
         Mass[j].Step=Step;
         Mass[j].Temp=T*Distance(Start,Stop);
         j++;
// if(!ParameterSetRange(InputParams[i],false,Value,Start,Stop,count))
         if(Enable && !ParameterSetRange(InputParams[i],false,Value,Start,Step,Stop))
            return GetLastError();
        }
// 否则
// InputParams[i]=""";
     }
   if(j!=0)
     {
      if(!ParameterSetRange("iteration",true,1,1,1,count))
         return GetLastError();
      else
         return WriteData(Mass,F0,1);
     }
   return 0;
  }

并在AddAnnealingMethod.mqh 中隐藏一段代码。

附加的文件:
 

Таким образом, алгоритм сверхбыстрого отжига — достойный конкурент ГА и при правильных настройках может показать лучший результат.

在什么 "正确 "设置下?

优化算法的意义在于缩小搜索空间。如果搜索 正在进行,就意味着不知道 FF 公式(否则可以使用基于 FF 的公式计算极值),因此不存在 "正确设置"。

在其他条件相同的情况下,算法要么追求更好,要么追求更差,不可能怀才不遇。

在各种测试中,人们确实尝试比较过普通 GA 和其他 AO。上帝说--不会有战斗,阿门。

ZY.1、2 个可优化的参数?试试用你的退火方法优化几百、几千个参数.....。你会大开眼界的。

 

tester_file 仅在编译时存在(内容并不重要)的情况下才会被读取。

如果在编译 mq5 时没有相应的文件,EX5 将无法感知它的存在。

因此,如果在 OnTesterInit 中为 tester_file 生成文件,请确保在编译 EA 时至少有一个空的通过文件。


@Renat Fatkhullin 的说法有些错误

关于交易、自动交易系统和测试交易策略的论坛

没有 DLL 函数的 EA 可以向某处发送数据吗?

Renat Fatkhullin, 2017.06.21 11:12 AM

fxsaber:

我没有检查过,但我想这个文件可以直接在 OnTesterInit 中生成。

不,它不会进入通证本身的计算数据包。


文章显示,OnTesterInit 完美地生成了要以文件形式发送给代理的数据。很明显,这些数据可以是个人性质的...

 

作者写得很棒。文章非常有趣。

谢谢。

 
Andrey Dik:

已经有人尝试在各种测试中对普通 GA 和其他 AO 进行比较。"上帝 "说过--不会有独轮车,阿门。

ZY。1、2个可优化的参数?这简直是.....。试着用你的退火.....,优化几百、几千个参数。你会大开眼界的。

这篇文章的价值不在于优化算法(尽管它非常有趣),而在于标准优化器的实现。目前,该实现非常不标准,甚至与开发人员的某些声明相矛盾。但要理解它,你需要阅读源代码,这与退火算法本身无关。

您也可以像作者一样,直接在智能交易系统中嵌入自己的算法并显示其优缺点。

 
Sergey Pavlov:

这篇文章很有趣,对我很有帮助。不过,我有一个问题:在这段代码中,实数比较的正确性如何?

是的,你说得对,不可能这样比较。MQL5 帮助建议使用以下函数:

bool CompareDoubles(double number1,double number2) 
  { 
   if(NormalizeDouble(number1-number2,8)==0) return(true); 
   else return(false); 
  } 

但即使比较方法不正确,FindValue 函数也会产生正确的结果

 
fxsaber:

这篇文章的价值不在于优化算法(尽管它非常有趣),而在于标准优化器的实现。目前,该实现非常不标准,甚至与开发人员的某些声明相矛盾。但要理解它,你需要阅读与退火算法本身无关的资料。

没有什么能阻止你像作者一样,直接在 Expert Advisors 上嵌入自己的算法并显示其优缺点。

很明显,这篇文章在实施优化管理 方面很有价值,但作者出于某种原因将其与标准算法进行了比较,甚至是在参数数量少到可以忽略不计的情况下--这正是我在帖子中试图强调的,在搜索空间范围(参数数量及其步长)内与标准优化器竞争对算法交易商的实际用途来说是毫无用处的。

如果要使用自定义优化,也绝对不是这种方式,因为速度的 "瓶颈 "是测试仪本身,而不是 AO,而且质量问题已经提到过了--标准优化已经足够好了。