//+------------------------------------------------------------------+ //| RNN_MT4.mq4 | //| Copyright © 2012, Yury V. Reshetov | //| http://www.mql5.com/ru/articles/366 | //+------------------------------------------------------------------+ #property copyright "Copyright © 2012, Yury V. Reshetov" #property link "http://www.mql5.com/ru/articles/366" //---- input parameters extern int x0 = 50; // Настройка от 0 до 100 с шагом 1 extern int x1 = 50; // Настройка от 0 до 100 с шагом 1 extern int x2 = 50; // Настройка от 0 до 100 с шагом 1 extern int x3 = 50; // Настройка от 0 до 100 с шагом 1 extern int x4 = 50; // Настройка от 0 до 100 с шагом 1 extern int x5 = 50; // Настройка от 0 до 100 с шагом 1 extern int x6 = 50; // Настройка от 0 до 100 с шагом 1 extern int x7 = 50; // Настройка от 0 до 100 с шагом 1 extern double sl = 500.0; // Уроверь стоплосса и тейкпрофита в пунктах extern double lots = 1.0; extern int mn = 888; // Магический номер static int prevtime = 0; // Время открытия последнего бара int init() { prevtime = Time[0]; return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { // Проверка на вновь сформировавшийся бар if (Time[0] == prevtime) { return(0); } prevtime = Time[0]; // Проверка на разрешение торговли if(! IsTradeAllowed()) { Print("Trades not allowed"); again(); return(0); } // Проверка открытых позиций // Количество открытых поз int total = OrdersTotal(); // Перебираем открытые позиции for(int i = total - 1; i >= 0; i--) { // Выделяем открытую позицию OrderSelect(i, SELECT_BY_POS, MODE_TRADES); // Проверяем на соответствие символу инструмента и магическому номеру if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == mn)) { // Есть открытая позиция, выходим return(0); } } // Вычисляем торговый сигнал double sp = tradesSingal(); double stoploss = 0.0; double takeprofit = 0.0; // Запрашиваем свежую рыночную информацию RefreshRates(); string s = ""; int ticket = -1; if (sp < 0.0) { stoploss = Bid - sl * Point; takeprofit = Bid + sl * Point; ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, 1, stoploss, takeprofit, WindowExpertName(), mn, 0, Blue); if (ticket < 0) { Print("OrderSend failed with error #", GetLastError()); again(); } else { s = "Open " + Symbol() + " #" + DoubleToStr(ticket, 0) + " Buy , Price:" + Ask + ", " + DoubleToStr(lots, 2) + " lots, SL: " + DoubleToStr(stoploss, 5) + ", TP: " + DoubleToStr(takeprofit, 5); SendMail("Open Buy position of " + Symbol(), s); } } else { stoploss = Ask + sl * Point; takeprofit = Ask - sl * Point; ticket = OrderSend(Symbol(), OP_SELL, lots, Bid, 1, stoploss, takeprofit, WindowExpertName(), mn, 0, Red); if (ticket < 0) { Print("OrderSend failed with error #", GetLastError()); again(); } else { s = "Open " + Symbol() + " #" + DoubleToStr(ticket, 0) + " Sell , Price:" + Bid + ", " + DoubleToStr(lots, 2) + " lots, SL: " + DoubleToStr(stoploss, 5) + ", TP: " + DoubleToStr(takeprofit, 5); SendMail("Open Sell position of " + Symbol(), s); } } //-- Exit -- return(0); } // Преобразует вероятность в торговый сигнал double tradesSingal() { // Считываем показания индикаторов double a1 = input(9, 0); double a2 = input(9, 1); double a3 = input(9, 2); // Вычисляем вероятность торгового сигнала для короткой позиции double result = getProbability(a1, a2, a3); string s = Symbol() + ", Probability for Short (Sell) position: " + DoubleToStr(result, 4); if (result > 0.5) { Print(s); } else { double r = 1.0 - result; Print(s); s = Symbol() + ", Probability for Long (Buy) position: " + DoubleToStr(r, 4); } SendMail(s, s); // Линейный сигмоид, переводит значения от 0 до 1 в значения от -1 до +1 result = result * 2.0 - 1.0; Print("Result = ", result); return (result); } // Повторный вызов функции start() на первом тике после 30 секундной задержки void again() { prevtime = Time[1]; Sleep(30000); } // Вычисления вероятности торгового сигнала для короткой позиции // p1, p2, p3 - сигналы индикаторов или осцилляторов ТА в диапазоне от 0 до 1 double getProbability(double p1, double p2, double p3) { double y0 = x0; double y1 = x1; double y2 = x2; double y3 = x3; double y4 = x4; double y5 = x5; double y6 = x6; double y7 = x7; double pn1 = 1.0 - p1; double pn2 = 1.0 - p2; double pn3 = 1.0 - p3; // Вычисление вероятности в процентах double probability = pn1 * (pn2 * (pn3 * y0 + p3 * y1) + p2 * (pn3 * y2 + p3 * y3)) + p1 * (pn2 * (pn3 * y4 + p3 * y5) + p2 * (pn3 * y6 + p3 * y7)); // Переводим проценты в вероятности probability = probability / 100.0; return (probability); } // Показания индикаторов, должны быть в диапазоне от 0 до 1 // p - период индикатора // shift - смещение вглубь истории в периодах индикатора double input(int p, int shift) { return (iRSI(Symbol(), 0, p, PRICE_OPEN, p * shift) / 100.0); }