ローソク足分析技術の研究(第1部): 既存パターンの確認

22 4月 2019, 08:44
Alexander Fedosov
0
891

目次

はじめに

ローソク足分析は20年以上前に登場し、それ以来かなり普及しています。日本発祥のローソク足は、多くのトレーダーによって、最も便利で分かりやすい資産価格の視覚化形式だと考えられています。バー形式は動揺ですが、十分な視覚的データが得られません。日本発祥のローソク足は、設定およびローソク足の実体の色の表示の点でより便利であり、したがって市場の動向のより良い視覚化を提供します。

さまざまなローソク足分析方法は、市場の変化を示唆している可能性がある、さまざまなローソク足の分類またはローソク足(パターン)の組み合わせを示唆します。パターンには現在のトレンドの継続を示すものや、トレンドの反転と横方向の動きを暗示するものもあります。

しかし、ローソク足分析の年齢と人気は、それをやみくもに追う人にとっては害になる可能性があります。市場は静止することがありません。20年間で、市場のダイナミクスが変化しただけでなく、市場の動きに影響を与える要因も変化しました。一部の市場関係者はローソク足分析の人気を利用し始め、それに対抗しました。

それがこの記事の意図です。市場の動きを判断するためのいくつかのよく知られた方法を検討し、それらが今日の現実において依然として適切で効果的であるかどうかを確認しましょう。 


問題の定義

パターンの効率を評価するために、その性能を評価するための汎用アルゴリズムを開発しましょう。図1は、一般的なアクションスキームを示しています。もう少し詳しく見てみましょう。


図1 パターン性能評価アルゴリズム

ステップ1: 予想される意味と実際の結果を比較するために、人気のローソク足パターンを選択します。明確にするために、アルゴリズムはローソク足パターンHarami Cross(強気モデル)の形で例を示します。すなわち、上昇トレンドが期待されます。 

ステップ2: 履歴期間と時間枠を定義します。これにより、パターン効率をより深く特定し確認することができます。これはまた、分析された履歴の深さへの依存を見つけること、またはパターンが効率的になるまたはまったく機能しない時間枠を特定するのに役立つことがあります。

ステップ3: 選択した間隔内のパターン発生数を数えます。この数は累積評価に使用されますが、これについては後で説明します。

ステップ4: 各パターンの分析は、上昇トレンド、下降トレンド、またはフラットと一致します。ここで、予測の正確さ、すなわち価格が予想される方向に何ポイント動いたかを定義する必要があります。トレンドがある方向または別の方向に50ポイント以上の価格変動で形成されているとします。指定された移動しきい値に達していない場合、トレンドはパターンの後に形成されなかったと見なされます。   

ステップ5: トレンドの動きの質を判断する方法は?価格はパターン形成後に50ポイントの閾値を超えることができますが、それにはどのくらいかかりますか?これは、分析された時間枠のうちローソク足1本でも10本でも実行できます。そのため、パターンを見つけてパターンシグナルに入ってから利益を待つのは非常に危険で非効率的なので、トレンドは効果的でなければなりません。この目的のために、以下のトレンド効率カテゴリが導入されました。

  • カテゴリA: 所望のトレンドの閾値は、パターンが検出された後1本以内のローソク足で達成される。 
  • カテゴリB: 所望のトレンドの閾値は、パターンが検出された後2本以内のローソク足で達成される。 
  • カテゴりC: 所望のトレンドの閾値は、パターンが検出された後3本以内のローソク足で達成される。 

トレンドの結果をこのように分類すると、現在のパターンの効率をより客観的に評価することができます。

ステップ6: 以下の変数を計算します。

  • パターン検出後に価格が上昇した回数。この動きは上記のカテゴリに従って評価されるべきです。
  • パターン検出後に価格が下降した回数。この動きは上記のカテゴリに従って評価されるべきです。

図2は、見つかったローソク足パターンのサンプル全体から上昇トレンドと下降トレンドを見つけて数え、分類した例を示しています。


図2 トレンドの検出と分類のアルゴリズムと例

