//+------------------------------------------------------------------+ //| Urdala_Tester.mq4 | //| Сергей (urdala) Рашевский | //| http://urdala-forex.at.ua | //+------------------------------------------------------------------+ #property copyright "Сергей (urdala) Рашевский" #property link "http://urdala-forex.at.ua" extern bool UseLine = true; extern bool StartLine = false; extern bool OpenStep = true; extern string File = "Orders.csv"; extern int Slippage = 10; extern double CloseProfit = 0; extern double CloseProfitProc= 0; extern int Magic = 777; ///////////////////////////////////////////////////////////////////////// int D,i,i1,Ticket,TicketFind; string Text,Read,Com; double Lot,Price0,Price0New; double PriceOP,PriceTP,PriceSL; int Handle; string Data[10][1000]; bool Take; int init() { D=1; if (Digits==5 || Digits==3)D=10; return(0); } ///////////////////////////////////////////////////////////////////////// //*********************************************************************// ///////////////////////////////////////////////////////////////////////// int start() { int Orders; double ProfitAll; for (i=0; i0 && ProfitAll>CloseProfit) || (CloseProfit<0 && ProfitAll0 && ProfitAll>AccountBalance()/100.0*CloseProfitProc) || (CloseProfitProc<0 && ProfitAll0)CloseMarket();DelOtl(); Take=false; return(0); } Price0New=NormalizeDouble(ObjectGet("0",OBJPROP_PRICE1),Digits); if (Price0New!=Price0 && Price0!=0) { ObjectSet("0",OBJPROP_PRICE1,Price0); return(0); } Price0=Price0New; Text="Нулевая отметка = "+DoubleToStr(Price0,Digits); Text=Text+"\nОбщая прибыль = "+DoubleToStr(ProfitAll,2); if (NormalizeDouble(Bid,Digits)Price0-Slippage*Point)Take=true; if (StartLine && !Take && UseLine){Comment("Ждем касания нулевой отметки");return(0);} ///////////////////////////////////////////////////////////////////////// Handle=FileOpen(File,FILE_CSV|FILE_READ,";"); if (Handle<0){Comment("Не найден файл ",File);return(0);} int FileOrders; while (!IsStopped()) { Read=FileReadString(Handle); if (FileIsEnding(Handle))break; if (Read!="buy" && Read!="sell") { while(!IsStopped()) { Read=FileReadString(Handle); if(FileIsLineEnding(Handle))break; } continue; } Text=Text+"\n"+(FileOrders+2)+" "+Read;FileOrders++;Data[0][FileOrders-1]=Read; i=1; while(!IsStopped()) { Read=FileReadString(Handle); if(i<5)Text=Text+" "+Read; Data[i][FileOrders-1]=Read; if(FileIsLineEnding(Handle))break; i++; } } FileClose(Handle); Text=Text+"\n\nОрдеров в файле = "+FileOrders; Comment(Text); ///////////////////////////////////////////////////////////////////////// //Открытие всех ордеров сразу if ((Take || !StartLine) && !OpenStep) { for (i=0;i0)PriceSL=NormalizeDouble(PriceOP-StrToDouble(Data[3][i])*Point,Digits); else PriceSL=0; if (StrToDouble(Data[4][i])>0)PriceTP=NormalizeDouble(PriceOP+StrToDouble(Data[4][i])*Point,Digits); else PriceTP=0; Com=i+2; if (Ask>PriceOP-Slippage*Point && AskPriceOP-Slippage*Point){OpenOrder(Symbol(),OP_BUYLIMIT,StrToDouble(Data[1][i]),PriceOP,PriceSL,PriceTP,Com,Magic);continue;} if (Ask0)PriceSL=NormalizeDouble(PriceOP+StrToDouble(Data[3][i])*Point,Digits); else PriceSL=0; if (StrToDouble(Data[4][i])>0)PriceTP=NormalizeDouble(PriceOP-StrToDouble(Data[4][i])*Point,Digits); else PriceTP=0; Com=i+2; if (Bid>PriceOP-Slippage*Point && BidPriceOP-Slippage*Point){OpenOrder(Symbol(),OP_SELLSTOP,StrToDouble(Data[1][i]),PriceOP,PriceSL,PriceTP,Com,Magic);continue;} if (Bid0) { OrderSelect(TicketFind,SELECT_BY_TICKET,MODE_TRADES); if (Data[0][i]=="buy") { if (StrToDouble(Data[3][i])>0)PriceSL=NormalizeDouble(PriceOP-StrToDouble(Data[3][i])*Point,Digits); else PriceSL=0; if (StrToDouble(Data[4][i])>0)PriceTP=NormalizeDouble(PriceOP+StrToDouble(Data[4][i])*Point,Digits); else PriceTP=0; } if (Data[0][i]=="sell") { if (StrToDouble(Data[3][i])>0)PriceSL=NormalizeDouble(PriceOP+StrToDouble(Data[3][i])*Point,Digits); else PriceSL=0; if (StrToDouble(Data[4][i])>0)PriceTP=NormalizeDouble(PriceOP-StrToDouble(Data[4][i])*Point,Digits); else PriceTP=0; } if (NormalizeDouble(OrderStopLoss(),Digits)!=PriceSL || NormalizeDouble(OrderTakeProfit(),Digits)!=PriceTP) ModifyOrder(OrderTicket(),OrderOpenPrice(),PriceSL,PriceTP); } //////////////////////////////////////////////////////////// } } ///////////////////////////////////////////////////////////////////////// //Открытие ордеров попорядку if ((Take || !StartLine) && OpenStep) { //находим последний открытый ордер. int LastNomMarket,LastNomPending,n; for (i=0;i1)LastNomPending=n; else LastNomMarket=n; } } ///////////////////////////// for (i=0;i0)PriceSL=NormalizeDouble(PriceOP-StrToDouble(Data[3][i])*Point,Digits); else PriceSL=0; if (StrToDouble(Data[4][i])>0)PriceTP=NormalizeDouble(PriceOP+StrToDouble(Data[4][i])*Point,Digits); else PriceTP=0; Com=i+2; if (Ask>PriceOP-Slippage*Point && AskPriceOP-Slippage*Point){OpenOrder(Symbol(),OP_BUYLIMIT,StrToDouble(Data[1][i]),PriceOP,PriceSL,PriceTP,Com,Magic);LastNomPending=i;continue;} if (Ask0)PriceSL=NormalizeDouble(PriceOP+StrToDouble(Data[3][i])*Point,Digits); else PriceSL=0; if (StrToDouble(Data[4][i])>0)PriceTP=NormalizeDouble(PriceOP-StrToDouble(Data[4][i])*Point,Digits); else PriceTP=0; Com=i+2; if (Bid>PriceOP-Slippage*Point && BidPriceOP-Slippage*Point){OpenOrder(Symbol(),OP_SELLSTOP,StrToDouble(Data[1][i]),PriceOP,PriceSL,PriceTP,Com,Magic);LastNomPending=i;continue;} if (Bid0) { OrderSelect(TicketFind,SELECT_BY_TICKET,MODE_TRADES); if (Data[0][i]=="buy") { if (StrToDouble(Data[3][i])>0)PriceSL=NormalizeDouble(PriceOP-StrToDouble(Data[3][i])*Point,Digits); else PriceSL=0; if (StrToDouble(Data[4][i])>0)PriceTP=NormalizeDouble(PriceOP+StrToDouble(Data[4][i])*Point,Digits); else PriceTP=0; } if (Data[0][i]=="sell") { if (StrToDouble(Data[3][i])>0)PriceSL=NormalizeDouble(PriceOP+StrToDouble(Data[3][i])*Point,Digits); else PriceSL=0; if (StrToDouble(Data[4][i])>0)PriceTP=NormalizeDouble(PriceOP-StrToDouble(Data[4][i])*Point,Digits); else PriceTP=0; } if (NormalizeDouble(OrderStopLoss(),Digits)!=PriceSL || NormalizeDouble(OrderTakeProfit(),Digits)!=PriceTP) ModifyOrder(OrderTicket(),OrderOpenPrice(),PriceSL,PriceTP); } //////////////////////////////////////////////////////////// } } ///////////////////////////////////////////////////////////////////////// return(0); } ///////////////////////////////////////////////////////////////////////// //*******************************************************************//// ///////////////////////////////////////////////////////////////////////// int FindOrder(int ticket) { for (i1=0; i11) { OrderDelete(OrderTicket()); j--; } } } ///////////////////////////////////////////////////////////////////////// int CloseMarket() { for (int j=0; j1){OrderDelete(ticket);return(0);} OrderClose(ticket,lots,NormalizeDouble(price,Digits),Slippage,Goldenrod); err = GetLastError(); if (err == 0) break; Print(WindowExpertName(),Symbol(),Error(err)," при закрытии ордера"); Sleep(100); i1++; } return(0); } ////////////////////////////////////////////////////////////////////////////// int ModifyOrder(int ticket,double price,double stoploss,double takeprofit) { int err,i1; while(i1<10) { RefreshRates(); OrderModify(ticket,NormalizeDouble(price,Digits),NormalizeDouble(stoploss,Digits),NormalizeDouble(takeprofit,Digits),0,CLR_NONE); err = GetLastError(); if (err == 0) break; Print(WindowExpertName(),Symbol(),Error(err)," при модификации ордера"); Sleep(100); i1++; } return(0); } /////////////////////////////////////////////////////////////////////////////// string Error(int error_code) { string error_string; switch(error_code) { case 0: error_string="Нет ошибок"; break; case 1: error_string="Нет ошибки, но результат неизвестен"; break; case 2: error_string="Общая ошибка"; break; case 3: error_string="Неправильные параметры"; break; case 4: error_string="Торговый сервер занят"; break; case 5: error_string="Старая версия клиентского терминала"; break; case 6: error_string="Нет связи с торговым сервером"; break; case 7: error_string="Недостаточно прав"; break; case 8: error_string="Слишком частые запросы"; break; case 9: error_string="Недопустимая операция нарушающая функционирование сервера"; break; case 64: error_string="Счет заблокирован"; break; case 65: error_string="Неправильный номер счета"; break; case 128: error_string="Истек срок ожидания совершения сделки"; break; case 129: error_string="Неправильная цена"; break; case 130: error_string="Неправильные стопы"; break; case 131: error_string="Неправильный объем"; break; case 132: error_string="Рынок закрыт"; break; case 133: error_string="Торговля запрещена"; break; case 134: error_string="Недостаточно денег для совершения операции"; break; case 135: error_string="Цена изменилась"; break; case 136: error_string="Нет цен"; break; case 137: error_string="Брокер занят"; break; case 138: error_string="Новые цены"; break; case 139: error_string="Ордер заблокирован и уже обрабатывается"; break; case 140: error_string="Разрешена только покупка"; break; case 141: error_string="Слишком много запросов"; break; case 145: error_string="Модификация запрещена, так как ордер слишком близок к рынку"; break; case 146: error_string="Подсистема торговли занята"; break; case 147: error_string="Использование даты истечения ордера запрещено брокером"; break; case 148: error_string="Количество открытых и отложенных ордеров достигло предела, установленного брокером.";break; case 4000: error_string="Нет ошибки"; break; case 4001: error_string="Неправильный указатель функции"; break; case 4002: error_string="Индекс массива - вне диапазона"; break; case 4003: error_string="Нет памяти для стека функций"; break; case 4004: error_string="Переполнение стека после рекурсивного вызова"; break; case 4005: error_string="На стеке нет памяти для передачи параметров"; break; case 4006: error_string="Нет памяти для строкового параметра"; break; case 4007: error_string="Нет памяти для временной строки"; break; case 4008: error_string="Неинициализированная строка"; break; case 4009: error_string="Неинициализированная строка в массиве"; break; case 4010: error_string="Нет памяти для строкового массива"; break; case 4011: error_string="Слишком длинная строка"; break; case 4012: error_string="Остаток от деления на ноль"; break; case 4013: error_string="Деление на ноль"; break; case 4014: error_string="Неизвестная команда"; break; case 4015: error_string="Неправильный переход"; break; case 4016: error_string="Неинициализированный массив"; break; case 4017: error_string="Вызовы DLL не разрешены"; break; case 4018: error_string="Невозможно загрузить библиотеку"; break; case 4019: error_string="Невозможно вызвать функцию"; break; case 4020: error_string="Вызовы внешних библиотечных функций не разрешены"; break; case 4021: error_string="Недостаточно памяти для строки, возвращаемой из функции"; break; case 4022: error_string="Система занята"; break; case 4050: error_string="Неправильное количество параметров функции"; break; case 4051: error_string="Недопустимое значение параметра функции"; break; case 4052: error_string="Внутренняя ошибка строковой функции"; break; case 4053: error_string="Ошибка массива"; break; case 4054: error_string="Неправильное использование массива-таймсерии"; break; case 4055: error_string="Ошибка пользовательского индикатора"; break; case 4056: error_string="Массивы несовместимы"; break; case 4057: error_string="Ошибка обработки глобальныех переменных"; break; case 4058: error_string="Глобальная переменная не обнаружена"; break; case 4059: error_string="Функция не разрешена в тестовом режиме"; break; case 4060: error_string="Функция не разрешена"; break; case 4061: error_string="Ошибка отправки почты"; break; case 4062: error_string="Ожидается параметр типа string"; break; case 4063: error_string="Ожидается параметр типа integer"; break; case 4064: error_string="Ожидается параметр типа double"; break; case 4065: error_string="В качестве параметра ожидается массив"; break; case 4066: error_string="Запрошенные исторические данные в состоянии обновления"; break; case 4067: error_string="Ошибка при выполнении торговой операции"; break; case 4099: error_string="Конец файла"; break; case 4100: error_string="Ошибка при работе с файлом"; break; case 4101: error_string="Неправильное имя файла"; break; case 4102: error_string="Слишком много открытых файлов"; break; case 4103: error_string="Невозможно открыть файл"; break; case 4104: error_string="Несовместимый режим доступа к файлу"; break; case 4105: error_string="Ни один ордер не выбран"; break; case 4106: error_string="Неизвестный символ"; break; case 4107: error_string="Неправильный параметр цены для торговой функции"; break; case 4108: error_string="Неверный номер тикета"; break; case 4109: error_string="Торговля не разрешена. Необходимо включить опцию Разрешить советнику торговать в свойствах эксперта."; break; case 4110: error_string="Длинные позиции не разрешены. Необходимо проверить свойства эксперта."; break; case 4111: error_string="Короткие позиции не разрешены. Необходимо проверить свойства эксперта."; break; case 4200: error_string="Объект уже существует"; break; case 4201: error_string="Запрошено неизвестное свойство объекта"; break; case 4202: error_string="Объект не существует"; break; case 4203: error_string="Неизвестный тип объекта"; break; case 4204: error_string="Нет имени объекта"; break; case 4205: error_string="Ошибка координат объекта"; break; case 4206: error_string="Не найдено указанное подокно"; break; default: error_string="Ошибка при работе с объектом"; } return(error_string); }