我看到你很努力,做得很好!在这个阶段,我觉得你最需要的是知道如何帮助自己,所以我建议你广泛使用MQL的 "NAvigator->Search "功能,你会找到许多问题的答案(人们可以从指标中调用的唯一东西是缓冲区,这是通过iCustom()完成的;对象不是数组等等)。例如,搜索 "数组 "就会知道Current Bar的数组索引是0,Last Bar的数组索引是1,以此类推。
如果搜索功能的条目都让人不知所措,那么你可能是想在这个阶段做一些对你来说太难的事情。我相信上面的大部分例子在codersguru的初级课程中都有涉及,所以我建议再读一下。
你也可以采取一个简单的EA,并尝试稍微简化/修改它,这将教会你如何工作。一旦完成后,你可以尝试将其复杂化。
如果我说错了,请原谅。
现在,一般来说,要对收盘价 进行操作,你要测试一个新条形的开盘,然后在数组的索引1上写下你的条件。一个可能的代码来检测一个新条形的开口。
bool NewBar()
{
static datetime dt = 0;
如果(Time[0] != dt)
{
dt = Time[0];
return(true);
}
return(false);
}
希望这有帮助,祝你好运。
是的,你是在正确的轨道上。
我将停止所有的工作,重新阅读C++编程。
不幸的是,面向对象对于mq4来说不是那么好,所以你将不得不用基础知识来弥补。
继续努力吧,伙计,你会成功的。
我看到你很努力,做得很好!在这个阶段,我觉得你最需要的是知道如何帮助自己,所以我建议使用MQL的 "NAvigator->Search "功能_广泛使用,你会找到许多问题的答案(唯一可以从指标中调用的是缓冲区,这是通过iCustom()完成的;对象不是数组等等,还有很多很多)。例如,搜索 "数组 "就会知道Current Bar的数组索引是0,Last Bar的数组索引是1,以此类推。
如果搜索功能的条目都让人不知所措,你可能是想做对你来说在这个阶段太难的事情。我相信上面的大多数例子在codersguru的初级课程中都有涉及,所以我建议再读一下。
你也可以采取一个简单的EA,并尝试稍微简化/修改它,这将教会你如何工作。一旦完成后,你可以尝试将其复杂化。
如果我说错了,请原谅。
现在,一般来说,要对收盘价进行操作,你要测试一个新条形的开盘,然后在数组的索引1上写下你的条件。一个可能的代码来检测一个新条形的开口。
bool NewBar()
{
static datetime dt = 0;
如果(Time[0] != dt)
{
dt = Time[0];
return(true);
}
return(false);
}
希望这有帮助,祝你好运。关于那个搜索函数...它没有返回任何东西。我试着在元编辑器中使用了几次。我输入我想要的东西,然后按回车键,但什么也没有发生,或者我点击搜索字符串旁边的小方框,也没有发生。我只是注意到这是一个多么蹩脚的搜索,因为它根本就不起作用。我指的是元编辑导航窗口中的搜索功能......是否有一些我不知道的协议来使它工作?
是的,你在正确的轨道上。
我会停止一切,重新阅读c++编程。
不幸的是,面向对象的编程对MQ4来说不是那么好,所以你必须用基础知识来弥补。
继续努力吧,伙计,你会成功的。谢谢你的鼓励,精神上的支持很重要。你知道我在这里的理论目标是什么吗?你能建议一个更好的方法(你所说的基础知识)来实现这个目标吗?
现在,一般来说,要对收盘价进行处理,你要测试一个新条形的开盘,然后在数组的索引1上写下你的条件。一个可能的代码来检测一个新条形的开盘。
bool NewBar()
{
static datetime dt = 0;
如果(Time[0] != dt)
{
dt = Time[0];
return(true);
}
return(false);
}
希望这有帮助,祝你好运。如果你知道我的意思,这几乎是有帮助的。假设它返回真,那么,你如何从当前收盘时的数组中得到指标的值,因为它已经被检测到有一个新的柱子?
Gordago不处理或仍不能处理自定义指标。这是一个主要的缺点。
学习编程的唯一方法是慢慢来,就像你现在所做的......从实例中学习。Coders' Guru的东西很适合学习。
祝你好运。
马吉
我对指标看得越多,这似乎越有吸引力....。
好的,我看到了预定义变量中的high()。我如何使用它来获得过去30小时的最高点,例如?
编写指标是一回事,而编写EA是另一回事。不要把它们混为一谈。在指标中,你也必须处理历史,以正确绘制它。当编写EA时,你只有当前的tick,你必须计算每一个tick的值(如果你不想放松交易)。因此,为了获得当前tick的上下边缘的数值,你可以做两件事
- 将原始指标作为一个客户指标使用
- 将该指标的逻辑写入你的EA中
第一种方法并不难。你必须首先找出用于上线和下线的缓冲指数。
要找到它,你必须在指标代码中寻找
SetIndexBuffer(0,upper);
SetIndexBuffer(1,middle1);
SetIndexBuffer(2,lower);
正如你所看到的,上线是索引0,中间是索引1,下线是索引2。
现在,我们有了这些信息,我们必须知道该指标有多少个参数。为了得到这个信息,我们必须寻找以外部 字开头的行。
我只找到1行
extern int period = 34。
现在,我们可以把这个指标作为一个客户使用了
double upLevel = iCustome(NULL,0, "Trend Bands", 34, 0, 0);
double LowLevel = iCustome(NULL,0, "Trend Bands", 34, 2, 0);
34是该指标的参数
0是缓冲指数(2为下限)。
最后一个0是条形移动(在EA中我们需要的是当前的,所以我们使用0)。
现在你有了上下限值,你可以根据价格检查它们。
希望这能让你有所收获
伊莱
当价格达到上限或下限时,这将产生一个警报。
我想允许交易执行,直到它们接近这些线。当价格过于接近时,不允许交易开始。
当这里所有的东西都是数组时,我如何让这个逻辑发生在当前条形收盘时?
Xdown[x] = 0; Xup[x] = 0;
middle1[x] = iMA(NULL, 0, period, 0, MODE_EMA, PRICE_TYPICAL, x);// drawn line
middle2= iMA(NULL, 0, period, 0, MODE_SMA, PRICE_TYPICAL, x);// only used to calculate outer bands
avg = findAvg(period, x);
upper[x] = middle2 + (3.5*avg);
lower[x] = middle2 - (3.5*avg);
if (MathAbs(upper[x] - High[x]) < 2*Point)
{
Xdown[x] = upper[x];
if (NewBar() && x == 0)
Alert(Symbol()," ",Period()," reach upper edge");
}
if (MathAbs(lower[x] - Low[x]) < 2*Point)
{
Xup[x] = lower[x];
if (NewBar() && x == 0)
Alert(Symbol()," ",Period()," reach lower edge");
}
}
return(0);
}