如何为多个交易对运行EA? - 页 2

 
mittalpa:

我认为这两种方法都很好。

我想补充的唯一一点是,由于开销较少,方案2有性能上的优势。一切都在内存中,显然比文件操作快。

选项3的一个优势是,如果您想使用文件数据做一些MT4无法做到的事情。

另外,如果您需要建立一个可以从停电等情况下恢复的EA,而不需要用户干预来更新市场情况等,您会发现自己建立了文件访问功能

 
cloudbreaker wrote>>

同时考虑到,如果你需要建立一个能够从停电等情况下恢复的EA,而不需要用户干预来更新市场状况等,你会发现自己无论如何都要建立文件访问功能。

根据我的经验,你要想建立一个交易多个货币对的EA,会遇到很多麻烦。

1. 每个货币对都需要自己的自定义逻辑、优化,对于某些货币对甚至可能需要不同的交易策略。我曾经为某一特定货币对编写了EA,并对其进行了优化,使其交易良好。然后,当我试图在另一个与第一个货币对相关性最强的货币对上使用它时,我惊讶地发现,为了让EA在第二个货币对上运行和优化,许多事情都必须改变。我发现,每个货币对都需要有自己完整的自定义设置、指标值,很多时候甚至需要改变基本逻辑和策略。对我来说,创建一个非常灵活的EA,内置几个不同的策略和逻辑分支,会更有意义。然后只需为每个交易对创建一个新的最佳.set文件就可以了。

2. 你想制作的EA将无法在策略测试器中进行回测和优化。根据我的经验,回测和优化是必不可少的。有一些优化极大地提高了我的EA性能,如果我不使用Strategy Tester,我永远不可能发现这些优化。它给了我一些东西,比如指标设置与许多人认为的对某一特定指标最有用和最理想的数值相去甚远,以至于我从来没有想过要尝试接近最佳值的数值。 想想你在你的EA中有多少个参数。每个参数都需要优化,而一个参数的每一次优化可能需要改变另一个参数。这就是为什么你不能只对每个参数本身进行优化。优化的目标是让你所有的参数尽可能地相互优化。这可能需要很长的时间和使用测试器的大量工作,但是仅仅通过自己一个一个地改变参数来手动完成这些优化是几乎不可能的。

另外,无论你决定以何种方式对你的EA进行编码,将你的EA状态或其他信息保存到文件中,在大多数情况下不是强制性的,也不是唯一的选择。最好的、最有效的和最简单的方法是将你的状态保存到全局变量中。毕竟,这正是全局变量功能被添加到MT中的根本原因。此外,你们中的一些人还谈到,为了交换存储在文件系统中的数据,创建了一个额外的EA,允许两个EA之间进行数据交换和互动。这也是没有必要的。全局变量的另一个特点是在多个EA之间进行数据交换,甚至条件逻辑能力。 这允许不同图表上的多个EA获得任何EA的数据,并使用这些数据做出决定,从而影响另一个EA的变化。即使在电脑崩溃或断电的情况下,这些数据也是安全可靠的。但是,当你在保存、阅读或在EA之间交换数据的过程中,有一个或两个文件打开,在崩溃或断电的情况下会发生什么?你很可能会出现数据丢失、数据损坏和最糟糕的情况--零字节文件或根本没有文件。 有了全局变量,这些问题都不可能发生。你的EA状态将与你的系统瘫痪前一毫秒的状态完全一样。现在,每个人都在谈论GV的缺点,那就是他们不能存储字符串,但有一些好的方法可以解决这个问题。

首先,如果你使用GV名称作为字符串值,GV就可以存储字符串,例如GlobalVariableSet(Symbol() + "LastUptime=" + TimeLocal(), -1); 这样做的一个问题是,GV名称的长度有限制,所以你不能使用这种方式来保存长字符串。另一个我一直使用的很好的解决方法是将字符串存储在图形对象的文本字段中。你可以像处理订单和GV那样处理它们。有一些mql函数可以获得GV和图形对象的总量,这样你就可以通过所有这些对象进行循环,找到你要找的那个对象,这与你循环订单的方式完全相同。

