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

#### univetsity

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)
{
//----
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/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.
}
//---- 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)
if (m1<m4-0.0004)

if ( m1>m3+0.0003)
if (m1>m4+0.0004)

//----
}
//+------------------------------------------------------------------+
//| 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(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
//---- check order type
{
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)
if(m1>m4+0.0003)
}
}
//----
}
//+------------------------------------------------------------------+
//| 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
Once again, if you want some help, attach the .mq4 file to the post instead of posting the code as text - it becomes completely unreadable.

#### univetsity

Once again, if you want some help, attach the .mq4 file to the post instead of posting the code as text - it becomes completely unreadable.

PLS help,TKS!attached the code

#### Attachments

• modifycc.mq4
5.6 KB · Views: 50

#### Enivid

Staff member
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

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.

#### Enivid

Staff member
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.

It's up to you.

#### univetsity

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.

#### Attachments

5.6 KB · Views: 32

#### Enivid

Staff member
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?

#### univetsity

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

Staff member
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:
else return(sells);

With:

#### univetsity

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.
Those results seems violate position control's spirit.

Last edited:

#### Enivid

Staff member
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

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.

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