この例では、H1時間枠(図1)で2,000個のローソク足のサンプルを分析し、そのパターンに対して50個の一致を見つけました。そのパターンの後、価格は閾値を50ポイント上に20回移動し、10回下に移動します。これら20の上向きの動きのうち、価格は1本のローソク足で閾値の5倍、2本のローソク足で7倍、3本のローソク足で8倍に達しました。

下降トレンドについても同様です。図2から、上昇トレンドの可能性と速度がより高いことがわかります。ただし、一目で状態を判断できるとは限りません。そのような目視検査は惑わらしい場合があります。特に、さまざまなサンプルや時間枠でパターンを分析することで混乱が生じやすくなります。

そこで、私は与えられたトレンドの方向でのパターン効率の一般的な評価のために累積係数を導入することに決めました。これは次のようになります。

ここでEはトレンド効率で、Pがトレンドの確率です。トレンド効率の公式を考えてみましょう。


ここで、A、B、Cは、トレンドがカテゴリで見つかった回数を示します。これらのカテゴリの重要性が異なるため、 k1、k2、k3 は、重み係数です。1本以内のローソク足で閾値が達成されるAカテゴリのトレンドは、3本以内で達成されるときよりも重要です。デフォルトの優先順位は次のとおりです: k1 = 1, k2 = 0.5, k3 = 0.25。これは主観的なものなので、自分で好みの値を設定できます。Sは、見つかった特定のタイプのトレンドの総数です。

トレンド出現の可能性Pは、特定のサンプルから見つかったローソク足パターンの総数に対する、見つかった特定のタイプ(A、B、C)のトレンドの数の比率です。これは実際には、履歴中の以前の行動に基づいて価格が一定の方向に動く確率です。

図2の例で、上昇トレンドと下降トレンドの効率を計算しましょう。  


図3 有効率計算の結果

以下の結果が計算から得られました。

  • トレンドEの効率は上昇傾向で高く、これは視覚的にも観察されましたが、定量的にも評価できました。
  • このパターンが形成された場合のトレンド出現確率Pは、上昇トレンドで40%、下降トレンドで20%です。
  • したがって、上昇トレンド予測のパターンの一般的な効率は2倍以上高くなります。 

パターンの関連性をさらに検討するために、2つの主なパラメータ、つまり、価格がローソク足パターンによって予測される方向に移動する確率と計算された効率評価係数に注意を払います。 

これによって、研究での3つの主要な結論が出るでしょう。

  1. パターンは今日の市況の下で機能しますか?
  2. 機能する場合、パターンの出現時に予測が満たされる可能性は何ですか?
  3. この場合、どれくらいの速さで収益を上げられますか?

 

ローソク足パターン分析のためのプロトタイプインターフェィスの開発

提案モデル内の既存のパターンを調べるには、定義されたタスクに基づいて便利なグラフィカルシェルを設計する必要があります。そのために、グラフィカルインターフェイスを作成するために既存のEasyAndFastGUIライブラリを使用します。

実用的な実装に進む前に、外部構造を定義し、将来のグラフィカルアプリケーションのプロトタイプを作成する必要があります。その後、ソフトウェアを実装していきます。

一般構造は2つのタブで構成されます。最初のタブは既存のパターンの分析に使用され、2番目のタブは必要な設定要素を含みます。最初のタブをもっと詳しく見てみましょう。


図4 [分析]タブの構造

これは、5つの主要な相互作用オブジェクトから成ります。

  1. [分析]と[設定]の2つのタブ間の切り替え
  2. 分析に必要な通貨商品を検索するためのツール
  3. 分析中のパターンの名前、サンプリング範囲で見つかった一致の数、調査内でパターンが発生する頻度、上昇トレンドと下降トレンドに対するこのパターンの推定効率評価係数を含む結果表この情報は、パターンのパフォーマンスが予測される予測特性に対応するかどうか、および結果が予測と一致するかどうかを理解するのに役立ちます。
  4. ローソク足のパターンが調査される時間枠
  5. サンプリング範囲。パターンのテストに指定された時間枠でのローソク足数

次に2番目の[設定]タブを考察します。 


図5 [設定]タブの構造

