トレーリングストップ

2025/05/07 22:41
253

トーレーリングストップのソースコード変更で、以下のように変更できますか?

デフォルトでは、逆指値が切り上がっていきますが、これを指値が切り上がるようにできますか?

コメント

GogoJungle
2025/05/09 10:46

例えば買いポジションの場合、価格の上昇に応じて指値も上げてしまうと、指値の意味がなくなってしまう(一生刺さらない)と存じますが、どのような戦略となりますでしょうか?(例えば、上限を設ける等。)

もう少し詳細にお伺いできれば、適切なアドバイスをさせていただけるかもしれません。

青春
2025/05/09 13:41

初期設定 ドル円 100円スタート 指値40Pips トレーリングストップ 20pips TS決済10Pips

エントリー後、順行していき、20pips上がったところで、指値を40pipsから60pipsに変更、順行するたびに更新。
ピークから10pips逆行で決済。19pips以下の順行では、指値は変わりません。

このようには、ソースコード修正できますか?

GogoJungle
2025/05/09 19:25

回答担当者の認識が間違っている場合は大変失礼いたしますが、ご提案いただいた方法では、順行するたびに指値の値が逃げていってしまうため、設定した指値で決済されることはなく、そもそも指値を設定する意味がないと存じます。
想定していらっしゃるロジックにて、(「ピークから10pips逆行で決済」ではなく、) 指値で 決済されるのはどのような状況か、お教えいただけますと幸いでございます。

青春
2025/05/09 21:41

ピークから逆行を入れないと、新しい指値に達せずに、逆行する事もあります。もちろん通常の指値でも同じですが。
MT4デフォルトのトーレーリングストップは、このように指値が切り上がるタイプです。

GogoJungle
2025/05/13 10:28

解釈のために尽力を尽くしたのですが、やはり、指値が切りあがり続ける以上、現在の価格が指値に到達することがないため、「そもそも指値を設定する必要がない」、つまり、「利食い」の値を0にしておけばよいという結論にいたりました。
「ピークからの逆行」の部分は理解できております。(これは指値が関係ありませんね。)

「こういう場合に 指値で 決済される」という状況を、詳細にお教えいただけますと幸いでございます。

青春
2025/05/13 17:27

新パラメータ TS発動40 TS決済10と言うものを新たに設置し、エントリーから40順行でそこに指値を設置、順行するごとに指値切り上げ、ピークから10逆行で決済と言うのはどうですか?

GogoJungle
2025/05/13 18:20

大変おそれいりますが、その場合はどのようなケースで「 指値で 決済される」のでしょうか?
「ピークから10pips逆行で決済」の部分は理解しております。
指値を設置しているにも関わらず、指値で決済されることがないように存じておりまして、指値で決済されるご状況をお伺いしたいのでございます。

青春
2025/05/13 20:03

ドル円 100円 TS発動40Pips TS決済10pips

100.4になった時に指値40が設定、もしそこで10逆行すれば、30の時に決済
100.4になった時に指値40が設定、もしそこで5逆行すれば、決済せず
100.4になった時に指値40が設定、そこで60になれば、指値も60に 80なら80に
80から5逆行なら決済せず
80から10逆行で70で決済

のようになります。

GogoJungle
2025/05/14 20:11

詳細なご説明ありがとうございます。
ご説明の通りですと、(「ピーク」ではなく)あくまで「指値」と呼んでいるものを基準に10pipsの逆行で決済のようですが、よろしいでしょうか?
例えば、59pipsまで順行(この時点で「指値」は40pipsにあります)した後に10pips逆行して49pipsになった場合は特に何も起きず、そのまま逆行を続けて30pipsになったタイミングで決済する感じです。
(「ピークから10pips逆行」というルールを守る場合は49pipsのタイミングで決済しますが、その場合は40pipsの位置に「指値」を置いた意味がなくなってしまいます。「ピーク」と呼んでいるものが「指値」と呼んでいるものと同じであると解釈しました。)

そして、このロジックはトレーリングストップを段階的に行うことになります。
すなわち、

エントリーから40pips順行したタイミングで、30pipsの位置にSLを設定する
60pipsまで順行したタイミングで、SLを50pipsの位置に移動する
80pipsまで順行したタイミングで、SLを70pipsの位置に移動する


