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

 

雅克,我感谢你对这个话题的持续关注。 我仍然在调试我的第一个货币的EA,但如果发现合适的话,我打算在几个货币上使用它。 在这个前提下,我一直在考虑如何实现这一概念的策略。 因此,我对这个主题感兴趣。


根据你的要求,我又准备了三个货币对的图表,在这样做的时候,我发现其中两个货币对在24小时内有超过32,000个点(Excel中的图表数据限制)。 因此,我不得不将图表分成两个时期(第一个12小时,第二个12小时)。 为了保持相对一致,我把所有三个货币对分成了12小时的时段。


有一点要记住,这些图表上的垂直比例在水平线之间是成比例的,但水平比例不是与时间成比例的(即你不能假设1/12的刻度代表一个小时)。


我认为从这些图表中得到的最大启示是,所有的交易对在24小时内都有一些时间段,在这些时间段内,刻度之间有明显的间隔。 因此,如果你将多个货币对合并到一个EA中,我认为采用 "While "循环是明智的。 StraightTrader的参考资料https://book.mql4.com/special/index,题为 "复杂程序的一般特征",对这种技术有很好的讨论,并在本文的开头部分有一个图表。


GBPJPY 24小时内44,834点

欧元兑日元24小时内37,140点

英镑兑美元 24小时内29,313点

欧元兑美元24小时内22,627点













欢呼吧!

 
FXtrader2008:

因此,如果您将多个货币对合并为一个EA,我认为采用 "While "循环是明智的。 StraightTrader的参考资料https://book.mql4.com/special/index,题为 "复杂程序的一般特征",对这种技术有很好的讨论,并在本文的开头部分有一个图表。

这正是情况。在一个EA中的多个货币对->使用while loop方法,而不是通过incomming ticks开始函数激活。


我想反对一个EA使用一个货币对。

我的长期方法是一个多币种多策略的EA。前段时间我准备了通用专家顾问方案,实现了其中一些想法。

后来,在我的帖子中没有提到,我接着开发了这个代码,并开始了谷歌代码项目,名为 Universaltrader。这个项目可以满足你的期望。唯一没有实施的是注意到的While cycle方法(易于实施)。


MULTICURRENCY MULTISTRATEGY EA的一些优势。

  • 所有的策略都在一起
  • 可以同时调整/设置所有的策略,也可以单独设置
  • 可以开启/关闭不同的策略/货币对
  • 我相信还有很多优点。

劣势。

  • 一次只能回测一个货币对 - 你必须在关闭其他货币对的情况下,对你交易的货币对进行多次回测。
  • 性能问题 - 我只在回测中注意到性能问题,但我确信在实际交易中也是如此 - 这取决于实施的策略的复杂性和数量。

这个项目还需要改进,如果有人有兴趣,我可以邀请他加入这个谷歌代码项目。


目前的脚本附在这里。

附加的文件:
 
FXtrader2008 wrote>>

雅克,我感谢你对这个话题的持续关注。我仍然在调试我的第一个货币的EA,但如果发现合适的话,我打算在几个货币上使用它。在这个前提下,我一直在考虑如何实现这一概念的策略。因此,我对这个主题感兴趣。

根据你的要求,我又准备了三个货币对的图表,在这样做的时候,我发现其中两个货币对在24小时内有超过32,000个点(Excel中的图表数据限制)。因此,我不得不将图表分成两个时期(第一个12小时,第二个12小时)。为了保持相对一致,我把所有三个货币对分成了12小时的时段。

有一点要记住,这些图表上的垂直比例在水平线之间是成比例的,但水平比例不是与时间成比例的(即你不能假设1/12的刻度代表一个小时)。

我认为从这些图表中得到的最大启示是,所有的交易对在24小时内都有一些时间段,在这些时间段内,刻度之间有明显的间隔。因此,如果你将多个货币对合并到一个EA中,我认为采用 "While "循环是明智的。StraightTrader的参考资料https://book.mql4.com/special/index,题为 "复杂程序的一般特征",对这种技术有很好的讨论,并在本文的开头部分有一个图表。

GBPJPY 24小时内44,834点

