English Русский 中文 Español Deutsch Português
preview
ニューラルネットワークの実験(第3回):実用化

ニューラルネットワークの実験(第3回):実用化

MetaTrader 5エキスパートアドバイザー | 6 3月 2023, 09:28
906 0
Roman Poshtar
Roman Poshtar

はじめに

これまでの連載では、幾何学の再検討スマートなニューラルネットワークの最適化で、ニューラルネットワークに関する観察と実験を共有しました。 そのほか、出来上がったEAを最適化して解説しました。にもかかわらず、得られた結果の実用化というテーマにはほとんど触れていません。今回は、この残念な欠落を修正します。

得られた結果の実用的な応用を紹介し、EAの機能を拡張するための新しいアルゴリズムに焦点を当てます。いつものように、サードパーティのソフトウェアを一切使用せず、Metatrader 5のツールだけを使用します。記事は、ほとんどの場合、ステップバイステップの指示に近いものになるでしょう。 すべてを、わかりやすくシンプルに説明するように努めます。


1.アプリケーションのアイデア

前の2つのシステムを最適化する際、プロフィットファクターや複合基準の最適値や、パーセプトロンやニューラルネットワークの重みのセットなどで、いくらかの結果を得ることができました。得られた結果のテストでは、かなり許容範囲の広い値が表示されました。今回の改良の主旨は、すべての最適化結果を1つのEAにまとめ、同時に動作させることです。ご想像の通り、10個のEAで10個のチャートを開いておくのは、あまり便利ではありません。さらに、例えば10~20個のパラメータを同時に使うなど、拡張的(包括的)に結果を見ることができるようになるのです。


2.通貨ペア:最適化と前方テスト範囲、設定

以下は、最適化およびテストのすべてのパラメータです。

  • Forex
  • EURUSD
  • H1
  • 指標:2 TEMA指標(期間が1と24):TEMAの方が優れていることが数々のテストで判明したため、MAを断念せざるを得ませんでした
  • StopLossとTakeProfit(対応する修正値600と60)
  • Open prices onlyおよびComplex Criterion maxの最適化およびテストモード:Complex Criterion maxモードは、Maximum profitに比べ、より安定した収益が得られる結果となりました。
  • 最適化範囲3年(2018.12.09~2021.12.09):3年は確実な基準ではありません。このパラメータについてはご自分で実験してみてください
  • フォワードテスト範囲1年(2021.12.09~2022.12.09)
  • すべてのフォワードテストにおいて、20個の最適化結果を同時に使用
  • 「Fast (genetic based algorithm)」パーセプトロンによるEAの最適化
  • DeepNeuralNetwork.mqh「Slow complete algorithm」ライブラリを用いたEAの最適化
  • 初回入金額10,000
  • レバレッジ1:500

3.パーセプトロンに基づいたEA

 数々の観察から、パーセプトロンを用いたEAでは、重み深度200は不要であることが判明しました。20で十分です。そこで、パーセプトロンのコードそのものと最適化パラメータを変更しました。重みを0から1〜20刻みで最適化します。

また、パーセプトロンのプラス側、マイナス側への引き出しの深さを担当する「Param」パラメータも導入しました。このパラメータは、取引回数とその精度に影響します。取引回数は減少し、精度は向上しています。

 各システムでは2つのEAを使用します。前者は最適化に使用し、後者は直接作業するためのものです。注文の分け方は、注文コメントで整理するのが一番簡単で便利だと思うので、そうすることにしました。一意の注文インデックスは、サンプル自体にあるそのシリアル番号です。サンプルは、得られた最適化結果をアーカイブしたものです。MaxSeriesパラメータは、同時作業量を制限するために使用されます。

for(int i=0; i<=(ArraySize(EURUSD)/6)-1; i++){
 comm=IntegerToString(i);
 x1=(int)StringToInteger(EURUSD[i][0]);
 x2=(int)StringToInteger(EURUSD[i][1]);
 x3=(int)StringToInteger(EURUSD[i][2]);
 x4=(int)StringToInteger(EURUSD[i][3]);
 
 Param=(int)StringToInteger(EURUSD[i][4]);

//SELL++++++++++++++++++++++++++++++++++++++++++++++++
if (CalculateSeries(Magic)<MaxSeries && (perceptron1()<-Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment+" En_"+comm)==0) && (ind_In1[1]>ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenSell(symbolS1.Name(), LotsXSell, TakeProfit, StopLoss, EAComment+" En_"+comm);
}

//BUY++++++++++++++++++++++++++++++++++++++++++++++++
if (CalculateSeries(Magic)<MaxSeries && (perceptron1()>Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment+" En_"+comm)==0) && (ind_In1[1]<ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenBuy(symbolS1.Name(), LotsXBuy, TakeProfit, StopLoss, EAComment+" En_"+comm);
}

}

