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

 

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();
//----
}
//+------------------------------------------------------------------+ 
 

For others on the forum - interesting solution to the opening of a newbar in this code.

//---- go trading only for first tiks of new bar
if(Volume[0]>1) return;
 

I thinik that all you have to do is change the magic number to get it to work as it used to as it trys to use only the profit makes to determine the number of lots it uses

 
Ickyrus:

I thinik that all you have to do is change the magic number to get it to work as it used to as it trys to use only the profit makes to determine the number of lots it uses


I am an newbie,could you show me how to deal with it?TKS!
 

One of the decisions to send order is

if (m1<m3-0.0003)
   {
    ticket1=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,5,Ask+105*Point,0,"SELL#1",MAGICMA,0,Red); 
    return; 
   }

But the program decides how many Lots to use with the function LotsOptimized()

//+------------------------------------------------------------------+
//| 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);
}

Which defaults to 1 if the lot size is less than 1 (Silly me did not spot that when it checks your order history it does not check for its magic number!)

However the above bit of code is where your problem lies. The logic of it (for the moment) confuses me.

I don't know what it is that you want the EA to do with the size of lots it uses when placeing order.

I also don't know what stratergy you want for increasing or decreasing the lot size of the orders which is what you must be asking to be solved.

Reason: