【MQL4】本格ナンピン&マーチンEAの無料配布|GOLD対応・一部ソースコード公開

本格ナンピン&マーチンEAを無料配布する記事のアイキャッチ画像。デグーキャラクターがロット倍率の階段(1・2・4・8)を指し示し、背景にGOLDチャートが薄く描かれている。
EA・MT4ノウハウ集
記事内に商品プロモーションを含む場合があります
スポンサーリンク

「ナンピンEAを作ってみたいけど、どこから手を付けたらいいか分からない…」
「ロット倍率やナンピン幅を自由に調整できるEAが欲しい」
そんな方のために、この記事では本格ナンピン&マーチンゲールEAを無料公開します。

今回のEAは、GOLD(ゴールド)含む複数通貨ペアで動作確認済み
ナンピン幅・ロット倍率・最大ポジション数・インジケーター(RSI / ストキャス)など、ナンピンに必要な設定をパラメータで自由に調整できます。

また、EAロジックの理解を深めたい方向けに、ソースコードの前半部分(エントリー判断・決済処理・ナンピン制御)も公開。
自作EAの学習素材としても最適な内容になっています。

📘 この記事で分かること
  • ナンピン&マーチンEAの基本構造
  • ロット倍率・ナンピン幅などの設定ポイント
  • GOLDで動かす際の注意点
  • ストキャス / RSI でのエントリー判定方法
  • サンプルソースコード(前半部)
  • 完全版(全コード)との違い

まずは、この無料版EAをダウンロードし、バックテストしながら動きを確認してみてください。
「ナンピンEAはどう作られているのか?」が理解できるよう、図解とサンプルコードでやさしく解説します。

※この記事では無料版EAと一部コードを公開しています(有料版の宣伝ではありません)。

📝 完全版EAと全ソースコードは note で公開中👇
特に「ロット制御・ナンピン管理」を学びたい方には必須レベルの教材です。


EAレポート結果

まずは、本EAを「GOLD(ゴールド)」と「AUD/CAD」でバックテストした結果をご紹介します。 通貨ペアごとの特性によって成績が大きく変わるため、EA運用の参考にしてください。

GOLD(ゴールド)

ゴールド(XAUUSD)でバックテストしたナンピンEAのレポート結果

2024年のゴールドでのバックテスト結果です。良い感じにプラスの結果となっています。

パラメータ設定はこんな感じです。

ナンピンEAのパラメータ設定例(ロット倍率・ナンピン幅など)

AUD/CAD

本EAはGOLD以外にも複数の通貨ペアで動作します。 特に AUD/CAD はボラティリティが穏やかで、 ナンピンEAとの相性が非常に良い結果となりました。 GOLDより安定した成績が出るケースもあるため、 ぜひ両通貨でバックテストして比較してみてください。

AUD/CADでバックテストしたナンピンEAのレポート結果

ダウンロード

EAファイルのダウンロードはこちら👇

📥 無料版ナンピン&マーチンEA をダウンロード
📝 完全版EA(ver2.0)は note で公開中
無料版では エントリー/決済/ナンピン制御の前半コード を公開していますが、 GOLD・AUDCADでPF2.0〜4.5を記録した完成版ロジック は note 限定です。
  • マジックナンバー完全対応(複数EAに必須)
  • ATRによるナンピン幅の自動調整(高ボラ通貨で強い)
  • GOLD専用の逆張りロジック搭載(急落→反発に強い)
  • 手動決済ボタンで運用の自由度アップ
  • 完全版ソースコード(全ロジック)付き
完全版EAをnoteでダウンロード(2,980円 → 30名限定)

※ver1.0購入者は追加料金なしでアップデート可能です。

ソースコード(一部)

以下ナンピンEAのサンプルソースコードの一部(前半部)になります。

//+------------------------------------------------------------------+
//|                                                    NANPIN-EA.mq4 |
//|                                    Copyright c 2020-2025 ぷろぐらむFX |
//|                                              https://fx-prog.com/|
//+------------------------------------------------------------------+
#property copyright "Copyright c 2020-2025 ぷろぐらむFX"
#property link      "https://fx-prog.com/"
#property version   "1.00"
#property strict

extern string p01="--- MAIN Settings ---";
input double LOTS = 0.01;   //初期ロット
input double NANPIN_BAIRITU = 1.50;   //ナンピン倍率
input double NANPIN_HABA = 30;   //ナンピン値(pips)
input int MAX_POSISION = 14;   //最大ポジション数

input double RIKAKU = 10;   //利確値(pips)

extern string p02="--- INDI Settings ---";
input int SELECT_INDI = 1;
input int I_PRAM1 = 14;
input int I_PRAM2 = 3;
input int I_PRAM3 = 3;

input int E_KAI = 30;
input int E_URI = 70;

int MAGIC_NO = 0;   //マジックナンバー

datetime prevtime;
int Main_ea_ticket[100]; //ポジションのチケット番号保有用(2だと3ポジまで) 5ポジ持たせたい場合は4にすること

double lot_buf_L;  //ロングロット数保持
double lot_buf_S;  //ショートロット数保持
int total_buf_L;  //ロングポジション数保持
int total_buf_S;  //ショートポジション数保持

string objectName = "SHOW_PROFIT";
string objectName2 = "SHOW_PROFIT2";
double LOT_MAX = 50.0;

string nanpin_message_L ="";
string nanpin_message_S ="";


//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit(){
//---
   //ラベルオブジェクトの作成
   if(!ObjectCreate(0, objectName, OBJ_LABEL, 0, 0, 0))
   {
      //return(INIT_FAILED);
   }
   // 座標のアンカー位置
   ObjectSetInteger(0, objectName ,OBJPROP_ANCHOR, ANCHOR_LEFT_LOWER);
   // X位置
   ObjectSetInteger(0, objectName, OBJPROP_XDISTANCE, 35);
   // Y位置
   ObjectSetInteger(0, objectName, OBJPROP_YDISTANCE, 25);
   // 色
   ObjectSetInteger(0, objectName, OBJPROP_COLOR, clrWhite);
   // 読み取り専用
   ObjectSetInteger(0, objectName, OBJPROP_READONLY, true);
   // 選択不可
   ObjectSetInteger(0, objectName, OBJPROP_SELECTABLE, false);
   // フォント名
   ObjectSetString(0, objectName, OBJPROP_FONT, "MS ゴシック");
   // フォントサイズ
   ObjectSetInteger(0, objectName, OBJPROP_FONTSIZE, 8);

   //ラベルオブジェクトの作成
   if(!ObjectCreate(0, objectName2, OBJ_LABEL, 0, 0, 0))
   {
      //return(INIT_FAILED);
   }
   // 座標のアンカー位置
   ObjectSetInteger(0, objectName2 ,OBJPROP_ANCHOR, ANCHOR_LEFT_LOWER);
   // X位置
   ObjectSetInteger(0, objectName2, OBJPROP_XDISTANCE, 35);
   // Y位置
   ObjectSetInteger(0, objectName2, OBJPROP_YDISTANCE, 35);
   // 色
   ObjectSetInteger(0, objectName2, OBJPROP_COLOR, clrWhite);
   // 読み取り専用
   ObjectSetInteger(0, objectName2, OBJPROP_READONLY, true);
   // 選択不可
   ObjectSetInteger(0, objectName2, OBJPROP_SELECTABLE, false);
   // フォント名
   ObjectSetString(0, objectName2, OBJPROP_FONT, "MS ゴシック");
   // フォントサイズ
   ObjectSetInteger(0, objectName2, OBJPROP_FONTSIZE, 8);

   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason){
//---
   ObjectDelete(0,objectName); 
   ObjectDelete(0,objectName2);   
   
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick(){
   int total=0,orderPtn=0;
   bool OrderKekka=false;
   string message;

//***決済判断箇所***//   
   //ポジション決済処理
   Posi_CntDel(OP_BUY);
   Posi_CntDel(OP_SELL);
//***決済判断箇所***//

//***売買箇所***//
   orderPtn = Entry_Chk(OP_BUY);
   OrderKekka = Main_Syori(OP_BUY,orderPtn);  //ロング処理   
   
   orderPtn = Entry_Chk(OP_SELL);
   OrderKekka = Main_Syori(OP_SELL,orderPtn);  //ショート処理
//***売買箇所***//

   total=funcOrder_Select(OP_BUY,0,MAGIC_NO,Main_ea_ticket);
   total_buf_L = total;
   
   total=funcOrder_Select(OP_SELL,0,MAGIC_NO,Main_ea_ticket);
   total_buf_S = total;


   message="Lポジション数:" + IntegerToString(total_buf_L) + " Sポジション数:" + IntegerToString(total_buf_S);
   ObjectSetString(0, objectName, OBJPROP_TEXT, message);
   
   message= nanpin_message_L + " " + nanpin_message_S;
   ObjectSetString(0, objectName2, OBJPROP_TEXT, message);    

}
//+------------------------------------------------------------------+

int Entry_Chk(int e_type){
int orderPtn=0,total=0;

   total=funcOrder_Select(e_type,0,MAGIC_NO,Main_ea_ticket);

   //基本エントリー
   if(total == 0){
   
      if(SELECT_INDI == 0){
         //ストキャスティクスの値取得
         double STOC_atai1 = iStochastic(NULL,0,I_PRAM1,I_PRAM2,I_PRAM3,MODE_SMA,0,0,1);
         double STOC_atai2 = iStochastic(NULL,0,I_PRAM1,I_PRAM2,I_PRAM3,MODE_SMA,0,0,2);   
      
         //ローソク足の1つ前のクローズ値情報を取得しておく
   
         if(e_type == OP_BUY){
            if(STOC_atai1 < E_KAI && STOC_atai2 > STOC_atai1)
            {
               orderPtn=1;
            }
         }
         if(e_type == OP_SELL){      
            if(STOC_atai1 > E_URI && STOC_atai2 < STOC_atai1)
            {
               orderPtn=2;
            }
         }
      }
      if(SELECT_INDI == 1){
         //RSIの値取得
         double RSI_atai1   = iRSI(NULL, 0, I_PRAM1, PRICE_CLOSE, 1);    //RSIの値を取得
         double RSI_atai2   = iRSI(NULL, 0, I_PRAM1, PRICE_CLOSE, 2);    //RSIの値を取得
      
         //ローソク足の1つ前のクローズ値情報を取得しておく
   
         if(e_type == OP_BUY){
            if(RSI_atai1 < E_KAI && RSI_atai2 > E_KAI)
            {
               orderPtn=1;
            }
         }
         if(e_type == OP_SELL){      
            if(RSI_atai1 > E_URI && RSI_atai2 < E_URI)
            {
               orderPtn=2;
            }
         }
      }
   

      
      //新しい足ができた時だけ新規エントリーする(ナンピンは常時監視)
      if(Time[0] != prevtime){
         if(e_type == OP_SELL){
            prevtime = Time[0];
         }
      }else{
         orderPtn=0;   
      }
   
   
   //ナンピンエントリー
   }else{
      double GP = getProfit(e_type,0,MAGIC_NO);
         
      double nanpin_H;
      nanpin_H = NANPIN_HABA * -1;
   
      //ナンピン幅を超えればエントリー
      if(GP<= nanpin_H - MarketInfo(NULL,MODE_SPREAD) / 10 ){
         if(e_type==OP_BUY){
            orderPtn=1;
         }
         if(e_type==OP_SELL){
            orderPtn=2;
         }
      }
      
      double Pips_keisan = ((nanpin_H * -1)  + MarketInfo(NULL,MODE_SPREAD) / 10) + GP;
      
      if(e_type==OP_BUY){
         nanpin_message_L ="Lナンピン目安:あと"+ DoubleToString(Pips_keisan,1) + "pips";
      }
      if(e_type==OP_SELL){
         nanpin_message_S ="Sナンピン目安:あと"+ DoubleToString(Pips_keisan,1) + "pips" ;
      }
      
      
   }

///画面ログ出力///

   if(total==0 && orderPtn!=0){
      if(orderPtn==1){
         Print("【買いエントリー】");   
      }
      if(orderPtn==2){
         Print("【売りエントリー】");   

      }
   }
   if(total>0 && orderPtn!=0 && total < MAX_POSISION){
      if(orderPtn==1){
         Print("【買いナンピン】 "+IntegerToString(total) + "回目");   
      }
      if(orderPtn==2){
         Print("【売りナンピン】 "+IntegerToString(total) + "回目");   

      }
   }

   return(orderPtn);
}


//+------------------------------------------------------------------+
//|【関数】全決済関数
//| 
//|【引数】 mode 0:ロングポジション 1:ショートポジション 2:両ポジション 
//|
//|【戻値】true
//| 
bool all_Del(int type){
   int total = OrdersTotal();

   for(int i = total-1; i >= 0; i--) {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
         int ot = OrderType();
         int magic = OrderMagicNumber();

         // 対象シンボル&マジックナンバーのみ処理
         if(OrderSymbol() == Symbol() && magic == MAGIC_NO ) {

            // typeが一致 or 両方決済
            if(type == 2 || ot == type) {
               double lots   = OrderLots();
               double price  = (ot == OP_BUY ? Bid : Ask);

               // クローズ実行
               bool result = OrderClose(OrderTicket(), lots, price, 10, clrCyan);
               if(!result) {
                  Print("全決済失敗: Ticket=", OrderTicket(), " Error=", GetLastError());
               }
            }
         }
      }
   }
   return(true);
}