以下は、新しいパーセプトロンコードです。

1パーセプトロン(4角度)SL TPと1パーセプトロン(4角度)

double perceptron1() 
  {
   double w1 = x1 - 10.0;
   double w2 = x2 - 10.0;
   double w3 = x3 - 10.0;
   double w4 = x4 - 10.0;
   
   double a1 = (((ind_In1[1]-ind_In1[6])/Point())/6);
   double a2 = (((ind_In1[1]-ind_In1[11])/Point())/11);
   double a3 = (((ind_In2[1]-ind_In2[6])/Point())/6);
   double a4 = (((ind_In2[1]-ind_In2[11])/Point())/11);   
   
   return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
  }

1パーセプトロン(8角度)SL TPと1パーセプトロン(8角度)

double perceptron1() 
  {
   double w1 = x1 - 10.0;
   double w2 = x2 - 10.0;
   double w3 = x3 - 10.0;
   double w4 = x4 - 10.0;
   
   double v1 = y1 - 10.0;
   double v2 = y2 - 10.0;
   double v3 = y3 - 10.0;
   double v4 = y4 - 10.0;  
   
   double a1 = (((ind_In1[1]-ind_In1[6])/Point())/6);
   double a2 = (((ind_In1[1]-ind_In1[11])/Point())/11);
   double a3 = (((ind_In2[1]-ind_In2[6])/Point())/6);
   double a4 = (((ind_In2[1]-ind_In2[11])/Point())/11);   
   
   double b1 = (((ind_In1[1]-ind_In1[11])/Point())/11);
   double b2 = (((ind_In2[1]-ind_In1[11])/Point())/11);
   double b3 = (((ind_In1[1]-ind_In2[11])/Point())/11);
   double b4 = (((ind_In2[1]-ind_In2[11])/Point())/11);
   
   return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4   +   v1 * b1 + v2 * b2 + v3 * b3 + v4 * b4);
  }

2パーセプトロン(4角度)SL TPと2パーセプトロン(4角度)

double perceptron1() 
  {
   double w1 = x1 - 10.0;
   double w2 = x2 - 10.0;
   double w3 = x3 - 10.0;
   double w4 = x4 - 10.0;
   
   double a1 = (((ind_In1[1]-ind_In1[6])/Point())/6);
   double a2 = (((ind_In1[1]-ind_In1[11])/Point())/11);
   double a3 = (((ind_In2[1]-ind_In2[6])/Point())/6);
   double a4 = (((ind_In2[1]-ind_In2[11])/Point())/11);   
   
   return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
  }

double perceptron2() 
  {
   double v1 = y1 - 10.0;
   double v2 = y2 - 10.0;
   double v3 = y3 - 10.0;
   double v4 = y4 - 10.0;  
   
   double b1 = (((ind_In1[1]-ind_In1[11])/Point())/11);
   double b2 = (((ind_In2[1]-ind_In1[11])/Point())/11);
   double b3 = (((ind_In1[1]-ind_In2[11])/Point())/11);
   double b4 = (((ind_In2[1]-ind_In2[11])/Point())/11);
   
   return (v1 * b1 + v2 * b2 + v3 * b3 + v4 * b4);
  }

以下は、エントリアクティベーションコードです。

1パーセプトロン(4角度)SL TPと1パーセプトロン(4角度)

//SELL++++++++++++++++++++++++++++++++++++++++++++++++
if ((perceptron1()<-Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment)==0) && (ind_In1[1]>ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenSell(symbolS1.Name(), LotsXSell, TakeProfit, StopLoss, EAComment);
}

//BUY++++++++++++++++++++++++++++++++++++++++++++++++
if ((perceptron1()>Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment)==0) && (ind_In1[1]<ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenBuy(symbolS1.Name(), LotsXBuy, TakeProfit, StopLoss, EAComment);
}

1パーセプトロン(8角度)SL TPと1パーセプトロン(8角度)

