見出し画像

ボリンジャーバンドと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ならこのように、収支はプラスになります。

スプレッド0.5pipsだと勝てます。

しかしながら、スプレッドが1.0だと長期のバックテスト結果では勝てません。

スプレッド1.0pipsだと負けます

また、5分足チャートでも優位性は確認できますが、1分足チャート以外では正しくサインが出ない設計となっておりますので、本インジケーターをご利用になる際は、必ずドル円1分足チャートでのご利用をお願いします。


5分足チャートでのバックテスト結果


5分足チャートでも優位性はあるが、トレード回数が減ります。

スプレッド0.3pips程度のFX会社でトレードすることで、利益を最大化させることが可能となりますので、スプレッドには十分注意してトレードを行ってください。

国内FX会社の中で、スプレッド0.3pips程度のFX会社を想定してのバックテストはこのような結果になります。

スプレッド0.3pipsでのバックテスト結果


なお、同じロジックを採用した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

現在の成績の確認にご利用ください。


「Fibonacci Trend Indicator」購入ページ

他にも、こんな手法EAにしてほしいみたいなリクエストがあれば、コメントお願いします。

【免責事項】
・本GPTsについて、正当性を保証するものではありません。
・本GPTsを利用して損失を被った場合でも一切の責任を負いません。
・投資の決定は、自己判断 自己責任でお願いします。

いいなと思ったら応援しよう!