English Русский 中文 Español Deutsch Português
ローソク足の動きを予測するための簡単な方法

ローソク足の動きを予測するための簡単な方法

MetaTrader 4トレーディング | 5 11月 2015, 10:23
5 810 0
Evgeniy Logunov
Evgeniy Logunov

概論

ローソク足は、オープン、クローズ、最高、最低という価格間の相関関係を示す、一定の期間における価格情報を反映させる手法の1つです。基本的に、ローソク足はテクニカル分析で使われ、よく知られたモデルに従い解釈されます。

市場の動きを予測する為に、いくつかのインディケータを作成した後で、私の中に以前のローソク足の動きについてのデータをベースに、ローソク足の動きを予測することができるかどうかの分析をしようというアイディアが生まれました。

記事では、いくつかの簡単な予測方法が検証されており、またアイディアを検証するためのいくつかのエキスパートアドバイザを提案し、その機能性を評価しています。

注意!記事に添付されているエキスパートアドバイザはテスターでの使用専用です。

1つ目の方法では、次のローソクの動きは、その前のものの動きと一致すると仮定します。2つ目の方法では、次のローソク足の動きは前のものとは逆になると仮定します。これらの方法の良いところは、簡単なところです。これらは、『ナイーブメソッド』のコーナーで検証します。

3つ目の方法は、始めの2つのコンビネーションです。始めは、1つ目か2つ目を選択します。選択された方法が使用され、事実と予測が一致しない場合は(間違いの発見)、他の方法と交換します。この方法は、前の段階で起きた間違いを考慮に入れる為、始めの2つの方法よりも難しいです。したがって、この方法は『適応方法』コーナーで検証していきます。


予測の為の基礎データ

全ての検証される方法は、以前のローソク足の動きについてのデータに基礎を置きます。したがって、一番初めに任意のローソク足の動きの情報を得るための方法を開発する必要があります。

ローソク足のオープン価格とクローズ価格の差の数値をローソク足の動きと名付けましょう。あらゆるローソク足の動きは、「上昇」、「下降」、「動きなし」の3つのうちのいずれかで表します。

OpenClose配列を介して、ローソク足のオープンとクローズ価格の情報を利用することができます。これらの配列ではインデックスとして、シフトが使用されます。これはチャートの右端から、ゼロから数えられるローソクの番号です。つまり、現在のローソクのシフトはゼロで、前のローソクのシフトは1となります。

// ローソク足の動きを取得
double GetCandleDirection(int shift) {
   double diff=Close[shift]-Open[shift];
   if (diff>0.0) {
      return (DIRECTION_UP);
   }
   else if (diff<0.0) {
      return (DIRECTION_DOWN);
   }
   else /*if (diff==0.0)*/ {
      return (DIRECTION_NONE);
   }
}

関数にはローソク足のシフト(shift)が引き渡されます。関数はオープン価格とクローズ価格の差を計算し、その後、得られた符号の数に応じて、3つの定数DIRECTION_UPDIRECTION_DOWNDIRECTION_NONEのうちの1つの値を返します。これらの定数は、それぞれ『上昇』、『下降』、『動きなし』を意味します。

全ての検証する予測方法は、1つの特別な場合を想定していることを強調しておきます。もし前のローソクの動きが判断できない(GetCandleDirection(1)の呼び出しにDIRECTION_NONEが返ってくる)という場合、次のローソクの予測として、不確定な動きが返されます。この場合、テストの為に作成されたエキスパートアドバイザは、市場へのエントリーを行いませんでした。

様々な動きを示す為に使用される定数値は、反対方向の計算が困難を生じさせないように定義をする必要がある点に留意してください。反対方向を計算する方法のうちの1つとして、符号の置き換えを採用することができます。その場合、これらの定数は次のように定義することができます。

// 可能なローソクの動きの判別
#define DIRECTION_NONE 0
#define DIRECTION_UP 1
#define DIRECTION_DOWN -1

添付ファイルからCandleColor.mq4インディケータを使用し、ローソク足の動きを別個にチャート上に出力します。インディケータはローソク足の動きを反映し(青色と赤色のヒストグラム)、また一定期間のローソクの一般的な傾向を判断することができる単純移動平均も表示します。


時間ごとのローソク足の動き。

