前回[EasyLanguageでシステムトレード]OrderTicketを使って売買注文を出してみようでは、インジケーターから、より自由度の高い売買注文を出す方法を紹介しました。
EasyLanguageには、Buy文やSell文がありますが、チャートに表示されている銘柄に対してのみ注文が出されます。
ですが、OrderTicketなら、チャートに表示していないものに対しても、売買注文を出すことができました。
今回は、さらにもう一歩進んで、利食いや損切りの注文を出す方法を紹介します。
こうすることで、より現実的なトレードに近付きます。
今回のプログラムは成行注文が出されるので、実際にチャートに適用する際は、十分にご注意下さい。これにより損失が出ても、一切責任をとりません。

目次
BracketOrderTicketコンポーネント
EasyLanguageには、BracketOrderTicketと呼ばれるコンポーネントがあります。
これが、利食いや損切りを設定できるものなので、今回はこれの使用方法を紹介します。
マネックス証券のマニュアルの例題11に対応していますので、無くても問題ないですが、必要に応じて、ダウンロードしてください。
BracketOrderTicketを追加しよう

EasyLanguage開発環境を開いて、インジケーターを新規作成してください。
その後、ツールボックスから、「OrderTicket」と「BracketOrderTicket」をそれぞれダブルクリックして、コンポーネントを追加してください。
OrderTicketのプロパティ設定

まずは、OrderTicketのプロパティ設定をしましょう。
こちらは、前回[EasyLanguageでシステムトレード]OrderTicketを使って売買注文を出してみようと同じなので解説は省略します。解説は前回をご覧ください。
画像のように設定してください。
BracketOrderTicketの設定をしよう

続いて、今回の主役であるBracketOrderTicketのプロパティ設定をしましょう。
プロパティで「BracketOrderTicket」が選ばれていることを確認してください。
AccountとQuantityの設定
AccountとQuantityは、それぞれ「iAccount1」、「iQuantity1」としてください。
そうすることで、OrderTicketにて設定した口座名と株数を設定することができます。
OrderTicketの注文分とは異なる株数をBracketOrderTicketにて売りに出したい場合、「入力」を使って、iQuantity2を作るか、直接株数を入力してください。
Actionの設定
Actionは注文の種類を設定できます。
今回は、OrderTicketにて買い注文、BracketOrderTicketでは売り注文を出すので、Sellとしています。
TargetTypeとProtectionTypeの設定
TargetTypeは、文字通りターゲットとしている株価に対して、どういったことをするかというのが設定できます。
Limitというのは、指値注文のことです。ある金額に到達したら、売り注文をだしてくれます。
次に、ProtectionTypeは、資産を守る注文なので、株価が一定額下がったときに実行されます。
StopMarketは、いわゆる逆指値のことです。
株価がいくらまで下がってしまったときに売り注文を出します。
今回は、TargetTypeで利食いの設定、ProtectionTypeで損切りの設定ということが理解できたかと思います。
プログラムの解説
ここからは、プログラムの解説をしていきます。プログラムコードは、このサイトの下の方にありますので、コピーしてお使いください。
なお、以降○○行目と出てきますが、空白の改行を無視して数えますので、ご注意下さい。

1~8行目 変数の宣言
1,2行目は自動で入力した文です。口座名と株数を指定しています。
ただし、1行目には、BracketAmtが追加されているので注意ください。
3~8行目は変数の宣言をしています。
9~20行目 イベントハンドラ
9~20行目は、イベントハンドラ内の記述となっています。
前回と同様に、プロパティから、Initializedとしてイベントハンドラの設定をしてください。
ここの中身は、このインジケーターがチャートに適用されたときにのみ実行されます。
内容としては、対象銘柄・口座区分・税区分の3つを、OrderTicket・BracketOrderTicketのTargetType・BracketOrderTicketのProtectionTypeの三種類でそれぞれ設定しています。
そして、売買注文を出すのを一度きりになるような変数も設定しています。
BracketOrderTicketの方は、長々と書いていますが、深く意味を理解する必要はなく、こういうもんだと割りきってください(笑)
要は、口座の種類を設定しているだけなので、細かいことは気にしなくてもよいです。

21~39行目 BracketOrderTicketメソッド
21~39行目が今回のメインである、BracketOrderTicketによる注文を出すメソッドです。
24~29行目 OrderTicketによる売買情報を表示
24~29行目では、OrderTicketにより出された注文内容を「印刷ログ」に出力してくれます。
30行目 条件文
30行目で、条件文として、変数「BracketSent」がFalseで、かつ、OrderTicketにより注文が出された場合としています。
31,32行目 利食いや損切り株価の設定
31,32行目で、利食いする株価と損切りする株価を示しています。
BracketOrderTicket1.LimitPrice、またはStopPriceと、TargetおよびProtectionではないことに、注意ください。
myOrder.AvgFilledPriceというのが、OrderTicketで購入した株価を示しています。
BracketAmtは100と設定しているので、購入した株価よりも100円上がったら利食い、100円下がったら損切りという設定にしています。
33行目 注文を出す株数
33行目では、BracketOrderTicketで出す株数の設定をしています。
ここでは、OrderTicketにより出された株数と同じ株数としています。
34行目 発注
34行目で、BracketOrderTicketによる注文を市場に出しています。
35~37行目 BracketOrderTicketの情報を表示
35行目で、BracketSentをTrueにしているので、BracketOrderTicketは一度切りしか出されないことになります。
36~37行目では、BracketOrderTicketが出されたという内容が「印刷ログ」に表示されます。

40~53行目 指数のプロットメソッド
40~53行目は、売買に使う指数のプロットを示しています。
内容は前回と同じなので、そちらを参照ください。
ただし、51行目だけ、前回から追加されています。
この行によって、BracketOrderTicketの注文が出されます。
プログラムコード
今回使用したプログラムコードを下に載せています。コピーしてお使いください。
Input: int iQuantity1( 100 ), double BracketAmt(100);
Input: OrderActive(TRUE),string iAccount1( "111-12345" );
Vars:
double HiTarget(0),
double LoTarget(0),
intrabarpersist AllowTradeFlag(True),
intrabarpersist BracketSent(FALSE);
Var: tsdata.trading.Order MyOrder(null);
method void AnalysisTechnique_Initialized( elsystem.Object sender, elsystem.InitializedEventArgs args )
begin
orderticket1.SymbolType = Category;
orderticket1.ExtendedProperties.SetItem("FundSource", "Cash");
orderticket1.ExtendedProperties.SetItem("TaxationMethod", "NonTokutei");
BracketOrderTicket1.SymbolType = Category;
BracketOrderTicket1.Protection.PrimaryTicket.ExtendedProperties.SetItem("FundSource", "Cash");
BracketOrderTicket1.Protection.PrimaryTicket.ExtendedProperties.SetItem("TaxationMethod", "NonTokutei");
BracketOrderTicket1.Target.PrimaryTicket.ExtendedProperties.SetItem("FundSource", "Cash");
BracketOrderTicket1.Target.PrimaryTicket.ExtendedProperties.SetItem("TaxationMethod", "NonTokutei");
AllowTradeFlag = OrderActive;
end;
Method void OrderStatusUpdate(elsystem.Object sender, tsdata.trading.OrderUpdatedEventArgs args)
var: string myStatus;
begin
myStatus = myOrder.State.tostring();
myStatus = myStatus + " " + myOrder.OrderID;
myStatus = myStatus + " - " + myOrder.Action.tostring();
myStatus = myStatus + " " + myOrder.FilledQuantity.tostring();
myStatus = myStatus + " " + symbol;
print(myStatus);
If BracketSent = false AND myOrder.State = tsdata.trading.orderstate.filled then begin
BracketOrderTicket1.LimitPrice = myOrder.AvgFilledPrice + BracketAmt;
BracketOrderTicket1.StopPrice = myOrder.AvgFilledPrice - BracketAmt;
BracketOrderTicket1.Quantity = iQuantity1;
BracketOrderTicket1.Send();
BracketSent = True;
print("Bracket order sent - ",BracketOrderTicket1.LimitPrice.tostring(),
" ",BracketOrderTicket1.StopPrice.tostring());
end;
end;
Method void PlotValues()
begin
Plot1(HiTarget, "Low 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
MyOrder = OrderTicket1.send();
MyOrder.Updated += OrderStatusUpdate;
AllowTradeFlag = False;
end;
インジケーターの設定

前回と同様に、チャートにインジケーターを適用して、「注文発注オブジェクトを有効にする」にチェックを入れてください。
そうすることで、注文が出されます。
チャートに適用は成行注文が出されるので、十分注意してください。
利食いや損切り以外の使い方
利食いや損切りを目的としているので、買い注文に対して売り注文として、BracketOrderTicketを紹介しました。
ですが、株価が下がってお買い得になったときに買うのと、株価が上がって勢いがあるときに買うのと、二種類が考えられるので、それに対応した注文もBracketOrderTicketで出せます。
このように、使い方は様々なので、幅広く使えて便利です。
みなさんのストラテジーに合わせてお使いください。
さいごに
利食いや損切りの出し方がわかったかと思います。
さらに、それ以外の使い方、可能性もBracketOrderTicketにはあることがわかったかと思います。
注意点としては、OrderTicketと同様に、インジケーターなので、バックテストができないところが難点です。
別途Buy文などでストラテジーを作成する必要があります。
ですが、ようやく現実に近いシステムトレードができるようになってきました。
次回はより現実的になるように、手数料を追加したバックテストのやり方を紹介します。
