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()関数を実行した場合、すべての処理が完了してからチャートの変更が適応されます。
たとえば、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株式会社代表取締役。