ボリンジャーバンドとRSIに、フィボナッチリトレースメントのロジックを追加してスキャルピング系のインジケーターを作成してみた。
ChatGPT担当のナナミです。
今回は、番外編として「Fibonacci Trend Indicator」というサインインジケーターの紹介動画を撮っていきたいと思います。
Fibonacci Trend Indicatorは、ボリンジャーバンドとRSIを使用したスキャルの手法に、フィボナッチリトレースメントの手法を融合させたドル円1分足チャートで動作するサインインジケーターになります。
「Fibonacci Trend Indicator」購入ページ
https://www.gogojungle.co.jp/tools/indicators/54005
1日10回程度の頻度で売買サインが点灯します。
決済はRSIの50にタッチで決済する為、ポジションの保有時間は数分から数時間と短めに設定しています。
いわゆるスキャルピング系のサインインジケーターとなります。
このページをご覧の皆様には、特別にEA版を無料プレゼントいたします。
記事の後半に、EAのソースコードを載せておきますので、ご利用いただければと思います。
GPTsのリンクはこちら(GPT Store)
https://chatgpt.com/g/g-VYNEupgws-masayan-ea-generator-for-mt4-ver1-01
■ブログURL
https://fx.reform-network.net/2024/08/29/新シリーズ「あなたの考えたfx手法をeaにする」/
■前回記事
https://note.com/aimjey/n/n60868f33ddb3
本日ご紹介するインジケーターの仕様は、以下の通りです。
ドル円1分足チャートに対応します。
スキャル系のインジケーターとなる為、スプレッドは可能な限り狭いFX会社を使用してください。
サインの出る回数は1日あたり平均で10回程度です。
値動きの小さい時間帯はサイン出現率が下がります。
値動きの激しい時間帯にサインが多く出現します。
トレードの様子
価格が下落しボリンジャーバンドの-2シグマとRSIが30以下になると、ロングのサインが点灯します。フィボナッチリトレースメントが上昇トレンドと判定している時のみサインが点灯。
価格が上昇しボリンジャーバンドの2シグマとRSIが70以上になると、ショートのサインが点灯します。
フィボナッチリトレースメントが下降トレンドと判定している時のみサインが点灯。
インジケーター導入方法
インジケーターをセットした直後は、売買サインが出ていないので、通常は黄色いニュートラルのサインと、RSIが50にクロスした時の×印が表示されます。
チャート上で矢印サインが出ると同時に、アラートが約6秒間鳴ります。
最初の決済のタイミング(RSIが50にタッチした時)の時もアラートが鳴ります。
RSIが50を行ったり来たりしている時は、チャート上に×印は表示されますが、アラートは鳴りません。
大まかなトレンドは、フィボナッチリトレースメントで判断しています。
トレンド方向と逆方向にはサインは出ません。
エントリーサインはボリンジャーバンドの±2シグマとRSIで判定しています。
決済のタイミングは足が確定した瞬間に、RSIが50にタッチしたタイミングとなります。
RSIが50にタッチすると、アラートとチャート上の×印でお知らせしますが、決済を遅らせることで利益を伸ばすことが可能となります。
決済のサインが出たからといってポジションをすぐにクローズしなくても良いです。
また、エントリーのサインが連続で出る場合があります。
売買サインに従ってエントリーし続けた場合、ナンピントレードに発展することがあります。
このインジケーターは短期足での逆張りトレードとなることから、ナンピン余力は残すようにロット配分に気を付けてトレードを行ってください。
このインジケーターは低スプレッド業者を対象とします。
スプレッド0.5pipならこのように、収支はプラスになります。
しかしながら、スプレッドが1.0だと長期のバックテスト結果では勝てません。
また、5分足チャートでも優位性は確認できますが、1分足チャート以外では正しくサインが出ない設計となっておりますので、本インジケーターをご利用になる際は、必ずドル円1分足チャートでのご利用をお願いします。
5分足チャートでも優位性はあるが、トレード回数が減ります。
スプレッド0.3pips程度のFX会社でトレードすることで、利益を最大化させることが可能となりますので、スプレッドには十分注意してトレードを行ってください。
国内FX会社の中で、スプレッド0.3pips程度のFX会社を想定してのバックテストはこのような結果になります。
なお、同じロジックを採用したEA「Fibonacci Retracement USDJPY M1 改」というのをREAL TRADEで公開しております。
EAのソースコード
//+------------------------------------------------------------------+
//| Fibonacci Retracement USDJPY M1 Ver2.mq4 |
//|フィボナッチリトレースメントのEAからスパイクのロジックを除去 RSIの50にタッチで決済 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, Masayan."
#property version "1.02"
#property strict
#property description "https://fx.reform-network.net"
extern int Magic = 20240904;// Magic number
extern double Lots = 0.1;//1.0=100000 0.1=10000 0.01=1000
extern double StopLossRequest = 1.0;// StopLoss 0.1=10pips 0.5=50pips 1=100pips
extern double TakeProfitRequest = 1.0;// TakeProfit 0.1=10pips 0.5=50pips 1=100pips
extern int MaxSpread = 50;// Max spread (50=5pips)
extern int MaxError = 100;// Continuous order count limit (Max=100)
extern string CommentPositions = "Fibonacci Ver2";
//ここから改変可能
extern int RsiPeriod = 14; // RSIの期間
extern int BollingerBandsPeriod = 30; // ボリンジャーバンドの期間
extern int BollingerBandsDeviation = 2; // ボリンジャーバンドのシグマ値
extern int FibonacciLookBack = 500; // フィボナッチリトレースメント計算のための過去の期間500か1000
extern double FibonacciLevel = 0.5; // フィボナッチリトレースメントのレベル (例: 0.5 = 50%)
//ここまで改変可能
string tmpstr;
string error_msg;
string spread_msg;
string position_msg;
bool LongSign = false;
bool ShortSign = false;
double Pips = 0.01;
int e = 0;
int Adjusted_Slippage = 0;
// フィボナッチリトレースメントを計算する関数
double CalculateFibonacciLevel(double high, double low, double level)
{
return high - (high - low) * level;
}
// ティックが動くごとに処理
void OnTick()
{
if (Bars < FibonacciLookBack)
{
return;
}
if (StopLossRequest <= 0.01)
{
StopLossRequest = 0.01;
}
if (TakeProfitRequest <= 0.01)
{
TakeProfitRequest = 0.01;
}
if (MaxError >= 100)
{
MaxError = 100;
}
double Info_Spread = MarketInfo(Symbol(), MODE_SPREAD);
string value = Symbol();
string target = "JPY";
int pos = StringFind(value, target);
double Symbol_RATE = Close[1];
if (pos > 0)
{
Pips = 1.00;// ドルストレートは0.010(100pips)、クロス円は1.0(100pips)で判定
}
else if (Symbol_RATE > 10 && Symbol_RATE <= 100)
{
Pips = 0.1;
}
else if (Symbol_RATE > 100 && Symbol_RATE <= 1000)
{
Pips = 1.0;
}
else if (Symbol_RATE > 1000 && Symbol_RATE <= 10000)
{
Pips = 10.0;
}
else if (Symbol_RATE > 10000 && Symbol_RATE <= 100000)
{
Pips = 100.0;
}
else if (Symbol_RATE > 100000 && Symbol_RATE <= 1000000)
{
Pips = 1000.0;
}
else if (Symbol_RATE > 1000000 && Symbol_RATE <= 10000000)
{
Pips = 10000.0;
}
else if (Symbol_RATE > 10000000 && Symbol_RATE <= 100000000)
{
Pips = 100000.0;
}
else if (Symbol_RATE > 100000000)
{
Pips = 1000000.0;
}
// 過去の高値と安値を取得
double highestHigh = iHigh(NULL, 0, iHighest(NULL, 0, MODE_HIGH, FibonacciLookBack, 0));
double lowestLow = iLow(NULL, 0, iLowest(NULL, 0, MODE_LOW, FibonacciLookBack, 0));
// フィボナッチレベルを計算
double fibonacciLevel = CalculateFibonacciLevel(highestHigh, lowestLow, FibonacciLevel);
// RSIとボリンジャーバンドを計算
double rsi = iRSI(NULL, 0, RsiPeriod, PRICE_CLOSE, 1);
double upperBand = iBands(NULL, 0, BollingerBandsPeriod, BollingerBandsDeviation, 0, PRICE_CLOSE, MODE_UPPER, 1);
double lowerBand = iBands(NULL, 0, BollingerBandsPeriod, BollingerBandsDeviation, 0, PRICE_CLOSE, MODE_LOWER, 1);
double currentPrice = Close[0];
// ロングサインの条件
if (rsi <= 30 && currentPrice <= lowerBand && currentPrice >= fibonacciLevel)
{
LongSign = true;
ShortSign = false;
}
// ショートサインの条件
else if (rsi >= 70 && currentPrice >= upperBand && currentPrice <= fibonacciLevel)
{
ShortSign = true;
LongSign = false;
}
else
{
LongSign = false;
ShortSign = false;
}
if(CalculateCurrentOrders() == 1){// ロングポジション保有
if(rsi >= 50){//RSIが50にタッチで決済
CloseLongPosition();// ロングポジションを決済
}
} else if(CalculateCurrentOrders() == -1){// ショートポジション保有
if(rsi <= 50){//RSIが50にタッチで決済
CloseShortPosition();// ショートポジションを決済
}
}
if (MaxSpread < Info_Spread)
{
LongSign = false;
ShortSign = false;
spread_msg = "Max spread Orber\n";
}
else
{
spread_msg = "";
}
if (Hour() == 4 && Minute() == 0 && Seconds() < 6)
{
e = 0;
}
if (Hour() == 11 && Minute() == 0 && Seconds() < 6)
{
e = 0;
}
if (Hour() == 18 && Minute() == 0 && Seconds() < 6)
{
e = 0;
}
if (e > MaxError)
{
LongSign = false;
ShortSign = false;
error_msg = "Continuous order count limit\n";
}
else
{
error_msg = "";
}
if (LongSign == true)
{
position_msg = "LongSign = true\n";
}
else if (ShortSign == true)
{
position_msg = "ShortSign = true\n";
}
else if (LongSign == false && ShortSign == false)
{
position_msg = "No Sign\n";
}
// 売買指示
if (LongSign == true)
{
if (CalculateCurrentOrders() == 0)
{
// ポジション保有していない場合
CheckForOpenLong();// 新規ロングオーダー処理を行う
e++;
}
else
{
// ポジション保有している場合
CloseShortPosition();// ショートポジションがある場合のみ決済ロング処理
}
}
if (ShortSign == true)
{
if (CalculateCurrentOrders() == 0)
{
// ポジション保有していない場合
CheckForOpenShort();// 新規ショートオーダー処理を行う
e++;
}
else
{
// ポジション保有している場合
CloseLongPosition();// ロングポジションがある場合のみ決済ショート処理
}
}
tmpstr = StringConcatenate(error_msg, spread_msg, position_msg);
Comment(tmpstr);
}
// 保有中のポジションを計算
int CalculateCurrentOrders(void)
{
int buys = 0;
int sells = 0;
int icount;
for (icount = 0; icount < OrdersTotal(); icount++)
{
if (OrderSelect(icount, SELECT_BY_POS, MODE_TRADES) == false)
{
break;
}
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_BUY)
{
buys++;
}
if (OrderType() == OP_SELL)
{
sells++;
}
}
}
if (buys > 0)
{
return (buys);
}
else
{
return (-sells);
}
}
// ショートポジション⇒ロングクローズ処理
void CloseShortPosition()
{
int icount;
bool ret;
for (icount = 0; icount < OrdersTotal(); icount++)
{
if (OrderSelect(icount, SELECT_BY_POS, MODE_TRADES) == false)
{
break;
}
if (OrderMagicNumber() != Magic || OrderSymbol() != Symbol())
{
continue;
}
// ショートポジションの場合⇒ロングエントリー
if (OrderType() == OP_SELL)
{
ret = OrderClose(
OrderTicket(),
OrderLots(),
Ask,
Adjusted_Slippage,
clrBlue);
if (ret == false)
{
Print("オーダークローズエラー:エラーコード=", GetLastError());
}
break;
}
}
}
// ロングポジション⇒ショートクローズ処理
void CloseLongPosition()
{
int icount;
bool ret;
for (icount = 0; icount < OrdersTotal(); icount++)
{
if (OrderSelect(icount, SELECT_BY_POS, MODE_TRADES) == false)
{
break;
}
if (OrderMagicNumber() != Magic || OrderSymbol() != Symbol())
{
continue;
}
// ロングポジションの場合⇒ショートエントリー
if (OrderType() == OP_BUY)
{
ret = OrderClose(
OrderTicket(),
OrderLots(),
Bid,
Adjusted_Slippage,
clrRed);
if (ret == false)
{
Print("オーダークローズエラー:エラーコード=", GetLastError());
}
break;
}
}
}
// ロングオーダー処理
void CheckForOpenLong()
{
int res;
double entrylot;
entrylot = NormalizeDouble(Lots, 2);
res = OrderSend(
Symbol(),
OP_BUY,
entrylot,
Ask,
Adjusted_Slippage,
Ask - (Pips * StopLossRequest),
Ask + (Pips * TakeProfitRequest),
CommentPositions,
Magic,
0,
clrRed);
return;
}
// ショートオーダー処理
void CheckForOpenShort()
{
int res;
double entrylot;
entrylot = NormalizeDouble(Lots, 2);
res = OrderSend(
Symbol(),
OP_SELL,
entrylot,
Bid,
Adjusted_Slippage,
Bid + (Pips * StopLossRequest),
Bid - (Pips * TakeProfitRequest),
CommentPositions,
Magic,
0,
clrBlue);
return;
}
REAL TRADEのページ
https://real-trade.tech/accounts/74957?via=users_realtrade
現在の成績の確認にご利用ください。
他にも、こんな手法EAにしてほしいみたいなリクエストがあれば、コメントお願いします。
【免責事項】
・本GPTsについて、正当性を保証するものではありません。
・本GPTsを利用して損失を被った場合でも一切の責任を負いません。
・投資の決定は、自己判断 自己責任でお願いします。