文章 "扩展 MQL5 标准库和重用代码"

 

新文章 扩展 MQL5 标准库和重用代码已发布:

作为一名开发人员,MQL5 标准库让您的工作变得更加容易。然而,它无法实现世界上所有开发人员的全部需求,所以,如果您觉得您需要更多的自定义程序,您可以对标准库进行进一步的扩展。本文指导您完成将 MetaQuotes 的峰谷技术指标集成至标准库。我们从 MetaQuotes 的设计理念获得启发以实现我们的目标。

简而言之,MQL5 API 旨在让您从代码重用、可靠性、灵活性和易于维护中受益。这是从理论上而言,但除了这一切,如果您计划在 MQL5 中更进一步,开发出更复杂的工具,例如多货币“EA 交易”,首先您应该能够以标准库的方式来编写代码,以便您的应用程序保证成功。

Figure 2. We start downloading MetaQuotes' ZigZag from our MT5 Terminal

作者:Jordi Bassaganas

[删除]  

谢谢。信息量很大。

 

我试图在本文中理解这段代码的含义,为什么要在 CINDICATOBUFFER 附近加上 *,然后使用 at。

((CIndicatorBuffer*)At(0)).Name("ZIGZAG");
((CIndicatorBuffer*)At(1)).Name("HIGH");
((CIndicatorBuffer*)At(2)).Name("LOW");

请提供详细解释

谢谢

 
rodlivar:<br/ translate="no">

我试图在这篇文章中理解这段代码的意思,为什么我们要在 CINDICATOBUFFER 附近加上 *,然后使用 at。

((CIndicatorBuffer*)At(0)).Name("ZIGZAG");
((CIndicatorBuffer*)At(1)).Name("HIGH");
((CIndicatorBuffer*)At(2)).Name("LOW");

请提供详细解释

谢谢

* 表示指针。详细解释请参阅本文在 MQL5 中使用对象指针
 

字符串

m_handle=iCustom(symbol,period,zigzag,depth,deviation_create,backstep);

我找不到指标的路径。

我试图调用的指标都在标准文件夹中,在这里指定路径的正确方法是什么?

 
Tango_X:

字符串

m_handle=iCustom(symbol,period,zigzag,depth,deviation_create,backstep);

我找不到指标的路径。

我试图调用的指标位于标准文件夹中,在此指定路径的正确方法是什么?

标准 Zigzag 位于 Examples 文件夹中 - 您需要在路径中添加文件夹名称


 
Rashid Umarov:

标准 Zigzag 位于 Examples 文件夹中 - 您需要在路径中添加文件夹名称



2017.07.12 10:38:05.703 Proba2(EURUSD.m,M1) 无法加载自定义指标 "Examples\ZigZag" [4302] 什么问题?

怎么了?
 
Tango_X:

2017.07.12 10:38:05.703 Proba2 (EURUSD.m,M1) 无法加载自定义指标 "Examples\ZigZag"[4302]

一切都和您的图片一样。

谁来看看错误代码

err_market_not_selected

4302

在 MarketWatch 中未选择符号

 
Rashid Umarov:

谁来查看错误代码

未选择市场

4302

在MarketWatch中未选择符号


我输入 NULL - 有效,我输入 "EURUSD" - 无效!!!!

bool CiZigZag::Create(const string symbol,const ENUM_TIMEFRAMES period,
                      const int depth,const int deviation_create,const int backstep)
  {
//--- 检查历史记录
   if(!SetSymbolPeriod(symbol,period))
      return(false);
//--- 创建
   //m_handle=iCustom(symbol,period, "Examples\\ZigZag",depth,deviation_create,backstep);
     //m_handle=iCustom("EURUSD",period, "Examples\\ZigZag",depth,deviation_create,backstep); -不起作用
     m_handle=iCustom(NULL,period,"Examples\\ZigZag",depth,deviation_create,backstep);       - работает
//--- 检查结果
   if(m_handle==INVALID_HANDLE)
      return(false);
//--- 指标创建成功
   if(!Initialize(symbol,period,depth,deviation_create,backstep))
     {
      //--- 初始化错误
      IndicatorRelease(m_handle);
      m_handle=INVALID_HANDLE;
      return(false);
     }
//--- ok
   return(true);
  }
      IndicatorRelease(m_handle);
      m_handle=INVALID_HANDLE;
      return(false);
     }
//--- ok
   return(true);
  }
 
找到了!问题解决了!我有一个带前缀的符号名)--"EURUSD.m"。
 
//+------------------------------------------------------------------+
//|| 创建 "之 "字形指示器|
//+------------------------------------------------------------------+
bool CiZigZag::Create(const string symbol,const ENUM_TIMEFRAMES period,
                      const int depth,const int deviation_create,const int backstep)
  {
//--- 检查历史记录
   if(!SetSymbolPeriod(symbol,period))
      return(false);
//--- 创建
   m_handle=iCustom(symbol,period,"zigzag",depth,deviation_create,backstep);
//--- 检查结果
   if(m_handle==INVALID_HANDLE)
      return(false);
//--- 指标创建成功
   if(!Initialize(symbol,period,depth,deviation_create,backstep))
     {
      //--- 初始化错误
      IndicatorRelease(m_handle);
      m_handle=INVALID_HANDLE;
      return(false);
     }
//--- ok
   return(true);
  }
bool CiZigZag::Initialize(const string symbol,const ENUM_TIMEFRAMES period,
                        const int depth,const int deviation_init,const int backstep)
  {
   if(CreateBuffers(symbol,period,3))
     {
      //--- 渲染状态行
      m_name  ="ZigZag";
      m_status="("+symbol+","+PeriodDescription()+","+
               IntegerToString(depth)+","+IntegerToString(deviation_init)+","+
               IntegerToString(backstep)+") H="+IntegerToString(m_handle);
      //--- 保存设置
      m_depth=depth;
      m_deviation=deviation_init;
      m_backstep=backstep;       
      //--- 创建缓冲区
      ((CIndicatorBuffer*)At(0)).Name("ZIGZAG");
      ((CIndicatorBuffer*)At(1)).Name("HIGH");
      ((CIndicatorBuffer*)At(2)).Name("LOW");
      //--- ok
      return(true);
     }
//--- 错误
   return(false);
  }


请帮助我理解这里如何设置 指标缓冲数组的索引方向,即与 ArraySetAsSeries 相同。默认方向是从现在到过去,但我需要从过去到现在。从昨天开始,我就一直在纠结这个问题!求助!