English Русский 中文 Español Deutsch Português 한국어 Français Italiano Türkçe
価格変動の速度と傾向に基づくトレードアイディア

価格変動の速度と傾向に基づくトレードアイディア

MetaTrader 4 | 14 10月 2015, 13:37
4 514 0
Alexander Fedosov
Alexander Fedosov

概論

価格が動く時、全ての流動的市場は、初めに上昇し後に下降する波としてのいくつかの周期性を持っているということは、十分に知られています。これは高い時間帯のチャートでよく見られます。正弦曲線の本質は、価格が一定の慣性を持っていることを示していて、そうでなければ、短い期間の間に上下への急な動きをしてジグザグになっていたことでしょう。なぜこれが起こり、これをどのように取引の中で活用できるかを研究してみましょう。


動きの始まりと慣性

私たちの世界のあらゆる動きは、方向、加速、速度といった要素を持っています。流動性のある市場でも同様に、こういった要素によって動きがあります。このことから、市場における1つの強い価格の移動も、急激に終わることは決してなく、これはフルスピード時にブレーキを掛けた時、1キロまでブレーキをかけることができる列車と同じようなものです。

トレンドの始まりはいつでしょうか?それは、大多数の市場参加者の意見が、グローバルな路線変更や重大な要素の変化など、市場やニュースに影響を与える何かしらの理由で反対方向へ変わる時です。その後に強力な一般的な意見が出来上がり、トレンドが始まります。市場の参加者は皆、動きは力を蓄え、そして続いていくと確信しています。強力なプレーヤーが大きなポジションと共に参入してくるので、動きはすでに自分の方向性や加速、そして一定の成長速度を持っています。こうして、この動きの始めに参入した人々は稼ぎ始め、動きにはずみと速度を与えます。その後、より悪いレートで他のトレーダーが参入しますが、最初から参入した人々との違いは、彼らは価格変動の動きそのものを利用しようとしているだけという点にあります。

そして変化が訪れ、トレンドは終了します。なぜ動きは一定の時間持続し、急には変化しないのでしょうか?これは、価格を自分たちが望む方向へと加速させ推し進めた人々が、すでに自分のポジションを閉じトレンドにブレーキをかける頃、ただ『波に乗る』人々は、何も変化は起きなかったと信じ、自分たちで価格を動かそうとさえするためです。しかし、ここでは『列車』はただ停まるだけではなく、反対方向へと動き始めるので、彼らにとってはジ・エンドとなります。


トレードアイデアといかに『列車』の下に入らないようにするか

動きを利用して利益を得るアイディアは、現在のトレンドの深さ、つまり、その大きさと持続時間に基づいています。

分かり易い例の為に、RSI(Relative Strength Index)オシレーターと、AC(Acceleration/Deceleration)インディケータという標準的指標を使用します。

1. 市場への参入条件

第一の指標は、現在の動きの中でどれほど価格が遠く深くなったかの尺度として使用します。

この為に、判別をするのに役立つ、レベルの設定をします。

図1. RSIオシレーターのレベル

図1. RSIオシレーターのレベル

価格変動の深さを評価する基準

  • 40~60の間のゾーンは、フラットゾーン(横方向の動く)とします。価格がこのゾーンにある時は、トレンドはありません。動きのないものには、インデックス0を割り当てます。

買い価格の動きのゾーン

  • 60~70のゾーンは、上昇方向へ動き出す可能性を示しています。価格の動きにインデックス1を割り当てます。
  • 70~80のゾーンは、上昇方向へのより明確な動きを示しています。動きが速度を収集します。インデックス2を割り当てます。
  • 80~90のゾーンは、動きはすでに安定した傾向を持ちます。速度が収集されました。これにはインデックス3を割り当てます。
  • 90~100のゾーンは、原則として、反動のない一方向へのとても強力な動きです。稀に発生します。この動きにはインデックス4を割り当てます。

同様に売り価格にもインデックスを割り当てます。

  • 30~40のゾーンは、下降の動きの始まりです。インデックスは-1を割り当てます。
  • 20~30のゾーンは、動きが速度を収集します。インデックスは-2を割り当てます。
  • 10~20のゾーンは、安定した下降傾向です。インデックスは-3を割り当てます。
  • 0~10のゾーンは、一方向への強い動きのゾーンです。インデックスは-4を割り当てます。

