//+------------------------------------------------------------------+ //| BBExpert_v1.mq4 | //| Copyright © 2006, Forex-TSD.com | //| Written by IgorAD,igorad2003@yahoo.co.uk | //| http://finance.groups.yahoo.com/group/TrendLaboratory | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, Forex-TSD.com " #property link "http://www.forex-tsd.com/" #include <stdlib.mqh> #include <Tracert.mqh> //---- input parameters extern string Expert_Name = "---- BBExpert_v1 ----"; extern int Magic = 10000; extern int Slippage = 6; extern bool Trace = false; // Trace Switch extern string Main_data = " Trade Volume & Trade Method"; extern double Lots = 0.1; extern double TakeProfit = 50; // Take Profit Value extern double InitialStop = 30; // Initial Stop Value extern bool TrailingStop = true; // Trailing Stop Switch extern bool SwingTrade = false; // Swing Trade Switch extern bool PendingOrder = false; // PendingOrder/InstantExecution Switch extern double PendOrdGap = 10; // Gap from High/Low for Pending Orders extern double BreakEven = 20; // BreakEven Level in pips extern double BreakEvenGap = 1; // Pips when BreakEven will be reached extern string Calc_data = " Bollinger Bands Parameters "; extern int Length = 20; // Bollinger Bands Period extern int Deviation = 2; // Deviation extern double MoneyRisk = 1.00; // Offset Factor extern double DeltaLong = 0.00; extern double DeltaShort = 0.00; extern string MM_data = " 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 Trend=0, PrevTrend=0, digit, Signal=0, b=0, cnt=0, Kz=0, ticket=0; double smin=0,smax=0,smin1=0,smax1=0,bsmin=0,bsmax=0,bsmin1=0,bsmax1=0, SellStop,BuyStop,prevStop=0, SellProfit,BuyProfit; bool BuyInTrade = false, SellInTrade = false; bool BuySignal = false, SellSignal = false; bool BuyExit = false, SellExit = false; //+------------------------------------------------------------------+ //| 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); } void BBStops() { smax1 = smax; smin1 = smin; smax=iBands(NULL,0,Length,Deviation,0,PRICE_CLOSE,MODE_UPPER,1); smin=iBands(NULL,0,Length,Deviation,0,PRICE_CLOSE,MODE_LOWER,1); PrevTrend=Trend; if (Close[1]>smax1) Trend=1; if (Close[1]<smin1) Trend=-1; if(Trend>0 && smin<smin1) smin = smin1; if(Trend<0 && smax>smax1) smax = smax1; bsmax1 = bsmax; bsmin1 = bsmin; bsmax = smax+0.5*(MoneyRisk-1)*(smax-smin); bsmin = smin-0.5*(MoneyRisk-1)*(smax-smin); if(Trend>0 && bsmin<bsmin1) bsmin=bsmin1; if(Trend<0 && bsmax>bsmax1) bsmax=bsmax1; } void TradeSignal() { BuySignal = ( Close[1] - smax1 > DeltaLong*Point && PrevTrend<0 ); SellSignal= ( smin1 - Close[1] > DeltaShort*Point && PrevTrend>0 ); } void ExitSignal() { BuyExit = ( Close[1] < smin1 && PrevTrend>0 ); SellExit= ( Close[1] > smax1 && PrevTrend<0 ); } double MoneyManagement ( bool flag, double Lots, double risk, double maxloss) { double Lotsi=Lots; if ( flag ) Lotsi=Lots*NormalizeDouble(Lots*AccountFreeMargin()*MMRisk/MaxLoss,1); if (Lotsi<0.1) Lotsi=0.1; return(Lotsi); } void CloseTrade() { for (cnt=0;cnt<OrdersTotal();cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); int mode=OrderType(); if ( OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { // - BUY Orders if ( BuyExit ) { if (mode==OP_BUY) { OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Yellow); } } else // - SELL Orders if ( SellExit ) { if (mode==OP_SELL) { OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,White); } } } } } void BreakEvenStop() { for (cnt=0;cnt<OrdersTotal();cnt++) { OrderSelect(cnt, SELECT_BY_POS); int mode=OrderType(); if ( OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if ( mode==OP_BUY ) { if ( Bid-OrderOpenPrice() > 0 ) {Kz = MathFloor((Bid-OrderOpenPrice())/(BreakEven*Point)); if (Kz < 1) Kz=1;} else Kz = 1; if (Bid-OrderOpenPrice() > Kz*BreakEven*Point) { BuyStop=OrderOpenPrice()+((Kz-1)*BreakEven+BreakEvenGap)*Point; OrderModify(OrderTicket(),OrderOpenPrice(), NormalizeDouble(BuyStop, digit), OrderTakeProfit(),0,LightBlue); return(0); } } if ( mode==OP_SELL ) { if ( OrderOpenPrice()-Ask > 0 ) {Kz = MathFloor((OrderOpenPrice()-Ask)/(BreakEven*Point)); if (Kz < 1) Kz=1;} else Kz = 1; if (OrderOpenPrice()-Ask > Kz*BreakEven*Point) { SellStop=OrderOpenPrice()-((Kz-1)*BreakEven+BreakEvenGap)*Point; OrderModify(OrderTicket(),OrderOpenPrice(), NormalizeDouble(SellStop, digit), OrderTakeProfit(),0,Orange); return(0); } } } } } void TrailStop() { for (cnt=0;cnt<OrdersTotal();cnt++) { OrderSelect(cnt, SELECT_BY_POS); int mode=OrderType(); if ( OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if (mode==OP_BUY) { BuyStop = bsmin; if (BuyStop>OrderStopLoss()) { bool result = OrderModify(OrderTicket(),OrderOpenPrice(), NormalizeDouble(BuyStop, digit), OrderTakeProfit(),0,LightGreen); //if( !result ) //{ //Print("BUY: OrderModify failed with error #",GetLastError()); //return(0); //} } } // - SELL Orders if (mode==OP_SELL) { SellStop = bsmax; if( SellStop<OrderStopLoss()) { result = OrderModify(OrderTicket(),OrderOpenPrice(), NormalizeDouble(SellStop, digit), OrderTakeProfit(),0,Yellow); //if( !result ) //{ //Print("SELL: OrderModify failed with error #",GetLastError()); //return(0); //} } } } } } // ---- Open Sell Orders void SellOrdOpen() { double SellStop,SellProfit; double SellPrice=Bid; double StopPrice = Ask; int Mode = OP_SELL; if ( PendingOrder ) {SellPrice=bsmin - PendOrdGap*Point; StopPrice = SellPrice; Mode=OP_SELLSTOP;} if (InitialStop > 0) SellStop =StopPrice + InitialStop*Point; else if (!TrailingStop) SellStop = 0; else SellStop = bsmax; if (TakeProfit > 0) SellProfit=SellPrice - TakeProfit*Point; else SellProfit=0; ticket = OrderSend( Symbol(),Mode,MoneyManagement ( MM, Lots, MMRisk, MaxLoss), NormalizeDouble(SellPrice, digit), Slippage, NormalizeDouble(SellStop , digit), NormalizeDouble(SellProfit , digit), "sell",Magic,0,Red); if(ticket<0) { Print("SELL: OrderSend failed with error #",GetLastError()); } if ( PendingOrder && GetLastError() == 130) int ticket2=OrderSend(Symbol(),OP_SELL, MoneyManagement ( MM, Lots, MMRisk, MaxLoss), Bid, Slippage, NormalizeDouble(SellStop , digit), NormalizeDouble(SellProfit , digit), "sell",Magic,0,Red); SellInTrade=true; BuyInTrade=false; SellSignal=false; return(0); } // ---- Open Buy Orders void BuyOrdOpen() { double BuyStop,BuyProfit; double BuyPrice = Ask; double StopPrice = Bid; int Mode = OP_BUY; if ( PendingOrder ) {BuyPrice = smax1 + PendOrdGap*Point; StopPrice = BuyPrice; Mode = OP_BUYSTOP;} if (InitialStop > 0) BuyStop = StopPrice - InitialStop*Point; else if (!TrailingStop) BuyStop = 0; else BuyStop = bsmin; if (TakeProfit > 0) BuyProfit= BuyPrice + TakeProfit*Point; else BuyProfit=0; ticket = OrderSend(Symbol(),Mode, MoneyManagement ( MM, Lots, MMRisk, MaxLoss), NormalizeDouble(BuyPrice, digit), Slippage, NormalizeDouble(BuyStop , digit), NormalizeDouble(BuyProfit , digit), "buy",Magic,0,Blue); if(ticket<0) { Print("BUY : OrderSend failed with error #",GetLastError()); //return(0); } if (PendingOrder && GetLastError() == 130) int ticket2=OrderSend(Symbol(),OP_BUY, MoneyManagement ( MM, Lots, MMRisk, MaxLoss), Ask, Slippage, NormalizeDouble(BuyStop , digit), NormalizeDouble(BuyProfit , digit), "buy",Magic,0,Blue); BuyInTrade=true; SellInTrade = false; BuySignal = false; return(0); } void PendOrdsDel() { if(Close[1]< 0.5*(bsmin+bsmax))int PendClose=1; if(Close[1]> 0.5*(bsmin+bsmax)) PendClose=-1; for (cnt=0;cnt<OrdersTotal();cnt++) { OrderSelect(cnt, SELECT_BY_POS); int mode=OrderType(); if ( OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if (mode==OP_BUYSTOP && PendClose>0) { OrderDelete(OrderTicket()); return(0); } else if (mode==OP_SELLSTOP && PendClose<0) { OrderDelete(OrderTicket()); return(0); } } } } // ------------------------------------------------- //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { int total,ticket; //---- digit = MarketInfo(Symbol(),MODE_DIGITS); if ( Trace ) SetTrace(); BBStops(); PendOrdsDel(); TradeSignal(); ExitSignal(); CloseTrade(); if (BreakEven >0) BreakEvenStop(); if (TrailingStop) TrailStop(); if (SwingTrade) { if (ScanTrades()<1 && BuySignal && !BuyInTrade ) BuyOrdOpen() ; if (ScanTrades()<1 && SellSignal && !SellInTrade) SellOrdOpen(); } else { if (ScanTrades()<1 && BuySignal ) BuyOrdOpen() ; if (ScanTrades()<1 && SellSignal) SellOrdOpen(); } //---- return(0); } //start() //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Series array that contains close prices for each bar
Indicator Curves created:
Indicators Used:
Bollinger bands indicator
Custom Indicators Used:
Order Management characteristics:
Checks for the total of open orders
It Closes Orders by itself
It can change open orders parameters, due to possible stepping strategy
Other Features: