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

univetsity

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!
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)
{
//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
{
if(OrderType()==OP_SELL) sells++;
}
}
//---- return orders volume
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.
}
//---- 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)
{
return;
}
if (m2<m4-0.0001)
{
return;
}

if ( m1>m3+0.0002)
{
return;
}
if (m2>m4+0.0001)
{
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(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
//---- check order type
{
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)
{
break;
}
if(m2<m4-0.0001)
{
break;
}
}
}
//----
}
//+------------------------------------------------------------------+
//| Start function |
//+------------------------------------------------------------------+
void start()
{
//---- check for history and trading
//---- calculate open orders by current symbol
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else CheckForClose();
//----
}
//+------------------------------------------------------------------+

Enivid

Staff member
You better attach the .mq4 file to the post. The copy-pasted code is very hard to read.

univetsity

the problem have resolved,TKS.

Replies
12
Views
8K
Replies
2
Views
3K
Replies
4
Views
4K
Replies
9
Views
4K
Replies
5
Views
2K