この節では、パターン解析結果に影響を与えるパラメータの設定について説明します。

  1. パターン形成に使用される基本的なローソク足のリスト 
  2. ダイアログウィンドウ。歯車のアイコンをクリックすると開き、このウィンドウは、パターン形成に参加する基本ローソク足のパラメータの個々の設定を特徴としています。
  3. 分析中のパターンの効率率の計算に使用される重み係数の設定
  4. ポイント単位のトレンド閾値 - 価格がこのしきい値に達すると、これはトレンドの動きの確認となり、パターンは成功と見なされます。

ツールの実装

理論的根拠を定義してプロトタイプを作成したら、アプリケーション要素が構築される順序を決定する必要があります。図5からわかるように、ウィンドウは2つあります。最初のタブには[分析]と[設定]の2つのタブがあり、2番目のタブにはローソク足タイプの個別の設定があります。したがって、2つの主な構築メソッドは次のようになります。

//+------------------------------------------------------------------+
//| プログラムのグラフィカルインターフェイスを作成する                  |
//+------------------------------------------------------------------+
bool CProgram::CreateGUI(void)
  {
//--- パネルの作成
   if(!CreateWindow("Pattern Analyzer"))
      return(false);
//--- ダイアログウィンドウの作成
   if(!CreateWindowSetting("Settings"))
      return(false);
//--- GUIの作成を完了する
   CWndEvents::CompletedGUI();
   return(true);
  }
//+-----------------------------------------------------------------

それでは、これらの各メソッドに何が含まれるかを詳しく見てみましょう。それぞれのメソッドに関しての詳細には触れませんが、ローソク足分析方法に直接関連する主な機能について詳しく説明します。そのため、メインアプリケーションウィンドウを作成するための各メソッド CreateWindow()は次のメソッドで構成されています。これらは、インターフェイス要素を実装します。

  • CreateTabs() — [分析]タブと[設定]タブを実装します。
  • CreateSymbolsFilter() — 目的の銘柄を検索するための入力フィールドとチェックボックス
  • CreateRequest() — クリックするとt検索が開始されるボタン
  • CreateRange() — サンプル範囲を指定するための入力フィールド
  • CreateComboBoxTF() — 分析が実行される時間枠を選択するためのドロップダウンリスト
  • CreateSymbTable() — 銘柄検索結果を含むテーブルを作成します
  • CreateTable() — ローソク足パターン分析の結果を含むテーブル
  • CreateStatusBar() — 分析のために現在選択されている銘柄を表示する、あるいは、銘柄が選択されていないことを通知するステータスバーです。

 このメソッドリストは、[分析]タブのグラフィック要素を実装しています。以下は[設定]タブのメソッドです。

  • CreateCandle() — ローソク足タイプの画像とギアボタンで構成される複合要素を作成します(図4の位置1) 
  • CreateTextLabel() — グループ係数の前のテキストヘッダーを視覚化します(図4の位置3)
  • CreateCoef() — 重み係数の入力フィールドを表示します
  • CreateThresholdValue() — 利益しきい値の入力フィールドをポイント単位で表示するために使用されます

それでは、CreateWindowSetting()メソッドを使用して追加設定を実装した2番目のウィンドウの構造を考えてみましょう。

  • CreateSettingTextLabel() — 動的テキストラベルヒントを作成して、選択した特定のローソク足のどのパラメータを変更しているかを理解するのに役立ちます
  • CreateSettingCoef() — 選択したローソク足のプロパティを編集するための入力フィールドを作成します。
  • CreateSaveButton() — 編集したプロパティを保存および適用するためのボタンを作成します
  • CreateCancelButton() — 選択されたローソク足のパラメータに関するすべてのアクションをキャンセルするためのボタンを作成します

対話用のインターフェースを作成したので、セクションの冒頭で説明したタスク定義に関連する計算および評価方法の実装を進めましょう。ローソク足パターンの分析に適用される開発段階と入力条件を定義しましょう。


図6 グラフィカルインターフェイス作成結果

