//+------------------------------------------------------------------+ //| Moving Average.mq4 | //| Copyright © 2005, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ #define MAGICMA 20050610 extern double Lots = 0.1; extern double MaximumRisk = 0.02; extern double DecreaseFactor = 3; extern double MovingPeriod = 12; extern double MovingShift = 6; extern int stochK = 5; extern int stochD = 3; extern int stochSlow = 3; extern int stochMethod = 0; extern int stochPrice = 0; extern int SignalBar = 0; //+------------------------------------------------------------------+ //| Calculate open positions | //+------------------------------------------------------------------+ int CalculateCurrentOrders(string symbol) { int buys=0,sells=0; //---- for(int i=0;i0) 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/1000.0,1); //---- calcuulate 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); } //---- return lot size if(lot<0.1) lot=0.1; return(lot); } double getStoch(int tf, int which, int pos) { double stoch; stoch = iStochastic(Symbol(), tf, stochK, stochD, stochSlow, stochMethod, stochPrice, which, pos); return(stoch); } //+------------------------------------------------------------------+ //| Check for open order conditions | //+------------------------------------------------------------------+ void CheckForOpen() { double stochMainDaily, stochSignalDaily; double stochMainDailyPrev, stochSignalDailyPrev; double stochMainH4, stochSignalH4; double stochMainH4Prev, stochSignalH4Prev; int res; //---- go trading only for first tiks of new bar //---- get stoch stochMainDaily = getStoch(PERIOD_D1, MODE_MAIN, SignalBar); stochSignalDaily = getStoch(PERIOD_D1, MODE_SIGNAL, SignalBar); stochMainDailyPrev = getStoch(PERIOD_D1, MODE_MAIN, SignalBar + 1); stochSignalDailyPrev = getStoch(PERIOD_D1, MODE_SIGNAL, SignalBar + 1); stochMainH4 = getStoch(PERIOD_H4, MODE_MAIN, SignalBar); stochSignalH4 = getStoch(PERIOD_H4, MODE_SIGNAL, SignalBar); stochMainH4Prev = getStoch(PERIOD_H4, MODE_MAIN, SignalBar + 1); stochSignalH4Prev = getStoch(PERIOD_H4, MODE_SIGNAL, SignalBar + 1); //---- sell conditions if((stochMainDaily < stochSignalDaily) && (stochMainDailyPrev > stochSignalDailyPrev)) { if((stochMainH4 < stochSignalH4) && (stochMainH4Prev > stochSignalH4Prev)) { res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red); return; } } //---- buy conditions if((stochMainDaily > stochSignalDaily) && (stochMainDailyPrev < stochSignalDailyPrev)) { if((stochMainH4 > stochSignalH4) && (stochMainH4Prev < stochSignalH4Prev)) { res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue); return; } } //---- } //+------------------------------------------------------------------+ //| Check for close order conditions | //+------------------------------------------------------------------+ void CheckForClose() { double ma; //---- go trading only for first tiks of new bar if(Volume[0]>1) return; //---- get Moving Average ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0); //---- for(int i=0;ima && Close[1]ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White); break; } } //---- } //+------------------------------------------------------------------+ //| Start function | //+------------------------------------------------------------------+ void start() { //---- check for history and trading if(Bars<100 || IsTradeAllowed()==false) return; //---- calculate open orders by current symbol if(CalculateCurrentOrders(Symbol())==0) CheckForOpen(); else CheckForClose(); //---- } //+------------------------------------------------------------------+