警告:我现在要讲一些关于图形对象可以增强你的交易功能的其他很酷的方法......有点偏离主题,但可能是有用的信息......

你可以用图形对象做更多有用的事情。例如,我的一个EA有一个可选的对冲功能。当对冲功能启用时,任何新下的订单当然没有真正的止损,因为在同一个符号上进行对冲时,如果第一个订单超过了正常的止损,那么重点是要开一个相反的订单,而第一个订单需要保持开放。因此,你的代码需要知道止损是什么,并监控交易,以便在第一张订单达到止损价格时打开对冲,为了防止有任何误解,我们不能在订单上使用实际的止损,因为这样订单就会被关闭,当然也就没有对冲。但通过图形对象,你可以使其更好地工作,并使其在用户看来与真正的止损完全一样。你的做法是这样的。当你下单时,同时你创建一个水平线对象,其价格参数=止损价格。线条对象的名称是 "Order #" + orderTicket;描述是 "StopLoss @ " + SLPrice。将线的样式设置为STYLE_DASHDOT,颜色为红色,你就有了一条看起来和真实情况完全一样的止损线。使其工作的代码也很简单。你需要的所有信息都已经存储在线对象中--订单票号和SL价格,这是线对象的值。然后你做一个函数,检查当前价格是否达到或超过了线。当这种情况发生时,你会得到保存在行的名称字段中的票据#。然后你找到具有相同票据的未平仓订单。选择该订单,看它是买入还是卖出订单,同时得到手数。现在您有了所有您需要的信息来打开您的对冲订单。你打开一个与第一个订单相反的新订单,并具有相同的手数。最后一步是删除止损线。当你看着它工作时,它是非常酷的,因为现在你可以看到你何时接近 "对冲"。

另一个好处是,如果你认为你的订单可能会成功,如果价格看起来可能会回到你有利的位置,但你只是需要多一点空间,那么只需将SL/Hedge线往上拖一点。难道你不希望你能用标准的SL和TP线来做这个吗?如果他们让止损线和止盈线可以移动,那将是一个伟大的新功能,这样我们就可以在市场真正移动时做出快速调整。当然,你今天可以通过上述步骤在你的EA中做到这一点,一个好的好处是经纪人永远不会看到你的SL或TP。坏处是如果你的电脑坏了,你就没有服务器端的SL或TP。但是像FapTurbo这样的机器人也是如此。他们的 "隐蔽 "方法是在订单上放置假的SL和TP值,然后从代码中关闭订单,或者在价格接近的最后一分钟用正确的SL和TP值修改订单。

 
Jacques366:

嗨,你们好。

我更愿意记住我们仍然是在实时处理中工作,所以我只是忘记了使用while循环或等待函数来保持手的沟通

将您的EA附加到像欧元兑美元这样的货币对上,可以为您提供足够的信号来管理所有其他的货币对,而刻度是非常频繁的。这不是分的问题,而是秒的问题(运行一个循环2分钟对我来说听起来很疯狂)。如果这不是一秒钟的问题,那就想一想为什么,或者用另一个经纪人看看。

如果你真的需要比将你的EA附加到eurusd上所得到的更多,可以考虑将你的EA单独运行到每个货币上。对不起,我倾向于认为 "或重新考虑你的系统"。

如果觉得这个帖子有点唐突,请原谅。我想与你分享我的观点。

祝您好运。

我是一个程序员新手,所以请考虑这是一个 "假设 "场景,用于讨论。


我意识到创建一个无尽的While循环,而循环中没有任何成果,或者它阻止你执行你的EA的剩余部分,这是不好的编程,但如果你创建一个无尽的While循环,包含你的EA的主体,那会怎样? 我对MQL4编程的理解不够透彻,不能完全理解你的 "保持沟通的手 "的评论。 如果你通过一个独立的脚本启动交易订单,如果EA继续在一个无尽的循环中运行,你会不会有通信问题?


