EAを自作・改良していて、
「勝ってはいるが、プロフィットファクター(PF)が1.2〜1.4付近で伸びない」
そんな状態で止まっていませんか?
本記事では、EAの基本ロジックはそのままに、
決済方法と不要なエントリーを見直すことで、
PFを1.45 → 1.63まで改善した実例をもとに、
「どこを・どう直せばPFが伸びるのか」を具体的に解説します。
EAのタイプや目的に応じて、必要なところから読めるように整理しています。
→ 本記事を上から順に読み、
「PFが伸びない原因の洗い出し → バックテストでの特定 → 決済・エントリー改善」
という流れをそのまま自分のEAに当てはめてください。
→ 本記事では「PFの考え方・改善時の注意点(カーブフィット含む)」を理解し、
実例として以下の記事をあわせて読むのがおすすめです。
【MQL4】本格ナンピン&マーチンEAの無料配布|GOLD対応・一部ソースコード公開
本記事は、EAの基本ロジックがすでに完成しており、
「トレードの質を上げたい」「PFをもう一段引き上げたい」方向けの内容です。
MQL4のソース修正を前提とした解説のため、設定変更だけで完結させたい方は参考程度にご覧ください。
EAのプロフィットファクターが低かった理由
では、どうトレードすればプロフィットファクターや利益がもっと上がるかを確認していきます。
まず、去年のEAのトレード結果を見て何が悪かったのか等をざっくりでいいので洗い出していきましょう。
私の場合は、
②あまり有効でなさそうな場所でエントリーする時がある
この2点が大きな問題でした。この問題にフォーカスしてソース修正をしていきます。
ただ、これだけでは漠然とし過ぎていてどこを修正したらいいのかわからん!
ということで、どうしたらいいのか次に記載していきます。
バックテストでPFを下げているトレードを特定
どこのソースを修正していくかですが、オススメはバックテストのビジュアルモードを使って実際に悪いトレードを探す事です。
普段からトレード結果を見ている場合は、その問題があったトレードの期間をバックテストしてもいいですし、ざっくり去年からとかでバックテストを始めてもいいのでとにかく悪いトレードを見つけ出します。

見つけ出したらバックテストを止めて日付をしっかり覚えます。上記の画像はショートで2回エントリーしていますが『このトレードは修正の余地がある!』といった具合です。
EAのプロフィットファクターを上げるソース修正
トレード内容を見直す方法として、簡単なのは『決済方法を見直す事』と『不要なエントリーを省く事』です。
①決済位置を見直す
まず、1回目のトレードですがエントリー部分はいいのですが決済部分はもう少し待っても良いのかなと思いました。

決済ポイントは直前のZigZagの安値(黄色い水平線部分)を下に更新できなかったと判断して、決済してしまっています。ここのトレードを見て思う事はもう少し決済するのを様子見したいという事です。こんな感じ。

修正前は水色の部分で決済してしまっていましたが、修正を加えた事で最後の黄色の部分でストップロスに引っかかって決済されています。
※最後の黄色丸の左側に小さく黄色「-」があるのがストップロスです
直近の安値を更新できなかったら決済 ⇒
直近の安値を更新できなかったら直近の高値付近にストップロスを置く
このようにソース修正しました。
まずは、こんな感じで決済される箇所を見直しましょう。
②不要なエントリーを省く
次の修正はエントリー部分です。以下の画像は下げた後の戻りをショートでエントリーしています。が、戻りの割合が直近の下げに対して大きすぎるという風に思いました。

直近の高値と安値でフィボナッチを引いて確認しても61.8%以上戻しちゃってるので、こういう戻しが大きい場合(61.8%等)は以下のように修正しました。
戻しは大きくても直近のZigZagのTOP値を超えていなければエントリー ⇒
戻しが60%以上の場合はエントリーしない
このようにソース修正しました。
エントリー箇所はかなりダイレクトに影響してくるので慎重に行いましょう。
修正箇所の確認
修正すると当然他のトレードにも影響してくるので他のトレードもビジュアルモードで確認します。

しっかりと自分が修正した内容でトレードされている事を数エントリー分確認しましょう。
・安値を切り上げた場合、 直近の高値付近にストップロスを置くいていること
・ 戻しが60%以上の場合はエントリーしないこと
これが確認できたら、次の作業に移りましょう!
修正後にPFが本当に改善したか検証
ソース修正をした事で先ほどの部分のトレードが良くなっていても、他の部分で致命的に悪くなっている事も結構(かなり)あります。
結局先ほどの修正が良かったのか悪かったのかは長期的なバックテストの結果を持って判断します。ここでのバックテストはビジュアルモードでは確認せず結果のみで確認します。
修正前

