我的EA在独立运行时运行良好,但如果我试图在同一时间在同一配置文件中的不同符号上运行同一EA,那么第二个EA就不能很好地运行,或者根本不能运行,或者有很多错误。即使我对两个独立的图表使用Symbol() 和不同的魔法数字,这种情况也会发生。如果我运行同一代码的不同版本(即EA文件名和神奇数字不同,但代码是相同的),这种情况也会发生。我是否与全局变量有某种冲突,或者是否有其他原因导致第二个图表挂起?谢谢。
Sneck55:
我的EA在独立运行时运行良好,但如果我试图在同一时间在同一配置文件中的不同符号上运行同一EA,那么第二个EA就不能很好地运行,或者根本不能运行,或者有很多错误。即使我对两个独立的图表使用Symbol()和不同的魔法数字,这种情况也会发生。如果我运行同一代码的不同版本(即EA文件名和神奇数字不同,但代码是相同的),这种情况也会发生。我是否与全局变量有某种冲突,或者是否有其他原因导致第二个图表挂起?谢谢。
我的EA在独立运行时运行良好,但如果我试图在同一时间在同一配置文件中的不同符号上运行同一EA,那么第二个EA就不能很好地运行,或者根本不能运行,或者有很多错误。即使我对两个独立的图表使用Symbol()和不同的魔法数字,这种情况也会发生。如果我运行同一代码的不同版本(即EA文件名和神奇数字不同,但代码是相同的),这种情况也会发生。我是否与全局变量有某种冲突,或者是否有其他原因导致第二个图表挂起?谢谢。
在不同的图表上运行相同的EA应该不是问题(我这样做没有任何问题),你应该提供代码。
使用SRC-按钮!
gooly: 使用SRC-按钮!
SRC的哪部分不清楚?你为什么没有?编辑你的帖子!
播放视频请编辑 您的帖子。
对于大量的代码,请附上。if(BuyTicket != 0) { if(SmallMA<MediumMA) { for(Counter = 0; Counter <=OrdersTotal()-1; Counter++) { : Counter--; }
如果电源故障、操作系统崩溃、终端或图表被意外关闭,下次BuyTicket就会丢失。你会有一个 开放的订单,但永远不会试图关闭它。当你使用OrderSelect 循环时,你不需要记住票号。- 在关闭/删除时,你必须倒数。如果另一个EA关闭了一个订单,返回一个将不起作用。循环和关闭或删除订单 - MQL4论坛
- 简化你的布尔运算法则
// if(SmallMA>MediumMA&&MediumMA>LargeMA) MABuyFanning = true; // else MABuyFanning = false; MABuyFanning = (SmallMA>MediumMA&&MediumMA>LargeMA);
if(NewBar == true)
你永远不会写if((2+2) ==4) ==true),对吗?if(2+2 ==4) 就足够了。所以不要写if(bool == true),只要用if(bool) 或if(!bool)。
使用了SRC按钮来发帖
Sneck55:
使用了SRC按钮来发帖
使用了SRC按钮来发帖
是的,但第一行 "对不起,延迟.... "不是代码,它破坏了一切。
#property copyright "Copyright 2014, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict extern bool CheckOncePerBar = true; extern double FixedLotSize = 1; extern double SystemStopLoss = 150; extern double TakeProfit = 0; extern int Slippage = 5; extern int MagicNumber = 3574; //Global Variables int BuyTicket; int SellTicket; double InternalStopLoss; double CalcDigits; double CalcPoint; bool MABuyFanning; bool MASellFanning; int SelectedOrder; bool Closed; int ErrorCode; string ErrLog; double BuyStopLoss; double SellStopLoss; bool NewBar; double ThisBarOpen; double SmallMA; double MediumMA; double LargeMA; int Counter; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { CalcDigits = MarketInfo(Symbol(),MODE_DIGITS);//MODE_DIGITS is count of digits after decimal point if(CalcDigits == 0) CalcPoint = 1;//Dow if(CalcDigits == 1) CalcPoint = 0.1; if(CalcDigits == 2) CalcPoint = 0.01;//Gold & Nymex if(CalcDigits == 3) CalcPoint = 0.01;//Yen if(CalcDigits == 4) CalcPoint = 0.0001;//Not used if(CalcDigits == 5) CalcPoint = 0.0001;//Non-Yen forex InternalStopLoss = SystemStopLoss*CalcPoint; return(INIT_SUCCEEDED); } //----------------------------------------------- void OnTick() { if(CheckOncePerBar == true) { if(ThisBarOpen != Open[0]) { ThisBarOpen = Open[0]; NewBar = true; } else NewBar = false; } else NewBar = true; if(NewBar == true) { //Reset Moving Averages SmallMA = iMA(NULL,0,8,0,1,0,0); MediumMA = iMA(NULL,0,10,0,1,0,0); LargeMA = iMA(NULL,0,50,0,1,0,0); if(SmallMA>MediumMA&&MediumMA>LargeMA) MABuyFanning = true; else MABuyFanning = false; if(SmallMA<MediumMA&&MediumMA<LargeMA) MASellFanning = true; else MASellFanning = false; if(BuyTicket == 0 && MABuyFanning == true) { RefreshRates(); BuyStopLoss = Bid - InternalStopLoss; // while(IsTradeContextBusy()) Sleep(10); BuyTicket = OrderSend(Symbol(),OP_BUY,FixedLotSize,Ask,Slippage,BuyStopLoss,0,"Buy Order",MagicNumber,0,Green); if(BuyTicket == -1) { ErrorCode = GetLastError(); Alert("Symbol: ",Symbol(),"Error in buy routine: ",ErrorCode); ErrLog = StringConcatenate("Bid: ",MarketInfo(Symbol(),MODE_BID)," Ask: ",MarketInfo(Symbol(),MODE_ASK)," Lots: ",FixedLotSize," Stop Loss: ",BuyStopLoss); Print(ErrLog); //Buy ticket revert to 0 so it can try again in case of slow connection/timeout etc. BuyTicket = 0; } } if(SellTicket == 0 && MASellFanning == true) { RefreshRates(); SellStopLoss = Ask + InternalStopLoss; // while(IsTradeContextBusy()) Sleep(10); SellTicket = OrderSend(Symbol(),OP_SELL,FixedLotSize,Bid,Slippage,SellStopLoss,0,"Sell Order",MagicNumber,0,Red); if(SellTicket == -1) { ErrorCode = GetLastError(); Alert("Symbol: ",Symbol(),"Error in sell routine: ",ErrorCode); ErrLog = StringConcatenate("Bid: ",MarketInfo(Symbol(),MODE_BID)," Ask: ",MarketInfo(Symbol(),MODE_ASK)," Lots: ",FixedLotSize," Stop Loss: ",SellStopLoss); Print(ErrLog); SellTicket = 0; } } //Exits if(BuyTicket != 0) { if(SmallMA<MediumMA) { for(Counter = 0; Counter <=OrdersTotal()-1; Counter++) { SelectedOrder = OrderSelect(Counter,SELECT_BY_POS); if(OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() && OrderType() == OP_BUY) { // while(IsTradeContextBusy()) Sleep(10); Closed = OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_BID),Slippage,Red); if(Closed == true) BuyTicket = 0; else Alert("Symbol: ",Symbol()," Ticket: ",BuyTicket," unable to close buy order(s): buy ma convergence close routine"); } Counter--; } } } if(SellTicket != 0) { if(SmallMA>MediumMA) { for(Counter = 0; Counter <=OrdersTotal()-1; Counter++) { SelectedOrder = OrderSelect(Counter,SELECT_BY_POS); if(OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() && OrderType() == OP_SELL) { // while(IsTradeContextBusy()) Sleep(10); Closed = OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_ASK),Slippage,Red); if(Closed == true) SellTicket = 0; else Alert("Symbol: ",Symbol()," Ticket: ",SellTicket," unable to close sell order(s): sell ma convergence close routine"); } Counter--; } } } } return; }
这段代码非常简单,但我在越多的窗口上运行它,它的表现就越差。我一直在4个不同的符号上运行它,但几分钟后它甚至开始在一个符号上失效。 而且它开始时很好,但我运行的时间越长(几个小时左右),它就变得越来越慢,越来越不准确。 有时它可能需要一分钟才能从每个窗口中删除每个EA,光标旁的小圆圈会转上好几圈。我有一台速度很好的电脑,我刚刚对它进行了碎片整理和病毒扫描--我也在我的笔记本电脑上试过,结果完全一样。我试着下载了所有的M1历史记录,但没有任何区别。是否可能是某种内存泄漏问题? MT4是否试图重复使用相同的资源?显然,在这个问题解决之前,我无法相信它能在我的真实账户上进行交易。
这很有趣...