//SELL++++++++++++++++++++++++++++++++++++++++++++++++
if ((perceptron1()<-Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment)==0) && (ind_In1[1]>ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenSell(symbolS1.Name(), LotsXSell, TakeProfit, StopLoss, EAComment);
}

//BUY++++++++++++++++++++++++++++++++++++++++++++++++
if ((perceptron1()>Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment)==0) && (ind_In1[1]<ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenBuy(symbolS1.Name(), LotsXBuy, TakeProfit, StopLoss, EAComment);
}

2パーセプトロン(4角度)SL TPと2パーセプトロン(4角度)

//SELL++++++++++++++++++++++++++++++++++++++++++++++++
if ((perceptron1()<-Param) && (perceptron2()<-Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment)==0) && (ind_In1[1]>ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenSell(symbolS1.Name(), LotsXSell, TakeProfit, StopLoss, EAComment);
}

//BUY++++++++++++++++++++++++++++++++++++++++++++++++
if ((perceptron1()>Param) && (perceptron2()>Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment)==0) && (ind_In1[1]<ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenBuy(symbolS1.Name(), LotsXBuy, TakeProfit, StopLoss, EAComment);
}

 以下は最適化設定です。

1パーセプトロン(4角度)SL TPと1パーセプトロン(4角度)

最適化設定1

1パーセプトロン(8角度)SL TPと1パーセプトロン(8角度)

最適化設定

2パーセプトロン(4角度)SL TPと2パーセプトロン(4角度)

最適化設定


3.1 EA 1パーセプトロン(4角度)SL TP

ストップロスとテイクプロフィットを使用してエグジットします。TEMA指標の1パーセプトロン(4つの勾配角度)の戦略です。最適化を10回おこないます。勾配角度の構造と最適化の原理は、第1回目の記事で紹介しています。ここで繰り返しても意味がありません。

以下は最適化結果です。

最適化結果


最適化結果

複合基準99.99の結果が多数で、プロフィットファクターは4~8と高水準です。

 次に、得られた結果をExcelにエクスポートします。上位100個の結果を残し、それ以外は削除します。х1、х2、х3、х4、Param以外のすべての列を削除します。 ファイルをCSVとして保存します(区切りにはカンマを使用)。 ファイル名はわかりやすく「EURUSD」にしました。 このフォーマットをテキスト配列としてEAコードに読み込ませます。 下の図のように表示されるはずです。

最適化結果

MetaEditorメニューから、コードにファイルを挿入します。

最適化結果

最適化されたテキスト配列が用意されています。

string EURUSD[][6]=
  {
   {"19","1","3","6","1100"},
   {"20","1","4","6","1000"},
   {"20","0","4","4","1200"},
   {"19","0","6","4","1100"},
   {"19","1","5","4","1100"},
   {"17","0","7","4","1100"},
   {"19","1","3","8","1000"},
   {"20","0","4","3","1300"},
   {"17","0","7","0","1400"}
  };

フォワードテストをコンパイルし、実施します。 

フォワードテスト

結果は上々です。年間を通じて安定した上昇基調が確認できます。


3.2 EA 1パーセプトロン(4角度)

ストップロスやテイクプロフィットを使用しません。 パーセプトロンのコールバックで決済が実行されます。

//SELL++++++++++++++++++++++++++++++++++++++++++++++++
if ((perceptron1()<-Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment)==0) && (ind_In1[1]>ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenSell(symbolS1.Name(), LotsXSell, 0, 0, EAComment);
}

if ((perceptron1()>0) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment)>0)){
ClosePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL);
}

//BUY++++++++++++++++++++++++++++++++++++++++++++++++
if ((perceptron1()>Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment)==0) && (ind_In1[1]<ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenBuy(symbolS1.Name(), LotsXBuy, 0, 0, EAComment);
}

if ((perceptron1()<0) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment)>0)){
ClosePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY);
}

以下は最適化結果です。

最適化結果


最適化結果

複合基準の結果は、前のケースよりもいくらか低くなっています。プロフィットファクターは2~2.5の水準です。

次は、フォワードテスト結果です。

フォワードテスト結果

バランスラインは、ドローダウンが深くなり、前回の結果を繰り返しています。


3.3 EA 1パーセプトロン(8角度)SL TP

ストップロスとテイクプロフィットを使用してエグジットします。TEMA指標の1パーセプトロン(8つの勾配角度)の戦略です。

今回のEAでは、以下のようなExcelファイルを用意します。ここでは、х1、х2、х3、х4、y1、y2、y3、y4、Paramパラメータを最適化します。