修正前のプロフィットファクタは1.45で総取引数は3286回でした。結果でよく見る部分を赤枠で囲っています。
修正後

修正後のプロフィットファクタは1.63で総取引数は2875回でした。総取引数は400回近く減っているのに純益が増えているので1回あたりのトレードの質が上がっている(期待利得が上がっている)事がわかります。勝率は2%程下がりましたがこれは仕方ない(質の悪い勝ちトレードが減った)ことなのでOKです。
一番下のグラフをみても2020年~2021年にかけて修正前は横一直線だったのが右肩上がりに変わっています。
修正前と修正後で明らかに修正後の成績が落ちた場合
今回のようにトレードの1部分をみて良い感じにトレードするように修正しても、全体のバックテストであまり良くならない、むしろ悪化することも結構な割合であります。
ということは、直近の安値を更新でいなければさっさと決済したほうが良かったのかもしれないですし、7割戻していてもエントリーしていた方がよかったのかもしれません。
修正を1つづつ行いどの修正が有効性が高いのかを確認していく必要があります。
修正内容を見直し(6割戻しを5割戻しにして見るなど)をしていきますが、いくら修正しても全然成績がよくならない場合は今回の修正内容は適用しないという判断をする場合もあります。
私も上記の修正をすると成績があがったので記事にしていますが、他の修正も当然したりしていて成績が悪化したのも結構あったのでその修正は戻したりしています。
プロフィットファクター改善とカーブフィッティング注意
ビジュアルモードでトレードを見ていると、あのトレードも直したいこのトレードも直したいってなってきます。悪いトレードを直すのは良い事なんですが問題が1つあります。
カーブフィッティング(曲線あてはめ)です。
カーブフィッティングを行うと当然プロフィットファクターは良くなります。既にあるデータに対して良くなるような超限定的な修正になってしまうからです。
あれ?この修正はカーブフィッティングっぽいなって思った場合の簡単なオススメ確認法は、『別通貨でバックテストしてみる』です。私の場合、今回のEAは米ドル/円で運用するものですがポンド/円でも確認しました。
修正前

修正後

修正後の方が成績が良くなっているので、純粋にトレードの質が向上したという事がわかります。
プロフィットファクターはどれくらいが適正?
一般的に、単ポジション型EAの場合は、
プロフィットファクター1.3〜1.6程度が、
カーブフィッティングを避けつつ安定運用しやすい目安とされています。
一方、ナンピン・マーチンゲール型EAでは、
損失を段階的に吸収する特性上、2.0〜2.5程度になるケースも珍しくありません。
ただし、プロフィットファクターが極端に高い場合(2.5以上など)は、
- カーブフィッティング(過去データへの最適化しすぎ)
- 取引回数が少なすぎる
- 検証期間が短すぎる
といった要因が含まれている可能性もあるため、
数値だけで判断せず、取引回数・期間・ロジックの特性をあわせて確認することが重要です。
なお、プロフィットファクターはあくまで「成績を測る一指標」であり、 最大ドローダウンやロット設計と合わせて評価することが前提です。
まとめ|EAのPFを上げるために重要な考え方
本記事では、EAの基本ロジックを変えずに
決済位置と不要なエントリーを見直すことで、
プロフィットファクター(PF)を1.45 → 1.63まで改善した実例を解説しました。
ここで最も重要なのは、
「PFを上げること=トレードを増やすことではない」という点です。
「勝ちやすいトレードだけを残し、
勝ちにくいトレードをどれだけ減らせるか」
今回の例でも、
総取引数は約400回減少しているにも関わらず、
純利益は増加しています。
これは、
・無理なエントリーを削った
・決済を「早すぎる利確」から「期待値重視」に変えた
結果として、1トレードあたりの質(期待利得)が向上したことを意味します。
一方で、PFを意識しすぎると注意すべきなのがカーブフィッティングです。
- PFだけが不自然に高い
- 取引回数が極端に少ない
- 検証期間が短い
こうした場合は、
別通貨・別期間でのバックテストを行い、
「たまたま合っただけの修正」になっていないかを必ず確認しましょう。
PFはあくまで判断材料のひとつであり、
最大ドローダウン・ロット設計・運用環境とセットで評価することが前提です。
📘 次のステップ|PF改善の次に多くの人が直面する課題
PFが改善しても、多くの人が次に直面するのは、
「放置」「停止事故」「実運用環境」の問題です。
▶ 最終ステップ:
PFを改善できたEAを
「止めずに・事故らせずに・長期で回す」ための実運用ガイドはこちら👇









