記事"クロスプラットフォームEA: カスタムストップ、ブレイクイーブン、トレーリング"についてのディスカッション - ページ 2

 
Enrico Lambino:

あなたの最初のコードはトレーリングストップではなくブレイクイーブンをアクティブにします。SLをさらに修正するとすれば、それはtakeprofitでしょう。しかし、もしTPが500ポイントであれば、トレーリングは500ポイントでは作動しません。

あなたの2番目のコードはトレーリングストップを使いますが、ブレイクイーブンは使いません。なぜなら、ブレイクイーブンが適用される前でさえ、SLはすでにブレイクイーブン価格の上に移動しているからです。


こんにちは、エンリコ、

私はあなたの言いたいことを理解できませんでした。

これはブレイクイーブンです:

 //--- 損益分岐点の設定
   CTrail *trail_be=new CTrail();
   //trail_be.Set(BELevel,BEOpenPriceDist,0); 
   trail_be.Set(230,250,0);   
   trails.Add(trail_be);

これはトレーリングです:

//--- トレーリングストップの設定
   CTrail *trail=new CTrail();
   //trail.Set(trail_value,trail_start,trail_step);
   trail.Set(400,500,10);
   trails.Add(trail);

ブレイクイーブンは250ポイントで発動し、トレーリングは500ポイントで発動します。トレーリングがブレイクイーブンより早く作動することはありません。

SLはブレイクイーブン価格の上(または下)には移動していません。ストップロスはオープンプライスの 下にある最初のSLと同じでした。トレーリングストップはSLを始値(およびブレークイーブン価格)より上に移動させました。

トレイリングは問題なく機能。ブレイクイーブンは機能しません(trail_beオブジェクト)。トレーリング・ストップを使わなければ、ブレイクイーブンは問題なく機能します。

 

問題は売り注文だけの ようだ。

double CTrailsBase::Check(const string symbol,const ENUM_ORDER_TYPE type,const double entry_price,const double price,const ENUM_TRAIL_TARGET mode)
  {
   if(!Active())
      return 0;   
   double val=0.0,ret=0.0;
   MqlDateTime time_curr;
   TimeCurrent(time_curr);
   if(time_curr.day==3 && time_curr.hour==11 && time_curr.min>=30)
      Print("");
   for(int i=0;i<Total();i++)
     {
      CTrail *trail=At(i);
      if(!CheckPointer(trail))
         continue;
      if(!trail.Active())
         continue;
      int trail_target=trail.TrailTarget();
      if(mode!=trail_target)
         continue;
      val=trail.Check(symbol,type,entry_price,price,mode);
      if((type==ORDER_TYPE_BUY && trail_target==TRAIL_TARGET_STOPLOSS) || (type==ORDER_TYPE_SELL && trail_target==TRAIL_TARGET_TAKEPROFIT))
      {
         if(val>ret || ret==0.0)
            ret=val;
      }      
      else if((type==ORDER_TYPE_SELL && trail_target==TRAIL_TARGET_STOPLOSS) || (type==ORDER_TYPE_BUY && trail_target==TRAIL_TARGET_TAKEPROFIT))
      {
         if(val<ret || ret==0.0)
            ret=val;
      }      
     }
   return ret;
  }

この場所の問題

 else if((type==ORDER_TYPE_SELL && trail_target==TRAIL_TARGET_STOPLOSS) || (type==ORDER_TYPE_BUY && trail_target==TRAIL_TARGET_TAKEPROFIT))
      {
         if(val<ret || ret==0.0)
            ret=val;
      }      

に変更すべきでしょうね:

 else if((type==ORDER_TYPE_SELL && trail_target==TRAIL_TARGET_STOPLOSS) || (type==ORDER_TYPE_BUY && trail_target==TRAIL_TARGET_TAKEPROFIT))
      {
         if( (val>0 && val<ret) || ret==0.0)
            ret=val;
      }      
 

さらに詳しく説明していただきありがとうございます。今回の変更について:

else if((type==ORDER_TYPE_SELL && trail_target==TRAIL_TARGET_STOPLOSS) || (type==ORDER_TYPE_BUY && trail_target==TRAIL_TARGET_TAKEPROFIT))
      {
         if( (val>0 && val<ret) || ret==0.0)
            ret=val;
      }   

通常、私はブレイクイーブンのCTrailを最後のインデックスとして置くだけで、それが最後に評価されるようにしていますが、上記のコードは売りトレードのストップロスをトレールするための、より恒久的なソリューションです。

 

特定のシグナルに特定のストップをバインドするには?私のストラテジーのロジックでは、すべてのエントリーシグナルはそれぞれ独自のストップを持っています。

エグジットシグナルも同じです。

 

こんにちは、私はエキスパートに問題があるのですが、あなたは私を助けることができますか?


'SetContainer' - unexpected token, probably type is missing?	SymbolManagerBase.mqh	55	21
'SetContainer' - function already defined and has different type	SymbolManagerBase.mqh	55	21
'Deinit' - unexpected token, probably type is missing?	SymbolManagerBase.mqh	62	21
'Deinit' - function already defined and has different type	SymbolManagerBase.mqh	62	21