最適化結果

以下は最適化結果です。

最適化結果


最適化結果

複合基準の結果が高くなっています。プロフィットファクターは2.5~3の水準にあります。

次は、フォワードテスト結果です。

フォワードテスト結果

バランスラインはあまり安定していません。ドローダウンは相当なものです。しかし、結果はプラスです。


3.4 EA 1パーセプトロン(8角度)

ストップロスやテイクプロフィットを使用しません。パーセプトロンの反転シグナルに対して決済します。 TEMA指標の1パーセプトロン(8つの勾配角度)の戦略です。

以下は最適化結果です。

最適化結果


最適化結果

複合基準の結果が高くなっています。プロフィットファクターは2.5~3の水準にあります。

次は、フォワードテスト結果です。

フォワードテスト結果

バランスラインは安定しています。年間を通じて預金残高が順調に増加しています。ドローダウンはそれほど深くありません。


3.5 EA 2パーセプトロン(8角度)SL TP

ストップロスとテイクプロフィットを使用します。戦略は、1つ目は4つの勾配角度、2つ目は異なる4つの勾配角度を持つ2つのパーセプトロンです。

以下は最適化結果です。

最適化結果


最適化結果

複合基準の結果は99.99の水準でした。結果のプロフィットファクターはほぼ同じ4.3でした。

次は、フォワードテスト結果です。

フォワードテスト結果

バランスラインは鋸歯状です。年間を通じて利益を計上しています。


3.6 EA 2パーセプトロン(8角度)

ストップロスやテイクプロフィットを使用しません。戦略は、1つ目は4つの勾配角度、2つ目は異なる4つの勾配角度を持つ2つのパーセプトロンです。 パーセプトロンの反転シグナルに対して決済します。

以下は最適化結果です。

最適化結果


最適化結果

複合基準の結果は99.8でした。結果のプロフィットファクターは2.8~3.2の範囲に収まっています。

次は、フォワードテスト結果です。

フォワードテスト結果

バランスラインは鋸歯状で、不安定です。年間を通じて利益を計上しています。年末に大きなドローダウンが発生しています。


4.DeepNeuralNetwork.mqhライブラリに基づくEA

今回は、DeepNeuralNetwork.mqhライブラリに基づく4つのEAを使用します。Angle4-4-3SLTPとAngle8-4-3SLTPはストップロスとテイクプロフィットを決済に適用し、シグナル決済はニューラルネットワークから来るAngle4-4-3とAngle8-4-3も使用します。すべてのEAでは勾配角度を戦略として使用しています。第2部の実験で紹介した形状は、ここでは使用しません。

以下は、ストップロスとテイクプロフィットのコードです。

//SELL++++++++++++++++++++++++++++++++++++++++++++++++
if ((CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment+" En_"+comm1)==0) && (yValues[1]>LL) && (SpreadS1<=MaxSpread)){
  if(CalculateSeries(Magic)<MaxSeries){
  OpenSell(symbolS1.Name(), LotsXSell, TP, SL, EAComment+" En_"+comm1);
  }
}

//BUY++++++++++++++++++++++++++++++++++++++++++++++++
if ((CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment+" En_"+comm1)==0) && (yValues[0]>LL) && (SpreadS1<=MaxSpread)){
  if(CalculateSeries(Magic)<MaxSeries){
  OpenBuy(symbolS1.Name(), LotsXBuy, TP, SL, EAComment+" En_"+comm1);
  }
}

以下は、ニューラルネットワークから決済するためのコードです。

//SELL++++++++++++++++++++++++++++++++++++++++++++++++
if ((CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment+" En_"+comm1)==0) && (yValues[1]>LL) && (SpreadS1<=MaxSpread)){
  ClosePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment+" En_"+comm1);
  if(CalculateSeries(Magic)<MaxSeries){
  OpenSell(symbolS1.Name(), LotsXSell, TP, SL, EAComment+" En_"+comm1);
  }
}

//BUY++++++++++++++++++++++++++++++++++++++++++++++++
if ((CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment+" En_"+comm1)==0) && (yValues[0]>LL) && (SpreadS1<=MaxSpread)){
  ClosePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment+" En_"+comm1);
  if(CalculateSeries(Magic)<MaxSeries){
  OpenBuy(symbolS1.Name(), LotsXBuy, TP, SL, EAComment+" En_"+comm1);
  }
}

