前回でワイコフEAのプロトタイプのロジックが完成しました。
今回はいよいよプログラムが弾き出した値でのTP(テイクプロフィット:利食い)とSL(ストップロス:損切り)の機能を実装して、実際に注文できるようにします。
前回の記事

実行と資金管理(Execution & Money Management)
FX開発特化型LMの回答
現状のコードでは、シグナルが出た際に Print と矢印表示のみを行っています。
次はいよいよ、「実際に注文を発注し、適切な損切り(SL)と利食い(TP)を設定する」工程に進みます。
ワイコフ理論における損切り設定は非常に明確です。
- 買い(Spring)の場合 : Springを作ったローソク足の最安値の少し下。
- 売り(Upthrust)の場合: Upthrustを作ったローソク足の最高値の少し上。
これにより、リスクを限定しつつ、高いリスクリワード比(損小利大)を狙います。
Main.mq5 のエントリーロジックを更新
OnTick 関数内の「アクション」部分を、実際の注文コードに書き換えます。以下のコードを Main.mq5 の該当部分に上書きしてください。
Main.mq5上書きするコード
// ---------------------------------------------------
// 5. アクション (注文発注 & リスク管理)
// ---------------------------------------------------
// 二重エントリー防止(既にポジションがある場合はエントリーしない)
if(PositionsTotal() == 0)
{
double sl_price = 0;
double tp_price = 0;
double entry_price = 0;
double risk_reward_ratio = 2.0; // リスクリワード比 1:2
// --- 買いエントリー (Spring) ---
if(isBullTrigger)
{
entry_price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
// SL設定: Springの安値 - 余白(例: 50ポイント)
double spring_low = iLow(_Symbol, PERIOD_CURRENT, 1);
sl_price = spring_low - 50 * _Point;
// TP設定: リスク幅の2倍
double risk = entry_price - sl_price;
tp_price = entry_price + (risk * risk_reward_ratio);
// 注文実行
if(trade.Buy(InpLots, _Symbol, entry_price, sl_price, tp_price, "Wyckoff Spring"))
{
Print("BUY Entry Success! SL:", sl_price, " TP:", tp_price);
// 矢印の描画(視覚確認用)
string objName = "Buy_" + TimeToString(current_bar_time);
ObjectCreate(0, objName, OBJ_ARROW, 0, iTime(_Symbol, PERIOD_CURRENT, 1), iLow(_Symbol, PERIOD_CURRENT, 1));
ObjectSetInteger(0, objName, OBJPROP_ARROWCODE, 233);
ObjectSetInteger(0, objName, OBJPROP_COLOR, clrBlue);
}
}
// --- 売りエントリー (Upthrust) ---
else if(isBearTrigger)
{
entry_price = SymbolInfoDouble(_Symbol, SYMBOL_BID);
// SL設定: Upthrustの高値 + 余白
double upthrust_high = iHigh(_Symbol, PERIOD_CURRENT, 1);
sl_price = upthrust_high + 50 * _Point;
// TP設定: リスク幅の2倍
double risk = sl_price - entry_price;
tp_price = entry_price - (risk * risk_reward_ratio);
// 注文実行
if(trade.Sell(InpLots, _Symbol, entry_price, sl_price, tp_price, "Wyckoff Upthrust"))
{
Print("SELL Entry Success! SL:", sl_price, " TP:", tp_price);
// 矢印の描画
string objName = "Sell_" + TimeToString(current_bar_time);
ObjectCreate(0, objName, OBJ_ARROW, 0, iTime(_Symbol, PERIOD_CURRENT, 1), iHigh(_Symbol, PERIOD_CURRENT, 1));
ObjectSetInteger(0, objName, OBJPROP_ARROWCODE, 234);
ObjectSetInteger(0, objName, OBJPROP_COLOR, clrRed);
}
}
}
このコードのポイント
- 1. SL(損切り)の自動計算
-
Springの安値、Upthrustの高値を基準にSLを自動設定します。これがワイコフ理論の鉄則「セットアップが崩れたら即撤退」を自動化します。
- 2. TP(利食い)の自動計算
-
SL幅に基づいて、リスクリワード比 1:2 の位置にTPを置きます。
- 3. ポジション重複の防止
-
if(PositionsTotal() == 0)により、1つポジションを持っている間は追加エントリーしないように制限しています(テスト中の混乱を防ぐため)。
つくる人頼むぜCursor!
CursorのAI
該当部分を、ご指定の注文ロジックに差し替えました。
変更内容
- 二重エントリー防止
if(PositionsTotal() == 0) のブロック内でのみ注文・矢印描画を行うようにしました。
- 買いエントリー (Spring)
- エントリー価格: SYMBOL_ASK
- SL: 確定足の安値 − 50×_Point
- TP: エントリー + (エントリー − SL)×2(リスクリワード 1:2)
- trade.Buy(InpLots, _Symbol, entry_price, sl_price, tp_price, “Wyckoff Spring”) で成行買い
- 約定時のみ Print と青い上矢印(ObjectCreate の戻り値は if でチェック)
- 売りエントリー (Upthrust)
- エントリー価格: SYMBOL_BID
- SL: 確定足の高値 + 50×_Point
- TP: エントリー − (SL − エントリー)×2(1:2)
- trade.Sell(…) で成行売り
- 約定時のみ Print と赤い下矢印(同様に ObjectCreate をチェック)
- else if(isBearTrigger)
Buy と Sell が同時に成立しないよう、売りは else if にしています。
- ObjectCreate の戻り値
矢印描画の 2 箇所とも if(ObjectCreate(…)) で囲み、警告が出ないようにしています。SL/TP の 50 ポイントやリスクリワード比は、必要なら input パラメータにすると調整しやすくなります。
実施事項と結果
これで、「ニュースを避け、レンジブレイクのダマシを狙い、損小利大でトレードする」 完全な自律型EAになりました。
- コードを更新し、コンパイルしてください。
- デモ口座のチャートにセットし、「アルゴリズム取引」ボタンがONになっていることを確認してください。
- まずは放置して、最初のトレードが行われるのを待ちましょう(またはテスターのビジュアルモードで挙動を確認してください)。
無事に注文が入りましたら、開発は一区切りです。次のフェーズとして「トレーリングストップ(利益を伸ばす機能)」の追加も可能ですが、まずはこの「基本の完成形」で挙動を見てみてください。
結果





注文動作は良好!
次はリスクリワードの微調整!これからはカスタマイズの時間です!


EAワイコフ:プロトタイプの完成です!
最初の勝率は25%! さぁどこまで伸ばせるかな。ここからはカスタマイズの時間です

