またろうのシストレブログ

マネックス証券が提供しているトレードステーションと、MT4などシストレ関連について色々書きます。株と自動売買、EasyLanguageについても。

EasyLanguageの言語仕様 その3


Close[n]は配列ではない?

ストラテジーやインジケーターのソースを見ると、Close[1]みたいな記述を見かけるかと思います。
他の言語では、一般的に配列を示しますが
EasyLanguageに限って言えば、やや意味合いが異なります。

f:id:tsukinowaapp:20180618141317p:plain


トレステのEasyLanguageでは、変数に[n]を付けることで、n本前の計算結果を取得することができます。
OpenやCloseといった予約語だけでなく、自分で宣言した変数についても過去の計算結果を取得できます。
(こういう値のことを履歴値と言うそうです)

以前書いた平均足のコード(再掲載)

inputs: 
	Kai(0); 

vars: 
	AnswerOpen(0),
	AnswerClose(0),
	AnswerHigh(0),
	AnswerLow(0),
	PColor(White),
	BarCount(0);

AnswerHigh = High;
AnswerLow = Low;
AnswerOpen = (AnswerOpen[1] + AnswerClose[1]) / 2;

IF Kai = 1 then
	AnswerClose = (AvgPrice[3] + AvgPrice[2] + AvgPrice[1] + AvgPrice) / 4
ELSE
	AnswerClose = AvgPrice;

IF Date <> Date[1] or CurrentBar = 1 then
BEGIN
	AnswerOpen = OpenD(0);
	AnswerClose = AvgPrice;
	BarCount = 0;
END;

IF BarCount = 1 and Kai = 1 then AnswerClose = (AvgPrice[1] + AvgPrice) / 2;
IF BarCount = 2 and Kai = 1 then AnswerClose = (AvgPrice[2] + AvgPrice[1] + AvgPrice) / 3;

IF AnswerHigh < AnswerOpen then AnswerHigh = AnswerOpen;
IF AnswerHigh < AnswerClose then AnswerHigh = AnswerClose;
IF AnswerLow > AnswerOpen then AnswerLow = AnswerOpen;
IF AnswerLow > AnswerClose then AnswerLow = AnswerClose;

IF AnswerOpen < AnswerClose then
	PColor = Red
ELSE IF AnswerOpen > AnswerClose then
	PColor = Cyan
ELSE
	PColor = White;

BarCount += 1;

Plot1(AnswerHigh, !( "高値" ), PColor, Default, 1);
Plot2(AnswerLow, !( "安値" ), PColor, Default, 1);
Plot3(AnswerOpen, !( "始値" ), PColor, Default, 5);
Plot4(AnswerClose, !( "終値" ), PColor, Default, 5);

始値(AnswerOpen)を算出するには1本前の足の始値終値を合計して2で割ります。
計算式としてはAnswerOpen[1]で「1本前の足の始値」、AnswerClose[1]で「1本前の足の終値」を取得して
それを2で割るので
AnswerOpen = (AnswerOpen[1] + AnswerClose[1]) / 2;
となります。

EasyLanguageでの配列は?

では、EasyLanguageで一般的な配列は使えるのか?って話ですが
宣言にArraysを使うことで利用できます。

arrays:
	DummyArray[6](0);

上記にて0から6までの7要素の1次元配列を宣言し、初期値を0に設定します。
ここで問題なのですが、HighestArrayなどの配列に関する演算関数は
[0]に設定された値を無視する という仕様になっています。
なので、[0]は使用しないことが推奨されています。

一般的な言語(JavaScriptなど)では[0]から使用しますが、EasyLanguageでは[1]から使用すると認識したほうが良いでしょう。

履歴値も配列も同じ[n]で表現されているところが仕様的に微妙ですが、宣言を確認するしかないですね。