现在我有些不明白,我是否必须为它们制作 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));
}
//+------------------------------------------------------------------+
这就是我得到的结果,它正确地显示了一切。

很抱歉,我的说法不够具体。
在我看来,如果写了一个函数,就意味着它在不同的参数下都能工作。否则就没有意义了。
让我们添加 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)); } //+------------------------------------------------------------------+
很抱歉,我的说法不够具体。
在我看来,如果你写了一个函数,就意味着它在不同的参数下都能工作。否则,它们就没有意义。
让我们添加 TimeFrame 参数。然后在另一个参数下测试程序,例如,与当前参数相等的参数,例如,在日线图上将其设置为 PERIOD_D1。
我检查了你的变体--它也能正常运行。我将其作为脚本在 D1 时间框架上运行,参数为 H1 和 D1。数值是正确的(我检查了最后三个条形图)
我检查了您的变体 - 它也能正常工作。我将其作为脚本在 D1 时间框架上运行,参数为 H1 和 D1。数值是正确的(我检查了最后三个条形图)
我刚开始学习。我下载了它,把它放在 D:/\MetaTrader 5/ MQL5/Indicators 文件夹中。
有些指标没有显示任何东西()。
是应该这样吗? 还是我做错了什么?
指标 CrossMa.mq5、Toned_WPR.mq5 和 HistogramSample.mq5 不显示。
其他指标正常
复制整个数据数组?
我认为复制一个元素是非常不经济的。
Prival:
应该是这样的吗 还是我做错了什么
你好,谢尔盖。这篇文章是在第一批公开发布的时候写的。从那以后发生了很多变化,也许有些指标需要改进。
一旦有时间,我会尽快修改。
- 2010.02.25
- MetaQuotes Software Corp.
- www.mql5.com
我只定义了一个标记为 INDICATOR_DATA 的缓冲区,并将所有其他缓冲区移至 INDICATOR_CALCULATIONS,这样 CopyBuffer/GetData 就能将正确的复制项返回到目标数组中,从而解决了这个问题。
新文章 探索新功能:MQL5 的自定义指标已发布:
在这里,我无法一一列举新终端和新编程语言的所有新的可能性和功能。这数不胜数,而且部分创新点也需要以单独的章节来进行详细探讨。同样,本章节也不会出现以面向对象编程语言写就的代码。这部分内容十分重要,不能简单地附于其他内容之后作为补充优点呈现给开发人员。在本文中,我们将会探讨指标,以及相比 MQL4 指标的结构、图形、类型和编程细节。希望无论是初学者还是经验丰富的开发人员均能从本文中获益,也许部分读者还会有自己新的发现。
作者:Андрей