English

MQL5の書き方(for MQL4デザイナー)

 

2024.11

林貴晴/AMSER Inc.

高速非同期発注

ChartSetSymbolPeriod() 関数は、EAがチャートの時間足や通貨ペアを変更するための関数です。この関数を利用することで、時間足や通貨ペアを自動的に設定でき、ユーザーの手間を省き、設定ミスを防ぐことが可能です。

本記事では、このChartSetSymbolPeriod() 関数の基本的な使い方から、実際に使用する際の注意点について詳しく解説します。

ChartSetSymbolPeriod()関数

ChartSetSymbolPeriod()関数は、EAがセットされたチャートの通貨ペアや時間足を変更するために使用されます。

ChartSetSymbolPeriod(チャートID, 通貨ペア名, 時間足);                        
                    
 

チャートID は変更対象のチャートを指定するためのパラメータです。現在EAがセットされているチャートを変更する場合は、0 を指定します。

 

通貨ペアのサフィックスへの対応

シンボル(例: USDJPY)には、サフィックスが付与される場合があります(例: USDJPY.ps01)。ChartSetSymbolPeriod() 関数には、サフィックスを含む正確な通貨ペア名を指定する必要があります。

通常、シンボルは6文字で構成されているため、7文字目以降のサフィックスを取得するには、StringSubstr() 関数を使用します。

string Suffix=StringSubstr(_Symbol,6);
string Pair="USDJPY"+Suffix;
ChartSetSymbolPeriod(0, Pair, PERIOD_M1);
                    
 

このコードでは、現在の通貨ペア名からサフィックスを抽出し、それを「USDJPY」に付加した後、ChartSetSymbolPeriod() 関数に渡しています。
この処理により、サフィックス付きの通貨ペアを正確に指定できます。

 

ChartSetSymbolPeriod()関数の発動タイミング

ChartSetSymbolPeriod()関数を実行した場合、すべての処理が完了してからチャートの変更が適応されます。
たとえば、OnInit() 内で ChartSetSymbolPeriod() を実行した場合、OnInit() 内のすべての処理が完了してからチャートの変更が適用されます。
そのため、以下のコードでは、ChartSetSymbolPeriod() の後にある Print("実行済み") が表示された後、チャートが変更されます。そして、チャート変更によって EA が再初期化され、もう一度 OnInit() が呼び出され、再び Print("実行済み") が表示されます。

int OnInit() {
    string Suffix=StringSubstr(_Symbol,6);
    string Pair="USDJPY"+Suffix;
    ChartSetSymbolPeriod(0, Pair,PERIOD_M1);
    Print("実行済み”);
    return INIT_SUCCEEDED;
}
                    
 

上記のコードの流れ

1.ChartSetSymbolPeriod() が呼び出されますが、変更はまだ適用されません。
2.Print("実行済み") が実行され、メッセージが表示されます。
3.OnInit() 内のすべての処理が完了した後にチャートが変更されます。
4.チャートの変更により EA が再初期化され、再び OnInit() が実行されます。

 

チャート変更の確認方法

チャートの変更が正しく適用されたかを確認するには、SeriesInfoInteger()関数を使用してチャートの情報を取得します。

if(!SeriesInfoInteger(Pair, PERIOD_M1, SERIES_SYNCHRONIZED))Sleep(1000);                        
                    
 

このコードは、ChartSetSymbolPeriod()関数を実行した後に、指定したチャートIDの通貨ペア(Pair)と時間足が正しく変更されたかを確認します。まだ変更されていない場合、Sleep()関数によって1000ms待機します。

 

グローバルエリアでの変数代入の注意点

グローバルエリアで変数を宣言し代入した場合、ChartSetSymbolPeriod()実行後もその値は変更されません。

string S = _Symbol;
int OnInit() {
    ChartSetSymbolPeriod(0, "USDJPY.ps01", PERIOD_M1);
    Print("S: ", S);
    return INIT_SUCCEEDED;
}
                    
 

このコードでは、変数 S には変更前の通貨ペア名が保持され、ChartSetSymbolPeriod() 実行後に新しい通貨ペア名に更新されることはありません。これは、グローバルエリアのコードが EAの初期化時に一度だけ実行されるためです。チャート変更後にグローバルエリアのコードが再実行されることはありません。グローバルエリアでは変数の宣言のみを行い、値の代入は OnInit() 内で実行することで問題を回避できます。

ChartSetSymbolPeriod() 関数は、EAがチャートの通貨ペアや時間足を変更できる便利な機能です。ただし、通貨ペア名にサフィックスが含まれる場合や、関数の発動タイミング、グローバルエリアの特性といった注意点を理解することが重要です。これらを踏まえ、ChartSetSymbolPeriod() を活用し、より使いやすいEAの開発を目指しましょう。

 

執筆者紹介
林貴晴

林 貴晴(AMSER株式会社代表取締役)

内資系薬品会社で約10年勤務の後、
外資系製薬会社(現IQVIA及びGSK)で合計約10年を勤務
その後EA AMSERを開発し、その成績を評価され、株式会社ゴゴジャンの部長として抜擢。
現在はAMSER株式会社代表取締役。