//+------------------------------------------------------------------+ //| PivotStrategy v2.mq4 | //| Алексей Романов | //| seolink@list.ru | //+------------------------------------------------------------------+ #property copyright "Алексей Романов" #property link "seolink@list.ru" extern string s1 = "Настройки советника"; extern int Magic = 13022011; extern double Lot = 0.0; extern double Klot = 2.0; extern double LotProcentClose = 50.0; extern double Risk = 1.0; extern int Slip = 3; extern string s2 = "Фильтр Moving Average"; extern int ma_period = 4; extern int ma_method = MODE_SMA; extern int ma_price = PRICE_CLOSE; extern string s3 = "Фильтр MACD BUY"; extern int macd1_fast_period = 8; extern int macd1_slow_period = 17; extern string s4 = "Фильтр MACD SELL"; extern int macd2_fast_period = 12; extern int macd2_slow_period = 26; extern string s5 = "Фильтр Pivot"; extern int FiltrPivot = 25; double PivotD1; double PivotD2; double MA; int flet; int Signal = -1; double R1; double R2; double S1; double S2; bool flagNewSeries=true; bool flagProcent = false; bool flagModify = false; datetime LastBar; double OpenPrice; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- Signal=GetSignal(); Comment("Флет = ",flet,"\nСигнал = ",Signal,"\nПивот №1 = ",PivotD1,"\nПивот №2 = ",PivotD2,"\nR1 = ",R1,"\nR2 = ",R2,"\nS1 = ",S1,"\nS2 = ",S2); datetime NewBar = iTime(Symbol(),PERIOD_D1,0); if(NewBar!=LastBar) { ClosePosition(); LastBar=NewBar; flagNewSeries=true; } if(flagNewSeries)OpenPosition(Signal); if(!flagNewSeries) { if(flagProcent)ClosePositionProcent(); if(flagModify)ModifyOrder(); } //---- return(0); } //+------------------------------------------------------------------+ int GetSignal() { double LastHigh = iHigh(Symbol(),PERIOD_D1,1); double LastLow = iLow(Symbol(),PERIOD_D1,1); double LastClose = iClose(Symbol(),PERIOD_D1,1); double LastHigh2 = iHigh(Symbol(),PERIOD_D1,2); double LastLow2 = iLow(Symbol(),PERIOD_D1,2); double LastClose2 = iClose(Symbol(),PERIOD_D1,2); PivotD1 = (LastHigh+LastLow+LastClose)/3.0; PivotD2 = (LastHigh2+LastLow2+LastClose2)/3.0; R1 = (2.0*PivotD1)-LastLow; R2 = PivotD1+(LastHigh - LastLow); S1 = (2.0*PivotD1)-LastHigh; S2 = PivotD1-(LastHigh - LastLow); MA = iMA(Symbol(),0,ma_period,0,ma_method,ma_price,1); double MACD1 = iMACD(Symbol(),0,macd1_fast_period,macd1_slow_period,9,PRICE_CLOSE,MODE_MAIN,0); double MACD2 = iMACD(Symbol(),0,macd1_fast_period,macd1_slow_period,9,PRICE_CLOSE,MODE_MAIN,1); double MACD3 = iMACD(Symbol(),0,macd2_fast_period,macd2_slow_period,9,PRICE_CLOSE,MODE_MAIN,0); double MACD4 = iMACD(Symbol(),0,macd2_fast_period,macd2_slow_period,9,PRICE_CLOSE,MODE_MAIN,1); flet = MathAbs((PivotD1-PivotD2)/Point); if(flet>=FiltrPivot&&Close[0]>PivotD1&&MA>PivotD1&&MACD1>MACD2)return(OP_BUY); if(flet>=FiltrPivot&&Close[0]((MarketInfo(Symbol(),MODE_STOPLEVEL))*Point))&&((tp-price)>((MarketInfo(Symbol(),MODE_STOPLEVEL))*Point))) t=OrderSend(Symbol(),type,lot,price,Slip,sl,tp,NULL,Magic); } if(type==OP_SELL) { RefreshRates(); price=NormalizeDouble(Bid,Digits); sl=NormalizeDouble(R1,Digits); tp=NormalizeDouble(S2,Digits); if(((sl-price)>((MarketInfo(Symbol(),MODE_STOPLEVEL))*Point))&&((price-tp)>((MarketInfo(Symbol(),MODE_STOPLEVEL))*Point))) t=OrderSend(Symbol(),type,lot,price,Slip,sl,tp,NULL,Magic); } //t=OrderSend(Symbol(),type,lot,price,Slip,sl,tp,NULL,Magic); if(t<0)ErrorBlock(GetLastError()); else {flagNewSeries=false;flagProcent=true;} } void ClosePosition() { int total=OrdersTotal(); bool res; for(int i=total-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY) { RefreshRates(); res=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip); if(!res)ErrorBlock(GetLastError()); } if(OrderType()==OP_SELL) { RefreshRates(); res=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip); if(!res)ErrorBlock(GetLastError()); } } } } } void ClosePositionProcent() { double lots; int total=OrdersTotal(); bool res; for(int i=total-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { OpenPrice=OrderOpenPrice(); if(OrderType()==OP_BUY) { if(Bid>=R1) { lots = NormalizeDouble((OrderLots()/100.0)*LotProcentClose,Okr()); RefreshRates(); res=OrderClose(OrderTicket(),lots,NormalizeDouble(Bid,Digits),Slip); if(!res)ErrorBlock(GetLastError()); else {flagProcent=false;flagModify=true;} } } if(OrderType()==OP_SELL) { if(Ask<=S1) { lots = NormalizeDouble((OrderLots()/100.0)*LotProcentClose,Okr()); RefreshRates(); res=OrderClose(OrderTicket(),lots,NormalizeDouble(Ask,Digits),Slip); if(!res)ErrorBlock(GetLastError()); else {flagProcent=false;flagModify=true;} } } } } } } void ModifyOrder() { 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((OpenPrice!=OrderStopLoss())&&((Bid-OpenPrice)>((MarketInfo(Symbol(),MODE_STOPLEVEL))*Point))) { res = OrderModify(OrderTicket(),NormalizeDouble(OrderOpenPrice(),Digits),NormalizeDouble(OpenPrice,Digits),NormalizeDouble(OrderTakeProfit(),Digits),0); if(!res)ErrorBlock(GetLastError()); else {flagModify=false;} } } if(OrderType()==OP_SELL) { if((OpenPrice!=OrderStopLoss())&&((OpenPrice-Ask)>((MarketInfo(Symbol(),MODE_STOPLEVEL))*Point))) { res = OrderModify(OrderTicket(),NormalizeDouble(OrderOpenPrice(),Digits),NormalizeDouble(OpenPrice,Digits),NormalizeDouble(OrderTakeProfit(),Digits),0); if(!res)ErrorBlock(GetLastError()); else {flagModify=false;} } } } } } } double LotPercent(double risk) { double vol=0.0; double MinLot = MarketInfo(Symbol(),MODE_MINLOT); double MaxLot = MarketInfo(Symbol(),MODE_MAXLOT); if(Lot==0.0)vol=(AccountFreeMargin()*risk)/(MarketInfo(Symbol(),MODE_MARGINREQUIRED)*100.0); else vol=Lot; if(volMaxLot)vol=MaxLot; return(vol); } 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); } 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);} } }