インディケータが示すように、入れ替わったり、いくつかのローソク足が続けて等しくなったりと、ローソク足の動きは頻繁にその動向を変えます。1つのローソクの動きを予測することでさえ、簡単な作業ではないことは明らかです。

それでは、提案した方法の詳細な分析と検証に移っていきましょう。


ナイーブメソッド

始めの2つの方法から検証を始めます。

  1. 次のローソクの動きが、前のローソクの動きと一致する。
  2. 次のローソクの動きが、前のローソクの動きと逆行する。

2つの方法の有効性をチェックする為、エキスパートアドバイザを作成し(添付ファイル内CandlePredTest_naive.mq4)、テストを行いました。

エキスパートアドバイザは、オープン価格で動作します。新しいバーごとに、エキスパートアドバイザは全てのポジションを閉じ(利益と損失を確定する)、予想される次のローソクの動きに応じてポジションを開きます。次のローソクの動きの予測は、ModelPredict関数が行います。

// 使用するモデルによる予測
int ModelPredict() {
   if (modelState==STATE_NORMAL) {
      return (GetCandleDirection(1));
   }
   else /*if (modelState==STATE_REVERSE)*/ {
      return (-GetCandleDirection(1));
   }
}

関数は2つの予測方法を実装しています。選択は、modelState変数の値によって行われます。

modelState変数が、STATE_NORMALを得る場合、予測は1番目の方法に沿って行われます。関数が前のローソクの動きを、GetCandleDirection(1)の呼び出しを使って照会し、次のローソクの動きとして返します。

2つ目の予測方法は、modelState変数がSTATE_REVERSEと等しい場合に使用します。こういった場合に予想される反対方向の動きの計算は、符号の置き換えにより実行されます。つまり、ModelPredict関数は-GetCandleDirection(1)を返します。

ModelPredict関数では、2つ目の方法と相応するSTATE_REVERSE定数との明らかな比較はされていません。エキスパートアドバイザのコードでは、ユーザーによって入力されるデータは常に正しく、またmodelState変数は常にSTATE_NORMALまたはSTATE_REVERSEの2つの値うちの1つを取ると想定しています。明示的な比較をする為には、コードにもう1つの条件のifを追加し、関数本体から"/*"や"*/"というコメントに含まれる括弧を削除する必要があります。

エキスパートアドバイザのパラメータのリストにはmodelState変数がありませんが、この値はエキスパートアドバイザ起動時に、initialModelState外部変数からコピーされています。

// モデルの状態
extern int initialModelState=STATE_NORMAL;

この過度なコードの複雑化は、後の状態が大きくなり可能性があり、これらの全てが動作の開始に利用できるとは限らないということを想定してのことです。状態の表示として、任意の値を使用することができます。検証中のエキスパートアドバイザで、これらは以下のように定義されています。

// モデルの状態の定義
#define STATE_NORMAL 0
#define STATE_REVERSE 1

エキスパートアドバイザの残りのコードには、綿密にコメントを書くので、読者の中にこれらを判読するのに困難は生じないと思います。

エキスパートアドバイザのテストに次の条件が適用されています。

  • ポジションボリュームー0.1ロット
  • 初期デポジットー1万ドル
  • 期間ー利用可能なもの全て
  • 動作モードーSTATE_NORMALSTATE_REVERSE
  • テスト間隔ー利用可能な全履歴
  • 通貨ペア

    1. USDCHF
    2. GBPUSD
    3. EURUSD
    4. USDJPY
    5. AUDUSD
    6. USDCAD
    7. EURGBP
    8. EURCHF
    9. EURJPY
    10. GBPJPY
    11. GBPCHF
    12. EURAUD

結果の比較を行う基準として、純利益と勝ち取引のパーセンテージが選択されています。

次の2つの表には、STATE_NORMALモード(1つ目の方法)でのエキスパートアドバイザのテスト結果が示されています。

純利益


