トレードステーションのEasyLanguageで開発にハマったところ+便利なところメモ

この記事では、私がトレードステーションとEasyLanguageを触っていて、罠にハマってしまったことなどをまとめています。
- 1. バー形成中のプログラムの実行:IntrabarOrderGeneration
- 2. バー形成中の変数の更新:IntraBarPersist
- 3. 売買タイミングの記述について
- 4. Time について
- 5. Print()したログを消したい
- 6. Print()で少数点以下を記載しない、など
- 7. Tickが上昇しているか?を確認
- 8. 複数銘柄への売買
- 9. 決済をラベルに関連付ける
- 10. EasyLanguageで呼び値
- 11. SetBreakEven、SetProfitTarget、SetStopLoss、SetDollarTrailingなど
- 12. BarTypeとBarInterval
- 13. 自動売買が発注されない
- 14. MaxBarsBackとBarNumber
- 15. MaxBarsBack、すなわち「分析に用いる足の最大本数」を大きくすると
- 16. SetExitOnCloseが動作しない
- 17. その他
バー形成中のプログラムの実行:IntrabarOrderGeneration
MT4におけるMQLでは、通常OnTick()内に処理を記載しているので、Tick更新があるたびにOnTick()が実行されますが、EasyLanguageは違います。
初期設定では、バーの確定時にのみ一度だけ評価されます。
これを防止したい場合には、「ストラテジーの設定」→「設定」→「計算」タブ→「イントラバー注文の作成および計算を有効にする」にチェック
あるいはコード内にて下記を記述、参考
//Enable intra-bar order generation: [IntrabarOrderGeneration = True];a //When IntraBarOrderGeneration is turned on, next bar really means next tick . //For example: if (Close > Close[1]) then Buy ("EL") 1 contracts next bar at market; //Will generate a buy order that is active for the next tick only. As long as the condition remains true, the entry order is submitted for the next tick.
バー形成中の変数の更新:IntraBarPersist
上記に少し関連しますが、EasyLanguageでは変数や配列要素の値は、各バーの終了時にのみ更新されます。
バーの中でティックごとに変数を更新させるためには、変数の前に予約語IntraBarPersistをつけなければいけません。
Variable: IntrabarPersist Count(0);
売買タイミングの記述について
Buy [(“Order Name")] [Number of Shares/Contracts] [Order Action]; などで記載できる売買タイミングは以下の5種類
… this bar on close;
•Buy 矢印が現在のバーの終値ティックマークに置かれます。
•注文がチャートの最後の足ではなく、日中足に生成される場合、その注文は成行注文としてマーケットに直接送信されます。
•注文が日中足に生成され、それがチャートの最後の足である場合、または日次、週次、もしくは月次のチャートである場合、その注文は足の終了時の価格で当日中+ の指値注文として、時間外マーケットに直接送信されます。注文が時間外セッションで約定済みとならなかった場合は、指値注文として翌日の取引の開始時に発注されます。
実行メソッド this bar on close は、バックテストのみを目的として提供され、「マーケットアットクローズ」注文をバックテストできますが、TradeStationを使用して自動化することはできません。各バーの終わりにすべての注文が評価され、実行される場合、TradeStation は、足が終了すると (たとえば、1 日の取引セッションが終了したとき)、this bar on close 注文を読み取って、発行します。TradeStation 現在のバーの終値を使用して注文を約定しますが、次の足上で実行するには成行注文をかける必要があります。これは、必ずスリッページ を生じます。
何言ってるんだこいつは?実現できないバックテストなんて意味あるのか・・?という思いです笑
…next bar at open;
next bar at marketと何が違うの?
… next bar at market;
•Buy 矢印が次の足の始値ティックマークに置かれます。
•注文がチャートの最後の足ではなく、日中足に生成される場合、その注文は成行注文としてマーケットに直接送信されます。
•注文が日中足に生成され、それがチャートの最後の足である場合、または日次、週次、もしくは月次のチャートである場合、その注文は次の取引日の開始まで保留され、成行注文として送信されます。
… next bar at PRICE Stop;
•株または先物が PRICE以上の価格で取引された場合、買い矢印が次の足の最初の PRICE 以上のティック価格に置かれます。
•注文がチャートの最後のバーではなく、日中足に生成される場合、その注文は逆指値価格を超えるまでトレードマネージャーのウインドウで保留され、その後成行注文としてマーケットに直接送信されます。
•注文が日中足に生成され、それがチャートの最後の足である場合、または日次、週次、もしくは月次のチャートである場合、その注文は次の取引日の開始まで保留され、逆指値価格を超えるまでトレードマネージャーのウインドウで保留され、その後成行注文としてマーケットに直接送信されます。
… next bar at PRICE Limit;
•株または先物が PRICE以下の価格で取引された場合、買い矢印が次の足の最初のPRICE以下のティック価格に置かれます。
•注文がチャートの最後の足ではなく、日中足に生成される場合、その注文は指値注文としてマーケットに直接送信されます。
•注文が日中足に生成され、それがチャートの最後の足である場合、または日次、週次、もしくは月次のチャートである場合、その注文は次の取引日の開始まで保留され、指値注文として送信されます。
その他注意
逆指値注文は、使用するコンピュータで保留され、逆指値価格を超えるまでマーケットには反映されません。コンピュータの電源を切った場合、注文は発注も約定もされません。
Time について
Time (Reserved Word)
この予約語は、現在の足の終値の EasyLanguage 時間 (HHMMフォーマット) を表す数式を返します。
ということで、「イントラバー注文の作成および計算を有効にする」にチェックを入れていて、バー形成中にコード実行を可能にしてもTimeで返ってくるのはその終値の時刻です。例えば日足で実行していたら、このように返ってきます。
Print (Date, " ", Time," ", close); //結果 1161230.00 1501.00 1170.50 1161230.00 1501.00 1166.00 1161230.00 1501.00 1170.50 1161230.00 1501.00 1171.50 1161230.00 1501.00 1173.00 1161230.00 1501.00 1165.50 1161230.00 1501.00 1169.50 1161230.00 1501.00 1169.50 1161230.00 1501.00 1167.00 1161230.00 1501.00 1173.00 1161230.00 1501.00 1169.50 1161230.00 1501.00 1169.00 1161230.00 1501.00 1169.00 1161230.00 1501.00 1174.50 1161230.00 1501.00 1170.50 1161230.00 1501.00 1171.00 1161230.00 1501.00 1171.00 1161230.00 1501.00 1171.00 1161230.00 1501.00 1171.00 1161230.00 1501.00 1171.00
Print()したログを消したい
Once Clearprintlog();
Print()で少数点以下を記載しない、など
Print(Value1:N:M);
Value1 は数式であり、N は使用する整数の最小数であり、M は使用する小数点以下の桁数です。プリントログに送信される数式が N, によって指定された数より多い整数を含んでいた場合、Print ステートメントは必要な桁数を使用し、小数点以下の値は四捨五入されます。たとえば、Value1 が 3.14159 であり、次のようなステートメントを書いたと仮定します。
Print(Value1:0:4);
印刷ログで表示される数式は、3.1416 になります。
Tickが上昇しているか?を確認
例えば予約語Upticksは、足に直前のティックよりも値が高い 5 ティックがある場合、5 を返します。Downticksも同様。
なのでupticks-downticksで上昇したTicksが多いかを判別可能
複数銘柄への売買
チャートうえに開かれた銘柄しかeasyLanguageで売買できない・・?
むしろ、チャートで開いていなければ、他の銘柄のデータさえ読みことができない・・
オカシイ、、
MQLだったらいくらでも他銘柄売買&データ読み込み可能なのに。。。
決済をラベルに関連付ける
Buy ("MyBuy") 10 Shares Next Bar at Market; Buy 20 Shares Next Bar at High + 1 Point Stop ; Sell From Entry ("MyBuy") Next Bar at High + 3 Points Stop;
EasyLanguageで呼び値
予約語Point、MinMove、PriceScale、PointValueあたりが呼び値のことかと思いきや、どうやら呼び値ではない。
呼び値(株価の動く最小の値幅)を取得するためには、こんなコードを書くしかなさそう?
If PriceScale=10 then begin //銘柄がTOPIX100構成銘柄だと、PriceScaleが10になる
yobine = 10000;
If close < 50000000 then yobine = 10000;
If close < 30000000 then yobine = 5000;
If close < 10000000 then yobine = 1000;
If close < 3000000 then yobine = 500;
If close < 1000000 then yobine = 100;
If close < 300000 then yobine = 50;
If close < 100000 then yobine = 10;
If close < 30000 then yobine = 5;
if close < 10000 then yobine = 1;
if close < 3000 then yobine = 0.5;
if close < 1000 then yobine = 0.1;
end
Else begin
yobine = 100000;
If close < 50000000 then yobine = 50000;
If close < 30000000 then yobine = 10000;
If close < 5000000 then yobine = 5000;
If close < 3000000 then yobine = 1000;
If close < 500000 then yobine = 500;
If close < 300000 then yobine = 100;
If close < 50000 then yobine = 50;
If close < 30000 then yobine = 10;
if close < 5000 then yobine = 5;
if close < 3000 then yobine = 1;
end;
SetBreakEven、SetProfitTarget、SetStopLoss、SetDollarTrailingなど
ヘルプを見てみても金額がUSDベースになっていたり日本語が変なので非常に分かりにくい、、
SetBreakEven
ポジションが、ある時点で収益が250,000円 以上上がった場合に、全ポジションの全株式または建玉をブレークイーブンポイントで決済します。
SetBreakEven(250000)
ポジションがエントリー価格から少なくとも25円上がった場合は、全ポジションの全株式または建玉を損益分岐点で決済します。
SetStopShare;
SetBreakEven(25)
SetDollarTrailing
ロスカット額トレーリングストップをポジション全体について 50,000円 に設定するには、次のように記述します。
SetDollarTrailing(50000);
ロスカット額トレーリングストップを最大株価より5円下に設定するには、次のように記述します。
SetStopShare;
SetDollarTrailing(5);
SetPercentTrailing
よくわかりません。
ポジションが $500 になった後の最大獲得資産の 15% を生んだとき、ポジションを決済するパーセントベースのトレーリングストップを行うためには、次のように書きます。
SetStopPosition;
SetPercentTrailing(500, 15);
SetProfitTarget
SetStopPosition 予約語とともに使用した場合、Amount パラメーターは、現在の未決済ポジション内の株式またはコントラクトの総数に基づいて、ポジション全体の金額として固定ロスカットを設定します。(MSFT の 500 株を保有し、$200 の収益額を指定した場合、エントリー価格から $0.40 を約定します。)
SetStopPosition;
SetProfitTarget(200);
(SetStopPosition はデフォルト設定であり、任意です。)
SetStopShare または SetStopContract 予約語とともに使用した場合、Amount パラメーターは、収益を 1 株または 1 コントラクトの金額として設定します。(MSFT の 500 株を保有し、$0.60 の収益額を指定した場合、エントリー価格から .60 を約定して、$300 の収益を得ます。)
SetStopShare;
SetProfitTarget(.60);
(SetStopShare と SetStopContract は同義語であり、いずれも、株式、先物、オプション等に使用できます。)
SetStopLoss
SetStopPosition 予約語とともに使用した場合、Amount パラメーターは、現在の未決済ポジション内の株式またはコントラクトの総数に基づいて、ポジション全体の金額として固定ロスカットを設定します。(トヨタ自動車 の 500 株を保有していて 200,000 のロスカット額を指定した場合、エントリー価格から 400円 で決済します。)
SetStopPosition;
SetStopLoss(200000);
(SetStopPosition はデフォルト設定であり、任意です。)
SetStopShare または SetStopContract 予約語と一緒に使用すると、Amount パラメーターは、ロスカット額を、1 株または 1 枚の金額として設定します。(トヨタ自動車の500 株を保有していて 60 のロスカット値を指定した場合、エントリー価格から 60円 で決済し、30,000円 の損失となります。)
SetStopShare;
SetStopLoss(.60);
(SetStopShare と SetStopContract は同義語であり、いずれも、株式、先物、オプション等に使用できます。)
BarTypeとBarInterval
0 | ティック足 |
1 | 分足 |
2 | 日足 |
3 | 週足 |
4 | 月足 |
5 | ポイント・アンド・フィギュア |
6 | 予約済み? |
7 | 予約済み? |
8 | カギ足 |
9 | KASE |
10 | 新値足 |
11 | モメンタム |
12 | レンジ |
13 | 練行足 |
14 | 秒足 |
例えば日足チャートでのみ実行させたい時
If BarType = 2 then Sell next bar at market;
例えば5分足で実行している時(BarType = 1 )、◯分足かを取得するにはBarIntervalを用いる。
//例 Condition1 = (BarInterval = 5 AND BarType = 1) //は、分析テクニックが 5 分チャートに適用される場合、Condition1が真になるステートメントです。
自動売買が発注されない
詳細はこちら
MaxBarsBackとBarNumber
MaxBarsBack=「分析に用いる足の最大本数」のこと。
MaxBarsBack は、取引ストラテジー、分析テクニック、および関数の計算を開始するためにチャートの始めに必要な参照履歴バーの最小数です。たとえば、10 バーの移動平均を求めるには、MaxBarsBack を 9 に設定する必要があり、すなわち、9 個の履歴バーと現在のバーが計算に必要です。
BarNumber は MaxBarsBack に基づくため、チャートに 500 バーがあり、MaxBarsBack が 50 に設定された場合、左から右へ移動するチャートの 50 番目のバーの次のバーは、BarNumber = 1 になります。チャートの最後のバー (最近) は、BarNumber = 451 になります。
イメージとしては、チャートに500本バーがあった時、MaxBarsBackの本数が計算に必要なので、チャートの左側からMaxBarsBack本数のバーが削られる。
具体例
1/1〜12/31までの日足チャートがあるとして、土日も含めると365本のバーがある。20日移動平均を使うストラテジーを使っているとする。
このときMaxBarsBackを20に設定していると、1/1〜1/20までのバーは自動売買の計算から除外されて、1/21のバーから計算がスタートする。(1/21の計算の時には、1/1〜1/21のデータを使って21日移動平均が計算できる)
このときBarNumberは1/21から数え始められる。
12/31のbarNumberは365-20+1 = 346
MaxBarsBack、すなわち「分析に用いる足の最大本数」を大きくすると
上記に関連するためか、MaxBarsBackをチャートの本数以上に大きくするとストラテジーが動かない。エラーも出さない。なんてこったい
SetExitOnCloseが動作しない
SetExitOnCloseという一見便利な予約語がありますが、、
SetExitOnClose は、日中チャートの取引セッションの最後のバーの引けに全ポジションの全株式またはコントラクトを決済する注文を出すために使用される組み込みの逆指値予約語です。
これ、実売買では動作しません。バックテストのみで動作します。ナメてるの?
英語のスレッドの書き込みを見ると書いてありますね。
ie. SetExitOnClose is for backtest only, not for real trades.
その他
他、追記中