//+------------------------------------------------------------------+ //| noah10pips2006.mq4 | //| Copyright © 2005, Nick Bilak, beluck[AT]gmail.com | //| http://metatrader.50webs.com/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2005, Nick Bilak" #property link "http://metatrader.50webs.com/" //---- #include <stdlib.mqh> //---- extern int MAGICNUM=1; extern double Lots=0.1; extern int StopLoss=55; extern int TakeProfit=100; extern int TrailingStop=0; extern int slippage=3; //---- extern double MaximumRisk=7.0; extern double MaxLot=100.0; extern double MinLot=1.0; extern bool FixedLot=true; //---- extern int TimeZoneOfData=0; // NY 7,15; extern int StartHour=2; // 9:00 PM EST extern int StartMinute=0; extern int EndHour=23; extern int EndMinute=0; extern int FridayEndHour=21; extern int SecureProfit=10; extern int TrailSecureProfit=16; extern int TradeFriday=1; // 0- dont open trades on friday, 1- Trade on friday extern int DontReverse=1; extern int StartYear=2005; extern int StartMonth=6; extern int TradesSet=2; extern int TypeSet=0; // 0 = NONE, 1 = SELL, 2 = BUY extern int ReverseSet=0; // 0=False, 1=True //---- int Today, RefDate, LastBarOfDay, FirstBarOfDay, Loop; double pre_lo, pre_hi, myC, myO, lotsi; int Cnt; int OpenTrades, FilledOrders; double BuyPrice, SellPrice; int TimetoOpen, TimetoClose, tmp, i; int Trades=2; string Type="NONE"; bool Reverse=False; int mode,tr; int myEndHour, myFridayEndHour, myStartHour; bool FirstTime=True; double range; double hi_pass; double lo_pass; double MP; double er_hi; double er_lo; double erange,erange2; double r3; double diffs,diffb; int res; bool bres; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { if (TimeYear(Time[0])<StartYear) return; lotsi=LotsRisk(StopLoss); if (FirstTime) { if (TradesSet!=2 || TypeSet!=0 || ReverseSet!=0) { Trades =TradesSet; if (TypeSet==0) Type="NONE"; if (TypeSet==1) Type="SELL"; if (TypeSet==2) Type="BUY"; if (ReverseSet ==0) Reverse=False; if (ReverseSet ==1) Reverse=True; } FirstTime=False; } Today=MathFloor(CurTime()/86400)*86400; Cnt=1; if (Today!=RefDate) { RefDate=Today; while( Cnt<(Bars-1) && (Time[Cnt]-TimeZoneOfData*3600>=RefDate)) { Cnt++; } LastBarOfDay=Cnt; if (DayOfWeek()==1) RefDate=Today-86400*3; else RefDate=Today-86400; while( Cnt<(Bars-1) && (Time[Cnt]-TimeZoneOfData*3600>=RefDate)) { Cnt++; } FirstBarOfDay=Cnt-1; } pre_hi=High[Highest(NULL,0,MODE_HIGH,FirstBarOfDay-LastBarOfDay+1,LastBarOfDay)]; pre_lo=Low[Lowest(NULL,0,MODE_LOW,FirstBarOfDay-LastBarOfDay+1,LastBarOfDay)]; myC=Close[LastBarOfDay]; //pre_hi=High[lookback]; //pre_lo=Low[lookback]; // *** calculate all the 10pip numbers *** hi_pass=pre_hi + 0.002 ; lo_pass=pre_lo - 0.002 ; MP=(((pre_hi - pre_lo)/2.0) + pre_lo); MP=NormalizeDouble(MP,Digits); hi_pass=NormalizeDouble(hi_pass,Digits); lo_pass=NormalizeDouble(lo_pass,Digits); erange=(pre_hi - pre_lo); //erange2= (pre_hi - pre_lo)*10000; // *** which entry range amount to use? *** // *** less than 160 range *** if (erange<=0.016) r3=0.004; else r3=erange * 0.25; // *** set entry range *** er_hi=(pre_hi - r3); er_lo=(pre_lo + r3); erange2= (er_hi - er_lo)*10000.0; // *** print the numbers on the chart for reference *** //Comment("BUY @ ", er_hi,"\nSELL @ ", er_lo); // *** draw the lines on the chart *** // *** special case for ER if range < 80 *** // *** Prints an advisory message on the screen *** if (erange<=0.008) { ObjectDelete("LT80_txt"); ObjectCreate("LT80_txt",OBJ_TEXT,0,Time[35],MP); ObjectSetText("LT80_txt","RANGE<80 ",10,"Arial",White); //SetObjectText("LT80_txt","RANGE<80 ","Arial",10,Black); //MoveObject("LT80_txt",OBJ_TEXT,time[35],mp,time[35],mp,Black); } // *** Draw lines *** ObjectDelete("MP"); ObjectCreate("MP", OBJ_HLINE,0,Time[25],MP); ObjectSetText("MP","MP Range ",8,"Arial",White); ObjectSet("MP",OBJPROP_COLOR,Blue); ObjectSet("MP",OBJPROP_STYLE,STYLE_DOT); //MoveObject("MP",OBJ_HLINE,time[25],mp,Time[25],mp,Blue,1,STYLE_DOT); //SetObjectText("MP_txt","MP Range ","Arial",8,Black); //MoveObject("MP_txt",OBJ_TEXT,time[25],mp,time[25],mp,Black); ObjectDelete("ER_Hi"); ObjectCreate("ER_Hi", OBJ_HLINE,0,Time[25],er_hi); ObjectSetText("ER_Hi","Below Here BUYZONE ->MP ",8,"Arial",White); ObjectSet("ER_Hi",OBJPROP_COLOR,Green); ObjectSet("ER_Hi",OBJPROP_STYLE,STYLE_DASH); //MoveObject("ER_Hi",OBJ_HLINE,time[25],er_hi,Time[25],er_hi,Green,1,STYLE_DASH); //SetObjectText("ER_Hi_txt","Below Here BUYZONE ->MP ","Arial",8,Black); //MoveObject("ER_Hi_txt",OBJ_TEXT,time[25],er_hi,time[25],er_hi,Black); ObjectDelete("ER_Lo"); ObjectCreate("ER_Lo", OBJ_HLINE,0,Time[25],er_lo); ObjectSetText("ER_Lo","Above Here SELLZONE ->MP ",8,"Arial",White); ObjectSet("ER_Lo",OBJPROP_COLOR,Red); ObjectSet("ER_Lo",OBJPROP_STYLE,STYLE_DASH); //MoveObject("ER_Lo",OBJ_HLINE,time[25],er_lo,Time[25],er_lo,red,1,STYLE_DASH); //SetObjectText("ER_Lo_txt","Above Here SELLZONE ->MP ","Arial",8,Black); //MoveObject("ER_Lo_txt",OBJ_TEXT,time[25],er_lo,time[25],er_lo,Black); ObjectDelete("Hi_Pass"); ObjectCreate("Hi_Pass", OBJ_HLINE,0,Time[25],hi_pass); ObjectSetText("Hi_Pass","HiPASS ",8,"Arial",White); ObjectSet("Hi_Pass",OBJPROP_COLOR,Green); ObjectSet("Hi_Pass",OBJPROP_STYLE,STYLE_DOT); //MoveObject("Hi_Pass",OBJ_HLINE,time[25],hi_pass,time[25],hi_pass,Green,1,STYLE_DOT); //SetObjectText("Hi_Pass_txt","HiPASS ","Arial",8,Black); //MoveObject("Hi_Pass_txt",OBJ_TEXT,time[25],hi_Pass,time[25],hi_pass,Black); ObjectDelete("Lo_Pass"); ObjectCreate("Lo_Pass", OBJ_HLINE,0,Time[25],lo_pass); ObjectSetText("Lo_Pass","LoPASS ",8,"Arial",White); ObjectSet("Lo_Pass",OBJPROP_COLOR,Red); ObjectSet("Lo_Pass",OBJPROP_STYLE,STYLE_DOT); //MoveObject("Lo_Pass",OBJ_HLINE,time[25],lo_pass,Time[25],lo_pass,red,1,STYLE_DOT); //SetObjectText("Lo_Pass_txt","LoPASS ","Arial",8,Black); //MoveObject("Lo_Pass_txt",OBJ_TEXT,time[25],lo_pass,time[25],lo_pass,Black); ObjectDelete("Pre_Hi"); ObjectCreate("Pre_Hi", OBJ_HLINE,0,Time[25],pre_hi); ObjectSetText("Pre_Hi","PreHI ",8,"Arial",White); ObjectSet("Pre_Hi",OBJPROP_COLOR,Blue); ObjectSet("Pre_Hi",OBJPROP_STYLE,STYLE_DASH); //MoveObject("Pre_Hi",OBJ_HLINE,time[25],pre_hi,Time[25],pre_hi,Blue,1,STYLE_DASH); //SetObjectText("Pre_Hi_txt","PreHI ","Arial",8,Black); //MoveObject("Pre_Hi_txt",OBJ_TEXT,time[25],pre_hi,time[25],pre_hi,Black); ObjectDelete("Pre_Lo"); ObjectCreate("Pre_Lo", OBJ_HLINE,0,Time[25],pre_lo); ObjectSetText("Pre_Lo","PreLO ",8,"Arial",White); ObjectSet("Pre_Lo",OBJPROP_COLOR,Blue); ObjectSet("Pre_Lo",OBJPROP_STYLE,STYLE_DASH); //MoveObject("Pre_Lo",OBJ_HLINE,time[25],pre_lo,Time[25],pre_lo,Blue,1,STYLE_DASH); //SetObjectText("Pre_Lo_txt","PreLO ","Arial",8,Black); //MoveObject("Pre_Lo_txt",OBJ_TEXT,time[25],pre_lo,time[25],pre_lo,Black); if((Ask > MP) && (Ask < er_hi)) { Comment("Entry Price In BUYZONE"); } else { if((Bid < MP) && (Bid > er_lo)) { Comment("Entry Price In SELLZONE"); } } OpenTrades=0; for(Cnt=0; Cnt<OrdersTotal(); Cnt++) { if (!OrderSelect(Cnt,SELECT_BY_POS,MODE_TRADES)) continue; if(OrderSymbol()==Symbol()) { OpenTrades++; if (OrderType()==OP_SELL || OrderType()==OP_BUY) FilledOrders++; } } // We calculate the endHour based on the TimeZoneofData value Cnt=0; i=TimeZoneOfData; while(Cnt<=EndHour) { if (i>23) i=0; myEndHour=i; i++; Cnt++; } // Friday end of day offset //cnt=0; //i=TimeZoneofData; //While (cnt<=FridayEndHour) //{ // if (i>23) then i=0; // myFridayEndHour=i; // i++; // cnt++; //}; myFridayEndHour=FridayEndHour; //---- if((Hour()==myEndHour && Minute()>=EndMinute) || (DayOfWeek()==6 && Hour()==myFridayEndHour && Minute()>=EndMinute)) { //cnt=0;While cnt<=10000 { cnt++; }; for(Cnt=OrdersTotal()-1; Cnt>=0; Cnt--) { if (!OrderSelect(Cnt,SELECT_BY_POS,MODE_TRADES)) continue; if(OrderSymbol()==Symbol()){ mode=OrderType(); Trades=2; Type="NONE"; Reverse=False; tr=0; while(tr<5 && !IsTradeAllowed()) { tr++; Sleep(5000); } if (mode==OP_BUYSTOP) bres=OrderDelete(OrderTicket()); if (mode==OP_SELLSTOP) bres=OrderDelete(OrderTicket()); if (mode==OP_BUYLIMIT) bres=OrderDelete(OrderTicket()); if (mode==OP_SELLLIMIT) bres=OrderDelete(OrderTicket()); if (mode==OP_BUY) bres=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),slippage,Blue); //CloseOrder(ord(cnt,VAL_TICKET),ord(cnt,VAL_LOTS),bid,Slippage,Blue); if (mode==OP_SELL) bres=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),slippage,Blue); //CloseOrder(ord(cnt,VAL_TICKET),ord(cnt,VAL_LOTS),ask,Slippage,red); if (!bres) Print("Error closing or deleting order : ",ErrorDescription(GetLastError())); } } } // We get the StartHour offset Cnt=0; i=TimeZoneOfData; while(Cnt<=StartHour) { if (i>23) i=0; myStartHour=i; i++; Cnt++; } if (TradeFriday ==1 || DayOfWeek()!=5) { if (Hour()==myStartHour && Minute()>=StartMinute) { if (OpenTrades<1 && erange2 > 40) { if((Close[1] > MP) && (Close[1] < hi_pass)) { Trades=1; Type="NONE"; Reverse=True; tr=0; while(tr<5 && !IsTradeAllowed()) { tr++; Sleep(5000); } res=OrderSend(Symbol(),OP_SELLSTOP,lotsi,MP,slippage,MP+StopLoss*Point,MP-TakeProfit*Point,"N10",MAGICNUM,0,Red); if (res<=0) Print("Error opening order : ",ErrorDescription(GetLastError())); //SetOrder(OP_SELLSTOP,Lotsi,MP,Slippage,MP+StopLoss*Point,MP-TakeProfit*Point,RED); //return; } if((Close[1] > lo_pass) && (Close[1] < MP)) { Trades=1; Type="NONE"; Reverse=True; tr=0; while(tr<5 && !IsTradeAllowed()) { tr++; Sleep(5000); } res=OrderSend(Symbol(),OP_BUYSTOP,lotsi,MP,slippage,MP-StopLoss*Point,MP+TakeProfit*Point,"N10",MAGICNUM,0,Blue); if (res<=0) Print("Error opening order : ",ErrorDescription(GetLastError())); //SetOrder(OP_BUYSTOP,Lotsi,MP,Slippage,MP-StopLoss*Point,MP+TakeProfit*Point,BLUE); //return; } return; } } } // if we only have one Stop order we place the another one to always have ready both sides if (OpenTrades==1 && Trades>=1) { for(Cnt=OrdersTotal()-1; Cnt>=0; Cnt--) { if (!OrderSelect(Cnt,SELECT_BY_POS,MODE_TRADES)) continue; if(OrderSymbol()==Symbol()) { if (OrderType()==OP_SELLSTOP) { if((Close[1] > MP) && (Close[1] < hi_pass)) { Trades=1; Type="NONE"; Reverse=True; tr=0; while(tr<5 && !IsTradeAllowed()) { tr++; Sleep(5000); } res=OrderSend(Symbol(),OP_BUYSTOP,lotsi,hi_pass,slippage,hi_pass-StopLoss*Point,hi_pass+TakeProfit*Point,"N10",MAGICNUM,0,Blue); if (res<=0) Print("Error opening order : ",ErrorDescription(GetLastError())); //SetOrder(OP_BUYSTOP,Lotsi,HI_PASS,Slippage,HI_PASS-StopLoss*Point,HI_PASS+TakeProfit*Point,blue); return; } } if (OrderType()==OP_BUYSTOP) { if((Close[1] > lo_pass) && (Close[1] < MP)) { Trades=1; Type="NONE"; Reverse=True; tr=0; while(tr<5 && !IsTradeAllowed()) { tr++; Sleep(5000); } res=OrderSend(Symbol(),OP_SELLSTOP,lotsi,lo_pass,slippage,lo_pass+StopLoss*Point,lo_pass-TakeProfit*Point,"N10",MAGICNUM,0,Red); if (res<=0) Print("Error opening order : ",ErrorDescription(GetLastError())); //SetOrder(OP_SELLSTOP,Lotsi,LO_PASS,Slippage,LO_PASS+StopLoss*Point,LO_PASS-TakeProfit*Point,Red); return; } } } } } if (DontReverse==1) Reverse=False; // if one order was closed we reverse (only once in a day) if(OpenTrades<1 && Trades==1 && Reverse) { if (Type=="BUY") { Trades=0; Type="NONE"; Reverse=False; tr=0; while(tr<5 && !IsTradeAllowed()) { tr++; Sleep(5000); } res=OrderSend(Symbol(),OP_BUY,lotsi,Ask,slippage,Ask-StopLoss*Point,Ask+TakeProfit*Point,"N10",MAGICNUM,0,Blue); if (res<=0) Print("Error opening order : ",ErrorDescription(GetLastError())); return; //SetOrder(OP_BUY,Lotsi,Ask,Slippage,Ask-StopLoss*Point,Ask+TakeProfit*Point,Blue); } if (Type=="SELL") { Trades=0; Type="NONE"; Reverse=False; tr=0; while(tr<5 && !IsTradeAllowed()) { tr++; Sleep(5000); } res=OrderSend(Symbol(),OP_SELL,lotsi,Bid,slippage,Bid+StopLoss*Point,Bid-TakeProfit*Point,"N10",MAGICNUM,0,Red); if (res<=0) Print("Error opening order : ",ErrorDescription(GetLastError())); return; //SetOrder(OP_SELL,Lotsi,Bid,Slippage,Bid+StopLoss*Point,Bid-TakeProfit*Point,Red); } } // if we have opened positions we take care of them for(Cnt=OrdersTotal()-1; Cnt>=0; Cnt--) { if (!OrderSelect(Cnt,SELECT_BY_POS,MODE_TRADES)) continue; if(OrderSymbol()==Symbol()) { if (OrderType()==OP_BUY) { for(i=OrdersTotal()-1; i>=0; i--) { if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue; if(OrderSymbol()==Symbol()) { if (OrderType()==OP_SELLSTOP || OrderType()==OP_BUYSTOP) { Trades=1; Type="SELL"; Reverse=True; tr=0; while(tr<5 && !IsTradeAllowed()) { tr++; Sleep(5000); } bres=OrderDelete(OrderTicket()); if (!bres) Print("Error deleting order : ",ErrorDescription(GetLastError())); //return; } } } if (!OrderSelect(Cnt,SELECT_BY_POS,MODE_TRADES)) continue; //We secure SecureProfit (10) pips after TrailSecureProfit (16) pips if(OrderStopLoss()<=OrderOpenPrice()+SecureProfit*Point && Bid-OrderOpenPrice()>=TrailSecureProfit*Point) { tr=0; while(tr<5 && !IsTradeAllowed()) { tr++; Sleep(5000); } OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+SecureProfit*Point,0,0,DeepSkyBlue); //ModifyOrder(Ord(cnt,VAL_TICKET),Ord(cnt,VAL_OPENPRICE),((Ord(cnt,VAL_OPENPRICE))+SecureProfit*Point),0,DeepSkyBlue); Trades=0; Type="NONE"; Reverse=False; tmp=OrderOpenPrice()+SecureProfit*Point; Print("BUY Stoploss trailed to Openprice+SecureProfit=",tmp); //Exit; } // Trailing stop after profit secured if (TrailingStop>0) { if(OrderStopLoss()>=OrderOpenPrice()+SecureProfit*Point && OrderStopLoss()<Bid-TrailingStop*Point) { tr=0; while(tr<5 && !IsTradeAllowed()) { tr++; Sleep(5000); } OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*Point,0,0,Yellow); //ModifyOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_OPENPRICE),Bid-Point*(SecureProfit+TrailingStop),0,Yellow); Trades=0; Type="NONE"; Reverse=False; //Exit; } } } if (OrderType()==OP_SELL) { for(i=OrdersTotal()-1; i>=0; i--) { if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue; if(OrderSymbol()==Symbol()){ if (OrderType()==OP_SELLSTOP || OrderType()==OP_BUYSTOP) { Trades=1; Type="BUY"; Reverse=True; tr=0; while(tr<5 && !IsTradeAllowed()) { tr++; Sleep(5000); } bres=OrderDelete(OrderTicket()); if (!bres) Print("Error deleting order : ",ErrorDescription(GetLastError())); return; } } } if (!OrderSelect(Cnt,SELECT_BY_POS,MODE_TRADES)) continue; //We secure SecureProfit (10) pips after TrailSecureProfit (16) pips if(OrderStopLoss()>=OrderOpenPrice()-SecureProfit*Point && OrderOpenPrice()-Ask>=TrailSecureProfit*Point) { tr=0; while(tr<5 && !IsTradeAllowed()) { tr++; Sleep(5000); } OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-SecureProfit*Point,0,0,DeepSkyBlue); //ModifyOrder(Ord(cnt,VAL_TICKET),Ord(cnt,VAL_OPENPRICE),((Ord(cnt,VAL_OPENPRICE))-SecureProfit*Point),0,DeepSkyBlue); Trades=0; Type="NONE"; Reverse=False; tmp=OrderOpenPrice()-SecureProfit*Point; Print("SELL Stoploss trailed to Openprice-SecureProfit=",tmp); //Exit; } if (TrailingStop>0) { if(OrderStopLoss()<=OrderOpenPrice()-SecureProfit*Point && OrderStopLoss()>Ask+TrailingStop*Point){ tr=0; while(tr<5 && !IsTradeAllowed()) { tr++; Sleep(5000); } OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*Point,0,0,Purple); //ModifyOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_OPENPRICE),Ask+Point*(TrailingStop+SecureProfit),0,Purple); Trades=0; Type="NONE"; Reverse=False; //Exit; } } } } } //Alert(StrToTime("2005.11.30")); return; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double LotsRisk(int StopLoss) { double lot=Lots; //---- select lot size if (!FixedLot) lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk*0.001/StopLoss,1); else lot=Lots; //---- return lot size if(lot<MinLot) lot=MinLot; if(lot>MaxLot) lot=MaxLot; return(lot); } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Series array that contains open time of each bar
Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar
Series array that contains close prices for 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 automatically opens orders when conditions are reached
It can change open orders parameters, due to possible stepping strategy
Other Features: