「ナンピンEAを作ってみたいけど、どこから手を付けたらいいか分からない…」
「ロット倍率やナンピン幅を自由に調整できるEAが欲しい」
そんな方のために、この記事ではナンピン&マーチンゲールEAの無料版を公開します。
今回のEAは、GOLD(ゴールド)を含む複数通貨ペアで動作確認済みです。
ナンピン幅・ロット倍率・最大ポジション数・インジケーター(RSI / ストキャス)など、ナンピンに必要な設定をパラメータで自由に調整できます。
また、EAロジックの理解を深めたい方向けに、ソースコードの前半部分(エントリー判断・決済処理・ナンピン制御)も公開しています。
自作EAの学習素材としても活用しやすい内容です。
- ナンピン&マーチンEAの基本構造
- ロット倍率・ナンピン幅などの設定ポイント
- GOLD・AUD/CADでのバックテスト例
- GOLDで動かす際の注意点
- ストキャス / RSI でのエントリー判定方法
- サンプルソースコード(前半部)
- 無料版とnote完全版の違い
MT4(MQL4)用の無料版ナンピン&マーチンEAです。
まずはバックテストまたはデモ口座で、ナンピン幅・ロット・決済の動きを確認してください。
※無料版はMagic Number「0」固定です。同一通貨ペアの手動ポジションや、Magic Number 0を使用する別EAとの併用は避けてください。
「ナンピンEAはどう作られているのか?」が理解できるよう、バックテスト・図解・サンプルコードとあわせて解説します。
本記事では、無料版EAと一部ソースコードを公開しています。
完全版EA・全ソースコード・追加機能付きバージョンはnoteで公開しています。
| 項目 | 無料版 | note完全版 |
|---|---|---|
| EA本体 | 無料ダウンロード可 | 完全版EAを公開 |
| ソースコード | 前半部分のみ公開 | 全ソースコード付き |
| マジックナンバー | 0固定 手動注文等との併用注意 | 設定可能・複数EA運用に対応 |
| ナンピン幅 | 固定pips | ATRによる自動調整に対応 |
| 運用補助 | 基本機能のみ | 手動決済ボタンなどを追加 |
まずは無料版で動きを確認し、ロット制御やナンピン管理まで深く学びたい方はnote完全版をご確認ください。
バックテスト結果|GOLD・AUD/CADでの検証例
まずは、本EAを「GOLD(ゴールド)」と「AUD/CAD」でバックテストした結果をご紹介します。
通貨ペアごとの特性やパラメータによって成績は大きく変わるため、検証例のひとつとしてご覧ください。
GOLD(ゴールド)
2024年のGOLDで実施したバックテスト例です。パラメータによって結果は変わるため、検証例のひとつとしてご覧ください。
使用したパラメータ設定は以下の通りです。
AUD/CAD
AUD/CADでは、本記事で紹介しているNANPIN-EAを使い、2021年1月〜2026年8月まで長期バックテストを行いました。
約5年8か月の検証で、PF2.77・純利益+3,336,515円・総取引数4,523回となっています。
| 検証期間 | 2021/01/04〜2026/08/21 |
|---|---|
| 時間足 | M5(5分足) |
| 初期証拠金 | 1,000,000円 |
| 純利益 | +3,336,515円 |
| プロフィットファクター | 2.77 |
| 最大ドローダウン | 1,080,085円(42.77%) |
| 総取引数 | 4,523回 |
長期間では右肩上がりの損益曲線となっていますが、最大ドローダウンは42.77%まで発生しています。
ナンピンEAは高い勝率やPFが出ても、一度の大きな逆行で含み損が膨らむ可能性があります。利益だけで判断せず、最大DD・最大ポジション数・ロット設定もあわせて確認することが重要です。
※上記は本記事で紹介しているNANPIN-EAの検証例です。noteで公開している完全版は追加機能を含む別仕様のため、バックテスト結果は直接比較できません。
本記事では、ナンピンEAの基本構造やソースコードの考え方を紹介しています。
その発展例として、当サイトではAUDCAD専用EA「AC RUSH」も実運用しています。
AC RUSHはGogoJungleでフォワード成績を公開しており、
実際の運用成績やリスク管理の考え方を以下の記事でまとめています。
無料版ナンピン&マーチンEAのダウンロード
無料版EAのダウンロードはこちらです。
冒頭ですでにダウンロードした方は、そのまま次のソースコード解説へ進んでください。
※無料版はMagic Number「0」固定です。同一通貨ペアの手動ポジションや、Magic Number 0を使用する別EAとの併用は避けてください。
完全版では、無料版をベースに運用・検証向けの機能を追加しています。
- マジックナンバー設定に対応
- ATRによるナンピン幅の自動調整
- GOLD向けの逆張りロジックを追加
- 手動決済ボタンを追加
- 完全版ソースコード(全ロジック)付き
- 完全版のバックテスト例も掲載
※ver1.0購入者は追加料金なしでアップデート可能です。
ナンピンEAのソースコードを一部公開
以下は、ナンピンEAのサンプルソースコードの一部(前半部)です。
エントリー判断・決済処理・ナンピン制御の流れを確認できます。
以下はEAの構造を確認するための抜粋です。省略している関数があるため、掲載部分だけではコンパイル・実行できません。
実際に動作する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]; //ポジションのチケット番号保有用
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);
ObjectSetInteger(0, objectName, OBJPROP_XDISTANCE, 35);
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);
ObjectSetInteger(0, objectName2, OBJPROP_XDISTANCE, 35);
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);
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){
double RSI_atai1 = iRSI(NULL, 0, I_PRAM1, PRICE_CLOSE, 1);
double RSI_atai2 = iRSI(NULL, 0, I_PRAM1, PRICE_CLOSE, 2);
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);
}
//+------------------------------------------------------------------+
//|【関数】全決済関数
//+------------------------------------------------------------------+
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 ) {
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の仕様
ここからは、無料版EAのエントリー・決済・パラメータ設定について説明します。
エントリータイミング
ショートエントリー
RSIの一定値を上回った場合、またはストキャスティクスが設定した条件を満たした場合にショートエントリーします。
ロングエントリー
RSIの一定値を下回った場合、またはストキャスティクスが設定した条件を満たした場合にロングエントリーします。
エントリー例
初回のエントリーはローソク足が更新されたタイミングでエントリーしますが、ナンピン時はローソク足に関わらずpips数が条件を満たした場合にナンピンエントリーします。
両建てエントリー対応です。
決済タイミング
パラメータ設定(RIKAKU)に達した場合に全ポジション(ロング・ショートポジションは別々に)決済します。
保有ポジション数によって決済の基準となるポジションが変わります。
1〜2ポジションの場合
1ポジション目がパラメータ設定(RIKAKU)に達した場合に全決済します。
3ポジションの場合
2ポジション目がパラメータ設定(RIKAKU)に達した場合に全決済します。
4ポジション目以降
最新ポジションから2つ前のポジションがパラメータ設定(RIKAKU)に達した場合に全決済します。
その他の仕様
このEAはFX通貨ペアおよびGOLDで動作確認しています。
最大ポジション数はパラメータ「MAX_POSISION」で設定し、初期値はロング・ショートそれぞれ14ポジションです。
EA内部では最大ロット数を50.0Lotに制限しており、ナンピン時もそれ以上には増加しません。
パラメータ設定
主なパラメータ設定値は以下の通りです。
ナンピン関連パラメータ
- 初期ロット= 0.01 ⇒ 初期ロットを設定
※FX通貨ペアでは一般に0.01Lot=1,000通貨相当ですが、GOLDなどのCFDはFX業者・銘柄ごとに契約サイズが異なります。 - ナンピン倍率= 1.5 ⇒ ナンピン時のロット数倍率(2.0の場合は1倍、2倍、4倍、8倍…と増加)
- ナンピン値= 30.0 ⇒ 最新エントリーから不利な方向へ動いた際に、次のナンピンを行うpips幅(30.0=30pips)
- 最大ポジション数= 14 ⇒ 最大ポジション数。ロング・ショートで別々に管理します。
- 利確値= 10.0 ⇒ 決済判定に使用するpips数(10.0=10pips)
インジ・エントリー根拠関連パラメータ
- SELECT_INDI= 0 ⇒ エントリー根拠を選択できます(0:ストキャスティクス / 1:RSI)
- I_PRAM1= 5 ⇒ パラメータ1(ストキャスティクスの場合は%K期間、RSIの場合は期間)
- I_PRAM2= 3 ⇒ パラメータ2(ストキャスティクスの場合は%D期間、RSIの場合は参照しません)
- I_PRAM3= 3 ⇒ パラメータ3(ストキャスティクスの場合はスローイング、RSIの場合は参照しません)
- E_KAI= 30 ⇒ ストキャスティクスまたはRSIの買いエントリー判定に使用する値
- E_URI= 70 ⇒ ストキャスティクスまたはRSIの売りエントリー判定に使用する値
ストキャスティクスの設定例
SELECT_INDIは0にし、I_PRAM1の%K期間は5、I_PRAM2の%D期間は3、I_PRAM3のスローイングは3に設定しています。
ストキャスティクスの値が20(E_KAI)で買い、80(E_URI)で売りエントリーする設定例です。
RSIの設定例
SELECT_INDIは1にし、I_PRAM1の期間は14に設定しています。I_PRAM2、I_PRAM3は参照しないため、設定値による変化はありません。
RSIの値が30(E_KAI)で買い、70(E_URI)で売りエントリーする設定例です。
状況確認機能
現在のポジション数や、次回ナンピンまでの目安pipsをチャート上に表示します。
⚠️ 注意事項・制約
- 無料版はMagic Numberが「0」固定です。MT4の手動注文も一般にMagic Number 0となるため、同一通貨ペアで手動ポジションを保有した状態での利用や、Magic Number 0を使用する別EAとの併用は避けてください。
- GOLD・XAUUSDはFX業者によってシンボル名・Digits・Pointなどの仕様が異なる場合があります。
本EAではGOLDでの動作確認を行っていますが、別の環境で利用する場合は、ナンピン幅や利確幅が想定したpipsで動作するか、必ずバックテストまたはデモ口座で確認してください。 - GOLDなどのCFDは、FX通貨ペアとは1Lotあたりの契約サイズが異なる場合があります。実運用前に利用するFX業者の銘柄仕様をご確認ください。
- 初めて試す場合は、まずデモ口座やバックテストで挙動を確認し、通貨ペアごとにナンピン幅・最大ポジション数・ロットを調整してください。
本EAは段数・ロット上限・決済条件を明確に定義した設計になっています。
「なぜこのような制限が必要なのか?」については、 マーチンゲール法をEAに取り入れた場合の検証レポート で詳しく解説しています。
さいごに
以上、無料版ナンピン&マーチンEAの仕組みと使い方を紹介しました。
ナンピンEAはとにかくポジション管理が重要です。
ロジックを作る際も、ロット・段数・ナンピン幅・決済条件を分けて整理すると、動作を把握しやすくなります。
まずは無料版をバックテストやデモ口座で動かし、ナンピンEAの基本的な挙動を確認してみてください。
💡 EAロジックをもっと深く学びたい方へ
本記事で紹介した「ナンピン&マーチンEA」の完全版ソースコード+EA本体は、noteで公開しています。
✅ ATRによるナンピン幅の自動調整
✅ マジックナンバー設定に対応
✅ 手動決済ボタン付き
✅ GOLD向けロジックを追加
✅ 完全版のバックテスト例を掲載
※購入後は全コードを自由に改変できます。ナンピンEAの仕組みをさらに学びたい方や、自分でロジックを調整したい方に向いています。
💡 このサンプルをベースにしたカスタマイズ相談も可能です。
▶ 仕様相談・EA作成の詳細はこちら
✅ 今回のロジックをベースにしたEAサンプルも多数公開中
今回紹介したようなEAの実装例・考え方をベースに、
当サイトではさまざまなFX自動売買EAのサンプルコードを公開しています。
ロジックの違いや設計の考え方を比較しながら、
自分に合ったEA構成を探したい方はぜひチェックしてみてください。
📊 EA運用・検証フェーズに進みたい方へ
今回のような仕組みを理解したうえで、
「実際にどのEAが安定しているのか」「検証データではどんな差が出ているのか」
を確認したい方は、以下の記事も参考になります。
⚙️ 同じ条件でバックテストしたい方へ(検証環境)
当サイトのバックテストは、同一の検証環境で比較できるように統一しています。
EAの再現テストやパラメータ検証を行う場合は、
検証環境の作り方もあわせて確認しておくと理解が深まります。
EA開発初心者向けに、今後も実践的に使えるMQL4関数や実装例を紹介していきます。
気になる機能やロジックがあれば、用途別に整理した関連記事もぜひあわせてご覧ください。








コメント