MQL4言語では、この条件は次のように記述します。

//--- 買いのインデックスの判別
   double rsi=iRSI(Symbol(),tf,period,PRICE_CLOSE,0);
   index_rsi = 0;
   if(rsi>90.0) index_rsi=4;
   else if( rsi > 80.0 ) 
   index_rsi = 3;
   else if( rsi > 70.0 ) 
   index_rsi = 2;
   else if( rsi > 60.0 ) 
   index_rsi = 1;
   else if( rsi < 10.0 ) 
   index_rsi = -4;
   else if( rsi < 20.0 ) 
   index_rsi = -3;
   else if( rsi < 30.0 ) 
   index_rsi = -2;
   else if( rsi < 40.0 ) 
   index_rsi = -1;

ビル・ウィリアムスのACインディケーターは、意図された目的の為、つまり現在の動きの速度と加速度を測定する為に使用します。

図2. ACインディケータ

図2. ACインディケータ

速度の評価基準

上昇成長

  • 第一の基準は、現在と前の2つのヒストグラムの値の比較になります。もし現在のヒストグラムの値が前のものより大きい場合、価格が上昇する速度が速くなる可能性があります。これを速度のインデックスとして1と定義します。
  • 第二の基準は、ゼロから2までの、3つの隣接するバーの比較です。もし後続のバーのそれぞれの数値が前のものよりも大きい場合、加速として分類し、速度のインデックスは2とします。
  • 前のバーがそれぞれ、後続のバーよりも小さいという条件での、4つのバーの同様の比較です。速度のインデックスは3とします。
  • 同じ条件下での、現在のバーを含む最後の5つのバーの比較です。速度のインデックスは4とします。

下降成長

  • こちらも同様です。現在のバーと前のバーの比較です。もし現在のバーが、それまでのバーより小さい場合、速度のインデックスは-1となります。
  • 前のバーから現在のバーにかけての減少を3つのバーで比較します。インデックスは-2となります。
  • 4つのバーの比較です。インデックスは-3となります。
  • 5つのバーの比較です。インデックスは-4となります。

MQL4言語ではこのようになります。

double ac[];
   ArrayResize(ac,5);
   for(int i=0; i<5; i++)
      ac[i]=iAC(Symbol(),tf,i);

   index_ac=0;
//--- 買いシグナル
   if(ac[0]>ac[1])
      index_ac=1;
   else if(ac[0]>ac[1] && ac[1]>ac[2])
      index_ac=2;
   else if(ac[0]>ac[1] && ac[1]>ac[2] && ac[2]>ac[3])
      index_ac=3;
   else if(ac[0]>ac[1] && ac[1]>ac[2] && ac[2]>ac[3] && ac[3]>ac[4])
      index_ac=4;
//--- 売りシグナル
   else if(ac[0]<ac[1])
      index_ac=-1;
   else if(ac[0]<ac[1] && ac[1]<ac[2])
      index_ac=-2;
   else if(ac[0]<ac[1] && ac[1]<ac[2] && ac[2]<ac[3])
      index_ac=-3;
   else if(ac[0]<ac[1] && ac[1]<ac[2] && ac[2]<ac[3] && ac[3]<ac[4])
      index_ac=-4;

動きの深さやその速度のインデックスを持つことで、エントリーのためのいくつかの条件を形成し、それらを分類することができます。

市場へのエントリーのバリエーションです。

//--- 買いシグナル
if(index_rsi==1 && index_ac>=1) //買いへの動きの可能性
if(index_rsi==2 && index_ac>=1) //買いへの弱い動き
if(index_rsi==3 && index_ac==1) //買いへの弱い動き
if(index_rsi==3 && index_ac>=2) //中程度の買いの動き
if(index_rsi==4 && index_ac>=1) //強い買いの動き

//--- 売りシグナル  
if(index_rsi==-1 && index_ac<=-1) //売りへの動きの可能性
if(index_rsi==-2 && index_ac<=-1) //売りの弱い動き
if(index_rsi==-3 && index_ac==-1) //売りの弱い動き
if(index_rsi==-3 && index_ac<=-2) //中程度の売りの動き
if(index_rsi==-4 && index_ac<=-1) //強い売りの動き

