//+------------------------------------------------------------------+ //| TradersPowerExpert_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 = "---- TradersPowerExpert_v1 ----"; extern int Magic=1007; extern int Slippage=6; extern bool Trace = false; // Trace Switch extern string Main_Parameters = " Trade Volume & Trade Method"; extern double Lots = 1; extern bool TrailingStop = false; // Trailing Stop Switch extern bool InitialStop = true; // Initial Stop Switch extern int TimeZone = 1; extern string Data = " Input Data "; extern int TradersPeriod = 4; extern double BuyPercent = 160; // Percent from Daily Range for BUY extern double SellPercent = 200; // Percent from Daily Range for SELL extern double StopPercent = 200; // Percent from Daily Range for StopLoss extern int TradePeriod = 5; // Max days in trade extern double BreakEven = 85; // BreakEven Level in pips extern double BreakEvenGap = 8; // Pips when BreakEven will be reached extern string Trade = " Trade Days of Week"; extern int Monday = 1; // Day of the Week for Trade extern int Tuesday = 1; extern int Wednesday = 1; extern int Thursday = 1; extern int Friday = 1; extern string MM_Parameters = " MoneyManagement by L.Williams "; extern bool MM=false; // ÌÌ Switch extern double MMRisk=0.1; // Risk Factor extern double LossMax=1466; // Maximum Loss by 1 Lot int i,k,cnt=0, ticket, mode=0, digit=0, wenum=0, OrderOpenDay, Kz; double high,low, close[], open, range, Bulls,Bears, AvgBulls,AvgBears, SumBulls,SumBears,TodayOpen,spread=0, Profit=0; double smin=0, smax=0, BuyStop=0, SellStop=0, Lotsi=0, rates_h1[][6]; bool BuyInTrade=false, SellInTrade=false; datetime StartTime, prevwe=0; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } // ---- Money Management double MoneyManagement ( bool flag, double Lots, double risk, double maxloss) { double Lotsi=Lots; if ( flag ) Lotsi=NormalizeDouble(Lots*AccountFreeMargin()*risk/maxloss,1); if (Lotsi<0.1) Lotsi=0.1; return(Lotsi); } // Closing of Pending Orders void PendOrdDel() { int total=OrdersTotal(); for (int cnt=total-1;cnt>=0;cnt--) { OrderSelect(cnt, SELECT_BY_POS,MODE_TRADES); if ( OrderSymbol()==Symbol() && OrderMagicNumber()==Magic ) { int mode=OrderType(); bool result = false; switch(mode) { case OP_BUYSTOP : {result = OrderDelete( OrderTicket() ); Print(" PendBUY"); } case OP_SELLSTOP : {result = OrderDelete( OrderTicket() ); Print(" PendSELL"); } if(!result) { Print("OrderSend failed with error #",GetLastError()); return(0); } //Print(" cnt=",cnt, " total=",total," MODE = ",mode," Ticket=",OrderTicket() ); } } } return; } // void CloseOrdbyTime() { int total=OrdersTotal(); for (cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS); mode=OrderType(); if ( mode <= OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { datetime OpenTime=StrToTime(TimeToStr(OrderOpenTime(),TIME_DATE)); datetime CurnTime=StrToTime(TimeToStr(CurTime(),TIME_DATE)); int weekday=TimeDayOfWeek(OrderOpenTime()); if (weekday <=5 && DayOfWeek()==1 && CurnTime > prevwe && CurnTime > OpenTime) {wenum =wenum + 1; prevwe = CurnTime;} //if (OrderOpenDay <= 5 && DayOfWeek()>0) int CalcBars=TradePeriod+2*wenum; //else CalcBars=TradePeriod; if ((CurTime()-OpenTime)>=PERIOD_D1*CalcBars*60 || OrderProfit()>0) { if (mode==OP_BUY ) OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Yellow); if (mode==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,White); } } } } // ---- void TrailStops() { int total=OrdersTotal(); for (cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS); mode=OrderType(); if ( OrderSymbol()==Symbol() && OrderMagicNumber()==Magic ) { if ( mode==OP_BUY && smin > OrderStopLoss() ) { Profit=0; OrderModify(OrderTicket(),OrderOpenPrice(),smin,Profit,0,LightGreen); return(0); } if ( mode==OP_SELL && smax < OrderStopLoss()) { Profit=0; OrderModify(OrderTicket(),OrderOpenPrice(),smax,Profit,0,Yellow); return(0); } } } } void SellOrdOpen() { double SellPrice=TodayOpen - AvgBears * SellPercent/100.0 - spread; if (InitialStop) SellStop=SellPrice + StopPercent*AvgBears/100.0; else SellStop=0; Profit=0; ticket = OrderSend(Symbol(),OP_SELLSTOP,Lotsi, NormalizeDouble(SellPrice,digit), Slippage, NormalizeDouble(SellStop,digit), Profit,"SELL",Magic,0,Red); OrderOpenDay = DayOfWeek(); SellInTrade=false; Kz=1; if(ticket<0) { Print("OrderSend failed with error #",GetLastError()); return(0); } } void BuyOrdOpen() { double BuyPrice =TodayOpen + AvgBulls*BuyPercent/100.0 + spread; if (InitialStop) BuyStop = BuyPrice - StopPercent*AvgBulls/100.0; else BuyStop=0; Profit=0; ticket = OrderSend(Symbol(),OP_BUYSTOP ,Lotsi, NormalizeDouble(BuyPrice ,digit), Slippage, NormalizeDouble(BuyStop ,digit), Profit,"BUY",Magic,0,Blue); OrderOpenDay = DayOfWeek(); BuyInTrade=false; Kz=1; if(ticket<0) { Print("OrderSend failed with error #",GetLastError()); return(0); } } void ExtraOrdDel() { int total = OrdersTotal(); for (cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS); mode=OrderType(); if ( OrderSymbol()==Symbol() && OrderMagicNumber()==Magic ) { if (mode==OP_BUY && !BuyInTrade ) BuyInTrade =true; if (mode==OP_SELL && !SellInTrade) SellInTrade=true; if (mode == OP_SELLSTOP && BuyInTrade ) { OrderDelete(OrderTicket()); SellInTrade=false; Print(" ExtraSell"); } if (mode == OP_BUYSTOP && SellInTrade ) { OrderDelete(OrderTicket()); BuyInTrade=false; Print(" ExtraBuy"); } } } } // ---- Scan Trades int ScanTrades() { int total = OrdersTotal(); int numords = 0; for(cnt=0; cnt<total; cnt++) { OrderSelect(cnt, SELECT_BY_POS); if(OrderSymbol() == Symbol() && OrderType()>=OP_BUY && OrderMagicNumber() == Magic) numords++; } return(numords); } datetime OrderOpenDate() { int total = OrdersTotal(); datetime date; for(cnt=0; cnt<total; cnt++) { OrderSelect(cnt, SELECT_BY_POS); if(OrderSymbol() == Symbol() && OrderType()>=OP_BUY && OrderMagicNumber() == Magic) date = StrToTime(TimeToStr(OrderOpenTime(),TIME_DATE)); } return(date); } 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; // Print(" Buy Kz=",Kz); //BuyStop = OrderStopLoss(); if (Bid-OrderOpenPrice() > Kz*BreakEven*Point) { BuyStop=OrderOpenPrice()+((Kz-1)*BreakEven+BreakEvenGap)*Point; OrderModify(OrderTicket(),OrderOpenPrice(), NormalizeDouble(BuyStop, digit), OrderTakeProfit(),0,LightBlue); //Kz=Kz+1; return(0); } } if ( mode==OP_SELL ) { if ( OrderOpenPrice()-Ask > 0 ) {Kz = MathFloor((OrderOpenPrice()-Ask)/(BreakEven*Point)); if (Kz < 1) Kz=1;} else Kz = 1; // Print(" Sell Kz=",Kz); //SellStop = OrderStopLoss(); if (OrderOpenPrice()-Ask > Kz*BreakEven*Point) { SellStop=OrderOpenPrice()-((Kz-1)*BreakEven+BreakEvenGap)*Point; OrderModify(OrderTicket(),OrderOpenPrice(), NormalizeDouble(SellStop, digit), OrderTakeProfit(),0,Orange); //DrawStops("SellStop",SellStop,Orange); //Kz=Kz+1; return(0); } } } } } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { if(Bars < 1) {Print("Not enough bars for this strategy"); return(0);} //if ( Trace ) SetTrace(); string TimeTrade = "00:00"; StartTime = StrToTime(TimeTrade) + TimeZone*3600; if(Hour() >= TimeZone && Hour() <= TimeZone+1) { if ( OrderOpenDate() < StrToTime(TimeToStr( StartTime,TIME_DATE))) { PendOrdDel(); if( TradePeriod > 0 )CloseOrdbyTime(); } if(ScanTrades()<1) { spread= MarketInfo(Symbol(),MODE_SPREAD)*Point; digit = MarketInfo(Symbol(),MODE_DIGITS); Lotsi = MoneyManagement ( MM, Lots, MMRisk, LossMax); if (TrailingStop) InitialStop=true; ArrayCopyRates(rates_h1, Symbol(), PERIOD_H1); TodayOpen = rates_h1[0][1]; SumBulls=0;SumBears=0; for (k=TradersPeriod;k>=1;k--) { open = rates_h1[k*24][1]; high=0; low=10000000; for (i=24;i>=1;i--) { high = MathMax( high, rates_h1[i+(k-1)*24][3]); low = MathMin( low , rates_h1[i+(k-1)*24][2]); } range =(high-low); Bulls = high - open; Bears = open - low; SumBulls += Bulls; SumBears += Bears; //Print(" Bulls=",high,"Bears=",low); } AvgBulls = SumBulls/TradersPeriod; AvgBears = SumBears/TradersPeriod; //Print(" high=",AvgBulls,"low=",AvgBears); smin = Bid - StopPercent*AvgBears/100.0; smax = Ask + StopPercent*AvgBulls/100.0; if ( Monday == 1 ) if(DayOfWeek()==1){BuyOrdOpen(); SellOrdOpen();} if ( Tuesday == 1 ) if(DayOfWeek()==2){BuyOrdOpen(); SellOrdOpen();} if ( Wednesday== 1 ) if(DayOfWeek()==3){BuyOrdOpen(); SellOrdOpen();} if ( Thursday == 1 ) if(DayOfWeek()==4){BuyOrdOpen(); SellOrdOpen();} if ( Friday == 1 ) if(DayOfWeek()==5){BuyOrdOpen(); SellOrdOpen();} } } ExtraOrdDel(); if (BreakEven > 0) BreakEvenStop(); if (TrailingStop) TrailStops(); return(0); }//int start //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
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
Other Features: