MQL4(MT4)逆引きリファレンス:水平ライン抜け、ローソク足確定でメール通知するインジケータ

ChatGPTで作成
スポンサーリンク

水平ライン抜け、ローソク足確定でメール通知するインジケータの作成

ChatGPT(GPTs)を活用して、水平ラインを上抜けまたは下抜けした後、ローソク足が確定したタイミングでメール通知するインジケータを作成しました。

使用GPTs:EA Creator

依頼内容と実行結果

依頼内容が少し曖昧だったので、いくつか手直ししましたが、一から作成するよりは助かります。

依頼の仕方がなかなか難しいですね。

依頼内容

以下の仕様でインジケータの作成をお願いします

外部パラメータ
・ラインネーム:水平ラインの名称を設定(ラインAとする)
・タイムフレーム:使用する足のタイムフレーム
・メールタイトル:通知メールに設定するタイトルを設定
・メール本文:通知メールに設定する本文を設定

ロジック
・インデックス1の足のクローズ値がラインAを上抜けて確定したらメールを送信する
・インデックス1の足のクローズ値がラインAを下抜けて確定したらメールを送信する

メールのタイトルと文面
・それぞれ外部パラメータで設定

ChatGPT出力結果

指定された新しい仕様に基づいてインジケータを作成します。このインジケータは、インデックス1(一つ前のバー)のクローズ値が指定した水平ライン(ラインA)を上抜けまたは下抜けした場合にメールを送信します。

//+------------------------------------------------------------------+
//|                                                      CustomIndicator.mq4 |
//|                        Copyright 2023, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"
#property version   "1.00"
#property strict
#property indicator_chart_window

// 外部パラメータ
input string LineName = "ラインA"; // 水平ラインの名称
input ENUM_TIMEFRAMES TimeFrame = PERIOD_CURRENT; // 使用する足のタイムフレーム
input string MailTitle = "ラインブレイクアラート"; // 通知メールのタイトル
input string MailBody = "ラインAがブレイクしました。"; // 通知メールの本文

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   // ラインAの存在確認
   if(!ObjectFind(0, LineName))
     {
      Print("ライン '", LineName, "' が見つかりました。");
     }
   else
     {
      Print("ライン '", LineName, "' が見つかりません。インジケータを停止します。");
      return(INIT_FAILED);
     }

   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   // 特に必要なリソースの解放はありません
  }

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
void OnTick()
  {
   double linePrice = ObjectGetDouble(0, LineName, OBJPROP_PRICE1);
   double prevClose = iClose(_Symbol, TimeFrame, 1);

   // ラインAを上抜けたかチェック
   if(prevClose > linePrice)
     {
      // 前回の足のクローズがラインより上ならメール送信
      string message = MailBody + " 上抜けしました。";
      SendMail(MailTitle, message);
     }
   // ラインAを下抜けたかチェック
   else if(prevClose < linePrice)
     {
      // 前回の足のクローズがラインより下ならメール送信
      string message = MailBody + " 下抜けしました。";
      SendMail(MailTitle, message);
     }
  }
//+------------------------------------------------------------------+

注意点

  • ラインAがチャート上に存在することを前提としています。OnInit関数でラインの存在を確認し、見つからない場合はエラーメッセージを表示してインジケータを停止します。
  • SendMail関数を使用するには、MetaTraderのオプション設定でメール送信機能が正しく設定されている必要があります。これには、SMTPサーバーのアドレス、ポート、ユーザー名、パスワードなどの情報が含まれます。
  • このインジケータは、インデックス1のバー(直前のバー)のクローズ値がラインAをブレイクしたかどうかを評価します。このため、リアルタイムのバーの変動ではなく、過去のデータに基づいた通知になります。
  • メール送信は、条件を満たした際に毎回行われます。同じ条件が続いても、複数回のメールが送信される可能性があるため、この挙動に注意してください。

手直し後のコード

手直し後のソースコードは以下です。

#property copyright "Copyright 2023, SeSe."
#property link      "https://fx-trading-gym.info/"
#property version   "1.00"
#property strict
#property indicator_chart_window

// 外部パラメータ
input string LineName = "Horizontal Line 3354"; // 水平ラインの名称
input ENUM_TIMEFRAMES TimeFrame = PERIOD_CURRENT; // 使用する足のタイムフレーム
input string MailTitle = "ラインブレイクアラート"; // 通知メールのタイトル
input string MailBody = "ラインAがブレイクしました。"; // 通知メールの本文

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   // ラインAの存在確認
   if(!ObjectFind(0, LineName))
     {
      Print("ライン '", LineName, "' が見つかりました。");
     }
   else
     {
      Print("ライン '", LineName, "' が見つかりません。インジケータを停止します。");
      return(INIT_FAILED);
     }
   
   return(INIT_SUCCEEDED);
  }
  
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   // 特に必要なリソースの解放はありません
  }
  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[])
  {
   double linePrice = ObjectGetDouble(0, LineName, OBJPROP_PRICE1);
   double prevClose = iClose(_Symbol, TimeFrame, 1);
   double prevOpen = iOpen(_Symbol, TimeFrame, 1);
   static double sent_Close = 0;
   
   // ラインAを上抜けたかチェック
   if(prevClose > linePrice && prevOpen < linePrice && sent_Close != prevClose)
     {
      // 前回の足のクローズがラインより上ならメール送信
      string message = MailBody + " 上抜けしました。";
      SendMail(MailTitle, message);
      Print(message);
      sent_Close = prevClose;
     }
   // ラインAを下抜けたかチェック
   else if(prevClose < linePrice && prevOpen > linePrice && sent_Close != prevClose)
     {
      // 前回の足のクローズがラインより下ならメール送信
      string message = MailBody + " 下抜けしました。";
      SendMail(MailTitle, message);
      Print(message);
      sent_Close = prevClose;
     }
    return 0;
  }
//+------------------------------------------------------------------+

インジケータサンプル

簡単にしか動作確認できておりませんが、サンプルとして作成したインジケータを上げておきます。

水平ライン抜け、ローソク足確定でメール通知するインジケーターサンプル (189 ダウンロード )

関連記事

スポンサーリンク
海外FXキャッシュバック口座開設ならTariTali(タリタリ)

コメント

タイトルとURLをコピーしました