//--- フラット 
if(index_rsi==0) 


2. イグジットの条件

エントリーのパラメータは、定義され分類されました。市場からのイグジットの条件の分類法を理解するために、つぎの類推を行います。

普通の子供のゴムのボールを例とします。もしこれを人が高い場所から水の中に投げ入れたら、何が起こるでしょうか。まずボールは重力によって加速しながら飛んでいきます。その後、大きく速度を失いつつ、負の加速度を持ちながら、水との接触が起こりますが、水面下の一定の深さまで到達するには十分な速度となっています。ボールにはアルキメデスの法則が働き、水の中から上へボールを押し出します。

この例では何が何であるのかを見てみましょう。

  • お気づきのように、ここでのボールは価格です。
  • 人はトレンドを開始する市場への参加者です。
  • 重力を加速する引力は、トレンドが始まった後に価格の傾向に追従するトレーダー達です。
  • 水は、傾向の変化に影響を与える重要な要因です。
  • アルキメデスの力は、トレンドを開始した人々がポジションを閉じることです。

市場で利益を得るための2つの主な課題は、以下の通りです。

  1. タイムリーにボールがすでに投げられた時、つまり買いか売りの瞬間を見極めること。
  2. ボールが水にその動きがスローダウンする瞬間に、ポジションを閉じること。

ボールが落ちる正確な高さと持続時間を判別することは、金融市場で私たちはボールを投げる人も水も見ることはないので、とても難しいです。私たちに見えるのはボールの方向と速度だけです。

前に、私たちは価格の動きの深さの評価と速度の評価の基準を検証しました。

イグジットの条件を定義しましょう。

//--- 下方向への反転の可能性
if(index_rsi>2 && index_ac<0) 

もし価格が十分に長い時間上昇する場合、その速度は消極的になります(下降方向へ)。これは、傾向が変わる可能性があることを示しています。

//--- 上方向への反転の可能性
if(index_rsi<-2 && index_ac>0) 

上記の例と同様に、ボールは十分に長い時間落ち、しかし水に入って、水は反対方向へ押し出します。つまり、ポジションを閉じる時間ということです。


3. エントリーとイグジットの効率アップ

取引で使用されるいくつかのインディケータは、期間の短縮時に傾向の変化に対する反応の速度を上昇させますが、偽のシグナルも多く発生するということは周知のことです。

別の方法としては、小さく計算期間を変え、その観測をいくつかの時間軸で行うことです。

図3. 異なるスケールでのRSIとACインディケータのシグナルに基づくトレンドの状態

図3. 異なるスケールでのRSIとACインディケータのシグナルに基づくトレンドの状態

図では、私達が使用した基準とRSIとACの指標によって、価格の動きの傾向がはっきりとわかります。これをより詳しく見てみましょう。

M1の時間軸での動きと速度は、強い動きで、ACのインデックスは4、RSIのインデックスの深さは2と等しいです。M5の時間軸での深さは同じですが、M5のスケールでは速度は1だけです。次に、M15の時間軸では同様の動きが見られますが、より小さい時間軸よりも顕著ではありません。30分足と1時間足を見た場合、M30では既にシグナルがあり、H1ではスローダウンや反転の可能性のシグナルがあったことが明確にわかります。

この例から、重要な結論として、

H1の時間軸だけを見た場合、私達は売りの注文を出したでしょうが、これは私達が小さい時間軸の分析でフィルタリングをした誤ったシグナルでした。


4. エキスパートアドバイザとしての、この取引戦略の実装

エキスパートアドバイザのコード:

