前回[EasyLanguageでシステムトレード]思い通りの取引ができるようにPriceSeriesProviderを細かく知ろうで、PriceSeriesProviderの特性を深く学びました。
EasyLanguageでインジケーターやストラテジーを作るときは、自分の思い通りに動いているかを確認することが大事だということも紹介しました。
今回は、「Timer」というイベントハンドラを紹介したいと思います。
ある一定時間が過ぎたときに実行するメソッドの作り方を紹介します。こうすることで、銘柄コードを途中で変えたりということもできます。
マネックス証券のマニュアルの「例題5」にならって、「Timer」を解説します。
なお、例題5の内容は、チャートが動いている状態でしか機能しないので、Timerの使い方のみ解説となります。

目次
Timerを追加しよう

EasyLanguageを開き、新規作成からインジケーターを選びます。
ツールボックスを開くと、「Timer」というのがあります。それをダブルクリックして、「Timer」コンポーネントを追加してください。
Timerの設定をしよう

続いて、「Timer」のプロパティの設定をしましょう。
プロパティで、「Timer1」が選ばれているのを確認して、
「Interval」を1000に、「AutoReset」をTrueに、「Enable」をTrueにしてください。
Intervalの設定
「Interval」は、どれくらいの間隔でTimerを設定するかです。
後ほど、Timerメソッドを書きますが、そのメソッドを何ミリ秒に1回実行するかを設定できます。
ここで注意してもらいたいのが、単位は秒ではなくてミリ秒だということです。
AutoResetの設定
「AutoReset」は、「Interval」が過ぎたあとに、再度タイマーを開始するかどうかを設定できます。
Trueにしておくと、今回の場合は、1000ミリ秒ごとにTimerメソッドが実行されます。
もしも、「False」にしていると、最初の一回しか、Timerメソッドが実行しないことになります。
Enableの設定
「Enable」は、Trueにしておくと、チャートに表示した瞬間から「Timer」が起動します。
Falseの場合は、別の形で起動しないといけません。なので、かなり上級者向けとなります。
Timerメソッドを追加しよう

Timerの設定ができたら、メソッドを書きましょう。
プロパティから、「Timer1」が選ばれていることを確認して、「イベント」ボタンをクリックしてください。
「Elapsed」の「Value」が空欄になっているので、その空欄をダブルクリックします。
そうすると、自動でプログラムが書かれます。
メソッドの名前が、ひたすら長くなっていますが、ここは書き換えてはいけません。エラーが出てしまいます。
beginのあとに、プログラムを続けます。
マニュアル通りにプログラムを記述しましょう。
プログラムの解説
ここからは、EasyLanguageプログラムの解説をします。
以降出てくる○○行目は、空白の改行を除いた行数としています。
1行目 変数の宣言
1行目は例のごとく変数の宣言をしています。
2~8行目 Timerメソッド
先ほど挿入したTimerメソッドです。
1秒ごとに、このメソッドが実行されます。中身としては、iCounterが正なら、iCounterを1減らします。
次に、currentbarが、barnumbよりも大きければ、PlotValueメソッドを実行します。
この段階ではよくわかりませんね。とりあえず先に進みましょう。
9~12行目 PlotValueメソッド
Timerメソッド内で、条件文を満たしたときに実行されるメソッドです。
iCounter/iMaxをチャート上に書きます。この変数たちは次で出てきます。
13~14行目 Once文
Once文は、プログラムの中で一度だけ実行される文となります。
EasyLanguageの場合、足が更新される度にプログラムが実行されます。
Bartypeが1のとき、つまり足種が分足のとき、iMaxをBarintervalの60倍とします。
もしもこれをOnce文にしないと、チャートの足が更新される度に60倍されていってしまいます。
普通のプログラムでは、一度しか実行されないので、こういった考えはあまりありませんが、EasyLanguageでは、注意が必要です。
15~21行目 変数に代入
15行目で、LastBarOnChartが真なら、つまり、現在の足が最新の足である、かつ、現在の足のBarStatusが2つまり、足の終わりなら、以下の内容を実行します。
ゼロをプロットする。
iCounterにiMaxを代入する。
barnumbにcurrentbarを代入する。(currentbarは、足の番号。足にはそれぞれ1から順に番号が割り振られている)
これらのことこら、このプログラムは以下のように動くことがわかります。
チャート上の最新の足が終わるときに、iCounterをリセット(iMaxを代入)します。
そして、1秒ごとに、その最新の足の進み具合を数値化(iCounter/iMax)します。
5分足の場合、300秒経てば、次の足が登場します。つまり、その300秒間は株価は動いているけれど、足としては増えません。
その5分足の進捗率を数値化しようというのが、このインジケーターの狙いです。
つまり、60秒進んだときには、
iCounter/iMax×100=240/300×100=80と出ます。
進捗率というよりかは、カウントダウンですね。
21~22行目 Plot文
最後の2行は100と0のラインをプロットするだけです。
プログラムコード
以下にプログラムコードを載せておきますのでコピーしてお使いください。
var: intrabarpersist iCounter(0),iMax(60),barnumb(0);
method void Timer1_Elapsed( elsystem.Object sender, elsystem.TimerElapsedEventArgs args )
begin
If iCounter > 0 then
iCounter = iCounter - 1;
If currentbar > barnumb then
PlotValues();
end;
Method void PlotValues()
begin
plot1((iCounter/iMax)*100, "PctLeft");
end;
Once If Bartype = 1 then
iMax=Barinterval*60;
if LastBarOnChart then begin
if BarStatus( 1 ) = 2 then begin
plot1(0, "PctLeft");
iCounter=iMax;
barnumb=currentbar;
end;
end;
plot2(100, "100");
plot3(0, "zero");
さいごに
今回は、Timerによるイベントハンドラを設定し、Timerの条件を満たすごとに実行されるメソッドを書く方法を紹介しました。
EasyLanguage特有の、埋め込み関数が多数あったため、理解するのに時間がかかったかもしれませんが、なんとなくわかっていただけたのではないでしょうか。
このTimerによる方法を応用すれば、一定時間ごとに対象の銘柄を変えたりすることもできます。
これで、システムトレードの幅がさらに広がったかと思います。
次回は、オブジェクト指向による売買注文の出し方を紹介したいと思います。
