I found this EA here: http://www.tradingsystemforex.com/expert-advisors-backtesting/835-svos-eurjpy-d1.html I have included the EA, VHF Indicator and the set file in the download below. Minimum Balance: $1,000.00 EUR/JPY H1: Hardcoded in the EA 5-Digit Price Format: unconfirmed IBFX Mini account compatible unconfirmed ECN Compatible unconfirmed Trade with Stops and TP's: yes, Trailing Stop also Magic number : yes, specify in the input menu Time Filter: none MM Available: no, but there is something called riskboost which is used when trading with the trend Discussion Here: http://www.elitetrader.com/vb/showthread.php?threadid=211416
//+------------------------------------------------------------------+ #property copyright "Copyright © 2009, Brian Dee" #property link "briandee@selectfx.net" //+------------------------------------------------------------------+ extern double Lots = 0.1; extern int RiskBoost=3; // 1-6 Your choice to strengthen lotsize when trading with the trend extern int TakeProfit = 350; extern int StopLoss = 90; extern int TrailingStop = 150; extern int MAShift = 0; extern int iSlippage = 5; extern int iMagic=6789; extern int OpenShift1=1; extern int OpenShift2=2; extern int OpenShift3=3; extern int CloseShift1=1; extern int CloseShift2=2; extern int CloseShift3=3; extern int HighShift1=1; extern int HighShift2=2; extern int HighShift3=3; extern int LowShift1=1; extern int LowShift2=2; extern int LowShift3=3; extern int MAPeriod1=5; extern int MAPeriod2=20; extern int MAPeriod3=6; extern int StochKPeriod=8; extern int StochDPeriod=3; extern int StochSlowingPeriod=3; extern int StochMAMethod=0; //MODE_SMA 0 MODE_EMA 1 MODE_SMMA 2 MODE_LWMA 3 extern int StochPriceField=0; //0=Low/High 1=Close/Close extern int MACDFast_EMA_Period=10; // Number of periods for fast moving average extern int MACDSlow_EMA_Period=25; // Number of periods for fast moving average extern int MACDSignal_Period=5; // extern double StdDevMin=0.3; // 0.01=Ambitious 0.2=Conservative extern double VHFThreshold=0.4; // 0.2=Ambitious 0.4=Conservative extern int MaxNumTrendOrders=4; extern int MaxNumRangeOrders=2; extern double StdDevPeriod=20; extern double VHFPeriod=20; extern double iDoji=8.5; // Divisor for calculating body/height ratio of a candle double dPivot, BuyLots, SellLots; int cnt, ticket, total, accounttotal, LatestOpenTicket; bool IsTrending; int TradeAction=0; // 1=Buy 2=Sell string strSymbol="EURJPY"; // Hard coded for this symbol string strComment="SVOS EURJPY D1"; int iPeriod=PERIOD_D1; /* */ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- // ========================================================================== // Check each tick section START if(Bars<10) { Print("Bars less than 10"); return(0); } // when not back testing display chart info every tick if(IsTesting() == false) { Check_Settings(); Display_Info(); } if(TrailingStop==0) TrailingStop=20; // Must have a Trailing Stop if(TrailingStop>0) LatestOpenTicket=CheckActiveTradesForStopLoss(); // Get this while checking stop loss // Check each tick section END // ========================================================================== // ========================================================================== // Once per bar section START if(Volume[0]>1) return (0); //============================ INFO FROM OTHER PERIODS/INSTRUMENTS ======================================= double EMA_D5_1 = iMA(strSymbol,PERIOD_D1,MAPeriod1,0,MODE_EMA,PRICE_CLOSE,1); double EMA_D5_0 = iMA(strSymbol,PERIOD_D1,MAPeriod1,0,MODE_EMA,PRICE_CLOSE,0); double EMA_D20_0 = iMA(strSymbol,PERIOD_D1,MAPeriod2,0,MODE_EMA,PRICE_CLOSE,0); double EMA_D130_0 = iMA(strSymbol,PERIOD_MN1,MAPeriod3,0,MODE_EMA,PRICE_CLOSE,0); //============================ INFO FROM OTHER PERIODS/INSTRUMENTS ======================================= double VHF_1 = iCustom(strSymbol,iPeriod,"VHF",VHFPeriod, 0,1); double STOCHM_1 = iStochastic(strSymbol,iPeriod,StochKPeriod,StochDPeriod,StochSlowingPeriod,StochMAMethod,StochPriceField, MODE_MAIN, 1); double STOCHS_1 = iStochastic(strSymbol,iPeriod,StochKPeriod,StochDPeriod,StochSlowingPeriod,StochMAMethod,StochPriceField, MODE_SIGNAL, 1); double STD_BB_1 = iStdDev(strSymbol,iPeriod,StdDevPeriod,MAShift,MODE_EMA,PRICE_CLOSE,1); double CLOSE_3 = Close[CloseShift3]; double CLOSE_2 = Close[CloseShift2]; double CLOSE_1 = Close[CloseShift1]; double OSMA_3 = iOsMA(strSymbol,iPeriod,MACDFast_EMA_Period,MACDSlow_EMA_Period,MACDSignal_Period,PRICE_CLOSE,3); double OSMA_2 = iOsMA(strSymbol,iPeriod,MACDFast_EMA_Period,MACDSlow_EMA_Period,MACDSignal_Period,PRICE_CLOSE,2); double OSMA_1 = iOsMA(strSymbol,iPeriod,MACDFast_EMA_Period,MACDSlow_EMA_Period,MACDSignal_Period,PRICE_CLOSE,1); if(VHF_1 >= VHFThreshold) IsTrending=True; else IsTrending=False; double O1 = Open[OpenShift1]; double O2 = Open[OpenShift2]; double O23 = Open[OpenShift3]; double H1 = High[HighShift1]; double H2 = High[HighShift2]; double H23 = High[HighShift3]; double L1 = Low[LowShift1]; double L2 = Low[LowShift2]; double L3 = Low[LowShift3]; double C1 = Close[CloseShift1]; double C2 = Close[CloseShift2]; double C3 = Close[CloseShift3]; // ============================================================================== // Handle closure conditions for SELL if(IsBullishEngulfing()==1) CloseAllSellOrders(); // Close any SELL if(IsMorningStar()==1) CloseAllSellOrders(); // Close any SELL if ((IsTrending) && (OSMA_1 > 0)) CloseAllSellOrders(); // Use OSMA if VHF decides if ((IsTrending==False) && (STOCHM_1 >= STOCHS_1)) CloseAllSellOrders(); // Use Stochastic if VHF decides // Handle closure conditions for BUY if(IsBearishEngulfing()==1) CloseAllBuyOrders(); // Close any BUY if(IsEveningStar()==1) CloseAllBuyOrders(); // Close any BUY if ((IsTrending) && (OSMA_1 < 0)) CloseAllBuyOrders(); // Use OSMA if VHF decides if ((IsTrending==False) && (STOCHM_1 <= STOCHS_1)) CloseAllBuyOrders(); // Use Stochastic if VHF decides // ========================================================================== // Check once each bar section START total=ActiveTradesForMagicNumber(strSymbol, iMagic); if ((IsTrending) && (total >= MaxNumTrendOrders)) return(0); // Enough orders already! if ((IsTrending==False) && (total >= MaxNumRangeOrders)) return(0); // Enough orders already! // ========================================================================== // Add INO index and Dollar Index in here for TP/SL and Lot sizing // Lot Sizing START BuyLots=Lots; SellLots=Lots; TradeAction=0; if ((EMA_D5_0 > EMA_D20_0) && (EMA_D5_0 > EMA_D5_1) && (EMA_D20_0 > EMA_D130_0)) { BuyLots=RiskBoost*Lots; SellLots=Lots; } if ((EMA_D5_0 < EMA_D20_0) && (EMA_D5_0 < EMA_D5_1) && (EMA_D20_0 < EMA_D130_0)) { BuyLots=Lots; SellLots=RiskBoost*Lots; } // Lot Sizing END // ========================================================================== // Assess for BUY if((IsEveningStar()==0) && (IsDojiCandle()==0) && (IsBearishEngulfing()==0) && (Close[CloseShift1]>Open[OpenShift1]) ) // no reversal or indecision sign { if((OSMA_1>0) && (OSMA_1 > OSMA_2) && (IsTrending) && (STD_BB_1 > StdDevMin)) TradeAction=1; // Use OSMA if VHF decides if((STOCHM_1 > STOCHS_1) && (IsTrending==False) && (STD_BB_1 > StdDevMin)) TradeAction=1; // Use Stochastic if VHF decides } // Assess for SELL if((IsMorningStar()==0) && (IsDojiCandle()==0) && (IsBullishEngulfing()==0) && (Close[CloseShift1]<Open[OpenShift1]) ) // no reversal or indecision sign { if((OSMA_1<0) && (OSMA_1 < OSMA_2) && (IsTrending) && (STD_BB_1 > StdDevMin)) TradeAction=2; // Use OSMA if VHF decides if((STOCHM_1 < STOCHS_1) && (IsTrending==False) && (STD_BB_1 > StdDevMin)) TradeAction=2; // Use Stochastic if VHF decides } // check for long position (BUY) possibility if(TradeAction==1) { ticket=OrderSend(strSymbol,OP_BUY,BuyLots,Ask,iSlippage,Ask-StopLoss*Point,Ask+TakeProfit*Point,strComment,iMagic,0,Green); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } else Print("Error opening BUY order : ",GetLastError()); return(0); } // check for short position (SELL) possibility if(TradeAction==2) { ticket=OrderSend(strSymbol,OP_SELL,SellLots,Bid,iSlippage,Bid+StopLoss*Point,Bid-TakeProfit*Point,strComment,iMagic,0,Red); if(ticket>0) {
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); } else Print("Error opening SELL order : ",GetLastError()); return(0); } // Check once each bar section END //---- return(0); } //+------------------------------------------------------------------+ void CloseAllBuyOrders() { int i, iTotalOrders; iTotalOrders=OrdersTotal()-1; // Rosh line for (i=iTotalOrders; i>=0; i--) // Rosh line { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber()==iMagic) { if (OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,5,Violet); if (OrderType()==OP_BUYSTOP) OrderDelete(OrderTicket()); if (OrderType()==OP_BUYLIMIT) OrderDelete(OrderTicket()); } } } } void CloseAllSellOrders() { int i, iTotalOrders; iTotalOrders=OrdersTotal()-1; // Rosh line for (i=iTotalOrders; i>=0; i--) // Rosh line { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber()==iMagic) { if (OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,5,Violet); if (OrderType()==OP_SELLSTOP) OrderDelete(OrderTicket()); if (OrderType()==OP_SELLLIMIT) OrderDelete(OrderTicket()); } } } } int ActiveTradesForMagicNumber(string SymbolToCheck, int MagicNumberToCheck) { int icnt, itotal, retval; retval=0; itotal=OrdersTotal(); for(icnt=0;icnt<itotal;icnt++) { OrderSelect(icnt, SELECT_BY_POS, MODE_TRADES); // check for opened position, symbol & MagicNumber if(OrderType()<=OP_SELL && OrderSymbol()==SymbolToCheck && OrderMagicNumber()==MagicNumberToCheck) { retval++; //Print("Orders opened : ",retval); } } return(retval); } int CheckActiveTradesForStopLoss() { int icnt, itotal; int max=0; itotal=OrdersTotal(); for(icnt=0;icnt<itotal;icnt++) { // order loop boundary OrderSelect(icnt, SELECT_BY_POS, MODE_TRADES); // check for opened position, symbol & MagicNumber if(OrderType()==OP_SELL && OrderSymbol()==strSymbol && OrderMagicNumber()==iMagic) { if (OrderTicket()>max) max=OrderTicket(); // Check for latest open ticket if (OrderStopLoss()==0) { OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red); } if((OrderOpenPrice()-Ask)>(Point*TrailingStop)) { if(OrderStopLoss()>(Ask+Point*TrailingStop)) { OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red); } } } if(OrderType()==OP_BUY && OrderSymbol()==strSymbol && OrderMagicNumber()==iMagic) { if (OrderTicket()>max) max=OrderTicket(); // Check for latest open ticket if (OrderStopLoss()==0) { OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green); } if(Bid-OrderOpenPrice()>Point*TrailingStop) { if(OrderStopLoss()<Bid-Point*TrailingStop) { OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green); } } } } // order loop boundary return(max); } int IsMorningStar() {int retval=0; if( (Body(3) > Body(2)) && // Star body smaller than the previous one (Body(1) > Body(2)) && // Body of star smaller than bodies of first and last candles (Close[CloseShift3] < Open[OpenShift3]) && // First is a down candle (Close[CloseShift1] > Open[OpenShift1]) && // Third is an up candle (Close[CloseShift1] > (BodyLo(3) + Body(3)*0.5)) // The third candle closes above the midpoint of the first candle ) retval=1; return (retval); } int IsEveningStar() {int retval=0; if( (Body(3) > Body(2)) && // Star body smaller than the previous one (Body(1) > Body(2)) && // Body of star smaller than bodies of first and last candles (Close[CloseShift3] > Open[OpenShift3]) && // First is an up candle (Close[CloseShift1] < Open[OpenShift1]) && // Third is a down candle (Close[CloseShift1] < (BodyHi(3) - Body(3)*0.5)) // The third candle closes below the midpoint of the first candle ) retval=1; return (retval); } int IsBullishEngulfing() {int retval=0; if( (Close[CloseShift2] < Open[OpenShift2]) && // First is a down candle (Close[CloseShift1] > Open[OpenShift1]) && // Second is an up candle (Body(2) < Body(1)) // First engulfed by second ) retval=1; return (retval); } int IsBearishEngulfing() {int retval=0; if( (Close[CloseShift2] > Open[OpenShift2]) && // First is an up candle (Close[CloseShift1] < Open[OpenShift1]) && // Second is a down candle (Body(2) < Body(1)) // First engulfed by second ) retval=1; return (retval); } int IsDojiCandle() {int retval=0; if( (Body(1) < ((High[HighShift1] - Low[LowShift1])/iDoji)) ) retval=1; return (retval); } double Body (int iCandle) { double CandleOpen, CandleClose; CandleOpen=Open[iCandle]; CandleClose=Close[iCandle]; return (MathMax(CandleOpen, CandleClose)-(MathMin(CandleOpen, CandleClose))); } double BodyLo (int iCandle) { return (MathMin(Open[iCandle], Close[iCandle])); } double BodyHi (int iCandle) { return (MathMax(Open[iCandle], Close[iCandle])); } void Display_Info() { Comment("SelectFX Expert Adviser\n", "Desc: ",strComment,"\n", "Magic Number: ", iMagic,"\n", "Forex Account Server:",AccountServer(),"\n", "Account Balance: $",AccountBalance(),"\n", "Lots: ",Lots,"\n", "Symbol: ", Symbol(),"\n", "Price: ",NormalizeDouble(Bid,4),"\n", "Pip Spread: ",MarketInfo(strSymbol,MODE_SPREAD),"\n", "Date: ",Month(),"-",Day(),"-",Year()," Server Time: ",Hour(),":",Minute(),":",Seconds(),"\n", "Minimum Lot Size: ",MarketInfo(Symbol(),MODE_MINLOT)); return(0); } void Check_Settings() { if(Period()!=iPeriod) { Alert("Period set to: ", Period(), " is not correct for this EA!"); return(0); } if(Symbol()!=strSymbol) { Alert("Symbol set to: ", Symbol(), " is not correct for this EA!"); return(0); } if(Lots < MarketInfo(Symbol(),MODE_MINLOT)) { Alert("Lot size set too low, minimum is: ", MODE_MINLOT, " for this Account!"); return(0); } return(0); }