水平ライン抜け、ローソク足確定でメール通知するインジケータの作成
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 ダウンロード )
コメント