MQL4 EA 在不同图表上通过不同信号打开订单

MQL4 EA open orders by different signal on different charts

我尝试根据不同图表上的 MA 交叉信号打开多个订单。 我发现一个问题是,当打开第一个订单时,orderstotal() 为零。 所以打开第一个订单很容易。 但是当信号在另一个图表上相遇时,需要在不同的图表上打开下一个订单。 问题是 here.I 计算未结订单数并尝试打开下一个订单。 问题就出在这里,很多频繁的订单打开一次又一次打开 怎么处理

extern int MAGIC =1111;

extern string symbol1="EURUSD";
extern string symbol2="EURCAD";
extern string symbol3="NZDCAD";
extern string symbol4="AUDCAD";
extern string symbol5="NZDUSD";
extern string symbol6="AUDUSD";
extern string symbol7="EURGBP";
extern string symbol8="GBPCAD";
extern string symbol9="GBPUSD";
extern string symbol10="USDCAD";
extern string symbol11="EURAUD";
extern string symbol12="CHFJPY";
extern string symbol13="NZDJPY";
extern string symbol14="NZDCHF";
extern string symbol15="EURNZD";
extern string symbol16="AUDJPY";
extern string symbol17="AUDCHF";
extern string symbol18="EURJPY";
extern string symbol19="EURCHF";
extern string symbol20="GBPCHF";
extern string symbol21="AUDNZD";
extern string symbol22="GBPJPY";
extern string symbol23="GBPAUD";
extern string symbol24="CADJPY";
extern string symbol25="CADCHF";
extern string symbol26="GBPNZD";
extern string symbol27="USDJPY";
extern string symbol28="USDCHF";
extern string symbol29="XAUUSD";

extern int period1 = 10;
extern int period2= 15;

extern double Profit = 10 ;

extern double lot= 0.01;

extern double addLot = 0.4 ;

extern int distance = 20;

double buyOrderTotal;
double sellOrderTotal;
double orderPrice ;
double pt;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
    if(Digits==3 || Digits==5) pt=10*Point;   
   else   pt=Point;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
       double FastMovingAverageS1 =     iMA(symbol1,0 ,period1,0,MODE_EMA,PRICE_CLOSE,0);
       
       double LastFastMovingAverageS1 = iMA(symbol1,0 ,period1,0,MODE_EMA,PRICE_CLOSE,1);
  
       double SlowMovingAverageS1 =     iMA(symbol1,0 ,period2,0,MODE_EMA,PRICE_CLOSE,0);//current bar 
       
       double LastSlowMovingAverageS1 = iMA(symbol1,0 ,period2,0,MODE_EMA,PRICE_CLOSE,1);//previous bar
 
      
        double FastMovingAverageS2 =     iMA(symbol2,0 ,period1,0,MODE_EMA,PRICE_CLOSE,0);
       
       double LastFastMovingAverageS2 = iMA(symbol2,0 ,period1,0,MODE_EMA,PRICE_CLOSE,1);
  
       double SlowMovingAverageS2 =     iMA(symbol2,0 ,period2,0,MODE_EMA,PRICE_CLOSE,0);//current bar 
       
       double LastSlowMovingAverageS2 = iMA(symbol2,0 ,period2,0,MODE_EMA,PRICE_CLOSE,1);//previous bar
 
      
        double FastMovingAverageS3 =     iMA(symbol3,0 ,period1,0,MODE_EMA,PRICE_CLOSE,0);
       
       double LastFastMovingAverageS3 = iMA(symbol3,0 ,period1,0,MODE_EMA,PRICE_CLOSE,1);
  
       double SlowMovingAverageS3 =     iMA(symbol3,0 ,period2,0,MODE_EMA,PRICE_CLOSE,0);//current bar 
       
       double LastSlowMovingAverageS3 = iMA(symbol3,0 ,period2,0,MODE_EMA,PRICE_CLOSE,1);//previous bar
 
      
        
       
        
       
     if ( OrdersTotal() == 0 || CountOrdersThisPairMainBUY()>0 ||CountOrdersThisPairMainSELL()>0 )//if no open orders
      {
      
    if ((LastFastMovingAverageS1<LastSlowMovingAverageS1)&& (FastMovingAverageS1>SlowMovingAverageS1) ) //2 - trade condition = 100 /40 
             {
               OrderSend (symbol1,OP_BUY ,lot , Ask, 3,0,0,"Main Buy",MAGIC,0,Green); // 3 -open order
              
             }
           
          
    if ((LastFastMovingAverageS1>LastSlowMovingAverageS1)&&  (FastMovingAverageS1<SlowMovingAverageS1) )
             {
               OrderSend (symbol1,OP_SELL ,lot, Bid, 3,0,0,"Main Sell",MAGIC,0,Red);
             
            }
          
     
           if ((LastFastMovingAverageS2<LastSlowMovingAverageS2)&& (FastMovingAverageS2>SlowMovingAverageS2) ) //2 - trade condition = 100 /40 
             {
               OrderSend (symbol2,OP_BUY ,lot , Ask, 3,0,0,"Main Buy",MAGIC,0,Green); // 3 -open order
              
             }
           
          
    if ((LastFastMovingAverageS2>LastSlowMovingAverageS2)&&  (FastMovingAverageS2<SlowMovingAverageS2) )
             {
               OrderSend (symbol2,OP_SELL ,lot, Bid, 3,0,0,"Main Sell",MAGIC,0,Red);
             
            }
          
      if ((LastFastMovingAverageS3<LastSlowMovingAverageS3)&& (FastMovingAverageS3>SlowMovingAverageS3) ) //2 - trade condition = 100 /40 
             {
               OrderSend (symbol3,OP_BUY ,lot , Ask, 3,0,0,"Main Buy",MAGIC,0,Green); // 3 -open order
              
             }
           
          
    if ((LastFastMovingAverageS3>LastSlowMovingAverageS3)&&  (FastMovingAverageS3<SlowMovingAverageS3) )
             {
               OrderSend (symbol3,OP_SELL ,lot, Bid, 3,0,0,"Main Sell",MAGIC,0,Red);
             
            }
          
     
   
     }





}
  