欧元兑日元24小时内37,140点

英镑兑美元 24小时内29,313点

欧元兑美元24小时内22,627点

欢呼吧!

非常感谢你的图表。

让我们选择一个循环,而不是嘀嗒运行激活,对于那些需要分钟精度的人来说,这将是更科学的,而且实现起来也不是什么大问题。另一个好处是,你可以将EA附加到你想要的任何货币对上(当它在图表上画出对象时很有用)。

干杯

 
cloudbreaker wrote>>

而你可以通过使用MarketInfo()函数检索当前图表之外的符号的最新卖出和买入价格。

所以你有如下选择。

- 将同一个EA连接到许多图表上,为每个图表的原始符号进行操作(使用Ask和Bid内置变量)。

- 将一个EA连接到一个特定的图表上,对所有选择的符号进行操作(对非本地符号使用MarketInfo()函数)--只是使用本地符号的ticks作为触发装置

- 在不同的图表上有主从EA,其中一个由另一个触发(例如,一个将数值写入文件,另一个不断读取文件,直到找到该数据,然后进行交易)。

现在,我正在使用这些策略中最简单的策略--我在四种货币的三个时间框架上有一个EA,所以总共有12个。它们都被设置为在时间框架的第一个刻度上运行。然而,我遇到了一个问题,即MT4并不总是执行所有的EA。我在启动函数后加了一个打印语句,想看看发生了什么,结果只找到了四个EA中的三个,例如H1,但它在不同的时间遗漏了不同的货币对,而且除了每个货币对的优化设置外,EA是相同的。

问题--当多个EA被设置为同时运行时,MT4是否一次只执行一个EA? 一个EA的执行是否以任何方式依赖于另一个EA的执行(除了交易环境繁忙),还是完全独立?

如果是这样,我可以使用第二个选项,我只是想让EA尽可能的简单,因为至少对我来说,我写的越复杂,我犯的错误就越多。

 
joetrader:

现在,我正在使用这些策略中最简单的策略--我在四个货币的三个时间框架上有一个EA,所以总共有12个。它们都被设置为在时间框架的第一个刻度上运行。然而,我遇到了一个问题,即MT4并不总是执行所有的EA。我在启动函数后加了一个打印语句,想看看发生了什么,结果只找到了四个EA中的三个,例如H1,但它在不同的时间遗漏了不同的货币对,而且除了每个货币对的优化设置外,EA是相同的。

问题--当多个EA被设置为同时运行时,MT4是否一次只执行一个EA? 一个EA的执行是否以任何方式依赖于另一个EA的执行(除了交易环境繁忙),还是完全独立?

如果是这样,我可以使用第二个选项,我只是想让EA尽可能的简单,因为至少对我来说,我写的越复杂,我犯的错误就越多。

我有多个EA在图表上运行,没有这样的问题。就我所知,它们是同时运行的,只有当其中一个使用交易环境时,它们才会相互注意。至于EA本身,它是完全独立的--每个EA都有自己的变量副本,等等。让我把话说清楚--你在12个图表上运行12个EA?也许你有内存问题?

 
gordon wrote>>

我有多个EA在图表上运行,没有这样的问题。就我所知,它们是同时运行的,只有当其中一个使用交易环境时,它们才会相互注意。至于EA本身,它是完全独立的--每个EA都有自己的变量副本,等等。让我把话说清楚--你在12个图表上运行12个EA?也许你有内存问题?

是的。 12个图表上的12个EA。 很新的电脑有6GB内存,所以我不认为 会是内存问题,但这值得考虑,我也不会排除它。 但你已经回答了我的问题--如果EA应该能够同时运行,那么也许我只是做错了什么。 这不是第一次了! 我将检查代码,再研究一下。谢谢你的帮助。

 
你是否在MT4客户端的不同实例中运行图表?如果你在一个实例中打开所有的图表,那么它们将共享一个交易环境,你将需要在逻辑中编码以共享该环境--如果你的EA的行为意味着不止一个可能在同一时间执行交易操作。CB
 