ご存じのとおり、パターンには1つ、2つ、3つ、およびそれ以上の特定の種類のローソク足からなるものがあります。ローソク足のパターンで使用される基本的なローソク足の種類を列挙しましょう。

  • 長いローソク足 実体 > (実体の過去5日の平均)*K1、ここでK1は調節可能な係数(図4)
  • 短いローソク足 実体 < (実体の過去5日の平均)*K1
  • コマ(極線) 下髭 > 実体*K1および上髭 > 実体*K1
  • 寄引同事線 同事の実体 < (高値~安値)*K1
  • 丸坊主 下髭 < 実体*K1または上髭 < 実体*K1
  • 唐笠/トンカチ 下髭 > 実体*K1および上髭 < 実体*K2

それでは、私たちの分析方法に適用される有名なローソク足のパターンを考えてみましょう。1つのローソク足からなるパターンと2つのローソク足からなるパターンについてみます。

1つのローソク足からなるパターン:

  • 唐笠 (強気パターン)
  • 首吊り (弱気パターン)
  • トンカチ (強気パターン)

2つのローソク足からなるパターン:

  • 流れ星 (弱気パターン)
  • 抱き線(包み線) (強気パターン)
  • 抱き線(包み線) (弱気パターン)
  • Harami Cross(はらみ交差) (強気パターン)
  • Harami Cross(はらみ交差) (弱気パターン)
  • はらみ線 (強気パターン)
  • はらみ線 (弱気パターン)
  • Doji Star(同事星) (強気パターン)
  • Doji Star(同事星) (弱気パターン)
  • 切り込み線(切り返し線) (強気パターン)
  • かぶせ線 (弱気パターン)

これらの種類のローソク足とそれらを識別する方法については、ろうそく足パターンの分析稿で詳しく説明しています。これらの方法はローソク足分析アルゴリズム用に調整されています。

アルゴリズム自体は次のようになります。

1. ローソク足の基本タイプはCandleType()によって特定されます。

//--- ローソク足のタイプを特定する   
   res.type=CAND_NONE;
//--- 長い 
   if(res.bodysize>sum*m_long_coef)
      res.type=CAND_LONG;
//--- 短い 
   if(res.bodysize<sum*m_short_coef)
      res.type=CAND_SHORT;
//--- 同事
   if(res.bodysize<HL*m_doji_coef)
      res.type=CAND_DOJI;
//--- 丸坊主
   if((shade_low<res.bodysize*m_maribozu_coef || shade_high<res.bodysize*m_maribozu_coef) && res.bodysize>0)
      res.type=CAND_MARIBOZU;
//--- 唐笠
   if(shade_low>res.bodysize*m_hummer_coef2 && shade_high<res.bodysize*m_hummer_coef1)
      res.type=CAND_HAMMER;
//--- トンカチ
   if(shade_low<res.bodysize*m_hummer_coef1 && shade_high>res.bodysize*m_hummer_coef2)
      res.type=CAND_INVERT_HAMMER;
//--- コマ(極線)
   if(res.type==CAND_SHORT && shade_low>res.bodysize*m_spin_coef && shade_high>res.bodysize*m_spin_coef)
      res.type=CAND_SPIN_TOP;

2. PatternType()メソッドは、分析されたローソク足または上記のパターンの1つを形成する2つのローソク足のCandleType()によって提供されたデータに基づいてパターンタイプを決定します。

