//+------------------------------------------------------------------+
//|                                            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 <macdlast && MathAbs(max_macdlast_buy)-MathAbs(macdlast) >=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;
}