//+---------------------------------------------------------------------+ //| BuyOnDipsSellOnRallies.mq4 | //| Copyright © 2009,My Millionaire Goal| //| http://www.mymillionairegoal.com | //+---------------------------------------------------------------------+ #property copyright "Copyright © 2009, My Millionaire Goal" #property link "http://www.mymillionairegoal.com" extern double TradeSizePercent = 2.5; extern double TakeProfitMultiple = 2; extern double GradientLower = 8; extern double GradientInterval = 5; extern bool AdjustTradeSizePercent = true; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int handle; int init() { //---- if (IsTesting()) { handle=FileOpen("BuyOnDipsSellOnRallies.csv", FILE_CSV|FILE_WRITE, ','); FileWrite(handle, "Order #", "Profit", "Gradient"); } //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ double zigZagArray[2]; double maArray[2]; double dateArray[2]; datetime Time0 = 0; double lots; double stopLoss; double takeProfit; double gradient; double TrailingStop; bool OrderOpened; int ticket; int start() { //---- int total; //if (Time0 != Time[0] && TimeHour(TimeCurrent()) >= 12 && TimeHour(TimeCurrent()) <= 20 && TimeDayOfWeek(TimeCurrent()) > 0 && TimeDayOfWeek(TimeCurrent()) < 6) if (Time0 != Time[0]) { total = OrdersTotal(); string zigzag; zigzag = NewZigZag(); if (zigzag!= "Not Found") { FindPreviousHighOrLow(zigzag); if (total > 0) OrderSelect(0, SELECT_BY_POS, MODE_TRADES); if (total == 0 && zigzag == "High" && CompareZigZag(zigzag) && CompareMA(zigzag)) { stopLoss = (zigZagArray[1] - Bid)/Point; TrailingStop = stopLoss; takeProfit = TakeProfitMultiple*stopLoss; lots = LotsOptimized(stopLoss); ticket = OrderSend(Symbol(), OP_SELL, lots, Bid, 3, Bid + stopLoss*Point, Bid - takeProfit*Point, "First", 1729, 0, Red); OrderOpened = true; CalGradient(zigzag); } else if (total == 0 && zigzag == "Low" && CompareZigZag(zigzag) && CompareMA(zigzag)) { stopLoss = (Ask - zigZagArray[1])/Point; TrailingStop = stopLoss; takeProfit = TakeProfitMultiple*stopLoss; lots = LotsOptimized(stopLoss); ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, 3, Ask - stopLoss*Point, Ask + takeProfit*Point, "First", 1729, 0, Green); OrderOpened = true; CalGradient(zigzag); } } } Time0 = Time[0]; //---- DynamicTrailingStop(); if (OrderOpened && OrdersTotal() == 0) { Print("Order Closed, Handle = ", handle); OrderSelect(ticket, SELECT_BY_TICKET); FileWrite(handle, OrderTicket(), OrderProfit(), gradient); OrderOpened = false; if (AdjustTradeSizePercent) { if (OrderProfit() < 0) TradeSizePercent = MathMax(TradeSizePercent - 0.5, 1); else if (OrderProfit() > 0) TradeSizePercent = MathMin(TradeSizePercent + 0.5, TradeSizePercent); } } return(0); } //+------------------------------------------------------------------+ string NewZigZag() { double zigZag = iCustom(NULL, 0, "zigzag", 0, 1); if(zigZag>0) { if (zigZag == High[1]) return ("High"); else if (zigZag == Low[1]) return ("Low"); } return ("Not Found"); } void FindPreviousHighOrLow(string highOrLow) { double zigZag, ma, datei; int i = 1; int n=0; while(n<2) { zigZag = iCustom(NULL, 0, "zigZag", 0, i); if(zigZag>0) { if (highOrLow == "High" && zigZag == High[i]) { zigZagArray[n] = zigZag; maArray[n] = iMA(NULL, 0, 50, 0, MODE_EMA, PRICE_CLOSE, i); dateArray[n] = i; n++; }else if (highOrLow == "Low" && zigZag == Low[i]) { zigZagArray[n] = zigZag; maArray[n] = iMA(NULL, 0, 50, 0, MODE_EMA, PRICE_CLOSE, i); dateArray[n] = i; n++; } } i++; } } bool CompareZigZag(string highOrLow) { if (highOrLow == "High") { if (zigZagArray[0] < zigZagArray[1]) return (true); }else if (highOrLow == "Low") { if (zigZagArray[1] < zigZagArray[0]) return (true); } return (false); } bool CompareMA(string highOrLow) { gradient = (((maArray[0] - maArray[1])/Point)/(dateArray[0] - dateArray[1])); if (highOrLow == "High") { if (gradient > GradientLower && gradient < GradientLower + GradientInterval) { return (true); } }else if (highOrLow == "Low") { if (gradient < -1*GradientLower && gradient > -1*GradientLower - GradientInterval) { return (true); } } return (false); } double LotsOptimized(int stopLoss) { double lot; lot=NormalizeDouble(((TradeSizePercent*0.01)*AccountFreeMargin())/(stopLoss),2); if (lot < 0.1) lot=0.1; return (lot); } void CalGradient(string highOrLow) { gradient = (((maArray[0] - maArray[1])/Point)/(dateArray[0] - dateArray[1])); } void DynamicTrailingStop() { int total, cnt; OrderSelect(0, SELECT_BY_POS, MODE_TRADES); if(OrderType() <= OP_SELL && OrderSymbol() == Symbol()) { if(OrderType() == OP_BUY) // long position is opened { if(TrailingStop > 0) { if(Bid - OrderOpenPrice() > Point*TrailingStop) { if(OrderStopLoss() < Bid - Point*TrailingStop) { OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point*TrailingStop, OrderTakeProfit(), 0, Green); return(0); } } } }else if (OrderType() == OP_SELL) // go to short { if(TrailingStop > 0) { if((OrderOpenPrice() - Ask) > (Point*TrailingStop)) { if(OrderStopLoss() > Ask + Point*TrailingStop) { OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point*TrailingStop, OrderTakeProfit(), 0, Red); return(0); } } } } } } void StaticTrailingStop() { int total, cnt; OrderSelect(0, SELECT_BY_POS, MODE_TRADES); if(OrderType() <= OP_SELL && OrderSymbol() == Symbol()) { if(OrderType() == OP_BUY) // long position is opened { if(TrailingStop > 0) { if(Bid - OrderOpenPrice() > Point*TrailingStop) { OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0, Green); return(0); } } }else if (OrderType() == OP_SELL) // go to short { if(TrailingStop > 0) { if((OrderOpenPrice() - Ask) > (Point*TrailingStop)) { OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0, Red); return(0); } } } } }