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は注文確定ごとに即時更新される

MQLユーザーが驚くポイント
・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で動かすまでの手順です。

  1. TradingViewのチャート画面下部にある「Pineエディタ」タブを開く
  2. 新規スクリプトを作成し、上のコードを貼り付ける
  3. 「保存」してから「チャートに追加」をクリックする
  4. ストラテジーテスターのタブを開き、エクイティカーブと保有量の推移を確認する
  5. 入力欄の「リスク%」「損切り幅」を変えて、ロットの変化を比較する

よくあるエラーと注意点

実装でつまずきやすいポイントをまとめます。

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定数を別途確認する設計とは対照的です。

複利的なロット計算を書くときは、この違いを押さえておくと移植がスムーズになります。

関連記事