for(int i=m_range_total;i>3;i--)
     {
      CandleType(symbol,cand2,i);                                                      // 1つ前のローソク足
      CandleType(symbol,cand1,i-1);                                                    // 現在のローソク足

      //--- トンカチ(強気)
      if(cand2.trend==DOWN &&                                                             // トレンド方向の確認
         cand2.type==CAND_INVERT_HAMMER)                                                  //「トンカチ」の確認
        {
         m_invert_hummer_total++;
         GetCategory(symbol,i-3,invert_hummer_coef);
        }

      //--- 首吊り(弱気)
      if(cand2.trend==UPPER &&                                                            // トレンド方向の確認
         cand2.type==CAND_HAMMER)                                                         // 「唐笠」の確認
        {
         m_handing_man_total++;
         GetCategory(symbol,i-3,handing_man_coef);
        }
      //--- 唐笠(強気)
      if(cand2.trend==DOWN &&                                                             // トレンド方向の確認
         cand2.type==CAND_HAMMER)                                                         // 「唐笠」の確認
        {
         m_hummer_total++;
         GetCategory(symbol,i-3,hummer_coef);
        }
      //---
      //--- 流れ星(弱気)
      if(cand1.trend==UPPER && cand2.trend==UPPER &&                                      // トレンド方向の確認
         cand2.type==CAND_INVERT_HAMMER && cand1.close<=cand2.open)                       // 「トンカチ」の確認
        {
         m_shooting_star_total++;
         GetCategory(symbol,i-4,shooting_star_coef);
        }

      //--- 抱き線(包み線)(強気)
      if(cand1.trend==DOWN && cand1.bull && cand2.trend==DOWN && !cand2.bull && // トレンドの方向とローソク足の方向の確認
         cand1.bodysize>cand2.bodysize &&
         cand1.close>=cand2.open && cand1.open<cand2.close)
        {
         m_engulfing_bull_total++;
         GetCategory(symbol,i-4,engulfing_bull_coef);
        }

      //--- 抱き線(包み線)(弱気)
      if(cand1.trend==UPPER && cand1.bull && cand2.trend==UPPER && !cand2.bull && // トレンドの方向とローソク足の方向の確認
         cand1.bodysize<cand2.bodysize &&
         cand1.close<=cand2.open && cand1.open>cand2.close)
        {
         m_engulfing_bear_total++;
         GetCategory(symbol,i-4,engulfing_bear_coef);
        }

      //--- Harami Cross(はらみ交差)(強気)
      if(cand2.trend==DOWN && !cand2.bull &&                                              // トレンドの方向とローソク足の方向の確認
         (cand2.type==CAND_LONG || cand2.type==CAND_MARIBOZU) && cand1.type==CAND_DOJI && // 「長い」1番目のローソク足と同事ローソク足の確認
         cand1.close<cand2.open && cand1.open>=cand2.close)                               // 「同事」が1番目のローソク足の実体の内側にある
        {
         m_harami_cross_bull_total++;
         GetCategory(symbol,i-4,harami_cross_bull_coef);
        }

      //--- Harami Cross(はらみ交差)(弱気)
      if(cand2.trend==UPPER && cand2.bull &&                                              // トレンドの方向とローソク足の方向の確認
         (cand2.type==CAND_LONG || cand2.type==CAND_MARIBOZU) && cand1.type==CAND_DOJI && // 「長い」1番目のローソク足と同事ローソク足の確認
         cand1.close<cand2.open && cand1.open>=cand2.close)                               // 「同事」が1番目のローソク足の実体の内側にある
        {
         m_harami_cross_bear_total++;
         GetCategory(symbol,i-4,harami_cross_bear_coef);
        }

      //--- はらみ(強気)
      if(cand1.trend==DOWN && cand1.bull && !cand2.bull &&                                // トレンドの方向とローソク足の方向の確認
         (cand2.type==CAND_LONG || cand2.type==CAND_MARIBOZU)  &&                         // 「長い」1番目のローソク足の確認
         cand1.type!=CAND_DOJI && cand1.bodysize<cand2.bodysize &&                        // 2番目のローソク足は同事ではなく、1つ目のローソク足の実体は2つ目のローソク足よりも大きい
         cand1.close<cand2.open && cand1.open>=cand2.close)                               // 2番目のローソク足の実体が1番目のローソク足の実体の内側にある
        {
         m_harami_bull_total++;
         GetCategory(symbol,i-4,harami_bull_coef);
        }

      //--- はらみ(弱気)
      if(cand1.trend==UPPER && !cand1.bull && cand2.bull &&                               // トレンドの方向とローソク足の方向の確認
         (cand2.type==CAND_LONG || cand2.type==CAND_MARIBOZU) &&                          // 「長い」1番目のローソク足の確認
         cand1.type!=CAND_DOJI && cand1.bodysize<cand2.bodysize &&                        // 2番目のローソク足は同事ではなく、1つ目のローソク足の実体は2つ目のローソク足よりも大きい
         cand1.close<cand2.open && cand1.open>=cand2.close)                               // 2番目のローソク足の実体が1番目のローソク足の実体の内側にある
        {
         m_harami_bear_total++;
         GetCategory(symbol,i-4,harami_bear_coef);
        }

      //--- Doji Star(同事星)(強気)
      if(cand1.trend==DOWN && !cand2.bull && // トレンドの方向とローソク足の方向の確認
         (cand2.type==CAND_LONG || cand2.type==CAND_MARIBOZU) && cand1.type==CAND_DOJI && // 「長い」1番目のローソク足と同事ローソク足の確認
         cand1.close<=cand2.open)                                                         // 同事の始値が1番目のローソク足の終値以下
        {
         m_doji_star_bull_total++;
         GetCategory(symbol,i-4,doji_star_bull_coef);
        }

      //--- Doji Star(同事星)(弱気)
      if(cand1.trend==UPPER && cand2.bull && // トレンドの方向とローソク足の方向の確認
         (cand2.type==CAND_LONG || cand2.type==CAND_MARIBOZU) && cand1.type==CAND_DOJI && // 「長い」1番目のローソク足と同事ローソク足の確認
         cand1.open>=cand2.close)                                                         // 同事の始値が1番目のローソク足の終値以上
        {
         m_doji_star_bear_total++;
         GetCategory(symbol,i-4,doji_star_bear_coef);
        }

      //--- 切り込み線(切り返し線)(強気)
      if(cand1.trend==DOWN && cand1.bull && !cand2.bull && // トレンドの方向とローソク足の方向の確認
         (cand1.type==CAND_LONG || cand1.type==CAND_MARIBOZU) && (cand2.type==CAND_LONG || cand2.type==CAND_MARIBOZU) && // 「長い」ローソク足の確認
         cand1.close>(cand2.close+cand2.open)/2 && // 2番目のローソク足の終値が1番目のローソク足の中心点を上回る
         cand2.open>cand1.close && cand2.close>=cand1.open)
        {
         m_piercing_line_total++;
         GetCategory(symbol,i-4,piercing_line_coef);
        }

      //--- かぶせ線(弱気)
      if(cand1.trend==UPPER && !cand1.bull && cand2.bull && // トレンドの方向とローソク足の方向の確認
         (cand1.type==CAND_LONG || cand1.type==CAND_MARIBOZU) && (cand2.type==CAND_LONG || cand2.type==CAND_MARIBOZU) && // 「長い」ローソク足の確認
         cand1.close<(cand2.close+cand2.open)/2 && // 2番目のローソク足の終値が1番目のローソク足の中心点を下回る
         cand1.close<cand2.open && cand2.close<=cand1.open)
        {
         m_dark_cloud_cover_total++;
         GetCategory(symbol,i-4,dark_cloud_cover_coef);
        }
     }

