这篇文章很有趣,对我很有帮助。不过,我有一个问题:在这段代码中,实数比较的正确性如何?
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 的说法有些错误
Renat Fatkhullin, 2017.06.21 11:12 AM
我没有检查过,但我想这个文件可以直接在 OnTesterInit 中生成。
不,它不会进入通证本身的计算数据包。
文章显示,OnTesterInit 完美地生成了要以文件形式发送给代理的数据。很明显,这些数据可以是个人性质的...
作者写得很棒。文章非常有趣。
谢谢。
已经有人尝试在各种测试中对普通 GA 和其他 AO 进行比较。"上帝 "说过--不会有独轮车,阿门。
ZY。1、2个可优化的参数?这简直是.....。试着用你的退火.....,优化几百、几千个参数。你会大开眼界的。
这篇文章的价值不在于优化算法(尽管它非常有趣),而在于标准优化器的实现。目前,该实现非常不标准,甚至与开发人员的某些声明相矛盾。但要理解它,你需要阅读源代码,这与退火算法本身无关。
您也可以像作者一样,直接在智能交易系统中嵌入自己的算法并显示其优缺点。
这篇文章很有趣,对我很有帮助。不过,我有一个问题:在这段代码中,实数比较的正确性如何?
是的,你说得对,不可能这样比较。MQL5 帮助建议使用以下函数:
bool CompareDoubles(double number1,double number2) { if(NormalizeDouble(number1-number2,8)==0) return(true); else return(false); }
但即使比较方法不正确,FindValue 函数也会产生正确的结果
这篇文章的价值不在于优化算法(尽管它非常有趣),而在于标准优化器的实现。目前,该实现非常不标准,甚至与开发人员的某些声明相矛盾。但要理解它,你需要阅读与退火算法本身无关的资料。
没有什么能阻止你像作者一样,直接在 Expert Advisors 上嵌入自己的算法并显示其优缺点。
很明显,这篇文章在实施优化管理 方面很有价值,但作者出于某种原因将其与标准算法进行了比较,甚至是在参数数量少到可以忽略不计的情况下--这正是我在帖子中试图强调的,在搜索空间范围(参数数量及其步长)内与标准优化器竞争对算法交易商的实际用途来说是毫无用处的。
如果要使用自定义优化,也绝对不是这种方式,因为速度的 "瓶颈 "是测试仪本身,而不是 AO,而且质量问题已经提到过了--标准优化已经足够好了。
新文章 可控优化: 模拟退火已发布:
MetaTrader 5 交易平台中的策略测试器只提供两种优化选项: 参数完整搜索和遗传算法。 本文提出了一种交易策略优化的新方法 — 模拟退火。 该方法的算法, 其实现和集成到任何智能交易系统的方方面面均加以考虑。 开发出的算法已在移动平均 EA 上进行了测试。
我们来研究算法的实现, 以及将其集成到含有可优化参数的智能系统之中的过程。
算法的实现需要两个新类, 应该包含在优化的智能交易系统中:
此外, 算法的操作需要将附加代码包含在 OnInit 函数中, 并将函数 OnTester, OnTesterInit, OnTesterDeInit, OnTesterPass 添加到 EA 代码中。 将算法集成到智能系统的过程如图例 2 所示。
图例 2. 将算法包含在智能交易系统中
作者:Aleksey Zinovik