M1 M5 M15 M30 H1 H4 D1
USDCHF -9902 -9900 -9903 -9907 -9901 -9900 -9927
GBPUSD -9868 -9864 -9869 -9887 -9873 -9868 -9924
EURUSD -9921 -9957 -9949 -9941 -9934 -9910 -9879
USDJPY -9900 -9905 -9900 -9905 -9935 -9926 -9904
AUDUSD -9952 -9957 -9966 -9962 -9961 -9956 -10000
USDCAD -9901 -9903 -9901 -9900 -9902 -9904 -8272
EURGBP -9862 -9861 -9864 -9869 -9875 -9871 -5747
EURCHF -9862 -9865 -9865 -9874 -9869 -9862 -5750
EURJPY -9866 -9877 -9964 -9877 -9869 -9867 -10000
GBPJPY -9848 -9841 -9840 -9845 -9848 -9870 -9849
GBPCHF -9891 -9885 -9850 -9844 -9857 -9856 -9891
EURAUD -9865 -9863 -9868 -9874 -9861 -9891 -10000


勝ち取引の割合


M1 M5 M15 M30 H1 H4 D1
USDCHF 19.55 27.82 31.50 38.18 39.86 43.29 43.95
GBPUSD 21.18 27.81 30.29 33.81 35.20 41.39 46.71
EURUSD 26.06 33.20 34.59 37.55 41.64 43.73 44.37
USDJPY 19.28 31.68 34.13 35.48 39.04 42.99 46.85
AUDUSD 19.71 21.30 26.25 27.20 33.15 39.96 44.69
USDCAD 21.88 25.13 27.59 31.79 33.07 39.48 46.40
EURGBP 21.78 28.90 31.49 34.55 35.24 42.11 47.04
EURCHF 28.70 27.86 27.85 31.13 32.90 39.08 47.65
EURJPY 23.69 30.62 35.81 38.89 39.06 44.04 48.16
GBPJPY 10.11 19.47 33.48 37.39 37.75 43.09 47.42
GBPCHF 23.17 23.95 30.84 33.50 36.03 42.43 47.90
EURAUD 1.65 7.35 16.55 22.24 27.65 36.11 44.64

1つ目の方法のテストは、満足できない結果を示しました。全ての通貨ペアで期間に関係なく、デポジットの損失が起こりました。この際、勝ち取引の数は期間の増長とともに大きくなりますが50%を越えません。

次の2つの表には、STATE_REVERSEモード(2つ目の方法)でのエキスパートアドバイザのテスト結果が示されています。

純利益


M1 M5 M15 M30 H1 H4 D1
USDCHF -9900 -9912 -9902 -9917 -9915 -9901 +83
GBPUSD -9864 -9866 -9869 -9874 -9870 -9911 -5565
EURUSD -9920 -9917 -9923 -9947 -9922 -9886 +4249
USDJPY -9906 -9901 -9906 -9900 -9900 -9928 +2003
AUDUSD -9955 -9956 -9957 -9956 -9969 -9947 +1203
USDCAD -9900 -9900 -9900 -9900 -9901 -9906 -3129
EURGBP -9868 -9862 -9862 -9863 -9867 -9902 -9867
EURCHF -9863 -9861 -9863 -9862 -9869 -9869 -6556
EURJPY -9861 -9864 -9866 -9868 -9897 -9886 -10000
GBPJPY -9850 -9887 -9905 -9857 -9969 -9848 -9964
GBPCHF -9846 -9841 -9842 -9842 -9886 -9914 -9850
EURAUD -9870 -9866 -9874 -9910 -9872 -9872 -2411


勝ち取引の割合


M1 M5 M15 M30 H1 H4 D1
USDCHF 18.38 27.41 33.76 37.46 42.28 46.71 52.15
GBPUSD 18.59 27.71 34.07 39.01 43.79 47.33 49.39
EURUSD 23.37 33.88 41.05 43.80 43.56 48.16 52.56
USDJPY 16.88 30.39 38.13 40.29 43.94 46.62 49.34
AUDUSD 18.84 22.52 25.39 29.83 36.36 43.51 49.84
USDCAD 22.44 24.04 27.07 31.06 35.69 43.51 49.84
EURGBP 20.52 28.89 35.18 38.82 42.41 45.82 45.55
EURCHF 27.43 31.82 32.80 35.05 36.74 43.89 46.04
EURJPY 18.79 28.15 37.09 39.80 43.05 44.15 46.92
GBPJPY 10.02 19.76 31.92 38.06 41.84 44.32 47.53
GBPCHF 19.87 27.24 33.72 35.70 39.74 47.59 46.11
EURAUD 1.43 7.66 17.24 26.95 34.46 41.29 47.07

