profitable ea couldn't increase position pls gurus point out method.

univetsity

Trader
Mar 14, 2011
27
0
22
china
as inscribe shows,my ea is an trend strategy,I wanna it could increase position when profiting,but now it doesn't work like that.pls gurus check my code,and point out how to deal with the problem. I know the line" if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();" may stop the second position's open but I donn't know how to modify it.i am appreciation for guys help.
//+------------------------------------------------------------------+
//| 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 = 3;

//+------------------------------------------------------------------+
//| 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/500.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,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,55,0,MODE_SMA,PRICE_CLOSE,0);

m3=iMA(NULL,0,55,0,MODE_SMA,PRICE_CLOSE,3);
m4=iMA(NULL,0,55,0,MODE_SMA,PRICE_CLOSE,5);
//---- sell conditions
if (m1<m3-0.0003)
{ticket1=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,5,Ask+105*Point,0,"SELL#1",MAGICMA,0,Red); return; }
if (m1<m4-0.0004)
{ticket2=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,5,Ask+105*Point,0,"SELL#2",MAGICMA,0,Green); return; }

//---- buy conditions
if ( m1>m3+0.0003)
{ ticket1=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,5,Bid-105*Point,0,"BUY#1",MAGICMA,0,Blue); return; }
if (m1>m4+0.0004)
{ ticket2=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,5,Bid-105*Point,0,"BUY#2",MAGICMA,0,Yellow); return;}


//----
}
//+------------------------------------------------------------------+
//| Check for close order conditions |
//+------------------------------------------------------------------+
void CheckForClose()
{
double m1,m3,m4;
//---- go trading only for first tiks of new bar
if(Volume[0]>1) return;
//---- get Moving Average
m1=iMA(NULL,0,55,0,MODE_SMA,PRICE_CLOSE,0);

m3=iMA(NULL,0,55,0,MODE_SMA,PRICE_CLOSE,3);
m4=iMA(NULL,0,55,0,MODE_SMA,PRICE_CLOSE,5);
//----
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,Orange); break; }
if(m1<m4-0.0003)
{ OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); break; }
}
if(OrderType()==OP_SELL)
{
if(m1>m3+0.0002)
{OrderClose(OrderTicket(),OrderLots(),Ask,3,Tan); break; }
if(m1>m4+0.0003)
{OrderClose(OrderTicket(),OrderLots(),Ask,3,White); 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();
//----
}
//+------------------------------------------------------------------+
 

Enivid

Administrator
Staff member
Nov 30, 2008
16,430
903
144
Odessa
www.earnforex.com
Yes, the following line prevents opening additional positions if you already have one position open:
if (CalculateCurrentOrders(Symbol())==0) CheckForOpen();

Two possible solutions:
1. Remove condition "if (CalculateCurrentOrders(Symbol())==0)".
2. Modify it like this:
if (CalculateCurrentOrders(Symbol())<2) CheckForOpen();
This way it will open only 2 positions max.
 

univetsity

Trader
Mar 14, 2011
27
0
22
china
if remove the sentense,how should I confirm openning condition?
but the "2" method seems solve the prolem,TKS Enivid.
some my parterns also gives me another thinking:should I recount the unrealized losses and profits? I am appreciating for your more advice.:p
 

Enivid

Administrator
Staff member
Nov 30, 2008
16,430
903
144
Odessa
www.earnforex.com
if remove the sentense,how should I confirm openning condition?

If you remove only "if (CalculateCurrentOrders(Symbol())==0)" condition, you still will be checking opening conditions. You'll just skip the position counting.

some my parterns also gives me another thinking:should I recount the unrealized losses and profits? I am appreciating for your more advice.:p

It's up to you.
 

univetsity

Trader
Mar 14, 2011
27
0
22
china
2. Modify it like this:
if (CalculateCurrentOrders(Symbol())<2) CheckForOpen();
This way it will open only 2 positions max.[/QUOTE]

I modify it as the 2 method,but I found it would open several orders during Jan/3/ 2011 and other time on EUR/USD,I don't know why.
:mad:
 

Attachments

univetsity

Trader
Mar 14, 2011
27
0
22
china
If by "several orders" you mean more than 2, then it's really strange. On what period, timeframe and model (every tick or open prices) do you backtest it?

on eurusd (01.1.2011-03.26.2011 M5) openprice model, you can try it,would open 6 orders on Jan 4 15:30-16:05 and 20 orders on Jan 14 12:20-14:20 ^^^
 

Enivid

Administrator
Staff member
Nov 30, 2008
16,430
903
144
Odessa
www.earnforex.com
Yes, now I see the problem. Since EA can have both buys and sells open simultaneously, the CalculateCurrentOrders() function should return a sum of the buys and sells. Replace:
if(buys>0) return(buys);
else return(sells);

With:
return(buys+sells);
 

univetsity

Trader
Mar 14, 2011
27
0
22
china
It's great! Now it could run follow my intent.:)
However,I also found another problem about position cotrol.
You see,like my code it will largen position after profiting,otherwise, the vice.
It could make two bad results:1,after continuous profit, the first lossing order's position would be largest,2,follow continuous loss,the first profiting order's position would be minimum.
sometimes,a profiting order follow continuous lossing orders,then contiunous lossing orders.This cycle might reduce my balance quickly.:mad:
Those results seems violate position control's spirit.
Could Gurus share some experience about this? I am appreciating!!
 
Last edited:

Enivid

Administrator
Staff member
Nov 30, 2008
16,430
903
144
Odessa
www.earnforex.com
It's better to base your position size on your total balance (or free margin), not on amounts of your previous losses/wins.
If you want to base your lot size on the most recent trade outcome, you'll have to learn about Z-score and implement its calculation into your EA and then use the resulting data. But it can be quite complex.
 

univetsity

Trader
Mar 14, 2011
27
0
22
china
Z-score seems too complex for me,simple strategy is more suitable.
Theoretically speaking, each order is divided,it will not influence the next order and shouldnot be affected by the previous one.so,I am thinking whether modify the lossing strategy or not.