文章 "本文讨论如何在跨平台智能交易系统中设置自定义停止价位。它还讨论了一种紧密相关的方法, 即随着时间的推移, 定义停止位的演化。" - 页 2

 
Enrico Lambino:

您的第一个代码激活的是盈亏平衡,而不是移动止损。如果要进一步修改止损点,那就是获利点(takeprofit)。但如果您的止损点是 500 点,那么在 500 点时根本不会启动移动止损,因为此时交易已经离场。

您的第二个代码使用了追踪止损,但没有使用盈亏平衡。因为即使在应用盈亏平衡之前,止损价已经高于盈亏平衡价。


你好,恩里科、

我不明白你的意思。

这是盈亏平衡:

 //--- 设定盈亏平衡点
   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 点激活。正如您所看到的,追踪并没有比盈亏平衡更早启动。

止损价没有高于(或低于)盈亏平衡价。止损还是最初的止损,低于开仓价。追踪止损第一次将止损价移动到开盘价(和盈亏平衡价)之上。

跟踪运行正常。盈亏平衡不起作用(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