//+------------------------------------------------------------------+
//|                                                       tester.mq4 |
//|                                                Alexander Fedosov |
//+------------------------------------------------------------------+
#property copyright "Alexander Fedosov"
#property strict
#include <trading.mqh>      //取引操作のサポートライブラリ
//+------------------------------------------------------------------+
//| エキスパートアドバイザのパラメータ                                              |
//+------------------------------------------------------------------+
input int             SL = 40;               // ストップロス
input int             TP = 70;               // テイクプロフィット
input bool            Lot_perm=true;         // 残高からのロット?
input double          lt=0.01;               // ロット
input double          risk = 2;              // デポジットリスク、 %
input int             slippage= 5;           // スリッページ
input int             magic=2356;            // マジックナンバー
input int             period=8;              // RSIインディケータの期間
input ENUM_TIMEFRAMES tf=PERIOD_CURRENT;     // 作動時間軸
int dg,index_rsi,index_ac;
trading tr;
//+------------------------------------------------------------------+
//| Expert Advisor initialization function                           |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 取引機能の補助クラスの為の変数の定義
//--- エラー言語、ロシア語またはデフォルト
   tr.ruErr=true;
   tr.Magic=magic;
   tr.slipag=slippage;
   tr.Lot_const=Lot_perm;
   tr.Lot=lt;
   tr.Risk=risk;
//--- 取引操作設定時の試行回数
   tr.NumTry=5;
//--- 現在のチャート上の小数点以下の桁数の定義
   dg=tr.Dig();
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 主要な演算機能                                          |
//+------------------------------------------------------------------+
void OnTick()
  {
   depth_trend();
   speed_ac();
//--- 開いている注文が無いかをチェック
   if(OrdersTotal()<1)
     {
      //--- 買い条件のチェック
      if(Buy())
         tr.OpnOrd(OP_BUY,tr.Lots(),Ask,SL*dg,TP*dg);
      //--- 売り条件のチェック
      if(Sell())
         tr.OpnOrd(OP_SELL,tr.Lots(),Bid,SL*dg,TP*dg);
     }
//--- 開いている注文があるか?
   if(OrdersTotal()>0)
     {
      //--- クローズの条件を満たす売り注文をチェックし閉じます。
      if(Sell_close())
         tr.ClosePosAll(OP_SELL);
      //--- クローズの条件を満たす買い注文をチェックし閉じます。
      if(Buy_close())
         tr.ClosePosAll(OP_BUY);
     }

  }
//+------------------------------------------------------------------+
//| トレンドの深さを判定する機能                               |
//+------------------------------------------------------------------+
void depth_trend()
  {
//--- 買いのインデックスの判別
   double rsi=iRSI(Symbol(),tf,period,PRICE_CLOSE,0);
   index_rsi = 0;
   if(rsi>90.0) index_rsi=4;
   else if(rsi>80.0)
      index_rsi=3;
   else if(rsi>70.0)
      index_rsi=2;
   else if(rsi>60.0)
      index_rsi=1;
   else if(rsi<10.0)
      index_rsi=-4;
   else if(rsi<20.0)
      index_rsi=-3;
   else if(rsi<30.0)
      index_rsi=-2;
   else if(rsi<40.0)
      index_rsi=-1;
  }
//+------------------------------------------------------------------+
//| トレンドの速度を判定する機能                              |
//+------------------------------------------------------------------+
void speed_ac()
  {
   double ac[];
   ArrayResize(ac,5);
   for(int i=0; i<5; i++)
      ac[i]=iAC(Symbol(),tf,i);

   index_ac=0;
//--- 買いシグナル
   if(ac[0]>ac[1])
      index_ac=1;
   else if(ac[0]>ac[1] && ac[1]>ac[2])
      index_ac=2;
   else if(ac[0]>ac[1] && ac[1]>ac[2] && ac[2]>ac[3])
      index_ac=3;
   else if(ac[0]>ac[1] && ac[1]>ac[2] && ac[2]>ac[3] && ac[3]>ac[4])
      index_ac=4;
//--- 売りシグナル
   else if(ac[0]<ac[1])
      index_ac=-1;
   else if(ac[0]<ac[1] && ac[1]<ac[2])
      index_ac=-2;
   else if(ac[0]<ac[1] && ac[1]<ac[2] && ac[2]<ac[3])
      index_ac=-3;
   else if(ac[0]<ac[1] && ac[1]<ac[2] && ac[2]<ac[3] && ac[3]<ac[4])
      index_ac=-4;
  }
