📊 TradingView → EA作成 #Pine Script #MQL4 #変換 #関数対応表 #コンパイルエラー

Pine Script → MQL4 変換でハマるポイント — 関数の違い早見表

(更新: 2026年1月25日) 読了 約7分

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 ScriptMQL4
実行タイミングバーが更新されるたびにスクリプト全体が再実行されるイベント駆動(OnTick、OnInit等の関数が個別に呼ばれる)
コードの書き方トップレベルに計算式を並べる関数の中に処理を書く

この違いにより、Pine Scriptで「トップレベルに書いた変数」がMQL4では「どこに書くか(グローバル?ローカル?)」の判断が必要になります。

データ参照の違い

Pine ScriptMQL4
現在バーの終値closeClose[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 ScriptMQL4注意点
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) のKiStochastic(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 ScriptMQL4
現在バーの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 ScriptMQL4
買いエントリー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 ScriptMQL4
ブロックの区切りインデント(Python風){}(C言語風)

AIがPine Scriptのインデント式をMQL4に変換する際に、{}を省略してしまうことがあります。

// ❌ MQL4でこれはエラー(波括弧がない)
if(condition)
   OrderSend(...);
   Print("Entry"); // これはif文の外に出てしまう

// ✅ 正しい書き方
if(condition)
{
   OrderSend(...);
   Print("Entry");
}

⑤ 変数の持続性の違い

Pine ScriptMQL4
バーをまたいで値を保持var float myVar = 0static double myVar = 0;(関数内)またはグローバル変数

Pine Scriptの var キーワードをMQL4にそのまま書くとエラーになります(MQL4にvarは存在しません)。

// ❌ MQL4に var はない
var double lastSignal = 0;

// ✅ 正しい書き方(バーをまたいで値を保持したい場合)
static double lastSignal = 0; // static宣言で関数をまたいで保持

⑥ 組み込み変数の対応表

Pine ScriptMQL4説明
closeClose[0]現在バーの終値(未確定)
close[1]Close[1]1本前の確定終値
openOpen[0]現在バーの始値
highHigh[0]現在バーの高値
lowLow[0]現在バーの安値
volumeVolume[0]出来高
bar_indexBars - 1 - i(ループ内)バー番号(向きが逆)
naEMPTY_VALUE欠損値
syminfo.mintickMarketInfo(Symbol(), MODE_TICKSIZE)最小ティックサイズ
syminfo.pointvalueMarketInfo(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作成の精度を高める専用プロンプトをダウンロードできます。

随時アップデートも行なっています。最速で始めたい方はこちらからプロンプトを受け取ってください。


関連記事


本記事で紹介するEA・手法は教育目的で作成されたものです。実際の取引で利益を保証するものではありません。EAの運用は必ずデモ口座で十分にテストした上で、自己責任で行ってください。FX取引にはリスクが伴います。

次のステップ

まずデモで動作確認 → OKなら本番運用、が安全です。

デモ口座でEAを回す手順
共有:

関連記事

#Pine Script #MQL4 #変換 #関数対応表 #コンパイルエラー

🎯 このEAを動かすにはMT4/MT5対応のFX口座が必要です

4つの質問に答えるだけで、あなたに最適な国内FX業者がわかります。

あなたに合った業者を診断する →
目次を表示