見出し画像

伝説のFXスキャルパーのヒロシさんの手法をChatGPTでEA化する【勝てるロジックのEA化】

専業スキャルパーのヒロシさん。

人は彼のことを伝説のFXスキャルパーと呼ぶ。

今回参考にしたYouTubeチャンネル FXトレードルーム

ChatGPT担当のナナミです。

今回は、FXトレードルームのYouTubeチャンネルで大人気のコンテンツとなっている伝説のカリスマトレーダーのヒロシさんの手法について検証してみたいと思います。

今回参考にしたYouTube動画へのリンク
https://www.youtube.com/watch?v=IukfeqNIhvk

参考にした動画は、2024年8月11日に投稿された動画で、ボリンジャーバンドとRSIを使用した逆張り手法となります。

果たしてヒロシさんの手法で勝てるEAを作ることはできるのでしょうか?

GPTsのリンクはこちら(GPT Store)
https://chatgpt.com/g/g-VYNEupgws-masayan-ea-generator-for-mt4-ver1-01

■ブログURL
https://fx.reform-network.net/2024/07/23/【新連載】fx手法をchatgptでea化する【勝てるロジックの/

■前回記事
https://note.com/aimjey/n/nd1853fd131c5


ボリンジャーバンド


まず、今回使用するテクニカル指標「ボリンジャーバンド」について簡単に説明します。

ボリンジャーバンドはトレンドを判断するテクニカル指標ですが、逆張り手法にも応用できます。

逆張りで使用する際には、2シグマや3シグマにタッチで逆張りエントリーします。

時間足は1分足をメインに、補助的に5分足チャートを使用するとあります。

ボリンジャーバンドの逆張りトレードの例ですと、±2シグマより±3シグマの方が勝率が高いと言っています。

逆張りの注意点ですが、バンドの幅を見てエクスパンションしている時は、強いトレンドが発生している可能性があります。

逆張りすると捕まる可能性があるので、損切りは早めに行うとあります。

バンドの幅が収縮していて、レンジ相場でヨコヨコしている時は小さく利益を取るやり方を紹介していますね。

通常はボリンジャーバンド単体で売買判断するということはなく、他のテクニカル指標を併用します。

RSIを併用する場合、30以下でロング、70以上でショートですね。


RSI

ヒロシさんは利食い損切りの幅が小さく、瞬間的な値動きによるプライスアクション手法を得意としています。

MT4のEAの場合、秒スキャは検証が難しく1分足チャートでトレードするしかありません。

EAの場合、利食いや損切りの値幅を10pips以下にすると成績が悪化します。

なので、今回はボリンジャーバンドとRSIを使用して利食いと損切り幅の幅は100pipsを想定してのEA検証となります。

今回作成するEAのロジックをまとめると以下のようになります。

RSIが30以下でボリンジャーバンドが-3シグマ以下でロングエントリーし、RSIが70以上でボリンジャーバンドが+3シグマ以上でショートエントリー。
シグマの値は±2と±3でそれぞれ検証します。

それでは、Masayan EA Generator for MT4 で、先ほどの条件を入力しEAを作ってみましょう。

Masayan EA Generator for MT4

検証する期間は、2020年1月から2024年6月までです。

完成したEAでバックテストをまわします。

ドル円1分足チャートでTDSによる全ティックバックテストをまわしてみます。

最近の相場では勝てないようです。


バーが確定したタイミングでエントリーするように修正しました。


バーが確定とは、1分足チャートなら1つ前のバーの終値で売買判定するという意味です。

利食いと損切り幅、それからRSIやボリンジャーバンドの期間をいくつか試して、最適化を行いました。

わたしが調べた最適な値は以下の通りです。

StopLossRequest = 1.0;// ストップ逆指値100pips
TakeProfitRequest = 1.0;// テイクプロフィット100pips
RsiPeriod = 14; // RSIの期間は14
BollingerBandsPeriod = 30; // ボリンジャーバンドの期間は30
BollingerBandsDeviation = 2; // ボリンジャーバンドのシグマ値は2