~~~省略~~~

基本の処理と決済処理まで(上半分)を公開しています。

💡 完全版ソースコードはこちらで公開中です 👇

EAの仕様

それでは、今回のソースコードのエントリー/決済/パラメータ設定についての仕様を説明します。

エントリータイミング

ショートエントリー

RSIの一定値を上回った場合にショートエントリー 又は

ストキャスティクスの一定値を上回った場合にショートエントリー。

ロングエントリー

RSIの一定値を下回った場合にロングエントリー 又は

ストキャスティクスの一定値を下回った場合にロングエントリー。

エントリー例

ナンピンEAの初回エントリーとナンピンタイミングを示すチャート例

初回のエントリーはローソク足が更新されたタイミングでエントリーしますが、ナンピン時はローソク足に関わらずpips数が条件を満たした場合にナンピンエントリーします。

両建てエントリー対応です。

決済タイミング

パラメータ設定(RIKAKU)に達した場合に全ポジション(ロング・ショートポジションは別々に)決済します。保有ポジション数で少し決済のタイミングが変わります。

1~2ポジションの場合

1ポジション目がパラメータ設定(RIKAKU)に達した場合に全決済します。

3ポジションの場合

2ポジション目がパラメータ設定(RIKAKU)に達した場合に全決済します。

4ポジション目以降

