ポジション決済について

EAつくーる
みやまん
2025/09/04 06:41
45

お世話になります。
買いエントリーした2本前と3本前のどちらか安い側の安値の下5pipsに損切りを置く方法をご教授ください。損切り/利食いは置きません。よろしくお願いいたします。

コメント

GogoJungle
2025/09/04 18:16

「買いエントリー時に、2本前と3本前の安い方の安値−5pipsにストップロスを置きたい」というご質問ですね。


まず結論(EAつくーるの仕様について)
残念ながら、EAつくーるの画面操作だけで「特定の2本の安値のうち低い方」を価格でストップロスに直接セットすることは難しいです。
「基本項目」の損切りはpips固定で、また「トレーリングストップ(高値・安値)」は直近の高値/安値で追随するものの、「2本前と3本前の安値のうち低い方」に固定する指定はできません。

ただし、出力されたコードを軽微に改造すれば、狙い通り「エントリーと同時に、2本前・3本前の安値のうち低い方 −5pips をSLに設定(固定)」が可能です。以下で安全な手順をご案内します。


設定方法(EAつくーる側)

「基本項目」

  • ロット数:任意
  • 損切り:0
  • 利食い:0
  • スリッページ:任意

「オプション」
未使用(まずはトレーリング等は外します)

「取引条件」
「一定期間の高値・安値」を使うロジックを1つ用意します。今回の目的はコード内に iLowest(..., 2, 開始位置) を出力させることです。
例として、次のように「2本のうちの安値」を参照する条件を1つ入れておくと、出力コードに iLowest(..., 2, 1) の形が出てきます(等号はサンプルです)。

一定期間の高値・安値(計算期間:2, モード:安値, 計算位置:0本前) = 
ローソク足(適用価格:終値, 計算位置:0本前, 補正値:+5pips)
↓
買いエントリー

こうなっていませんか?(確認)

  • 基本項目の損切り/利食いが0のままか。
  • トレーリング/建値ストップなど自動でSLを動かす系は未使用か。今回の狙いは「エントリー時点基準の固定SL」です。

コードの修正について

EAつくーるの機能のみでは、「エントリー時点から見た2本前・3本前の安い方」を常にエントリー基準で参照することが難しいため、出力コードを改造して実現します。

ねらい
iLowest(symbol, timeframe, MODE_LOW, 2, start)start を「最終エントリー足から2本後」にすることで、「2本前・3本前」の2本区間から安い方の安値を取得できるようにします。
具体的には、start = getLastEntryBar(Symbol(), Period(), 0, Magic1) + 2 とします。

修正対象の探し方
MetaEditorで OnTick() を開き、次の行を検索してください。

  • キーワード:iLowest(Symbol(), 0, MODE_LOW, 2, 1)

【修正前】(該当1行)

if(iLow(Symbol(), 0, iLowest(Symbol(), 0, MODE_LOW, 2, 1))  ==  iClose(Symbol(), 0, 0)+PipsToPrice(5)) signal = 1;

【修正後】

// 最終エントリー足(シフト)を取得
int lastShift = getLastEntryBar(Symbol(), Period(), 0, Magic1);

// lastShift が取得できた場合のみ、最終エントリー基準の2本区間(2本前・3本前)で最安値を取得
int startShift = (lastShift >= 0) ? lastShift + 2 : 1; // フォールバックとして従来の「1」も確保
if(iLow(Symbol(), 0, iLowest(Symbol(), 0, MODE_LOW, 2, startShift)) == iClose(Symbol(), 0, 0) + PipsToPrice(5)) {
   signal = 1;
}

ポイント

  • getLastEntryBar(...) は最終エントリーが行われた足のシフトを返します。そこから +2 とすることで、「エントリー時点から2本前と3本前」の2本区間をちょうど参照できます。
  • 単に「1 を getLastEntryBar() に置き換える」だけだと、“エントリー足とその1本後” の2本を参照してしまい、狙いとズレます。
  • そのため、getLastEntryBar(...) + 2 にするのが重要です。
  • もしバックテスト開始直後などで getLastEntryBar(...)-1(見つからない)を返すケースに備え、フォールバックとして startShift=1 を残しています。
