文章 "探索新功能:MQL5 的自定义指标"

 

新文章 探索新功能:MQL5 的自定义指标已发布:

在这里,我无法一一列举新终端和新编程语言的所有新的可能性和功能。这数不胜数,而且部分创新点也需要以单独的章节来进行详细探讨。同样,本章节也不会出现以面向对象编程语言写就的代码。这部分内容十分重要,不能简单地附于其他内容之后作为补充优点呈现给开发人员。在本文中,我们将会探讨指标,以及相比 MQL4 指标的结构、图形、类型和编程细节。希望无论是初学者还是经验丰富的开发人员均能从本文中获益,也许部分读者还会有自己新的发现。

作者:Андрей

 

现在我有些不明白,我是否必须为它们制作 2 个缓冲器,以便在 indicator???? 中显示另一周期的高点和低点?


和文章中的

复制高点


为什么函数工作不正确,例如

//+------------------------------------------------------------------+
//|| 获取给定条数的 High 值|
//+------------------------------------------------------------------+
doubleiHigh(stringsymbol,ENUM_TIMEFRAMES timeframe,int index)
{
double high=0;
ArraySetAsSeries(High,true);
intcopied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High);
if(copied>0 && index<copied) high=High[index];
return(high);
}

 

你应该举出具体的例子,而不是笼统地说 "所有东西都是坏的"。

试着运行CopyHigh() 部分的示例:

//+------------------------------------------------------------------+
//|HighAndLow.mq5
//| 2009 年 MetaQuotes 软件公司版权所有。
//|http://www.mql5.com ||
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"

#property description "输出 High[i] 和 Low[i] 值的示例"
#property description "随机选择的酒吧"。

double High[],Low[];
//+------------------------------------------------------------------+
//|| 获取给定条数的最低价
//+------------------------------------------------------------------+
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   ArraySetAsSeries(Low,true);
   int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low);
   if(copied>0 && index<copied) low=Low[index];
   return(low);
  }
//+------------------------------------------------------------------+
//| 获取给定条数的高点
//+------------------------------------------------------------------+
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   ArraySetAsSeries(High,true);
   int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High);
   if(copied>0 && index<copied) high=High[index];
   return(high);
  }
//+------------------------------------------------------------------+
//| 专家勾选功能|
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 在每个刻度上显示带有索引的柱形的最高值和最低值、
//--- 等于滴答到达的秒数
   datetime t=TimeCurrent();
   int sec=t%60;
   printf("High[%d] =%G  Low[%d] =%G",
          sec,iHigh(Symbol(),0,sec),
          sec,iLow(Symbol(),0,sec));
  }
//+------------------------------------------------------------------+

这就是我得到的结果,它正确地显示了一切。



 
Rosh   :

你应该举出具体的例子,而不是笼统地说 "所有东西都是坏的"。

试着运行CopyHigh() 部分的示例:

这就是我得到的结果,它正确地显示了一切。




很抱歉,我的说法不够具体。

在我看来,如果写了一个函数,就意味着它在不同的参数下都能工作。否则就没有意义了。

让我们添加 TimeFrame 参数。让我们在不同的参数下测试程序,例如,与当前参数相同的参数,例如,在日线图上将其设置为 PERIOD_D1。


//+------------------------------------------------------------------+
//|HighAndLow.mq5
//| 2009 年 MetaQuotes 软件公司版权所有。
//|https://www.mql5.com ||
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#property description "输出 High[i] 和 Low[i] 值的示例"
#property description "随机选择的酒吧"。

double High[],Low[];
input ENUM_TIMEFRAMES TimeFrame;
//+------------------------------------------------------------------+
//|| 获取给定条数的最低价
//+------------------------------------------------------------------+
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   ArraySetAsSeries(Low,true);
   int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low);
   if(copied>0 && index<copied) low=Low[index];
   return(low);
  }
//+------------------------------------------------------------------+
//| 获取给定条数的高点
//+------------------------------------------------------------------+
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   ArraySetAsSeries(High,true);
   int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High);
   if(copied>0 && index<copied) high=High[index];
   return(high);
  }
//+------------------------------------------------------------------+
//| 专家勾选功能|
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 在每个刻度上显示带有索引的柱形的最高值和最低值、
//--- 等于滴答到达的秒数
   datetime t=TimeCurrent();
   int sec=t%60;
   printf("High[%d] =%G  Low[%d] =%G",
          sec,iHigh(Symbol(),TimeFrame,sec),
          sec,iLow(Symbol(),TimeFrame,sec));
  }
//+------------------------------------------------------------------+
 
zfs   :


很抱歉,我的说法不够具体。

在我看来,如果你写了一个函数,就意味着它在不同的参数下都能工作。否则,它们就没有意义。

让我们添加 TimeFrame 参数。然后在另一个参数下测试程序,例如,与当前参数相等的参数,例如,在日线图上将其设置为 PERIOD_D1。



我检查了你的变体--它也能正常运行。我将其作为脚本在 D1 时间框架上运行,参数为 H1 和 D1。数值是正确的(我检查了最后三个条形图)

附加的文件:
 
Rosh   :


我检查了您的变体 - 它也能正常工作。我将其作为脚本在 D1 时间框架上运行,参数为 H1 和 D1。数值是正确的(我检查了最后三个条形图)



是的,运行得很好。显然是我的错,我是说数组的方向。但为什么在测试过程中会得到不同的数据,这对我来说仍然是个秘密。感谢您的关注。当你开始做一件新的事情时,你总会有疑虑。
 

我刚开始学习。我下载了它,把它放在 D:/\MetaTrader 5/ MQL5/Indicators 文件夹中。

有些指标没有显示任何东西()。

是应该这样吗? 还是我做错了什么?

指标 CrossMa.mq5、Toned_WPR.mq5 和 HistogramSample.mq5 不显示。

其他指标正常

 
Rosh:

你应该举出具体的例子,而不是笼统地说 "所有东西都是坏的"。

试着运行CopyHigh() 部分的示例:

这就是我得到的结果,它显示的一切都是正确的。



复制整个数据数组?

我认为复制一个元素是非常不经济的。

 

Prival:

应该是这样的吗 还是我做错了什么

你好,谢尔盖。这篇文章是在第一批公开发布的时候写的。从那以后发生了很多变化,也许有些指标需要改进。

一旦有时间,我会尽快修改。

[删除]  
为方便起见,所附源代码 文件和 HTML 代码中的源代码插页现已全部翻译成葡萄牙语。
MQL5.community - User Memo
MQL5.community - User Memo
  • 2010.02.25
  • MetaQuotes Software Corp.
  • www.mql5.com
You have just registered and most likely you have questions such as, "How do I insert a picture to my a message?" "How do I format my MQL5 source code?" "Where are my personal messages kept?" You may have many other questions. In this article, we have prepared some hands-on tips that will help you get accustomed in MQL5.community and take full advantage of its available features.
 
您好,感谢您提供这篇精彩的文章:
如果您在 iCustom 派生类代码中定义了多个 INDICATOR_DATA 标记的缓冲区,那么在尝试从所有 INDICATOR_DATA 标记的缓冲区(第一个缓冲区除外)中获取数据(使用 CopyBuffer/GetData)时,就会出现糟糕的-1,您是否遇到过这种异常情况?

我只定义了一个标记为 INDICATOR_DATA 的缓冲区,并将所有其他缓冲区移至 INDICATOR_CALCULATIONS,这样 CopyBuffer/GetData 就能将正确的复制项返回到目标数组中,从而解决了这个问题。