Pine Scriptのstrategy.equityや、
strategy.position_sizeを見て、
「MQLのAccountEquity()や、
PositionGetDouble()と同じようなものだろう」と、
思ったことはありませんか。
実は、値の意味は近いのですが、
更新される仕組みが大きく違います。
既刊fukuri.mdでは、MQL4のAccountEquity()を使って、
複利ロットを計算する方法を解説しました。
この記事では、Pine Scriptの資金管理用変数である、
strategy.equity/strategy.position_sizeを、
MQLのAccountEquity()・PositionGetDouble()と、
対比しながら解説します。
・strategy.equity/strategy.position_sizeの基本
・自動集計か自分で集計かという設計の違い
・position_sizeの符号が方向まで教えてくれる理由
・MQLとの対応関係を使った複利ロット計算の書き方
strategy.equity/strategy.position_sizeの基本とMQLの対応
まず、それぞれの基本的な書式を確認します。
Pine Scriptのstrategy.equity/strategy.position_sizeの書式
plot(strategy.equity, title = "現在の資本") plot(strategy.position_size, title = "現在の保有量")
strategy.equityは「初期資金+これまでの損益の合計」
を、strategy.position_sizeは「現在の保有量」
をそのまま返す変数です。
MQLではAccountEquity()とPositionGetDouble()で代用する処理
double equity = AccountEquity();
if(PositionSelect(_Symbol))
{
double volume = PositionGetDouble(POSITION_VOLUME);
}
MQLでは、口座の資金残高と、今自分が持っているポジションの量を、
それぞれ別の関数を呼んで取得する必要があります。
最大の違い: 自動集計されるか、自分で集計するか
ここが、MQLユーザーが最初に戸惑うポイントです。
Pine Scriptは注文確定ごとに即時更新される
・strategy()宣言時点で仮想ブローカーを持つ
・strategy.entry/closeの約定時に自動更新される
・CSV記録や合計計算を自分で書く必要がない
MQLは関数を呼ぶたびに自分でループして合計する設計
既刊fukuri.mdのAccountEquity()は、
口座全体の資金残高を
1回の呼び出しで返してくれますが、
複数ポジションの合計損益や保有量は、
PositionsTotal()でループしながら、
自分で足し算する必要があります。
position_sizeの符号が方向まで教えてくれる理由
ここが、この記事で最も伝えたいポイントです。
正負だけで買い/売り/フラットが分かる
・strategy.position_size>0なら買いポジション保有中
・strategy.position_size<0なら売りポジション保有中
・strategy.position_size==0ならポジションなし(フラット)
・1つの数値の符号だけで3状態が分かる設計
MQLはPOSITION_TYPE定数を別途確認する必要がある
既刊position-select.mdでは、
PositionGetDouble(POSITION_VOLUME)は、
常に正の数しか返しません。
買いか売りかを判定するには、
PositionGetInteger(POSITION_TYPE)が、
POSITION_TYPE_BUYか、
POSITION_TYPE_SELLかを、
別の関数でもう一度確認する必要があります。
実際に動くサンプルコード: 資本に応じたロット計算
strategy.equityを使って、資本の2%を1トレードのリスクにする設計です。
//@version=6
strategy("Equity Risk Position Size Sample", overlay = true)
riskPercent = input.float(2.0, title = "1トレードあたりのリスク%", minval = 0.1, maxval = 100)
stopPips = input.float(20, title = "損切り幅(pips)")
fastMa = ta.sma(close, 10)
slowMa = ta.sma(close, 30)
longCond = ta.crossover(fastMa, slowMa)
closeCond = ta.crossunder(fastMa, slowMa)
riskAmount = strategy.equity * riskPercent / 100
pipValue = syminfo.mintick * 10
plannedQty = riskAmount / (stopPips * pipValue)
if longCond and strategy.position_size == 0
strategy.entry("Long", strategy.long, qty = plannedQty)
if closeCond and strategy.position_size > 0
strategy.close("Long")
plot(strategy.equity, title = "strategy.equity(現在の資本)", color = color.blue)
plot(strategy.position_size, title = "strategy.position_size(保有量)", color = color.orange)
資本(strategy.equity)が増えるほど、次のplannedQtyも大きくなる、
複利的な挙動になります。
TradingViewでの貼り付け・実行手順
実際にTradingViewで動かすまでの手順です。
- TradingViewのチャート画面下部にある「Pineエディタ」タブを開く
- 新規スクリプトを作成し、上のコードを貼り付ける
- 「保存」してから「チャートに追加」をクリックする
- ストラテジーテスターのタブを開き、エクイティカーブと保有量の推移を確認する
- 入力欄の「リスク%」「損切り幅」を変えて、ロットの変化を比較する
よくあるエラーと注意点
実装でつまずきやすいポイントをまとめます。
qtyに0以下の値を渡してしまう
・損切り幅やリスク%の入力が極端に小さいと、plannedQtyが0近辺になる
・strategy.entry()にqty=0を渡すと発注が無視される
・math.max()等で下限値を設けておくと安全
MQLでPositionSelect()を忘れてPositionGetDouble()を呼ぶ
MQLでは、PositionSelect()が、
失敗した(falseが返る)状態でPositionGetDouble()を呼ぶと、
古い値や0が返り続けるため、毎回戻り値をチェックする必要があります。
strategy.equityは「この戦略だけ」の値であることを忘れる
MQLのAccountEquity()は、
同じ口座で動いている他のEAや手動取引も含めた口座全体の値ですが、
strategy.equityは、
このスクリプト単体の仮想的な資本である点が異なります。
よくある質問
strategy.equity/strategy.position_sizeについて、
よく検索される疑問に回答します。
・初期資金を含む「資本の合計」が欲しいならstrategy.equity
・方向まで知りたいならstrategy.position_size
・複数ポジションを別々に管理したいなら、まずネッティング方式の制約を確認する
strategy.equityは初期資金(initial_capital)を含みますか?
含みます。
strategy.equityは「初期資金+これまでの確定損益+未確定損益」
の合計であり、純粋な損益だけを見たい場合はstrategy.netprofitを使います。
strategy.position_sizeで複数ポジション(ヘッジ)を判定できますか?
基本的にはできません。
既刊のstrategy.entry/close/exitの記事で解説したとおり、
Pine Scriptの戦略はネッティング方式のため、
MQL5のヘッジ口座のように、
同じ銘柄で買いと売りを同時に持つ状態は、
strategy.position_sizeの1つの値には表れません。
MQL5のAccountInfoDouble(ACCOUNT_EQUITY)と全く同じ意味ですか?
概念は同じですが範囲が違います。
AccountInfoDouble(ACCOUNT_EQUITY)は口座全体の値、
strategy.equityはこのスクリプト単体の仮想的な資本の値です。
同じ口座で複数のEAやPineスクリプトを動かす場合は、この違いを意識してください。
【Pine Script入門】strategy.equity/strategy.position_sizeをMQLユーザー向けに解説してみた(複利ロット計算・PositionGetDoubleとの比較):まとめ
Pine Scriptのstrategy.equityや、
strategy.position_sizeは、
MQLのAccountEquity()や、
PositionGetDouble()と意味は近いものの、
「自分で集計するか、
仮想ブローカーが自動更新してくれるか」
という設計の違いがあります。
position_sizeは符号1つで、
方向まで分かる点も、
MQLのPOSITION_TYPE定数を別途確認する設計とは対照的です。
複利的なロット計算を書くときは、この違いを押さえておくと移植がスムーズになります。
コメント