マイナス域までトレーリングストップを機能させるには

2024/03/17 15:42
225

マイナス域までトレーリングストップを機能させるにはどうしたらよいですか(添付図参照).
損切りもプラス域の利益最大からトレーニングしたいと考えています.実際,回してみてもマイナス域に入るとStopLoss(以降SL)の設定値で決済されてしまいます.SL=0にすれば機能するかと思いましたが,どこまでも損失が増えていきました.
説明書のトレーニングストップの項目に「現在のストップロスより損失が拡大する場合はストップロスが変更されません」と書いていますが,EAつくーるでの設定は無理でしょうか.
どうぞよろしくお願いします
トレーリングストップ機能.jpg

トレーリングストップ機能.zip

コメント

GogoJungle
2025/02/27 18:05

EAつくーる側では、実現不可能でございますが
プログラムを変更することで実現ができると思いまして手順をご案内いたします。

出力したプログラムの中に下記トレーリングストップ用の関数がございますので
後述の変更手順に沿って、変更、コンパイル、バックテストをお願いいたします。

トレーリングストップ用の関数

void TrailingStop(double ts_value, int magic)
{
  double sl = 0;

  for(int i = OrdersTotal() - 1; i >= 0; i--) {
    if(OrderSelect(i, SELECT_BY_POS) == false) continue;
    if(OrderSymbol() != Symbol() || OrderMagicNumber() != magic) continue;

    if(OrderType() == OP_BUY) {
      sl = Bid - PipsToPrice(ts_value);
      if(sl > OrderOpenPrice() && sl > OrderStopLoss()) {
        setTPSL(0, sl, OrderTicket());
      }
    }
    else if(OrderType() == OP_SELL) {
      sl = Ask + PipsToPrice(ts_value);
      if(sl < OrderOpenPrice() && (sl < OrderStopLoss() || OrderStopLoss() == 0)) {
        setTPSL(0, sl, OrderTicket());
      }
    }
  }
}

プログラムを変更する

sl > OrderOpenPrice() && , sl < OrderOpenPrice() && を削除

変更前

      if(sl > OrderOpenPrice() && sl > OrderStopLoss()) {
      if(sl < OrderOpenPrice() && (sl < OrderStopLoss() || OrderStopLoss() == 0)) {

変更後

      if(sl > OrderStopLoss()) {
      if((sl < OrderStopLoss() || OrderStopLoss() == 0)) {

バックテスト結果

下記設定でバックテストを実施しました。

  • 損切り:100pips
  • 利食い:100pips
  • トレーリングストップ(固定幅):20pips

変更前

+20pipsの状態からトレーリングストップ開始。

1687_01.png

変更後

初期エントリーの状態からトレーリングストップ開始。

1687_02.png

ご参考いただけますと幸いです。何卒よろしくお願い申し上げます。

Magoo
2024/03/18 16:01

ご回答ありがとうございます
ダウンロード版プログラムの相当する部分を書き換えてバックテストを行いました.SL=0, TP=0で設定しています.結果,設定どおりにトレーリングストップが設置される場合とされない場合が混在しました.されない場合は,プラス域で決済されないことが多かったです.変更したダウンロード版のプログラムを下記に示します.
どうぞよろしくお願いします.

extern int TrailingStopPoint = 10;
void TrailingStop(int magic){
double sl;
for(int i = 0; i < OrdersTotal(); i++){;
if(OrderSelect(i, SELECT_BY_POS,MODE_TRADES) == false) break;
if(OrderMagicNumber() != magic || OrderSymbol() != Symbol()) continue;
if(OrderType() == OP_BUY){
sl = Bid - TrailingStopPoint * Point * Mult;
// if(sl >= OrderOpenPrice() && sl > OrderStopLoss()) TrailOM(sl, 0, OrderTicket());
if(sl >= OrderOpenPrice()) TrailOM(sl, 0, OrderTicket());
}
if(OrderType() == OP_SELL){
sl = Ask + TrailingStopPoint * Point * Mult;
// if(sl <= OrderOpenPrice() && (sl < OrderStopLoss() || OrderStopLoss() == 0)) TrailOM(sl, 0, OrderTicket());
if((sl <= OrderOpenPrice() || OrderStopLoss() == 0)) TrailOM(sl, 0, OrderTicket());
}
}
}

Magoo
2024/03/18 16:03

すみません.プログラムの変更まちがえていました.再度トライします

Magoo
2024/03/18 16:19

無事にスリッページの幅も含め確認できました.
お手数をおかけしました.どうもありがとうございます.

Magoo
2024/03/18 16:22

〇スプレッド×スリッページ

関連トピックス

検索結果がありません。

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

注目トピックス

検索結果がありません。