2つ目の方法のテストは、複雑な結果を示しました。D1よりも小さい全ての時間軸では、結果は1つ目の方式で得られた結果とおおよそ一致しました。D1の時間軸では、12のうちの4つの通貨ペアで利益が出ました。この時、勝ち取引の数は50%に近く、2つの例では52%に達しました。

総じて、エキスパートアドバイザのテスト結果はより良いものを望ませます。これらの欠点を補うために、ナイーブメソッドを一緒に使用してみましょう。


適応方法

適応方法の要点は、予測の構築の為にナイーブメソッドのうちの1つが選択され、エラー時には他のものと置き換えられるという点にあります。このようにして、一連の予測行動への適応が行われます。

エキスパートアドバイザのテストを使用し、この方法の有効性が検証されました。(添付ファイル内、CandlePredTest_adaptive.mq4)

このエキスパートアドバイザは、CandlePredTest_naiveの修正版になります。本質的な違いは、新しいバーごとに、エラーの検出をする目的で、前回の予測の分析を行います。

// エキスパートアドバイザの動作関数
int start() {
   // ポジションオープンは、各バーごとに1度行われます
   if (!IsNewBar()) {
      return (0);
   }
   // 全ての開いているポジションを閉じます
   TradeClosePositions(DIRECTION_UP);
   TradeClosePositions(DIRECTION_DOWN);
   // モデル状態を更新します
   if (prediction!=DIRECTION_NONE) {
      ModelUpdate(prediction==GetCandleDirection(1));
   }
   // 次のローソクの色を予測します
   prediction=ModelPredict();
   if (prediction==DIRECTION_NONE) {
      return (0);
   }
   // 必要な方向へポジションを開きます
   TradeOpenPosition(prediction,"");
   return (0);
}

エラーの分析は、前のバーでエキスパートアドバイザがポジションを開いた場合、つまり、もし予測として定数DIRECTION_NONEが返されなかった場合にのみ行われます。予測と実際の動きの不一致は全てエラーとして見なされ、これの変位は新しいバーが開いた時に1と等しくなります。

1つのナイーブメソッドの他のものとの置き換えは、パラメータとして予測の正確性のフラグが引き渡されるModelUpdate関数が実行します。(prediction==GetCandleDirection(1))

// モデル状態の更新
void ModelUpdate(bool correct) {
   // もし予測が誤っていた場合、モデル状態を変更します
   if (!correct) {
      if (modelState==STATE_NORMAL) {
         modelState=STATE_REVERSE;
      }
      else /*if (modelState==STATE_REVERSE)*/ {
         modelState=STATE_NORMAL;
      }
   }
}

関数は予測の正確性(correct)のフラグを分析し、エラーを検出した際には選択したナイーブメソッドを、数値を変更するmodelState変数を使って置き換えます。modelState変数初期値は、初期化の際にinitialModelState変数からコピーされます。エキスパートアドバイザは、動作時に自分で予測方法を変更するので、これはあまり重要なことではありません。

予測は、CandlePredTest_naiveインディケータで使用されているようなModelPredict関数が行います。動作中のmodelState変数の値の変更により、1つ目の方法で予測を行ったり、2つ目の方法で予測を行ったりします。

エキスパートアドバイザのテストは同じ条件で行われました。固定であった(STATE_NORMAL)initialModelState変数の値の選択は例外です。

純利益


M1 M5 M15 M30 H1 H4 D1
USDCHF -9903 -9905 -9902 -9915 -9902 -9907 -3738
GBPUSD -9866 -9875 -9876 -9864 -9867 -9933 -6404
EURUSD -9924 -9924 -9931 -9920 -9920 -9903 -3779
USDJPY -9904 -9900 -9900 -9904 -9920 -9902 -6493
AUDUSD -9955 -9954 -9955 -9995 -9955 -9965 -8649
USDCAD -9903 -9902 -9901 -9911 -9900 -9904 -1525
EURGBP -9861 -9867 -9865 -9862 -9881 -9877 -9913
EURCHF -9861 -9862 -9872 -9881 -9870 -9875 -9258
EURJPY -9861 -9865 -9866 -9868 -9876 -9905 -9880
GBPJPY -9842 -9844 -9867 -9840 -9919 -10000 -9933
GBPCHF -9841 -9843 -9917 -9840 -9893 -9848 -9895
EURAUD -9866 -9869 -9863 -9872 -9867 -9904 -7656


