【问题标题】:MQL4 EA open orders by different signal on different chartsMQL4 EA 在不同图表上通过不同信号开立订单
【发布时间】:2021-04-16 13:03:36
【问题描述】:

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

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

【问题讨论】:

    标签: mql4


    【解决方案1】:

    您的代码中有许多错误,并且布局效率低下。试试下面的

    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;
    }
    

    【讨论】:

    • 谢谢兄弟,我会试试的。感谢支持
    • 如果方向错误,可以在此订单中添加网格鞅订单。
    • 如果这回答了您的原始问题,请将其标记为已接受。
    • 是标记的,当方向错误时,我尝试在此订单中添加网格。但它太复杂了。在最后一批调用时出现问题,所有订单都复杂。手数乘法是随机的且更大更大
    • 您可能需要提出一个新问题并再次分享您的代码。
    猜你喜欢
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 2021-11-17
    • 2011-06-24
    • 2020-07-11
    相关资源
    最近更新 更多