int CountOrdersThisPairMainSELL() {
  int count = 0;
  for (int index = 0; index < OrdersTotal(); index++) {
     OrderSelect(index, SELECT_BY_POS);
     if (OrderType() == OP_SELL  && OrderMagicNumber() == MAGIC && OrderComment() == "Main Sell" ) count++;
  }
  return (count);
}

int CountOrdersThisPairMainBUY() {
  int count;
  for (int index = 0; index < OrdersTotal(); index++) {
     OrderSelect(index, SELECT_BY_POS);
     if (OrderType() == OP_BUY && OrderMagicNumber() == MAGIC && OrderComment() == "Main Buy") count++;
  }
  return (count);
}

photo 1

photo2

您的代码中有很多错误,布局效率低下。尝试以下

extern int MAGIC =1111;
extern string symbol1="EURUSD";
extern string symbol2="EURCAD";
extern string symbol3="NZDCAD";
extern string symbol4="AUDCAD";
extern string symbol5="NZDUSD";
extern string symbol6="AUDUSD";
extern string symbol7="EURGBP";
extern string symbol8="GBPCAD";
extern string symbol9="GBPUSD";
extern string symbol10="USDCAD";
extern string symbol11="EURAUD";
extern string symbol12="CHFJPY";
extern string symbol13="NZDJPY";
extern string symbol14="NZDCHF";
extern string symbol15="EURNZD";
extern string symbol16="AUDJPY";
extern string symbol17="AUDCHF";
extern string symbol18="EURJPY";
extern string symbol19="EURCHF";
extern string symbol20="GBPCHF";
extern string symbol21="AUDNZD";
extern string symbol22="GBPJPY";
extern string symbol23="GBPAUD";
extern string symbol24="CADJPY";
extern string symbol25="CADCHF";
extern string symbol26="GBPNZD";
extern string symbol27="USDJPY";
extern string symbol28="USDCHF";
extern string symbol29="XAUUSD";
extern int period1 = 10;
extern int period2= 15;
extern double Profit = 10;
extern double lot= 0.01;
extern double addLot = 0.4 ;
extern int distance = 20;