みやまん
2025/09/05 02:56

ご回答ありがとうございます。
コードの修正は難しいです。ご回答の修正前と修正後をそのまま入れ替えればよろしいでしょうか。

また、ご質問内容を加筆修正いたします。「基本項目」「オプション」「取引条件」は上記を踏襲。
・「買いエントリー時に、2本前と3本前の安い方の安値−5pipsにストップロスを置きたい」
・ローソク足(時間足:5分,適用価格:高値, 計算位置:3本前)>=
 ローソク足(時間足:5分,適用価格:高値, 計算位置:2本前)
・ローソク足(時間足:5分,適用価格:高値, 計算位置:2本前)<=
 ローソク足(時間足:5分,適用価格:高値, 計算位置:1本前)
・ローソク足(時間足:5分,適用価格:安値, 計算位置:3本前)>=
 ローソク足(時間足:5分,適用価格:安値, 計算位置:2本前)
・ローソク足(時間足:5分,適用価格:安値, 計算位置:2本前)<=
 ローソク足(時間足:5分,適用価格:安値, 計算位置:1本前)

買いエントリー

・「売りエントリー時に、2本前と3本前の高い方の高値+5pipsにストップロスを置きたい」
・ローソク足(時間足:5分,適用価格:高値, 計算位置:3本前)<=
 ローソク足(時間足:5分,適用価格:高値, 計算位置:2本前)
・ローソク足(時間足:5分,適用価格:高値, 計算位置:2本前)>=
 ローソク足(時間足:5分,適用価格:高値, 計算位置:1本前)
・ローソク足(時間足:5分,適用価格:安値, 計算位置:3本前)<=
 ローソク足(時間足:5分,適用価格:安値, 計算位置:2本前)
・ローソク足(時間足:5分,適用価格:安値, 計算位置:2本前)>=
 ローソク足(時間足:5分,適用価格:安値, 計算位置:1本前)

売りエントリー

ご回答、よろしくお願いいたします。

test1.pdf
GogoJungle
2025/09/09 10:30

はい、基本的には「修正前コードと修正後コードをそのまま入れ替える」イメージで問題ございません。

加筆いただいた条件の整理

ご提示のロジックを踏まえると、売買条件とストップロスは次のようになります。

買いエントリー条件

  • 3本前の高値 >= 2本前の高値
  • 2本前の高値 <= 1本前の高値
  • 3本前の安値 >= 2本前の安値
  • 2本前の安値 <= 1本前の安値

→ この条件を満たしたら 買いエントリー
→ ストップロス:2本前と3本前の安い方の安値 − 5pips

売りエントリー条件

  • 3本前の高値 <= 2本前の高値
  • 2本前の高値 >= 1本前の高値
  • 3本前の安値 <= 2本前の安値
  • 2本前の安値 >= 1本前の安値

→ この条件を満たしたら 売りエントリー
→ ストップロス:2本前と3本前の高い方の高値 + 5pips


コード修正のイメージ

EAつくーるが出力する openPosition(signal, lots, take_profit, stop_loss, Magic1) の直前で、stop_loss の値を上書きする形で実現できます。

例:買いエントリー時

if(signal == 1) {
   // 2本前と3本前の安値を取得
   double low2 = iLow(Symbol(), PERIOD_M5, 2);
   double low3 = iLow(Symbol(), PERIOD_M5, 3);
   double sl = MathMin(low2, low3) - PipsToPrice(5);
   stop_loss = sl;
}

例:売りエントリー時

if(signal == -1) {
   // 2本前と3本前の高値を取得
   double high2 = iHigh(Symbol(), PERIOD_M5, 2);
   double high3 = iHigh(Symbol(), PERIOD_M5, 3);
   double sl = MathMax(high2, high3) + PipsToPrice(5);
   stop_loss = sl;
}

このように stop_loss を上書きしてから openPosition() を呼ぶことで、エントリーごとに可変のSLを持たせられます。

関連トピックス

検索結果がありません。

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

注目トピックス

検索結果がありません。