Pine Script → MQL4 変換でハマるポイント — 関数の違い早見表
AIにPine ScriptのロジックをMQL4に変換してもらった。コンパイルしたらエラーだらけ。「直して」と言っても同じエラーが返ってくる……。
この状況の原因の多くは、Pine ScriptとMQL4の「似ているけど違う」関数・構文の差です。この差を知っていれば、エラーの原因を自分で特定してAIに的確な修正指示を出せます。
この記事をブックマークして、エラーが出たら対応表を参照してください。
Pine Script→MQL4変換でエラーが続く理由
AIはPine ScriptとMQL4の両方を知っています。しかし「Pine ScriptのロジックをMQL4に変換して」という指示に対して、AIは時としてPine Scriptの関数名をそのままMQL4に移植しようとするミスを犯します。
たとえば ta.rsi(close, 14) をMQL4でも同じように書こうとして、存在しない関数 ta.rsi() をそのまま使ってしまう、という具合です。
原因を知っていれば、一行の補足指示で解決します。「ta.rsi()はMQL4ではiRSI()に相当します。正しい引数で書き直してください」と伝えるだけで一発で修正できます。
根本的な違い:実行モデルとデータ構造
実行モデルの違い
| Pine Script | MQL4 | |
|---|---|---|
| 実行タイミング | バーが更新されるたびにスクリプト全体が再実行される | イベント駆動(OnTick、OnInit等の関数が個別に呼ばれる) |
| コードの書き方 | トップレベルに計算式を並べる | 関数の中に処理を書く |
この違いにより、Pine Scriptで「トップレベルに書いた変数」がMQL4では「どこに書くか(グローバル?ローカル?)」の判断が必要になります。
データ参照の違い
| Pine Script | MQL4 | |
|---|---|---|
| 現在バーの終値 | close | Close[0] |
| 1つ前のバーの終値 | close[1] | Close[1] または iClose(NULL, 0, 1) |
| 過去N本前の指標値 | rsi[N](変数に添え字) | iRSI(NULL, 0, 14, PRICE_CLOSE, N)(引数のshift) |
Pine Scriptは変数に添え字でアクセスするのに対し、MQL4はインジケーター関数の最後の引数「shift」で過去バーを指定します。
よくあるエラー早見表①:インジケーター関数の違い
AIが最も間違えやすいポイントです。
| Pine Script | MQL4 | 注意点 |
|---|---|---|
ta.rsi(close, 14) | iRSI(NULL, 0, 14, PRICE_CLOSE, 1) | 引数にシンボル・時間足・適用価格・シフトが必要 |
ta.sma(close, 20) | iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 1) | MA種類(MODE_SMA等)の明示が必要 |
ta.ema(close, 20) | iMA(NULL, 0, 20, 0, MODE_EMA, PRICE_CLOSE, 1) | MODE_EMAを指定 |
ta.macd(close,12,26,9) のMACDライン | iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 1) | MAIN/SIGNALをモード指定で個別に取得 |
ta.macd(close,12,26,9) のシグナルライン | iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_SIGNAL, 1) | MODE_SIGNAL |
ta.atr(14) | iATR(NULL, 0, 14, 1) | ほぼ同じだが引数構成が違う |
ta.bb(close, 20, 2) の上限 | iBands(NULL, 0, 20, 2, 0, PRICE_CLOSE, MODE_UPPER, 1) | UPPER/MAIN/LOWERを個別に取得 |
ta.bb(close, 20, 2) の下限 | iBands(NULL, 0, 20, 2, 0, PRICE_CLOSE, MODE_LOWER, 1) | MODE_LOWER |
ta.stoch(14, 3, 3) のK | iStochastic(NULL, 0, 14, 3, 3, MODE_SMA, 0, MODE_MAIN, 1) | 引数が多い |
ta.cci(close, 14) | iCCI(NULL, 0, 14, PRICE_CLOSE, 1) |
AIに的確な修正指示を出すプロンプト:
以下のコンパイルエラーが出ています。
【エラーメッセージ】
'ta.rsi' - function is not defined
【コードの該当箇所】
double rsi = ta.rsi(close, 14);
MQL4にta.rsi()関数は存在しません。
iRSI(NULL, 0, 14, PRICE_CLOSE, 1) に書き換えてください。
iRSI()の引数は (symbol, timeframe, period, applied_price, shift) の5つです。
修正後のコード全文を出力してください。
よくあるエラー早見表②:過去バー参照の違い
| やりたいこと | Pine Script | MQL4 |
|---|---|---|
| 現在バーのRSI値 | rsiValue (変数) | iRSI(NULL, 0, 14, PRICE_CLOSE, 0) |
| 1本前のRSI値 | rsiValue[1] | iRSI(NULL, 0, 14, PRICE_CLOSE, 1) |
| 3本前の終値 | close[3] | Close[3] または iClose(NULL, 0, 3) |
よくあるエラーのパターン:
AIが rsi[1] をMQL4でも添え字形式で書いてしまい、コンパイルエラーが発生するケースがあります。
// ❌ MQL4でこれはエラー(rsiはdouble型のスカラー値であり配列ではない)
double rsi = iRSI(NULL, 0, 14, PRICE_CLOSE, 0);
if(rsi[1] < 30) // エラー:rsiは配列じゃない
// ✅ 正しい書き方
double rsiCurrent = iRSI(NULL, 0, 14, PRICE_CLOSE, 0); // 現在バー
double rsiPrev = iRSI(NULL, 0, 14, PRICE_CLOSE, 1); // 1本前
if(rsiPrev < 30)
修正プロンプト:
以下のコードで「[] - array access to a non-array」エラーが出ます。
rsiなどの変数は配列ではないため、添え字でアクセスできません。
過去バーの値を取得するにはiRSI()のshift引数を使ってください。
修正後のコード全文を出力してください。
よくあるエラー早見表③:注文関数の違い
Pine ScriptとMQL4で最も記述量が違う部分です。
| 操作 | Pine Script | MQL4 |
|---|---|---|
| 買いエントリー | strategy.entry("Long", strategy.long) | OrderSend(Symbol(), OP_BUY, lots, Ask, 3, sl, tp, comment, magic, 0, clrGreen) |
| 売りエントリー | strategy.entry("Short", strategy.short) | OrderSend(Symbol(), OP_SELL, lots, Bid, 3, sl, tp, comment, magic, 0, clrRed) |
| ポジション全決済 | strategy.close("Long") | OrderSelect→OrderCloseのループ処理が必要 |
| 特定ロット数の決済 | strategy.close("Long", qty=0.1) | OrderCloseで特定のticket番号を指定 |
Pine Scriptは1行で完結する注文関数に対し、MQL4のOrderSendは11個の引数が必要です。AIが引数を省略したり間違えたりすることが多い箇所です。
AIへの修正指示で使う定型文:
OrderSend()の引数が間違っています。
MT4 Build 600以降の正しい引数は以下の11個です:
OrderSend(symbol, cmd, volume, price, slippage, stoploss, takeprofit, comment, magic, expiration, arrow_color)
- symbol: Symbol()
- cmd: OP_BUY または OP_SELL
- volume: ロット数(double)
- price: 買いはAsk、売りはBid
- slippage: スリッページ(例:3)
- stoploss: ストップロス価格(0なら設定なし)
- takeprofit: テイクプロフィット価格(0なら設定なし)
- comment: 文字列(例:"EA_buy")
- magic: マジックナンバー(int)
- expiration: 0(有効期限なし)
- arrow_color: clrGreenなど
上記に従ってOrderSend()を修正し、コード全文を出力してください。
よくあるエラー早見表④〜⑥:構文・変数・組み込み変数
④ 条件分岐の構文の違い
| Pine Script | MQL4 | |
|---|---|---|
| ブロックの区切り | インデント(Python風) | {}(C言語風) |
AIがPine Scriptのインデント式をMQL4に変換する際に、{}を省略してしまうことがあります。
// ❌ MQL4でこれはエラー(波括弧がない)
if(condition)
OrderSend(...);
Print("Entry"); // これはif文の外に出てしまう
// ✅ 正しい書き方
if(condition)
{
OrderSend(...);
Print("Entry");
}
⑤ 変数の持続性の違い
| Pine Script | MQL4 | |
|---|---|---|
| バーをまたいで値を保持 | var float myVar = 0 | static double myVar = 0;(関数内)またはグローバル変数 |
Pine Scriptの var キーワードをMQL4にそのまま書くとエラーになります(MQL4にvarは存在しません)。
// ❌ MQL4に var はない
var double lastSignal = 0;
// ✅ 正しい書き方(バーをまたいで値を保持したい場合)
static double lastSignal = 0; // static宣言で関数をまたいで保持
⑥ 組み込み変数の対応表
| Pine Script | MQL4 | 説明 |
|---|---|---|
close | Close[0] | 現在バーの終値(未確定) |
close[1] | Close[1] | 1本前の確定終値 |
open | Open[0] | 現在バーの始値 |
high | High[0] | 現在バーの高値 |
low | Low[0] | 現在バーの安値 |
volume | Volume[0] | 出来高 |
bar_index | Bars - 1 - i(ループ内) | バー番号(向きが逆) |
na | EMPTY_VALUE | 欠損値 |
syminfo.mintick | MarketInfo(Symbol(), MODE_TICKSIZE) | 最小ティックサイズ |
syminfo.pointvalue | MarketInfo(Symbol(), MODE_TICKVALUE) | ポイント価値 |
AIに的確に修正させるプロンプトテンプレート
❌ 悪い指示の例
エラーが出ました。直してください。
これでは何のエラーか、何を期待しているか、AIには何もわかりません。
✅ 良い指示の例
MQL4のコンパイルで以下のエラーが出ています。
【エラーメッセージ】
行43: 'ta.rsi' - function is not defined
【コードの該当行】
double rsiVal = ta.rsi(close, 14);
【原因と期待する修正】
MQL4にta.rsi()は存在しません。
MQL4ではiRSI(symbol, timeframe, period, applied_price, shift)を使います。
確定バー(shift=1)で取得するよう修正してください。
修正後のコード全文を出力してください。
「エラーメッセージ + 原因の推測 + 期待する修正方向」の3点セットで指示するのが最も効果的です。
まとめ:この早見表をブックマーク
Pine Script → MQL4変換エラーの主な原因と対処をまとめます。
| エラーの原因 | 対処法 |
|---|---|
ta.xxx() 関数が存在しない | MQL4の対応関数に書き換え(上記対応表参照) |
| 配列添え字エラー | iRSI(..., N) のshift引数で過去バーを指定 |
| OrderSendの引数エラー | 11引数のテンプレートで修正指示を出す |
var キーワードエラー | static宣言またはグローバル変数に変換 |
| 波括弧なしのif文 | {}を追加 |
エラーが出たらこの表で原因を特定し、「エラーメッセージ + 原因 + 修正方向」の3点セットをAIに渡してください。ほとんどのエラーはこれで一発で解決します。
さらに効率よく、高精度なEAを完成させたい方へ
複数のインジケータを組み合わせた時のロジックの構築方法を含めた、AIによるEA作成の精度を高める専用プロンプトをダウンロードできます。
随時アップデートも行なっています。最速で始めたい方はこちらからプロンプトを受け取ってください。
関連記事
- AIに1回頼むだけでEAが作れる
- インジケーターをAIに伝わる売買条件に変換する技術
- TradingViewのインジケーターのソースコードを読んでEAにする方法
- MetaEditorの使い方 — AIのコードをMT4で動かすまで
- AIが出したコードにエラーが出た時のデバッグプロンプト集
- AIへのプロンプト、日本語と英語どっちがいい?
本記事で紹介するEA・手法は教育目的で作成されたものです。実際の取引で利益を保証するものではありません。EAの運用は必ずデモ口座で十分にテストした上で、自己責任で行ってください。FX取引にはリスクが伴います。
次のステップ
まずデモで動作確認 → OKなら本番運用、が安全です。
デモ口座でEAを回す手順関連記事
TradingViewストラテジーテスターの使い方 — AI活用バックテスト
MT4より手軽にバックテストできるTradingViewのストラテジーテスターの使い方を解説。AIにPine Scriptを書かせて結果を確認するまでの手順を紹介。
TradingViewのアラート機能をEAの代わりに使う方法
EAを作らなくてもTradingViewのアラート+Webhookで半自動売買が実現できます。設定手順とEAとの使い分けを具体的に解説。
TradingViewの無料 vs 有料、EA開発に必要なプランはどれ?
EA開発のワークフロー別に、TradingViewの各プランで何ができるかを具体的に解説。アイデア出し・バックテスト・アラート連携など段階ごとに必要なプランを明確化。
複数条件を組み合わせたEAの作り方 — RSI+MACD+移動平均線の実例
単一インジのEAからステップアップ。AND/OR結合の考え方と、RSI・MACD・SMA200を組み合わせた実例プロンプト・バックテスト比較を解説します。