double pt;
bool res;
string symbols[1];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   if(Digits==3 || Digits==5) pt=10*Point;   
   else   pt=Point;
   int idx=0;
   if(StringLen(symbol1)>0) {if(idx>0)ArrayResize(symbols,idx+1); symbols[idx]=symbol1; idx++;}
   if(StringLen(symbol2)>0) {if(idx>0)ArrayResize(symbols,idx+1); symbols[idx]=symbol2; idx++;}
   if(StringLen(symbol3)>0) {if(idx>0)ArrayResize(symbols,idx+1); symbols[idx]=symbol3; idx++;}
   if(StringLen(symbol4)>0) {if(idx>0)ArrayResize(symbols,idx+1); symbols[idx]=symbol4; idx++;}
   if(StringLen(symbol5)>0) {if(idx>0)ArrayResize(symbols,idx+1); symbols[idx]=symbol5; idx++;}
   if(StringLen(symbol6)>0) {if(idx>0)ArrayResize(symbols,idx+1); symbols[idx]=symbol6; idx++;}
   if(StringLen(symbol7)>0) {if(idx>0)ArrayResize(symbols,idx+1); symbols[idx]=symbol7; idx++;}
   if(StringLen(symbol8)>0) {if(idx>0)ArrayResize(symbols,idx+1); symbols[idx]=symbol8; idx++;}
   if(StringLen(symbol9)>0) {if(idx>0)ArrayResize(symbols,idx+1); symbols[idx]=symbol9; idx++;}
   if(StringLen(symbol10)>0) {if(idx>0)ArrayResize(symbols,idx+1); symbols[idx]=symbol10; idx++;}
   if(StringLen(symbol11)>0) {if(idx>0)ArrayResize(symbols,idx+1); symbols[idx]=symbol11; idx++;}
   if(StringLen(symbol12)>0) {if(idx>0)ArrayResize(symbols,idx+1); symbols[idx]=symbol12; idx++;}
   if(StringLen(symbol13)>0) {if(idx>0)ArrayResize(symbols,idx+1); symbols[idx]=symbol13; idx++;}
   if(StringLen(symbol14)>0) {if(idx>0)ArrayResize(symbols,idx+1); symbols[idx]=symbol14; idx++;}
   if(StringLen(symbol15)>0) {if(idx>0)ArrayResize(symbols,idx+1); symbols[idx]=symbol15; idx++;}
   if(StringLen(symbol16)>0) {if(idx>0)ArrayResize(symbols,idx+1); symbols[idx]=symbol16; idx++;}
   if(StringLen(symbol17)>0) {if(idx>0)ArrayResize(symbols,idx+1); symbols[idx]=symbol17; idx++;}
   if(StringLen(symbol18)>0) {if(idx>0)ArrayResize(symbols,idx+1); symbols[idx]=symbol18; idx++;}
   if(StringLen(symbol19)>0) {if(idx>0)ArrayResize(symbols,idx+1); symbols[idx]=symbol19; idx++;}
   if(StringLen(symbol20)>0) {if(idx>0)ArrayResize(symbols,idx+1); symbols[idx]=symbol20; idx++;}
   if(StringLen(symbol21)>0) {if(idx>0)ArrayResize(symbols,idx+1); symbols[idx]=symbol21; idx++;}
   if(StringLen(symbol22)>0) {if(idx>0)ArrayResize(symbols,idx+1); symbols[idx]=symbol22; idx++;}
   if(StringLen(symbol23)>0) {if(idx>0)ArrayResize(symbols,idx+1); symbols[idx]=symbol23; idx++;}
   if(StringLen(symbol24)>0) {if(idx>0)ArrayResize(symbols,idx+1); symbols[idx]=symbol24; idx++;}
   if(StringLen(symbol25)>0) {if(idx>0)ArrayResize(symbols,idx+1); symbols[idx]=symbol25; idx++;}
   if(StringLen(symbol26)>0) {if(idx>0)ArrayResize(symbols,idx+1); symbols[idx]=symbol26; idx++;}
   if(StringLen(symbol27)>0) {if(idx>0)ArrayResize(symbols,idx+1); symbols[idx]=symbol27; idx++;}
   if(StringLen(symbol28)>0) {if(idx>0)ArrayResize(symbols,idx+1); symbols[idx]=symbol28; idx++;}
   if(StringLen(symbol29)>0) {if(idx>0)ArrayResize(symbols,idx+1); symbols[idx]=symbol29; idx++;}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   for(int i=0; i<ArraySize(symbols); i++)
   {
      double FastMovingAverage=iMA(symbols[i], 0, period1, 0, MODE_EMA, PRICE_CLOSE, 0);
      double LastFastMovingAverage=iMA(symbols[i], 0, period1, 0, MODE_EMA, PRICE_CLOSE, 1);
      double SlowMovingAverage=iMA(symbols[i], 0, period2, 0, MODE_EMA, PRICE_CLOSE, 0);
      double LastSlowMovingAverage=iMA(symbols[i], 0, period2, 0, MODE_EMA, PRICE_CLOSE, 1);

      if(OrdersTotal()>0)
      {
         bool openTradeFound=false;
         for(int j=OrdersTotal()-1; j>=0; j--)
         {
            if(OrderSelect(j, SELECT_BY_POS))
            {
               if(OrderSymbol()!=symbols[i]) continue;
               if(OrderMagicNumber()!=MAGIC) continue;
               openTradeFound=true;
            }
         }
         if(!openTradeFound)
         {
            if(LastFastMovingAverage<LastSlowMovingAverage && FastMovingAverage>SlowMovingAverage)
             res=OrderSend(symbols[i], OP_BUY, lot, MarketInfo(symbols[i],MODE_ASK), 3, 0, 0, "Main Buy", MAGIC, 0, clrGreen);
            if(LastFastMovingAverage>LastSlowMovingAverage && FastMovingAverage<SlowMovingAverage)
             res=OrderSend(symbols[i], OP_SELL, lot, MarketInfo(symbols[i],MODE_BID), 3, 0, 0, "Main Sell", MAGIC, 0,clrRed);
         }
      }
      else
      {
         if(LastFastMovingAverage<LastSlowMovingAverage && FastMovingAverage>SlowMovingAverage)
          res=OrderSend(symbols[i], OP_BUY, lot, MarketInfo(symbols[i],MODE_ASK), 3, 0, 0, "Main Buy", MAGIC, 0, clrGreen);
         if(LastFastMovingAverage>LastSlowMovingAverage && FastMovingAverage<SlowMovingAverage)
          res=OrderSend(symbols[i], OP_SELL, lot, MarketInfo(symbols[i],MODE_BID), 3, 0, 0, "Main Sell", MAGIC, 0,clrRed);
      }
   }
return;
}