
10のレンジトレーディング戦略の比較分析
目次
- イントロダクション
- レンジトレーディング戦略の作成時にタスクを定義する
- レンジトレーディング戦略
- 戦略 #1MFI ベースのフィルタを使用したエンベロープインジケータ
- 戦略 #2ボリンジャーバンドと2つの移動平均
- 戦略 #3フラクタル次元エーレルスに基づくフィルタを用いた WSO & WRO チャネル
- 戦略 #4 パーセンテージクロスオーバーチャネルインジケータと TrendRange ベースのフィルター
- 戦略 #5 価格チャネルインジケータと RBVI ベースのフィルター
- 戦略 #6 ウィリアムズパーセントレンジインジケータと ADX ベースのフィルター
- 戦略 #7 修正ケルトナー チャネルとマジックトレンドベースのフィルタ
- 戦略 #8 トリニティインパルスによる確認と ドンチャン チャネル
- 戦略 #9 ATR チャネルインジケータと CCI カラーレベルに基づくフィルタ
- 戦略 #10 RSI ヒストグラムとレンジインジケータに基づいたフィルタ
- テスト
- 判明したこと
- 結論
イントロダクション
トレンドフォロー戦略は、特に初心者に人気があり、使いやすいものです。 しかし、今日の相場はよりダイナミックであり、トレンドの挙動は(範囲と期間の面で) あいまいです。 レンジまたは横向きの相場でトレードしないことは、機会損失につながります。 トレンドフォローのトレードルールは簡単です: トレンドの兆候を識別し、活用するだけです。 レンジ期間のトレードはそれとはかなり異なります。 フラットな動きの間、価格は小さい範囲にあり、長い間変わらずにとどまるかもしれません。 相場に方向性のある動きはなく、流動性は低いでしょう。
レンジトレーディング戦略の作成時にタスクを定義する
前の記事では、トレンドを作成するために必要とされた3つのタスクを定義しました。 レンジトレーディング戦略の作成に必要なタスクは非常によく似ています。
図1. サイドウェイ/レンジな動きの例。
タスク1。 レンジ期間を識別します。
レンジの一般的かつ網羅的な定義はありません (実際にはトレンドの概念の適切な説明はありません). 但し、相場がレンジ状態にあることのある特定の徴候がある場合もあります。 上向きと下向きの両方の明確な垂直方向の動きがないため、この動きはまた、横向きと呼ばれます。 価格は、波の下と上の境界線に近づいて、範囲内で移動します。 レンジ期間のもう一つの兆候は、相場におけるトレードボリュームの少なさと相場参加者の興味のなさです。 価格のわずかな動きと同様、小さいティックのボリュームから見ることができます。
タスク2。 開始価格率のポジションのターゲット。
チャネルのトレードは、多くの場合、レンジトレーディングテクニックに関連して使用します。 これが、利益を得る目的のために横向きの相場を使用する主要なメソッドです。 レンジチャネルは、仮想境界で決定されます。 さらに、トレード戦略は、価格とチャネルの境界線との関係に基づいて構築されます。 ほとんどの場合、この戦略は、価格がチャネルの境界線から跳ね返るときに売買することを意味します (図2)。
図2. 価格がチャネルのボーダーを離れて跳ねるときのトレード
チャネルの上部で売る場合、価格が下のボーダーに向かって移動すると想定します。 それは、TP レベルとして機能します。 SLは、特定の数値としてポイントまたはチャネルの境界線に従って設定することができます。 カウンター戦略は、買いに使用します: 下のチャネルの境界線で買いし、上部の境界線の近くに TP レベルを設定します。
レンジトレーディング戦略
上記の原則を使用してレンジトレーディング戦略を選択します。
- トレードは、チャネル内で実行されます。 したがって、チャネルを構築し、レンジゾーンの仮想境界線を決定するのに役立つツールを選択する必要があります。
- チャネルを定義することに加えて、価格がチャネルの境界線からリバウンドした後、正しい方向に行くことを確認するために、少なくとももう一つの追加のツールが必要です。 このようなフィルタの目的は、ダマシシグナルを避けることです。
戦略 #1MFI ベースのフィルタを使用したエンベロープインジケータ
チャネルの境界線は、エンベロープインジケータに基づいて決定されます。 MFI インジケータは、シグナルのフィルタリングにも使用します。
インジケータパラメータ | 詳細 |
---|---|
使用されるインジケータ | エンベロープ |
使用されるインジケータ | MFI |
時間枠 | H1 |
買い条件 | 価格が、下のチャネルの境界線に達すると、MFI は売られ過ぎのゾーン (価格レート20以下) にある |
売り条件 | 価格が上のチャネルのボーダーに達し、MFI が買われ過ぎのゾーンにある (80 の上で) |
決済条件 | 価格が反対のチャネルのボーダーに達する |
図3は、戦略 #1 による相場参入状況を示しています。
図3. レンジトレーディング戦略のエントリー条件 #1
以下は、この戦略をトレードするEAのコードです。
void OnTick() { //--- Checking orders previously opened by the EA if(!Trade.IsOpenedByMagic(Inp_MagicNum)) { //計算のためのデータの取得 if(!GetIndValue()) return; //--- Opening an order if there is a buy signal if(BuySignal()) Trade.BuyPositionOpen(Symbol(),Inp_Lot,close[0]-Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment); //--- Opening an order if there is a sell signal if(SellSignal()) Trade.SellPositionOpen(Symbol(),Inp_Lot,close[0]+Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment); } } //+------------------------------------------------------------------+ //| Buy conditions | //+------------------------------------------------------------------+ bool BuySignal() { if(mfi[0]<20 && env_low[0]>close[0]) { tp=env_high[0]; return true; } else return false; } //+------------------------------------------------------------------+ //| Sell conditions | //+------------------------------------------------------------------+ bool SellSignal() { if(mfi[0]>80 && env_high[0]<close[0]) { tp=env_low[0]; return true; } else return false; } //+------------------------------------------------------------------+ //| Getting the current values of indicators | //+------------------------------------------------------------------+ bool GetIndValue() { return(CopyBuffer(InpInd_Handle1,0,0,2,mfi)<=0 || CopyBuffer(InpInd_Handle2,1,0,2,env_low)<=0 || CopyBuffer(InpInd_Handle2,0,0,2,env_high)<=0 || CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0 )?false:true; } //+------------------------------------------------------------------+
TP は設定条件に合わせて自動的に設定され、タイムフレームに応じて SL が手動で設定されます。
戦略 #2ボリンジャーバンドと2つの移動平均
チャネルの境界線はボリンジャーバンドを使用して決定され、シグナルは遅いMAと高速MAの相対的なポジションに基づいてフィルタリングされます。
インジケータパラメータ | 詳細 |
---|---|
使用されるインジケータ | ボリンジャーバンド |
使用されるインジケータ | 移動平均 |
時間枠 | H1 |
買い条件 | 価格は下のチャネルのボーダーに達し、速いMA が遅いMAの上にある |
売り条件 | 価格は上のチャネルのボーダーに達し、速いMAが遅いMAの下にある |
決済条件 | 価格が反対のチャネルのボーダーに達する |
相場参入状況を図4に示します。 2つの SMA のデフォルトの期間は小さい: 4 と8です。 周期値と平滑化メソッドは調整可能であるため、ボリンジャーバンドシグナルのフィルタリング感度を変更することができます。
図4. レンジトレーディング戦略のエントリー条件 #2
相場参入の条件を除いて、戦略 #2 は戦略 #1 と非常によく似ています。
void OnTick() { //--- Checking orders previously opened by the EA if(!Trade.IsOpenedByMagic(Inp_MagicNum)) { //計算のためのデータの取得 if(!GetIndValue()) return; //--- Opening an order if there is a buy signal if(BuySignal()) Trade.BuyPositionOpen(Symbol(),Inp_Lot,close[0]-Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment); //--- Opening an order if there is a sell signal if(SellSignal()) Trade.SellPositionOpen(Symbol(),Inp_Lot,close[0]+Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment); } } //+------------------------------------------------------------------+ //| Buy conditions | //+------------------------------------------------------------------+ bool BuySignal() { if(ma_slow[0]>ma_fast[0] && bb_low[0]>close[0]) { tp=bb_up[0]; return true; } else return false; } //+------------------------------------------------------------------+ //| Sell conditions | //+------------------------------------------------------------------+ bool SellSignal() { if(ma_slow[0]<ma_fast[0] && bb_up[0]<close[0]) { tp=bb_low[0]; return true; } else return false; } //+------------------------------------------------------------------+ //| Getting the current values of indicators | //+------------------------------------------------------------------+ bool GetIndValue() { return(CopyBuffer(InpInd_Handle1,1,0,2,bb_up)<=0 || CopyBuffer(InpInd_Handle1,2,0,2,bb_low)<=0 || CopyBuffer(InpInd_Handle2,0,0,2,ma_slow)<=0 || CopyBuffer(InpInd_Handle3,0,0,2,ma_fast)<=0 || CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0 )?false:true; } //+------------------------------------------------------------------+
戦略 #3。 WSO & WRO チャネルとフラクタル次元エーレルス
このメインシグナルインジケータは、WSO & WRO チャネルで、WSO (Widner サポートオシレーター) と WRO (Widner レジスタンスオシレーター) の2つのオシレーターに基づいたチャネルです。 このインジケータのアイデアは、Mel Widnerによる "自動化されたサポートとレジスタンス" に基づいています このシグナルをフィルターするために、John F. Ehlersおよび Ric Wayによる記事 「Fractal Dimension as a Market Mode Sensor」で記述されたフラクタル次元インジケータを使用します。
インジケータパラメータ | 詳細 |
---|---|
使用されるインジケータ | WSO & WRO チャネル |
使用されるインジケータ | フラクタル次元エーレルス |
時間枠 | 指定なし |
買い条件 | 価格が下のチャネルの境界線に達し、フラクタル次元値が閾値の下になる |
売り条件 | 価格が上のチャネルの境界線に達し、フラクタル次元値が閾値の下になる |
決済条件 | 価格が反対のチャネルのボーダーに達する |
図5は、相場参入状況を示しています。 以前の戦略と同様に、トレードの操作は、価格がチャネルの境界線から跳ね返るときに実行されます。 このフィルタは、相場がトレンドになっていないときにエントリポイントを見つけるのに役立ちます。
図5. レンジトレーディング戦略のエントリー条件 #3
以下は、この戦略をトレードするEAのコードです。
void OnTick() { //--- Checking orders previously opened by the EA if(!Trade.IsOpenedByMagic(Inp_MagicNum)) { //計算のためのデータの取得 if(!GetIndValue()) return; //--- Opening an order if there is a buy signal if(BuySignal()) Trade.BuyPositionOpen(Symbol(),Inp_Lot,close[0]-Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment); //--- Opening an order if there is a sell signal if(SellSignal()) Trade.SellPositionOpen(Symbol(),Inp_Lot,close[0]+Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment); } } //+------------------------------------------------------------------+ //| Buy conditions | //+------------------------------------------------------------------+ bool BuySignal() { if(wwc_low[0]>close[0] && fdi[0]<Inp_FdiThreshold) { tp=wwc_up[0]; return true; } else return false; } //+------------------------------------------------------------------+ //| Sell conditions | //+------------------------------------------------------------------+ bool SellSignal() { if(wwc_up[0]<close[0] && fdi[0]<Inp_FdiThreshold) { tp=wwc_low[0]; return true; } else return false; } //+------------------------------------------------------------------+ //| Getting the current values of indicators | //+------------------------------------------------------------------+ bool GetIndValue() { return(CopyBuffer(InpInd_Handle1,3,0,2,wwc_up)<=0 || CopyBuffer(InpInd_Handle1,2,0,2,wwc_low)<=0 || CopyBuffer(InpInd_Handle2,0,0,2,fdi)<=0 || CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0 )?false:true; } //+------------------------------------------------------------------+
戦略 #4 パーセンテージクロスオーバーチャネルインジケータと TrendRange ベースのフィルター
このケースでは、チャネルは一定の割合でレベルのブレイクアウトで構築されます。 チャネルを構築し、価格が境界線に触れる場所を探索するインジケータが必要です。 トレンドとレンジの両方の状態を示す TrendRange インジケータを使用します。 この状態は、フィルタシグナルに適用されます。
インジケータパラメータ | 詳細 |
---|---|
使用されるインジケータ | パーセンテージクロスオーバーチャネル |
使用されるインジケータ | トレンドの範囲 |
時間枠 | 指定なし |
買い条件 | 価格が下のチャネルのボーダーに達し、トレンドの範囲のヒストグラムが灰色である |
売り条件 | 価格が上のチャネルの境界線に到達し、トレンド範囲のヒストグラムが灰色である |
決済条件 | 価格が反対のチャネルのボーダーに達する |
相場参入条件を図6に示します。 パーセンテージクロスオーバーインジケータには、特定の特徴があります。 パーセントパラメータは、新しいレベルの構築が開始され、パラメータが時間枠に依存している場合の限界距離です。 下のタイムフレームには、より小さなパーセントを設定する必要があります。 たとえば、時間枠の推奨値は 20 ~ 30 です。 高い値は、インジケータの過剰性に繋がります。
図6. レンジトレーディング戦略のエントリー条件 #4
戦略コードは、価格レートの下に表示されます。
void OnTick() { //--- Checking orders previously opened by the EA if(!Trade.IsOpenedByMagic(Inp_MagicNum)) { //計算のためのデータの取得 if(!GetIndValue()) return; //--- Opening an order if there is a buy signal if(BuySignal()) Trade.BuyPositionOpen(Symbol(),Inp_Lot,close[0]-Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment); //--- Opening an order if there is a sell signal if(SellSignal()) Trade.SellPositionOpen(Symbol(),Inp_Lot,close[0]+Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment); } } //+------------------------------------------------------------------+ //| Buy conditions | //+------------------------------------------------------------------+ bool BuySignal() { if(pcc_low[0]>close[0] && tr_flat[0]>tr_range[0]) { tp=pcc_up[0]; return true; } else return false; } //+------------------------------------------------------------------+ //| Sell conditions | //+------------------------------------------------------------------+ bool SellSignal() { if(pcc_up[0]<close[0] && tr_flat[0]>tr_range[0]) { tp=pcc_low[0]; return true; } else return false; } //+------------------------------------------------------------------+ //| Getting the current values of indicators | //+------------------------------------------------------------------+ bool GetIndValue() { return(CopyBuffer(InpInd_Handle1,0,0,2,pcc_up)<=0 || CopyBuffer(InpInd_Handle1,2,0,2,pcc_low)<=0 || CopyBuffer(InpInd_Handle2,1,0,2,tr_flat)<=0 || CopyBuffer(InpInd_Handle2,2,0,2,tr_range)<=0 || CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0 )?false:true; } //+------------------------------------------------------------------+
戦略 #5 価格チャネルインジケータと RBVI ベースのフィルター
価格チャネルインジケーターはチャネルを構築し、その上部と下部の境界線は期間の最高値と最低値によって決定されます。 ダマシシグナルは、相場でレンジ期間の存在を決定する RBVI によって除外されます。
インジケータパラメータ | 詳細 |
---|---|
使用されるインジケータ | 価格チャネル |
使用されるインジケータ | RBVI |
時間枠 | 指定なし |
買い条件 | 価格が下のチャネルの境界線に到達し、RBVI 値が閾値を下回っている。 |
売り条件 | 価格は上のチャネルのボーダーに達し、RBVI の値がしきい値より低い。 |
決済条件 | 価格が反対のチャネルのボーダーに達する |
エントリー条件を図7に示します。 RBVI のしきい値は40です。 この値は、エキスパートアドバイザのパラメータで変更できます。
図7. レンジトレーディング戦略のエントリー条件 #5
戦略のコードです:
void OnTick() { //--- Checking orders previously opened by the EA if(!Trade.IsOpenedByMagic(Inp_MagicNum)) { //計算のためのデータの取得 if(!GetIndValue()) return; //--- Opening an order if there is a buy signal if(BuySignal()) Trade.BuyPositionOpen(Symbol(),Inp_Lot,close[0]-Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment); //--- Opening an order if there is a sell signal if(SellSignal()) Trade.SellPositionOpen(Symbol(),Inp_Lot,close[0]+Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment); } } //+------------------------------------------------------------------+ //| Buy conditions | //+------------------------------------------------------------------+ bool BuySignal() { if(pc_low[0]>close[0] && rbvi[0]<=Inp_level) { tp=pc_up[0]; return true; } else return false; } //+------------------------------------------------------------------+ //| Sell conditions | //+------------------------------------------------------------------+ bool SellSignal() { if(pc_up[0]<close[0] && rbvi[0]<=Inp_level) { tp=pc_low[0]; return true; } else return false; } //+------------------------------------------------------------------+ //| Getting the current values of indicators | //+------------------------------------------------------------------+ bool GetIndValue() { return(CopyBuffer(InpInd_Handle1,0,0,2,pc_up)<=0 || CopyBuffer(InpInd_Handle1,1,0,2,pc_low)<=0 || CopyBuffer(InpInd_Handle2,0,0,2,rbvi)<=0 || CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0 )?false:true; } //+------------------------------------------------------------------+
戦略 #6 ウィリアムズパーセントレンジインジケータと ADX ベースのフィルター
買われ過ぎ/売られ過ぎの状態を決定するウィリアムズのパーセントレンジは、エントリポイントを見つけるために使用します。 我々の目的は、レンジ期間か、価格が一定の範囲に戻ることになっているときにトレードすることなので、方向性の動きの欠如を決定するためにトレンドインジケータ ADX を使用してみましょう。
インジケータパラメータ | 詳細 |
---|---|
使用されるインジケータ | ウィリアムズ% の範囲 |
使用されるインジケータ | ADX |
時間枠 | 指定なし |
買い条件 | WPR インジケータが売られ過ぎのゾーン (価格レート-80 以下) であり、ADX 値が閾値より下。 |
売り条件 | WPR インジケータが買われ過ぎゾーン (-20) にあり、ADX 値が閾値より下。 |
決済条件 | テイクプロフィット/ストップロス |
図8でわかるように、ADX によるデフォルトのレンジエリアは30に設定されています。 この値は、エキスパートアドバイザコードでカスタマイズできます。
図8. レンジトレーディング戦略のエントリー条件 #6
戦略の実装は、以下の価格レートのリストで提供されています。 ここでInp_FlatLevel 変数を上記の ADX しきい値に設定します。
void OnTick() { //--- Checking orders previously opened by the EA if(!Trade.IsOpenedByMagic(Inp_MagicNum)) { //計算のためのデータの取得 if(!GetIndValue()) return; //--- Opening an order if there is a buy signal if(BuySignal()) Trade.BuyPositionOpen(Symbol(),Inp_Lot,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment); //--- Opening an order if there is a sell signal if(SellSignal()) Trade.SellPositionOpen(Symbol(),Inp_Lot,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment); } } //+------------------------------------------------------------------+ //| Buy conditions | //+------------------------------------------------------------------+ bool BuySignal() { return(wpr[0]<-80 && adx[0]<Inp_FlatLevel)?true:false; } //+------------------------------------------------------------------+ //| Sell conditions | //+------------------------------------------------------------------+ bool SellSignal() { return(wpr[0]>=-20 && adx[0]<Inp_FlatLevel)?true:false; } //+------------------------------------------------------------------+ //| Getting the current values of indicators | //+------------------------------------------------------------------+ bool GetIndValue() { return(CopyBuffer(InpInd_Handle1,0,0,2,wpr)<=0 || CopyBuffer(InpInd_Handle2,0,0,2,adx)<=0)?false:true; } //+------------------------------------------------------------------+
戦略 #7 修正ケルトナー チャネルとマジックトレンドベースのフィルタ
価格のケルトナーズチャネルから跳ね返りは、フラットゾーンを識別するマジックトレンドインジケータでチェックされます。
インジケータパラメータ | 詳細 |
---|---|
使用されるインジケータ | 修正ケルトナー チャネル |
使用されるインジケータ | マジックトレンド |
時間枠 | 指定なし |
買い条件 | 価格が下のチャネルのボーダーに達し、マジックのトレンドラインが灰色である |
売り条件 | 価格が上のチャネルのボーダーに達し、マジックのトレンドラインが灰色である |
決済条件 | 価格が反対のチャネルのボーダーに達する |
このトレーディング戦略は、図9で視覚化されています。 マジックトレンドの値は、レンジの間に変更されていません。すなわち、灰色の水平線として示されています。 したがって、価格がチャネルの境界線に達するのに加えて、レンジ状態でマジックトレンドの状態を確認する必要があります。 この確認は、現在の足と前の足を比較します。-(同じである必要があります。)
図9. レンジトレーディング戦略 #7 のエントリー条件。
このコードには、売買条件をチェックする機能があります。
void OnTick() { //--- Checking orders previously opened by the EA if(!Trade.IsOpenedByMagic(Inp_MagicNum)) { //計算のためのデータの取得 if(!GetIndValue()) return; //--- Opening an order if there is a buy signal if(BuySignal()) Trade.BuyPositionOpen(Symbol(),Inp_Lot,close[0]-Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment); //--- Opening an order if there is a sell signal if(SellSignal()) Trade.SellPositionOpen(Symbol(),Inp_Lot,close[0]+Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment); } } //+------------------------------------------------------------------+ //| Buy conditions | //+------------------------------------------------------------------+ bool BuySignal() { if(kc_low[0]>close[0] && mt[0]==mt[1]) { tp=kc_up[0]; return true; } else return false; } //+------------------------------------------------------------------+ //| Sell conditions | //+------------------------------------------------------------------+ bool SellSignal() { if(kc_up[0]<close[0] && mt[0]==mt[1]) { tp=kc_low[0]; return true; } else return false; } //+------------------------------------------------------------------+ //| Getting the current values of indicators | //+------------------------------------------------------------------+ bool GetIndValue() { return(CopyBuffer(InpInd_Handle1,0,0,2,kc_up)<=0 || CopyBuffer(InpInd_Handle1,2,0,2,kc_low)<=0 || CopyBuffer(InpInd_Handle2,0,0,2,mt)<=0 || CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0 )?false:true; } //+------------------------------------------------------------------+
戦略 #8 トリニティインパルスによる確認と ドンチャン チャネル
このケースでは、トリニティインパルスインジケータが横向きの動きの状態にある間、価格が ドンチャン チャネルの境界線から跳ね返る瞬間をキャッチします。
インジケータパラメータ | 詳細 |
---|---|
使用されるインジケータ | ドンチャン チャネル |
使用されるインジケータ | トリニティインパルス |
時間枠 | 小さい時間枠 |
買い条件 | 価格が下のチャネルの境界線に達し、トリニティインパルス値がゼロ |
売り条件 | 価格が上のチャネルのボーダーに達し、トリニティインパルスがゼロ |
決済条件 | 価格が反対のチャネルのボーダーに達する |
エントリを図10に示します。 この戦略は、上のタイムフレームで使用するのは推奨されません。トリニティインパルスフィルタが、のこぎりの動作を示しているので、レンジゾーンの表示が遅れるためです。 その幅は非常に小さく、戦略も選択的になります。 5 ~ 30 分の時間枠が最適です。
図10. レンジトレーディング戦略 #8 のエントリー条件。
上記の戦略に基づくEAの実装:
void OnTick() { //--- Checking orders previously opened by the EA if(!Trade.IsOpenedByMagic(Inp_MagicNum)) { //計算のためのデータの取得 if(!GetIndValue()) return; //--- Opening an order if there is a buy signal if(BuySignal()) Trade.BuyPositionOpen(Symbol(),Inp_Lot,close[0]-Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment); //--- Opening an order if there is a sell signal if(SellSignal()) Trade.SellPositionOpen(Symbol(),Inp_Lot,close[0]+Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment); } } //+------------------------------------------------------------------+ //| Buy conditions | //+------------------------------------------------------------------+ bool BuySignal() { if(dc_low[0]>close[0] && ti[0]==0) { tp=dc_up[0]; return true; } else return false; } //+------------------------------------------------------------------+ //| Sell conditions | //+------------------------------------------------------------------+ bool SellSignal() { if(dc_up[0]<close[0] && ti[0]==0) { tp=dc_low[0]; return true; } else return false; } //+------------------------------------------------------------------+ //| Getting the current values of indicators | //+------------------------------------------------------------------+ bool GetIndValue() { return(CopyBuffer(InpInd_Handle1,0,0,2,dc_up)<=0 || CopyBuffer(InpInd_Handle1,1,0,2,dc_low)<=0 || CopyBuffer(InpInd_Handle2,0,0,2,ti)<=0 || CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0 )?false:true; } //+------------------------------------------------------------------+
戦略 #9 ATR チャネルインジケータと CCI カラーレベルに基づくフィルタ
ATR チャネルは、移動平均からのATR偏差に基づいています。 CCI カラーレベルは、価格の動きを示すしきい値のヒストグラムとして表示されるCCIインジケータです。 このインジケータを使用して、チャネルのフラットな状態 (CCI がしきい値の間にある場合) をフィルター処理します。
インジケータパラメータ | 詳細 |
---|---|
使用されるインジケータ | ATR チャネル |
使用されるインジケータ | CCI カラーレベル |
時間枠 | 指定なし |
買い条件 | 価格が下のチャネルの境界線に到達し、CCI カラーレベルの値が閾値の間の範囲にある。 |
売り条件 | 価格が上のチャネルの境界線に到達し、CCI カラーレベルの値が閾値の間の範囲にある |
決済条件 | 価格が反対のチャネルのボーダーに達する |
図11に相場参入を示します。 場合によっては、価格がチャネルを出ることがありますが、指定された範囲の CCI ベースのフィルタは、価格がチャネルに戻り、TP 値に到達する可能性があることを示唆しています。
図11. レンジトレーディング戦略 #9 のエントリー条件。
この戦略のEAのコード:
void OnTick() { //--- Checking orders previously opened by the EA if(!Trade.IsOpenedByMagic(Inp_MagicNum)) { //計算のためのデータの取得 if(!GetIndValue()) return; //--- Opening an order if there is a buy signal if(BuySignal()) Trade.BuyPositionOpen(Symbol(),Inp_Lot,close[0]-Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment); //--- Opening an order if there is a sell signal if(SellSignal()) Trade.SellPositionOpen(Symbol(),Inp_Lot,close[0]+Inp_StopLoss*_Point,tp,Inp_MagicNum,Inp_EaComment); } } //+------------------------------------------------------------------+ //| Buy conditions | //+------------------------------------------------------------------+ bool BuySignal() { if(atr_low[0]>close[0] && cci[0]<Inp_CCI_LevelUP && cci[0]>Inp_CCI_LevelDOWN) { tp=atr_up[0]; return true; } else return false; } //+------------------------------------------------------------------+ //| Sell conditions | //+------------------------------------------------------------------+ bool SellSignal() { if(atr_up[0]<close[0] && cci[0]<Inp_CCI_LevelUP && cci[0]>Inp_CCI_LevelDOWN) { tp=atr_low[0]; return true; } else return false; } //+------------------------------------------------------------------+ //| Getting the current values of indicators | //+------------------------------------------------------------------+ bool GetIndValue() { return(CopyBuffer(InpInd_Handle1,1,0,2,atr_up)<=0 || CopyBuffer(InpInd_Handle1,2,0,2,atr_low)<=0 || CopyBuffer(InpInd_Handle2,2,0,2,cci)<=0 || CopyClose(Symbol(),PERIOD_CURRENT,0,2,close)<=0 )?false:true; } //+------------------------------------------------------------------+
戦略 #10 RSI ヒストグラムとレンジインジケータに基づいたフィルタ
ヒストグラムの RSI は、買われ過ぎ/売られ過ぎのゾーンでシグナルが生成されるので、良い可視化になります。 レンジは、偽のシグナルを除外するために使用します。
インジケータパラメータ | 詳細 |
---|---|
使用されるインジケータ | RSI_Histogram |
使用されるインジケータ | フラット |
時間枠 | 指定なし |
買い条件 | RSIが売られ過ぎのゾーン (下の価格レートのしきい値) であり、レンジがレンジゾーンにあります。 |
売り条件 | RSIが買われ過ぎゾーン (しきい値の上) にあり、レンジはレンジゾーンにある。 |
決済条件 | テイクプロフィット/ストップロス |
エントリポイントを図12に示します。 RSI のヒストグラムフォームは、買われ過ぎ/売られ過ぎのゾーンとレンジフィルタのレンジゾーンの追跡します。
図12. レンジトレーディング戦略 #10 のエントリー条件。
上記の戦略に基づいて、EAの実装は、次のコードで利用可能です。
void OnTick() { //--- Checking orders previously opened by the EA if(!Trade.IsOpenedByMagic(Inp_MagicNum)) { //計算のためのデータの取得 if(!GetIndValue()) return; //--- Opening an order if there is a buy signal if(BuySignal()) Trade.BuyPositionOpen(Symbol(),Inp_Lot,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment); //--- Opening an order if there is a sell signal if(SellSignal()) Trade.SellPositionOpen(Symbol(),Inp_Lot,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment); } } //+------------------------------------------------------------------+ //| Buy conditions | //+------------------------------------------------------------------+ bool BuySignal() { return(rsi[0]<Inp_LowLevel && fl[0]<Inp_FLowLevel)?true:false; } //+------------------------------------------------------------------+ //| Sell conditions | //+------------------------------------------------------------------+ bool SellSignal() { return(rsi[0]>Inp_HighLevel && fl[0]<Inp_FLowLevel)?true:false; } //+------------------------------------------------------------------+ //| Getting the current values of indicators | //+------------------------------------------------------------------+ bool GetIndValue() { return(CopyBuffer(InpInd_Handle1,0,0,2,rsi)<=0 || CopyBuffer(InpInd_Handle2,0,0,2,fl)<=0)?false:true; } //+------------------------------------------------------------------+
テスト
ここで、10個のレンジトレーディング戦略を定義し、コードに実装することで、一般的なテスト条件を選択してみましょう。
- テスト間隔:昨年。
- 通貨ペア: EURUSD。
- トレードモード:遅延なし (高頻度トレード戦略ではないので、遅延の影響は非常に小さくなる)。
- テスト:M1 OHLC(実際のティックの事前テストはほぼ同じ結果を示しています)。
- イニシャルデポジット: 1000 ドル。
- レバレッジ: 1:500.
- サーバー: MetaQuotes-Demo.
- クオート: 5桁
戦略 #1 テスト (MFI ベースのフィルタを使用したエンベロープインジケータ)
プリセット:
input int Inp_StopLoss=500; //SL (ポイント) //---MFI インジケータパラメータ input ENUM_APPLIED_VOLUME Inp_applied_volume=VOLUME_TICK; //MFI ボリュームタイプ input int Inp_MFI_period=10; //MFI の期間 //---エンベロープインジケータパラメータ input int Inp_ma_period=10; //エンベロープ MA 期間 input ENUM_MA_METHOD Inp_ma_method=MODE_SMA; //エンベロープスムージングタイプ input double Inp_deviation=0.1; //エンベロープからのボーダーの偏差 MA
テスト結果:
図13. レンジ戦略 #1。 テスト結果。
戦略 #2 テスト (ボリンジャーバンドと2つの移動平均)
プリセット:
input int Inp_StopLoss=450; //SL (ポイント) //---ボリンジャーバンドパラメータ input int Inp_BBPeriod=14; //BB の期間 input double Inp_deviation=2.0; //偏差 //---MA スロー価格レートパラメータ input int Inp_ma_period1=12; //MA スロー価格レート期間 input ENUM_MA_METHOD Inp_ma_method1=MODE_SMMA; //MA スロー価格レートスムージング方式 //---MA 高速パラメータ input int Inp_ma_period2=2; //MA の速い期間 input ENUM_MA_METHOD Inp_ma_method2=MODE_LWMA; //MA 高速平滑化法
テスト結果:
図14. レンジ戦略 #2。 テスト結果。
ストラテジー #3 テスト (フラクタル次元エーレルスに基づくフィルタを用いた WSO & WRO チャネル)
プリセット:
input int Inp_StopLoss=500; //SL (ポイント) //---WSO & WRO チャネルパラメータ input int Inp_WsoWroPeriod=16; //Wso ・ Wro チャネル期間 //---フラクタル次元エーレルスパラメータ input int Inp_FdiPeriod = 18; //フラクタル次元周期 input double Inp_FdiThreshold = 1.4; //フラクタル次元のしきい値 input ENUM_APPLIED_PRICE Inp_Price = PRICE_closing price rate; //適用価格
テスト結果:
図15. レンジ戦略 #3。 テスト結果。
戦略 #4 テスト (パーセンテージクロスオーバーチャネルインジケータと TrendRange ベースのフィルター)
プリセット:
input int Inp_StopLoss=500; //SL (ポイント) //--- Percentage_Crossover_Channel parameters input double Inp_Percent=26.0; //限界距離の割合 input ENUM_APPLIED_PRICE Inp_Price=PRICE_closing price rate; //適用価格 //---トレンド範囲インジケータパラメータ input uint Inp_PeriodTR = 14; //トレンド範囲の期間 input ENUM_MA_METHOD Inp_Method = MODE_EMA; //平滑化法 input double Inp_Deviation = 1.0; //偏差
テスト結果:
図16. レンジ戦略 #4。 テスト結果。
戦略 #5 テスト (価格チャネルインジケータと RBVI ベースフィルター)
プリセット:
input int Inp_StopLoss=450; //SL (ポイント) //---価格チャネルインジケータパラメータ input int Inp_ChannelPeriod=12; //期間 //---RBVI インジケータパラメータ input int Inp_RBVIPeriod=5; //RBVI 期間 input ENUM_APPLIED_VOLUME Inp_VolumeType=VOLUME_TICK; //ボリューム input double Inp_level=40; //フラットレベル
テスト結果:
図17. レンジ戦略 #5。 テスト結果。
戦略 #6 テスト (ウィリアムズパーセントレンジインジケータと ADX ベースのフィルター)
プリセット:
input int Inp_StopLoss=50; //SL (ポイント) input int Inp_TakeProfit=50; //TP (ポイント) //---WPR インジケータパラメータ input int Inp_WPRPeriod=10; //WPR 期間 //---ADX インジケータパラメータ input int Inp_ADXPeriod=14; //ADX の期間 input int Inp_FlatLevel=40; //ADX のレンジレベル
テスト結果:
図18. レンジ戦略 #6。 テスト結果。
戦略 #7 テスト (修正 ケルトナー チャネルとマジックトレンドベースのフィルタ)
プリセット:
input int Inp_SmoothCenter = 11; //中心線を滑らかにする期間の数 input int Inp_SmoothDeviation = 12; //偏差を滑らかにする期間の数 input double Inp_F = 1.0; //偏差を適用するために使用される係数 input ENUM_APPLIED_PRICE Inp_AppliedPrice = PRICE_closing price rate; //中央線適用価格: input ENUM_MA_METHOD Inp_MethodSmoothing = MODE_SMA; //中心線平滑化法 input ENUM_METHOD_VARIATION Inp_MethodVariation = METHOD_HL; //バリエーションメソッド //---マジックトレンドインジケータパラメータ input uint Inp_PeriodCCI = 60; //CCI の期間 input uint Inp_PeriodATR = 5; //ATR期間
テスト結果:
図19. レンジ戦略 #7。 テスト結果。
戦略 #8 テスト (トリニティインパルスによる確認と ドンチャン チャネル)
プリセット:
input int Inp_StopLoss=500; //SL (ポイント) //--- Donchian channel parameters input int Inp_ChannelPeriod=12; //ドンチャン 期間 //---トリニティインパルスインジケータパラメータ input int Inp_Period= 5; //インジケータ期間 input int Inp_Level= 34; //スムージングレベル input ENUM_MA_METHOD Inp_Type=MODE_LWMA; //平均タイプ input ENUM_APPLIED_PRICE Inp_Price=PRICE_WEIGHTED; //価格 input ENUM_APPLIED_VOLUME Inp_Volume=VOLUME_TICK; //ボリュームの種類
テスト結果:
図20. レンジ戦略 #8。 テスト結果。
戦略 #9 テスト (ATR チャネルインジケータと CCI カラーレベルに基づくフィルタ)
プリセット:
//--- ATR Channel parameters input ENUM_MA_METHOD Inp_MA_Method=MODE_SMA; //MA 平滑化法 input uint Inp_MA_Period=10; //MA 期間 input uint Inp_ATR_Period=12; //ATR 時代 input double Inp_Factor=1.5; //偏差の数 input ENUM_APPLIED_PRICE Inp_IPC=PRICE_low price rate; //適用価格 input int Inp_Shift=0; //足のインジケータの水平方向のシフト //---CCI カラーレベルパラメータ input int Inp_CCI_ma_period = 14; //平均期間 input double Inp_CCI_LevelUP = 90; //レベルアップ input double Inp_CCI_LevelDOWN =-90; //レベルダウン
テスト結果:
図21. レンジ戦略 #9。 テスト結果。
戦略 #10 テスト (RSI ヒストグラムとレンジインジケータに基づくフィルタ)
プリセット:
//---RSI ヒストグラムパラメータ input uint Inp_RSIPeriod=12; //インジケータ期間 input ENUM_APPLIED_PRICE Inp_RSIPrice=PRICE_closing price rate; //価格 input uint Inp_high price rateLevel=60; //買われ過ぎレベル input uint Inp_low price rateLevel=40; //売られ過ぎのレベル input int Inp_Shift=0; //足のインジケータの水平方向のシフト //---レンジインジケータパラメータ input uint Inp_Smooth=10; //スムージング期間 input ENUM_MA_METHOD Inp_ma_method=MODE_SMA; //スムージングタイプ input ENUM_APPLIED_PRICE Inp_applied_price=PRICE_closing price rate; //価格タイプ input uint Inp_HLRef=100; input int Inp_FShift=0; //足のインジケータの水平方向のシフト input uint Inp_Extrahigh price rateLevel=70; //最大トレンドレベル input uint Inp_Fhigh price rateLevel=50; //強いトレンドレベル input uint Inp_Flow price rateLevel=30; //弱いトレンドレベル
テスト結果:
図22. レンジ戦略 #10。 テスト結果。
判明したこと
分析した戦略のテスト及び最適化は下記の結果をもたらしました。
- 戦略のほとんどは、チャネル内のトレードに基づいており、シグナルフィルタリングが含まれているので、主な弱点は、短期的なチャネルブレイクアウトです。
- 小さ過ぎる、大き過ぎる時間枠のテストは、それぞれ極端な選択によって損失につながっています。
- 同じ通貨ペアと期間の最適化中に、リターンの有意な偏差は得られませんでした。 ほぼすべての戦略は、同様の結果を示した。
したがって、主な結論を導くことができます。異なるチャネル生成方法を使ってトレード及びフィルタを行っても、利点も欠点も同じようなものになる。
結論
下記は、今回使用したEAの名前と要約です。補助クラスやインジケータもあります。 添付されたアーカイブは、適切にフォルダに配置する必要があります。 これを行うには、 ターミナルフォルダのMQL5フォルダに保存するだけです。
この記事で使用されたプログラム:
# |
名前 |
種類 |
詳細 |
---|---|---|---|
1 |
Strategy_1.mq5 |
EA |
戦略 #1。 MFI ベースのフィルタを使用したエンベロープインジケータ |
2 |
Strategy_2.MQL5 |
EA |
戦略 #2。 ボリンジャーバンドと2つの移動平均 |
3 |
Strategy_3.mq5 |
EA | 戦略 #3。 フラクタル次元エーレルスに基づくフィルタを用いた WSO & WRO チャネル |
4 |
Strategy_4.mq5 |
EA |
戦略 #4 パーセンテージクロスオーバーチャネルインジケータと TrendRange ベースのフィルター |
5 |
Strategy_5.mq5 | EA | 戦略 #5 価格チャネルインジケータと RBVI ベースのフィルター |
6 |
Strategy_6.mq5 |
EA |
戦略 #6 ウィリアムズパーセントレンジインジケータと ADX ベースのフィルター |
7 | Strategy_7.mq5 |
EA |
戦略 #7 修正ケルトナー チャネルとマジックトレンドベースのフィルタ |
8 | Strategy_8.mq5 | EA | 戦略 #8 トリニティインパルスによる確認と ドンチャン チャネル |
9 | Strategy_9.mq5 | EA | 戦略 #9 ATR チャネルインジケータと CCI カラーレベルに基づくフィルタ |
10 | Strategy_10.mq5 | EA | 戦略 #10 RSI ヒストグラムとレンジインジケータに基づいたフィルタ |
11 | Trade.mqh | Library | トレード関数のクラス |
13 | wwc.mq5 | インジケータ | 戦略 #3 で使用 |
14 | fdi.mq5 | インジケータ | 戦略 #3 で使用 |
15 | pcc.mq5 | インジケータ | 戦略 #4 で使用 |
16 | trend_range.mq5 | インジケータ | 戦略 #4 で使用 |
17 | price_channel.mq5 | インジケータ | 戦略 #5 で使用 |
18 | rbvi.mq5 | インジケータ | 戦略 #5 で使用 |
19 | customizable _keltner.mq5 | インジケータ | 戦略 #7 で使用 |
20 | magic_trend.mq5 | インジケータ | 戦略 #7 で使用 |
21 | donchian_channel.mq5 | インジケータ | 戦略 #8 で使用 |
22 | trinity_impulse.mq5 | インジケータ | 戦略 #8 で使用 |
23 | atr_channel.mq5 | インジケータ | 戦略 #9 で使用 |
24 | cci_color_levels.mq5 | インジケータ | 戦略 #9 で使用 |
25 | rsi_histogram.mq5 | インジケータ | 戦略 #10 で使用 |
26 | flat.mq5 | インジケータ | 戦略 #10 で使用 |
MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/4534





- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索