MT4で一度も開いていないデータはヒストリーデータが存在しないため、次のようなコードを実行する場合に、データを取得できない場合がありますので、データの集計作業を行う場合に問題が発生します。
for(int i=0;i<SymbolsTotal(false);i++)
{
string symbol = SymbolName(i,false);
double bid = SymbolInfoDouble(symbol,SYMBOL_BID);
}
このコードは、MT4に存在する全てのデータからBID値を取得するものです。
ヒストリーデータの存在するシンボルからはBID値を取得できますが、ヒストリーデータの存在しないシンボルからはBID値を取得できません。
手動でチャートを開けばこのような問題は起こらないのですが、結構な量がありますし、COCOA-SEP25のような先物データはシンボル名称そのものが変わりますので、常に最新のヒストリーデータを手動で取得するのは現実的ではありません。
そこで次のスクリプトを用意しました。
//+------------------------------------------------------------------+
//| ChartSetSymbol.mq4 |
//| Copyright 2025, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
for(int i=0;i<SymbolsTotal(false);i++)
{
string symbol = SymbolName(i,false);
long chart_id = ChartOpen(symbol, 0);
Sleep(1000);
ChartClose(chart_id);
}
}
このスクリプトは、MT4に存在する全てのシンボルを1秒ごとに開いて閉じるスクリプトです。
スクリプトは定期的に手動で実行する必要がありますが、全てのシンボルを手動で開くよりはましだと思います。
このスクリプトをEAやインジケーターで実行できれば何の問題もないのですが、Sleep処理はスクリプトでしか機能しませんので、スクリプトにしています。
コメント