Reputation:
I tried to open multiple orders depend on MA cross signal on different charts. I found one problem is that when open first order ,orderstotal() is zero. so open first orders easy. But when signal meet on another chart,need to open next order on different chart. It is problem here.I counted open orders numbers and try to open next orders. The problem occurs here ,so many frequent orders open open again and again How can handle it
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);
}
Upvotes: 0
Views: 745
Reputation: 1383
There are a number of errors in your code and the layout is inefficient. Try the following
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;
}
Upvotes: 1