//CLOSE ALL++++++++++++++++++++++++++++++++++++++++++
if (yValues[2]>LL){
  ClosePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment+" En_"+comm1);
  ClosePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment+" En_"+comm1);
}

では、もっと複雑なスキームを適用してみましょう。エキスパートアドバイザーは各セットに3個ずつあります。最初のものは最適化のためのもので、2番目は得られた結果をテキスト配列に変換するためのもの、3番目は得られた配列をテストおよび処理するためのものです。

覚えていらっしゃるかもしれませんが、最適化の際、EAは最適化された重みのセットを含むCSVファイルをC:\Users\Your username\AppData\Roaming\MetaQuotes\Terminal\Common\Filesに作成します。CSV最適化レポートファイルをフォルダにコピーします。

Angle EA 4-4-3 convertを通貨ペアチャート上で起動します。

エキスパートアドバイザー

以下は、変換のためのEAパラメータです。

  • Param - 複合基準値。この値以下では、結果は配列にコピーされません。 80を設定しました。
  • OptimizationFileName1 - CSV最適化レポートファイル
  • OptimizationFileName2 - 最適化中にEAが作成するCSVファイルで、ニューラルネットワークの重みが含まれています。
  • OptimizationFileName3 - EAに挿入される配列ファイルで、自動的に作成されます。

その様子はログで見ることができます。

Logs

取得したファイルをAngleEA4-4-3取引のコードに挿入します。

string Result[][37]=
  {
   {"17293","0.8","-0.1","-0.2","1.0","0.9","0.6","0.4","1.0","0.6","-0.4","0.9","-0.5","0.1","-0.5","-0.5","0.9","-0.1","-0.8","0.4","0.0","-0.1","0.1","0.2","-0.4","-0.7","-0.6","-0.9","-0.8","-0.9","-0.7","-0.5","0.4","0.4","0.8","-0.6"},
   {"18030","0.6","0.2","-0.4","0.9","-1.0","-0.9","-0.9","0.4","-0.9","-0.8","0.4","0.9","0.2","-0.8","0.9","-0.1","-0.6","0.3","0.5","-0.4","0.7","0.6","-0.4","-0.1","0.4","-0.8","0.4","0.9","-0.2","0.0","0.4","-0.6","-0.4","-0.7","0.7"},
   {"13128","0.7","-0.3","0.5","-0.5","-0.5","-0.1","0.8","0.0","0.6","0.9","-0.2","0.8","1.0","0.7","-0.7","-0.2","0.5","0.5","-0.6","0.5","-0.9","-0.5","-0.5","0.5","-0.3","0.5","0.8","0.2","-0.5","-0.2","0.1","-0.1","-0.4","-0.7","0.1"},
   {"10688","0.3","0.0","0.2","-0.1","0.6","0.1","0.1","-0.2","-1.0","0.3","0.2","0.5","-0.8","0.7","0.4","-0.5","-0.4","-0.3","-0.3","-0.9","-0.2","0.0","0.1","0.9","0.3","-0.9","-0.2","-0.2","0.1","0.9","0.8","0.1","0.4","0.8","0.6"},
   {"8356","0.8","0.8","0.7","0.2","0.0","-0.4","0.5","-0.8","0.0","0.9","0.2","-0.1","1.0","0.6","0.2","-0.8","-0.1","-0.5","-0.3","0.0","0.7","-0.5","-0.3","0.0","0.9","-1.0","-0.2","-0.6","-0.7","-0.5","-0.8","0.5","-0.3","-0.1","0.8"},
   {"18542","-0.8","0.9","-0.1","0.5","-0.5","0.3","0.8","-0.4","0.7","0.9","0.4","0.0","-0.2","0.0","0.2","0.5","0.9","0.4","1.0","0.7","0.1","0.1","-0.4","0.0","0.9","0.2","0.0","-0.8","0.1","-0.5","0.1","-0.1","0.1","-0.1","0.6"},
   {"18381","0.7","-1.0","-0.8","0.8","-0.8","-0.4","0.9","0.7","1.0","0.7","0.8","0.5","0.1","-0.3","-0.7","-0.9","-0.2","-0.4","0.8","-0.8","0.0","0.8","-0.5","-0.3","0.2","-0.3","-0.1","0.5","-0.1","0.3","0.0","-0.7","-0.2","-0.3","0.8"},
   {"13795","0.2","0.9","0.4","0.4","0.1","-0.6","-0.6","-0.3","0.7","0.9","0.7","0.0","-0.2","-0.9","-0.8","-0.6","-0.1","-0.4","-1.0","0.7","-0.7","-0.3","0.0","-0.3","-1.0","0.8","-0.9","-0.9","0.1","-0.5","-0.3","-0.7","-0.2","-0.7","-0.8"},
   {"4376","0.9","0.7","-0.6","-0.9","1.0","0.8","0.1","-0.8","0.7","-0.8","0.2","0.1","-0.9","0.8","0.9","-0.4","0.8","0.3","0.0","-0.3","-0.4","0.7","-0.2","0.4","-0.8","-0.2","0.9","0.9","0.2","0.0","0.1","0.5","-0.8","-0.1","0.6"},
   {"14503","0.1","-0.4","-0.7","0.1","-0.1","0.5","-0.7","-0.2","-0.9","0.0","0.2","-0.7","0.3","0.7","-0.7","0.1","0.4","0.3","0.3","-0.5","-0.8","-0.8","-0.7","0.2","-0.7","-0.1","-0.8","0.0","-0.4","0.0","0.1","0.5","-0.3","0.5","0.8"},
   {"12887","0.6","-0.1","0.4","0.6","-0.9","-0.3","0.7","0.2","-0.6","-1.0","0.0","-0.6","0.5","0.3","0.8","0.0","-0.5","-1.0","-0.6","0.6","-0.6","-0.9","-0.3","0.6","0.2","-0.5","0.6","0.2","-0.5","0.3","0.3","-0.9","-0.7","-0.8","0.8"},
   {"16285","0.3","0.3","-0.9","-0.7","-0.1","0.7","-0.7","-0.7","-0.2","-0.5","-0.8","-1.0","-0.1","-0.4","-0.6","1.0","0.3","-0.8","-0.6","1.0","-0.1","0.7","-0.1","0.5","-0.6","0.9","-0.5","0.6","0.2","0.5","-0.4","0.3","-0.6","-0.7","0.7"},
   {"13692","0.8","-0.9","0.6","0.3","-0.2","-0.8","-0.4","0.3","-0.6","0.7","0.7","-0.8","0.5","0.1","-0.2","0.7","-0.7","-0.2","0.7","-0.5","0.9","0.7","0.6","0.8","-0.1","-1.0","-0.8","-0.5","-0.1","-0.9","-0.5","0.2","-0.4","0.8","0.2"},
   {"1184","-0.1","0.1","0.6","-0.2","-0.3","0.0","-0.7","0.1","-0.5","0.1","-0.6","0.0","-0.9","-0.8","0.1","0.5","0.3","-1.0","0.1","-0.8","-0.6","0.0","-0.4","-0.1","-0.7","-0.8","0.6","0.5","0.0","0.9","-0.5","0.2","0.7","0.3","0.9"},
   {"9946","0.4","-0.5","0.9","-1.0","-0.4","-0.7","0.9","0.0","-0.2","0.7","0.7","0.1","0.7","0.4","-0.9","0.1","-0.6","-0.5","0.9","0.8","0.2","-0.9","0.0","0.1","0.9","0.7","0.3","0.6","-0.4","0.8","-0.1","0.2","-0.2","-0.4","0.7"},
   {"6104","0.5","-0.9","-0.1","0.7","-0.7","0.0","0.4","0.3","0.8","-0.7","-0.1","0.1","-0.1","-0.5","-0.5","1.0","-0.1","-0.5","0.5","0.7","-0.8","-0.7","-0.7","0.8","-0.2","-0.5","0.2","-0.6","-0.2","-0.1","-0.4","-0.9","-0.6","-0.1","0.9"},
   {"995","0.9","0.6","0.7","0.1","-0.8","0.3","-0.2","0.3","0.9","-0.1","0.2","0.5","0.9","-0.7","-0.7","-0.7","0.2","0.2","0.4","-0.7","-0.4","-0.2","0.0","-0.2","0.0","0.6","-0.3","-0.6","-0.9","0.8","-0.6","-0.2","0.2","0.5","0.9"},
   {"6922","0.5","0.9","0.1","-0.8","-1.0","-0.1","0.9","0.9","-0.2","0.8","0.8","0.5","-0.3","0.8","-0.2","0.9","-0.6","0.0","0.7","-0.9","0.4","0.7","0.6","-0.1","-0.4","0.5","-0.6","-0.2","-0.5","-0.9","-0.7","-0.6","0.5","-0.6","0.7"},
   {"3676","-0.9","-0.8","-0.5","0.8","0.4","-0.8","-0.4","0.6","0.9","0.9","-0.7","0.6","0.8","-0.9","0.3","0.7","-0.7","0.5","0.8","0.9","0.1","0.5","0.8","0.1","0.9","0.9","0.4","0.3","-0.1","0.4","-0.4","0.4","-0.3","-0.6","0.9"},
   {"6245","-0.1","-0.4","-0.6","0.7","0.6","-0.6","-0.2","0.2","0.0","-0.4","0.0","0.9","-0.3","0.5","-0.2","0.7","0.4","1.0","0.7","-0.1","-0.3","-0.9","-0.5","0.9","0.8","-0.1","-0.5","-1.0","0.3","0.9","-0.4","-0.2","-0.4","-0.3","0.9"},
   {"1039","-0.4","-0.3","-0.6","-0.7","-0.6","0.5","-0.2","-0.9","0.7","0.9","-0.2","-0.6","-0.2","-0.3","0.6","0.1","-0.9","-0.8","0.9","0.3","0.6","0.8","-0.8","0.8","0.6","0.1","-0.2","-0.7","0.6","-0.2","-0.6","0.4","-0.1","-0.2","0.1"},
   {"6615","-0.4","-0.1","-0.7","0.5","-0.9","0.4","-0.9","0.4","-0.4","-0.1","0.7","-0.4","0.4","0.4","-0.8","-0.2","-0.6","-0.1","-0.5","-0.7","0.6","0.0","1.0","0.9","-0.3","0.8","0.8","-0.1","-0.2","0.9","-0.2","0.9","-0.8","-0.6","0.5"},
   {"410","-0.3","0.2","-0.2","-0.2","0.2","-0.5","0.8","0.3","-0.9","-0.9","-0.4","0.3","-0.8","-0.8","0.0","0.9","-0.2","0.0","-0.2","-0.4","-0.1","0.1","-0.4","0.7","1.0","0.1","0.5","0.3","0.1","0.7","0.4","0.0","-0.2","-1.0","-0.1"},
   {"15027","-0.3","-0.4","-0.6","0.3","-0.5","-0.6","0.9","0.5","-0.2","0.0","-0.7","0.7","0.1","0.5","-0.4","-0.4","0.4","0.7","-0.1","0.9","-0.1","0.6","0.5","-0.3","0.6","0.8","0.4","0.1","0.9","-0.5","0.7","0.6","-0.8","-0.1","0.0"},
   {"14157","0.6","-0.7","0.7","0.5","0.8","-0.1","0.9","0.8","0.8","0.7","0.6","-0.3","-0.7","-0.5","-0.2","0.2","0.0","-0.8","0.6","0.9","-0.4","0.1","0.1","0.9","0.7","-0.8","-0.6","-0.5","-0.7","0.1","-0.3","0.9","0.5","0.8","-0.7"},
   {"11367","0.2","-1.0","-0.4","-0.4","-0.3","-0.2","0.2","-0.1","-0.4","0.7","-1.0","-0.5","-0.9","-0.7","-0.4","-0.8","-0.4","0.0","0.2","0.7","-0.2","0.4","0.1","0.0","-0.1","-0.9","0.2","-0.5","-0.6","-0.6","-0.7","-0.2","-0.3","-0.1","0.9"},
   {"3892","-0.7","-0.3","0.8","0.2","-0.3","0.4","0.0","0.3","-0.2","0.7","0.6","0.6","0.7","-0.4","-0.7","0.4","-0.3","-0.8","-0.2","0.0","0.9","0.9","0.3","0.0","0.7","0.1","-0.1","0.1","-0.8","-0.4","-0.5","0.9","-0.7","-0.6","0.2"}
  };


