グローバル変数に格納できる値はdouble型である点に注目
グローバル変数にチャートID(各チャートの識別番号)を格納したいシーンがありまして、そこで見事にハマったので備忘録として残します。
グローバル変数にチャートIDをそのまま格納して取得する以下のプログラムを実行してみてください。
GlobalVariableSet("CHART_ID", (double)ChartID()); long chartID_L = (long)GlobalVariableGet("CHART_ID"); double chartID_D = GlobalVariableGet("CHART_ID"); Print("ChartID() = ", ChartID(), " chartID_L = ", chartID_L, " chartID_D = ", chartID_D);
結果はこうなります。
ログはこうなります。
格納する前と後で値が一致していないことが分かるかと思います。
原因はデータ型によって表現できる有効桁数にあります。
グローバル変数に格納する際のデータ型はdouble型です。
ググった感じではdouble型の有効桁数は16桁なので、それ以上の桁数の数字を正しく表現できないということですね。
チャートIDは18桁の整数なので、正しく格納されないというわけです。
なぜグローバル変数のデータ型をstring型にしなかったのでしょうか。
string型の方がはるかに汎用性が高くて使い勝手が良いですよね。通貨ペア名とかも格納できますし。
グローバル変数に格納できる値(特に有効桁数)に制限があることは覚えておきましょう。