//+------------------------------------------------------------------+

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

//----

}

//+------------------------------------------------------------------+