4.1 Angle 4-4-3 SL TP EA

ストップロスとテイクプロフィットを使用してエグジットします。TEMA指標の4つの勾配角度の戦略です。

以下は最適化結果です。

最適化結果


最適化結果

ご覧のように、良い結果がたくさん出ています。プロフィットファクターは1.6~5の範囲に収まっています。80を超える複合基準値は27個あります。

次は、フォワードテスト結果です。

フォワードテスト結果

残念ながら、このEAはフォワードテストに合格しませんでした。結果は否定的で不安定なものです。


4.2 Angle 4-4-3 EA

EAはニューラルネットワークを使用してエグジットします。TEMA指標の4つの勾配角度の戦略です。

以下は最適化結果です。

最適化結果


最適化結果

ご覧のように、複合基準で80を超える良い結果は6個しかありませんでした。プロフィットファクターは1.6~1.9の範囲に収まっています。

次は、フォワードテスト結果です。

フォワードテスト結果

ニューラルネットによる決済で、年間を通じて利益を上げています。ストップロスとテイクプロフィットを使用するよりも安定した結果が得られます。


4.3 Angle 8-4-3 SL TP EA

ストップロスとテイクプロフィットを使用してエグジットします。TEMA指標の8つの勾配角度の戦略です。

以下は最適化結果です。

