固定プライスアクションストップロスまたは固定RSI(スマートストップロス)
はじめに
私をこの研究に導いたのは、取引における聖杯の探求です。ストップロスは、取引の資金管理において最も重要なツールです。資金管理は、トレーダーが市場で収益を得て、長期的に一貫性を保つことができるさまざまな方法の1つです。先に述べたように、資金管理はストップロスとリスクと報酬の比率に強く関連しています。リスク:報酬の比率が1:1.5Rでの勝率は、他の比率と比較して高い傾向がありますが、1:>1.9Rではほとんどの場合、より収益性が高く、トレーダーは長期間にわたって一貫した利益を上げる傾向があります(聖杯)。この「聖杯」取引ストラテジーには欠点があります。理想的な状況では、1:>1.9Rの取引では、10回の取引(各1ピップ)のうち、6回の取引(6ピップ)には損失が伴い、4回の取引(8ピップ)では利益があります。つまり、2ピップの利益があります。実際の応用では、これがすべて当てはまるとは限りません。これに寄与する1つの主要な要因は、「ストップロスハント」という用語で知られています。ストップロスハントとは、取引が流動性のストップロスに達した後に予測した方向に移動することです。ストップロスハントは、取引と資金管理の主要な問題で、トレーダー(主に初心者トレーダー)に心理的な影響を及ぼします。
図1.1. ストップロスハント
ストップロスハントは、主にプライスアクションまたはローソク足チャートの固定またはトレーリングのストップロスに関連付けられています。プライスアクションチャートにストップロスがなければ、ストップロスハントはありません。ただし、0のストップロスは取引口座を爆破する確率(これは1に等しいです)に等しいです。
RSIストップロス
RSIオシレーターは、100から0の制限ウィンドウにプロットされたプライスアクション折れ線グラフのレプリカです。
図1.2 RSIと折れ線グラフ
RSIと折れ線グラフが非常に似ている場合は、RSIをスマートストップロスとして使用すると、ストップロスハントのリスクが軽減される可能性があります。
狙い
ここでの私の狙いは、RSIストップロスの使用でストップロスハントを減らすことができるかどうか、とりわけ長期的に利益をもたらすことができるかどうかを検証することです。
目的
2つの同じストラテジーが比較されます。1つではプライスアクションチャートにストップロスが設定されており、もう1つではRSI指標にストップロスが設定されています。
ストラテジーとコード
従来のSL - プライスアクションチャート
プライスアクションでの固定SL - 最初のEAの場合。以下はストラテジーの要件です。
パラメータ | 説明 |
---|---|
使用される指標 | MACD(12,26,9) |
使用される指標 | 移動平均(200) |
使用される指標 | 移動平均(50) |
使用される指標 | ATR(5) |
時間枠 | 1分 |
買いエントリ | 移動平均(50)が移動平均(200)を上回り、MACDラインとシグナルラインの両方がゼロ未満のときにMACDラインがシグナルラインよりも大きい場合 |
売リエントリ | 移動平均(50)が移動平均(200)を下回り、MACDラインとシグナルラインの両方がゼロを上回っているときにMACDラインがシグナルラインよりも小さい場合 |
エグジット | TPとSL(1:2R) 買い条件のSLは、エントリ後の20本のローソク足の最低値からATR(5)値を減算したもの 売り条件のSLは、エントリ後の20本のローソク足の最高値にATR(5)の値を加算したもの
|
グラフ表示を以下に示します。
図2.1 買いエントリ
図2.2 売りエントリ
コード
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
#include<Trade\Trade.mqh>
CTrade trade;
int MATrend;
int MADirection;
int MACD;
int ATR;
input int afi;// ----------RiskAmount------------
input double risk = 0.02; //% Amount to risk
input int atrValue = 20; // ATR VAlue
input int ai;// ----------Moving Average inputs------------
input int movAvgTrend = 200;// Moving Average Trend
input int movAvgDirection = 50;//moving Average for trend Direction;
input int i;// -----------MACD inputs-----------------------
input int fast = 12;// Macd Fast
input int slow = 26; //Macd Slow
input int signal = 9; //Signal Line
他の変数も宣言されました。
double pipValue = 0.0;// double Balance; // For the Current Balance
変数は、init()関数の各ハンドラに割り当てられました。
int OnInit() { //--- //Moving Averages Indicators'' MATrend = iMA(_Symbol,_Period,movAvgTrend,0,MODE_SMA,PRICE_CLOSE); //Moving Average 200 MADirection = iMA(_Symbol,_Period,movAvgDirection,0,MODE_EMA,PRICE_CLOSE); //Moving Average 50 //MACD MACD = iMACD(_Symbol,_Period,fast,slow,signal,PRICE_CLOSE);//MACD //ATR ATR = iATR(_Symbol,_Period,atrValue); //--- point=_Point; double Digits=_Digits; if((_Digits==3) || (_Digits==5)) { point*=10; } return(INIT_SUCCEEDED); }
ストラテジーの実行方法に関するコードを以下に示します。
void Strategy() { MqlRates priceAction[]; ArraySetAsSeries(priceAction,true); int priceData = CopyRates(_Symbol,_Period,0,200,priceAction); double maTrend[]; ArraySetAsSeries(maTrend,true); CopyBuffer(MATrend,0,0,200,maTrend); //200 MA double madirection[]; ArraySetAsSeries(madirection,true); CopyBuffer(MADirection,0,0,200,madirection); //50 MA double macd[]; ArraySetAsSeries(macd,true); CopyBuffer(MACD,0,0,200,macd); //MACD double macds[]; ArraySetAsSeries(macds,true); CopyBuffer(MACD,1,0,200,macds); //MACD_Signal Line double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); if (madirection[1]>maTrend[1]) { //Buy ; Uptrend bool macd_bZero = macds[1]<0&&macd[1]<0; //MacD Signal Line is less than Zero bool macd_cross = macd[1]>macds[1];// Macd Crosses the signal line if (macd_bZero && macd_cross) { buyTrade = true; } } else if (madirection[1]<maTrend[1]) { //Sell; DownTrend bool macd_bZero = macds[1]>0&&macd[1]>0;; //MacD Signal Line is less than Zero bool macd_cross = macd[1]<macds[1];// Macd Crosses the signal line if (macd_bZero && macd_cross) { sellTrade = true; } } if (buyTrade && sellTrade) { buyTrade = false; sellTrade = false; return; } if (buyTrade) { buyTrade = false; sellTrade = false; Buy(Ask); } else if (sellTrade) { buyTrade = false; sellTrade = false; Sell(Bid); } }
エントリ(売買)
void Buy(double Ask) { double atr[]; ArraySetAsSeries(atr,true); //This array is use to store all ATR value to the last closed bar CopyBuffer(ATR,0,0,200,atr); // This method copy the buffer value of the ATR indicator into the array (200 buffered data) theLotsize = NormalizeDouble((Balance*risk)/((MathAbs(Ask-((stoplossforBuy(20)-atr[1])))*100)*pipValue),2); // This Calculate the lotsize using the % to risk trade.Buy(theLotsize,_Symbol,Ask,(stoplossforBuy(20)-atr[1]),Ask+(2*MathAbs(Ask-((stoplossforBuy(20)-atr[1])))),NULL); //Buy Entry with zero stoploss && take profit is twice the distance between the entry and the lowest candle } void Sell(double Bid) { double atr[]; ArraySetAsSeries(atr,true); //This array is use to store all ATR value to the last closed bar CopyBuffer(ATR,0,0,200,atr); // This method copy the buffer value of the ATR indicator into the array (200 buffered data) theLotsize = NormalizeDouble((Balance*risk)/((MathAbs(Bid-((stoplossforSell(20)+atr[1])))*100)*pipValue),2); // This Calculate the lotsize using the % to risk trade.Sell(theLotsize,_Symbol,Bid,(stoplossforSell(20)+atr[1]),Bid-(2*MathAbs(((stoplossforSell(20)+atr[1]))-Bid)),NULL); //Sell Entry with zero stoploss && take profit is twice the distance between the entry and the highest candle }
上記のコードから、stoplossforSell(int num)とstoplossforBuy(int num)の2つのメソッドを呼び出しました。これらの2つのメソッドは、取引エントリがトリガーされた後、割り当てられた番号の最高と最低のローソク足をそれぞれ識別するために特別に意図されています。たとえば、stoplossforSell(20)は、エントリ前の20本のローソク足の中で最も高いローソク足を返します。
double stoplossforBuy(int numcandle) { int LowestCandle; //Create array for candle lows double low[]; //Sort Candle from current downward ArraySetAsSeries(low,true); //Copy all lows for 100 candle CopyLow(_Symbol,_Period,0,numcandle,low); //Calculate the lowest candle LowestCandle = ArrayMinimum(low,0,numcandle); //Create array of price MqlRates PriceInfo[]; ArraySetAsSeries(PriceInfo,true); //Copy price data to array int Data = CopyRates(Symbol(),Period(),0,Bars(Symbol(),Period()),PriceInfo); return PriceInfo[LowestCandle].low; } double stoplossforSell(int numcandle) { int HighestCandle; double High[]; //Sort array downward from current candle ArraySetAsSeries(High,true); //Fill array with data for 100 candle CopyHigh(_Symbol,_Period,0,numcandle,High); //calculate highest candle HighestCandle = ArrayMaximum(High,0,numcandle); //Create array for price MqlRates PriceInformation[]; ArraySetAsSeries(PriceInformation,true); //Copy price data to array int Data = CopyRates(Symbol(),Period(),0,Bars(Symbol(),Period()),PriceInformation); return PriceInformation[HighestCandle].high; }
このEAは、既存の取引があるかどうかを確認することにより、一度に1つずつ取引に入ります。既存の取引がない場合は、ストラテジーメソッドが呼び出されます。
void OnTick() { //--- pipValue = ((((SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_VALUE))*point)/(SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_SIZE)))); Balance = AccountInfoDouble(ACCOUNT_BALANCE); if (PositionsTotal()==0) { Strategy(); } }
RSI指標でのRSI SL
RS指標での固定SL - 2番目のEAの場合。以下はストラテジーの要件です。
パラメータ | 説明 |
使用される指標 | MACD(12,26,9) |
使用される指標 | 移動平均(200) |
使用される指標 | 移動平均(50) |
使用される指標 | ATR(5) |
時間枠 | 1分 |
買いエントリ | 移動平均(50)が移動平均(200)を上回り、MACDラインとシグナルラインの両方がゼロ未満のときにMACDラインがシグナルラインよりも大きい場合 |
売リエントリ | 移動平均(50)が移動平均(200)を下回り、MACDラインとシグナルラインの両方がゼロを上回っているときにMACDラインがシグナルラインよりも小さい場合 |
エグジット | TP 買い条件のSLは、エントリ後の20のRSI値の最低値 売り条件のSLは、エントリ後の20のRSI値の最高値
RSIが最高または最低のRSIを超えると、取引は決済されます。
|
視覚化を容易にするためにRSIストップロスに線を引きます。
図2.3 SLでの買い取引(RSI)
現在のRSI値がRSIウィンドウのSLラインよりも小さい場合、取引は決済されます。
図2.4 SLでの売り取引(RSI)
現在のRSI値がRSIウィンドウのSLラインよりも大きい場合、取引は終了します。
コード
コードの最初の部分では、主に変数を宣言してデータを入力します。以下に示すいくつかの追加を含む最初のインジケーターと同様です<分節0799>
int RSI; input int rsi = 5; // RSI VAlue double lowestrsiValue = 100; double highestrsiValue = 0.0;
同様に、onint()メソッドも似ていますが、以下に示すようにいくつかの追加があります。
int OnInit() { //RSI RSI = iRSI(_Symbol,_Period,rsi,PRICE_CLOSE); }
ストラテジーのコードは上記のものと同じです。ただし、RSIレベルをSLとして使用するため、買いと売りの両方のエントリにはSLはありません。以下はエントリのコードです
void Buy(double Ask) { double atr[]; ArraySetAsSeries(atr,true); //This array is use to store all ATR value to the last closed bar CopyBuffer(ATR,0,0,200,atr); // This method copy the buffer value of the ATR indicator into the array (200 buffered data) theLotsize = NormalizeDouble((Balance*risk)/((MathAbs(Ask-((stoplossforBuy(20)-atr[1])))*100)*pipValue),2); // This Calculate the lotsize using the % to risk ObjectCreate(0,"sl",OBJ_HLINE,3,0,lowestRSI(10)); // Since our stoploss is zero we assign a smart stoploss on the rsi by drawing a line on the rsi window trade.Buy(theLotsize,_Symbol,Ask,0,Ask+(2*MathAbs(Ask-((stoplossforBuy(20)-atr[1])))),NULL);//Buy Entry with zero stoploss && take profit is twice the distance between the entry and the lowest candle Print("SL",lowestRSI(10)); } void Sell(double Bid) { double atr[]; ArraySetAsSeries(atr,true); //This array is use to store all ATR value to the last closed bar CopyBuffer(ATR,0,0,200,atr); // This method copy the buffer value of the ATR indicator into the array (200 buffered data) theLotsize = NormalizeDouble((Balance*risk)/((MathAbs(Bid-((stoplossforSell(20)+atr[1])))*100)*pipValue),2); // This Calculate the lotsize using the % to risk ObjectCreate(0,"sl",OBJ_HLINE,3,0,highestRSI(10)); // Since our stoploss is zero we assign a smart stoploss on the rsi by drawing a line on the rsi window trade.Sell(theLotsize,_Symbol,Bid,0,Bid-(2*MathAbs(((stoplossforSell(20)+atr[1]))-Bid)),NULL);//Sell Entry with zero stoploss && take profit is twice the distance between the entry and the highest candle Print("SL",highestRSI(10)); }
コードの最後の部分で上記のEAとは異なるのは、RSIの最小値と最大値を取得するメソッドです。これは上記のエントリメソッドから呼び出され、データを使用してRSIの最低/高点に線を引きます。
注: ポジションがない場合、ストラテジーメソッドでは描画された線が削除されます。
double lowestRSI(int count) { double thersi[]; ArraySetAsSeries(thersi,true); CopyBuffer(RSI,0,0,200,thersi); for (int i = 0; i<count;i++) { if (thersi[i]<lowestrsiValue) { lowestrsiValue = thersi[i]; } } return lowestrsiValue; } //This method get the Highest RSI afer ENtry to set the smart Stoploss double highestRSI(int count) { double thersi[]; ArraySetAsSeries(thersi,true); CopyBuffer(RSI,0,0,200,thersi); for (int i = 0; i<count;i++) { if (thersi[i]>highestrsiValue) { highestrsiValue = thersi[i]; } } return highestrsiValue; }
####
EAが設定および準拠されたので、必要な結果について両方のEAのテストに進みましょう。
テストと結果
ストップロスハントテスト
このセクションでは、シミュレーションから得られたテストと結果を示します。実行される最初のテストでは、RSI SL EAが取引中のストップロスハントの問題を減らすことができるかどうかを判断します。CLASSIC SL EAと比較されます。
テストはM1時間枠で行われます。
RSI SL EAエントリデータ
エキスパート: | MACD_Smart_Stoploss | |||||||||||
銘柄: | Volatility 10 Index | |||||||||||
期間: | M1 (2021.07.01 - 2021.07.15) | |||||||||||
入力: | afi=0 | |||||||||||
risk=0.05 | ||||||||||||
atrValue=20 | ||||||||||||
rsi=14 | ||||||||||||
ai=0 | ||||||||||||
movAvgTrend=200 | ||||||||||||
movAvgDirection=50 | ||||||||||||
i=0 | ||||||||||||
fast=12 | ||||||||||||
slow=26 | ||||||||||||
signal=9 | ||||||||||||
証券会社: | Deriv Limited | |||||||||||
通貨: | USD | |||||||||||
初期資本: | 500.00 | |||||||||||
レバレッジ: | 1:500 |
CLASSIC SL EAエントリデータ
エキスパート: | MACD_Cross_Stoploss | |||||||||||
銘柄: | Volatility 10 Index | |||||||||||
期間: | M1 (2021.07.01 - 2021.07.15) | |||||||||||
入力: | afi=0 | |||||||||||
risk=0.05 | ||||||||||||
atrValue=5 | ||||||||||||
ai=0 | ||||||||||||
movAvgTrend=200 | ||||||||||||
movAvgDirection=50 | ||||||||||||
i=0 | ||||||||||||
fast=12 | ||||||||||||
slow=26 | ||||||||||||
signal=9 risk reward=1:2 | ||||||||||||
証券会社: | Deriv Limited | |||||||||||
通貨: | USD | |||||||||||
初期資本: | 500.00 | |||||||||||
レバレッジ: | 1:50 |
結果
両方のEAによって実行された取引のグラフィック表現が下に表示されています。それぞれから合計3つの取引サンプルが取得されました。
図3.1 RSI SL EAからのサンプル1
図3.1a CLASSIC SL EAからのサンプル1
図3.2 RSI SL EAからのサンプル2
図3.2a CLASSIC SL EAからのサンプル2
図3.3a CLASSIC SL EAからのサンプル3
上記の比較から、RSI SL EAは、プライスアクションチャートに設定された従来のSLと比較して、市場でのハントを回避するのに優れた役割を果たしたことがわかります。
収益性テスト
今こそが「これは有益か」という大きな質問をするときです。RSI SL EAはストップロスハントを回避するのに優れているので、従来のストップロス方式と比較してストップロスがほとんどトリガーされないため、収益性が高く、勝率も高くなければなりません。論理的には、これは真実であるかもしれませんが、この理論を証明するには、テストを実施する必要があります。
上記のテストの同様のデータが両方のテストに使用されます。100以上の取引の両方のEAのバックテストは、M1時間枠で実行されます。結果は以下のとおりです。
RSI SL EAの結果
結果 | ||||||||||||
履歴の質: | 100% | |||||||||||
バー: | 20160 | ティック: | 603385 | 銘柄: | 1 | |||||||
総収益: | 327.71 | 残高ドローダウン絶対値: | 288.96 | 初期投資からの資本ドローダウン: | 367.85 | |||||||
粗利: | 3 525.74 | 残高ドローダウン最大値: | 483.90 (69.63%) | 資本最大ドローダウン: | 523.24 (71.95%) | |||||||
総損失: | -3 198.03 | 残高ドローダウン相対値: | 69.63% (483.90) | 資本ドローダウン相対値: | 73.65% (369.45) | |||||||
利益率: | 1.10 | 予想損益: | 1.76 | 証拠金レベル: | 317.21% | |||||||
RF: | 0.63 | シャープレシオ: | 0.08 | Zスコア: | 1.68 (90.70%) | |||||||
AHPR: | 1.0070 (0.70%) | LR相関: | 0.51 | OnTesterの結果: | 0 | |||||||
GHPR: | 1.0027 (0.27%) | LR標準エラー: | 134.83 | |||||||||
総取引数: | 186 | 売り(勝率): | 94 (42.55%) | 買い(勝率%) : | 92 (38.04%) | |||||||
総取引数: | 372 | 勝ち取引(%): | 75 (40.32%) | 負け取引(%): | 111 (59.68%) | |||||||
最大収益: | 85.26 | 最大損失: | -264.99 | |||||||||
平均収益: | 47.01 | 平均損失: | -28.81 | |||||||||
最大連続勝ち($): | 5 (350.60) | 最大連続負け($): | 6 (-255.81) | |||||||||
最大連続収益(数): | 350.60 (5) | Maximal consecutive loss (count): | -413.34 (5) | |||||||||
平均連続勝ち: | 2 | 平均連続負け: | 2 | |||||||||
図3.4 RSI SL EAのエクイティカーブ
CLASSIC SL EAの結果
結果 | ||||||||||||
履歴の質: | 100% | |||||||||||
バー: | 20160 | ティック: | 603385 | 銘柄: | 1 | |||||||
総収益: | 3 672.06 | 残高ドローダウン絶対値: | 215.45 | 初期投資からの資本ドローダウン: | 217.30 | |||||||
粗利: | 10 635.21 | 残高ドローダウン最大値: | 829.54 (19.27%) | 資本最大ドローダウン: | 1 159.20 (25.59%) | |||||||
総損失: | -6 963.15 | 残高ドローダウン相対値: | 48.76% (270.82) | 資本ドローダウン相対値: | 51.81% (303.90) | |||||||
利益率: | 1.53 | 予想損益: | 15.97 | 証拠金レベル: | 274.21% | |||||||
RF: | 3.17 | シャープレシオ: | 0.16 | Zスコア: | -0.14 (11.13%) | |||||||
AHPR: | 1.0120 (1.20%) | LR相関: | 0.80 | OnTesterの結果: | 0 | |||||||
GHPR: | 1.0093 (0.93%) | LR標準エラー: | 545.00 | |||||||||
総取引数: | 230 | 売り(勝率): | 107 (44.86%) | 買い(勝率%) : | 123 (38.21%) | |||||||
総取引数: | 460 | 勝ち取引(%): | 95 (41.30%) | 負け取引(%): | 135 (58.70%) | |||||||
最大収益: | 392.11 | 最大損失: | -219.95 | |||||||||
平均収益: | 111.95 | 平均損失: | -51.58 | |||||||||
最大連続勝ち($): | 6 (1 134.53) | 最大連続負け($): | 9 (-211.43) | |||||||||
最大連続収益(数): | 1 134.53 (6) | Maximal consecutive loss (count): | -809.21 (4) | |||||||||
平均連続勝ち: | 2 | 平均連続負け: | 2 |
図3.5. Classic Stop loss EAのエクイティカーブ
観察事項
両方のEAは取引期間の終わりに利益を上げましたが、最初のEA(RSI SL EA)では損失がより少なく、一部は巨額の損失であることが観察されました。図3.6. エクイティカーブの損失
これらの損失は、EAの全体的な収益性と適切な資金管理に影響を与える可能性があります。一方、従来のストップロスを使用したEAでは、損失はより大きく、取引期間の終わりの収益もより大きくなりました。
結論と推奨事項
資金管理は確かに取引の聖杯です。上記の実験から、資金管理が完全に実施されたEAは、より多くの損失で最大の利益を上げました。これは取引の一貫性によるものです。ただし、RSIでストップロスを定義しても、リスクの量が変化するため、最初のEA(RSI SL)と同じ一貫性が完全に得られるわけではありません。
推奨事項
ヘッジは、最初の(RSI SL)EAの損失を減らす1つの方法です。これにより、より一貫したリスク量が得られ、長期的には利益が向上する可能性があります。ご精読ありがとうございました。
MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/9827
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索