编码帮助......我如何让指标过滤而不是警报?

 

当价格达到上限或下限时,这将产生一个警报。

我想允许交易执行,直到它们接近这些线。当价格过于接近时,不允许交易开始。

当这里所有的东西都是数组时,我如何让这个逻辑发生在当前条形收盘时?

for(int x=0; x<limit; x++) {

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);

}
 

我看到你很努力,做得很好!在这个阶段,我觉得你最需要的是知道如何帮助自己,所以我建议你广泛使用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来说不是那么好,所以你将不得不用基础知识来弥补。

继续努力吧,伙计,你会成功的。

 
Aaragorn:
当价格达到上限或下限时,会产生一个警报。

我想允许交易执行,直到它们接近这些线。当价格过于接近时,不允许交易开始。

当这里所有的东西都是数组时,我怎样才能让这个逻辑在当前条形收盘时发生?

你可以把这个 作为一个例子。它与你想得到的很接近。就我所见,它与你所使用的指标相同。

 
pipeline:
我看到你很努力,做得很好!在这个阶段,我觉得你最需要的是知道如何帮助自己,所以我建议使用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);

}

希望这有帮助,祝你好运。

关于那个搜索函数...它没有返回任何东西。我试着在元编辑器中使用了几次。我输入我想要的东西,然后按回车键,但什么也没有发生,或者我点击搜索字符串旁边的小方框,也没有发生。我只是注意到这是一个多么蹩脚的搜索,因为它根本就不起作用。我指的是元编辑导航窗口中的搜索功能......是否有一些我不知道的协议来使它工作?

 
fx-programmer:
是的,你在正确的轨道上。

我会停止一切,重新阅读c++编程。

不幸的是,面向对象的编程对MQ4来说不是那么好,所以你必须用基础知识来弥补。

继续努力吧,伙计,你会成功的。

谢谢你的鼓励,精神上的支持很重要。你知道我在这里的理论目标是什么吗?你能建议一个更好的方法(你所说的基础知识)来实现这个目标吗?

 
pipeline:

现在,一般来说,要对收盘价进行处理,你要测试一个新条形的开盘,然后在数组的索引1上写下你的条件。一个可能的代码来检测一个新条形的开盘。

bool NewBar()

{

static datetime dt = 0;

如果(Time[0] != dt)

{

dt = Time[0];

return(true);

}

return(false);

}

希望这有帮助,祝你好运。

如果你知道我的意思,这几乎是有帮助的。假设它返回真,那么,你如何从当前收盘时的数组中得到指标的值,因为它已经被检测到有一个新的柱子?

 
 
Aaragorn:

昨晚我在谷歌上搜索,发现了这个...

http://www.gordago.com/?act=download

有谁有这方面的经验吗? 是真的吗?

Gordago不处理或仍不能处理自定义指标。这是一个主要的缺点。

学习编程的唯一方法是慢慢来,就像你现在所做的......从实例中学习。Coders' Guru的东西很适合学习。

祝你好运。

马吉

 
我今天想说,让指标见鬼去吧,看看我是否能创造一些东西,让我参考之前(x)条的最高价和最低价。

我对指标看得越多,这似乎越有吸引力....。

好的,我看到了预定义变量中的high()。我如何使用它来获得过去30小时的最高点,例如?

 

编写指标是一回事,而编写EA是另一回事。不要把它们混为一谈。在指标中,你也必须处理历史,以正确绘制它。当编写EA时,你只有当前的tick,你必须计算每一个tick的值(如果你不想放松交易)。因此,为了获得当前tick的上下边缘的数值,你可以做两件事

  1. 将原始指标作为一个客户指标使用
  2. 将该指标的逻辑写入你的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)。

现在你有了上下限值,你可以根据价格检查它们。

希望这能让你有所收获

伊莱