/*-----------------------------+ | | | Shared by www.Aptrafx.com | | | +------------------------------*/ /* Need To Do List: For v0.2 1. Place only one order for 1 lot. 2. Sell off 0.1 lot when TP levels are met. */ #property copyright "Provided by SBFX forum members" #property link "http://www.strategybuilderfx.com" #include <stdlib.mqh> #include <WinUser32.mqh> extern double LotSize=0.1; extern int BrokerOffsetToGMT = 0; extern int NumberOfOrdersPerSide = 20; // NumberOfOrdersPerSide X TakeProfitIncrement = Highest TakeProfit Level extern int TakeProfitIncrement = 5; extern bool Trade1 = true; extern int Time1 = 6; extern bool Trade2 = true; extern int Time2 = 12; extern bool Trade3 = true; extern int Time3 = 18; extern bool Trade4 = true; extern int Time4 = 0; extern int ExitMinute = 55; extern int StopLoss = 20; extern int PipsForEntry = 5; extern int BreakEven = 10; extern bool MovingBreakEven = true; extern int MovingBEHoursToStart = 3; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { int cnt, ticket; if(Bars<100) { Print("bars less than 100"); return(0); } double BE,MBE; double PFE=PipsForEntry; double CurrentHour=TimeHour(CurTime()); double CurrentMinute=TimeMinute(CurTime()); if((CurrentHour==Time1+1 && Trade1) || (CurrentHour==Time2+1 && Trade2) || (CurrentHour==Time3+1 && Trade3) || (CurrentHour==Time4+1 && Trade4)) { double highprice=iHigh(NULL,60,1); double lowprice=iLow(NULL,60,1); } int total=OrdersTotal(); double Spread=Ask-Bid; double hprice=Spread+highprice+PFE*Point; double lprice=lowprice-PFE*Point; double PreviousBarHigh=iHigh(NULL,0,1); double PreviousBarLow=iLow(NULL,0,1); double Previous2ndBarHigh=iHigh(NULL,0,2); double Previous2ndBarLow=iLow(NULL,0,2); int TPI=TakeProfitIncrement; int i,j; int MBEHour1=Time1+BrokerOffsetToGMT+MovingBEHoursToStart; int MBEHour2=Time2+BrokerOffsetToGMT+MovingBEHoursToStart; int MBEHour3=Time3+BrokerOffsetToGMT+MovingBEHoursToStart; int MBEHour4=Time4+BrokerOffsetToGMT+MovingBEHoursToStart; bool need_long = true; bool need_short = true; bool MovingBE1 = false; bool MovingBE2 = false; bool MovingBE3 = false; bool MovingBE4 = false; bool FirstBE = false; // First update existing orders. if(MBEHour1>=24) { MBEHour1=MBEHour1-24; } if(MBEHour2>=24) { MBEHour2=MBEHour2-24; } if(MBEHour3>=24) { MBEHour3=MBEHour3-24; } if(MBEHour4>=24) { MBEHour4=MBEHour4-24; } if(Hour()>=MBEHour1 && MovingBreakEven) MovingBE1=true; if(Hour()>=MBEHour2 && MovingBreakEven) MovingBE2=true; if(Hour()>=MBEHour3 && MovingBreakEven) MovingBE3=true; if(Hour()>=MBEHour4 && MovingBreakEven) MovingBE4=true; double SL=StopLoss*Point; Comment("CurrentHour is ",CurrentHour,"\n", "CurrentMinute is ",CurrentMinute); if((CurrentHour==Time1 && CurrentMinute>=ExitMinute && Trade1) || (CurrentHour==Time2 && CurrentMinute>=ExitMinute && Trade2) || (CurrentHour==Time3 && CurrentMinute>=ExitMinute && Trade3) || (CurrentHour==Time4 && CurrentMinute>=ExitMinute && Trade4)) { for(i=total-1;i>=0;i--) { OrderSelect(i, SELECT_BY_POS); if(OrderSymbol()==Symbol()) { int type = OrderType(); bool result = false; switch(type){ //Close opened long positions case OP_BUY : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red ); break; //Close opened short positions case OP_SELL : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red ); break; //Close pending orders //case OP_BUYLIMIT : case OP_BUYSTOP : //case OP_SELLLIMIT : case OP_SELLSTOP : result = OrderDelete( OrderTicket() ); } if(result == false){ Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() ); Sleep(3000); } }//End Chart Orders }//End for loop }//End Closing All Open and Pending Orders else{ for(cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY) { need_long = false; if((MovingBE1 && BreakEven>0 && FirstBE)|| (MovingBE2 && BreakEven>0 && FirstBE)|| (MovingBE3 && BreakEven>0 && FirstBE)|| (MovingBE4 && BreakEven>0 && FirstBE)) { if(PreviousBarLow>Previous2ndBarLow) { MBE = PreviousBarLow; OrderModify(OrderTicket(),OrderOpenPrice(),MBE,OrderTakeProfit(),0,White); }// End MBE fix }//End MovingBE && BE>0 else{ if(BreakEven>0) { if((Bid-OrderOpenPrice())>(Point*BreakEven)) { BE = OrderOpenPrice(); OrderModify(OrderTicket(),OrderOpenPrice(),BE,OrderTakeProfit(),0,White); FirstBE=true; }// End BE fix }// End BE>0 }//End else }//End OP_BUY if(OrderType()==OP_SELL) { need_short = false; if((MovingBE1 && BreakEven>0 && FirstBE)|| (MovingBE2 && BreakEven>0 && FirstBE)|| (MovingBE3 && BreakEven>0 && FirstBE)|| (MovingBE4 && BreakEven>0 && FirstBE)) { if(PreviousBarHigh>Previous2ndBarHigh) { MBE = PreviousBarHigh; OrderModify(OrderTicket(),OrderOpenPrice(),MBE,OrderTakeProfit(),0,White); }// End MBE fix }//End MovingBE && BE>0 else{ if(BreakEven>0) { if((OrderOpenPrice()-Ask)>(Point*BreakEven)) { BE = OrderOpenPrice(); OrderModify(OrderTicket(),OrderOpenPrice(),BE,OrderTakeProfit(),0,White); FirstBE=true; }// End BE fix }// End BE>0 }//End else }//End OP_SELL if(OrderType()==OP_BUYSTOP) { need_long = false; } if(OrderType()==OP_SELLSTOP) { need_short = false; } }//End OrderSymbol()==Symbol() }//End for loop if(AccountFreeMargin()<(1000*LotSize)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } if((CurrentHour-1==Time1 && Trade1) || (CurrentHour-1==Time2 && Trade2) || (CurrentHour-1==Time3 && Trade3) || (CurrentHour-1==Time4 && Trade4)) { if(need_long) { for(i=1;i<NumberOfOrdersPerSide+1;i++) { int hticket=OrderSend(Symbol(),OP_BUYSTOP,LotSize,hprice,3,hprice-SL,hprice+((TPI*i)*Point),"MultiBreakOut_v0.1",255+i,0,Green); } if(hticket<(i+1)) { int herror=GetLastError(); Print("Error = ",ErrorDescription(herror)); } }//End need_long if(need_short) { for(j=1;j<NumberOfOrdersPerSide+1;j++) { int lticket=OrderSend(Symbol(),OP_SELLSTOP,LotSize,lprice,3,lprice+SL,lprice-((TPI*j)*Point),"MultiBreakOut_v0.1",355+j,0,Red); } if(lticket<(j+1)) { int lerror=GetLastError(); Print("Error = ",ErrorDescription(lerror)); } }//End need_short }//End Entry }//End Else }//End 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:
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
It automatically opens orders when conditions are reached
Other Features:
It issuies visual alerts to the screen