//+------------------------------------------------------------------+ //| FozzyExpert_v1.2.mq4 | //| Copyright © 2006, TrendLaboratory Ltd. | //| http://finance.groups.yahoo.com/group/TrendLaboratory | //| E-mail: igorad2003@yahoo.co.uk | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, TrendLaboratory Ltd." #property link "http://finance.groups.yahoo.com/group/TrendLaboratory" //---- input parameters extern string Expert_Name = "FozzyExpert_v1.2"; extern int Magic = 10000; extern int Slippage = 6; extern string Main_data = " Trade Volume & Trade Method"; extern double Lots = 0.1; extern double TakeProfit = 0; // Take Profit Value extern double InitialStop = 0; // Initial Stop Value extern double TrailingStop = 25; // Trailing Stop Value extern double BreakEven = 40; // Break-Even Value extern int SessionStart = 0; // Start Hour of Trade Session extern int SessionEnd = 24; // End Hour of Trade Session extern string Inputs = " BBRSI & MA parameters "; extern int TimeFrame = 1440; // Large Time Frame in min extern int Price = 0; // O-Close; 1-Open; 2-High; 3-Low; 4-Median; 5-Typical; 6-Weighted extern int RSIPeriod = 8; // Period of RSI extern int MAPeriod = 8; // Period of SMA extern int BBPeriod = 20; // BBands Period extern double K = 1; // Deviation ratio extern int Mode = 0; // RSI mode : 0 - typical(smoothed by SMMA); 1- clssic (smoothed by SMA) extern string MM_inputs = " MoneyManagement by L.Williams "; extern bool MM = false; // ÌÌ Switch extern double MMRisk = 0.15; // Risk Factor extern double MaxLoss = 1000; // Maximum Loss by 1 Lot int OrderBar=0; double SellStop,BuyStop,SellProfit,BuyProfit, Lotsi; bool SignalMail=false; bool FirstTime=false; int BEvent=0; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } // ---- Scan Trades int ScanTrades() { int total = OrdersTotal(); int numords = 0; for(int cnt=0; cnt<total; cnt++) { OrderSelect(cnt, SELECT_BY_POS); if(OrderSymbol() == Symbol() && OrderType()<=OP_SELLSTOP && OrderMagicNumber() == Magic) numords++; } return(numords); } int TradeSignal() { double RSI = iCustom(Symbol(),TimeFrame,"BBRSI&MA_v2",Price,RSIPeriod,MAPeriod,BBPeriod,K,Mode,0,1); double MA = iCustom(Symbol(),TimeFrame,"BBRSI&MA_v2",Price,RSIPeriod,MAPeriod,BBPeriod,K,Mode,1,1); double prevRSI = iCustom(Symbol(),TimeFrame,"BBRSI&MA_v2",Price,RSIPeriod,MAPeriod,BBPeriod,K,Mode,0,2); double prevMA = iCustom(Symbol(),TimeFrame,"BBRSI&MA_v2",Price,RSIPeriod,MAPeriod,BBPeriod,K,Mode,1,2); double UpBB = iCustom(Symbol(),TimeFrame,"BBRSI&MA_v2",Price,RSIPeriod,MAPeriod,BBPeriod,K,Mode,2,1); double DnBB = iCustom(Symbol(),TimeFrame,"BBRSI&MA_v2",Price,RSIPeriod,MAPeriod,BBPeriod,K,Mode,3,1); double MidBB = iCustom(Symbol(),TimeFrame,"BBRSI&MA_v2",Price,RSIPeriod,MAPeriod,BBPeriod,K,Mode,4,1); if (TimeHour(CurTime()) >= SessionStart && TimeHour(CurTime()) <= SessionEnd) { if ( RSI > MA && prevRSI < prevMA && RSI < MidBB && RSI < UpBB ) return( 1); if ( RSI < MA && prevRSI > prevMA && RSI > MidBB && RSI > DnBB ) return(-1); } } double MoneyManagement ( bool flag, double Lots, double risk, double maxloss) { Lotsi=Lots; if ( flag ) Lotsi=Lots*NormalizeDouble(Lots*AccountFreeMargin()*risk/maxloss,1); if (Lotsi<0.1) Lotsi=0.1; return(Lotsi); } void TrailStop() { for (int cnt=0;cnt<OrdersTotal();cnt++) { OrderSelect(cnt, SELECT_BY_POS); int mode=OrderType(); if ( OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if (mode==OP_BUY) { if ( BreakEven > 0 && BreakEven > TrailingStop && BEvent==0 ) { double Gain = (Bid - OrderOpenPrice())/Point; if( Gain >= BreakEven && OrderStopLoss()<=OrderOpenPrice()+1*Point) { BuyStop = OrderOpenPrice()+1*Point; BEvent=1; } } else if( TrailingStop > 0 && BEvent==1) BuyStop = Bid - TrailingStop*Point; if( OrderOpenPrice() <= BuyStop || OrderStopLoss() == 0 ) { if ( BuyStop > OrderStopLoss() ) { OrderModify(OrderTicket(),OrderOpenPrice(), NormalizeDouble(BuyStop, Digits), OrderTakeProfit(),0,LightGreen); if( GetLastError()>0 ) { Print("BUY: OrderModify failed with error #",GetLastError()); } return(0); } } } // - SELL Orders if (mode==OP_SELL) { if ( BreakEven > 0 && BreakEven > TrailingStop && BEvent==0) { Gain = (OrderOpenPrice()-Ask)/Point; if( Gain >= BreakEven && OrderStopLoss()>=OrderOpenPrice()-1*Point) { SellStop = OrderOpenPrice()-1*Point; BEvent=-1; } } else if( TrailingStop > 0 && BEvent==-1) SellStop = Ask + Point * TrailingStop; if( OrderOpenPrice() > SellStop) { if( OrderStopLoss() > SellStop || OrderStopLoss() == 0 ) { OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(SellStop, Digits), OrderTakeProfit(),0,DarkOrange); if( GetLastError()>0 ) { Print("SELL: OrderModify failed with error #",GetLastError()); } return(0); } } } } } } // ---- Open Sell Orders void SellOrdOpen() { double SellPrice = Bid; double StopPrice = Bid; int Mode = OP_SELL; if (InitialStop > 0) SellStop = StopPrice + InitialStop*Point; else SellStop = iHigh(Symbol(),TimeFrame,1); if (TakeProfit > 0) SellProfit = SellPrice - TakeProfit*Point; else SellProfit=0; int ticket = OrderSend( Symbol(),Mode,MoneyManagement ( MM, Lots, MMRisk, MaxLoss), NormalizeDouble(SellPrice , Digits), Slippage, NormalizeDouble(SellStop , Digits), NormalizeDouble(SellProfit, Digits), Expert_Name+" SELL",Magic,0,Red); if(ticket > 0) { if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) { OrderBar =iBars(OrderSymbol(),TimeFrame); Print("SELL order opened : ", OrderOpenPrice()); BEvent=0; if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Open Sell"); } } else if(GetLastError()>0) Print("SELL: OrderSend failed with error #",GetLastError()); return(0); } // ---- Open Buy Orders void BuyOrdOpen() { double BuyPrice = Ask; double StopPrice = Ask; int Mode = OP_BUY; if (InitialStop > 0) BuyStop = StopPrice - InitialStop*Point; else BuyStop = iLow(Symbol(),TimeFrame,1); if (TakeProfit > 0) BuyProfit= BuyPrice + TakeProfit*Point; else BuyProfit=0; int ticket = OrderSend(Symbol(),Mode, MoneyManagement ( MM, Lots, MMRisk, MaxLoss), NormalizeDouble(BuyPrice , Digits), Slippage, NormalizeDouble(BuyStop , Digits), NormalizeDouble(BuyProfit, Digits), Expert_Name+" BUY",Magic,0,Blue); if(ticket > 0) { if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) { OrderBar =iBars(OrderSymbol(),TimeFrame); Print("BUY order opened : ", OrderOpenPrice()); BEvent=0; if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Open Buy"); } } else if(GetLastError()>0) Print("BUY : OrderSend failed with error #",GetLastError()); return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { if(iBars(Symbol(),TimeFrame)< 100 || IsTradeAllowed()==false) return; if(AccountFreeMargin()< 1000*MoneyManagement ( MM, Lots, MMRisk, MaxLoss)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } if (ScanTrades()<1 && ( iBars(Symbol(),TimeFrame) != OrderBar || !FirstTime)) { if (TradeSignal()>0) {BuyOrdOpen() ;FirstTime=true;} if (TradeSignal()<0) {SellOrdOpen();FirstTime=true;} } else { if(BreakEven>0 || TrailingStop>0) TrailStop(); } //---- return(0); } //start() //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar
Indicator Curves created:
Indicators Used:
Custom Indicators Used:
BBRSI&MA_v2
Order Management characteristics:
Checks for the total of open orders
It can change open orders parameters, due to possible stepping strategy
Other Features:
It sends emails