同时运行一个以上的EA

 
我的EA在独立运行时运行良好,但如果我试图在同一时间在同一配置文件中的不同符号上运行同一EA,那么第二个EA就不能很好地运行,或者根本不能运行,或者有很多错误。即使我对两个独立的图表使用Symbol() 和不同的魔法数字,这种情况也会发生。如果我运行同一代码的不同版本(即EA文件名和神奇数字不同,但代码是相同的),这种情况也会发生。我是否与全局变量有某种冲突,或者是否有其他原因导致第二个图表挂起?谢谢。
 
Sneck55:
我的EA在独立运行时运行良好,但如果我试图在同一时间在同一配置文件中的不同符号上运行同一EA,那么第二个EA就不能很好地运行,或者根本不能运行,或者有很多错误。即使我对两个独立的图表使用Symbol()和不同的魔法数字,这种情况也会发生。如果我运行同一代码的不同版本(即EA文件名和神奇数字不同,但代码是相同的),这种情况也会发生。我是否与全局变量有某种冲突,或者是否有其他原因导致第二个图表挂起?谢谢。

在不同的图表上运行相同的EA应该不是问题(我这样做没有任何问题),你应该提供代码。
 

是的,如果第二个程序挂起,很可能是试图使用与第一个程序相同的资源。


Sneck55


最好给我们看一下代码,如果不费时的话,我们会告诉你哪一个是罪魁祸首。

 
使用SRC-按钮!
 
gooly: 使用SRC-按钮!
SRC的哪部分不清楚?你为什么没有?编辑你的帖子!

  1. 播放视频
    编辑 您的帖子。
    对于大量的代码,请附上。

  2.          if(BuyTicket != 0)                                        
                {                                                      
                if(SmallMA<MediumMA)
                {
                for(Counter = 0; Counter <=OrdersTotal()-1; Counter++)
                {
                   :
                    Counter--;
                }
    如果电源故障、操作系统崩溃、终端或图表被意外关闭,下次BuyTicket就会丢失。你会有一个 开放的订单,但永远不会试图关闭它。当你使用OrderSelect 循环时,你不需要记住票号。
  3. 在关闭/删除时,你必须倒数。如果另一个EA关闭了一个订单,返回一个将不起作用。循环和关闭或删除订单 - MQL4论坛
  4. 简化你的布尔运算法则
    // if(SmallMA>MediumMA&&MediumMA>LargeMA) MABuyFanning = true;
    // else MABuyFanning = false;
       MABuyFanning = (SmallMA>MediumMA&&MediumMA>LargeMA);
  5. if(NewBar == true)
    你永远不会写if((2+2) ==4) ==true),对吗?if(2+2 ==4) 就足够了。所以不要写if(bool == true),只要用if(bool)if(!bool)
 
使用了SRC按钮来发帖
 
Sneck55:
使用了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;   
}
 
Sneck55: SRC按钮是用来发帖的
qjol: 是的,但第一行 "对不起,延迟.... "不是代码,它破坏了一切。
你为什么不编辑 你的原帖
 
这段代码非常简单,但我在越多的窗口上运行它,它的表现就越差。我一直在4个不同的符号上运行它,但几分钟后它甚至开始在一个符号上失效。 而且它开始时很好,但我运行的时间越长(几个小时左右),它就变得越来越慢,越来越不准确。 有时它可能需要一分钟才能从每个窗口中删除每个EA,光标旁的小圆圈会转上好几圈。我有一台速度很好的电脑,我刚刚对它进行了碎片整理和病毒扫描--我也在我的笔记本电脑上试过,结果完全一样。我试着下载了所有的M1历史记录,但没有任何区别。是否可能是某种内存泄漏问题? MT4是否试图重复使用相同的资源?显然,在这个问题解决之前,我无法相信它能在我的真实账户上进行交易。
 
这很有趣...