最新ポジションから2つ前のポジションがパラメータ設定(RIKAKU)に達した場合に全決済します。

その他の仕様

このEAは外国通貨やゴールドで動作確認しています。

保持できるポジションは最大100ポジションまでです。

最大ロット数は50.0Lotです。※ナンピン時でもそれ以上にはなりません

パラメータ設定

パラメータ設定値は以下の通りです。

ナンピン関連パラメータ

  1. 初期ロット= 0.01 ⇒ 初期ロットを設定(0.01=1000通貨)
  2. ナンピン倍率= 1.5 ⇒ ナンピン時のロット数倍率(2.0で1,2,4,8,16倍…になっていきます)
  3. ナンピン値= 30.0 ⇒ 最新エントリーから不利な状況になりナンピンする際のpips数(30.0 = 30pips)
  4. 最大ポジション数= 14 ⇒ 最大ポジション数で、ロング・ショートで別々です。
  5. 利確値= 10.0 ⇒ 利確する際のpips数(10.0 = 10pips)

インジ・エントリー根拠関連パラメータ

  1. SELECT_INDI= 0 ⇒ エントリー根拠を選択できます(0:ストキャスティクス 1:RSI)
  2. I_PRAM1= 5 ⇒ パラメータ1です(ストキャスティクスの場合は%K期間、 RSIの場合は期間)
  3. I_PRAM2= 3 ⇒ パラメータ2です(ストキャスティクスの場合は%D期間、 RSIの場合は設定不要です)
  4. I_PRAM3= 3 ⇒ パラメータ3です(ストキャスティクスの場合はスローイング、 RSIの場合は設定不要です)
  5. E_KAI= 30 ⇒ ストキャスティクス又はRSIの値がいくつになったら買いエントリーをするか
  6. E_URI= 70 ⇒ ストキャスティクス又はRSIの値がいくつになったら売りエントリーをするか