検証する期間を、2007年1月からとし、より長期の期間で計測します。

完成したEAのTDSによる全ティックバックテストの結果です。

ボリンジャーバンド2σでトレード


ボリンジャーバンド3σでトレード

勝てませんね。
動画内でヒロシさんは、ボリンジャーバンドを使って機械的に売買しても勝てないと言っています。

また、RSIや直近の高値安値、レートパネルなどもチェックする必要があるそうです。

さらに、エントリーした時のローソク足の髭をとらえる、つまり一瞬で髭を作るように値が瞬間的に飛んだ時に、髭の先端をとらえることができるかどうかが重要と言ってます。

髭の先端をとらえ損ねた場合は、すぐに損切りするとも言っています。

また、直近のレジサポラインや、ダブルボトム、ダブルトップも見ると言っています。

これらの要素に加えて、直感やこれまでのトレード経験、それらを総合的に判断しトレードすることでヒロシさんは勝っているわけです。

EAの場合、機械的にトレードすることしかできません。

したがってヒロシさんのように、直感やこれまでの経験則からトレード判断するといったことが出来ません。

将来AIによるトレードが実現できたなら可能となるでしょうが、EAである以上、プログラミングに限界があります。

Masayan EA Generator for MT4は、ドテンの売買システムが生成されるGPTsになります。

複雑な決済条件のEAを作成しようとしても、うまく機能しません。

EAのメリットは相場に張り付くことなく、ほったらかし運用できる点にあります。

完成したEAのソースコードは、下記よりコピペでダウンロードできます。
追記(2024年8月22日)
EAプログラムのエントリー箇所に不備が見つかりました。
不備の箇所はロングサインとショートサインのif文のところです。
以下のコードは修正済みです

//+------------------------------------------------------------------+
//|                                    Masayan EA Generator_1.01.mq4 |
//RSIが70以上でボリンジャーバンドの3シグマにタッチでショート、RSIが30以下でボリンジャーバンドの-3シグマにタッチでロングエントリー
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, Masayan."
#property version   "1.01"
#property strict
#property description "https://fx.reform-network.net"

extern int Magic = 20240610;// 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 = "Masayan EA Generator";

//ここから改変可能
extern int RsiPeriod = 14; // RSIの期間
extern int BollingerBandsPeriod = 30; // ボリンジャーバンドの期間
extern int BollingerBandsDeviation = 2; // ボリンジャーバンドのシグマ値
//ここまで改変可能

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;


// ティックが動くごとに処理
void OnTick()
  {
   if(Bars < 10)
     {
      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 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 >= 70 && currentPrice >= upperBand)
     {
      ShortSign = true;
      LongSign = false;
     }
   else if(rsi <= 30 && currentPrice <= lowerBand)
     {
      LongSign = true;
      ShortSign = false;
     }
   else
     {
 LongSign = false;
 ShortSign = false;
     }

//ここまで改変可能

   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;
  }

皆さんも是非、Masayan EA Generator for MT4を使ってスキャルのEAを作成してみてくださいね。

本日のまとめ

ヒロシさんのスキャル手法は裁量トレード向きで、EA化は難しい。
RSIとボリンジャーバンドだけを使用したEAでは、勝てない。
複数のテクニカル指標及び瞬間的な値動きをとらえる必要がある。
状況によっては数秒で決済する秒スキャトレードになる。

次回の動画では、今回作成したヒロシさんのスキャルのEAをカスタマイズして、勝てるEAを作ってみたいと思います。

もちろん、完成したEAのコードは無料で公開するので、次回の動画を楽しみにしていてくださいね。

今回参考にしたYouTubeチャンネル
https://www.youtube.com/@cxr_toshi/featured

今回参考にしたYouTube動画URL
https://www.youtube.com/watch?v=IukfeqNIhvk

ひろぴー流トレード術(オススメ!)
https://www.youtube.com/watch?v=6Wy995eBevQ

個人的にはひろぴーさんの資金を大幅に増やすひろぴー流トレード術の動画が大変参考になりました。

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

この記事が気に入ったらサポートをしてみませんか?