勝ち取引の割合


M1 M5 M15 M30 H1 H4 D1
USDCHF 19.22 26.82 32.29 35.71 40.29 44.15 47.93
GBPUSD 20.12 28.16 32.01 34.87 40.05 41.97 49.39
EURUSD 25.24 32.65 38.32 39.48 41.50 45.81 48.88
USDJPY 19.16 29.48 35.02 37.03 40.19 44.45 47.34
AUDUSD 19.63 21.67 25.76 28.16 32.11 41.11 46.76
USDCAD 22.84 24.46 27.39 29.79 34.44 42.26 48.46
EURGBP 21.44 29.45 33.05 36.55 38.19 41.86 46.23
EURCHF 27.51 29.98 30.92 34.44 34.09 40.87 44.27
EURJPY 21.24 28.56 35.58 38.78 40.50 44.23 47.12
GBPJPY 11.30 19.90 31.91 37.15 36.76 41.11 46.24
GBPCHF 22.00 26.81 32.13 34.38 36.99 43.11 47.16
EURAUD 1.50 6.56 15.14 22.25 31.63 37.96 47.70

テストは1つ目と2つ目の方法と比較して、顕著な結果の改善は示しませんでした。全ての期間において、全ての通貨ペアで利益は消極的なもので、勝ち取引の数は50%を越えませんでした。


まとめ

記事に書いたテストの結果は、検証した方法の低い有効性を示しました。

  • 1つ目の方法は非常に非効率的であることがわかりました。明らかに、前のローソクの動きと次のローソクの動きの一致についての予測には、更なる検証が必要です。
  • 2つ目の方法は、検証した方法の中で最も良い結果を示しましたが、より綿密な分析が必要です。例えば、利益が固定されていなかった取引数のデータは興味を引くかもしれません。
  • 3つ目の方法は、1つ目と2つ目の方法に比べ、平均的な結果を出したので、更に改善していく必要があります。これを作成する主なアイディアとなったのは、使用されたナイーブメソッドの性質と比較した性能の向上です。しかし、改善は起きませんでした。恐らく、メソッドは余りにも頻繁に予測方法を変えるので、追加のエラーに繋がっているのかもしれません。

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

添付されたファイル |

この著者による他の記事

取引口座の分析 取引口座の分析
この記事は、MT4での取引履歴を元に取引の分析を行うためのツールについて説明しています。特に、その技術面を分析します。分析後に、取引要因の改善方法をまとめます。分析には、MQLab™ Graphic Reportスクリプトを使用します。
テクニカル指標や取引シグナルの利益表のビジュアル最適化 テクニカル指標や取引シグナルの利益表のビジュアル最適化
この記事は、前の記事「テクニカル指標とアラートの利益のビジュアルテスト」の関連記事です。パラメータ変更プロセスに双方向性を加え、検査の目的を変えることにより、シグナルを用いて取引結果予想を表示するだけでなく、メインチャートのシグナルパラメータ値を制御する役割として仮想スライドを動かすことで、取引レイアウトやバランスチャート、取引結果を即座に取得できるツールを作成します。
夜間の取引はどれ程信頼性があるか? 夜間の取引はどれ程信頼性があるか?
この記事では、クロスペアの夜間取引の特徴について明らかにしていきたいと思います。どこから利益は生まれ、なぜ深刻な損失が発生することがあるのかを説明していきます。夜間取引の為に開発されたエキスパートアドバイザの例を引用しています。この戦略に基づく取引経験についてお話していきます。
インディケータとシグナルの利益性のビジュアルテスト インディケータとシグナルの利益性のビジュアルテスト
取引シグナルのインディケータの選択や、それらの計算方法は、通常、これらのシグナルを使用するエキスパートアドバイザのバックテストを行い分析します。しかし、各インディケータに基づいてエキスパートアドバイザを作成するのは、常に可能で必要で妥当であるわけではありません。他のインディケータのシグナルでの、取引の利益性の能率的な計算は、自分でそれらのシグナルを集め、それに基づく理想的な取引の図を描く、特別なインディケータを使う事で行う事ができます。これを使う事で、視覚的に結果を評価するだけでなく、素早く最適なパラメータを選出することができます。