【コピペOK】移動平均線クロスEAの作り方|ゴールデンクロス・デッドクロスで自動売買
「移動平均線のクロスで売買したいけど、ずっとチャート見てられない...」
そんなあなたのために、ゴールデンクロスで買い、デッドクロスで売るEAを作ります。
この記事のコードはコピペでそのまま動きます。まずは動かしてみて、そのあと中身を理解していきましょう。
移動平均線クロス戦略とは?
超有名な王道戦略です。
- ゴールデンクロス:短期MAが長期MAを下から上に突き抜ける → 買いサイン
- デッドクロス:短期MAが長期MAを上から下に突き抜ける → 売りサイン
シンプルだけど、トレンドフォローの基本中の基本。これを自動化します。
完成コード(コピペOK)
まずは完成版コードです。MetaEditorに貼り付けて、F7でコンパイルすれば動きます。
//+------------------------------------------------------------------+//| MA Cross EA - 移動平均線クロスで自動売買 |//+------------------------------------------------------------------+#property copyright "Your Name"#property version "1.00"#property strict
//--- 入力パラメータinput int FastMA_Period = 5; // 短期MA期間input int SlowMA_Period = 20; // 長期MA期間input double LotSize = 0.01; // ロット数input int StopLoss = 50; // 損切り(pips)input int TakeProfit = 100; // 利確(pips)input int MagicNumber = 12345; // マジックナンバー
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+int OnInit() { Print("MA Cross EA 起動!"); Print("短期MA: ", FastMA_Period, " / 長期MA: ", SlowMA_Period); return(INIT_SUCCEEDED); }
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+void OnTick() { // 既存ポジションがあれば何もしない(1ポジション限定) if(CountMyPositions() > 0) return;
// 移動平均線の値を取得 double fastMA_current = iMA(NULL, 0, FastMA_Period, 0, MODE_SMA, PRICE_CLOSE, 0); double fastMA_prev = iMA(NULL, 0, FastMA_Period, 0, MODE_SMA, PRICE_CLOSE, 1); double slowMA_current = iMA(NULL, 0, SlowMA_Period, 0, MODE_SMA, PRICE_CLOSE, 0); double slowMA_prev = iMA(NULL, 0, SlowMA_Period, 0, MODE_SMA, PRICE_CLOSE, 1);
// ゴールデンクロス判定(短期MAが長期MAを下から上に突き抜けた) if(fastMA_prev < slowMA_prev && fastMA_current > slowMA_current) { Print("★ゴールデンクロス検出!買いエントリー"); OpenBuy(); }
// デッドクロス判定(短期MAが長期MAを上から下に突き抜けた) if(fastMA_prev > slowMA_prev && fastMA_current < slowMA_current) { Print("★デッドクロス検出!売りエントリー"); OpenSell(); } }
//+------------------------------------------------------------------+//| 買い注文を出す |//+------------------------------------------------------------------+void OpenBuy() { double sl = Ask - StopLoss * Point * 10; double tp = Ask + TakeProfit * Point * 10;
int ticket = OrderSend( Symbol(), // 通貨ペア OP_BUY, // 買い注文 LotSize, // ロット数 Ask, // 買値 3, // スリッページ sl, // 損切り tp, // 利確 "MA Cross Buy", // コメント MagicNumber, // マジックナンバー 0, // 有効期限 clrGreen // 矢印の色 );
if(ticket < 0) Print("買い注文エラー: ", GetLastError()); else Print("買い注文成功!チケット: ", ticket); }
//+------------------------------------------------------------------+//| 売り注文を出す |//+------------------------------------------------------------------+void OpenSell() { double sl = Bid + StopLoss * Point * 10; double tp = Bid - TakeProfit * Point * 10;
int ticket = OrderSend( Symbol(), // 通貨ペア OP_SELL, // 売り注文 LotSize, // ロット数 Bid, // 売値 3, // スリッページ sl, // 損切り tp, // 利確 "MA Cross Sell", // コメント MagicNumber, // マジックナンバー 0, // 有効期限 clrRed // 矢印の色 );
if(ticket < 0) Print("売り注文エラー: ", GetLastError()); else Print("売り注文成功!チケット: ", ticket); }
//+------------------------------------------------------------------+//| このEAのポジション数を数える |//+------------------------------------------------------------------+int CountMyPositions() { int count = 0; for(int i = 0; i < OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) count++; } } return count; }//+------------------------------------------------------------------+動かし方
1. コードをコピー
上のコードをすべてコピーします。
2. MetaEditorで新規ファイル作成
- MT4でF4キー → MetaEditor起動
- ファイル → 新規作成 → エキスパートアドバイザ
- 名前を「MACrossEA」にして完了
- 生成されたコードを全部消して、コピーしたコードを貼り付け
3. コンパイル
F7キーを押す。「0 error(s)」と出ればOK。
4. チャートにセット
- MT4に戻る
- ナビゲーターから「MACrossEA」をチャートにドラッグ
- 「自動売買を許可する」にチェック
- OKをクリック
5. 自動売買をON
MT4上部の「自動売買」ボタンをクリックして緑色に。
これで、ゴールデンクロス/デッドクロスが発生するたびに自動で売買します!
コードを1行ずつ理解しよう
入力パラメータ部分
input int FastMA_Period = 5; // 短期MA期間input int SlowMA_Period = 20; // 長期MA期間input double LotSize = 0.01; // ロット数input int StopLoss = 50; // 損切り(pips)input int TakeProfit = 100; // 利確(pips)input int MagicNumber = 12345; // マジックナンバーinputをつけると、EAをチャートにセットする時に画面から変更できるパラメータになります。
- FastMA_Period: 短期移動平均の期間(デフォルト5)
- SlowMA_Period: 長期移動平均の期間(デフォルト20)
- LotSize: 1回の取引量(0.01 = 1000通貨)
- StopLoss: 損切り幅(50pips)
- TakeProfit: 利確幅(100pips)
- MagicNumber: このEAの識別番号
移動平均線の取得
double fastMA_current = iMA(NULL, 0, FastMA_Period, 0, MODE_SMA, PRICE_CLOSE, 0);double fastMA_prev = iMA(NULL, 0, FastMA_Period, 0, MODE_SMA, PRICE_CLOSE, 1);iMA()関数で移動平均の値を取得します。
- 最後の数字
0= 現在の足 - 最後の数字
1= 1本前の足
currentとprevを比較することで、クロスを検出します。
ゴールデンクロス判定
if(fastMA_prev < slowMA_prev && fastMA_current > slowMA_current)これを日本語にすると:
「1本前は短期MAが長期MAより下にあった」かつ「現在は短期MAが長期MAより上にある」
→ つまり、下から上に突き抜けた = ゴールデンクロス!
注文の出し方
int ticket = OrderSend( Symbol(), // 現在のチャートの通貨ペア OP_BUY, // 買い(OP_SELLなら売り) LotSize, // ロット数 Ask, // 価格(買いはAsk、売りはBid) 3, // スリッページ許容 sl, // 損切り価格 tp, // 利確価格 "MA Cross Buy", // 注文につけるコメント MagicNumber, // このEAの識別子 0, // 有効期限(0=無期限) clrGreen // チャート上の矢印の色);OrderSend()で注文を出します。成功するとチケット番号が返ってきます。
ポジション数のカウント
int CountMyPositions() { int count = 0; for(int i = 0; i < OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) count++; } } return count; }全注文をループして、このEAが出した注文だけを数えます。
OrderSymbol() == Symbol(): 同じ通貨ペアか?OrderMagicNumber() == MagicNumber: このEAが出した注文か?
カスタマイズしてみよう
MA期間を変える
短期MA=10、長期MA=50 にしたい場合:
EAをチャートにセットする画面で、パラメータを変更するだけ!コードを書き換える必要はありません。
EMA(指数移動平均)を使う
// MODE_SMA を MODE_EMA に変更double fastMA_current = iMA(NULL, 0, FastMA_Period, 0, MODE_EMA, PRICE_CLOSE, 0);エントリー時にアラートを鳴らす
if(fastMA_prev < slowMA_prev && fastMA_current > slowMA_current) { Alert("ゴールデンクロス発生!"); // この行を追加 Print("★ゴールデンクロス検出!買いエントリー"); OpenBuy(); }スプレッドが広いときはエントリーしない
void OnTick() { // スプレッドチェック(3pips以上なら見送り) double spread = (Ask - Bid) / Point / 10; if(spread > 3.0) { Print("スプレッド広すぎ: ", spread, "pips スキップ"); return; }
// 以下は同じ... }よくある質問
Q: エラー130が出る
A: 損切り/利確の値がおかしい。業者によって最低pips数が決まっています。StopLossとTakeProfitを大きくしてみてください。
Q: エラー131が出る
A: ロット数がおかしい。業者の最小ロット数を確認してください。0.01が最小の業者もあれば、0.1が最小の業者もあります。
Q: 全然エントリーしない
A: クロスが発生していないか、スプレッドフィルターに引っかかっている可能性。エキスパートタブのログを確認してください。
Q: 複数ポジション持ちたい
A: CountMyPositions() > 0の部分を変更:
// 3ポジションまで持てるようにするif(CountMyPositions() >= 3) return;注意点
⚠️ デモ口座で必ずテストしてください
このEAはシンプルな学習用です。実際の相場では:
- レンジ相場でダマシが多発する
- トレンドがないとひたすら負ける
- スプレッドが広いとコスト負けする
まずはデモで動作確認、次にバックテストで検証してから、本番運用を検討しましょう。
次のステップ
移動平均線クロスEAが動くようになりました!
次は**RSI(相対力指数)**を使った逆張りEAに挑戦しましょう。トレンドフォロー(順張り)と逆張り、両方のパターンを知ることで、戦略の幅が広がります。
📚 次に読む記事: RSI逆張りEAを作ろう
おめでとうございます!これであなたは実際に売買するEAを作れるようになりました。ここからが本当のスタートです。いろんな戦略を試して、自分だけのEAを育てていきましょう! 🚀
🎁おすすめツール・サービス
※上記リンクにはプロモーション(広告)が含まれています
量子相場謀略|ホソノP
ブログでは書けない本音のトレード戦略とEA開発の裏側を公開。 データに基づいた検証で、再現性のある手法だけをお届けします。