//+------------------------------------------------------------------+ //| MacdPatternTrader.mq4 | //| FORTRADER.RU | //| http://FORTRADER.RU | //+------------------------------------------------------------------+ /* Looking for an interpreter for the English version of the magazine on partnership. //добавлено ограничение на одну сделку в одном направлении //исправлена ошибка приводившая к не правильному открытию по сигналу //добавлен параметр maxbarABpoint задающий количество баров между точками для генерации сигнала на вход, всегда должен быть 1 или больше. Страница обсуждения советника, последние новости и обновления: http://fortrader.ru/services/ea/single?id=7 Download last EA version: http://fortrader.ru/services/ea/single?id=7 */ extern string s5 = "Настройки MA"; extern int perema1 = 7; extern int perema2 = 21; extern int persma3 = 98; extern int perema4 = 365; extern string s1 = "Параметры уровней"; extern double maxur45 = 0.0045; extern double minur45 = -0.0045; extern string s2 = "Настройки MACD"; extern int lowema = 5; extern int fastema = 13; extern string s3 = "Настройки ограничений"; extern int stop_signal_max_bars=100; extern int stop_signal_min_bars=0; extern double max_deviatoion_signal = 0.1000; extern double min_deviatoion_signal = 0.0000; extern string s4 = "Торговые парметры"; double Lots = 0.1; extern int MinimalTakeProfit = 800; int signal_buy,signal_sell,number_bar,number_bar_buy = 0;int nummodb, nummods; double max_macdlast,max_macdlast_buy; void start() { double min_pips_tp, new_tp; if (Digits == 5 || Digits == 3) { min_pips_tp = MinimalTakeProfit * 10; } int ret; //загружаем индикаторы double macdcurr = iMACD(NULL, 0, fastema, lowema, 1, PRICE_CLOSE, MODE_MAIN, 1); double macdlast = iMACD(NULL, 0, fastema, lowema, 1, PRICE_CLOSE, MODE_MAIN, 2); double macdlast3 = iMACD(NULL, 0, fastema, lowema, 1, PRICE_CLOSE, MODE_MAIN, 3); //sell signal if (macdlast > maxur45 && macdlast > macdcurr && macdlast > macdlast3 && signal_sell==0) { max_macdlast=macdlast; number_bar=Bars; signal_sell = 1; } if(signal_sell==1 && macdcurr > maxur45 && (max_macdlast>macdlast && max_macdlast-macdlast >=min_deviatoion_signal && max_macdlast-macdlast <=max_deviatoion_signal) && macdlast > macdcurr && macdlast > macdlast3 && ((Bars-number_bar ) < stop_signal_max_bars && (Bars-number_bar_buy ) > stop_signal_min_bars) ){ signal_sell=2; } if (signal_sell == 2) { if ((Bid - TakeProfit(0)) < min_pips_tp * Point) { new_tp = Bid - min_pips_tp * Point; } else { new_tp = TakeProfit(0); } ret = OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, StopLoss(0), TakeProfit(0), "FORTRADER.RU", 16385, 0, Red); signal_sell = 0; nummods = 0; } //отмена сигнала if(macdcurr < maxur45){ signal_sell=0; } //buy signal if (macdlast < minur45 && macdlast < macdcurr && macdlast < macdlast3 && signal_buy==0) { max_macdlast_buy=macdlast; number_bar_buy =Bars; signal_buy = 1; } if(signal_buy==1 && macdcurr < minur45 && (max_macdlast_buy =min_deviatoion_signal && MathAbs(max_macdlast_buy)-MathAbs(macdlast) <=max_deviatoion_signal) && macdlast < macdcurr && macdlast < macdlast3 && ((Bars-number_bar_buy ) < stop_signal_max_bars && (Bars-number_bar_buy ) > stop_signal_min_bars) ){ signal_buy=2; } if (signal_buy == 2) { if ((TakeProfit(1) - Ask) < min_pips_tp * Point) { new_tp = Ask + min_pips_tp * Point; } else { new_tp = TakeProfit(1); } ret = OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, StopLoss(1), new_tp, "FORTRADER.RU", 16385, 0, Red); signal_buy = 0; nummodb = 0; } //отмена сигнала if(macdcurr > minur45){ signal_buy=0; } //закрытие сделок double ema1 = iMA(NULL, 0, perema1, 0, MODE_EMA, PRICE_CLOSE, 1); double ema2 = iMA(NULL, 0, perema2, 0, MODE_EMA, PRICE_CLOSE, 1); double sma1 = iMA(NULL, 0, persma3, 0, MODE_SMA, PRICE_CLOSE, 1); double ema3 = iMA(NULL, 0, perema4, 0, MODE_EMA, PRICE_CLOSE, 1); for (int i = 0; i < OrdersTotal(); i++) { ret = OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if (OrderType() == OP_BUY && OrderProfit() > 5 && Close[1] > ema2 && nummodb == 0) { ret = OrderClose(OrderTicket(), NormalizeDouble(OrderLots() / 3, 2), Bid, 3, Violet); nummodb++; return; } if (OrderType() == OP_BUY && OrderProfit() > 5 && High[1] > (sma1 + ema3) / 2 && nummodb == 1) { ret = OrderClose(OrderTicket(), NormalizeDouble(OrderLots() / 2, 2), Bid, 3, Violet); nummodb++; return; } if (OrderType() == OP_SELL && OrderProfit() > 5 && Close[1] < ema2 && nummods == 0) { ret = OrderClose(OrderTicket(), NormalizeDouble(OrderLots() / 3, 2), Ask, 3, Violet); nummods++; return; } if (OrderType() == OP_SELL && OrderProfit() > 5 && Low[1] < (sma1 + ema3) / 2 && nummods == 1) { ret = OrderClose(OrderTicket(), NormalizeDouble(OrderLots() / 2, 2), Ask, 3, Violet); nummods++; return; } } } extern int stoplossbars = 7; extern int stoploss_deviation = 10; double StopLoss(int type) { if (Digits == 5 || Digits == 3) { int s_otstup = stoploss_deviation * 10; } double stoploss; if (type == 0) { stoploss = High[iHighest(NULL, 0, MODE_HIGH, stoplossbars, 1)] + s_otstup * Point; return (stoploss); } if (type == 1) { stoploss = Low[iLowest(NULL, 0, MODE_LOW, stoplossbars, 1)] - s_otstup * Point; return (stoploss); } return 0; } extern int takeprofitbars = 40; double TakeProfit(int type) { int x = 0, stop = 0; double takeprofit; if (type == 0) { while (stop == 0) { takeprofit = Low[iLowest(NULL, 0, MODE_LOW, takeprofitbars, x)]; if (takeprofit > Low[iLowest(NULL, 0, MODE_LOW, takeprofitbars, x + takeprofitbars)]) { takeprofit = Low[iLowest(NULL, 0, MODE_LOW, takeprofitbars, x + takeprofitbars)]; x = x + takeprofitbars; } else { stop = 1; return (takeprofit); } } } if (type == 1) { while (stop == 0) { takeprofit = High[iHighest(NULL, 0, MODE_HIGH, takeprofitbars, x)]; if (takeprofit < High[iHighest(NULL, 0, MODE_HIGH, takeprofitbars, x + takeprofitbars)]) { takeprofit = High[iHighest(NULL, 0, MODE_HIGH, takeprofitbars, x + takeprofitbars)]; x = x + takeprofitbars; } else { stop = 1; return (takeprofit); } } } return 0; }