ニューラルネットワークの実験(第4回):テンプレート
私の経験をもっと頻繁に共有したいと思いますが、ご理解のとおり、そのような活動には時間とコンピューターリソースが必要です。残念ながら、これらはタスクセットに比べて非常に貧弱です。
以前の記事(第1部、第2部、第3部)では、値がパーセプトロンに渡される形状と角度、およびDeepNeuralNetwork.mqhライブラリに基づいて構築されたニューラルネットワークを実験しました。 また、ストラテジーテスターで最適化手法の実験もおこないました。DeepNeuralNetwork.mqhライブラリに基づくニューラルネットワークの作業の結果、および第3部で説明したスマートな最適化アルゴリズムの動作の遅さには、完全には満足できませんでした。単純なパーセプトロンでの結果は、ニューラルネットワークよりも優れていることが判明しました。おそらく、そのようなタスクのために不適切なデータをニューラルネットワークに渡しているため、その分散範囲では安定した結果が得られません。さらに、以前の記事に関するフィードバックには、テイクプロフィットとストップロスの比率に対する批判が含まれていました。以下の実験では、すべてが考慮されました。
検索したところ、お気に入りのMQL5フォーラムで興味深いパターン追跡アルゴリズムに出会いました。その本質は、価格を特定のパターンにしてポジションへの参入を決定することでしたが、ニューラルネットワークでの使用には関係ありませんでした。
これを「テクノロジー」テンプレートと呼びました。正しいかどうかはわかりませんが、私には最も適切な言葉のように思えました。
現在の実験における重要なタスクは、送信されたデータの量と、このデータを取得する履歴の深さの影響を追跡することでした。さらに、パターンを明らかにする必要がありました。短いテンプレートと長いテンプレートのどちらが優れているか、また、渡すパラメータの数を減らすか増やすかを決定する必要がありました。
今、この序文を書いていますが、率直に言って、最終的にどのような結果になるかはわかりません。いつものように、サードパーティのソフトウェアを一切使用せず、Metatrader 5のツールだけを使用します。この記事は、ほとんどの場合、段階的な説明に似ています。すべてをできるだけ明確かつ簡単に説明しようとします。
1.通貨ペア:最適化とフォワードテスト範囲、設定
ここでは、本文中で繰り返さないように、最適化とフォワードテストのすべてのパラメータを提供します。
- 外国為替
- EURUSD
- 時間枠: H1
- テンプレート:ファン、平行四辺形、三角形
- 600と60の対応する修正のストップロスとテイクプロフィット、スプレッドを考慮して、バランスに200と230、テイクプロフィットに小数点以下5桁の30ポイントを追加、200と430のテイクプロフィットはストップ ロスの2倍、残高のテイクプロフィットに小数点以下5桁で30ポイント
- 「始値のみ」および「最大複合基準」の最適化およびテストモード:「最大複合基準」モードを使用することは非常に重要です。「最大収益性」と比較して、より安定した収益性の高い結果を示しました。
- 最適化範囲3年:2019.02.18-2022.02.18。3年は信頼できる基準ではありません。このパラメータはご自分でいろいろとお試しください。
- フォワードテスト範囲1年:2022.02.18-2023.02.18。私の「ニューラルネットワークの実験(第3回):実用化)」稿で説明されているアルゴリズムに基づいてすべてを確認。これは、いくつかの最良の最適化結果の同時取引を意味します。
- 最適化を20回実行。以前のテストと比較して2倍に増やして、結果を見てみましょう。
- すべてのフォワードテストで、40の最適化結果を同時に使用。値は、以前のテストと比較して2倍に増加しています。
- 「高速(遺伝的アルゴリズム)」パーセプトロンによるEAの最適化
- DeepNeuralNetwork.mqh「高速(遺伝的アルゴリズム)」ライブラリでのEA最適化:第2部で検討したアルゴリズムの最適化が遅いため、MetaTrader 5を直接使用して最適化
- 初回入金:10,000単位
- レバレッジ:1:500
「高速(遺伝的アルゴリズム)」モードで20回、40回、またはそれ以上最適化する方法を説明するのをほとんど忘れていました。これをおこなうには、Delphiで作成した小さなオートクリッカープログラムを使用します。ここには掲載できませんが、必要な方には個別メッセージでお送りします。これは次のように機能します。
- 必要な最適化の数を入力する
- ストラテジーオプティマイザーの[開始]ボタンにマウスカーソルを合わせる
- 待つ
指定されたサイクルの後に最適化が終了し、プログラムが終了します。オートクリッカーは、スタートボタンの色の変化に反応します。プログラムは下のスクリーンショットに表示されています。
2.テンプレート
テンプレートは、「フローティングパターン」に似た一種の構造です。その値は市場の状況に応じて常に変化していますが、それぞれの値は一定の範囲内にあり、これが実験に必要なものです。ニューラルネットワークに送信するデータが特定の範囲内にある必要があることは既にわかっているため、単純化してパーセプトロンとニューラルネットワークによる理解を深めるために、テンプレートの値は整数に切り上げられます。したがって、条件をトリガーする状況が増え、パーセプトロンとニューラルネットワークの負荷が軽減されます。以下に、私の頭に浮かんだ最初のテンプレートを示します。ファンと呼びました。類似性は明らかだと思います。この記事では指標を使用しません。代わりにローソク足を使用します。
以下は履歴ズームを使用した例で、より短い履歴またはより深い履歴を分析できます。
テンプレートで同じ数のローソク足を使用することは前提条件ではありません。これにより、以前の価格値の関連性を反映するための追加フィールドが提供されます。私たちの場合、これらはローソク足の終値です。
24本のローソク足にDeepNeuralNetwork.mqhライブラリを使用する例では、以前の記事で説明したさまざまなライブラリを使用していることを理解することが重要です。入力設定が異なります。つまり、ニューラルネットワークの入力用の4つと8つのパラメータです。心配する必要はありません。添付ファイルにEAと必要なライブラリを既に追加しています。
2.1 24本のローソク足に広がる4つの値のファンテンプレート(H1の1日に相当)
理解を深めるために、パーセプトロンとニューラルネットワークに何を転送するかを説明しましょう。
- ポイント1からポイント2までの丸められた距離(ポイント単位)
- ポイント1からポイント3までの丸められた距離(ポイント単位)
- ポイント1からポイント4までの丸められた距離(ポイント単位)
- ポイント1からポイント5までの丸められた距離(ポイント単位)
パーセプトロンEAのコードでは次のようになります。
//+------------------------------------------------------------------+ //| The PERCEPRRON - a perceiving and recognizing function | //+------------------------------------------------------------------+ double perceptron1() { double w1 = x1 - 10.0; double w2 = x2 - 10.0; double w3 = x3 - 10.0; double w4 = x4 - 10.0; int a1 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point())); a1 = (int)(a1/100)*100; int a2 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,7))/Point())); a2 = (int)(a2/100)*100; int a3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point())); a3 = (int)(a3/100)*100; int a4 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,19))/Point())); a4 = (int)(a4/100)*100; return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4); }
DeepNeuralNetwork.mqhライブラリに基づくEAのコードでは次のようになります。
//+------------------------------------------------------------------+ //|percentage of each part of the candle respecting total size | //+------------------------------------------------------------------+ int CandlePatterns(double &xInputs[]) { int a1 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point())); xInputs[0] = (int)(a1/100)*100; int a2 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,7))/Point())); xInputs[1] = (int)(a2/100)*100; int a3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point())); xInputs[2] = (int)(a3/100)*100; int a4 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,19))/Point())); xInputs[3] = (int)(a4/100)*100; return(1); }
2.2 24本のローソク足に広がる8つの値のファンテンプレート(H1の1日に相当)
理解を深めるために、パーセプトロンとニューラルネットワークに渡すものを見てみましょう。
- ポイント1からポイント2までの丸められた距離(ポイント単位)
- ポイント1からポイント3までの丸められた距離(ポイント単位)
- ポイント1からポイント4までの丸められた距離(ポイント単位)
- ポイント1からポイント5までの丸められた距離(ポイント単位)
- ポイント1からポイント6までの丸められた距離(ポイント単位)
- ポイント1からポイント7までの丸められた距離(ポイント単位)
- ポイント1からポイント8までの丸められた距離(ポイント単位)
- ポイント1からポイント9までの丸められた距離(ポイント単位)
パーセプトロンEAのコードでは次のようになります。
//+------------------------------------------------------------------+ //| The PERCEPRRON - a perceiving and recognizing function | //+------------------------------------------------------------------+ 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; int a1 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point())); a1 = (int)(a1/100)*100; int a2 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,4))/Point())); a2 = (int)(a2/100)*100; int a3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,7))/Point())); a3 = (int)(a3/100)*100; int a4 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,10))/Point())); a4 = (int)(a4/100)*100; int b1 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point())); b1 = (int)(b1/100)*100; int b2 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,16))/Point())); b2 = (int)(b2/100)*100; int b3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,19))/Point())); b3 = (int)(b3/100)*100; int b4 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,22))/Point())); b4 = (int)(b4/100)*100; return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4 + v1 * b1 + v2 * b2 + v3 * b3 + v4 * b4); }
DeepNeuralNetwork.mqhライブラリに基づくEAのコードでは次のようになります。
//+------------------------------------------------------------------+ //|percentage of each part of the candle respecting total size | //+------------------------------------------------------------------+ int CandlePatterns(double &xInputs[]) { int a1 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point())); xInputs[0] = (int)(a1/100)*100; int a2 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,4))/Point())); xInputs[1] = (int)(a2/100)*100; int a3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,7))/Point())); xInputs[2] = (int)(a3/100)*100; int a4 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,10))/Point())); xInputs[3] = (int)(a4/100)*100; int g1 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point())); xInputs[4] = (int)(g1/100)*100; int g2 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,16))/Point())); xInputs[5] = (int)(g2/100)*100; int g3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,19))/Point())); xInputs[6] = (int)(g3/100)*100; int g4 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,22))/Point())); xInputs[7] = (int)(g4/100)*100; return(1); }
2.3 48本のローソク足に広がる4つの値のファンテンプレート(H1の2日に相当)
理解を深めるために説明を加えましょう。
- ポイント1からポイント2までの丸められた距離(ポイント単位)
- ポイント1からポイント3までの丸められた距離(ポイント単位)
- ポイント1からポイント4までの丸められた距離(ポイント単位)
- ポイント1からポイント5までの丸められた距離(ポイント単位)
パーセプトロンEAのコードでは次のようになります。前の例が2日間延長されていることがわかります。
//+------------------------------------------------------------------+ //| The PERCEPRRON - a perceiving and recognizing function | //+------------------------------------------------------------------+ double perceptron1() { double w1 = x1 - 10.0; double w2 = x2 - 10.0; double w3 = x3 - 10.0; double w4 = x4 - 10.0; int a1 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point())); a1 = (int)(a1/100)*100; int a2 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point())); a2 = (int)(a2/100)*100; int a3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,25))/Point())); a3 = (int)(a3/100)*100; int a4 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,37))/Point())); a4 = (int)(a4/100)*100; return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4); }
DeepNeuralNetwork.mqhライブラリに基づくEAのコードでは次のようになります。前の例が2日間延長されていることがわかります。
//+------------------------------------------------------------------+ //|percentage of each part of the candle respecting total size | //+------------------------------------------------------------------+ int CandlePatterns(double &xInputs[]) { int a1 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point())); xInputs[0] = (int)(a1/100)*100; int a2 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point())); xInputs[1] = (int)(a2/100)*100; int a3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,25))/Point())); xInputs[2] = (int)(a3/100)*100; int a4 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,37))/Point())); xInputs[3] = (int)(a4/100)*100; return(1); }
2.4 48本のローソク足に広がる8つの値のファンテンプレート(H1の2日に相当)
基準点はローソクの数だけシフトしています。
- ポイント1からポイント2までの丸められた距離(ポイント単位)
- ポイント1からポイント3までの丸められた距離(ポイント単位)
- ポイント1からポイント4までの丸められた距離(ポイント単位)
- ポイント1からポイント5までの丸められた距離(ポイント単位)
- ポイント1からポイント6までの丸められた距離(ポイント単位)
- ポイント1からポイント7までの丸められた距離(ポイント単位)
- ポイント1からポイント8までの丸められた距離(ポイント単位)
- ポイント1からポイント9までの丸められた距離(ポイント単位)
パーセプトロンEAのコードでは次のようになります。
//+------------------------------------------------------------------+ //| The PERCEPRRON - a perceiving and recognizing function | //+------------------------------------------------------------------+ 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; int a1 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point())); a1 = (int)(a1/100)*100; int a2 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,7))/Point())); a2 = (int)(a2/100)*100; int a3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point())); a3 = (int)(a3/100)*100; int a4 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,19))/Point())); a4 = (int)(a4/100)*100; int b1 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,25))/Point())); b1 = (int)(b1/100)*100; int b2 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,31))/Point())); b2 = (int)(b2/100)*100; int b3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,37))/Point())); b3 = (int)(b3/100)*100; int b4 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,43))/Point())); b4 = (int)(b4/100)*100; return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4 + v1 * b1 + v2 * b2 + v3 * b3 + v4 * b4); }
DeepNeuralNetwork.mqhライブラリに基づくEAのコードでは次のようになります。
//+------------------------------------------------------------------+ //|percentage of each part of the candle respecting total size | //+------------------------------------------------------------------+ int CandlePatterns(double &xInputs[]) { int a1 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point())); xInputs[0] = (int)(a1/100)*100; int a2 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,7))/Point())); xInputs[1] = (int)(a2/100)*100; int a3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point())); xInputs[2] = (int)(a3/100)*100; int a4 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,19))/Point())); xInputs[3] = (int)(a4/100)*100; int g1 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,25))/Point())); xInputs[4] = (int)(g1/100)*100; int g2 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,31))/Point())); xInputs[5] = (int)(g2/100)*100; int g3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,37))/Point())); xInputs[6] = (int)(g3/100)*100; int g4 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,43))/Point())); xInputs[7] = (int)(g4/100)*100; return(1); }
2.5 24本のローソク足に広がる4つの値の平行四辺形テンプレート(パラメータを渡すためのより複雑な構造)(H1の1日に相当)
以下は、渡す値の説明です。
- 私の場合、ポイント10からポイント2までの小数点以下5桁に800ポイントを加算
- ポイント10からポイント1まで800ポイントを減算
- ポイント9からポイント3まで800ポイントを加算
- ポイント9からポイント4まで800ポイントを減算
- ポイント8からポイント9への丸められた値(ポイント8は、ポイント2と3の差として検出)
- ポイント3からポイント7に丸められた値
- ポイント2からポイント6に丸められた値
- ポイント1からポイント5に丸められた値
パーセプトロンEAのコードでは次のようになります。
//+------------------------------------------------------------------+ //| The PERCEPRRON - a perceiving and recognizing function | //+------------------------------------------------------------------+ double perceptron1() { double w1 = x1 - 10.0; double w2 = x2 - 10.0; double w3 = x3 - 10.0; double w4 = x4 - 10.0; int a1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(800*Point()))+(iClose(symbolS1.Name(),PERIOD_CURRENT,24)+(800*Point()))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point()); a1 = (int)(a1/100)*100; int a2 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,7)-(iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(800*Point())))/Point()); a2 = (int)(a2/100)*100; int a3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)+(800*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point()); a3 = (int)(a3/100)*100; int a4 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-(800*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,19))/Point()); a4 = (int)(a4/100)*100; return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4); }
DeepNeuralNetwork.mqhライブラリに基づくEAのコードでは次のようになります。
//+------------------------------------------------------------------+ //|percentage of each part of the candle respecting total size | //+------------------------------------------------------------------+ int CandlePatterns(double &xInputs[]) { int a1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(800*Point()))+(iClose(symbolS1.Name(),PERIOD_CURRENT,24)+(800*Point()))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point()); xInputs[0] = (int)(a1/100)*100; int a2 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,7)-(iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(800*Point())))/Point()); xInputs[1] = (int)(a2/100)*100; int a3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)+(800*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point()); xInputs[2] = (int)(a3/100)*100; int a4 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-(800*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,19))/Point()); xInputs[3] = (int)(a4/100)*100; return(1); }
2.6 48本のローソク足に広がる4つの値の平行四辺形テンプレート(時間の経過とともにカバー範囲が広がる)(H1の2日に相当)
以下は、渡す値の説明です。
- 私の場合、ポイント10からポイント2までの小数点以下5桁に1200ポイントを追加(価格は2日以内に大きく変動する可能性があるため、ポイントの値を増加)。このようにすれば、私たちの構造は損なわれません。
- ポイント10からポイント1まで1200ポイントを減算
- ポイント9からポイント3に1200ポイントを加算
- ポイント9からポイント4まで1200ポイントを減算
- ポイント8からポイント9への丸められた値(ポイント8は、ポイント2と3の差として検出)
- ポイント3からポイント7に丸められた値
- ポイント2からポイント6に丸められた値
- ポイント1からポイント5に丸められた値
パーセプトロンEAのコードでは次のようになります。
//+------------------------------------------------------------------+ //| The PERCEPRRON - a perceiving and recognizing function | //+------------------------------------------------------------------+ double perceptron1() { double w1 = x1 - 10.0; double w2 = x2 - 10.0; double w3 = x3 - 10.0; double w4 = x4 - 10.0; int a1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(1200*Point()))+(iClose(symbolS1.Name(),PERIOD_CURRENT,48)+(1200*Point()))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point()); a1 = (int)(a1/100)*100; int a2 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,13)-(iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(1200*Point())))/Point()); a2 = (int)(a2/100)*100; int a3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)+(1200*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,25))/Point()); a3 = (int)(a3/100)*100; int a4 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-(1200*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,37))/Point()); a4 = (int)(a4/100)*100; return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4); }
DeepNeuralNetwork.mqhライブラリに基づくEAのコードでは次のようになります。
//+------------------------------------------------------------------+ //|percentage of each part of the candle respecting total size | //+------------------------------------------------------------------+ int CandlePatterns(double &xInputs[]) { int a1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(1200*Point()))+(iClose(symbolS1.Name(),PERIOD_CURRENT,48)+(1200*Point()))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point()); xInputs[0] = (int)(a1/100)*100; int a2 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,13)-(iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(1200*Point())))/Point()); xInputs[1] = (int)(a2/100)*100; int a3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)+(1200*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,25))/Point()); xInputs[2] = (int)(a3/100)*100; int a4 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-(1200*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,37))/Point()); xInputs[3] = (int)(a4/100)*100; return(1); }
2.7 24本のローソク足に広がる8つの値の平行四辺形のテンプレート(H1の1日に相当)
以下は、渡す値の説明です。
- 私の場合、ポイント9から小数点以下5桁まで800ポイントを加算
- ポイント9から800ポイントを減算し、ポイント4を取得
- ポイント12からポイント2に800ポイントを加算
- ポイント12からポイント1に800ポイントを減算
- ポイント8からポイント9への丸められた値(ポイント8は、ポイント2と3の差として検出)
- ポイント7からポイント3に丸められた値
- ポイント13からポイント4に丸められた値
- ポイント6からポイント3に丸められた値
- ポイント2からポイント6に丸められた値
- ポイント2からポイント10に丸められた値
- ポイント12からポイント11への丸められた値(ポイント1は、ポイント4と1の差として検出)
- ポイント1からポイント5に丸められた値
パーセプトロンEAのコードでは次のようになります。
//+------------------------------------------------------------------+ //| The PERCEPRRON - a perceiving and recognizing function | //+------------------------------------------------------------------+ 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; int a1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(800*Point()))+(iClose(symbolS1.Name(),PERIOD_CURRENT,24)+(800*Point()))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point()); a1 = (int)(a1/100)*100; int a2 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,5)-(iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(800*Point())))/Point()); a2 = (int)(a2/100)*100; int a3 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,9)-(iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(800*Point())))/Point()); a3 = (int)(a3/100)*100; int a4 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,13)-(iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(800*Point())))/Point()); a4 = (int)(a4/100)*100; int b1 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)+(800*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point()); b1 = (int)(b1/100)*100; int b2 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)+(800*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,17))/Point()); b2 = (int)(b2/100)*100; int b3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-(800*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,21))/Point()); b3 = (int)(b3/100)*100; int b4 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(800*Point()))+(iClose(symbolS1.Name(),PERIOD_CURRENT,24)-(800*Point()))/2))/Point()) ; b4 = (int)(b4/100)*100; return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4 + v1 * b1 + v2 * b2 + v3 * b3 + v4 * b4); }
DeepNeuralNetwork.mqhライブラリに基づくEAのコードでは次のようになります。
//+------------------------------------------------------------------+ //|percentage of each part of the candle respecting total size | //+------------------------------------------------------------------+ int CandlePatterns(double &xInputs[]) { int a1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(800*Point()))+(iClose(symbolS1.Name(),PERIOD_CURRENT,24)+(800*Point()))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point()); xInputs[0] = (int)(a1/100)*100; int a2 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,5)-(iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(800*Point())))/Point()); xInputs[1] = (int)(a2/100)*100; int a3 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,9)-(iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(800*Point())))/Point()); xInputs[2] = (int)(a3/100)*100; int a4 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,13)-(iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(800*Point())))/Point()); xInputs[3] = (int)(a4/100)*100; int g1 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)+(800*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point()); xInputs[4] = (int)(g1/100)*100; int g2 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)+(800*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,17))/Point()); xInputs[5] = (int)(g2/100)*100; int g3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-(800*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,21))/Point()); xInputs[6] = (int)(g3/100)*100; int b4 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(800*Point()))+(iClose(symbolS1.Name(),PERIOD_CURRENT,24)-(800*Point()))/2))/Point()) ; xInputs[7] = (int)(g4/100)*100; return(1); }
2.8 48本のローソク足に広がる8つの値の平行四辺形テンプレート(より広範な履歴の範囲)(H1の2日に相当)
以下は、渡す値の説明です。
- 私の場合、ポイント9から小数点以下5桁の1200ポイントを加算
- ポイント9から1200ポイントを減算し、ポイント4を取得
- ポイント12からポイント2に1200ポイントを加算
- ポイント12からポイント1まで1200ポイントを減算
- ポイント8からポイント9への丸められた値(ポイント8は、ポイント2と3の差として検出)
- ポイント7からポイント3に丸められた値
- ポイント13からポイント4に丸められた値
- ポイント6からポイント3に丸められた値
- ポイント2からポイント6に丸められた値
- ポイント2からポイント10に丸められた値
- ポイント12からポイント11への丸められた値(ポイント1は、ポイント4と1の差として検出)
- ポイント1からポイント5に丸められた値
パーセプトロンEAのコードでは次のようになります。
//+------------------------------------------------------------------+ //| The PERCEPRRON - a perceiving and recognizing function | //+------------------------------------------------------------------+ 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; int a1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(1200*Point()))+(iClose(symbolS1.Name(),PERIOD_CURRENT,48)+(1200*Point()))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point()); a1 = (int)(a1/100)*100; int a2 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,9)-(iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(1200*Point())))/Point()); a2 = (int)(a2/100)*100; int a3 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,17)-(iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(1200*Point())))/Point()); a3 = (int)(a3/100)*100; int a4 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,25)-(iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(1200*Point())))/Point()); a4 = (int)(a4/100)*100; int b1 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)+(1200*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,25))/Point()); b1 = (int)(b1/100)*100; int b2 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)+(1200*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,33))/Point()); b2 = (int)(b2/100)*100; int b3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-(1200*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,41))/Point()); b3 = (int)(b3/100)*100; int b4 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(1200*Point()))+(iClose(symbolS1.Name(),PERIOD_CURRENT,48)-(1200*Point()))/2))/Point()) ; b4 = (int)(b4/100)*100; return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4 + v1 * b1 + v2 * b2 + v3 * b3 + v4 * b4); }
DeepNeuralNetwork.mqhライブラリに基づくEAのコードでは次のようになります。
//+------------------------------------------------------------------+ //|percentage of each part of the candle respecting total size | //+------------------------------------------------------------------+ int CandlePatterns(double &xInputs[]) { int a1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(1200*Point()))+(iClose(symbolS1.Name(),PERIOD_CURRENT,48)+(1200*Point()))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point()); xInputs[0] = (int)(a1/100)*100; int a2 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,9)-(iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(1200*Point())))/Point()); xInputs[0] = (int)(a2/100)*100; int a3 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,17)-(iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(1200*Point())))/Point()); xInputs[0] = (int)(a3/100)*100; int a4 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,25)-(iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(1200*Point())))/Point()); xInputs[0] = (int)(a4/100)*100; int g1 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)+(1200*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,25))/Point()); xInputs[0] = (int)(g1/100)*100; int g2 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)+(1200*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,33))/Point()); xInputs[0] = (int)(g2/100)*100; int g3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-(1200*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,41))/Point()); xInputs[0] = (int)(g3/100)*100; int g4 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(1200*Point()))+(iClose(symbolS1.Name(),PERIOD_CURRENT,48)-(1200*Point()))/2))/Point()) ; xInputs[0] = (int)(g4/100)*100; return(1); }
2.9 24本のローソク足に広がる4つの値の三角形テンプレート(H1の1日に相当)
以下は、渡す値の説明です。
- 私の場合、ポイント4からポイント2までの小数点以下5桁に800ポイントを加算
- ポイント4からポイント3まで800ポイントを減算
- ポイント8からポイント4に丸められた値(ポイント8は、ポイント2と1の差として検出)
- ポイント3からポイント5に丸められた値
- ポイント1からポイント6までの丸められた値
- ポイント1からポイント7までの丸められた値
パーセプトロンEAのコードでは次のようになります。
//+------------------------------------------------------------------+ //| The PERCEPRRON - a perceiving and recognizing function | //+------------------------------------------------------------------+ double perceptron1() { double w1 = x1 - 10.0; double w2 = x2 - 10.0; double w3 = x3 - 10.0; double w4 = x4 - 10.0; int a1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(800*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,24))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point()); a1 = (int)(a1/100)*100; int a2 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(800*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,24))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,7))/Point()); a2 = (int)(a2/100)*100; int a3 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point()); a3 = (int)(a3/100)*100; int a4 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,19))/Point()); a4 = (int)(a4/100)*100; return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4); }
DeepNeuralNetwork.mqhライブラリに基づくEAのコードでは次のようになります。
//+------------------------------------------------------------------+ //|percentage of each part of the candle respecting total size | //+------------------------------------------------------------------+ int CandlePatterns(double &xInputs[]) { int a1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(800*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,24))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point()); xInputs[0] = (int)(a1/100)*100; int a2 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(800*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,24))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,7))/Point()); xInputs[1] = (int)(a2/100)*100; int a3 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point()); xInputs[2] = (int)(a3/100)*100; int a4 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,19))/Point()); xInputs[3] = (int)(a4/100)*100; return(1); }
2.10 4つの値の三角形のテンプレート、48本のローソク足の履歴範囲(H1の2日間)
以下は、パーセプトロンとニューラルネットワークに渡される値です。
- 私の場合、ポイント4からポイント2までの小数点以下5桁に1200ポイントを加算
- ポイント4からポイント3まで1200ポイントを減算
- ポイント8からポイント4に丸められた値(ポイント8は、ポイント2と1の差として検出)
- ポイント3からポイント5に丸められた値
- ポイント1からポイント6までの丸められた値
- ポイント1からポイント7までの丸められた値
パーセプトロンEAのテンプレートコードでは次のようになります。
//+------------------------------------------------------------------+ //| The PERCEPRRON - a perceiving and recognizing function | //+------------------------------------------------------------------+ double perceptron1() { double w1 = x1 - 10.0; double w2 = x2 - 10.0; double w3 = x3 - 10.0; double w4 = x4 - 10.0; int a1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(1200*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,48))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point()); a1 = (int)(a1/100)*100; int a2 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(1200*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,48))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point()); a2 = (int)(a2/100)*100; int a3 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,25))/Point()); a3 = (int)(a3/100)*100; int a4 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,37))/Point()); a4 = (int)(a4/100)*100; return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4); }
DeepNeuralNetwork.mqhライブラリに基づくEAのコードでは次のようになります。
//+------------------------------------------------------------------+ //|percentage of each part of the candle respecting total size | //+------------------------------------------------------------------+ int CandlePatterns(double &xInputs[]) { int a1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(1200*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,48))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point()); xInputs[0] = (int)(a1/100)*100; int a2 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(1200*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,48))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point()); xInputs[1] = (int)(a2/100)*100; int a3 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,25))/Point()); xInputs[2] = (int)(a3/100)*100; int a4 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,37))/Point()); xInputs[3] = (int)(a4/100)*100; return(1); }
2.11 24本のローソク足に広がる8つの値の三角形テンプレート(分析対象の履歴範囲は、H1の1日)
渡される値は次のとおりです。
- 私の場合、ポイント4からポイント2までの小数点以下5桁に800ポイントを加算
- ポイント4からポイント3まで800ポイントを減算
- ポイント8からポイント4に丸められた値(ポイント8は、ポイント2と1の差として検出)
- ポイント3からポイント5に丸められた値
- ポイント1からポイント6までの丸められた値
- ポイント1からポイント7までの丸められた値
- ポイント8からポイント9への丸められた値(ポイント8は、ポイント2とポイント1の差として検出)
- ポイント8からポイント10に丸められた値(ポイント8は、ポイント2とポイント1の差として検出)
- ポイント8からポイント11への丸められた値(ポイント8は、ポイント2と1の差として検出)
- ポイント8からポイント12に丸められた値(ポイント8は、ポイント2とポイント1の差として検出)
パーセプトロンEAのテンプレートコードでは次のようになります。
//+------------------------------------------------------------------+ //| The PERCEPRRON - a perceiving and recognizing function | //+------------------------------------------------------------------+ 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; int a1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(800*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,24))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point()); a1 = (int)(a1/100)*100; int a2 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(800*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,24))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,7))/Point()); a2 = (int)(a2/100)*100; int a3 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point()); a3 = (int)(a3/100)*100; int a4 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,19))/Point()); a4 = (int)(a4/100)*100; int b1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(800*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,24))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,4))/Point()); b1 = (int)(b1/100)*100; int b2 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(800*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,24))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,10))/Point()); b2 = (int)(b2/100)*100; int b3 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(800*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,24))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,16))/Point()); b3 = (int)(b3/100)*100; int b4 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(800*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,24))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,22))/Point()); b4 = (int)(b4/100)*100; return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4 + v1 * b1 + v2 * b2 + v3 * b3 + v4 * b4); }
DeepNeuralNetwork.mqhライブラリに基づくEAのコードでは次のようになります。
//+------------------------------------------------------------------+ //|percentage of each part of the candle respecting total size | //+------------------------------------------------------------------+ int CandlePatterns(double &xInputs[]) { int a1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(800*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,24))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point()); xInputs[0] = (int)(a1/100)*100; int a2 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(800*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,24))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,7))/Point()); xInputs[1] = (int)(a2/100)*100; int a3 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point()); xInputs[2] = (int)(a3/100)*100; int a4 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,19))/Point()); xInputs[3] = (int)(a4/100)*100; int g1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(800*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,24))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,4))/Point()); xInputs[4] = (int)(g1/100)*100; int g2 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(800*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,24))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,10))/Point()); xInputs[5] = (int)(g2/100)*100; int g3 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(800*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,24))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,16))/Point()); xInputs[6] = (int)(g3/100)*100; int g4 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(800*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,24))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,22))/Point()); xInputs[7] = (int)(g4/100)*100; return(1); }
2.12 48本のローソク足に広がる8つの値の三角形テンプレート(分析のための履歴範囲は、H1で2日間)
渡される値は次のとおりです。
- 私の場合、ポイント4からポイント2までの小数点以下5桁に1200ポイントを加算すると、加算値は48ローソク足分増加します。
- ポイント4からポイント3まで1200ポイントを減算
- ポイント8からポイント4に丸められた値(ポイント8は、ポイント2と1の差として検出)
- ポイント3からポイント5に丸められた値
- ポイント1からポイント6までの丸められた値
- ポイント1からポイント7までの丸められた値
- ポイント8からポイント9への丸められた値(ポイント8は、ポイント2とポイント1の差として検出)
- ポイント8からポイント10に丸められた値(ポイント8は、ポイント2とポイント1の差として検出)
- ポイント8からポイント11への丸められた値(ポイント8は、ポイント2と1の差として検出)
- ポイント8からポイント12に丸められた値(ポイント8は、ポイント2とポイント1の差として検出)
パーセプトロンEAのテンプレートコードでは次のようになります。
//+------------------------------------------------------------------+ //| The PERCEPRRON - a perceiving and recognizing function | //+------------------------------------------------------------------+ 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; int a1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(1200*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,48))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point()); a1 = (int)(a1/100)*100; int a2 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(1200*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,48))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point()); a2 = (int)(a2/100)*100; int a3 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,25))/Point()); a3 = (int)(a3/100)*100; int a4 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,37))/Point()); a4 = (int)(a4/100)*100; int b1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(1200*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,48))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,6))/Point()); b1 = (int)(b1/100)*100; int b2 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(1200*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,48))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,18))/Point()); b2 = (int)(b2/100)*100; int b3 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(1200*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,48))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,31))/Point()); b3 = (int)(b3/100)*100; int b4 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(1200*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,48))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,43))/Point()); b4 = (int)(b4/100)*100; return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4 + v1 * b1 + v2 * b2 + v3 * b3 + v4 * b4); }
DeepNeuralNetwork.mqhライブラリに基づくEAのコードでは次のようになります。
//+------------------------------------------------------------------+ //|percentage of each part of the candle respecting total size | //+------------------------------------------------------------------+ int CandlePatterns(double &xInputs[]) { int a1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(1200*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,48))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point()); xInputs[0] = (int)(a1/100)*100; int a2 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(1200*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,48))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point()); xInputs[1] = (int)(a2/100)*100; int a3 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,25))/Point()); xInputs[2] = (int)(a3/100)*100; int a4 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,37))/Point()); xInputs[3] = (int)(a4/100)*100; int g1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(1200*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,48))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,6))/Point()); xInputs[4] = (int)(g1/100)*100; int g2 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(1200*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,48))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,18))/Point()); xInputs[5] = (int)(g2/100)*100; int g3 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(1200*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,48))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,31))/Point()); xInputs[6] = (int)(g3/100)*100; int g4 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(1200*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,48))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,43))/Point()); xInputs[7] = (int)(g4/100)*100; return(1); }
3.エキスパートアドバイザー(EA)
それでは、最も興味深い部分、つまりテンプレートの最適化とテストに取り掛かりましょう。覚えていらっしゃるかもしれませんが、DeepNeuralNetwork.mqhライブラリのEAの最適化とテストは、第2回で説明されている最適化テクノロジを使用せずに、標準のMQL5ツールを使用して実行されました。また、これらのEAでは20パスが少し小さいことにも注意してください。反復回数を増やしてご自分で最適化をおこなうことをお勧めします。これにより、結果が改善されると確信しています。最適化するパラメータが多数あると、最良の結果を特定するのに時間がかかります。この記事では、ニューラルネットワークでデータを送信するための非標準的な方法のみを示したいと思います。
DeepNeuralNetwork.mqhライブラリに基づく4つのパラメータを持つEAは、テンプレートに4-4-3ニューラルネットワークスキームを含みますが、8つのパラメータの場合、スキームは8-4-3です。
戦略と分析に使用されるテンプレートに従って、各EAに名前を付けようとしました。分かりやすいかとは思いますが、いつでもフォーラムやプライベートメッセージでご連絡ください。
「最大複合基準」モードでの最適化中に得られた最初の40の最良の結果が、フォワードテストの各EAで使用されました。結果は最適化結果の形式で投稿します。以下はフォワードテストの結果です。
この記事では、ファンテンプレートに基づいてEAをテストし、提示された「テクノロジ」について結論を導きます。興味があれば、残りのテンプレートはご自分でテストなさってください。上記のすべてのテンプレートについて、既製のコードの形で技術的な部分を掲載しましたので、記事の最後に掲載されているEAのテンプレートコードを置き換えれば、問題なく最適化とテストを実行できると思います。
テストの理解に問題がある場合は、本連載第3回をお読みください。そこにはすべてが詳細に説明されています。
3.1 パーセプトロンベースのEA
Perceptron fan 4 SL TP 24 - trade:24本のローソク足で4つのパラメータ、ファンテンプレート:
テイクプロフィット:60、ストップロス:600
化
フォワードテストの結果は、心強いものではありません。履歴全体を通して、堆積物のスムーズな排出が見られます。テスト結果の利益率は高いレベルにあります。おそらく、これはストップロスとテイクプロフィットの比率に関係しています。
テイクプロフィット:230、ストップロス:200
化
プロフィットファクターは1.8の値をほとんど超えません。預金の大幅なドローダウンは、年間の履歴を通じて見ることができます。最小預金の成長。私たちはただその場で踏んでいるだけです。
テイクプロフィット:430、ストップロス:200
化
フォワードテストの全範囲で預金の変動が見られます。利益は損失と一致し、結果は不安定です。最適化中の利益率は約2です。
Perceptron fan 4 SL TP 48 - trade:48本のローソク足で4つのパラメータ、ファンテンプレート:
テイクプロフィット:60、ストップロス:600
最初の6か月間の預金の安定した増加の後、一定の減少が続きます。これは、このような長期間にわたって追加の最適化がおこなわれていないために発生していると思います。渡されたパラメータの時間を長くすると、より安定した結果が得られます。プロフィットファクターは、24本のローソク足での結果よりもはるかに高くなっています。ストップロスとテイクプロフィットの比率に拘束される兆候はありません。
テイクプロフィット:230、ストップロス:200
最初の5か月間は預金が安定的に増加し、その後減少します。おそらく、パーセプトロンで選択された条件とは対照的に、市場が変化したのでしょう。最初の5か月の不均一なグラフは、システムが不安定であることを示しています。
テイクプロフィット:430、ストップロス:200
ファンテンプレートを使用したパーセプトロンでのテストで最も安定した結果です。最初の半年間は順調に成長、その後、再最適化が不足しているため、わずかに低下します。テイクプロフィットの2倍以上のストップロスは、基本的な取引ルールに従って良い結果をもたらします。プロフィットはストップよりも大きいです。最適化すると、プロフィットファクターは1.6のレベルになり、ストップロスとテイクプロフィットの比率を考えると、これは自然なことだと思います。
Perceptron fan 8 SL TP 24 - trade:24本のローソク足で8つのパラメータ、ファンテンプレート:
テイクプロフィット:60、ストップロス:600
グラフはかなり不均一ですが、結果は同じテイクプロフィットとストップロスを持つ4つのパラメータを持つEAとは根本的に異なります。また、上半期以降は若干の下落が見られます。最適化中の平均プロフィットファクターは約6で、これはかなり大きい値です。
テイクプロフィット:230、ストップロス:200
このフォワードテストでは、完全な失敗が発生します。これは、テイクプロフィットとストップロスの1対1の比率によるものだと思います。最適化は約1.7のプロフィットファクターを示しましたが、これは状況を保存しませんでした。
テイクプロフィット:430、ストップロス:200
このオプションも完全な失敗ですが、最初は抵抗があります。最適化は約1.8のプロフィットファクターを示しましたが、これもまた役に立ちませんでした。
Perceptron fan 8 SL TP 48 - trade:48本のローソク足で8つのパラメータ、ファンテンプレート:
テイクプロフィット:60、ストップロス:600
不均一なグラフ。テイクプロフィットとストップロスの比率を考慮すると、損失が生じます。最適化では約3.5~4のプロフィットファクターが示されましたが、フォワードテストでは損失が示されました。
テイクプロフィット:230、ストップロス:200
また、このバージョンでは1か所で変動が発生します。奇妙なことに、バランスの低下はテスト開始直後に発生します。最適化は約2のプロフィットファクターを示しました。
テイクプロフィット:430、ストップロス:200
最初の約3か月間は、非常に良いスタートを切ることができます。その後、新しい最適化の欠如が明らかになりました。テイクプロフィットとストップロスの2対1の比率は、そのような長期間にわたって状況を保存しませんでした。最適化すると、平均プロフィットファクターは1.4でした。
3.2 DeepNeuralNetwork.mqhライブラリに基づくEA
4-4-3 fan 4 SL TP 24 - trade :24本のローソク足の4つのパラメータ、ファンテンプレート:
テイクプロフィット:60、ストップロス:600
プロフィットファクターは20と大きいです。フォワードテストは肯定的な結果を示していますが、大きなストップロスがあります。それでも、より多くの小さな正のテイクプロフィットが状況を救います。
テイクプロフィット:230、ストップロス:200
バランスチャートは1か所で足踏み状態になっています。最適化により、約1.7のプロフィットファクターが示されました。
テイクプロフィット:430、ストップロス:200
ゆっくりですが確実に衰退します。テイクプロフィットとストップロスの比率は状況を保存しません。最適化により、約2のプロフィットファクターが示されました。
4-4-3 fan 4 SL TP 48 - trade:48本のローソク足で4つのパラメータ、ファンテンプレート:
テイクプロフィット:60、ストップロス:600
48本のローソク足でテンプレートを渡すと、24本のローソク足で同じテンプレートを渡すのとは対照的に、肯定的な結果は示されませんでした。明らかに、時間が非常に長いテンプレートは、そのようなテイクプロフィットとストップロスの比率ではうまく機能しません。最適化により、約14のプロフィットファクターが示されました。これはかなりの数値です。
テイクプロフィット:230、ストップロス:200
最適化すると、2.5のプロフィットファクターが得られます。ご覧のとおり、テイクプロフィット230とストップロス200は役に立ちません。バランスがゆっくりと低下します。
テイクプロフィット:430、ストップロス:200
この場合、進展はありません。年間を通して、バランスは低下し、増加します。最適化すると、2.7のプロフィットファクターが得られます。
8-4-3 fan 8 SL TP 24 - trade:24本のローソク足で8つのパラメータ、ファンテンプレート:
テイクプロフィット:60、ストップロス:600
非常に興味深い結果で、フォワードテストの全履歴で1つのストップロスのみです。それでも、結果はランダムかもしれません。最適化すると、プロフィットファクターは約29でスケールから外れます。
テイクプロフィット:230、ストップロス:200
スクリーンショットからわかるように、再び進展はありません。最適化すると、プロフィットファクターは2.7のレベルになり、現在のテイクプロフィットとストップロスの比率では十分なはずでしたが、そうではありませんでした。最初の6か月間はいくらかの上昇が見られます。
テイクプロフィット:430、ストップロス:200
最初の2~3か月間はわずかに増加しましたが、その後明らかに市場の状況が変化し、EAは預金を失い始めました。どうやら、一定の最適化がまだ必要です。最適化すると、プロフィットファクターは3.9のレベルになります。
8-4-3 fan 8 SL TP 48 - trade:48本のローソク足で8つのパラメータ、ファンテンプレート:
テイクプロフィット:60、ストップロス:600
このEAの動作は、24ローソク足パターンの前のものと似ています。より多くの負けトレード。最適化すると、プロフィットファクターは26のレベルでした。ローソクが24本の場合は29のレベルでした。
テイクプロフィット:230、ストップロス:200
最適化すると、プロフィットファクターは3のレベルになります。バランスレベルはそのままです。損失は利益と交互になります。
テイクプロフィット:430、ストップロス:200
テイクプロフィットがストップロスの2倍であっても、肯定的な結果にはつながりません。ほとんどの場合、ニューラルネットワークはそのような大きなテイクプロフィットを予測できません。最適化すると、プロフィットファクターは3のレベルになります。
結論
おこなわれた作業から、肯定的な結論と否定的な結論の両方を引き出すことができます。一連の考えを失わないように、小さなリストの形でそれらを提供します。
- スケーリングに関しては、非常に柔軟なシステムであることが判明しました。無制限の数のテンプレートとそれらに渡すパラメータを適用することができます。新しいパターンを考え出し、結果を観察することで、フォワードテストにより良い影響を与えることができます。
- エントリシグナルを判断するには、いくつかのパーセプトロンと異なるテンプレートを含むシステムを試す必要がある場合があります。
- コンピューターの能力は明らかに十分ではありません。膨大な数のコアを備えたシステムが必要です。理想的には、合計16コア以上の2つのCPUアセンブリです。ご存知かもしれませんが、ストラテジーテスターは物理コアのみを使用し、スレッドは使用しません。MQL5クラウドネットワークを使用する機能により、検索の生産性が大幅に向上します。
- 渡された入力の数によって、パーセプトロンまたはニューラルネットワークの負荷が大幅に増加します。入力の値を丸めると、肯定的な結果の数が約2倍に増加しました。
- さらなる開発のためにシステムを選択する前に、パーセプトロンとニューラルネットワークにデータを渡すためのいくつかのオプション、つまり特定の範囲で移動する指標、および発散などの興味深い現象を確認する必要があります。近い将来これをおこなうと思います。
添付ファイルのリスト:
- DeepNeuralNetwork:元のライブラリ
- DeepNeuralNetwork2:4-4-3構造ニューラルネットワーク用に修正されたライブラリ
- DeepNeuralNetwork3:8-4-3構造ニューラルネットワーク用に修正されたライブラリ
- perceptron fan 4 SL TP 24 - opt:24本のローソク足で4つのパラメータを使用してファンテンプレートを最適化するためのパーセプトロンベースのEA
- perceptron fan 4 SL TP 48 - opt:48本のローソク足で4つのパラメータを使用してファンテンプレートを最適化するためのパーセプトロンベースのEA
- perceptron fan 8 SL TP 24 - opt:24本のローソク足で8つのパラメータを使用してファンテンプレートを最適化するためのパーセプトロンベースのEA
- perceptron fan 8 SL TP 48 - opt:48本のローソク足で8つのパラメータを使用してファンテンプレートを最適化するためのパーセプトロンベースのEA
- perceptron fan 4 SL TP 24 - trade (600 60), (200 230), (200 430) :最適化されたパーセプトロンベースのEA、24本のローソク足で4つのパラメータを持つファンテンプレート
- perceptron fan 4 SL TP 48 - trade (600 60), (200 230), (200 430):最適化されたパーセプトロンベースのEA、48本のローソク足で4つのパラメータを持つファンテンプレート
- perceptron fan 8 SL TP 24 - trade (600 60), (200 230), (200 430):最適化されたパーセプトロンベースのEA、24本のローソク足で8つのパラメータのファンテンプレート
- perceptron fan 8 SL TP 48 - trade (600 60), (200 230), (200 430) :最適化されたパーセプトロンベースのEA、48個のローソク足で8つのパラメータのファンテンプレート
- 4-4-3 fan 4 SL TP 24 - opt:24本のローソク足で4つのパラメータを使用したファンテンプレートの最適化のためのライブラリベースのEA
- 4-4-3 fan 4 SL TP 48 - opt:48本のローソク足で4つのパラメータを使用したファンテンプレートの最適化のためのライブラリベースのEA
- 8-4-3 fan 4 SL TP 24 - opt:24本のローソク足で8つのパラメータを使用したファンテンプレートの最適化のためのライブラリベースのEA
- 8-4-3 fan 4 SL TP 48 - opt:48本のローソク足で8つのパラメータを使用してファンテンプレートを最適化するためのライブラリベースのEA
- 4-4-3 fan 4 SL TP 24 - trade (600 60), (200 230), (200 430):最適化されたライブラリベースのEA、24本のローソク足で4つのパラメータを持つファンテンプレート
- 4-4-3 fan 4 SL TP 48 - trade (600 60), (200 230), (200 430):最適化されたライブラリベースのEA、48本のローソク足で4つのパラメータを持つファンテンプレート
- 8-4-3 fan 4 SL TP 24 - trade (600 60), (200 230), (200 430):最適化されたライブラリベースのEA、24本のローソク足で8つのパラメータを備えたファンテンプレート
- 8-4-3 fan 4 SL TP 48 - trade (600 60), (200 230), (200 430):最適化されたライブラリベースのEA、48本のローソク足で8つのパラメータを備えたファンテンプレート
ご清聴ありがとうございました。
MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/12202
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索