イベントハンドラ ボタン機能付き

MT4プログラミング

1. EA完成テンプレ(ボタンON/OFF付き)

//+------------------------------------------------------------------+
//| Expert Advisor ボタンON/OFFテンプレ |
//+------------------------------------------------------------------+
#property strict

//--- ボタン識別子
#define BTN_ID "EA_Toggle_Button"

//--- 動作フラグ
bool isActive = true;

//+------------------------------------------------------------------+
//| 初期化関数 |
//+------------------------------------------------------------------+
int OnInit()
{
Print("EAを読み込みました");

// ボタン作成
CreateToggleButton();

return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| ティック受信時 |
//+------------------------------------------------------------------+
void OnTick()
{
if(!isActive) return; // OFF時は動作しない

// EAのロジック(例: ログ表示)
Print("EA動作中: 新しいティックを受信しました");
}

//+------------------------------------------------------------------+
//| ボタン作成 |
//+------------------------------------------------------------------+
void CreateToggleButton()
{
if(ObjectFind(0, BTN_ID) == -1)
{
ObjectCreate(0, BTN_ID, OBJ_BUTTON, 0, 0, 0);
ObjectSetInteger(0, BTN_ID, OBJPROP_XDISTANCE, 10);
ObjectSetInteger(0, BTN_ID, OBJPROP_YDISTANCE, 20);
ObjectSetInteger(0, BTN_ID, OBJPROP_XSIZE, 80);
ObjectSetInteger(0, BTN_ID, OBJPROP_YSIZE, 20);
ObjectSetInteger(0, BTN_ID, OBJPROP_CORNER, CORNER_LEFT_UPPER);
ObjectSetString(0, BTN_ID, OBJPROP_TEXT, "ON");
ObjectSetInteger(0, BTN_ID, OBJPROP_COLOR, clrWhite);
ObjectSetInteger(0, BTN_ID, OBJPROP_BGCOLOR, clrGreen);
ObjectSetInteger(0, BTN_ID, OBJPROP_FONTSIZE, 10);
}
}

//+------------------------------------------------------------------+
//| チャートイベント |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
if(id == CHARTEVENT_OBJECT_CLICK && sparam == BTN_ID)
{
isActive = !isActive;
if(isActive)
{
ObjectSetString(0, BTN_ID, OBJPROP_TEXT, "ON");
ObjectSetInteger(0, BTN_ID, OBJPROP_BGCOLOR, clrGreen);
Print("EA動作: ON");
}
else
{
ObjectSetString(0, BTN_ID, OBJPROP_TEXT, "OFF");
ObjectSetInteger(0, BTN_ID, OBJPROP_BGCOLOR, clrRed);
Print("EA動作: OFF");
}
}
}

//+------------------------------------------------------------------+
//| 終了処理 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
ObjectDelete(0, BTN_ID);
Print("EAを削除しました");
}

2. インジケーター完成テンプレ(ボタンON/OFF付き)

//+------------------------------------------------------------------+
//| インジケーター ボタンON/OFFテンプレ |
//+------------------------------------------------------------------+
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 DodgerBlue

#define BTN_ID "IND_Toggle_Button"

bool isActive = true;
double Buffer1[];

//+------------------------------------------------------------------+
//| 初期化 |
//+------------------------------------------------------------------+
int OnInit()
{
Print("インジケーターを読み込みました");

SetIndexBuffer(0, Buffer1);
SetIndexStyle(0, DRAW_LINE);
SetIndexLabel(0, "サンプルライン");

CreateToggleButton();

return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| 計算 |
//+------------------------------------------------------------------+
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[])
{
if(!isActive) return(rates_total);

for(int i = 0; i < rates_total; i++)
{
Buffer1[i] = close[i];
}
return(rates_total);
}

//+------------------------------------------------------------------+
//| ボタン作成 |
//+------------------------------------------------------------------+
void CreateToggleButton()
{
if(ObjectFind(0, BTN_ID) == -1)
{
ObjectCreate(0, BTN_ID, OBJ_BUTTON, 0, 0, 0);
ObjectSetInteger(0, BTN_ID, OBJPROP_XDISTANCE, 10);
ObjectSetInteger(0, BTN_ID, OBJPROP_YDISTANCE, 20);
ObjectSetInteger(0, BTN_ID, OBJPROP_XSIZE, 80);
ObjectSetInteger(0, BTN_ID, OBJPROP_YSIZE, 20);
ObjectSetInteger(0, BTN_ID, OBJPROP_CORNER, CORNER_LEFT_UPPER);
ObjectSetString(0, BTN_ID, OBJPROP_TEXT, "ON");
ObjectSetInteger(0, BTN_ID, OBJPROP_COLOR, clrWhite);
ObjectSetInteger(0, BTN_ID, OBJPROP_BGCOLOR, clrGreen);
ObjectSetInteger(0, BTN_ID, OBJPROP_FONTSIZE, 10);
}
}

//+------------------------------------------------------------------+
//| チャートイベント |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
if(id == CHARTEVENT_OBJECT_CLICK && sparam == BTN_ID)
{
isActive = !isActive;
if(isActive)
{
ObjectSetString(0, BTN_ID, OBJPROP_TEXT, "ON");
ObjectSetInteger(0, BTN_ID, OBJPROP_BGCOLOR, clrGreen);
Print("インジケーター動作: ON");
}
else
{
ObjectSetString(0, BTN_ID, OBJPROP_TEXT, "OFF");
ObjectSetInteger(0, BTN_ID, OBJPROP_BGCOLOR, clrRed);
Print("インジケーター動作: OFF");
}
}
}

//+------------------------------------------------------------------+
//| 終了処理 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
ObjectDelete(0, BTN_ID);
Print("インジケーターを削除しました");
}

このテンプレの特徴

  • ボタンON/OFFで機能を即切り替え可能
  • EA・インジケーターどちらにも対応
  • インジ削除時はボタンも自動削除される
  • 色や位置、サイズは ObjectSetInteger で簡単変更可能

コメント

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