文章 "MQL5 向导:如何创建未平仓位的追踪模块" - 页 2

 

感谢您的精彩文章、

我想请您举例说明如何在编写专家顾问时使用该类,我的意思是在 EA 模板中使用该类,而不是在 EA 中生成。

再次感谢您

 

下午好。该模块无法运行。

日志显示, 临界利润水平必须大于设置订单的水平。

在构造函数中,我初始化了不为空且不等于零的变量。为什么会出错?

 //+------------------------------------------------------------------+
//|TrailingFixedPips.mqh
//| 版权所有 2009-2013, MetaQuotes Software Corp.
//|http://www.mql5.com ||
//+------------------------------------------------------------------+
#include <Expert\ExpertTrailing.mqh>
// 向导描述开始
//+----------------------------------------------------------------------+
//| 类的描述|
Title=Trailing with floating Stop Loss (Fox104) | //| Title=Trailing with floating Stop Loss (Fox104) | |
//| 类型=拖曳|
//| 名称=固定点差|
//| Class=CTrailingFixedPips|
//| Page=|
//| 参数=StopLevel,int,30,止损追踪水平(单位:点) | | | 参数=StopLevel,int,30,止损追踪水平(单位:点
//| 参数=ProfitLevel,int,50,追踪获利水平(以点为单位) | |
//+----------------------------------------------------------------------+
// 向导描述 结束
//+------------------------------------------------------------------+
//| 类 CTrailingFixedPips。|
//| 目的:以点为单位设置固定止损水平的跟踪止损类别。
//| 源自 CExpertTrailing 类。|
//+------------------------------------------------------------------+
class CTrailingFixedPips : public CExpertTrailing
  {
protected:
   //--- 输入参数
   int               m_stop_level;
   int               m_profit_level;

public:
                     CTrailingFixedPips(void);
                    ~CTrailingFixedPips(void);
   //--- 受保护数据的初始化方法
   void              StopLevel(int stop_level)     { m_stop_level=stop_level;     }
   void              ProfitLevel(int profit_level) { m_profit_level=profit_level; }
   virtual bool      ValidationSettings(void);
   //---
   virtual bool      CheckTrailingStopLong(CPositionInfo *position,double &sl,double &tp);
   virtual bool      CheckTrailingStopShort(CPositionInfo *position,double &sl,double &tp);
  };
//+------------------------------------------------------------------+
//| 构造函数|
//+------------------------------------------------------------------+
void CTrailingFixedPips::CTrailingFixedPips(void)
  {
            m_stop_level = 30;
            m_profit_level = 50;
  }
//+------------------------------------------------------------------+
//| 销毁器|
//+------------------------------------------------------------------+
CTrailingFixedPips::~CTrailingFixedPips(void)
  {
  }
//+------------------------------------------------------------------+
//|| 受保护数据的验证设置。
//+------------------------------------------------------------------+
bool CTrailingFixedPips::ValidationSettings(void)
  {
   if(!CExpertTrailing::ValidationSettings())
      return(false);
//--- 初始数据检查
   if((m_profit_level-m_stop_level)*m_adjusted_point<=m_symbol.StopsLevel()*m_symbol.Point() && m_profit_level!=0.0)
     {
      printf(__FUNCTION__+":临界利润水平必须大于订单设置水平"。);
      return(false);
     }
//--- ok
   return(true);
  }
//+------------------------------------------------------------------+
//| 检查多头仓位的追踪止损和/或利润。
//+------------------------------------------------------------------+
bool CTrailingFixedPips::CheckTrailingStopLong(CPositionInfo *position,double &sl,double &tp)
  {
//--- 检查
   if(position==NULL)
      return(false);
   if(m_stop_level==0)
      return(false);
//--- 参数检查 
   if(m_profit_level==0.0)  return(false);
//--- 已经达到收支平衡?
   double open=position.PriceOpen();
   if(position.StopLoss()>=open) return(false);
//--- 利润检查
   sl=EMPTY_VALUE;
   tp=EMPTY_VALUE;
   if(m_symbol.Bid()-open>m_profit_level*m_adjusted_point)
      sl=m_symbol.NormalizePrice(open+m_stop_level*m_adjusted_point);
//---
   return(sl!=EMPTY_VALUE);
  }