ということでございます。
こちらで問題がなければ、EAつくーるで出力したコードを少し改造すれば実現可能ですので、紹介させていただくことが可能です。
もしも解釈が間違っている場合はお伝えいただければ幸いです。

青春
2025/05/14 20:49

>> エントリーから40pips順行したタイミングで、30pipsの位置にSLを設定する
60pipsまで順行したタイミングで、SLを50pipsの位置に移動する
80pipsまで順行したタイミングで、SLを70pipsの位置に移動する

この通りです。

ただ、ソースコードは構造から変えるような大幅なものになるのですか? 一部の修正や追加になりますか?

GogoJungle
2025/05/16 09:54

承知しました。
通常の「トレーリングストップ(固定幅)」オプションを適用していただいた上で、コードの一部を修正すれば実現すると存じます。
計算式が少々複雑ですが、ほぼコピペで完成させられる方法を考えてみましたので、紹介いたします。

準備

「トレーリングストップ(固定幅)」オプションについて、「間隔」を20pipsにした状態で適用し、ダウンロードされたコードを開きます。

変数の定義

新しい変数TrailinStopStartValue, TrailinStopRetrogradeValueを用意します。それぞれ、トレーリングストップが開始するタイミングと逆行のpipsを表しますので、40, 10としておきます。
コード内に元から用意されておりますTrailinStopNormalValueという変数は、これまで通り、トレーリングストップの間隔(今回の例では20pips)として使用します。

※本来はTrailingStopなのですが、出力されるコードに合わせて"g"のないTrailinStopとしている点にご注意ください。

【修正前】

input bool isTrailingStop = true;
input double TrailinStopNormalValue = 20;

【修正後】

input bool isTrailingStop = true;
input double TrailinStopStartValue = 40; // こちらを追加
input double TrailinStopRetrogradeValue = 10; // こちらを追加
input double TrailinStopNormalValue = 20;

関数の呼び出し

関数を呼び出す行を修正し、先程追加した変数を渡してあげます。

【修正前】

   if(isTrailingStop == true) TrailingStop(TrailinStopNormalValue, Magic1);

【修正後】

   if(isTrailingStop == true) TrailingStop(TrailinStopStartValue, TrailinStopRetrogradeValue, TrailinStopNormalValue, Magic1); // コピペでOKです

関数の定義

TrailingStop関数を次のように書き換えます。(元の関数を消して、以下をコピペしていただければOKです。)

void TrailingStop(double ts_start, double ts_retrograde, double ts_value, int magic)
{
  for(int i = OrdersTotal() - 1; i >= 0; i--) {
    if(!OrderSelect(i, SELECT_BY_POS) || OrderSymbol() != Symbol() || OrderMagicNumber() != magic) continue;

    double sl = 0;
    double profit_pips = 0;
    
    if(OrderType() == OP_BUY) {
      profit_pips = PriceToPips(Bid - OrderOpenPrice());
      if (profit_pips < ts_start) continue;
      sl = OrderOpenPrice() + PipsToPrice(MathMax(MathFloor((profit_pips - ts_start) / ts_value + 2.0) * ts_value - ts_retrograde, 0));
      if(sl > OrderOpenPrice() && sl > OrderStopLoss()) {
        setTPSL(0, sl, OrderTicket());
      }
    } 
    else if(OrderType() == OP_SELL) {
      profit_pips = PriceToPips(OrderOpenPrice() - Ask);
      if (profit_pips < ts_start) continue;
      sl = OrderOpenPrice() - PipsToPrice(MathMax(MathFloor((profit_pips - ts_start) / ts_value + 2.0) * ts_value - ts_retrograde, 0));
      if(sl < OrderOpenPrice() && (sl < OrderStopLoss() || OrderStopLoss() == 0)) {
        setTPSL(0, sl, OrderTicket());
      }
    }
  }
}

以上でございます。
ご参考になりましたら幸いでございます。

青春
2025/05/16 13:03

複雑なので、エラーが起きるかもしれませんが、試してみます。

青春
2025/05/16 17:33

TS1.PNG

エラーになります。

青春
2025/05/16 17:34

if(isTrailingStop == true) TrailingStop(TrailinStopNormalValue, Magic1);
これのmagic2にも追加すっる必要がありますか?

青春
2025/05/20 14:21