3. 上記のコードからわかるように、指定されたパターンのいずれかを特定すると、GetCategory()を使用して履歴がチェックされます。すなわち、シグナル出現後の価格の方向性が確認されます。つまり、図1で説明したように、見つかったパターンごとに価格変動カテゴリが決定されます。

//+------------------------------------------------------------------+
//| 利益カテゴリを特定する                                            |
//+------------------------------------------------------------------+
bool CProgram::GetCategory(const string symbol,const int shift,int &category[])
  {
   MqlRates rt[];
   int copied=CopyRates(symbol,m_timeframe,shift,4,rt);
   int rating=0;
//--- 1つ前のローソク足の詳細を取得する
   if(copied<4)
      return(false);
   double high1,high2,high3,low1,low2,low3,close0,point;
   close0=rt[0].close;
   high1=rt[1].high;
   high2=rt[2].high;
   high3=rt[3].high;
   low1=rt[1].low;
   low2=rt[2].low;
   low3=rt[3].low;
   if(!SymbolInfoDouble(symbol,SYMBOL_POINT,point))
      return(false);

//--- 上昇トレンドかどうかを確認する
   if((int)((high1-close0)/point)>=m_threshold_value)
     {
      category[0]++;
     }
   else if((int)((high2-close0)/point)>=m_threshold_value)
     {
      category[1]++;
     }
   else if((int)((high3-close0)/point)>=m_threshold_value)
     {
      category[2]++;
     }

//--- 下降トレンドかどうかを確認する

   if((int)((close0-low1)/point)>=m_threshold_value)
     {
      category[3]++;
     }
   else if((int)((close0-low2)/point)>=m_threshold_value)
     {
      category[4]++;
     }
   else if((int)((close0-low3)/point)>=m_threshold_value)
     {
      category[5]++;
     }
   return(true);
  }

