ストラテジーの全コード
第4回で学んだ部品(strategy(...)・組み込み変数・if文・strategy.entry/strategy.close)だけで、これで完成です。
//@version=6
strategy("月末ロング (簡易ToM)", overlay=true,
default_qty_type=strategy.fixed, default_qty_value=1)
dom = dayofmonth // その足の日付(1〜31)
// ノーポジ かつ 日付25以上 → 買い条件
isEntry = strategy.position_size == 0 and dom >= 25
// 保有中 かつ 日付3〜15 → 決済条件
isExit = strategy.position_size > 0 and dom >= 3 and dom <= 15
if isEntry
strategy.entry("Long", strategy.long)
if isExit
strategy.close("Long")
// 保有中の期間をチャートに薄く塗る(目で確認するため)
bgcolor(strategy.position_size > 0 ? color.new(color.gray, 88) : na)
1行ずつ読む
dom = dayofmonth:今たどっている足の日付をdomという名前にしておきます(読みやすさのため。第7回のMQL5と名前をそろえています)。isEntry:「ノーポジ(position_size == 0)かつ 日付25以上」を、あらかじめ1つの条件にまとめています。trueかfalseが入ります。isExit:「保有中(position_size > 0)かつ 日付3〜15」。if isEntry/if isExit:条件がtrueの足で、それぞれ買い・決済を出します。bgcolor(...):保有中の足の背景を薄く塗り、いつ持っていたかを目で追えるようにする補助です(売買には影響しません)。
条件を isEntry・isExit という名前にまとめたのは、if文の行を短く読みやすくするためです。第7回のMQL5でif文の中に直接条件を書いたのと、やっていることは同じです。
MQL5版との違い
同じルールなのに、コードの見た目はかなり違います。主な違いを整理します。
- 繰り返しの仕掛けが要らない:MQL5は
OnTickと「新しい足の検出」が必要でしたが、Pineは足を自動でたどるので、その下ごしらえがまるごと不要です。 - データ・銘柄の指定が要らない:Pineはチャートに表示している銘柄・時間足をそのまま使います。S&P500の日足チャートに載せれば、それが検証対象になります。
- 記号ではなく英単語:「かつ」が
&&ではなくand、範囲は波かっこではなく字下げ。
チャートで動かして確認する
- TradingViewでS&P500系の銘柄(例:SPX)を開き、時間足を日足にします。
- Pineエディタで新規作成し、上のコードを貼り付けて「チャートに追加」します(既存スクリプトを上書きしないよう注意)。
- チャート上に売買の矢印が表示され、保有期間が薄く塗られます。月末に買い、翌月初に手放しているか、目で確認します。
- 下部のストラテジーテスタータブで、総損益・勝率・最大ドローダウン・トレード数を記録します。
- 設定の「プロパティ」で手数料を現実的な値にします。0のままだと甘い結果になります。
Pineの強みは、この「チャートに重ねて目で確認できる」点です。数字だけでなく、実際にどの位置で売買しているかが見えるので、ルールの勘違いに気づきやすい。第7回のMQL5テスターの数字と、ここでの数字が違っていたら、その差の理由を考える材料になります(第10回)。
約定タイミングの確認
第4回で触れたとおり、strategy.entry() がある足で true になっても、実際の約定は既定で次の足の始値です。これは第7回のMQL5版(前の足で判定→次の足の頭で約定)とほぼ同じ考え方で、この2つは約定タイミングの点で近くなります。
一方、第9回のPythonでは「その足の引けで約定」として計算します。だから、MQL5とPineは近く、Pythonが少しずれる、という関係になりがちです。実際の数字でそうなるかは、第10回で確かめます。
チェックリスト
次の記事に進む前に、以下が自分の言葉で説明できるか確認してください。
dayofmonthとstrategy.position_sizeで条件を作れること- 条件を
isEntry/isExitにまとめる意味(読みやすさ) - Pineは繰り返しの仕掛けとデータ指定が不要なこと
- チャートに重ねて売買位置を目で確認できる強み
- Pineの約定は次の足の始値で、MQL5版と近いこと
- 手数料を0のままにしない理由
ミニテスト
最後に3問だけ確認です。不正解なら別の選択肢を選び直せます。正解すると解説が表示されます。
Q1. Pine版がMQL5版より短くなる主な理由は?
ルールは同じで、省略はしていません。Pineは繰り返しとデータ供給が自動なので、その下ごしらえのコードが不要になります。
Q2. Pineで「今ノーポジかどうか」を判定するのに使うのは?
strategy.position_size が0ならノーポジ、正なら買い持ちです。PositionSelect() はMQL5の書き方です。
Q3. 約定タイミングについて、本文の説明として正しいのは?
Pineは既定で次の足の始値で約定するため、MQL5版(前の足で判定→次の足の頭)と近くなります。Pythonは引けで約定として計算するので、少しずれます。