
メタトレーダー5の EA の自動最適化
イントロダクション
EA、BuddyIlanは、4つの主要なパラメータを使用して、相場の変化に合わせて、毎週自動的に最適化しようと思います。
パラメータは次のとおりです。
- SL,
- TP,
- STOFilter,
- STOTimeFrameFilter.
この種のプロセスを毎週手動で起動するのは非現実的であるため、繰り返しタスクを実行するために既存のメカニズムを探しましたが、どれも上手くいかなかったため (MetaTrader5の場合)、開発しました。
メタトレーダー4向けの記事"Automated Optimization of a Trading Robot in Real Trading"を記したIgor Malcevに感謝の意を表します。
原則
最初の Metatrader 5 インスタンスは24時間実行していますが、このインスタンスは BuddyIlanEAをホストしており、現在動作するEA(Optimizer EA) と、2番目のMetatrader5インスタンスの最適化プロセスを開始します。
プロセスの終わりに、オプティマイザEAは、実行中のBuddy IlanEAによって読み取られるグローバル変数に最適化された値を設定します。
この最適化は、自動的に毎週土曜日にスケジューリングされます。
データのコピー
前述したように、2つのMetaTrader5インスタンスが必要です。
最初の MetaTrader5 インスタンスは、2つのインスタンス間で構成、パラメータ、およびレポートファイルをコピーする役割を担っています。
セキュリティ上の理由から、MetaTrader5 ではサンドボックス外のファイルへのアクセスはできませんので、DOS コマンド "xcopy " を使用して2つの環境間でデータをコピーします。
これを行うには、次のようにWindows ベースの DLL を使用する必要があります:
#import "shell32.dll" int ShellExecuteW(int hwnd,string Operation,string File,string Parameters,string Directory,int ShowCmd); #import
この関数の呼び出しは、次のように行われます。
string PathIniFile = sTerminalTesterDataPath + "\\config\\common.ini"; string PathTester=TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL5\\Files\\Optimiser\\"; int ret=ShellExecuteW(0,"Open","xcopy","\""+PathIniFile+"\" \""+PathTester+"\" /y","",0);
この関数は、例えば、最適化プロセスを開始するために呼び出されます:
int start = ShellExecuteW(0, "Open", sTerminalTesterPath + "\\terminal64.exe", "/config:" + TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Files\\Optimiser\\optimise.ini", "", 0); if(start<32) { Print("Failed starting Tester"); return false; }
DLL のインポートは、この EAが承認する必要があります:
自動最適化
MetaTrader5は、オンラインコマンド (参照:トレーディングプラットフォームを起動する方法)で起動することができます。自動タスクもこの方法で起動することができます。
たとえば、デフォルトの設定ファイル (common .ini) にスタンザ "[Tester] " を追加して、MetaTrader5 起動時に自動最適化を開始することができます。
これがこれからやろうとしているやり方です。
実装
オプティマイザ EA はMetaTrader5テスターインスタンスのパスを知る必要があり、パラメータとしてエントリされます。
input string sTerminalTesterPath = "C:\\Program Files\\ForexTime MT5"; input string sTerminalTesterDataPath="C:\\Users\\BPA\\AppData\\Roaming\\MetaQuotes\\Terminal\\5405B7A2ED87FF45712A041DEF45780";
最初の MetaTrader5 インスタンスでは、ワーキングディレクトリ "MQL5\Files\Optimiser" を定義します。
関数 "CopyAndMoveCommonIni() " の下に、MetaTrader5テスターインスタンスのデフォルトの構成ファイル "common .ini " をタスクディレクトリにコピーし、 "optimise .ini " として名前を変更します。
bool CopyAndMoveCommonIni() { string PathIniFile= sTerminalTesterDataPath+"\\config\\common.ini"; string PathTester = TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL5\\Files\\Optimiser\\"; int ret=ShellExecuteW(0,"Open","xcopy","\""+PathIniFile+"\" \""+PathTester+"\" /y","",0); //ファイルがコピーされるまで待ちます。 Sleep(2500); if(ret<32) { Print("Failed copying ini file"); return false; } //サンドボックスで稼働中、通常のメタトレーダー5のファイルコマンドを使用することができます string IniFileName="Optimiser\\common.ini"; string CopyTo="Optimiser\\optimise.ini"; return FileMove( IniFileName, 0, CopyTo, 0 ); }
興味のある方は、 "ShellExecuteW " 関数の詳細については、ここにあります: ShellExecuteW。 この関数は、DOS コマンドの実行が返されるのを待たずに、遅延 (Sleep 2500) を使用します。
ここでは、このファイルにスタンザ "Tester" を追加します。
bool AddTesterStanza() { int filehandle=FileOpen("Optimiser\\Optimise.ini",FILE_READ|FILE_WRITE|FILE_TXT); if(filehandle!=INVALID_HANDLE) { FileSeek(filehandle,0,SEEK_END); FileWrite(filehandle,"[Tester]\n", "Expert=BuddyIlan\\BuddyIlan\n", "ExpertParameters=BuddyIlanTester.set\n", "Symbol="+_Symbol+"\n", "Period=M15\n", "Login=\n", "Model=4\n", "ExecutionMode=0\n", "Optimization=2\n", "OptimizationCriterion=0\n", "FromDate="+TimeToString(TimeGMT()-InpTesterPeriod*86400,TIME_DATE)+"\n", "ToDate="+TimeToString(TimeGMT(),TIME_DATE)+"\n", "ForwardMode=0\n", "Report=MQL5\\Files\\Reports\\BuddyIlanReport\n", "ReplaceReport=1\n", "ShutdownTerminal=1\n", "Deposit=10000\n", "Currency=EURUSD\n", "Leverage=1:100\n", "UseLocal=1\n", "UseRemote=0\n", "UseCloud=0\n", "Visual=1\n"); FileClose(filehandle); } else { Print("FileOpen, error ",GetLastError()); return false; } return true; }
このコードブロックでは、最適化したいEAを定義します ( "BuddyIlan ")。 このEAは2番目の環境に存在する必要があります。 ExpertParameters ファイル "BuddyIlanTester " (EA と同じ名前を使用しないように注意してください)。 期間を設定 (FromDate-ToDate) と最適化に必要なすべてのパラメータをセットします。
ターミナルが最適化の最後にシャットダウンされることを意味する "ShutdownTerminal = 1 " を設定します。
このレポートは、ファイル "Files\Reports\BuddyIlanReport"- "xlm " 拡張子がプラットフォームによって追加されます。
実行中のEAが低スペックのCPUリソースの仮想サーバー上でホストされている場合は、一部のリモートまたはクラウドエージェント ( "UseRemote " または "UseCloud ") を使用して最適化処理を行うことができます。
パラメータファイル
その後、最適化したい EA (BuddyIlan) の各パラメータの値を含む (BuddyIlanTester) 上記で定義されたパラメータファイルを作成する必要があります。
パラメータのデフォルト値は、ユーザによって設定されます (パラメータとして定義されます)。
input _TradingMode TradingMode = Dynamic; //固定またはダイナミックボリューム input double InpIlanFixedVolume = 0.1; //固定ボリュームサイズ (設定されている場合) input int InpNCurrencies=1; //このアカウントのBuddy Ilanのインスタンスの数 input double LotExponent = 1.4; input bool DynamicPips = true; input int DefaultPips = 15; input int Glubina=24; //ボラティリティの計算の直近の足の数 input int DEL=3; input int TakeProfit = 40.0; //TP (ポイント) input int Stoploss = 1000.0; //SL (ポイント) input bool InpIlanTrailingStop = true; //トレーリングストップの有効化 input int InpIlanDistanceTS = 5; //トレーリングストップ距離 (ポイント) input int MaxTrades=10; input int InpDeviation=10; //最大許容価格偏差 (ポイント) input bool bSTOFilter = true; //ダイナミックトレンドフィルタ input bool bSTOTimeFrameFilter = false; //ダイナミックタイムフレームフィルタ input int InpMaxTf = 60; //最大時間枠
以下の関数は8個の引数を受け取り、最初の4つは最適化されるパラメータ (SL、TP、STOFilter、および STOTimeFrameFilter) に対応し、true の場合は、対応するパラメータのトレーリングストップに "Y " が配置されます。 次の4つの引数は、次の最適化時に考慮する必要があり、既に最適化された値に対応します。
名前が示すように、この関数はMetaTrader5テスターインスタンスのアドホックディレクトリ (MQL5\Profiles\Tester) にもパラメータファイルをコピーします。
bool CreateAndCopyParametersFile( bool SL, bool TP, bool STOFilter, bool STOTimeFrameFilter, int SLValue, int TPValue, bool STOFilterValue, bool STOTimeFrameFilterValue ) { int filehandle=FileOpen("Optimiser\\BuddyIlanTester.set",FILE_WRITE|FILE_TXT); if(filehandle!=INVALID_HANDLE) { FileWrite(filehandle, "_EA_IDENTIFIER=Buddy Ilan\n", "_EA_MAGIC_NUMBER=1111||0||1||10||N\n", StringFormat("TradingMode=%d||0||0||0||N\n",TradingMode), StringFormat("InpIlanFixedVolume=%lf||0.0||0.000000||0.000000||N\n",InpIlanFixedVolume), StringFormat("InpNCurrencies=%d||0||1||10||N\n",InpNCurrencies), StringFormat("LotExponent=%lf||0.0||0.000000||0.000000||N\n",LotExponent), StringFormat("DynamicPips=%s||false||0||true||N\n",(DynamicPips==true)?"true":"false"), StringFormat("DefaultPips=%d||0||1||10||N\n",DefaultPips), StringFormat("Glubina=%d||0||1||10||N\n",Glubina), StringFormat("DEL=%d||0||1||10||N\n",DEL), StringFormat("TakeProfit=%d||30||10||70||%s\n",(TPValue==0)?30:TPValue,(TP==true)?"Y":"N"), StringFormat("Stoploss=%d||500||250||1500||%s\n",(SLValue==0)?1000:SLValue,(SL==true)?"Y":"N"), StringFormat("InpIlanTrailingStop=%s||false||0||true||N\n",(InpIlanTrailingStop==true)?"true":"false"), StringFormat("InpIlanDistanceTS=%d||0||1||10||N\n",InpIlanDistanceTS), StringFormat("MaxTrades=%d||0||1||10||N\n",MaxTrades), StringFormat("InpDeviation=%d||0||1||10||N\n",InpDeviation), StringFormat("bSTOFilter=%s||false||0||true||%s\n",(STOFilterValue==true)?"true":"false",(STOFilter==true)?"Y":"N"), StringFormat("bSTOTimeFrameFilter=%s||false||0||true||%s\n",(STOTimeFrameFilterValue==true)?"true":"false",(STOTimeFrameFilter==true)?"Y":"N"), StringFormat("InpMaxTf=%d||0||1||10||N\n",InpMaxTf)); FileClose(filehandle); } else { Print("FileOpen BuddyIlanTester.set, error ",GetLastError()); return false; } Sleep(1500); string PathTester=TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL5\\Files\\Optimiser\\BuddyIlanTester.set"; string PathProfile=sTerminalTesterDataPath+"\\MQL5\\Profiles\\Tester\\"; //ini ファイルをテスターフォルダにコピーします。 int ret=ShellExecuteW(0,"Open","xcopy","\""+PathTester+"\" \""+PathProfile+"\" /y","",0); //ファイルがコピーされるまで待ちます。 Sleep(2500); if(ret<32) { Print("Failed copying parameters file"); return false; } return true; }
最適化の開始
以下の関数は、MetaTrader5テスターインスタンスを起動すると、最適化が自動的に指定したパラメータを使用して起動されます。 この2番目のインスタンスは、結果ファイルを生成し、シャットダウンされます。
bool StartOptimizer() { //前のレポートの削除 FileDelete("Optimiser\\BuddyIlanReport.xml"); //前のレポートの削除 (2 番目のMetaTrader5インスタンス) string PathReport=sTerminalTesterDataPath+"\\MQL5\\Files\\Reports\\BuddyIlanReport.xml"; ShellExecuteW(0,"Open","cmd.exe"," /C del "+PathReport,"",0); Sleep(2500); string sTerminalPath=TerminalInfoString(TERMINAL_PATH); //最適化プロセスの開始 int start=ShellExecuteW(0,"Open",sTerminalTesterPath+"\\terminal64.exe","/config:"+TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL5\\Files\\Optimiser\\optimise.ini","",0); if(start<32) { Print("Failed starting Tester"); return false; } Sleep(15000); return true; }
最初の MetaTrader5 インスタンスから、最適化が完了したかどうかを調べる最も簡単な方法は、レポートファイルが存在するかどうかを確認することです。
レポートファイルが生成されたら、タスクディレクトリにコピーします。
bool CopyReport() { int nTry=0; //レポートファイルの待機とコピー while(nTry++<500) //タイムアウト: 2 時間 { string PathReport = sTerminalTesterDataPath + "\\MQL5\\Files\\Reports\\BuddyIlanReport.xml"; string PathTarget = TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Files\\Optimiser\\"; int ret=ShellExecuteW(0,"Open","xcopy","\""+PathReport+"\" \""+PathTarget+"\" /y","",0); if(ret<32) { PrintFormat("Waiting generation report (%d) ...",nTry); Sleep(15000); } else { if(FileIsExist("Optimiser\\BuddyIlanReport.xml")==true) { PrintFormat("Report found (ret=%d) ...",ret); Sleep(2500); return true; } else { PrintFormat("Waiting report (%d) ...",nTry); Sleep(15000); } } } return false; }
結果を読む
レポートファイルは XML 形式です。 幸いにも、Paul van Hemmen は、このタイプのデータにアクセスするための MetaTrader5 のためのライブラリを残しています。このライブラリは、ここで利用可能です: https://www.mql5.com/ja/code/1998
このライブラリは EA に次のように追加します。
#include <EasyXML\EasyXml.mqh>
実際には、以下の関数を追加し、このライブラリ内をレポートファイルに適応するように変更します (添付ファイルを参照してください)。
//+------------------------------------------------------------------+ //| Load XML by given file | //+------------------------------------------------------------------+ bool CEasyXml::loadXmlFromFullPathFile(string pFilename) { string sStream; int iStringSize; Print("Loading XML File ",pFilename); int hFile=FileOpen(pFilename,FILE_ANSI|FILE_READ,0,CP_UTF8); if(hFile==INVALID_HANDLE) { Err=EASYXML_ERR_CONNECTION_FILEOPEN; PrintFormat("[%s] Err=%d",pFilename,GetLastError()); return(Error()); } while(!FileIsEnding(hFile)) { iStringSize = FileReadInteger(hFile, INT_VALUE); sStream += FileReadString(hFile, iStringSize); } FileClose(hFile); return(loadXmlFromString(sStream)); }
データへのアクセスは簡単です。この関数は、結果を解析し、興味のあるデータを読み取ることができます。
bool LoadResults( OptimisationType eType ) { //Init 変数 BetterProfit=0.0; //結果の読み込み CEasyXml EasyXmlDocument; EasyXmlDocument.setDebugging(false); if(EasyXmlDocument.loadXmlFromFullPathFile("Optimiser\\BuddyIlanReport.xml")==true) { str=""; CEasyXmlNode *RootNode=EasyXmlDocument.getDocumentRoot(); for(int j=0; j<RootNode.Children().Total(); j++) { CEasyXmlNode *ChildNode=RootNode.Children().At(j); for(int i=0; i<ChildNode.Children().Total(); i++) { CEasyXmlNode *cNode=ChildNode.Children().At(i); if(cNode.getName() == "Worksheet" ) { switch(eType) { case _SL : DisplayNodesSL(cNode); PrintFormat("-> SL=%d (Profit=%.2lf)",BetterSL,BetterProfit); break; case _TP : DisplayNodesTP(cNode); PrintFormat("-> TP=%d (Profit=%.2lf DD=%lf)",BetterTP,BetterProfit,BetterDD); break; case _STO : DisplayNodesSTO(cNode); PrintFormat("-> STOFilter=%s STOTimeFrameFilter=%s (Profit=%.2lf)",(BetterSTOFilter==true)?"true":"false",(BetterSTOTimeFrameFilter==true)?"true":"false",BetterProfit); break; } break; } } } } else PrintFormat("Error found"); return true; }
パラメータを最適化するために、結果をさまざまな方法で分析し、最適化ごとに特定の関数が必要になります。 (SL、TP および STO パラメータ)。 これらの関数は再帰的です。
以下はSL の最適化の結果を分析するために使用するものです:
void DisplayNodesSL( CEasyXmlNode *Node ) { for(int i=0; i<Node.Children().Total(); i++) { CEasyXmlNode *ChildNode=Node.Children().At(i); if(ChildNode.Children().Total()==0) { str+=ChildNode.getValue()+","; } else { DisplayNodesSL(ChildNode); if(Node.getName()=="Table" && ChildNode.getName()=="Row") { string res[]; StringSplit(str,',',res); //バイパス列のタイトル if(StringCompare(res[0],"Pass",true)!=0) { double profit=StringToDouble(res[2]); int sl=(int) StringToInteger(res[10]); PrintFormat("[%s] Profit=%.2lf StopLoss=%d DD=%s",str,profit,sl,res[8]); if(profit>BetterProfit || (profit==BetterProfit && sl<BetterSL)) { BetterProfit=profit; BetterSL=sl; } } } if(Node.getName()=="Table") str=""; } } }
この関数は、各行とセルに対して呼び出されます。
ノードに子がない場合は、データが含まれていることを意味し、行の最後に分割された文字列にデータを格納します。
if( ChildNode.Children().Total() == 0 ) { str+=ChildNode.getValue()+","; }
したがって、各列の値は、配列 "res [] " で利用可能であり、選択の結果を選択します。
EA本体
4つのパラメータを最適化するために必要なすべてのブリックを持って、可能な限り最高のパラメータ設定を推測し、実行中の BuddyIlan EA によって読み取られる対応するグローバル変数の値を設定します。
void OnTimer() { MqlDateTime dt; datetime now=TimeLocal(dt); //土曜日に if(dt.day_of_week!=6) { bOptimisationDone=false; return; } //午前6:00 if(dt.hour<6) return; //もう済んでいるか if(bOptimisationDone==true) return; //前の "optimise.ini " を削除します FileDelete("Optimiser\\Optimise.ini"); //EA config ファイルを作成し、MQL5\Profiles\Test (テスターインスタンス) にコピー。 if(CreateAndCopyParametersFile(true,false,false,false,0,0,true,false)==false) return; //common.ini-> optimise.ini をコピーします。 if(CopyAndMoveCommonIni()==false) return; // Add [Tester] stanza in optimise.ini - https://www.metatrader5.com/en/terminal/help/start_advanced/start if(AddTesterStanza()==false) return; Print("=======================\nOptimization SL-1"); //最初の最適化 SL を開始 StartOptimizer(); //タスクディレクトリへのレポートファイルのコピー if(CopyReport()==false) return; //レポートの分析 if(LoadResults(_SL)==false) return; Print("=======================\nOptimization STO"); //STO 最適化のパラメータファイルの作成 (2 つのパラメータは同時に最適化されます) if(CreateAndCopyParametersFile(false,false,true,true,BetterSL,0,true,false)==false) return; //オプティマイザ STO を開始 StartOptimizer(); //タスクディレクトリへのレポートファイルのコピー if(CopyReport()==false) return; if(LoadResults(_STO)==false) return; Print("=======================\nOptimization SL-2"); //2番目の SL 最適化用のパラメータファイルの作成 (新しい STO パラメータ値を使用した再計算) if(CreateAndCopyParametersFile(true,false,false,false,0,0,BetterSTOFilter,BetterSTOTimeFrameFilter)==false) return; //オプティマイザの開始 StartOptimizer(); if(CopyReport()==false) return; if(LoadResults(_SL)==false) return; Print("=======================\nOptimization TP"); //TP 最適化用のパラメータファイルの作成 if(CreateAndCopyParametersFile(false,true,false,false,BetterSL,0,BetterSTOFilter,BetterSTOTimeFrameFilter)==false) return; //オプティマイザの開始 StartOptimizer(); if(CopyReport()==false) return; if(LoadResults(_TP)==false) return; //結論 PrintFormat("=======================\nSL=%d TP=%d STOFilter=%s STOTimeFrameFilter=%s (Profit=%.2lf DD=%lf)\n=======================", BetterSL,BetterTP,(BetterSTOFilter==true)?"true":"false",(BetterSTOTimeFrameFilter==true)?"true":"false",BetterProfit,BetterDD); //グローバル変数の設定-実行中の BuddyIlan EA は新しい値を読み、使用します。 //ダウンが見つかった場合は 50% 以上、EA はトレードをストップ if(BetterDD>50.0 && GlobalVariableSet(gVarStop,1.0)==false) { PrintFormat("Error setting Global Variable [%s]",gVarStop); } if(GlobalVariableSet(gVarSL,BetterSL)==false) { PrintFormat("Error setting Global Variable [%s]=%d",gVarSL,BetterSL); } if(GlobalVariableSet(gVarTP,BetterTP)==false) { PrintFormat("Error setting Global Variable [%s]=%d",gVarTP,BetterTP); } if(GlobalVariableSet(gVarSTOFilter,(BetterSTOFilter==true)?1.0:0.0)==false) { PrintFormat("Error setting Global Variable [%s]=%.1lf",gVarSTOFilter,(BetterSTOFilter==true)?1.0:0.0); } if(GlobalVariableSet(gVarSTOTimeFrameFilter,(BetterSTOTimeFrameFilter==true)?1.0:0.0)==false) { PrintFormat("Error setting Global Variable [%s]=%.1lf",gVarSTOTimeFrameFilter,(BetterSTOTimeFrameFilter==true)?1.0:0.0); } bOptimisationDone=true; }
グローバル変数名は、OnInit() 関数で構築されます。
int OnInit() { //グローバル変数 gVarStop="BuddyIlan."+_Symbol+".Stop"; gVarSL = "BuddyIlan." + _Symbol + ".SL"; gVarTP = "BuddyIlan." + _Symbol + ".TP"; gVarSTOFilter="BuddyIlan."+_Symbol+".STOFilter"; gVarSTOTimeFrameFilter="BuddyIlan."+_Symbol+".STOTimeFrameFilter";
下記は最適化プロセス全体です:
2018.07.07 13:20:15.978 BuddyIlanOptimizer (EURGBP,M15) TERMINAL_PATH = C:\Program Files\MetaTrader 5 - ActivTrades 2018.07.07 13:20:15.978 BuddyIlanOptimizer (EURGBP,M15) TERMINAL_DATA_PATH = C:\Users\BPA\AppData\Roaming\MetaQuotes\Terminal\FE0E65DDB0B7B40DE125080872C34D61 2018.07.07 13:20:15.978 BuddyIlanOptimizer (EURGBP,M15) TERMINAL_COMMONDATA_PATH = C:\Users\BPA\AppData\Roaming\MetaQuotes\Terminal\Common 2018.07.07 13:20:32.586 BuddyIlanOptimizer (EURGBP,M15) ======================= 2018.07.07 13:20:32.586 BuddyIlanOptimizer (EURGBP,M15) Optimization SL-1 2018.07.07 13:20:50.439 BuddyIlanOptimizer (EURGBP,M15) Waiting report (1) ... 2018.07.07 13:21:05.699 BuddyIlanOptimizer (EURGBP,M15) Waiting report (2) ... 2018.07.07 13:21:20.859 BuddyIlanOptimizer (EURGBP,M15) Waiting report (3) ... 2018.07.07 13:21:35.952 BuddyIlanOptimizer (EURGBP,M15) Report found (ret=42) ... 2018.07.07 13:21:38.471 BuddyIlanOptimizer (EURGBP,M15) Loading XML File Optimiser\BuddyIlanReport.xml 2018.07.07 13:21:38.486 BuddyIlanOptimizer (EURGBP,M15) [0,11032.2600,1032.2600,3.3406,1.7096,1.5083,0.1558,0,6.2173,309,500,] Profit=1032.26 StopLoss=500 DD=6.2173 2018.07.07 13:21:38.487 BuddyIlanOptimizer (EURGBP,M15) [2,11463.8000,1463.8000,4.7837,2.0386,0.8454,0.1540,0,15.4222,306,1000,] Profit=1463.80 StopLoss=1000 DD=15.4222 2018.07.07 13:21:38.487 BuddyIlanOptimizer (EURGBP,M15) [4,11444.1000,1444.1000,4.7348,2.0340,0.8340,0.1529,0,15.4493,305,1500,] Profit=1444.10 StopLoss=1500 DD=15.4493 2018.07.07 13:21:38.487 BuddyIlanOptimizer (EURGBP,M15) [1,11297.1900,1297.1900,4.2392,1.8414,0.8180,0.1400,0,14.1420,306,750,] Profit=1297.19 StopLoss=750 DD=14.1420 2018.07.07 13:21:38.487 BuddyIlanOptimizer (EURGBP,M15) [3,11514.0800,1514.0800,4.9158,2.3170,1.4576,0.2055,0,9.3136,308,1250,] Profit=1514.08 StopLoss=1250 DD=9.3136 2018.07.07 13:21:38.487 BuddyIlanOptimizer (EURGBP,M15) -> SL=1250 (Profit=1514.08) 2018.07.07 13:21:38.487 BuddyIlanOptimizer (EURGBP,M15) ======================= 2018.07.07 13:21:38.487 BuddyIlanOptimizer (EURGBP,M15) Optimization STO 2018.07.07 13:22:02.660 BuddyIlanOptimizer (EURGBP,M15) Waiting report (1) ... 2018.07.07 13:22:17.768 BuddyIlanOptimizer (EURGBP,M15) Waiting report (2) ... 2018.07.07 13:22:32.856 BuddyIlanOptimizer (EURGBP,M15) Waiting report (3) ... 2018.07.07 13:22:47.918 BuddyIlanOptimizer (EURGBP,M15) Waiting report (4) ... 2018.07.07 13:23:02.982 BuddyIlanOptimizer (EURGBP,M15) Report found (ret=42) ... 2018.07.07 13:23:05.485 BuddyIlanOptimizer (EURGBP,M15) Loading XML File Optimiser\BuddyIlanReport.xml 2018.07.07 13:23:05.499 BuddyIlanOptimizer (EURGBP,M15) [0,11463.5000,1463.5000,4.4483,2.0614,0.8452,0.1540,0,15.4267,329,false,false,] Profit=1463.50 false false DD=15.4267 2018.07.07 13:23:05.499 BuddyIlanOptimizer (EURGBP,M15) [1,11444.1000,1444.1000,4.7348,2.0340,0.8340,0.1529,0,15.4493,305,true,false,] Profit=1444.10 true false DD=15.4493 2018.07.07 13:23:05.499 BuddyIlanOptimizer (EURGBP,M15) [2,11430.5300,1430.5300,5.1090,2.1548,0.8917,0.1717,0,14.4493,280,false,true,] Profit=1430.53 false true DD=14.4493 2018.07.07 13:23:05.499 BuddyIlanOptimizer (EURGBP,M15) [3,11470.7100,1470.7100,6.2851,1.8978,0.8146,0.1288,0,17.3805,234,true,true,] Profit=1470.71 true true DD=17.3805 2018.07.07 13:23:05.499 BuddyIlanOptimizer (EURGBP,M15) -> STOFilter=true STOTimeFrameFilter=true (Profit=1470.71) 2018.07.07 13:23:05.500 BuddyIlanOptimizer (EURGBP,M15) ======================= 2018.07.07 13:23:05.500 BuddyIlanOptimizer (EURGBP,M15) Optimization SL-2 2018.07.07 13:23:29.921 BuddyIlanOptimizer (EURGBP,M15) Waiting report (1) ... 2018.07.07 13:23:45.043 BuddyIlanOptimizer (EURGBP,M15) Waiting report (2) ... 2018.07.07 13:24:00.170 BuddyIlanOptimizer (EURGBP,M15) Waiting report (3) ... 2018.07.07 13:24:15.268 BuddyIlanOptimizer (EURGBP,M15) Waiting report (4) ... 2018.07.07 13:24:30.340 BuddyIlanOptimizer (EURGBP,M15) Report found (ret=42) ... 2018.07.07 13:24:32.854 BuddyIlanOptimizer (EURGBP,M15) Loading XML File Optimiser\BuddyIlanReport.xml 2018.07.07 13:24:32.872 BuddyIlanOptimizer (EURGBP,M15) [0,9269.9000,-730.1000,-2.7760,0.7328,-0.3644,-0.0532,0,19.4241,263,500,] Profit=-730.10 StopLoss=500 DD=19.4241 2018.07.07 13:24:32.872 BuddyIlanOptimizer (EURGBP,M15) [4,11470.7100,1470.7100,6.2851,1.8978,0.8146,0.1288,0,17.3805,234,1500,] Profit=1470.71 StopLoss=1500 DD=17.3805 2018.07.07 13:24:32.872 BuddyIlanOptimizer (EURGBP,M15) [3,11475.9500,1475.9500,6.2806,1.8995,0.8175,0.1290,0,17.3718,235,1250,] Profit=1475.95 StopLoss=1250 DD=17.3718 2018.07.07 13:24:32.872 BuddyIlanOptimizer (EURGBP,M15) [2,11400.7500,1400.7500,5.8609,1.8442,0.7759,0.1292,0,17.3805,239,1000,] Profit=1400.75 StopLoss=1000 DD=17.3805 2018.07.07 13:24:32.872 BuddyIlanOptimizer (EURGBP,M15) [1,10662.5500,662.5500,2.8807,1.3618,0.3815,0.0862,0,16.7178,230,750,] Profit=662.55 StopLoss=750 DD=16.7178 2018.07.07 13:24:32.873 BuddyIlanOptimizer (EURGBP,M15) -> SL=1250 (Profit=1475.95) 2018.07.07 13:24:32.873 BuddyIlanOptimizer (EURGBP,M15) ======================= 2018.07.07 13:24:32.873 BuddyIlanOptimizer (EURGBP,M15) Optimization TP 2018.07.07 13:24:57.175 BuddyIlanOptimizer (EURGBP,M15) Waiting report (1) ... 2018.07.07 13:25:12.311 BuddyIlanOptimizer (EURGBP,M15) Waiting report (2) ... 2018.07.07 13:25:27.491 BuddyIlanOptimizer (EURGBP,M15) Waiting report (3) ... 2018.07.07 13:25:42.613 BuddyIlanOptimizer (EURGBP,M15) Waiting report (4) ... 2018.07.07 13:25:57.690 BuddyIlanOptimizer (EURGBP,M15) Report found (ret=42) ... 2018.07.07 13:26:00.202 BuddyIlanOptimizer (EURGBP,M15) Loading XML File Optimiser\BuddyIlanReport.xml 2018.07.07 13:26:00.219 BuddyIlanOptimizer (EURGBP,M15) [1,11768.5700,1768.5700,8.2259,2.4484,1.1024,0.2233,0,14.1173,215,40,] Profit=1768.57 TakeProfit=40 DD=14.117300 2018.07.07 13:26:00.219 BuddyIlanOptimizer (EURGBP,M15) [4,12343.5200,2343.5200,13.5464,2.5709,1.3349,0.2519,0,15.0389,173,70,] Profit=2343.52 TakeProfit=70 DD=15.038900 2018.07.07 13:26:00.219 BuddyIlanOptimizer (EURGBP,M15) [0,11243.4600,1243.4600,5.2913,1.6399,0.6887,0.1039,0,17.3805,235,30,] Profit=1243.46 TakeProfit=30 DD=17.380500 2018.07.07 13:26:00.219 BuddyIlanOptimizer (EURGBP,M15) [3,12292.3500,2292.3500,11.8162,2.5837,0.9257,0.2538,0,20.4354,194,60,] Profit=2292.35 TakeProfit=60 DD=20.435400 2018.07.07 13:26:00.219 BuddyIlanOptimizer (EURGBP,M15) [2,12146.3900,2146.3900,11.0639,2.4416,1.2226,0.2292,0,15.0772,194,50,] Profit=2146.39 TakeProfit=50 DD=15.077200 2018.07.07 13:26:00.219 BuddyIlanOptimizer (EURGBP,M15) -> TP=70 (Profit=2343.52 DD=15.038900) 2018.07.07 13:26:00.219 BuddyIlanOptimizer (EURGBP,M15) ======================= 2018.07.07 13:26:00.219 BuddyIlanOptimizer (EURGBP,M15) SL=1250 TP=70 STOFilter=true STOTimeFrameFilter=true (Profit=2343.52 DD=15.038900) 2018.07.07 13:26:00.219 BuddyIlanOptimizer (EURGBP,M15) =======================
結論
このプロセスの実装には、MetaTrader5の最低限の知識、その最適化メカニズム、およびプログラミングが必要です。
添付されているこの EA のソース、XML パーサーは、Paul van Hemmen の"EasyXml.mqh"を編集したものです。
お役に立つと幸いです。
MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/4917





- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索