前回[EasyLanguageでシステムトレード]Timer機能を使って一定時間ごとにプログラムを実行しようで、一定間隔ごとに実行されるプログラムを作成しました。
今回は、オブジェクト指向による売買注文の出し方を学んでいきたいと思います。
以前、「Buy」文や「Sell」文で注文を出したことがありました。そして、バックテストをしました。
そのときは、チャートに表示されている銘柄に対してのみ売買注文がされるものでした。
今回紹介するのは、銘柄を指定すればチャートに表示されていなくても売買注文ができる「OrderTicket」というコンポーネントを紹介します。
マネックス証券のマニュアルの例題10をもとに話を進めます。(マニュアルが手元に無くても大丈夫ですが、あった方が良いかと思います)
注意!!今回のプログラムを適用すると、成行注文が出されます。実際に適用する際には、十分注意してください。

目次
OrderTicketコンポーネントを追加しよう

いつものように、EasyLanguage開発環境を開いて、「インジケーター」を新規作成してください。
「ツールボックス」から「OrderTicket」をダブルクリックして、「OrderTicket1」コンポーネントを追加します。
OrderTicketのプロパティを設定しよう

プロパティの設定をしましょう。
「OrderTicket1」が選ばれていることを確認して、「Account」を選択して「入力」をクリックしてください。
そうすると、自動でプログラムが挿入されるので、マネックス証券の口座番号を入れましょう。
本プログラムは、成行注文が出されます。実口座をいれると、取引されるので注意してください。
次に、プロパティの「Quantity」も先ほどと同様にinput文にします。つまり、「入力」をクリックして、プログラムに自動挿入してください。
このときの、「100」という数字は、一度に100株の注文を出しますよという意味です。

イベントハンドラの設定をしよう

前回、Timerによるイベントハンドラを設定しましたが、今回はまた別のイベントハンドラを設定します。
プロパティから「AnalysisTechnique」を選択してください。
「イベント」をクリックすると、「Initialized」の「Value」が空欄なのが確認できます。
その空欄部でダブルクリックすると、プログラムが自動で書き込まれます。
これは、このインジケーターが適用されたとき(チャートに表示されたとき)に一度だけ実行されるメソッドです。
後に解説しますが、今回は、このメソッドを使って、注文が一度しか出されないようにコントロールしています。
OrderTicketプログラムの解説
ここからは、今回のOrderTicketプログラムの解説をします。
以降の○○行目は、プログラムの行数で、空欄行を除いた行数としています。

1~4行目 変数の宣言
1~4行目までは、変数の宣言をしています。1,2行目はすでに自動で入っていると思います。
変数宣言で「intrabarpersist」とありますが、これは、ティックを受け取る毎に値を更新するという変数を宣言できるものです。
後で出てきますが、一度しか注文を出さないために設定している変数なので、注文が出た瞬間に反応してくれないと、注文を出した足が終わるまで、何度も注文を出してしまうことになります。
doubleは、実数(小数点以下も含む)の変数宣言ですね。
5~11行目 イベントハンドラ
先ほど自動で入力したイベントの中身について解説します。
7行目で、銘柄を指定しています。ここでは、「Category」となっています。これは、チャート上に表示されている銘柄となります。
ここを任意の銘柄コードにすれば、その銘柄に対して注文を出せます。
8行目では、口座区分を指定しています。1行目で入力した口座番号の口座区分が、現物口座なら「Cash」とします。
9行目では、税区分について示しています。
ここでは、「NonTokutei」としており、一般口座を表しています。
10行目では、一度切りしか注文をしないようにするため、このインジケーターを適用したときだけ実行する、イベントメソッド内で、「AllowTradeFlag」に「OrderActive」(True)を代入しています。
「AllowTradeFlag」は変数宣言のときにTrueとしているので、意味無いようにも思えますが、input文として別途「OrderActive」を設定することで、取引しないようにチャート上で変更できるようにするため、10行目があります。
また、「AllowTradeFlag」は、intrabarpersistで宣言したいので、input文としては書けないということになります。
12~17行目 PlotValuesメソッド