cloudbreaker wrote>>
你是否在MT4客户端的不同实例中运行图表?如果你在一个实例中打开所有图表,那么它们将共享一个交易环境,你将需要在逻辑中编码以共享该环境--如果你的EA的行为意味着不止一个可能在同一时间执行交易操作。CB

是的 - 我在同一个MT4客户端上运行它们。 但我使用的是这篇文章中的一个交易背景繁忙 解决方案https://www.mql5.com/en/articles/1412,我没有得到任何交易背景繁忙的 错误。

它似乎甚至没有达到尝试开仓的地步。 在某些情况下,它似乎根本没有启动EA。 我这么说是因为我在启动函数的开头放了一个打印语句。

下面是我的启动函数。

void start()
{
//---- 只对新条的第一个点进行交易
if(Volume[0]>1) return;
Print("Tick Check");

如果(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else CheckForClose();
}

我正在交易CADJPY,EURCHF,GBPUSD,和USDJPY。

而我得到的是这样的结果。

2010.01.22 8:59:45 [EAName]USDJPY,H1: Tick Check

2010.01.22 8:59:45 [EAName]CADJPY,H1: Tick Check

2010.01.22 8:59:45 [EAName]GBPUSD,H1: 勾选检查

2010.01.22 9:59:45 [EAName]EURCHF,H1: 勾选检查

2010.01.22 9:59:46 [EAName]GBPUSD,H1:勾选检查

2010.01.22 9:59:46 [EAName]CADJPY,H1:勾选检查

有些时候所有四个都会交易,有些只有三个。 如果是一个小时的H4交易,其中三个可能会交易,但通常不是所有四个和三个或四个H1交易。

我已经创建了一个变通方法,我把交易量增加到3或4个点,以确保所有的交易,但我正试图更好地了解MetaTrader,以便我能够解决根本问题。

所以我的问题是--既然我的EA只有一个tick可以运行, 它是否会同时运行每个EA,也许这就是它们没有全部运行的原因? 我的EA中有一个循环,比较了多达1500个过去的分形来寻找止损点,所以这可能需要一些时间。

再说一遍,可能只是我的代码中某个地方出了问题。

 
我猜测你的代码有问题,这与多个EA的主题无关。你需要针对那些没有开始使用标准Print()/Alert()方法的问题,看看哪些地方不工作。
 
tigersoft:
这里有一个简单的代码,在一个图表上打开欧元兑美元和美元兑瑞郎。即使EA被添加到另一个图表上,它也会打开EURUSD和USDCHF。

//+------------------------------------------------------------------+
//|                                                          jkh.mq4 |
//|                      Copyright © 2009, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

bool wannaBuy = true;
bool wannaBuy1 = true;
extern double LotSize = 0.01;
extern string symbol1 = "EURUSD";
extern string symbol2 = "USDCHF";
extern int MaxDifference = 6;
extern int Slippage = 3;
extern int Magicnumber1 = 786;
extern int Magicnumber2 = 123;
int sendticket = 3;
string pairs[18];

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
pairs[0] = symbol1;
pairs[1] = symbol2;
wannaBuy = true;
wannaBuy1 = true;

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   // Send order for EURUSD & USDCHF
   if (wannaBuy) {   
   int ticket1;
   RefreshRates();
   ticket1 = OrderSend(symbol1, OP_BUY, LotSize, MarketInfo(symbol1,MODE_ASK), Slippage, 0, 0, 0,0,Magicnumber1,0) & OrderSend(symbol2, OP_BUY, LotSize, MarketInfo(symbol2,MODE_ASK), Slippage, 0, 0, 0,0,Magicnumber2,0);
   if (ticket1 <0 )
   {
   Print ("OrderSend failed with error #", GetLastError());
   return(0);
   }
   wannaBuy = false;
   }

//----
   return(0);
  }
//+------------------------------------------------------------------+

不起作用?

用于回溯测试
得到了订单结束错误4106

订单发送功能 中的USDCHF符号名称不明

如果我在设置或EURUSD图表中选择符号EURUSD,Ordersend对EURUSD有效。

如果我换成另一个图表,我将得到EURUSD和USDCHF的未知符号。

谢谢!预先声明