この記事は興味深く、とても参考になりました。しかし、疑問があります。このコードでは実数の比較はどの程度正しいのでしょうか?
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 |
これは良い記事だった。著者に感謝する!
私はまだ少し混乱していますが、それについて言いたいことがあります。
Несмотря на значительные преимущества, алгоритм метода отжига имеет следующие недостатки реализации:
- クラウドテストでアルゴリズムを実行できないこと;
- Expert Advisorへの接続の複雑さ、最良の結果を得るためのパラメータ選択の必要性。
この記事を少し修正して、どんなExpert Advisorでも小さな動きで接続できるようにすることを提案します。
例えば、標準的なMoving Average.mq5をアニーリング法の実装に接続することができます。
//+------------------------------------------------------------------+ //|移動平均。mq5|移動平均。 //| Copyright 2009-2017, MetaQuotes Software Corp. //|http://mql5.commql5.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
以上です!これ以上の操作は必要ありません。これを動作させるためには、1つの関数を少し変更する必要がありました。
最適化パラメータを設定する //関数 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を様々なテストで比較する試みが実際に行われた。
最適化可能なパラメーターが1つ、2つ?アニーリングで数百、数千のパラメーターを最適化してみろ。目が覚めますよ。
tester_fileは、コンパイル時に存在した場合のみ読み込まれる(内容は重要ではない)。
対応するファイルが存在しない時にmq5がコンパイルされた場合、EX5ではそれ以降の存在すら認識されない。
したがって、OnTesterInitでtester_file用のファイルを生成する場合は、少なくとも空の渡されたファイルがあるときにEAをコンパイルするようにしてください。
Renat Fatkhullin 氏の発言は少々間違っています。
DLL関数のないEAはどこかにデータを送ることができますか?
Renat Fatkhullin, 2017.06.21 11:12 AM
確認はしていませんが、このファイルはOnTesterInitで直接生成できるものと思われます。
いいえ、パス自体の計算データパケットには入りません。
この記事では、OnTesterInit がエージェントへ送信するデータをファイルとして完全に生成することを示しています。このデータが個人的な性質のものであることは明らかです。
著者は素晴らしい仕事をした。とても興味深い記事だ。
ありがとう。
通常のGAと他のAOを様々なテストで比較する試みが実際に行われてきた。神々は言った-一輪車は存在しない、それにアーメンと。
最適化可能なパラメーターが1、2個?アニーリングで数百、数千のパラメーターを最適化してみろ。あなたの目が開かれるでしょう。
この記事の価値は、最適化アルゴリズムにあるのではなく(それは興味深いものではあるが)、標準的なオプティマイザーに組み込まれている実装にある。その実装は現時点では非常に非標準的で、開発者の発言と矛盾しているものさえある。しかし、それを理解するにはソースコードを読む必要があり、アニーリングアルゴリズム自体には関係ありません。
著者が行ったように、同様に独自のアルゴリズムを組み込み、その長所/短所をエキスパートアドバイザーに直接表示することを妨げるものは何もありません。
この記事は興味深く、とても参考になりました。しかし、疑問があります。このコードでは実数の比較はどの程度正しいのでしょうか?
その通り、このような比較は不可能です。MQL5のヘルプでは、以下の関数を使うことを勧めています:
bool CompareDoubles(double number1,double number2) { if(NormalizeDouble(number1-number2,8)==0) return(true); else return(false); }
しかし、たとえ比較が間違って実行されたとしても、FindValue関数は正しい結果を生成します。
この記事の価値は、最適化アルゴリズムにあるのではなく(それ以上に興味深いものではあるが)、標準のオプティマイザーに組み込まれている実装にある。その実装は現時点では非常に非標準的で、開発者の発言と矛盾しているものさえある。しかし、それを理解するためには、アニーリングアルゴリズム自体には関係ないソースを読む必要がある。
著者が行ったように、同様に独自のアルゴリズムを組み込み、その長所/短所をExpert Advisors上で直接示すことを妨げるものは何もない。
この記事が最適化管理の 実装において価値あるものであることは明らかだが、著者は何らかの理由で標準的なアルゴリズムと比較しており、しかも無視できる程度のパラメータ数で比較している。これは私が投稿で強調しようとしたことであり、アルゴトレーダーの実用的な目的に十分な探索空間範囲(パラメータ数とそのステップ)で標準的なオプティマイザーと競合することは無意味である。
なぜなら、スピードの「ボトルネック」はAOではなくテスターそのものだからだ。
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
新しい記事 制御された最適化: シミュレーティットアニーリング はパブリッシュされました:
MetaTrader5トレーディングプラットフォームのストラテジーテスターは、パラメータと遺伝的アルゴリズムの完全な検索、つまり、2 つの最適化オプションのみを提供します。 この記事では、トレーディング戦略を最適化するための新しいメソッドを提案します (シミュレーティットアニーリング)。 このメソッドのアルゴリズム、実装、およびEAへの統合を考察します。 開発したアルゴリズムは移動平均 EA でテストします。
最適化するパラメータを持つエキスパートにアルゴリズムを統合する実装と手順を考えてみましょう。
アルゴリズムの実装は、最適化されたEAに含める必要があり、2つの新しいクラスが必要になります。
また、このアルゴリズムの操作には、OnTester、OnTesterInit、OnTesterDeInit、OnTesterPass 関数を EA コードに追加するための追加のコードがあります。 このアルゴリズムをエキスパートに統合するプロセスを図2に示します。
図2. EAのアルゴリズムを含む
作者: Aleksey Zinovik