現在のコードはスクリプトとして書かれており、一度実行するとその場で終了する形式になっています。インジケータとして使うためには、インジケータ用の構造(OnInit
, OnDeinit
, OnCalculate
関数)を追加して、価格データが更新されるたびに自動的に平行ラインを描画し直すようにする必要があります。
以下のようにコードを書き換えて、インジケータとして利用できるようにします。インジケータとして動作することで、リアルタイムの価格に合わせて自動的にラインが更新されるようになります。
//+------------------------------------------------------------------+
//| 平行ラインインジケータ |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 0
//+------------------------------------------------------------------+
//| パラメータ |
//+------------------------------------------------------------------+
input double distance = 0.001; // 各ライン間の価格差
input int lineCount = 5; // 下方向の平行ラインの本数
//+------------------------------------------------------------------+
//| インジケータ初期化関数 |
//+------------------------------------------------------------------+
int OnInit() {
// 初回のラインを描画
DrawParallelLines();
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| インジケータ終了時の処理 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
// インジケータ終了時に全てのオブジェクトを削除
ObjectsDeleteAll(0, "MyChannel_");
}
//+------------------------------------------------------------------+
//| インジケータ計算関数 |
//+------------------------------------------------------------------+
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[]) {
// 各更新時にラインを再描画
DrawParallelLines();
return(rates_total);
}
//+------------------------------------------------------------------+
//| 平行ラインを描画する関数 |
//+------------------------------------------------------------------+
void DrawParallelLines() {
// ラインの基準となる最新の2つの価格ポイントを取得
datetime time1 = iTime(NULL, 0, 20); // 基準の開始時間
double price1 = iClose(NULL, 0, 20); // 基準の開始価格
datetime time2 = iTime(NULL, 0, 0); // 基準の終了時間
double price2 = iClose(NULL, 0, 0); // 基準の終了価格
// 中央ラインの作成
string centerLineName = "MyChannel_Center";
if (!ObjectCreate(0, centerLineName, OBJ_TREND, 0, time1, price1, time2, price2)) {
Print("中央ライン作成失敗: ", GetLastError());
return;
}
ObjectSetInteger(0, centerLineName, OBJPROP_COLOR, clrGreen);
ObjectSetInteger(0, centerLineName, OBJPROP_WIDTH, 2);
// 下方向に任意の本数の平行ラインを作成
for (int i = 1; i <= lineCount; i++) {
string lowerLineName = "MyChannel_Lower_" + IntegerToString(i);
if (!ObjectCreate(0, lowerLineName, OBJ_TREND, 0, time1, price1 - (distance * i), time2, price2 - (distance * i))) {
Print("下ライン " + IntegerToString(i) + " 作成失敗: ", GetLastError());
return;
}
ObjectSetInteger(0, lowerLineName, OBJPROP_COLOR, clrRed);
ObjectSetInteger(0, lowerLineName, OBJPROP_WIDTH, 1);
}
}
//+------------------------------------------------------------------+
コードのポイント
- OnInit関数:
- インジケータが初期化される際に、
DrawParallelLines
を呼び出して最初のラインを描画します。
- OnDeinit関数:
- インジケータが終了する際に、描画したオブジェクト(ライン)を全て削除します。
- OnCalculate関数:
- チャートデータが更新されるたびに
DrawParallelLines
が呼ばれ、ラインが再描画されます。
- DrawParallelLines関数:
- 中央ラインを基準に、設定した本数分の下方向の平行ラインを描画します。
distance
とlineCount
のパラメータにより、各ライン間の価格差とラインの本数を調整可能です。
このコードを「インジケータ」として保存し、MetaTrader 5に追加すると、チャートにインジケータとして表示され、価格の変化に合わせて平行ラインが自動的に更新されます。