why close order fail and how to limit order n.o.?

univetsity

Trader
Mar 14, 2011
27
0
22
china
I am an newbie in MQL4,just tested an EA of myself,but the report looks like the EA couldnot close orders and would open order on each bar till freemargin become 0,then it will stop all orders. I dont know how to limit open order no. :( who can help me?TKS appreciation!:p
the code as follow:
//+------------------------------------------------------------------+
//| Moving Average.mq4 |
//| Copyright ?2005, MetaQuotes Software Corp. |
//| http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#define MAGICMA 20110309

extern double Lots = 1;
extern double MaximumRisk = 0.02;
extern double DecreaseFactor = 10;

//+------------------------------------------------------------------+
//| Calculate open positions |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
{
int buys=0,sells=0;
//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
{
if(OrderType()==OP_BUY) buys++;
if(OrderType()==OP_SELL) sells++;
}
}
//---- return orders volume
if(buys>0) return(buys);
else return(sells);
}
//+------------------------------------------------------------------+
//| Calculate optimal lot size |
//+------------------------------------------------------------------+
double LotsOptimized()
{
double lot=Lots;
int orders=HistoryTotal(); // history orders total
int losses=0; // number of losses orders without a break
//---- select lot size
lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/100.0,1);
Print(MarketInfo(Symbol(), MODE_LOTSIZE));
Print(MarketInfo(Symbol(), MODE_MINLOT));
Print(MarketInfo(Symbol(), MODE_LOTSTEP));
Print(MarketInfo(Symbol(), MODE_MAXLOT));

//---- calculate number of losses orders without a break
if(DecreaseFactor>0)
{
for(int i=orders-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
//----
if(OrderProfit()>0) break;
if(OrderProfit()<0) losses++;
}
if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
//this is an smart technical design,but losses stands lossing profit,not money may cause problems.
//modify them follow as:accountfreemargin()-orderprofit()
}
//---- return lot size
if(lot<1) lot=1;
return(lot);
}
//+------------------------------------------------------------------+
//| Check for open order conditions |
//+------------------------------------------------------------------+
void CheckForOpen()
{
double m1,m2,m3,m4,ticket1,ticket2;
int res;
//---- go trading only for first tiks of new bar
if(Volume[0]>1) return;
//---- get Moving Average
m1=iMA(NULL,0,21,0,MODE_SMA,PRICE_CLOSE,0);
m2=iMA(NULL,0,55,0,MODE_SMA,PRICE_CLOSE,0);
m3=iMA(NULL,0,21,0,MODE_SMA,PRICE_CLOSE,1);
m4=iMA(NULL,0,55,0,MODE_SMA,PRICE_CLOSE,1);
//---- sell conditions
if (m1<m3-0.0002)
{
ticket1=OrderSend(Symbol(),OP_SELL,1,Bid,5,Ask+105*Point,0,"My order #1",MAGICMA,0,Red);
return;
}
if (m2<m4-0.0001)
{
ticket2=OrderSend(Symbol(),OP_SELL,1,Bid,5,Ask+105*Point,0,"My order #2",MAGICMA,0,Yellow);
return;
}

//---- buy conditions
if ( m1>m3+0.0002)
{
ticket1=OrderSend(Symbol(),OP_BUY,1,Ask,5,Bid-105*Point,0,"My order #1",MAGICMA,0,Blue);
return;
}
if (m2>m4+0.0001)
{
ticket2=OrderSend(Symbol(),OP_BUY,1,Ask,5,Bid-105*Point,0,"My order #2",MAGICMA,0,Green);
return;
}

//----
}
//+------------------------------------------------------------------+
//| Check for close order conditions |
//+------------------------------------------------------------------+
void CheckForClose()
{
double m1,m2,m3,m4;
//---- go trading only for first tiks of new bar
if(Volume[0]>1) return;
//---- get Moving Average
m1=iMA(NULL,0,21,0,MODE_SMA,PRICE_CLOSE,0);
m2=iMA(NULL,0,55,0,MODE_SMA,PRICE_CLOSE,0);
m3=iMA(NULL,0,21,0,MODE_SMA,PRICE_CLOSE,1);
m4=iMA(NULL,0,55,0,MODE_SMA,PRICE_CLOSE,1);
//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
//---- check order type
if(OrderType()==OP_BUY)
{
if(m1<m3+0.0002)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
break;
}
if(m2<m4+0.0001)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
break;
}
}

if(OrderType()==OP_SELL)
{
if(m1>m3-0.0002)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Tan);
break;
}
if(m2<m4-0.0001)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Salmon);
break;
}
}
}
//----
}
//+------------------------------------------------------------------+
//| Start function |
//+------------------------------------------------------------------+
void start()
{
//---- check for history and trading
if(Bars<55 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else CheckForClose();
//----
}
//+------------------------------------------------------------------+