//+------------------------------------------------------------------+
//| 检查空头仓位的追踪止损和/或利润。
//+------------------------------------------------------------------+
bool CTrailingFixedPips::CheckTrailingStopShort(CPositionInfo *position,double &sl,double &tp)
  {
//--- 检查
   if(position==NULL)
      return(false);
   if(m_stop_level==0)
      return(false);
//--- 参数检查
   if(m_profit_level==0.0)  return(false);
//--- 已经达到收支平衡?
   double open=position.PriceOpen();
   if(position.StopLoss()<=open) return(false);
//--- 利润检查
   sl=EMPTY_VALUE;
   tp=EMPTY_VALUE;
   if(open-m_symbol.Ask()>m_profit_level*m_adjusted_point)
      sl=m_symbol.NormalizePrice(open-m_stop_level*m_adjusted_point);
//---
   return(sl!=EMPTY_VALUE);
  }
//+------------------------------------------------------------------+

Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
Fox104:

下午好。该模块无法运行。

日志显示, 临界利润水平必须大于设置订单的水平。

在构造函数中,我初始化了不为空且不等于零的变量。为什么会出错?

请在留言中正确输入 代码:在论坛中正确插入代码。(您的信息已被更正)。
 
Andy:

使用文章中指定的模块时,在将智能交易系统加载到图表时,会在智能交易系统日志中产生错误:

2017.09.06 00:28:29.873 1 (EURUSD,M5) OnInit: 错误初始化指标

2017.09.06 00:31:20.256 1 (EURUSD,M5) CExpertBase::SetPriceSeries: 禁止更改时间序列

2017.09.06 00:31:20.256 1 (EURUSD,M5) CExpertBase::SetOtherSeries: 禁止更改时间序列

2017.09.06 00:31:20.256 1 (EURUSD,M5) CExpertBase::InitIndicators: 未检查设置参数

2017.09.06 00:31:20.256 1 (EURUSD,M5) CExpert::InitIndicators: 错误初始化拖尾对象的指标

2017.09.06 00:31:20.256 1 (EURUSD,M5) OnInit: 错误初始化指标

也许它已经过时了,在哪里可以得到一个新的或修复这个问题?

更改 跟踪模块 "sampleTrailing.mqh":

//+------------------------------------------------------------------+
//| 检查设置参数。|
//| INPUT: no.|
//| 如果设置正确,则输出为 true,否则输出为 false。
//| 备注:没有。|
//+------------------------------------------------------------------+
bool CSampleTrailing::ValidationSettings()
  {
   if(!CExpertTrailing::ValidationSettings())
      return(false);
//--- 万一没有调用 Init 方法
   if(m_symbol==NULL) return(false);
//--- 参数检查
   if((m_profit-m_stop_level)*m_adjusted_point<=m_symbol.StopsLevel()*m_symbol.Point() && m_profit!=0.0)
     {
      printf(__FUNCTION__+":临界利润水平必须大于订单设置水平"。);
      return(false);
     }
//--- ok
   return(true);
  }
 
Andy:

使用文章中指定的模块时,在将智能交易系统加载到图表时会在日志中产生错误:


也许它已经过时了,在哪里可以买到新的?

感谢您的留言,文章已更正

 
Andy:

开立 空头头寸 并在参数中将常规止损(非移动止损)设置为 0 时,移动止损不会设置为盈亏平衡,但如果稍微移动常规止损并将其设置为至少-1 点,则一切正常。在做多时一切正常。在检查已经出现盈亏平衡(止损点小于价格)的条件时,止损点的初始值为 0,它不会让止损点继续移动。


这就对了。正是指定的止损触发了跟踪模块在盈亏平衡时的工作。也就是说,假设头寸最初必须有止损。


补充:

任何文章的目的都是展示和熟悉解决某些问题的方法。然后,用户应根据所学知识开发自己的代码。

 
Andy:

应该对其进行补充,以便在没有止损的情况下,尾随也是--至少用开盘值填充变量。

(我收到了您 2 条信息的推送通知,但其中一条丢失了 - 已删除)?


如果您需要更改某些内容,这不是本文要讨论的问题。在这里,您可以根据所学知识自行修改。也就是说,如果您想撰写技术作业,并认为文章会根据技术作业进行改写--事实并非如此。

正如我所看到的那样:重写模块(稍作改动)并使用。


补充:最后一次,请使用 "回复 "按钮。否则我不会回复。

 
Andy:

好吧,我自己写。你是否删除了你的某个帖子(如果删除了请告诉我,这样我就不用再找了)?


你可以开一个新话题,比如"未结头寸维持 到盈亏平衡的模块"--我认为这样的话题会很有用。

是的,我在编辑帖子时误点击了 "删除"--事实上我写了两篇帖子,删除了一篇。因此,推送是正确的。