久々に、投稿。
レーダースクリーン上に、銘柄ごとの保有ポジション状況(「取得価格」「株数」「損益(P/L)」など)を表示させる、EasyLanguageコードを書いてみました。インジケーターとして作成しております。
表示する内容は、トレーディングアプリ『トレードマネージャー』の「ポジション」タブで表示されるものと同じようなものになります。以下、同じ時間にそれぞれを表示させた時の様子です。
(トレードマネージャーの「ポジション」タブ)
(今回作成したレーダースクリーンの列)
レーダースクリーンの列として追加できるので、自作の売買サインなどをレーダースクリーンに表示させている方は、その隣りの列に追加することで、銘柄ごとの損益などがすぐに確認できたりして便利かと思います。
具体的な実装としては、オブジェクト指向EasyLanguageのPositionsProviderクラスを使用することで、指定した銘柄の保有ポジション情報を取得しています。取得できる情報はいくつかあるのですが、とりあえずよく使いそうなものに絞って表示させています。順番入れ替えや削除はお好みでどうぞ。
また、レーダースクリーン側で必要な表示スタイルの設定と、PositionsProviderで取得する情報のちょっとしたクセについて、コードの後で解説します。
Easylanguageコード
using elsystem; using tsdata.trading; Vars: PositionsProvider oPP(NULL); method void AnalysisTechnique_Initialized( elsystem.Object sender, elsystem.InitializedEventArgs args ) begin Try oPP = PositionsProvider.Create(); oPP.Updated += PositionsProvider_Updated; oPP.Symbols.Add( Symbol ); oPP.Load = true; Catch (Exception ex) Print( "Error: ", " ", string.format("{0} | {1}[StackTrace]{2}", " ", ex.Source, ex.Message, ex.StackTrace) ); End; end; method void PositionsProvider_Updated( elsystem.Object sender, tsdata.trading.PositionUpdatedEventArgs args ) vars: int ColumnCount; begin Try If oPP.Count > 0 then Begin If oPP.Position[0].Type = PositionType.LongPosition then Begin Plot1( "買い", "ポジション" ); Plot8( oPP.Position[0].PercentPL/100, "損益率" ); End Else If oPP.Position[0].Type = PositionType.ShortPosition then Begin Plot1( "新規売り", "ポジション" ); Plot8( -1 * oPP.Position[0].PercentPL/100, "損益率" ); End Else Begin NoPlot(1); NoPlot(8); End; Plot2( AbsValue(oPP.Position[0].Quantity), "株数" ); Plot3( oPP.Position[0].AveragePrice, "取得価格" ); Plot4( oPP.Position[0].TotalCost, "取得金額" ); Plot5( Close, "現在価格" ); Plot6( AbsValue(oPP.Position[0].MarketValue), "現在金額" ); Plot7( oPP.Position[0].OpenPL, "損益" ); Plot9( oPP.Position[0].PLPerQuantity, "1株あたり損益" ); End Else Begin For ColumnCount = 1 to 9 Begin NoPlot( ColumnCount ); End; End; Catch (Exception ex) Print( "Error: ", " ", string.format("{0} | {1}[StackTrace]{2}", " ", ex.Source, ex.Message, ex.StackTrace) ); End; end;
解説
事前設定について
今回はPositionsProviderオブジェクトをコード上で生成しておりますので、AnalysisTechnique_Initializedイベントのみ「プロパティ」からAnalysisTechniqueのInitializedイベントに設定してください。
また、レーダースクリーンに挿入した後、本記事の「各列について」にある「表示スタイル」をそれぞれの列で設定してください。
処理の流れ
レーダースクリーンの各行が更新されるたびに、PositionsProvider_Updated が呼び出されます。
そして、その行の銘柄がポジションを保有している場合のみ、PositionsProviderからの情報を表示します。
各列について
「表示スタイル」は、レーダースクリーン側の「分析テクニックの設定」->「スタイル」タブで設定する内容です。
【列1】ポジション
[ 表示スタイル:銘柄コードと同じ ]
ポジションの方向。oPP.Position[0].Type が PositionType.LongPosition の時は買いポジション保有、PositionType.ShortPosition の時は売りポジション保有になるので、それに合わせて「買い」または「新規売り」を文字表示させています。
【列2】株数
[ 表示スタイル:数字(小数0桁) ]
保有株数です。なぜか新規売りの時はマイナス値として取得されるので、AbsValue関数で絶対値を表示させています。
【列3】取得価格
[ 表示スタイル:通貨(小数1桁) ]
保有ポジションを取得した時の平均価格です。
【列4】取得金額
[ 表示スタイル:通貨(小数0桁) ]
保有ポジションを取得した時の合計金額です。【列2:株数】x【列3:取得価格】になるはず。
【列5】現在価格
[ 表示スタイル:通貨(小数0桁) ]
現在の価格です。単純に現在の終値を表示させています。
【列6】現在金額
[ 表示スタイル:通貨(小数0桁) ]
保有ポジションの現在における合計金額です。【列2:株数】x【列5:現在価格】になるはず。これも新規売りの時はマイナス値として取得されるので、AbsValue関数で絶対値を表示させています。
【列7】損益
[ 表示スタイル:通貨(小数0桁) ]
現在価格を元にしたリアルタイム損益金額です。【列6:現在金額】と【列4:取得金額】との差額になるはず。
【列8】損益率
[ 表示スタイル:パーセント(小数2桁) ]
取得金額に対する損益の比率。【列7:損益】÷【列4:取得金額】で計算されます。
損益率については2点補足があるのですが、1つは新規売りの時マイナス値になる点です。トレードマネージャーではマイナスのまま表示されていますが、今回のコードでは新規売りでも利益が出ていればプラスで表示されるようにしてみました。
またもう1点は、取得値の単位が「%」である点です。例えば oPP.Position[0].PercentPL が 2.23 という値だった場合、これは「2.23%」という意味になります。ただ今回はレーダースクリーン側の「パーセント表記」スタイルで%をつけて表示させたかったため、oPP.Position[0].PercentPLの結果を100で割ることで、割合の小数として取得しています。(レーダースクリーンの「パーセント表記」は、表示対象の数値を100倍して%をつける、というスタイル設定のため、PercentPLの値そのままでパーセント表記すると、223%などというトンデモナイ表示になってしまいます)
【列9】1株あたり損益
[ 表示スタイル:通貨(小数2桁) ]
保有株数1株あたりの損益です。【列7:損益】÷【列2:株数】になります。
まとめ
レーダースクリーンの分析テクニックはいくつでも横に追加でいるので、他の分析テクニックと合わせて使うことで、より運用しやすいレーダースクリーンが作成できます。
あまり列を増やしたくないという方は、たとえば「株数」「取得価格」「損益」だけ表示させてみる、というのもアリだと思います。
ぜひ色々試してみてください。