我正在继续玩弄使用无尽的While循环的想法,并通过独立的脚本发布交易指令,因为依靠传入的欧元兑美元点数来运行EA会导致一些长时间的延迟。 例如,在格林威治标准时间今天7点到8点之间,最长的等待时间是31秒,但在当天晚些时候,在纽约时段结束时,等待一个传入的刻度线可能需要2分钟---我还没有检查亚洲时段,但我怀疑它也有一些长时间的刻度线间隔。


如果你把你的EA主体放在一个无尽的循环中,你可以很容易地控制更新你正在交易的所有货币的频率,而不牺牲任何延迟。 事实上,如果在1秒钟内有50次通过EA的机会,你可能必须在循环中加入100-250毫秒的睡眠语句,使其速度放慢一些。


我感谢所有的反馈。

 
vangrosh wrote>>

警告--我现在要讲一些关于图形对象可以增强你的交易功能的其他很酷的方法的兔子线索......有点偏离主题,但可能是有用的信息......

灿烂!

 
vangrosh:

根据我的经验,你要想建立一个交易多个货币对的EA,会遇到很多麻烦。

这是非常酷的东西,我一定会把它的大部分引入我的EA中。

我已经决定的几件事是
1.每个EA只能有一对。
2.2.每一对只能有一个订单。(这一点以后可能会改变,但我会坚持下去,直到我变得足够熟练)。

非常感谢您分享您的黄金经验。

Pankaj
 

该图显示了2009年4月29日欧元兑美元的点位时间间隔。我不知道这个数据代表哪个时区。这些数据是从Gain Capital下载的。

正如你所看到的,在一天中的某些时段,刻度之间的时间间隔经常超过一分钟,偶尔会超过两分钟。



 
vangrosh:

然后,它只是一个简单的问题,为每一对创建一个新的最佳.set文件。

vangrosh:你是如何创建和使用 .set文件的?我找不到任何关于这种类型的文件的参考资料。

 
cloudbreaker wrote>>

同时考虑到,如果你需要建立一个能够从停电等情况下恢复的EA,而不需要用户干预来更新市场状况等,你会发现自己无论如何都要建立文件访问功能。

请看一下这里:https://book.mql4.com/special/index

复杂程序的一般特征


如果你想创建多币种的EA,那就去吧。

 
StraightTrader:

请看这里:https://book.mql4.com/special/index

复杂程序的一般特征


如果你想创建多币种的EA,那就去吧。

谢谢你的参考。

 
FXtrader2008 wrote>>

该图显示了2009年4月29日欧元兑美元的点位时间间隔。我不知道这个数据代表哪个时区。这些数据是从Gain Capital下载的。

正如你所看到的,在一天中的某些时段,刻度之间的时间间隔经常超过一分钟,偶尔会超过两分钟。

谢谢你的图表。如果能与其他一些货币的图表相匹配就更好了,以确保你没有同样的延迟。(如果你能方便地提供例如4个货币对的图表,我将非常感激。)

我只是说,当我开始建立我的EA时,当我在金牛座上没有1或2分钟的刻度时,其他货币也是如此。也许这只是当时的一个危险,或者是我做的一个错误的决定,但是我保留了这个想法,我的EA现在已经运行了几个月,没有任何问题。事实的经验弥补了逻辑的不足,我保持了我的EA像这样工作。如果我遇到了问题,我就会植入你的解决方案,我的意思是你的想法,让你的EA保持清醒,只是在两次运行之间有一个延迟。据我所知,逻辑上应该是这样做的:但我不知道经纪人是如何产生刻度的,所以很难更进一步。

根据你程序中运行的系统进行编码也是 "正常 "或 "更好 "的。

因此,允许多货币处理,我们通常应该能够将我们的EA附加到一个提供所有刻度的通道上。这就是我们必须以某种方式处理的系统逻辑的不足。

注意事项

原因: