システムトレード

[EasyLanguageでシステムトレード]BracketOrderTicketで損切りや利食いをしよう

EasyLanguage BracketOrderTicket

前回[EasyLanguageでシステムトレード]OrderTicketを使って売買注文を出してみようでは、インジケーターから、より自由度の高い売買注文を出す方法を紹介しました。

EasyLanguageには、Buy文やSell文がありますが、チャートに表示されている銘柄に対してのみ注文が出されます。

ですが、OrderTicketなら、チャートに表示していないものに対しても、売買注文を出すことができました。

今回は、さらにもう一歩進んで、利食いや損切りの注文を出す方法を紹介します。

こうすることで、より現実的なトレードに近付きます。

今回のプログラムは成行注文が出されるので、実際にチャートに適用する際は、十分にご注意下さい。これにより損失が出ても、一切責任をとりません。

タートル 投資手法 バックテスト
この結果を見てもまだシステムトレードしないのか【タートル流投資手法の驚くべきバックテスト結果】タートルが取ったとされる投資手法をプログラム化して、バックテストを行いました。その結果としては、かなりのリターンが期待できるものでした。トレンドフォローの投資手法は、まだまだ現役であるようです。...

BracketOrderTicketコンポーネント

EasyLanguageには、BracketOrderTicketと呼ばれるコンポーネントがあります。

これが、利食いや損切りを設定できるものなので、今回はこれの使用方法を紹介します。

マネックス証券のマニュアルの例題11に対応していますので、無くても問題ないですが、必要に応じて、ダウンロードしてください。

BracketOrderTicketを追加しよう

例題11(BracketOrderTicket)

EasyLanguage開発環境を開いて、インジケーターを新規作成してください。

その後、ツールボックスから、「OrderTicket」と「BracketOrderTicket」をそれぞれダブルクリックして、コンポーネントを追加してください。

パンダはし
パンダはし

OrderTicketのプロパティ設定

例題11(BracketOrderTicket)

まずは、OrderTicketのプロパティ設定をしましょう。

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

画像のように設定してください。

BracketOrderTicketの設定をしよう

例題11(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で損切りの設定ということが理解できたかと思います。

プログラムの解説

ここからは、プログラムの解説をしていきます。プログラムコードは、このサイトの下の方にありますので、コピーしてお使いください。

なお、以降○○行目と出てきますが、空白の改行を無視して数えますので、ご注意下さい。

例題11(BracketOrderTicket)

1~8行目 変数の宣言

1,2行目は自動で入力した文です。口座名と株数を指定しています。

ただし、1行目には、BracketAmtが追加されているので注意ください。

3~8行目は変数の宣言をしています。

9~20行目 イベントハンドラ

9~20行目は、イベントハンドラ内の記述となっています。

前回と同様に、プロパティから、Initializedとしてイベントハンドラの設定をしてください。

ここの中身は、このインジケーターがチャートに適用されたときにのみ実行されます。

内容としては、対象銘柄・口座区分・税区分の3つを、OrderTicket・BracketOrderTicketのTargetType・BracketOrderTicketのProtectionTypeの三種類でそれぞれ設定しています。

そして、売買注文を出すのを一度きりになるような変数も設定しています。

BracketOrderTicketの方は、長々と書いていますが、深く意味を理解する必要はなく、こういうもんだと割りきってください(笑)

要は、口座の種類を設定しているだけなので、細かいことは気にしなくてもよいです。

パンダはし
パンダはし
「Category」はチャートに表示されている銘柄、「Cash」は一般口座、「NonTokutei」は源泉徴収なしの口座だったね

例題11(BracketOrderTicket)

21~39行目 BracketOrderTicketメソッド

21~39行目が今回のメインである、BracketOrderTicketによる注文を出すメソッドです。

24~29行目 OrderTicketによる売買情報を表示

24~29行目では、OrderTicketにより出された注文内容を「印刷ログ」に出力してくれます。

30行目 条件文

30行目で、条件文として、変数「BracketSent」がFalseで、かつ、OrderTicketにより注文が出された場合としています。

パンダはし
パンダはし
後で出てくるけど、そもそもOrderTicketが1度しか出されずに、しかも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が出されたという内容が「印刷ログ」に表示されます。

 

例題11(BracketOrderTicket)

40~53行目 指数のプロットメソッド

40~53行目は、売買に使う指数のプロットを示しています。

内容は前回と同じなので、そちらを参照ください。

パンダはし
パンダはし
何度も出てきてるけど前回はこちらからどうぞ![EasyLanguageでシステムトレード]OrderTicketを使って売買注文を出してみよう

ただし、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;

インジケーターの設定

例題11(BracketOrderTicket)

前回と同様に、チャートにインジケーターを適用して、「注文発注オブジェクトを有効にする」にチェックを入れてください。

そうすることで、注文が出されます。

チャートに適用は成行注文が出されるので、十分注意してください。

利食いや損切り以外の使い方

利食いや損切りを目的としているので、買い注文に対して売り注文として、BracketOrderTicketを紹介しました。

ですが、株価が下がってお買い得になったときに買うのと、株価が上がって勢いがあるときに買うのと、二種類が考えられるので、それに対応した注文もBracketOrderTicketで出せます。

このように、使い方は様々なので、幅広く使えて便利です。

みなさんのストラテジーに合わせてお使いください。

さいごに

利食いや損切りの出し方がわかったかと思います。

さらに、それ以外の使い方、可能性もBracketOrderTicketにはあることがわかったかと思います。

注意点としては、OrderTicketと同様に、インジケーターなので、バックテストができないところが難点です。

別途Buy文などでストラテジーを作成する必要があります。

ですが、ようやく現実に近いシステムトレードができるようになってきました。

次回はより現実的になるように、手数料を追加したバックテストのやり方を紹介します。

タートル 投資手法 バックテスト
この結果を見てもまだシステムトレードしないのか【タートル流投資手法の驚くべきバックテスト結果】タートルが取ったとされる投資手法をプログラム化して、バックテストを行いました。その結果としては、かなりのリターンが期待できるものでした。トレンドフォローの投資手法は、まだまだ現役であるようです。...

システムトレード過去記事一覧Next→手数料を追加してバックテストをしよう

Nocchi_nochilog(のっち)
少額投資をこよなく愛する1児のパパ&サラリーマン。
お小遣い制でも負けずに投資をしています。

知るだけで暮らしが豊かになる知識を発信中!
若いうちから投資することの重要性を伝えるべく、ブログの記事を更新しています。

特にインスタグラムでは、1日1分で自然とお金の知識が身につくような情報を発信しています。
ぜひ合わせてご覧ください!

下のアイコンから飛べます!
\ Follow me /

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です