ナンピン幅を段階ごとに変更したい

EAつくーる
ふくやん
2026/01/14 20:15
35

最初のエントリーを裁量で行い、指定したナンピン幅でナンピンするEAを作成しました。
ナンピン2回目から5回目までは、ナンピン幅20pips
ナンピン6回目から10回目までは、ナンピン幅30pipsというように
段階的に変更する設定に変更することはできますか。

コメント

GogoJungle
2026/01/16 12:29

ナンピン幅を「回数(段階)」に応じて、20pips→30pipsのように切り替えたいというご質問ですね。
結論から申しますと、EAつくーるの「ナンピン」オプション単体では、ナンピン幅(エントリー間隔)を回数ごとに段階変更する設定はできません(ナンピン幅は1つの固定値のみ指定できます)。
ただし、出力されたMQLコードを最小限改造すれば、今回の「2~5回目は20pips、6~10回目は30pips」のような動作は実現可能です。

準備

EAつくーるの 「オプション」→「ナンピン」 にチェックを入れ、以下を設定します。

ナンピン回数:10

エントリー間隔(pips):20(ここは仮の基本値でOKです。後でコード側で回数により切り替えます)

基本項目の「損切り」「利食い」は必ず 0 にしてください。

ナンピンを使う場合、SL/TPが入っていると挙動が崩れたり、意図せず決済されやすくなります。

こうなっていませんか?:損切り=100、利食い=100のまま(ご提示コードもその状態です)だと、段階幅以前に「想定より早く決済」してしまい、ナンピン回数が進みません。

この状態でコードをダウンロードし、MetaEditorで開きます。

設定方法(ロジック)
考え方はシンプルで、 現在の保有数(=何回目の建玉か) によって、次のナンピンまでの必要幅を切り替えます。

2~5回目のナンピン(=追加エントリーが 2,3,4,5回目)→ 20pips

6~10回目のナンピン → 30pips

実装上は「今すでに何ポジションあるか」で判断するのが分かりやすいです。
例:同一マジックで現在 5ポジション保有しているなら、次は「6回目の建玉」なので 30pipsに切り替える、という判断になります。

MQLでの補足(コード改造で実現する方法)
EAつくーるの機能のみでは○○できませんが、出力されたコードを改造することで実現可能であると存じます。
修正方法を考えてみましたので提案させていただきます。

  1. 修正箇所の探し方
    MetaEditorで、まず以下のどれかの文字列で検索してください(EAつくーるの出力によって名称が違うことがあります)。

Nanpin

ナンピン

entry_interval

PipsToPrice((ナンピン幅を価格換算して比較している箇所で見つかることがあります)

getOpenPositions((保有数を使っている箇所の近くにナンピン判定があることが多いです)

見つけたいのは、「ナンピン幅(pips)を1つの変数で使っている行」です。典型的には次のようなイメージです。

double interval = NanpinPips;

if(diff_pips >= NanpinPips) { … }

if(価格差 >= PipsToPrice(NanpinPips)) { … }

  1. 追加する関数(段階幅の決定)
    コード内のどこでもよいので(関数群のあたりが分かりやすいです)、次のような「幅を返す関数」を追加します。

判断材料:getOpenPositions(magic)(すでにコードにある関数です)

  1. ナンピン判定で使う幅を、この関数に差し替える
    【修正前】(例:固定幅で判定している状態)
    ※実際の行はあなたのコードで見つかった該当箇所に合わせてください(下はよくある形の例です)
    // 例:ナンピン幅(固定)
    double interval_pips = NanpinPips;

// 例:価格差が interval_pips を超えたら追加エントリー
if(diff_pips >= interval_pips) {
// 追加エントリー処理
}

【修正後】(回数で段階変更)
// 現在の保有数から、次に必要なナンピン幅を決める
double GetNanpinIntervalPips(int magic)
{
int pos = getOpenPositions(magic); // 現在の保有数(初回エントリー含む)

// pos=1 → 次は2回目建玉(2~5回目は20pips)
// pos=5 → 次は6回目建玉(6~10回目は30pips)
if(pos >= 5) return 30.0; // 6回目以降(保有数が5以上)
return 20.0; // 2~5回目(保有数が1~4)
}

// 例:ナンピン判定で使う幅を差し替え
double interval_pips = GetNanpinIntervalPips(magic);

if(diff_pips >= interval_pips) {
// 追加エントリー処理
}

ありがちな設定ミス(こうなっていませんか?)

基本項目の「損切り」「利食い」が 0 になっていない
→ ナンピンEAでは必須です。ご提示コードだと StopLoss=100 / TakeProfit=100 なので、このままだと段階幅以前に決済されやすくなります。

ナンピンと同時にトレーリングストップ等のオプションを使っている
→ 仕様上、ナンピンはSL/TPや一部オプションと併用すると挙動が安定しません。ナンピンを優先する場合は、まずナンピン単体で動作確認するのが安全です。

「裁量エントリー後にEAでナンピン」したいのに、裁量ポジションとEAのマジックが一致していない
→ 裁量ポジション(マジック0)を起点にEAで段階ナンピンしたい場合、EA側が「自分のポジション」として認識できず、追加しないことがあります。
この場合は「EAが最初の建玉を持つ運用」に寄せるか、コード側で「マジック0も対象に含める」改造が必要になります(ここは運用方針次第で難易度が変わります)。

上記の改造は「ナンピン幅を参照している1か所(または数か所)」を差し替えるだけで済むことが多く、段階変更の中では比較的シンプルな部類です。実際のあなたのコードで「ナンピン幅を使っている行」を見つけられれば、そこにピンポイントで当て込めます。

ふくやん
2026/01/16 16:43

新規にナンピンオプションのみ(TP=0、SL=0、ナンピン回数=10,ナンピン幅20)で作成し、「ナンピン幅(pips)を1つの変数で使っている行」を探しましたが、わかりません。
ナンピン関数のコード内に近いと思われるものがあります。BUY・Sell それぞれ記述があります。
countがナンピン〇回目数だと思います。
修正箇所及びコードを教えてください。
この箇所でなければ、手に負えそうにないので諦めます。
一部コピーしました。

 if(count >= max) return;

  if(type == OP_BUY && Ask <= (price - PipsToPrice(interval))) {
     if(is_custom == 0) {
        if(add == 0){
           openPosition(1, MathMin(lots * MathPow(mult, count + 1), limit), 0, 0, magic[i]);
        }
        if(add > 0){
           if(mult == 0 || mult == 1) {
              openPosition(1, MathMin(lots + (add * (count + 1)), limit), 0, 0, magic[i]);
           }
           else {
              openPosition(1, MathMin(lots * MathPow(mult, count + 1) + (add * (count + 1)), limit), 0, 0, magic[i]);
           }
        }
     }
     else {
        openPosition(1, MathMin(custom_lots[count], limit), 0, 0, magic[i]);
     }
  }

関連トピックス

検索結果がありません。

ノーコードで誰でも簡単EA開発!MQL言語学習にも使える! | GogoJungle

注目トピックス

検索結果がありません。