最適化結果


最適化結果

結果のプロフィットファクターは、ニューラルネットワーク4-4-3と比較して低くなっています。  80を超える複合基準結果が13個あります。

以下は、フォワードテスト結果です。

フォワードテスト結果

予想通り、ストップロスとテイクプロフィットを使った前回と同じような結果になっています。フォワードテストに失敗しました。


4.4 Angle 8-4-3 EA

ニューラルネットワークを使用してエグジットします。TEMA指標の8つの勾配角度の戦略です。

以下は最適化結果です。

最適化結果


最適化結果

80を超える複合基準の結果は3つだけです。プロフィットファクターは、過去の実績と比較して低い水準にあります。

次は、フォワードテスト結果です。

フォワードテスト結果

フォワードテストの結果は満足のいくものではありません。預金が徐々に失われていくのがわかります。


結論

フォワードテストの結果からもわかるように、パーセプトロンに基づいたEAは、運用開始半年後に一定の収益性の低下が見られるものの、年間を通じてマイナスになるものはありませんでした。つまり、少なくとも半年に一度は最適化が必要だということです。

DeepNeuralNetwork.mqhライブラリを利用したEAについては、すべてが複雑です。結果は、期待したほどではありませんでした。もしかしたら、戦略そのものが影響しているのかもしれませんし、ニューラルネットワークに何か別のものを渡す必要があるのかもしれません。

多くの場合、収益性は最適化されたシリーズのプロフィットファクターでトレースすることができます。それは、私たちにさらなる考える材料を与えてくれます。

今後のために、2つの作業を指摘したいと思います。得られた最良の結果を他の通貨ペアや時間枠で確認することが必要です。

取引数は少ないですが、他の通貨ペアを使ったり、これらのシステムに基づいてポートフォリオを作成することは誰も禁じていません。最適化のための人権費が避けられません。

何か質問があれば、フォーラムで質問するか、プライベートメッセージで連絡してください。いつでも喜んでお手伝いします。



MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/11949

添付されたファイル |
EA.zip (1056.16 KB)
自動で動くEAを作る(第05回):手動トリガー(II) 自動で動くEAを作る(第05回):手動トリガー(II)
今日は、自動モードでシンプルかつ安全に動作するエキスパートアドバイザー(EA)を作成する方法を紹介します。前回の最後に、少なくともしばらくはEAを手動で使えるようにするのが適切ではないかと提案しました。
自動で動くEAを作る(第04回):手動トリガー(I) 自動で動くEAを作る(第04回):手動トリガー(I)
今日は、自動モードでシンプルかつ安全に動作するエキスパートアドバイザー(EA)を作成する方法を紹介します。
エキスパートアドバイザー(EA)の選び方:取引ボットを却下するための20の強力な基準 エキスパートアドバイザー(EA)の選び方:取引ボットを却下するための20の強力な基準
この記事では、「どうやって正しいエキスパートアドバイザーを選べばいいのか」という問いに答えようと思います。ポートフォリオに最適なのはどれでしょうか。また、市場で入手できる大規模な取引ボットリストをどのようにフィルタリングすればいいのでしょうか。この記事では、エキスパートアドバイザーを却下するための20の明確で強力な基準を紹介します。それぞれの基準が提示され、よく説明されているので、より持続的な判断ができ、より収益性の高いエキスパートアドバイザーを集めることができるようになります。
母集団最適化アルゴリズム:侵入雑草最適化(IWO) 母集団最適化アルゴリズム:侵入雑草最適化(IWO)
雑草がさまざまな条件で生き残る驚くべき能力は、強力な最適化アルゴリズムのアイデアになっています。IWO(Invasive Weed Optimization)は、以前にレビューされたものの中で最高のアルゴリズムの1つです。