このメソッドは、注文を出すときに使う指数をプロットするメソッドです。
HiTargetとLoTargetとAllowTradeFlagを描画しています。
AllowTradeFlagは真か偽の条件をいれているだけなので、それを文字として表示するには、「tostring」をつける必要があります。
18~20行目 指数の定義とプロット
HiTargetは現在の足から3つ前までの足の内、最高値となります。
逆に、LoTargetは、現在の足から3つ前までの足の内、最安値となります。
いずれも、[ 1 ]があるので、現在の足は含みません。
20行目では、先ほど定義した「PlotValuesメソッド」を呼び出して、プロットしています。
21〜25行目 売買注文を出す
いよいよ、売買注文を出すプログラムです。
21行目で条件文(if文)があり、「足の終値がLoTarget以下」または「足の終値がHiTarget以上」の場合、かつ、「現在の足が最新の足」かつ、「AllowTradeFlagが真(True)」のとき、if文の中身を実行します。
条件が多いですが、慎重に見ていけば、理解できると思います。
そして、23行目でOrderTicket1の内容で、注文を出しています(Send)。
さらに、24行目で、AllowTradeFlagをFalseにすることで、注文は一度しか出さないようにしています。
ただし、このインジケーターを再度適用したときは、AllowTradeFlagがTrueになるので(イベントハンドラより)、再度注文が出されます。
注文の種類の設定方法

プログラムの中で、注文を出しましたが、注文とはどういった注文でしょうか。買い注文なのか売り注文なのか。。
マニュアルにはそこまで書かれていませんが、初期設定では、買い注文になっています。
もしこれを変えたい場合は、「OrderTicket1」のプロパティの「Action」を変えれば変更できます。
Buyにすると買い注文、Sellにすると売り注文など変更できます。
また、これをプログラム上で指定もできますので、条件文を設定して、こうなったときは買い注文、こうなったときは売り注文など、変更することができます。
インジケーターの設定

チャートにインジケーターを適用したら、「インジケーターの設定」より、「注文発注オブジェクトを有効にする」にチェックを入れてください。
こうすることで、自動売買が可能になります。
プログラムコード
以下にプログラムコードを載せておきますのでコピーしてお使いください。
Input: string iAccount1( "111-12345" );
Input: int iQuantity1( 100 );
Input: OrderActive(True);
Vars: double HiTarget(0), double LoTarget(0), intrabarpersist AllowTradeFlag(True);
method void AnalysisTechnique_Initialized( elsystem.Object sender, elsystem.InitializedEventArgs args )
begin
orderticket1.SymbolType = Category;
orderticket1.ExtendedProperties.SetItem("FundSource", "Cash");
orderticket1.ExtendedProperties.SetItem("TaxationMethod", "NonTokutei");
AllowTradeFlag = OrderActive;
end;
Method void PlotValues()
begin
Plot1(HiTarget, "High Target");
plot2(LoTarget,"Low Target");
plot3(AllowTradeFlag.tostring(),"Active");
end;
HiTarget = HighestFC(High, 3)[ 1 ];
LoTarget = LowestFC(Low, 3)[ 1 ];
plotvalues();
If ( ( Close <= LoTarget OR Close >= HiTarget ) AND (LastBarOnChart and AllowTradeFlag) ) then
begin
orderticket1.send(); // send order
AllowTradeFlag = False; // set one trade only safety flag
end;
さいごに
OrderTicketコンポーネントにて、売買注文を出す方法を紹介しましたが、いかがでしたでしょうか。
以前解説したBuyやSell文と違って、設定する内容が多かったと思います。
ですが、それだけ細かく指定できるということは、自分の思った通りの取引に、さらに近づけるということになります。
最後に注意点としては、バックテストができないという点です。
Buy文などは、チャートに適用して、バックテストができましたが、OrderTicketが、あくまでインジケーターということもあり、バックテストができません。
もうすぐで、EasyLanguageによるシステムトレードのオブジェクト指向の基礎がだいたい終わります。あと少し、頑張りましょう!
次回は、利食いや損切りの注文の出し方を紹介します。
