EasyLanguageのプログラムはローソク足ごとに処理が実行されます。
この動きは慣れてしまえば簡単ですが、はじめのうちは少し戸惑う事があると思います。
基礎講座②ではPrint文を使ってEasyLanguageのプログラムの動きについて詳しく説明します。
もくじ
今回作成するEasyLanguageプログラム
<コード>
1 2 | Plot1[0](Close[0], "終値"); Print(Close[0]); |
今回はこのインジケーターを使ってEasyLanguageプログラムの動きについて説明をします。
今回の内容はEasyLanguageプログラミングを理解するうえで最も重要なことの一つです。
少しややこしい部分もありますが、出来るだけわかりやすく説明しますので
しっかり理解するようにしてください。
ここさえ理解出来てしまえば、今後のEasyLanguage学習をスムーズに進めることが出来ると思います。
今回のコードは「EasyLanguage印刷ログ」へ値を出力するので
以下の操作で印刷ログを表示してください。
TradeStationのメニューバーから「①表示」→「②EasyLanguage印刷ログ」にチェックを入れます。
印刷ログ(赤枠)が表示されればOKです。
今回学習する内容
- 予約語Printについて
- 添字(そえじ)について
- EasyLanguageプログラムの動きについて
EasyLanguageプログラムの動きの解説の前に、まずはコード中で使用している
「Print」と「添字」について簡単に解説をします。
解説
予約語:Print
パラメーターで指定した値を出力することが出来ます。
出力先はデフォルトでは「印刷ログ」となります。
Printの使い方は以下のようになります。
Print(①出力先, ②~出力する値);
①出力先(省略可)
値の出力先を指定します。
出力先には「ファイル(CSVファイル等)」や「プリンタ」を指定することが出来ます。
出力先を指定せず省略した場合は、デフォルトの「印刷ログ」に出力されます。
②~出力する値
パラメーターとして指定した値を出力します。
②,③,④…とカンマ区切りで複数の値をつなげて出力することも出来ます。
<使用例1>
1 | Print(File("C:\BPDATA\Data.csv"), Close); |
※CSVファイル[C:\BPDATA\Data.csv]に終値が出力されます。
<使用例2>
1 | Print(Open, "-" , High, "-" , Low, "-" , Close); |
※印刷ログに4本値(始値-高値-安値-終値)を出力します。
添字(そえじ)
添字とは、配列の要素を指し示すための通し番号のことで、
具体的には、Plot1[0]やClose[0]の[0]の部分のことを言います。
配列の詳細についての説明は割愛しますが、連続したデータを扱うための仕組みで
ほとんど全てのプログラム言語で実装されている仕組みです。
EasyLanguageではこの配列という仕組みを使って過去のデータの履歴を管理しています。
0が一番新しいデータになり、0の部分を増やしていくことで過去のデータを参照できます。
例えばClose[1]とすることで、1つ前のローソク足の終値を参照することが出来ます。
なお、添字が0の場合は省略することが出来ます。
(CloseとClose[0]は同じ値になります)
EasyLanguageプログラムの動きについて
インジケーターの処理の流れ
インジケーターをチャートに適用した際、まずはチャートに読み込まれているローソク足の
数だけインジケーターの処理が実行され、その後、ティック(歩み値)が発生したり、
新しいローソク足が作成されたりしたタイミングで都度処理が実行されます。
※他の分析テクニックやストラテジーの場合も基本的には同じ動きになります。
今回作成したインジケータで具体的な処理の流れを見てみましょう。
今回は処理の流れが見えやすいように、チャートに読み込む足の数を
10本に設定しています。
(確定済みの過去10本と未確定の1本で計11本のローソク足が表示されます)
この設定のチャートに今回作成したインジケーターを適用すると以下のようになります。
<印刷ログに出力された内容>
1 2 3 4 5 6 7 8 9 10 | 108.07 108.15 108.46 108.39 108.20 108.45 108.52 108.50 108.39 108.21 |
チャート上には一番最初のローソク足を除く、計10本の足にラインが引かれ
印刷ログには計10行のデータが出力されました。
この処理が先ほど記載した「まずはチャートに読み込まれているローソク足の
数だけインジケーターの処理が実行される」という部分です。
もう少し詳細に処理の流れを見ていきましょう。
<印刷ログの内容>
1 | 108.07 |
インジケーターの1回目の処理が実行された状態です。
処理は古いローソク足から順に実行されていきますが、一番最初の足は無視されるので、
今回のインジケーターでは1回目の処理は左から2本目の足で実施されます。
1回目の処理が行われた状態では、2本目のローソク足が一番新しいデータ(=添字が[0])になるので、
Close[0]は2本目のローソク足の終値の108.07になり、
Plot1[0]によって値がプロットされる位置は、2本目のローソク足の位置になります。
<印刷ログの内容>
1 2 3 4 5 | 108.07 108.15 108.46 108.39 108.20 |
少し処理を進めて、5回目の処理が実行された状態です。
5回目の処理が実施された状態では左から6本目のローソク足が一番新しいデータになるので、
Close[0]は6本目のローソク足の終値の108.20になり、
Plot1[0]によって値がプロットされる位置は、6本目のローソク足の位置になります。
ちなみにこの5回目の処理が実施された状態でClose[1]の値を参照すると
左から5本目の足の終値(108.39)となります。
<印刷ログの内容>
1 2 3 4 5 6 7 8 9 10 | 108.07 108.15 108.46 108.39 108.20 108.45 108.52 108.50 108.39 108.21 |
最後のローソク足まで処理が実行された状態です。
チャートにインジケータが適用されると、まずはこの状態になります。
市場が動いていないときはここで処理が終了となりますが、
市場が動いているときには「その後、ティック(歩み値)が発生したり、
新しいローソク足が作成されたりしたタイミングで都度処理が実行される」
の部分が実行されます。
<印刷ログの内容>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 108.07 108.15 108.46 108.39 108.20 108.45 108.52 108.50 108.39 108.21 108.20 108.19 108.20 108.19 |
※11行目以降がティックの発生で出力された値
インジケーターを適用してから少し時間がたった状態です。
ティックが発生するたびに印刷ログにClose[0]の値が出力されます。
Plot1[0]がプロットされる位置は最後のローソク足の位置なので、
新しい足が出来るまではティックが発生するたびにPlot1[0]の値が上書き更新されます。
なので、相場が動いている状態でこのインジケーターを表示すると
終値(=Close[0])の値の変化に合わせて最後のラインの位置が上下するような動作をします。
過去のデータの参照とMaxbarsback
移動平均線に代表されるようなほとんどのインジケーターは過去のデータを参照します。
過去のデータはClose[3]のように添字の数値を変更することで参照することが出来ます。
ここでは、過去のデータを参照した場合のインジケーターの動きについて説明します。
まずは、コードを以下のように書き換えます。
<コード>
1 2 | Plot1[0](Close[3], "終値"); Print(Close[3]); |
<印刷ログの内容>
1 2 3 4 5 6 7 8 | 108.29 108.07 108.15 108.46 108.39 108.20 108.45 108.52 |
ラインが描かれ始める位置(=1回目の処理が実行された位置)が後ろに移動しました。
なぜこのようになるのかを確認してみましょう。
Close[3]は処理を実行しているローソク足から左に3本分移動した位置のローソク足の終値です。
一番最初のローソク足は無視されるので、Close[3]のデータを最初に参照できるのは
1回目の処理が実行された位置になるのがわかると思います。
このようにインジケーターが過去の情報を参照する場合は、過去のデータを参照できる位置から
処理を始める仕組みになっています。
そして、インジケーターが過去何本分のデータを参照するかは予約語の「Maxbarsback」の値を参照することで
確認ができます。
以下のようにコードを変更してMaxbarsbackの値を印刷ログに出力してみます。
<コード>
1 2 | Plot1[0](Close[3], "終値"); Print(Maxbarsback); |
<印刷ログの内容>
1 2 3 4 5 6 7 8 | 1.00 4.00 4.00 4.00 4.00 4.00 4.00 4.00 |
Maxbarsbackは4に設定され、Maxbarsbackの本数分経過した足から処理が
実行されていることがわかると思います。
最初に1が出力されていますが、Maxbarsbackを自動検出する設定になっている場合は
一度最小値の1で一度処理を実行した後、適切な値が設定されるようです。
ちなみにMaxbarsbackの値は、デフォルトでは自動検出になっていますが、
以下のインジケーターの設定から手動で設定することも出来ます。
まとめ
今回のポイントは以下の通りです。
EasyLanguageプログラムでは
- チャートに読み込まれているローソク足の数だけインジケーターの処理が実行される
- 全てのローソク足の処理が実行された後は、ティック(歩み値)が発生したり、
新しいローソク足が作成されたりしたタイミングで都度処理が実行される - 過去のデータを参照する場合は、そのデータを参照可能な位置から処理が始まる
今回は以上です。