この記事でできるようになること
- EA作成プロンプトの「基本形」が分かり、仕様シートから組み立てられる
- 3種類の実例(RSI逆張り/移動平均線クロス/ボリンジャーバンド順張り)をそのまま使える
- コードを省略させずに、1ファイルで出力させるコツが分かる
- 実際の口座で注文が通るように、【出力の条件】で安全装置をまとめて指示できる
- その指示がなぜ必要なのかを、エラーの中身とセットで説明できる
準備するもの
- 前の記事で書いた仕様シート
- ChatGPTにログインしたブラウザ
手順
手順1 プロンプトの基本形を知る
プロンプトとは、AIへの指示文のことです。EA作成のプロンプトは、次の4つのブロックを上から順に並べるだけです。
| 順番 | ブロック | 書くこと |
|---|---|---|
| 1 | 役割 | 「あなたはMQL4のプロのプログラマーです」と最初に宣言する |
| 2 | 環境 | MT4で動くこと、言語はMQL4であること(MQL5ではない) |
| 3 | 仕様 | 前の記事の7項目(買い・売りを分けて8行) |
| 4 | 出力の条件 | 省略しない、後で変えたい数値はinput変数にする、実際の口座で注文が通るための安全装置を入れる、など |
「役割」と「環境」は毎回同じ文章でかまいません。変わるのは「仕様」だけです。「出力の条件」も基本は固定の文章で、EAに応じて「input変数(後からMT4の画面で変えられる設定値)にしたい項目」を書き換える程度です。この「出力の条件」が、動くEAと動かないEAの分かれ目になります。手順4でくわしく説明します。
手順2 良い例と悪い例を見比べる
同じ「RSI逆張りのEA」を頼むにしても、書き方で返ってくるものは大きく変わります。
悪い例:
RSIで逆張りするEAを作って。
この頼み方だと、AIは足りない情報を勝手に補います。通貨ペアも損切りも指定していないので、損切りなしのEAが返ってきたり、MT4では動かないMQL5のコードが返ってきたりします。
良い例(骨組みだけ):
あなたはMQL4のプロのプログラマーです。
MT4で動くEAをMQL4で作成してください(MQL5の文法は使わないでください)。
仕様: USDJPY・1時間足。RSI(14)が30を割り込んだら買い、70を上回ったら売り。利確50pips、損切り30pips。0.1ロット固定。同時1ポジション。マジックナンバー12345。
コードは省略せず、1ファイルの完全な形で出力してください。
違いは3つです。
- 環境(MT4・MQL4)を明記している
- 数値がすべて入っている
- 出力の形(省略しない・1ファイル)を指定している
この良い例を、誰でも書き換えやすいように整理し、さらに「実際の口座で注文が通るための条件」を足したものが、次の実例1です。
手順3 実例1: RSI逆張りEA(基本の雛形)
RSIは「買われすぎ・売られすぎ」を0〜100で表す指標で、一般的な目安として30以下が売られすぎ、70以上が買われすぎとされます。逆張りとは、下がりすぎたところで買い、上がりすぎたところで売る考え方です。このスクールのサンプルEAと同じルールです。
これがこのスクールの基本プロンプトです。【 】の中だけ書き換えれば、どんなEAにも使えます。まずはこのまま使ってください。長く見えますが、書き換えるのは【仕様】の8行だけで、【出力の条件】は毎回そのままコピーします。
あなたはMQL4のプロのプログラマーです。
MetaTrader 4(MT4)で動くEA(エキスパートアドバイザ)を作成してください。
【環境】
- プラットフォーム: MT4
- 言語: MQL4(MQL5の文法は使わないでください)
【仕様】
1. 通貨ペア・時間足: 【USDJPY・1時間足】
2. 買いエントリー条件: 【RSI(14)が30を上から下に割り込んだとき(売られすぎ)】
3. 売りエントリー条件: 【RSI(14)が70を下から上に抜けたとき(買われすぎ)】
4. 決済条件: 【利確 50pips、損切り 30pips。買いポジションはRSI(14)が70以上になったら、売りポジションはRSI(14)が30以下になったら成行で決済】
5. ロット数: 【0.1ロット固定】
6. 同時ポジション数: 【1つまで】
7. 取引時間帯: 【制限なし】
8. マジックナンバー: 【12345】
【出力の条件】
■ 基本
- MQL4で書いてください。MQL5の文法(CTradeクラス、MqlTradeRequestなど)を混ぜないでください
→ MT4はMQL4しか動きません。混ざるとコンパイルが通りません
- コードは省略せず、1ファイルの完全な形で出力してください
→ 「// 以下同様」で省かれた部分は、初心者には補えません
- 後から変えたい数値(RSIの期間、買い・売りの水準、利確・損切り幅、ロット数、スリッページ、マジックナンバー)は input 変数にしてください
→ MT4の設定画面から書き換えられるようになります
- 売買の判定は確定した足(1本前と2本前)で行ってください
→ 形成中の足で判定すると、一瞬だけ条件を満たしてすぐ戻る「だまし」で無駄な注文が増えます
■ 業者ごとの違いへの対応
- Digits を見て1pipの価格幅を求めてください。Digits が 3 または 5 なら 1pip = Point * 10、それ以外は 1pip = Point とします
→ 5桁表示の業者では Point が1pipの10分の1です。この処理がないと「損切り30pips」が3pipsになってしまいます
- スリッページは input で pips 単位で受け取り、内部でポイント単位に換算して OrderSend に渡してください
→ 理由は上と同じです。pipsのままポイント欄に入れると、許容できる幅が10分の1になります
- ロット数は MarketInfo(Symbol(), MODE_MINLOT) / MODE_MAXLOT / MODE_LOTSTEP を見て、その口座で使える値に丸めてください
→ 最小・最大・刻み幅から外れたロットは error 131(ロット数が不正)で拒否されます
- 損切り・利確は MarketInfo(Symbol(), MODE_STOPLEVEL) と MarketInfo(Symbol(), MODE_FREEZELEVEL) を確認し、
指定した幅がこの最小距離より近い場合は、最小距離まで押し広げてください
→ 業者が決めた最小距離より近い損切り・利確は error 130 で拒否されます
■ 発注前のチェック
- 発注前に IsTradeAllowed()、IsConnected()、IsTradeContextBusy() を確認し、
ひとつでも不可なら発注せず、理由をログに出して見送ってください
→ 自動売買OFF、回線切断、他のEAが処理中のときに、無駄な失敗を繰り返さないためです
- 発注の直前に RefreshRates() を呼んで、価格を取り直してから OrderSend してください
→ 古い価格のまま注文すると error 129(価格が正しくない)や error 138(リクオート)になります
- AccountFreeMarginCheck(Symbol(), 売買種別, ロット) で証拠金が足りるか確認し、
足りなければ発注せずログを出してください
→ 証拠金不足は error 134 になります
- スプレッドが広すぎるときは新規注文しないフィルターを入れ、しきい値(pips)を input にしてください
→ 指標発表の直後などはスプレッドが大きく開き、不利な価格で約定しやすくなります
■ 注文が失敗したときの処理
- 注文が失敗したら GetLastError() でエラー番号を取り、
やり直す価値のあるエラー(4, 6, 128, 129, 135, 136, 137, 138, 146)のときだけ、
少し待って(0.5〜1秒)最大3回まで再試行してください。それ以外のエラーは繰り返さず中止してください
→ 一時的な混雑や価格変動は、やり直せば通ります。設定ミスが原因のエラーは何度出しても通りません
- 損切り・利確つきの注文が error 130 で失敗したときは、いったん損切り・利確なしで発注し、
約定後に OrderModify で損切り・利確を付け直してください
→ 注文と同時の損切り・利確の設定を受け付けない業者があるためです
- 決済(OrderClose)も同じ考え方で、失敗したら再試行してください
■ 起動直後の安全策
- OnInit で「最後に判定した足の時刻」を、現在の足の時刻(Time[0])で初期化してください
→ これがないと、EAをチャートに乗せた瞬間に、過去に出ていたシグナルでいきなり発注してしまいます
- 計算に必要な本数の足が揃うまで(例: Bars が RSI の期間+数本に満たない間)は、売買判定をしないでください
→ 足が足りないと指標の計算結果が0になり、誤った売買判定になります
- input の値が明らかにおかしい場合(期間が0以下など)は、OnInit で警告を出して停止してください
■ 注文の管理とログ
- 自分のEAが出した注文だけを、マジックナンバーと通貨ペアの両方で見分けてください
→ 手動の注文や他のEAの注文を、誤って決済しないためです
- 注文の成功・失敗の両方を Print() でログに出してください。失敗時はエラー番号と、その意味の日本語も出してください
→ MT4の「エキスパート」タブを見るだけで、動かない原因が分かるようになります
- コードの後に、各部分が何をしているかを初心者向けに日本語で簡単に説明してください
「確定した足で判定」というのは、ローソク足が完成してから判定する、という意味です。形成中の足で判定すると、一瞬だけ条件を満たしてすぐ戻る「だまし」で無駄な注文が増えるため、こう書いておきます。
このプロンプトの仕様は、第4章で使うサンプルEA「RSI_Reversal_Sample.mq4」と同じ内容です。AIの回答がサンプルと少し違うコードになっても心配いりません。書き方は毎回変わりますが、動作が同じになるように指示しているからです。
手順4 なぜ【出力の条件】がこんなに長いのか
実例1の【出力の条件】は、よくある「EAの作らせ方」の記事で見かけるものより、ずいぶん長いはずです。ここには理由があります。
AIに細かく指示をしないと、返ってくるのは「教科書どおりのきれいなコード」です。ところが実際のFX口座は、教科書どおりではありません。業者によって価格の表示けたが違い、注文できるロットの刻みが違い、損切りを置ける最短距離も違います。サーバーが混んでいて注文が弾かれることもあります。こうした現実への備えが入っていないEAは、コンパイル(コードをEAの形に変換する作業)は通るのに、動かすと注文が1回も通らないということが起こります。しかも画面上はエラーらしいエラーが出ないので、初心者ほど原因にたどり着けません。
【出力の条件】は、その備えをまとめてAIに頼むための文章です。主なものを、「この指示がないと何が起きるか」と並べます。読み飛ばしてもプロンプトは使えますが、一度目を通しておくと、MT4のログを見たときに何が起きているか分かるようになります。
| プロンプトに入れる指示 | この指示がないと起きること |
|---|---|
| Digits を見て1pipの価格幅を求める | ドル円を3桁(0.001刻み)で表示する業者では、価格の最小単位が1pipの10分の1です。この計算がないと「損切り30pips」のつもりが3pipsになり、入った直後に損切りにかかります。 |
| スリッページをpipsからポイントに換算する | 同じ理由で、許容するズレが10分の1になります。ほんの少し価格が動いただけで注文が弾かれ、エントリーできません。 |
| MODE_STOPLEVEL と MODE_FREEZELEVEL を確認する | 業者は「今の価格からこれ以上離さないと損切り・利確は置けません」という最短距離を決めています。近すぎると error 130 が出て、注文そのものが拒否されます。 |
| error 130 のときは、損切り・利確なしで発注してから OrderModify で付け直す | 注文と同時の損切り・利確設定を受け付けない業者があります。この逃げ道がないと、その業者では何度試しても注文が通りません。 |
| MODE_MINLOT / MODE_MAXLOT / MODE_LOTSTEP でロットを丸める | 口座で決められた最小ロットや刻み幅から外れた数量は error 131 で拒否されます。0.01刻みの口座に0.015ロットを出すような状態です。 |
| AccountFreeMarginCheck で証拠金を確認する | 資金が足りないまま注文すると error 134 になります。先に確認しておけば、原因がログに残り、ロットを下げればよいと分かります。 |
| IsTradeAllowed() / IsConnected() / IsTradeContextBusy() を確認する | 「自動売買がOFF」「回線が切れている」「別のEAが注文処理中」という、そもそも注文できない3つの状態を見分けられません。原因不明のまま失敗し続けます。 |
| 発注の直前に RefreshRates() を呼ぶ | EAが持っている価格は、判定した瞬間のものです。古い価格のまま注文すると error 129(価格が正しくない)や error 138(リクオート=価格の出し直し)になります。 |
| やり直す価値のあるエラーだけ、最大3回まで再試行する | 混雑や価格変動が原因の失敗は、少し待てば通ります。一方で設定ミスが原因の失敗は何度出しても通りません。区別しないと、同じ失敗を延々と繰り返してログが埋まります。 |
| スプレッドが広すぎるときは新規注文しない | 経済指標の発表直後などは、売値と買値の差(スプレッド)が数倍に開きます。そこで注文すると、入った瞬間に大きな含み損を抱えます。 |
| OnInit で「最後に判定した足の時刻」を今の足で初期化する | EAをチャートに乗せた瞬間に、過去に出ていたシグナルでいきなり注文が入ります。自分が想定していないタイミングでポジションを持つ、いちばん驚くパターンです。 |
| 必要な本数の足が揃うまで判定しない(Bars の確認) | RSIの計算に必要な本数が足りないと、指標の値が0で返ってきます。その0を見て「売られすぎだ」と誤判定し、根拠のない注文を出します。 |
エラー番号をすべて覚える必要はありません。130は損切り・利確が近すぎる、131はロット数、134は証拠金不足。この3つだけ頭の片隅に置いておけば、MT4の「エキスパート」タブのログを見たときに見当がつきます。第7章のトラブル対応でも同じ番号が出てきます。
もうひとつ大事なことがあります。指示が長くなるほど、AIは一部を書き落とします。そのため、コードが返ってきたら、付録Bの「7. 生成されたEAの安全確認プロンプト」でもう一度点検してください。上の項目を18のチェックリストにしたもので、AI自身にコードと照らし合わせさせ、抜けていれば直したコードを出させるプロンプトです。
なお、これらの安全装置は「注文が正しく出せるようにする」ためのものです。相場の値動きによる損益とは別の話で、成績を良くするものでも、損失を防ぐものでもありません。実口座に進む前に、必ずデモ口座で動作を確かめてください。
手順5 実例2: 移動平均線クロスEA
移動平均線は、直近N本分の終値の平均を線でつないだものです。期間の短い線が長い線を下から上に抜けることを「ゴールデンクロス」、上から下に抜けることを「デッドクロス」と呼び、これを売買の合図とする考え方があります。
実例1と違うのは【仕様】の中身と、input変数にする項目だけです。役割・環境・出力の条件はそのまま流用します。下のプロンプトでは【出力の条件】を短く書いていますが、送るときは実例1の【出力の条件】を丸ごと貼り付けてください。ここを省くと、実際の口座で注文が通らないEAになります。
あなたはMQL4のプロのプログラマーです。
MetaTrader 4(MT4)で動くEA(エキスパートアドバイザ)を作成してください。
【環境】
- プラットフォーム: MT4
- 言語: MQL4(MQL5の文法は使わないでください)
【仕様】
1. 通貨ペア・時間足: 【USDJPY・1時間足】
2. 買いエントリー条件: 【短期移動平均線(20)が長期移動平均線(50)を下から上に抜けたとき】
3. 売りエントリー条件: 【短期移動平均線(20)が長期移動平均線(50)を上から下に抜けたとき】
4. 決済条件: 【利確 50pips、損切り 30pips。反対のクロスが出たら成行で決済】
5. ロット数: 【0.1ロット固定】
6. 同時ポジション数: 【1つまで】
7. 取引時間帯: 【制限なし】
8. マジックナンバー: 【12346】
【出力の条件】
- 実例1の【出力の条件】をそのまま貼り付けてください(安全装置の指示が全部入っています)
- 加えて、短期・長期それぞれの移動平均の期間も input 変数にしてください
マジックナンバーは実例1と変えています(12346)。同じMT4で2つのEAを動かしたときに、お互いの注文を区別するためです。
手順6 実例3: ボリンジャーバンド順張りEA
ボリンジャーバンドは、移動平均線の上下に「値動きの幅」を示す線(バンド)を引いた指標です。順張りは、勢いが出た方向についていく考え方で、ここでは「終値が上のバンドを超えて確定したら買い、下のバンドを割って確定したら売り」というルールにします。
あなたはMQL4のプロのプログラマーです。
MetaTrader 4(MT4)で動くEA(エキスパートアドバイザ)を作成してください。
【環境】
- プラットフォーム: MT4
- 言語: MQL4(MQL5の文法は使わないでください)
【仕様】
1. 通貨ペア・時間足: 【USDJPY・1時間足】
2. 買いエントリー条件: 【ボリンジャーバンド(期間20、偏差2)の上バンドを、終値が上回って確定したとき】
3. 売りエントリー条件: 【ボリンジャーバンド(期間20、偏差2)の下バンドを、終値が下回って確定したとき】
4. 決済条件: 【利確 60pips、損切り 30pips。買いポジションは終値がミドルバンド(中央の移動平均線)を下回って確定したら、売りポジションは終値がミドルバンドを上回って確定したら成行で決済】
5. ロット数: 【0.1ロット固定】
6. 同時ポジション数: 【1つまで】
7. 取引時間帯: 【制限なし】
8. マジックナンバー: 【12347】
【出力の条件】
- 実例1の【出力の条件】をそのまま貼り付けてください(安全装置の指示が全部入っています)
- 加えて、ボリンジャーバンドの期間と偏差も input 変数にしてください
3つの実例を並べると、変わっているのは仕様の8行と、input変数の指定だけだと分かります。自分のEAを作るときも、この2か所を仕様シートから書き換え、【出力の条件】は実例1からそのままコピーするだけです。
なお、これらの実例は「プロンプトの書き方」を示すためのもので、この設定で利益が出ることを示すものではありません。成績は第5章のバックテストで確かめます。
手順7 コードを省略させないコツ
AIは長いコードを出すとき、途中を「// 以下同様」「// …省略」のように省くことがあります。省かれたコードはコンパイル(第4章)できないので、次の4つを毎回守ってください。
- 「省略せず、1ファイルの完全な形で」を必ず書く(雛形には入っています)
- 「MT4で」「MQL4で」を毎回書く(書かないとMQL5の書き方が混ざります)
- 1回のやりとりで頼むのは、1つのEA・1つの変更だけ
- それでも途中で切れたら、「続きを出力して」ではなく「最初から最後まで、省略せずにもう一度出力してください」と頼む(続きだけもらうと、つなぎ目でミスが起きやすいです)
- 【出力の条件】は長くても削らない。長さを理由に削ると、手順4で挙げた安全装置ごと抜け落ちます
手順8 ChatGPTに送信する
- ChatGPTを開き、サイドバーの「新しいチャット」を押して、まっさらな会話を始めます。要確認 前の会話が混ざると、以前の指示に引きずられることがあります。
- 実例1のプロンプトをコピーして、入力欄に貼り付けます。改行はそのまま保たれます。
- 送信します([Enter] または送信ボタン)。
- 数十秒待つと、コードと日本語の解説が返ってきます。
返ってきたコードをどう受け取るかは、次の記事で説明します。ここでは「送信できて、何か返ってきた」ところまでで大丈夫です。
つまずきポイント
- 【 】を残したまま送ってしまった: 【 】は「ここを書き換える」印です。残したままでもAIはだいたい理解しますが、送るときは【 】ごと自分の値に置き換えるのが確実です(「【USDJPY・1時間足】」→「USDJPY・1時間足」)。
- MQL5のコードが返ってくる: 「MT4」「MQL4」が抜けていないか確認し、「MQL4で書き直してください」と返します。見分け方は第4章で説明します。
- 途中で出力が止まる: 無料プランの制限か、出力が長すぎるのが原因です。「最初から省略せずにもう一度」と頼むか、少し時間をおいてから再送します。
- 英語の解説が返ってくる: 「解説は日本語で」と一言添えてください。
- 自分の戦略を入れたら、AIから質問で返された: 仕様があいまいなサインです。「〜のとき」と数値で書けているか、仕様シートに戻って見直します。
- 【出力の条件】が長すぎて不安になる: そのままで大丈夫です。AIは長い指示でも受け取れます。むしろ削るほうが危険で、実際の口座で注文が通らない原因になります。
- 返ってきたコードに、安全装置が入っているか分からない: 付録Bの「7. 生成されたEAの安全確認プロンプト」に、そのコードを貼り付けて点検させてください。18項目を一つずつ確認してくれます。
次の記事
次は、返ってきたコードと解説の受け取り方(コピーの仕方、分からない部分の聞き返し方)を説明します。