magic2を付け加えたら、コンパイル・起動しました。
パラメータのtrailingstopnormalvalueとは、もともとの逆指値が切り上がるTSの事ですか?
これが20になっているので、20動いた時に逆指値が20切り上がるという事ですか?
そうであれば、これをtrue falseのパラメータを追加できますか?

GogoJungle
2025/05/20 14:33

(追加のコメントありがとうございます。回答に少々お時間をいただきます。先に、ご用意させていただいておりました回答をご案内させていただきます。)

> if(isTrailingStop == true) TrailingStop(TrailinStopNormalValue, Magic1);
これのmagic2にも追加する必要がありますか?

ご指摘の通りです。
もしも「ポジション」が2つ以上の場合、全てのMagic〇(〇には数字が入ります)について、TrailingStop関数を利用する箇所の書き換えが必要となります。

Magic2に対応したコードの変更は次の通りです。

【修正前】

   if(isTrailingStop == true) TrailingStop(TrailinStopNormalValue, Magic2);

【修正後】

   if(isTrailingStop == true) TrailingStop(TrailinStopStartValue, TrailinStopRetrogradeValue, TrailinStopNormalValue, Magic2); // コピペでOKです
青春
2025/05/20 17:10

trailingstopnormalvalue20
こちらを追加20と5に設定すると、

利益が35pipsになりました。
これは、trailingstopnormalvalue20+こちらを追加20+こちらを追加5 で、35pipsという事ですか?

まだ、決済が2回なので偶然かもしれませんが。意図するTSに照らし合わせると、順行して20pipsになった時に指値を40にして、40になってすぐ5pips逆行で35pipsで決済となりますか?
2回も全く同じ35になるとは思えないのですが。

また、買いが決済すれば、次は必ず売りが決済されます。しかし、買いが3回連続で決済されることもあります。

青春
2025/05/20 17:29

railingstopnormalvalue20+こちらを追加20+こちらを追加-5 で、35pipsという事ですか?

GogoJungle
2025/05/21 15:34

ご認識の通りでございます。

最初に提示させていただいた条件の場合

input double TrailinStopStartValue = 40; // こちらを追加
input double TrailinStopRetrogradeValue = 10; // こちらを追加
input double TrailinStopNormalValue = 20;

40pipsの順行でトレーリングストップがスタート。この時点で40-10=30pipsの位置にSLを設定する。(40pipsから10pipsの逆行で決済することになります。)
↓順行
40+20=60pipsの順行でSLを更新。この時点で60-10=50pipsの位置にSLを設定する。(60pipsから10pipsの逆行で決済することになります。)
↓順行
60+20=80pipsの順行でSLを更新。この時点で80-10=70pipsの位置にSLを設定する。(80pipsから10pipsの逆行で決済することになります。)

ご提示いただいた条件の場合

input double TrailinStopStartValue = 20; // こちらを追加
input double TrailinStopRetrogradeValue = 5; // こちらを追加
input double TrailinStopNormalValue = 20;

20pipsの順行でトレーリングストップがスタート。この時点で20-5=15pipsの位置にSLを設定する。(20pipsから5pipsの逆行で決済することになります。)
↓順行
20+20=40pipsの順行でSLを更新。この時点で40-5=35pipsの位置にSLを設定する。(40pipsから5pipsの逆行で決済することになります。)
↓順行
40+20=60pipsの順行でSLを更新。この時点で60-5=55pipsの位置にSLを設定する。(60pipsから5pipsの逆行で決済することになります。)

一般化

input double TrailinStopStartValue = A; // こちらを追加
input double TrailinStopRetrogradeValue = B; // こちらを追加
input double TrailinStopNormalValue = C;

Apipsの順行でトレーリングストップがスタート。この時点でA-Bpipsの位置にSLを設定する。(ApipsからBpipsの逆行で決済することになります。)
↓順行
A+Cpipsの順行でSLを更新。この時点でA+C-Bpipsの位置にSLを設定する。(A+CpipsからBpipsの逆行で決済することになります。)
↓順行
A+2Cpipsの順行でSLを更新。この時点でA+2C-Bpipsの位置にSLを設定する。(A+2CpipsからBpipsの逆行で決済することになります。)

つまり

Aがトレーリングストップを開始するときのpips
Bが「これだけ逆行したら決済する」のpips
Cがトレーリングストップの間隔のpips
です。

青春
2025/05/21 17:03

試してみます。

関連トピックス

検索結果がありません。

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

注目トピックス

検索結果がありません。