Moving average expert advisor
//+------------------------------------------------------------------+ //| Moving Average.mq4 | //| Copyright © 2011, BRO | //+------------------------------------------------------------------+ #define BRO 20050610 extern double Lots = 0.1; extern double MovingPeriod = 100; extern double MinLot = 0.1; extern double MaxLot = 5.0; extern int LotPrecent = 5; extern bool DynamicLot = false; extern double LotStep = 0.01; extern double BalanceStep = 500; //+------------------------------------------------------------------+ //| 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()==BRO) { 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 GetLots() { double lot=Lots if (DynamicLot=true) { lots = NormalizeDouble(LotStep*AccountBalance()/BalanceStep, LotPrecent); } lots = MathMax(lots, MinLot); lots = MathMin(lots, MaxLot); return (lots); } //+------------------------------------------------------------------+ //| Check for open order conditions | //+------------------------------------------------------------------+ void CheckForOpen() { double ma; int res; //---- go trading only for first tiks of new bar if(Volume[0]>1) return; //---- get Moving Average ma=iMA(NULL,0,MovingPeriod,0,MODE_SMA,PRICE_CLOSE,0); //---- sell conditions if(Open[1]>ma && Close[1]<ma) continue; if(Open[2]<ma && Close[2]<ma); { res=OrderSend(Symbol(),OP_SELL, GetLots(),Bid,3,0,0,"",BROV,0,Red); return; } //---- buy conditions if(Open[1]<ma && Close[1]>ma) continue; if(Open[2]>ma && Close[2]>ma); { res=OrderSend(Symbol(),OP_BUY,GetLots(),Ask,3,0,0,"",BRO,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,0,MODE_SMA,PRICE_CLOSE,0); //---- for(int pos=OrderTotal() -1; pos >=0; pos--) { if(OrderSelect(,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderMagicNumber()==BRO || OrderSymbol()==Symbol()) continue; //---- check order type if(OrderType()==OP_BUY) { if(Open[1]>ma && Close[1]<ma) continue; if(Open[2]<ma && Close[2]<ma); OrderClose(OrderTicket(),OrderLots(),Bid,3,White); break; } if(OrderType()==OP_SELL) { if(Open[1]<ma && Close[1]>ma) continue; if(Open[2]>ma && Close[2]>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(CalculateCurrentOrders(Symbol())==0 CheckForClose(); } return(0); }
Lol at the amount of errors here. Like half the code was missing. The other half does some very weird stuff. Anyhow this is the error free version.
//| Moving Average.mq4 | //| Copyright © 2011, BRO | //+------------------------------------------------------------------+ #define BRO 20050610 extern double Lots = 0.1; extern double MovingPeriod = 100; extern double MinLot = 0.1; extern double MaxLot = 5.0; extern int LotPrecent = 5; extern bool DynamicLot = false; extern double LotStep = 0.01; extern double BalanceStep = 500; //+------------------------------------------------------------------+ //| 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()==BRO) { 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 GetLots() { double lot=Lots; if (DynamicLot==true) { lot = NormalizeDouble(LotStep*AccountBalance()/BalanceStep, LotPrecent); lot = MathMax(lot, MinLot); lot = MathMin(lot, MaxLot); } return (lot); } //+------------------------------------------------------------------+ //| Check for open order conditions | //+------------------------------------------------------------------+ void CheckForOpen() { double ma; int res; //---- go trading only for first tiks of new bar if(Volume[0]>1) return; //---- get Moving Average ma=iMA(NULL,0,MovingPeriod,0,MODE_SMA,PRICE_CLOSE,0); //---- sell conditions if(Open[1]>ma && Close[1]<ma) return; if(Open[2]<ma && Close[2]<ma) { res=OrderSend(Symbol(),OP_SELL, GetLots(),Bid,3,0,0,"",BRO,0,Red); return; } //---- buy conditions if(Open[1]<ma && Close[1]>ma) return; if(Open[2]>ma && Close[2]>ma) { res=OrderSend(Symbol(),OP_BUY,GetLots(),Ask,3,0,0,"",BRO,0,Blue); return; } //---- } //+------------------------------------------------------------------+ //| Check for close order conditions | //+------------------------------------------------------------------+ void CheckForClose(){ //---- go trading only for first tiks of new bar if(Volume[0]>1) return; //---- get Moving Average double ma=iMA(NULL,0,MovingPeriod,0,MODE_SMA,PRICE_CLOSE,0); //---- for(int pos=OrdersTotal() -1; pos >=0; pos--){ if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderMagicNumber()==BRO || OrderSymbol()==Symbol()) continue; //---- check order type if(OrderType()==OP_BUY){ if(Open[1]>ma && Close[1]<ma) continue; if(Open[2]<ma && Close[2]<ma){ OrderClose(OrderTicket(),OrderLots(),Bid,3,White); break; } } if(OrderType()==OP_SELL){ if(Open[1]<ma && Close[1]>ma) continue; if(Open[2]>ma && Close[2]>ma){ OrderClose(OrderTicket(),OrderLots(),Ask,3,White); break; } } } } //+------------------------------------------------------------------+ //| Start function | //+------------------------------------------------------------------+ void start() { //---- check for history and trading if(Bars<100 || !IsTradeAllowed()) return; //---- calculate open orders by current symbol if(CalculateCurrentOrders(Symbol())==0) CheckForOpen(); else if (CalculateCurrentOrders(Symbol())==0) CheckForClose(); return(0); }
I apologise, i thought you copy pasted this code from somebody. Didn't realize you were learning to code and coding your EA.
When I tested your code in my editor, it seemed like half of it were missing in places - unended if statements, for loops, functions that should be in loops (deduced by context) and weren't. That's why I also commented that something (as in some blocks of code) seemed missing.
Try it out, see if it works the way you planned it! :)
Where is the mistake, cause it didn't started.