4. カテゴリを決定し、「パターン検出後に価格が何回、どの方向に移動したか」を計算した後、Occurrence(発生率)、The uptrend and downtrend probability(上昇および下降トレンドの確率)などのその他のパラメータ、およびこのパターンの上昇および下降の効率評価係数が計算されます。 計算はCoefCalculation()メソッドで行われます。

//+------------------------------------------------------------------+
//| 効率評価係数の計算                                       |
//+------------------------------------------------------------------+
bool CProgram::CoefCalculation(const int row,int &category[],int found)
  {
   double p1,p2,k1,k2;
   int sum1=0,sum2=0;
   for(int i=0;i<3;i++)
     {
      sum1+=category[i];
      sum2+=category[i+3];
     }
//---
   p1=(found>0)?NormalizeDouble((double)sum1/found*100,2):0;
   p2=(found>0)?NormalizeDouble((double)sum2/found*100,2):0;
   k1=(found>0)?NormalizeDouble((m_k1*category[0]+m_k2*category[1]+m_k3*category[2])/found,3):0;
   k2=(found>0)?NormalizeDouble((m_k1*category[3]+m_k2*category[4]+m_k3*category[5])/found,3):0;

   m_table.SetValue(3,row,(string)p1,2);
   m_table.SetValue(4,row,(string)p2,2);
   m_table.SetValue(5,row,(string)k1,2);
   m_table.SetValue(6,row,(string)k2,2);
//--- 表を更新する
   m_table.Update(true);
   m_table.GetScrollVPointer().Update(true);
   m_table.GetScrollHPointer().Update(true);
   return(true);
  }

これらの計算に基づいて、パターンが予想される動きの特徴に対応しているかどうかを評価できます。


研究結果

ローソク足のパターンを分析するために、MetaTrader 5ターミナルのforex.majorカテゴリからの銘柄のセットを使用しましょう。1つずつ入力しないで済むように、リスト全体を提供するための特別な単語が追加されました。「Major」という単語を入力すると、図7に示すような希望のリストが表示されます。


図7 主要銘柄を簡単に選択する

ローソク足パターンの追加設定は行いません。編集可能な唯一のパラメータは、ポイント単位のトレンド閾値です。短い時間枠で目標値が大きすぎると結果がゼロになり、長い時間枠で目標値が小さすぎると反対の結果につながるので、利益目標は時間枠によって調整する必要があります。 

上記の仮定をテストするために、2つの時間枠を選択して、閾値を変更しましょう。これにより、パラメータの効果を確認できます。提案された21の時間枠で各通貨ペアを考慮してパラメータを変更すると、多くの混乱を招く情報があるので、小さなテストサンプルを検討することにしました。ペア、時間枠、履歴範囲は自分で選択して、さまざまな閾値をテストすることができます。

これがデフォルト以外のパラメータの最初のセットです。

  • Majorセット
  • M15時間枠
  • しきい値利益値は100ポイント(5桁の相場の場合)

7組すべてのテスト結果を図8に示します。



図8 M15時間枠の分析結果

EURUSDを詳しく見て、その例を使用して、ローソク足のパターンが特定の条件に関連しているかどうかを確認します。上の画像のパターンは特定の色で強調表示されています。これは、その動きの特徴を表しています。可能性のある下降トレンドを示すパターンには赤色が使用され、上昇トレンドを示すパターンには緑色が使用されます。色が結果に合っているかどうか見てみましょう。


図9 EURUSDの分析結果

分析中の最初のパターンは唐笠です。パターン特性に従って、それは上向きの動きを予測します。テストの間、上向きの動きが30%の場合に観察され、下向きの動きが10%の場合で発生しました。これは、指定された閾値の100ポイント以上の移動です。過去のサンプルでは、​​3分の1以上の場合にパターンに上向きの動きが続いていたことを考えると、このローソク足パターンは上昇トレンドを示すという仮説を裏付けるものと考えることができます。

