//+------------------------------------------------------------------+ //| romanovseo v2.mq4 | //| Алекаей Романов | //| seolink@list.ru | //+------------------------------------------------------------------+ #property copyright "Алексей Романов" #property link "seolink@list.ru" extern string s1 = "Moving Average"; extern int ma_period1 = 150; extern int ma_period2 = 50; extern int ma_period3 = 4; extern int ma_method = MODE_SMA; extern string s2 = "RSI"; extern bool rsi_on_of = true; extern int rsi_period = 14; extern double rsi_level_up = 60.0; extern double rsi_level_dn = 40.0; extern string s3 = "ADX"; extern bool adx_on_of = true; extern int adx_period = 14; extern double adx_level = 20.0; extern string s4 = "MACD"; extern bool macd_on_of = true; extern bool macd_trend = true; extern int macd1_fast_ema_period = 8; extern int macd1_slow_ema_period = 17; extern int macd2_fast_ema_period = 12; extern int macd2_slow_ema_period = 26; extern double macd_level_up = 0.0025; extern double macd_level_dn = -0.0025; extern string s6 ="-==-"; extern int Magic = 23012011; extern double Lot = 0.0; extern int StopLoss = 500; extern int ZeroProfit = 200; extern int Spred = 3; extern double Risk = 2.0; extern int Slip = 30; extern string s7 = "Таймер"; extern bool Timer = false; // true - таймер включен, false - нет extern string OnTradePeriod = "08:00"; extern string EndTradePeriod = "22:00"; extern string s8 = "Настройки трейлинг стоп-лосса"; extern bool UseTrail = false; //Тrue - треилинг стоп-лосса включен, false - выключен extern int TrailStart = 300; //Величина треилинг-стопа в пунктах extern int Trail = 200; //Величина треилинг-стопа в пунктах //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- if(Total()==0&&TradeTimer()==true)OrderOpen(GetSignal()); else { Zero(); if(UseTrail)TrailingStop(); CloseOrder(); } //---- return(0); } //+------------------------------------------------------------------+ int GetSignal() { if(buy())return(OP_BUY); if(sel())return(OP_SELL); return(-1); } bool buy() { if(MA()!=OP_BUY) return(false); if(macd_on_of==true && MACD()!=OP_BUY)return(false); if(rsi_on_of==true && RSI()!=OP_BUY)return(false); if(adx_on_of==true && ADX()==false)return(false); return(true); } bool sel() { if(MA()!=OP_SELL) return(false); if(macd_on_of==true && MACD()!=OP_SELL)return(false); if(rsi_on_of==true && RSI()!=OP_SELL)return(false); if(adx_on_of==true && ADX()==false)return(false); return(true); } int MA() { double MA1 = iMA(Symbol(),0,ma_period1,0,ma_method,PRICE_CLOSE,0); double MA2 = iMA(Symbol(),0,ma_period2,0,ma_method,PRICE_CLOSE,0); double MA3 = iMA(Symbol(),0,ma_period3,0,ma_method,PRICE_CLOSE,0); if(Close[0]>MA1&&MA2>MA1&&MA3>MA2)return(OP_BUY); if(Close[0]macd_level_up&&MACD1>MACD2)return(OP_BUY); if(MACD3macd_level_up)return(OP_BUY); if(MACD3rsi_level_up)return(OP_BUY); if(RSIadx_level)return(true); return(false); } int Total() { int cmd; int total=OrdersTotal(); for(int i=0;i=stoplevel) {sl=NormalizeDouble(Bid -(SL*Point),Digits);Lots = LotPercent(SL);} if(SL=stoplevel) {sl=NormalizeDouble(Ask+(SL*Point),Digits);Lots = LotPercent(SL);} if(SL MaxLot)vol = MaxLot; return(NormalizeDouble(vol,Okr())); } int Okr() { double LotsStep=MarketInfo(Symbol(),MODE_LOTSTEP); if(LotsStep==0.01)return(2); if(LotsStep==0.1)return(1); if(LotsStep==1.0)return(0); return(0); } bool TradeTimer() { if(Timer==true) { datetime date=TimeCurrent(); datetime ty=TimeYear(date); datetime tm=TimeMonth(date); datetime td1=TimeDay(date); datetime td2; datetime d1 = StrToTime (ty+"."+tm+"."+td1+" "+OnTradePeriod); datetime d2 = StrToTime (ty+"."+tm+"."+td1+" "+EndTradePeriod); if(d1>d2 && date>=d1) { td2=TimeDay(date)+1; d1 = StrToTime (ty+"."+tm+"."+td1+" "+OnTradePeriod); d2 = StrToTime (ty+"."+tm+"."+td2+" "+EndTradePeriod); } else if(d1>d2 && date<=d2) { td2=TimeDay(date)-1; d1 = StrToTime (ty+"."+tm+"."+td2+" "+OnTradePeriod); d2 = StrToTime (ty+"."+tm+"."+td1+" "+EndTradePeriod); } if(date>=d1 && date<=d2)return(true); else return(false); } return(true); } void CloseOrder() { int digit; double price; bool res; double MA2 = iMA(Symbol(),0,ma_period2,0,ma_method,PRICE_CLOSE,0); double MA3 = iMA(Symbol(),0,ma_period3,0,ma_method,PRICE_CLOSE,0); double MACD1 = iMACD(Symbol(),0,macd1_fast_ema_period,macd1_slow_ema_period,9,PRICE_CLOSE,MODE_MAIN,0); double MACD3 = iMACD(Symbol(),0,macd2_fast_ema_period,macd2_slow_ema_period,9,PRICE_CLOSE,MODE_MAIN,0); int total=OrdersTotal(); for(int i=total-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY) { if(MA3MA2&&MACD3>macd_level_up) { digit=MarketInfo(OrderSymbol(),MODE_DIGITS); price=MarketInfo(OrderSymbol(),MODE_ASK); res=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(price,digit),Slip); if(!res)ErrorBlock(GetLastError()); } } } } } } void Zero() { bool res; int total=OrdersTotal(); for(int i=total-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY) { if(Bid-OrderOpenPrice()>Point*ZeroProfit&&OrderStopLoss()Point*ZeroProfit&&OrderStopLoss()>OrderOpenPrice()) { res = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask + ((ZeroProfit-Spred)*Point),Digits),OrderTakeProfit(),0); if(!res)ErrorBlock(GetLastError()); } } } } } } void TrailingStop() { bool res; int total=OrdersTotal(); for(int i=total-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY) { if(Bid-OrderOpenPrice()>Point*TrailStart) { if(Bid - OrderStopLoss() > Trail*Point) { res = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid - (Trail*Point),Digits),OrderTakeProfit(),0); if(!res)ErrorBlock(GetLastError()); } } } if(OrderType()==OP_SELL) { if(OrderOpenPrice()-Ask>Point*TrailStart) { if(OrderStopLoss() - Ask > Trail*Point) { res = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask + (Trail*Point),Digits),OrderTakeProfit(),0); if(!res)ErrorBlock(GetLastError()); } } } } } } } int ErrorBlock(int error) { switch(error) { case 0: return(0); case 1: {Print("Ошибка: 1 - попытка изменить уже установленные значения такими же значениями");return(2);} case 2: {Print("Ошибка: 2 - Общая ошибка. Прекратить все попытки торговых операций до выяснения обстоятельств");return(3);} case 3: {Print("Ошибка: 3 - В торговую функцию переданы неправильные параметры ");return(3);} case 4: {Print("Ошибка: 4 - Торговый сервер занят");return(1);} case 5: {Print("Ошибка: 5 - Старая версия клиентского терминала");return(3);} case 6: {Print("Ошибка: 6 - Нет связи с торговым сервером");return(2);} case 7: {Print("Ошибка: 7 - Недостаточно прав");return(3);} case 8: {Print("Ошибка: 8 - Слишком частые запросы");return(2);} case 9: {Print("Ошибка: 9 - Недопустимая операция нарушающая функционирование сервера");return(3);} case 64: {Print("Ошибка: 64 - Счет заблокирован. Необходимо прекратить все попытки торговых операций");return(3);} case 65: {Print("Ошибка: 65 - Неправильный номер счета. Необходимо прекратить все попытки торговых операций");return(3);} case 128: {Print("Ошибка: 128 - Истек срок ожидания совершения сделки");return(1);} case 129: {Print("Ошибка: 129 - Неправильная цена bid или ask, возможно, ненормализованная цена");return(1);} case 130: {Print("Ошибка: 130 - Слишком близкие стопы или неправильно рассчитанные или ненормализованные цены в стопах (или в цене открытия отложенного ордера)");return(1);} case 131: {Print("Ошибка: 131 - Неправильный объем, ошибка в грануляции объема");return(3);} case 132: {Print("Ошибка: 132 - Рынок закрыт");return(2);} case 133: {Print("Ошибка: 133 - Торговля запрещена");return(3);} case 134: {Print("Ошибка: 134 - Недостаточно денег для совершения операции");return(3);} case 135: {Print("Ошибка: 135 - Цена изменилась");return(1);} case 136: {Print("Ошибка: 136 - Нет цен");return(1);} case 137: {Print("Ошибка: 137 - Брокер занят");return(1);} case 138: {Print("Ошибка: 138 - Запрошенная цена устарела, либо перепутаны bid и ask");return(1);} case 139: {Print("Ошибка: 139 - Ордер заблокирован и уже обрабатывается");return(2);} case 140: {Print("Ошибка: 140 - Разрешена только покупка. Повторять операцию SELL нельзя");return(2);} case 141: {Print("Ошибка: 141 - Слишком много запросов");return(2);} case 142: {Print("Ошибка: 142 - Ордер поставлен в очередь");return(2);} case 143: {Print("Ошибка: 143 - Ордер принят дилером к исполнению");return(2);} case 144: {Print("Ошибка: 144 - Ордер аннулирован самим клиентом при ручном подтверждении сделки");return(2);} case 145: {Print("Ошибка: 145 - Модификация запрещена, так как ордер слишком близок к рынку и заблокирован из-за возможного скорого исполнения");return(2);} case 146: {Print("Ошибка: 146 - Подсистема торговли занята. Повторить попытку только после того, как функция IsTradeContextBusy вернет FALSE.");return(1);} case 147: {Print("Ошибка: 147 - Использование даты истечения ордера запрещено брокером");return(2);} case 148: {Print("Ошибка: 148 - Количество открытых и отложенных ордеров достигло предела, установленного брокером");return(2);} case 149: {Print("Ошибка: 149 - Попытка открыть противоположную позицию к уже существующей в случае, если хеджирование запрещено");return(2);} case 4000: return(0); case 4001: {Print("Ошибка: 4001 - Неправильный указатель функции");return(3);} case 4002: {Print("Ошибка: 4002 - Индекс массива - вне диапазона");return(3);} case 4003: {Print("Ошибка: 4003 - Нет памяти для стека функций");return(3);} case 4004: {Print("Ошибка: 4004 - Переполнение стека после рекурсивного вызова");return(3);} case 4005: {Print("Ошибка: 4005 - На стеке нет памяти для передачи параметров");return(3);} case 4006: {Print("Ошибка: 4006 - Нет памяти для строкового параметра");return(3);} case 4007: {Print("Ошибка: 4007 - Нет памяти для временной строки");return(3);} case 4008: {Print("Ошибка: 4008 - Неинициализированная строка");return(3);} case 4009: {Print("Ошибка: 4009 - Неинициализированная строка в массиве");return(3);} case 4010: {Print("Ошибка: 4010 - Нет памяти для строкового массива");return(3);} case 4011: {Print("Ошибка: 4011 - Слишком длинная строка");return(3);} case 4012: {Print("Ошибка: 4012 - Остаток от деления на ноль");return(3);} case 4013: {Print("Ошибка: 4013 - Деление на ноль");return(3);} case 4014: {Print("Ошибка: 4014 - Неизвестная команда");return(3);} case 4015: {Print("Ошибка: 4015 - Неправильный переход");return(3);} case 4016: {Print("Ошибка: 4016 - Неинициализированный массив");return(3);} case 4017: {Print("Ошибка: 4017 - Вызовы DLL не разрешены");return(3);} case 4018: {Print("Ошибка: 4018 - Невозможно загрузить библиотеку");return(3);} case 4019: {Print("Ошибка: 4019 - Невозможно вызвать функцию");return(3);} case 4020: {Print("Ошибка: 4020 - Вызовы внешних библиотечных функций не разрешены");return(3);} case 4021: {Print("Ошибка: 4021 - Недостаточно памяти для строки, возвращаемой из функции");return(3);} case 4022: {Print("Ошибка: 4022 - Система занята");return(3);} case 4050: {Print("Ошибка: 4050 - Неправильное количество параметров функции");return(3);} case 4051: {Print("Ошибка: 4051 - Недопустимое значение параметра функции");return(3);} case 4052: {Print("Ошибка: 4052 - Внутренняя ошибка строковой функции");return(3);} case 4053: {Print("Ошибка: 4053 - Ошибка массива");return(3);} case 4054: {Print("Ошибка: 4054 - Неправильное использование массива-таймсерии");return(3);} case 4055: {Print("Ошибка: 4055 - Ошибка пользовательского индикатора");return(3);} case 4056: {Print("Ошибка: 4056 - Массивы несовместимы");return(3);} case 4057: {Print("Ошибка: 4057 - Ошибка обработки глобальныех переменных");return(3);} case 4058: {Print("Ошибка: 4058 - Глобальная переменная не обнаружена");return(3);} case 4059: {Print("Ошибка: 4059 - Функция не разрешена в тестовом режиме");return(3);} case 4060: {Print("Ошибка: 4060 - Функция не разрешена");return(3);} case 4061: {Print("Ошибка: 4061 - Ошибка отправки почты");return(3);} case 4062: {Print("Ошибка: 4062 - Ожидается параметр типа string");return(3);} case 4063: {Print("Ошибка: 4063 - Ожидается параметр типа integer");return(3);} case 4064: {Print("Ошибка: 4064 - Ожидается параметр типа double");return(3);} case 4065: {Print("Ошибка: 4065 - В качестве параметра ожидается массив");return(3);} case 4066: {Print("Ошибка: 4066 - Запрошенные исторические данные в состоянии обновления");return(3);} case 4067: {Print("Ошибка: 4067 - Ошибка при выполнении торговой операции");return(3);} case 4099: {Print("Ошибка: 4099 - Конец файла");return(3);} case 4100: {Print("Ошибка: 4100 - Ошибка при работе с файлом");return(3);} case 4101: {Print("Ошибка: 4101 - Неправильное имя файла");return(3);} case 4102: {Print("Ошибка: 4102 - Слишком много открытых файлов");return(3);} case 4103: {Print("Ошибка: 4103 - Невозможно открыть файл");return(3);} case 4104: {Print("Ошибка: 4104 - Несовместимый режим доступа к файлу");return(3);} case 4105: {Print("Ошибка: 4105 - Ни один ордер не выбран");return(3);} case 4106: {Print("Ошибка: 4106 - Неизвестный символ");return(3);} case 4107: {Print("Ошибка: 4107 - Неправильный параметр цены для торговой функции");return(2);} case 4108: {Print("Ошибка: 4108 - Неверный номер тикета");return(2);} case 4109: {Print("Ошибка: 4109 - Торговля не разрешена. Необходимо включить опцию Разрешить советнику торговать в свойствах эксперта");return(3);} case 4110: {Print("Ошибка: 4110 - Длинные позиции не разрешены. Необходимо проверить свойства эксперта");return(2);} case 4111: {Print("Ошибка: 4111 - Короткие позиции не разрешены. Необходимо проверить свойства эксперта");return(2);} case 4200: {Print("Ошибка: 4200 - Объект уже существует");return(3);} case 4201: {Print("Ошибка: 4201 - Запрошено неизвестное свойство объекта");return(3);} case 4202: {Print("Ошибка: 4202 - Объект не существует");return(2);} case 4203: {Print("Ошибка: 4203 - Неизвестный тип объекта");return(3);} case 4204: {Print("Ошибка: 4204 - Нет имени объекта");return(3);} case 4205: {Print("Ошибка: 4205 - Ошибка координат объекта");return(3);} case 4206: {Print("Ошибка: 4206 - Не найдено указанное подокно");return(3);} case 4207: {Print("Ошибка: 4207 - Ошибка при работе с объектом");return(3);} default: {Print("Неизвестная ошибка: ",error);return(3);} } }