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

Alexander Fedosov | 14 10月, 2015

概論

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


動きの始まりと慣性

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

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

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


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

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

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

1. 市場への参入条件

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

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

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

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

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

買い価格の動きのゾーン

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

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インディケータ

速度の評価基準

上昇成長

下降成長

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. エキスパートアドバイザのバックテスト結果

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

まとめ

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

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

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