ただし、この観察結果を他のすべての時間枠およびサンプルに自動的に適用することはできません。これはこの特定のケースと結果を参照しています。

それでは、弱気抱き線(包み線)パターンを考えてみましょう。このパターンは下降トレンドを示すと考えられるので、短期間で対処する必要があります。ただし、このローソク足パターンの動作はほとんどの場合まったく異なります。20%の場合、パターンの出現後、価格は最低100ポイント上昇しましたが、下落の割合はわずか9%しかなく、2分の1以下となります。したがって、テストの結果、このパターンは逆の動作をすることがわかりました。

分析する3番目のパターンは強気のはらみです。名前と緑色のタグでわかるように、このパターンは買いシグナルです。しかし、下向きと上向きの数はほぼ同じで、17%と19%です。このパターンはあるシグナルを示していると言えるでしょうか。どちらの側にも明らかな罹患率はないので、私は疑います。したがって、テスト結果から、このパターンを15分の時間枠でEURUSDを取引するために使用することはお勧めできません。


結果

得られた結果に基づいて、ローソク足のパターンを明確に解釈することは困難なことがわかります。結果はそれらが現れる条件に大きく依存します。このように、パターンは市場全体を通してだけではなく、異なる時間枠を持つ同じ通貨ペアでも同じように動作しません。必ずパターンシグナルを再確認してください。


終わりに

添付されたアーカイブには、リストされたすべてのファイルが含まれています。これらのファイルは、適切なフォルダにあります。正しく動作させるためには、MQL5フォルダをターミナルフォルダーに保存するだけです。

記事で使用されているプログラム

#
 名称
種類
説明
1
PatternAnalyzer.mq5 グラフィカルインターフェイス
 ローソク足パターンを分析するためのツールバー
2 MainWindow.mqh コードベース  GUIライブラリ
3 Program.mqh コードベース  インターフェイスと計算要素を作成するためのメソッドのライブラリ


MetaQuotes Software Corp.によりロシア語から翻訳された
元の記事: https://www.mql5.com/ru/articles/5576

添付されたファイル |
MQL5.zip (433.39 KB)
長期取引戦略の基盤としてのマルチンゲール 長期取引戦略の基盤としてのマルチンゲール

本稿では、マルチンゲールシステムについて詳細に検討します。このシステムを取引に適用できるかどうか、またリスクを最小限に抑えるための使用方法が検討されます。この単純なシステムの主な欠点は、預金全体を失う可能性があることです。マルチンゲール技術を使って取引することを決定した場合、この事実は考慮に入れられなければなりません。

ジグザグの力(第二部)データの受け取り、処理、表示の例 ジグザグの力(第二部)データの受け取り、処理、表示の例

本稿の最初の部分では、変更されたジグザグ指標と、そのタイプの指標のデータを受け取るためのクラスについて説明しました。ここでは、これらのツールに基づいて指標を開発する方法を示し、ジグザグ指標によって形成されたシグナルに従って取引を行うことを特徴とするテスト用のEAを作成します。さらに、本稿ではグラフィカルユーザインタフェースを開発するためのEasyAndFastライブラリの新しいバージョンを紹介します。

Net FrameworkとC#に基づくエキスパートアドバイザーと指標のためのグラフィカルインターフェイスの開発 Net FrameworkとC#に基づくエキスパートアドバイザーと指標のためのグラフィカルインターフェイスの開発

本稿では、Visual Studioを使用してグラフィカルウィンドウを作成してからエキスパートアドバイザーのMQLコードに統合する簡単で迅速な方法を紹介します。専門家ではないユーザを対象としており、C#および.NETテクノロジに関する知識は必要ありません。

アルゴリズムトレードにおける Kohonen ニューラルネットワークの活用 パート II. 最適化と予測 アルゴリズムトレードにおける Kohonen ニューラルネットワークの活用 パート II. 最適化と予測

Kohonen ネットワークを扱うために設計されたユニバーサルツールに基づいて、最適なEAパラメータを分析して選択するシステムを構築し、時系列の予測を検討します。 第 I 部では、必要なアルゴリズムを追加して、一般に公開されているニューラルネットワーククラスを修正し、改善しました。 今回はこれを実践に応用しましょう。