//+------------------------------------------------------------------+ //| OzFx Expert Advisor for MetaTrader 4 | //| version 1.42 | //| original idea from OzFx | //| EA conversion by Azmel | //+------------------------------------------------------------------+ //| INSTRUCTIONS | //| To be used on any chart (except JPY) with D1 timeframe. | //+------------------------------------------------------------------+ //| VERSION HISTORY | //| 1.0 - Initial version with AC and Stochastic indicators. | //| 1.1 - 200SMA filter added by Matt Ebersviller. | //| 1.2 - Recorrected the 200SMA rules and rewrote closing | //| subroutine when new signal arrives. | //| 1.3 - Debug the closing routine of the 5th trade | //| 1.4 - Debug a bug not taking longs when a valid signal arrives | //| 1.41 - Improved Money Management. Debug multiple buys in one day | //| 1.42 - Init section to retrieve ticket data if EA is restarted. | //| Open/Close trade signals reorganised. | //+------------------------------------------------------------------+ #include <stdlib.mqh> //+------------------------------------------------------------------+ //| External Variables | //+------------------------------------------------------------------+ extern int Magic = 887453; extern double Lots = 0.01; extern bool MoneyManagement = true; extern int Risk = 1; extern bool StartUp = true; //+------------------------------------------------------------------+ //| Internal variables | //+------------------------------------------------------------------+ int PricePerPip; double DecimalCorrection; int DecimalPlaces; double MaxLots; bool OKToTrade; int i; int x; int OpenOrders; double ACSignalCurrent; double ACSignalPrevious; double StochasticMain; double StochasticSignal; double SMA200; bool BuyFlag; bool SellFlag; bool StopLossAdjust; int ticket[6]; int TP1 = 50; int TP2 = 100; int TP3 = 150; int TP4 = 200; int SL = 100; int slippage = 5; int StochasticUpper = 50; int StochasticLower = 50; double EntryPrice; int init() { OpenOrders=0; for(i=0;i<OrdersTotal();i++) { OrderSelect(i,SELECT_BY_POS,MODE_TRADES); if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { OpenOrders++; } } if(OpenOrders==0) { BuyFlag=0; SellFlag=0; return(0); } else { StartUp=false; EntryPrice=OrderOpenPrice(); if(OpenOrders==5) { StopLossAdjust=false; } else { StopLossAdjust=true; } if(OrderType()==OP_BUY) { BuyFlag=true; SellFlag=false; } if(OrderType()==OP_SELL) { BuyFlag=false; SellFlag=true; } x=5-OpenOrders; for(i=0;i<OrdersTotal();i++) { OrderSelect(i,SELECT_BY_POS,MODE_TRADES); if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { x++; ticket[x]=OrderTicket(); } } } return(0); } //+------------------------------------------------------------------+ //| Main code | //+------------------------------------------------------------------+ int start() { //+---------------------------------------------------------------+ //| Money Management Routine | //+---------------------------------------------------------------+ if (MoneyManagement) { if (Risk<1 || Risk>20) { Comment("Invalid Risk Value."); return(0); } else { Lots=MathFloor((AccountFreeMargin()*AccountLeverage()*Risk*Point*100)/(Ask*MarketInfo(Symbol(),MODE_LOTSIZE)*MarketInfo(Symbol(),MODE_MINLOT)))*MarketInfo(Symbol(),MODE_MINLOT); } } //+---------------------------------------------------------------+ //| Time Frame Check | //+---------------------------------------------------------------+ if (Period() != 1440) { Comment("Wrong Time Frame. Please switch to D1."); return(0); } //+---------------------------------------------------------------+ //| Start-Up Routine (To Prevent Immediate Entry During Start-Up) | //+---------------------------------------------------------------+ if (StartUp) { if (Hour()==0) { StartUp = false; } else { Comment("Staring Up Delay. Awaiting Next Candle."); return(0); } } //+---------------------------------------------------------------+ //| Main Trading Routine | //+---------------------------------------------------------------+ //+------------------------------------------------------------+ //| Signal & Indicators | //+------------------------------------------------------------+ ACSignalCurrent = iAC(NULL,0,0); ACSignalPrevious = iAC(NULL,0,1); StochasticMain = iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,0); StochasticSignal = iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_SIGNAL,0); SMA200 = iMA(NULL,0,200,0,MODE_SMA,PRICE_OPEN,0); // SMA200 Options: PRICE_CLOSE, PRICE_OPEN, PRICE_HIGH, PRICE_LOW, // PRICE_MEDIAN, PRICE_TYPICAL, PRICE_WEIGHTED Comment("\nOzFx EA version 1.42\nCopyright (2008) OzFx\nEA Conversion by Azmel\n\nTrading ",Lots," Lots"); //+------------------------------------------------------------+ //| Check Condition To Open Long | //+------------------------------------------------------------+ if (ACSignalCurrent>0 && ACSignalPrevious<0 && BuyFlag==false) { for(i=0;i<OrdersTotal();i++) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol()==Symbol() && OrderMagicNumber() == Magic) { OrderClose(OrderTicket(),OrderLots(),Ask,slippage,CLR_NONE); } } SellFlag=false; BuyFlag=true; if (Ask>SMA200 && StochasticMain>StochasticUpper && StochasticSignal>StochasticUpper) { ticket[1]=OrderSend(Symbol(),OP_BUY,Lots,Ask,slippage,Ask-SL*Point,Ask+TP1*Point,"OzFx-1B",Magic,CLR_NONE); ticket[2]=OrderSend(Symbol(),OP_BUY,Lots,Ask,slippage,Ask-SL*Point,Ask+TP2*Point,"OzFx-2B",Magic,CLR_NONE); ticket[3]=OrderSend(Symbol(),OP_BUY,Lots,Ask,slippage,Ask-SL*Point,Ask+TP3*Point,"OzFx-3B",Magic,CLR_NONE); ticket[4]=OrderSend(Symbol(),OP_BUY,Lots,Ask,slippage,Ask-SL*Point,Ask+TP4*Point,"OzFx-4B",Magic,CLR_NONE); ticket[5]=OrderSend(Symbol(),OP_BUY,Lots,Ask,slippage,Ask-SL*Point,0,"OzFx-5B",Magic,CLR_NONE); EntryPrice=Ask; StopLossAdjust=false; } } //+------------------------------------------------------------+ //| Check Condition To Open Short | //+------------------------------------------------------------+ if (ACSignalCurrent<0 && ACSignalPrevious>0 && SellFlag==false) { for(i=0;i<OrdersTotal();i++) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol()==Symbol() && OrderMagicNumber() == Magic) { OrderClose(OrderTicket(),OrderLots(),Bid,slippage,CLR_NONE); } } BuyFlag=false; SellFlag=true; if (Bid<SMA200 && StochasticMain<StochasticLower && StochasticSignal<StochasticLower) { ticket[1]=OrderSend(Symbol(),OP_SELL,Lots,Bid,slippage,Bid+SL*Point,Bid-TP1*Point,"OzFx-1S",Magic,CLR_NONE); ticket[2]=OrderSend(Symbol(),OP_SELL,Lots,Bid,slippage,Bid+SL*Point,Bid-TP2*Point,"OzFx-2S",Magic,CLR_NONE); ticket[3]=OrderSend(Symbol(),OP_SELL,Lots,Bid,slippage,Bid+SL*Point,Bid-TP3*Point,"OzFx-3S",Magic,CLR_NONE); ticket[4]=OrderSend(Symbol(),OP_SELL,Lots,Bid,slippage,Bid+SL*Point,Bid-TP4*Point,"OzFx-4S",Magic,CLR_NONE); ticket[5]=OrderSend(Symbol(),OP_SELL,Lots,Bid,slippage,Bid+SL*Point,0,"OzFx-5S",Magic,CLR_NONE); EntryPrice=Bid; StopLossAdjust=false; } } //+------------------------------------------------------------+ //| If Trade one hit TakeProfit, move StopLoss to BreakEven | //+------------------------------------------------------------+ if (StopLossAdjust==false) { if ((BuyFlag && Bid>=EntryPrice+TP1*Point) || (SellFlag && Ask<=EntryPrice-TP1*Point)) { for(i=2;i<=5;i++) { OrderSelect(ticket[i],SELECT_BY_TICKET); OrderModify(ticket[i],OrderOpenPrice(),EntryPrice,OrderTakeProfit(),0,CLR_NONE); } StopLossAdjust=true; } } return(0); }
Sample
Analysis
Market Information Used:
Indicator Curves created:
Indicators Used:
Bill Williams Accelerator/Decelerator oscillator
Stochastic oscillator
Moving average indicator
Custom Indicators Used:
Order Management characteristics:
Checks for the total of open orders
It Closes Orders by itself
It automatically opens orders when conditions are reached
It can change open orders parameters, due to possible stepping strategy
Other Features: