//+------------------------------------------------------------------+ //| Tokarev.mq4 | //| valenok2003@mail.ru | //| ICQ 365919666 | //| MQL4 Пишу на заказ. Индикатор от 100р, советник от 1000р | //+------------------------------------------------------------------+ #property copyright "Sergey Gulyaev. Maykop" #property link "ICQ 365919666" extern string Rem_0 = "-верхний уровень входа-"; extern double Price_Top = 0; extern string Rem_1 = "-нижний уровень входа-"; extern double Price_Boot = 0; extern string Rem_2 = "-дистанция хедж-ордеров (пп)-"; extern int _Distans_1 = 25; extern int _Distans_2 = 50; extern string Rem_3 = "-основной ордера (пп)-"; extern double Lot_Main = 0.2; extern int _Profit_Main = 250; extern int _Loss_Main = 50; extern int _Tral_Main = 100; extern string Rem_4 = "-хедж ордер 1 (пп)-"; extern double Lot_Hedg_1 = 0.1; extern int _Profit_Hedg_1 = 250; extern int _Loss_Hedg_1 = 50; extern int _Tral_Hedg_1 = 100; extern string Rem_5 = "-хедж ордер 2 (пп)-"; extern double Lot_Hedg_2 = 0.1; extern int _Profit_Hedg_2 = 250; extern int _Loss_Hedg_2 = 50; extern int _Tral_Hedg_2 = 100; extern bool Show_Info = true; extern double Log = 0; double k; double Profit_Main, Tral_Main, Loss_Main, Distans_1, Profit_Hedg_1, Tral_Hedg_1, Loss_Hedg_1, Distans_2, Profit_Hedg_2, Tral_Hedg_2, Loss_Hedg_2; double Price_Hedg_Buy_1, Price_Hedg_Buy_2, Price_Hedg_Sell_1, Price_Hedg_Sell_2; int TICKET_SELL_MAIN = 0, TICKET_BUY_HEDG_1 = 0, TICKET_BUY_HEDG_2 = 0, TICKET_BUY_MAIN = 0, TICKET_SELL_HEDG_1 = 0, TICKET_SELL_HEDG_2 = 0, ERROR; double Last_Tral_SELL_MAIN = 1000, Last_Tral_BUY_HEDG_1 = 0, Last_Tral_BUY_HEDG_2 = 0, Last_Tral_BUY_MAIN = 0, Last_Tral_SELL_HEDG_1 = 1000, Last_Tral_SELL_HEDG_2 = 1000; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //определяем количество запятых после знака и в соответствии с этим выставляем коэффициент switch(Digits) { case 2: k = 0.01; break; case 4: k = 0.0001; break; case 5: k = 0.00001; break; default: break; } //--------------------- //+------------------------------------------------------------------+ //| ПРОВЕРКА УСТАНОВОК ПОЛЬЗОВАТЕЛЯ | //+------------------------------------------------------------------+ //если неверно заданы ЦЕНЫ ордеров int Spread = MarketInfo(Symbol(),MODE_SPREAD); double dist_max = 1000*k; // double dist_min = Spread*k; if(Price_Top < Bid || Price_Top - Bid > dist_max) Price_Top = Ask + 10*k; if(Price_Boot > Ask || Ask - Price_Boot > dist_max) Price_Boot = Bid - 10*k; //если задан трал меньше min значения, утанавливаем min допустимые int StopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL); if(_Tral_Main < StopLevel) _Tral_Main = StopLevel; if(_Tral_Hedg_1 < StopLevel) _Tral_Hedg_1 = StopLevel; if(_Tral_Hedg_2 < StopLevel) _Tral_Hedg_2 = StopLevel; //+------------------------------------------------------------------+ //--------------------- //Преобразуем заданные пользователем пункты в пипсы инструмента Profit_Main = _Profit_Main*k; Tral_Main = _Tral_Main*k; Loss_Main = _Loss_Main*k; Distans_1 = _Distans_1*k; Profit_Hedg_1 = _Profit_Hedg_1*k; Tral_Hedg_1 = _Tral_Hedg_1*k; Loss_Hedg_1 = _Loss_Hedg_1*k; Distans_2 = _Distans_2*k; Profit_Hedg_2 = _Profit_Hedg_2*k; Tral_Hedg_2 = _Tral_Hedg_2*k; Loss_Hedg_2 = _Loss_Hedg_2*k; //--------------------- // формируем цены открытия ордеров Price_Hedg_Buy_1 = Price_Top + Distans_1; Price_Hedg_Buy_2 = Price_Top + Distans_2; Price_Hedg_Sell_1 = Price_Boot - Distans_1; Price_Hedg_Sell_2 = Price_Boot - Distans_2; if(Show_Info == true) { Comment ( "\nmin StopLevel = ",StopLevel, "\nDistans_1 = ",DoubleToStr(Distans_1,Digits), "\nDistans_2 = ",DoubleToStr(Distans_2,Digits), "\n", // "\nзнаков после запятой = ",Digits, "\nкоэффициент = ", DoubleToStr(k,Digits), // "\nAsk = ", DoubleToStr(Ask,Digits), // "\nBid = ", DoubleToStr(Bid,Digits), "\nСпрэд = ", DoubleToStr(Spread*k,Digits), "\n", "\nХедж_Top_2 = ",DoubleToStr(Price_Hedg_Buy_2,Digits), "\nХедж_Top_1 = ",DoubleToStr(Price_Hedg_Buy_1,Digits), "\nPrice_Top = ", DoubleToStr(Price_Top,Digits), "\n", "\nPrice_Boot = ", DoubleToStr(Price_Boot,Digits), "\nХедж_Boot_1 = ",DoubleToStr(Price_Hedg_Sell_1,Digits), "\nХедж_Boot_2 = ",DoubleToStr(Price_Hedg_Sell_2,Digits) ); } //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //+------------------------------------------------------------------+ //| УСТАНОВКА ВЕРХНЕЙ ГРУППЫ ОРДЕРОВ | //| | //| если текущаяя цена ВЫШЕ заданной, | //| и не установлена нижняя группа ордеров BUY, | //| устанавливаем ордер SELL_MAIN и 2 хедж ордера BUY | //+------------------------------------------------------------------+ if(TICKET_BUY_MAIN == 0 && TICKET_SELL_HEDG_1 == 0 && TICKET_SELL_HEDG_2 == 0) // если нижняя группа не установлена { if(TICKET_SELL_MAIN == 0 && Bid >= Price_Top) //если ордер SELL_MAIN не открыт, а цена превысила Price_Top { TICKET_SELL_MAIN = OrderSend(Symbol(),OP_SELL,Lot_Main,Bid,5,0,0,NULL,0,0,CLR_NONE); // открываем SELL_MAIN ERROR = GetLastError(); Error("Открытие SELL_MAIN: ",ERROR); if(ERROR != 0) TICKET_SELL_MAIN = 0; // Если ошибка открытия, возвращаем тикет в 0 } if(TICKET_BUY_HEDG_1 == 0 && Ask >= Price_Hedg_Buy_1) //если ордер BUY_HEDG_1 не открыт, а цена превысила Price_Hedg_Buy_1 { TICKET_BUY_HEDG_1 = OrderSend(Symbol(),OP_BUY,Lot_Hedg_1,Ask,5,0,0,NULL,0,0,CLR_NONE); ERROR = GetLastError(); Error("Открытие BUY_HEDG_1: ",ERROR); if(ERROR != 0) TICKET_BUY_HEDG_1 = 0; // Если ошибка открытия, возвращаем тикет в 0 } if(TICKET_BUY_HEDG_2 == 0 && Ask >= Price_Hedg_Buy_2) //если ордер BUY_HEDG_2 не открыт, а цена превысила Price_Hedg_Buy_2 { TICKET_BUY_HEDG_2 = OrderSend(Symbol(),OP_BUY,Lot_Hedg_2,Ask,5,0,0,NULL,0,0,CLR_NONE); ERROR = GetLastError(); Error("Открытие BUY_HEDG_2: ",ERROR); if(ERROR != 0) TICKET_BUY_HEDG_2 = 0; // Если ошибка открытия, возвращаем тикет в 0 } } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| УСТАНОВКА НИЖНЕЙ ГРУППЫ ОРДЕРОВ | //| | //| если текущаяя цена НИЖЕ заданной, | //| и не установлена верхняя группа ордеров SELL, | //| устанавливаем ордер BUY_MAIN и 2 хедж ордера SELL | //+------------------------------------------------------------------+ if(TICKET_SELL_MAIN == 0 && TICKET_BUY_HEDG_1 == 0 && TICKET_BUY_HEDG_2 == 0) //если верхняя группа не установлена { if(TICKET_BUY_MAIN == 0 && Ask <= Price_Boot) //если ордер BUY_MAIN не открыт, а цена ниже Price_Boot { TICKET_BUY_MAIN = OrderSend(Symbol(),OP_BUY,Lot_Main,Ask,5,0,0,NULL,0,0,CLR_NONE); // открываем BUY_MAIN ERROR = GetLastError(); Error("Открытие BUY_MAIN: ",ERROR); if(ERROR != 0) TICKET_BUY_MAIN = 0; // Если ошибка открытия, возвращаем тикет в 0 } if(TICKET_SELL_HEDG_1 == 0 && Bid <= Price_Hedg_Sell_1) //если ордер SELL_HEDG_1 ещё не открыт, а цена ниже Price_Hedg_Sell_1 { TICKET_SELL_HEDG_1 = OrderSend(Symbol(),OP_SELL,Lot_Hedg_1,Bid,5,0,0,NULL,0,0,CLR_NONE); ERROR = GetLastError(); Error("Открытие SELL_HEDG_1: ",ERROR); if(ERROR != 0) TICKET_SELL_HEDG_1 = 0; // Если ошибка открытия, возвращаем тикет в 0 } if(TICKET_SELL_HEDG_2 == 0 && Bid <= Price_Hedg_Sell_2) //если ордер SELL_HEDG_2 ещё не открыт, а цена ниже Price_Hedg_Sell_2 { TICKET_SELL_HEDG_2 = OrderSend(Symbol(),OP_SELL,Lot_Hedg_2,Bid,5,0,0,NULL,0,0,CLR_NONE); ERROR = GetLastError(); Error("Открытие SELL_HEDG_2: ",ERROR); if(ERROR != 0) TICKET_SELL_HEDG_2 = 0; // Если ошибка открытия, возвращаем тикет в 0 } } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| МОДИФИКАЦИЯ ОРДЕРОВ | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| модификация верхней группы ордеров | //+------------------------------------------------------------------+ if(TICKET_SELL_MAIN != 0) // проверка основного ордера если прибыль, устанавливаем трал { OrderSelect(TICKET_SELL_MAIN, SELECT_BY_TICKET); if(OrderCloseTime() == 0) { if(OrderOpenPrice() - Ask >= Tral_Main && Ask < Last_Tral_SELL_MAIN) { Last_Tral_SELL_MAIN = Ask; OrderModify(TICKET_SELL_MAIN,OrderOpenPrice(),Ask + Tral_Main,OrderTakeProfit(),0,CLR_NONE); Error("Трал SELL_MAIN: ",GetLastError()); } } } if(TICKET_BUY_HEDG_1 != 0) // проверка хедж ордера 1 если прибыль, устанавливаем трал { OrderSelect(TICKET_BUY_HEDG_1, SELECT_BY_TICKET); if(OrderCloseTime() == 0) { if(Bid - OrderOpenPrice() >= Tral_Hedg_1 && Bid > Last_Tral_BUY_HEDG_1) { Last_Tral_BUY_HEDG_1 = Bid; OrderModify(TICKET_BUY_HEDG_1,OrderOpenPrice(),Bid - Tral_Hedg_1,OrderTakeProfit(),0,CLR_NONE); Error("Трал BUY_HEDG_1: ",GetLastError()); } } } if(TICKET_BUY_HEDG_2 != 0) // проверка хедж ордера 2 если прибыль, устанавливаем трал { OrderSelect(TICKET_BUY_HEDG_2, SELECT_BY_TICKET); if(OrderCloseTime() == 0) { if(Bid - OrderOpenPrice() >= Tral_Hedg_2 && Bid > Last_Tral_BUY_HEDG_2) { Last_Tral_BUY_HEDG_2 = Bid; OrderModify(TICKET_BUY_HEDG_2,OrderOpenPrice(),Bid - Tral_Hedg_2,OrderTakeProfit(),0,CLR_NONE); Error("Трал BUY_HEDG_2: ",GetLastError()); } } } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| модификация нижней группы ордеров | //+------------------------------------------------------------------+ if(TICKET_BUY_MAIN != 0) // проверка основного ордера если прибыль, устанавливаем трал { OrderSelect(TICKET_BUY_MAIN, SELECT_BY_TICKET); if(OrderCloseTime() == 0) { if(Bid - OrderOpenPrice() >= Tral_Main && Bid > Last_Tral_BUY_MAIN) { Last_Tral_BUY_MAIN = Bid; OrderModify(TICKET_BUY_MAIN,OrderOpenPrice(),Bid - Tral_Main,OrderTakeProfit(),0,CLR_NONE); Error("Трал BUY_MAIN: ",GetLastError()); } } } if(TICKET_SELL_HEDG_1 != 0) // проверка хедж ордера 1 если прибыль, устанавливаем трал { OrderSelect(TICKET_SELL_HEDG_1, SELECT_BY_TICKET); if(OrderCloseTime() == 0) { if(OrderOpenPrice() - Ask >= Tral_Hedg_1 && Ask < Last_Tral_SELL_HEDG_1) { Last_Tral_SELL_HEDG_1 = Ask; OrderModify(TICKET_SELL_HEDG_1,OrderOpenPrice(),Ask + Tral_Hedg_1,OrderTakeProfit(),0,CLR_NONE); Error("Трал SELL_HEDG_1: ",GetLastError()); } } } if(TICKET_SELL_HEDG_2 != 0) // проверка хедж ордера 2 если прибыль, устанавливаем трал { OrderSelect(TICKET_SELL_HEDG_2, SELECT_BY_TICKET); if(OrderCloseTime() == 0) { if(OrderOpenPrice() - Ask >= Tral_Hedg_2 && Ask < Last_Tral_SELL_HEDG_2) { Last_Tral_SELL_HEDG_2 = Ask; OrderModify(TICKET_SELL_HEDG_2,OrderOpenPrice(),Ask + Tral_Hedg_2,OrderTakeProfit(),0,CLR_NONE); Error("Трал SELL_HEDG_2: ",GetLastError()); } } } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| ЗАКРЫТИЕ ОРДЕРОВ | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| закрытие верхней группы ордеров | //+------------------------------------------------------------------+ double Profit, Loss; // закрытие по прибыли или убытку if(TICKET_SELL_MAIN != 0) { OrderSelect(TICKET_SELL_MAIN, SELECT_BY_TICKET); Profit = OrderOpenPrice() - Ask; Loss = Ask - OrderOpenPrice(); if(OrderCloseTime() == 0) { if(Profit >= Profit_Main) // Закрываем SELL_MAIN по прибыли { OrderClose (TICKET_SELL_MAIN, Lot_Main, Ask, 5, CLR_NONE); Error("Закрытие SELL_MAIN по прибыли: ",GetLastError()); } if(Loss >= Loss_Main) // Закрываем SELL_MAIN по убытку { OrderClose (TICKET_SELL_MAIN, Lot_Main, Ask, 5, CLR_NONE); Error("Закрытие SELL_MAIN по убытку: ",GetLastError()); } } } if(TICKET_BUY_HEDG_1 != 0) // проверка хедж ордера 1 { OrderSelect(TICKET_BUY_HEDG_1, SELECT_BY_TICKET); Profit = Bid - OrderOpenPrice(); Loss = OrderOpenPrice() - Bid; if(OrderCloseTime() == 0) { if(Profit >= Profit_Hedg_1) // Закрываем BUY_1 по прибыли { OrderClose (TICKET_BUY_HEDG_1, Lot_Hedg_1, Bid, 5, CLR_NONE); ERROR = GetLastError(); Error("Закрытие BUY_HEDG_1 по прибыли: ",ERROR); if(ERROR == 0) TICKET_BUY_HEDG_1 = 0; // Если ордер закрыт, возвращаем тикет в 0 } if(Loss >= Loss_Hedg_1) // Закрываем BUY_1 по убытку { OrderClose (TICKET_BUY_HEDG_1, Lot_Hedg_1, Bid, 5, CLR_NONE); ERROR = GetLastError(); Error("Закрытие BUY_HEDG_1 по убытку: ",ERROR); if(ERROR == 0) TICKET_BUY_HEDG_1 = 0; // Если ордер закрыт, возвращаем тикет в 0 } } } if(TICKET_BUY_HEDG_2 != 0) // проверка хедж ордера 1 { OrderSelect(TICKET_BUY_HEDG_2, SELECT_BY_TICKET); Profit = Bid - OrderOpenPrice(); Loss = OrderOpenPrice() - Bid; if(OrderCloseTime() == 0) { if(Profit >= Profit_Hedg_2) // Закрываем BUY_2 по прибыли { OrderClose (TICKET_BUY_HEDG_2, Lot_Hedg_2, Bid, 5, CLR_NONE); ERROR = GetLastError(); Error("Закрытие BUY_HEDG_2 по прибыли: ",ERROR); if(ERROR == 0) TICKET_BUY_HEDG_2 = 0; // Если ордер закрыт, возвращаем тикет в 0 } if(Loss >= Loss_Hedg_2) // Закрываем BUY_2 по убытку { OrderClose (TICKET_BUY_HEDG_2, Lot_Hedg_2, Bid, 5, CLR_NONE); ERROR = GetLastError(); Error("Закрытие BUY_HEDG_2 по убытку: ",ERROR); if(ERROR == 0) TICKET_BUY_HEDG_2 = 0; // Если ордер закрыт, возвращаем тикет в 0 } } } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| закрытие нижней группы ордеров | //+------------------------------------------------------------------+ // закрытие по прибыли или убытку if(TICKET_BUY_MAIN != 0) // проверка основного ордера { OrderSelect(TICKET_BUY_MAIN, SELECT_BY_TICKET); Profit = Bid - OrderOpenPrice(); Loss = OrderOpenPrice() - Bid; if(OrderCloseTime() == 0) { if( Profit >= Profit_Main) // Закрываем BUY_MAIN по прибыли { OrderClose (TICKET_BUY_MAIN, Lot_Main, Bid, 5, CLR_NONE); Error("Закрытие BUY_MAIN по прибыли: ",GetLastError()); } if(Loss >= Loss_Main) // Закрываем BUY_MAIN по убытку { OrderClose (TICKET_BUY_MAIN, Lot_Main, Bid, 5, CLR_NONE); Error("Закрытие BUY_MAIN по убытку: ",GetLastError()); } } } if(TICKET_SELL_HEDG_1 != 0) // проверка хедж ордера 1 { OrderSelect(TICKET_SELL_HEDG_1, SELECT_BY_TICKET); Profit = OrderOpenPrice() - Ask; Loss = Ask - OrderOpenPrice(); if(OrderCloseTime() == 0) { if(Profit >= Profit_Hedg_1) // Закрываем SELL_HEDG_1 по прибыли { OrderClose (TICKET_SELL_HEDG_1, Lot_Hedg_1, Ask, 5, CLR_NONE); ERROR = GetLastError(); Error("Закрытие SELL_HEDG_1 по прибыли: ",ERROR); if(ERROR == 0) TICKET_SELL_HEDG_1 = 0; // Если ордер закрыт, возвращаем тикет в 0 } if(Loss >= Loss_Hedg_1) // Закрываем SELL_HEDG_1 по убытку { OrderClose (TICKET_SELL_HEDG_1, Lot_Hedg_1, Ask, 5, CLR_NONE); ERROR = GetLastError(); Error("Закрытие SELL_HEDG_1 по убытку: ",ERROR); if(ERROR == 0) TICKET_SELL_HEDG_1 = 0; // Если ордер закрыт, возвращаем тикет в 0 } } } if(TICKET_SELL_HEDG_2 != 0) // проверка хедж ордера 1 { OrderSelect(TICKET_SELL_HEDG_2, SELECT_BY_TICKET); Profit = OrderOpenPrice() - Ask; Loss = Ask - OrderOpenPrice(); if(OrderCloseTime() == 0) { if(Profit >= Profit_Hedg_2) // Закрываем SELL_HEDG_1 по прибыли { OrderClose (TICKET_SELL_HEDG_2, Lot_Hedg_2, Ask, 5, CLR_NONE); ERROR = GetLastError(); Error("Закрытие SELL_HEDG_2 по прибыли: ",ERROR); if(ERROR == 0) TICKET_SELL_HEDG_2 = 0; // Если ордер закрыт, возвращаем тикет в 0 } if(Loss >= Loss_Hedg_2) // Закрываем SELL_HEDG_1 по убытку { OrderClose (TICKET_SELL_HEDG_2, Lot_Hedg_2, Ask, 5, CLR_NONE); ERROR = GetLastError(); Error("Закрытие SELL_HEDG_2 по убытку: ",ERROR); if(ERROR == 0) TICKET_SELL_HEDG_2 = 0; // Если ордер закрыт, возвращаем тикет в 0 } } } //+------------------------------------------------------------------+ //---- return(0); } bool Error(string txt, int num_error) { bool ret = false; switch(num_error) { //---- Коды ошибок, возвращаемые торговым сервером: case 0: Print(txt , "Нет ошибок"); break; case 1: Print(txt , "Нет ошибки, но результат неизвестен"); break; case 2: Print(txt , "Общая ошибка"); ret = true; break; case 3: Print(txt , "Неправильные параметры"); break; case 4: Print(txt , "Торговый сервер занят"); ret = true; break; case 5: Print(txt , "Старая версия клиентского терминала"); break; case 6: Print(txt , "Нет связи с торговым сервером"); ret = true; break; case 7: Print(txt , "Недостаточно прав"); break; case 8: Print(txt , "Слишком частые запросы"); break; case 9: Print(txt , "Операция нарушающая функционирование сервера"); break; case 64: Print(txt , "Счет заблокирован"); break; case 65: Print(txt , "Неправильный номер счета"); break; case 128: Print(txt , "Истек срок ожидания совершения сделки"); ret = true; break; case 129: Print(txt , "Неправильная цена"); ret = true; break; case 130: Print(txt , "Неправильные стопы"); break; case 131: Print(txt , "Неправильный объем"); break; case 132: Print(txt , "Рынок закрыт"); break; case 133: Print(txt , "Торговля запрещена"); break; case 134: Print(txt , "Недостаточно денег для совершения операции"); break; case 135: Print(txt , "Цена изменилась"); ret = true; break; case 136: Print(txt , "Нет цены"); break; case 137: Print(txt , "Брокер занят"); ret = true; break; case 138: Print(txt , "Новые цены"); ret = true; break; case 139: Print(txt , "Ордер заблокирован и уже обрабатывается"); break; case 140: Print(txt , "Разрешена только покупка"); break; case 141: Print(txt , "Слишком много запросов"); ret = true; break; case 145: Print(txt , "Модификация запрещена, ордер слишком близок к рынку"); break; case 146: Print(txt , "Подсистема торговли занята"); ret = true; break; case 147: Print(txt , "Использование даты истечения ордера запрещено брокером"); break; case 148: Print(txt , "Количество ордеров достигло предела."); break; //---- Коды ошибок выполнения MQL4-программы: case 4000: Print(txt , "Нет ошибки"); break; case 4001: Print(txt , "Неправильный указатель функции"); break; case 4002: Print(txt , "Индекс массива - вне диапазона"); break; case 4003: Print(txt , "Нет памяти для стека функций"); break; case 4004: Print(txt , "Переполнение стека после рекурсивного вызова"); break; case 4005: Print(txt , "На стеке нет памяти для передачи параметров"); break; case 4006: Print(txt , "Нет памяти для строкового параметра"); break; case 4007: Print(txt , "Нет памяти для временной строки"); break; case 4008: Print(txt , "Неинициализированная строка"); break; case 4009: Print(txt , "Неинициализированная строка в массиве"); break; case 4010: Print(txt , "Нет памяти для строкового массива"); break; case 4011: Print(txt , "Слишком длинная строка"); break; case 4012: Print(txt , "Остаток от деления на ноль"); break; case 4013: Print(txt , "Деление на ноль"); break; case 4014: Print(txt , "Неизвестная команда"); break; case 4015: Print(txt , "Неправильный переход"); break; case 4016: Print(txt , "Неинициализированный массив"); break; case 4017: Print(txt , "Вызовы DLL не разрешены"); break; case 4018: Print(txt , "Невозможно загрузить библиотеку"); break; case 4019: Print(txt , "Невозможно вызвать функцию"); break; case 4020: Print(txt , "Вызовы внешних библиотечных функций не разрешены"); break; case 4021: Print(txt , "Недостаточно памяти для строки, возвращаемой из функции"); break; case 4022: Print(txt , "Система занята"); break; case 4050: Print(txt , "Неправильное количество параметров функции"); break; case 4051: Print(txt , "Недопустимое значение параметра функции"); break; case 4052: Print(txt , "Внутренняя ошибка строковой функции"); break; case 4053: Print(txt , "Ошибка массива"); break; case 4054: Print(txt , "Неправильное использование массива-таймсерии"); break; case 4055: Print(txt , "Ошибка пользовательского индикатора"); break; case 4056: Print(txt , "Массивы несовместимы"); break; case 4057: Print(txt , "Ошибка обработки глобальныех переменных"); break; case 4058: Print(txt , "Глобальная переменная не обнаружена"); break; case 4059: Print(txt , "Функция не разрешена в тестовом режиме"); break; case 4060: Print(txt , "Функция не разрешена"); break; case 4061: Print(txt , "Ошибка отправки почты"); break; case 4062: Print(txt , "Ожидается параметр типа string"); break; case 4063: Print(txt , "Ожидается параметр типа integer"); break; case 4064: Print(txt , "Ожидается параметр типа double"); break; case 4065: Print(txt , "В качестве параметра ожидается массив"); break; case 4066: Print(txt , "Запрошенные исторические данные в состоянии обновления"); break; case 4067: Print(txt , "Ошибка при выполнении торговой операции"); break; case 4099: Print(txt , "Конец файла"); break; case 4100: Print(txt , "Ошибка при работе с файлом"); break; case 4101: Print(txt , "Неправильное имя файла"); break; case 4102: Print(txt , "Слишком много открытых файлов"); break; case 4103: Print(txt , "Невозможно открыть файл"); break; case 4104: Print(txt , "Несовместимый режим доступа к файлу"); break; case 4105: Print(txt , "Ни один ордер не выбран"); break; case 4106: Print(txt , "Неизвестный символ"); break; case 4107: Print(txt , "Неправильный параметр цены для торговой функции"); break; case 4108: Print(txt , "Неверный номер тикета"); break; case 4109: Print(txt , "Торговля не разрешена. Измените свойствах эксперта."); break; case 4110: Print(txt , "Длинные позиции не разрешены. Необходимо проверить свойства эксперта."); break; case 4111: Print(txt , "Короткие позиции не разрешены. Необходимо проверить свойства эксперта."); break; case 4200: Print(txt , "Объект уже существует"); break; case 4201: Print(txt , "Запрошено неизвестное свойство объекта"); break; case 4202: Print(txt , "Объект не существует"); break; case 4203: Print(txt , "Неизвестный тип объекта"); break; case 4204: Print(txt , "Нет имени объекта"); break; case 4205: Print(txt , "Ошибка координат объекта"); break; case 4206: Print(txt , "Не найдено указанное подокно"); break; case 4207: Print(txt , "Ошибка при работе с объектом"); break; default: Print(txt , "Неизвестная ошибка"); } if(num_error != 0) PlaySound("Error.wav"); //---- return(ret); }