メタトレーダー5の EA の自動最適化

7 11月 2018, 08:00
BPASoftware Thai Co. Ltd
0
154

イントロダクション

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が承認する必要があります:

DLL のインポート


自動最適化

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 Software Corp.により英語から翻訳された
元の記事: https://www.mql5.com/en/articles/4917

添付されたファイル |
Files.zip (14.39 KB)
MQL5レシピ - オープンヘッジポジションのプロパティを取得しましょう MQL5レシピ - オープンヘッジポジションのプロパティを取得しましょう

MetaTrader 5プラットフォームでは、マルチマーケットだけでなく、さまざまなポジション計算システムの使用も可能です。このような機能は、取引アイデアの実装と形式化のためのツールを大幅に拡大します。この記事では、ポジションが独立してカウントされたとき(『ヘッジ』)のポジションのプロパティの処理と考慮の方法について説明します。派生クラスの提案と、ヘッジポジションのプロパティの処理と取得の例を提示します。

ソーシャルトレーディング収益性の高いシグナルをさらに良くすることはできるでしょうか? ソーシャルトレーディング収益性の高いシグナルをさらに良くすることはできるでしょうか?

ほとんどのサブスクライバーは、バランス曲線の美しさとサブスクライバーの数で取引シグナルを選択しています。そのため、多くのプロバイダーは今日、シグナルの実際の質よりも、美しい統計により気を配り、多くの場合、トランザクションの量を多くして、人為的にバランス曲線を理想的な形にしています。この記事では、信頼性の基準と、プロバイダーがシグナルの品質を向上させる方法をご紹介します。特定のシグナルの履歴、またプロバイダーがより収益を上げ、リスクを低くするための方法の例をあげていきます。

新しいレールへの第一歩: MQL5内のカスタムインディケーター 新しいレールへの第一歩: MQL5内のカスタムインディケーター

新しいターミナルと言語のすべての可能性と特徴をリストすることはしません。それらはあまりにも多くありすぎ、新規の特徴によっては別の記事で説明するに値します。またここにはオブジェクト指向プログラミングで書かれたコードがありません。開発者にとってさらに有利になる点として、ただ単に言及するにはあまりにも真剣なトピックです。本記事ではインディケーターとその構造・図面・タイプ・プログラミング の詳細についてMQL4と比較しながら考察します。初心者にも経験のある開発者にも本記事が有益となる事を願います。おそらく何か新しく学べることがあると思います。

新しいMetaTrader 5 とMQL5の登場 新しいMetaTrader 5 とMQL5の登場

これはMetaTrader5のただの簡単なレビューです。このような短い時間でシステムのすべての特徴を述べることはできません。2009年9月9日に試用を開始しました。これはシンボル的な日付でラッキーナンバーになると信じています。ベータ版のMetaTrader5とMQL5を手に入れて数日が経ちました。まだ全ての特徴を使ってはいませんが、すでに関心させられました。