ストキャスティクスの設定例

ストキャスティクスを使ったナンピンEAのエントリー設定例(%K・%D・スローイング)

SELECT_INDIは0にし、I_PRAM1の%K期間は5、I_PRAM2の%D期間は3、I_PRAM3のスローイングは3に設定しいます。

ストキャスティクスの値が20(E_KAI)で買い、80(E_URI)で売りエントリーの例です。

RSIの設定例

RSIを使ったナンピンEAのエントリー設定例(買い・売りの閾値)

SELECT_INDIは1にし、I_PRAM1の期間は14に設定しいます。I_PRAM2、I_PRAM3は何を設定しても参照しないため変化はありません。

RSIの値が30(E_KAI)で買い、70(E_URI)で売りエントリーの例です。

スポンサーリンク

状況確認機能

現在のポジション数や次回のナンピンpipsを表示する機能付きです。

次回ナンピンの目安pipsや保有ポジション数を表示するステータス機能の例

⚠️ 注意事項・制約

  • 今回は無償版のためマジックナンバーを0固定としており変更できません。
  • 本記事で「GOLD」と記載しているのは、XMの通貨ペア名称 “GOLD” を指しています。
    XMでは桁数(Digits)が他社と異なるため、例外として GOLD だけ pips 換算の補正 を入れています。
    一方で、一般的な通貨ペア名 XAUUSD(OANDA、FOREX.com、Titan など)で標準的な桁数の場合は、本EAはそのまま問題なく対応できます。
  • 初心者が使う場合、まずは XAUUSD でテストすることを推奨します(最も安定)。
🔍 ナンピン・マーチンEAのリスク設計について
本EAは段数・ロット上限・決済条件を明確に定義した設計になっています。 「なぜこのような制限が必要なのか?」については、 マーチンゲール法をEAに取り入れた場合の検証レポート で詳しく解説しています。

さいごに

以上、本格的なナンピンEAでした。

ナンピンEAはとにかくポジション管理が大事になってきますので、整理しながら作らないと訳が分からなくなりますので気を付けましょう。

もし上記ソースコードを全て知りたい方・学びたい方・改良したものを購入したい方がおられましたら👇

💡 EAロジックをもっと深く学びたい方へ

当サイトで紹介した「本格ナンピン&マーチンEA」の完全版ソースコード+EA本体を、note限定で公開中です。

✅ GOLD等の高ボラティリティ通貨対応(ATRで自動ナンピン幅調整)
✅ マジックナンバー対応済み(複数EAと併用可能)
✅ 手動決済ボタン付き(使い勝手大幅向上)
✅ PF2.0以上のバックテスト結果付き

完全版EAをnoteでダウンロード(2,980円 → 30名限定)

※購入後は全コードを自由に改変できます。 「自作EAをレベルアップしたい」という方に最適です。


✅ 今回のロジックをベースにしたEAサンプルも多数公開中

今回紹介したようなEAの売買ロジック・考え方をベースに、
当サイトではさまざまなFX自動売買EAのサンプルコードを公開しています。

ロジックの違いや設計の考え方を比較しながら、
自分に合ったEA構成を探したい方はぜひチェックしてみてください。


📊 EA運用・検証フェーズに進みたい方へ

今回のような仕組みを理解したうえで、
「実際にどのEAが安定しているのか」、「検証データではどんな差が出ているのか」
を確認したい方は、以下の記事も参考になります。


EA開発初心者向けに、今後も実践的に使えるMQL4関数や実装例を紹介していきます。
気になる機能やロジックがあれば、用途別に整理した関連記事もぜひあわせてご覧ください。

コメント

  1. 運國斎さんのアイコン 運國斎 より:

    難平幅は等間隔のようですが、1,2,4,8,倍、とした方が、耐性が強いです、。

    • りょう りょう より:

      運國斎さん

      なるほど、そういうやり方もいけますね。勉強になります!
      記事と同じ期間で早速試してみたんですが、3月~4月は運悪く退場してしまいますが、5月からは良い感じでした。
      ゴールドは値動きが荒いんで、通貨だともっといい感じになるかもですね。
      3月~4月
      5月~

タイトルとURLをコピーしました