コメント
はじめまして。どの記事もとてもわかりやすくて大いに参考にさせてもらっています。
本記事の決済位置修正について質問があります。
「直近の安値を更新できなかったら直近の高値付近にストップロスを置く」の「直近の安値」と「直近の高値」は、チャートでのZigZagの頂点なのでしょうか?(パラメーターSL_Gosaの分、余裕を持たせている?)
もし可能でしたら、修正部分のソースを教えていただけると大変ありがたいです。
はじめまして、pokoさん。
記事を見て頂き有難うございます!
「直近の安値」と「直近の高値」についてですが、「直近のZigZagの安値」と「直近のローソク足の高値」という感じです。(自分で見直しても?でした、すみません)
修正ソースについてですが、私のサイトで公開しているソースでは決済部分を作りこんでいないので参考になるかどうかわからないですが一応お伝えします。
//売りエントリー中に、ZigZagのZigBottomが切り上げたら決済する
if(OrderType() == OP_SELL && ZigBottom[0] > ZigBottom[1] && orderPtn !=2){
if(BottomPoint == 0 && ZigAtai3 != 0 && ZigAtai2 == 0 && ZigAtai1 == 0 && rosokuValueCloseP > MA_BASE){
//OrderKekka = funcOrder_Close(20,MagicNumber,clrMediumSpringGreen);
OrderKekka = funcOrder_Modify(Bid + 60 * Point,OrderTakeProfit(),MagicNumber);
}
}
【サンプルにない各変数、関数の説明】
ZigAtai3、ZigAtai2、ZigAtai1は、ZigZagの安値が確定してから2ローソク足分でその安値を更新できなかった場合って感じで使ってます。ZigZagの安値が確定してから、次のローソク足でそのZigZagの安値を更新するとそれが最新のZigZag安値になるのでその場合は決済したくないためです。(要は下げ止まった場合に決済したくて、下げ続けている場合は決済したくない)
あとrosokuValueCloseP はローソク足のクローズ値、MA_BASEは15分足の21EMAです。
funcOrder_Close()関数は決済注文、funcOrder_Modify()関数は変更注文として自作の関数です。
早々のご丁寧なお返事ありがとうございます!
ただ、記事中の画像での黄色「-」が出ているバーは、ZigBottomが切り下がっていて、さらにZigZagの安値が確定してから1ローソク足分のように思えるのですが、なにか勘違いでしょうか…
それと、条件にMAも使っているんですね。
試してみたところ、当該のバーで「クローズ値>15分足の21EMA」とならないのですが、これもなにか間違っているのでしょうか。以下のようにしています。
rosokuValueCloseP = Close[1];
MA_BASE = iMA(NULL, 0, 21, 0, MODE_EMA, PRICE_CLOSE, 1);
続けざまに細かいところをすみませんが、お返事いただけたら幸いです。
なるほど、よく見られている・・・!
ZigBottomが切り下げ確定したタイミングで、1つ前のZigBottom前後(パラメータのSL_Gosa_S分)にSL設定する処理は元々いれていたのですが、記事の画像の通り切り下げる前に決済されてしまっていたので今回の直近のローソク足の高値にSL設定する処理を追加しました。この処理を入れた事で元々いれていた1つ前のZigBottom前後にSL設定する処理が実行された形になります。
MAの件は同じ日時で確認されたという事でしょうか?
MAの値が違うからでしょうか。私はEMA(13)で見てました。
double MA_BASE = iMA(NULL, 0, 13, 0, MODE_EMA, PRICE_CLOSE, 1);
double rosokuValueCloseP = iClose(NULL, 0, 1);
なるほど、そういう処理が元々あったのですね、わかりました。
トレールのやり方にも、色々考えようがあるんですね。
聞いてみたいことは尽きないのですが、お手をわずらわせるのも申し訳ないので自分で色々試してみます。ご解説ありがとうございました!
はーい。もし何か分からない事があれば、問合せフォームからご質問頂ければわかる範囲で回答いたします。