//+------------------------------------------------------------------+
//| 買い条件のチェック機能                              |
//+------------------------------------------------------------------+
bool Buy()
  {
   bool res=false;
   if((index_rsi==2 && index_ac>=1) || (index_rsi==3 && index_ac==1))
      res=true;
   return (res);
  }
//+------------------------------------------------------------------+
//| 売り条件のチェック機能                              |
//+------------------------------------------------------------------+
bool Sell()
  {
   bool res=false;
   if((index_rsi==-2 && index_ac<=-1) || (index_rsi==-3 && index_ac==-1))
      res=true;
   return (res);
  }
//+------------------------------------------------------------------+
//| ロングポジションを閉じる条件をチェックする機能             |
//+------------------------------------------------------------------+
bool Buy_close()
  {
   bool res=false;
   if(index_rsi>2 && index_ac<0)
      res=true;
   return (res);
  }
//+------------------------------------------------------------------+
//| ショートポジションを閉じる条件をチェックする機能             |
//+------------------------------------------------------------------+
bool Sell_close()
  {
   bool res=false;
   if(index_rsi<-2 && index_ac>0)
      res=true;
   return (res);
  }

tf(作動時間軸)とperiod(RSIインディケータの期間)の2つのパラメータでちょっとした最適化を行い、

M5の時間軸で次のような結果を得ました。


図4. エキスパートアドバイザのバックテスト結果

注意!これはデモンストレーションの簡易バージョンであり、実際のアカウントでの使用やチェックはお勧めしません。

まとめ

トレンドの始まりと終わりを判別することは、全世界のトレーダーにとっての困難な問題の一つです。なぜなら、市場を予測することは不可能なのですから。

しかしながら、現行のトレンドから顕著な利益をとることで、現行のトレンドでのエントリーとイグジットのタイミングを判定することは十分可能です。市場における動きの速度の動的な観測と判定の全体のアイディアは、この問題に役立ちます。

皆さんがよい取引ができますように。


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

添付されたファイル |
trading.mqh (48.16 KB)
tester.mq4 (11.59 KB)
MQL5 ウィザード:オープンポジションのトレーリングモジュール作成方法 MQL5 ウィザード:オープンポジションのトレーリングモジュール作成方法
MQL5ウィザードのトレーディング戦略ジェネレータはトレーディングの考え方を検証することをひじょうに簡素化します。本稿では、MQL5 ウィザードでトレーディング戦略を書く方法、ジェネレータを、価格がポジション方向に行くときストップロスを無損失ゼロレベルへ移動させることでトレーディングの際減益ドローダウンを守ることのできるオープンポジションを管理する独自のクラスと連携させる方法について述べます。MQL5 ウィザード用に作成されたクラスのストラクチャおよび記述フォーマットについても述べます。
MQL5 ウィザード:リスクおよび資金管理モジュール作成方法 MQL5 ウィザード:リスクおよび資金管理モジュール作成方法
MQL5ウィザードのトレーディング戦略ジェネレータはトレーディングの考え方を検証することをひじょうに簡素化します。本稿では独自のリスクおよび資金管理モジュールの作成と、MQL5 ウィザードでそれを有効にする方法について述べました。例として、資金管理アルゴリズムを取り上げました。そこではトレードボリュームが前回ディールの結果を基に決定されます。またMQL5 ウィザード用に作成されるクラスのストラクチャおよび記述フォーマットについても述べます。
MetaTrader 5のマルチ通貨モードの実行 MetaTrader 5のマルチ通貨モードの実行
長い間、マルチ通貨分析やマルチ通貨トレーディングは人々の関心の的でした。完全なマルチ通貨システムを達成する機会は、MetaTrader5とMQL5プログラミング言語のリリースによりようやく可能になりました。この記事では、複数のシンボルにおけるすべてのティックを処理し分析する方法を紹介します。例として、USDドルインデックスのマルチ通貨RSIインジケーターを見てみます。
MQL5の電子テーブル MQL5の電子テーブル
本稿では、第一ディメンションに異なるタイプのデータを含む動的二次元配列クラスについて述べていきます。テーブル形式でデータを格納すると、整理の幅広い問題を解決し、異なるタイプの広範囲におよぶ情報を格納および処理するのに好都合です。テーブルに連携する機能性を実装するクラスのソースコードは本稿に添付があります。