//Version January 7, 2007 Final //+------------------------------------------------------------------+ //| T3Series0(Exp).mqh | //| T3 code: Copyright © 1998, Tilson | //| MQL4T3Series0: Copyright © 2006, Nikolay Kositsin | //| Khabarovsk, farria@mail.redcom.ru | //+------------------------------------------------------------------+ /* +SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSЖ <<< Функция T3Series0() >>> SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS+ +-----------------------------------------+ <<< Назначение >>> +----------------------------------------------------+ Функция T3Series0() предназначена для использования алгоритма T3 при написании экспертов, для замены расчёта классического усреднения на этот алгоритм. Файл следует положить в папку (директорию): MetaTrader\experts\include\ Следует учесть, что если nT30.bar больше, чем nT30.MaxBar-3*nT30.Period, то функция T3Series0 возвращает значение равное нулю! на этом баре! И, следовательно, такое значение не может присутствовать в знаменателе какой-либо дроби в расчёте индикатора! Эта версия функции T3Series0 не поддерживает экспертов при её использовании в пользовательских индикаторах, к которым обращается эксперт. Эта версия функции T3Series0() поддерживает экспертов при её использовании в коде индикатора, который полностью помещён в код эксперта с сохранением всех операторов цикла! При написании индикаторов и экспертов с использованием функции T3Series0(), не рекомендуется переменным давать имена начинающиеся с nT30.... или dT30.... Эту версию функции T3Series0() следует применять в экспертах, работающих с нулевым баром. Функция T3Series0() может быть использована во внутреннем коде других пользовательских функций, но при этом следует учитывать тот факт, что в каждом обращении к такой пользовательской функции у каждого обращения к T3Series0() должен быть свой уникальный номер (nT30.number). +-------------------------------------+ <<< Входные параметры >>> +-------------------------------------------------+ nT30.number - порядковый номер обращения к функции T3Series0(). (0, 1, 2, 3 и.т.д....) nT30.din - параметр, позволяющий изменять параметры nT30.Period на каждом баре. 0 - запрет изменения параметров, любое другое значение - разрешение. nT30.MaxBar - Максимальное значение, которое может принимать номер рассчитываемого бара(nT30.bar). Обычно равно Bars-1-period; Где "period" - это количество баров, на которых исходная величина dT30.series не рассчитывается; nT30.limit - Количество ещё не подсчитанных баров или номер предпоследнего непосчитанного бара, nT30.Curvature - параметр изменяющийся в пределах 0 ... +100, влияет на качество переходного процесса; nT30.Period - глубина сглаживания dT30.series - Входной параметр, по которому производится расчёт функции T3Series0(); nT30.bar - номер рассчитываемого бара, параметр должен изменяться оператором цикла от максимального значения к нулевому. Причём его максимальное значение всегда должно равняться значению параметра nT30.limit!!! +------------------------------------+ <<< Выходные параметры >>> +-------------------------------------------------+ T3Series0() - значение функции T3. При значениях nT30.bar больше чем nT30.MaxBar-nT30.Length функция T3MASeries() всегда возвращает ноль!!! nT30.reset - параметр, возвращающий по ссылке значение, отличенное от 0, если произошла ошибка в расчёте функции, 0, если расчёт прошёл нормально. Этот параметр может быть только переменной, но не значением!!! +-----------------------------------+ <<< Инициализация функции >>> +-----------------------------------------------+ Перед обращениями к функции T3Series0() в блоке инициализации пользовательского эксперта), следует ввести и инициализировать внутренние переменные функции, для этого необходимо обратиться к функции T3Series0() через вспомогательную функцию T3Series0Resize() со следующими параметрами: T3Series0Resize(MaxT3.number+1); необходимо сделать параметр nT30.number(MaxT3.number) равным количеству обращений к функции T3Series0(), то есть на единицу больше, чем максимальный nT30.number. +--------------------------------------+ <<< Индикация ошибок >>> +-------------------------------------------------+ При отладке экспертов их коды могут содержать ошибки, для выяснения причин которых следует смотреть лог файл. Все ошибки функция T3Series0() пишет в лог файл в папке \MetaTrader\EXPERTS\LOGS\. Если, перед обращением к функции T3Series0() в коде, который предшествовал функции, возникла MQL4 ошибка, то функция запишет в лог файл код ошибки и содержание ошибки. Если при выполнении функции T3Series0() в алгоритме T3Series0() произошла MQL4 ошибка, то функция также запишет в лог файл код ошибки и содержание ошибки. При неправильном задании номера обращения к функции T3Series0() nT30.number или неверном определении размера буферных переменных nJT3Resize.Size в лог файл будет записаны сообщения о неверном определении этих параметров. Также в лог файл пишется информация при неправильном определении параметра nT30.limit. Если при выполнении функции инициализации init() произошёл сбой при изменении размеров буферных переменных функции T3Series0(), то функция T3Series0Resize() запишет в лог файл информацию о неудачном изменении размеров буферных переменных. Если при обращении к функции T3Series0() через внешний оператор цикла была нарушена правильная последовательность изменения параметра nT30.bar, то в лог файл будет записана и эта информация. Следует учесть, что некоторые ошибки программного кода будут порождать дальнейшие ошибки в его исполнении и поэтому, если функция T3Series0() пишет в лог файл сразу несколько ошибок, то устранять их следует в порядке времени возникновения. В правильно написанном эксперте функция T3Series0 может делать записи в лог файл только при нарушениях работы операционной системы. Исключение составляет запись изменения размеров буферных переменных при перезагрузке эксперта, которая происходит при каждом вызове функции init(). +---------------------------------+ <<< Пример обращения к функции >>> +--------------------------------------------+ //----+ определение функций T3Series0 #include //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- определение стиля исполнения графика SetIndexStyle (0,DRAW_LINE); //---- 1 индикаторный буфер использован для счёта (без этого пересчёта функция T3Series0() свой расчёт производить не будет!!!) SetIndexBuffer(0,Ind_Buffer); //----+ Изменение размеров буферных переменных функции T3Series0, nT30.number=1(Одно обращение к функции T3Series0) if(T3Series0Resize(1)==0)return(-1); return(0); } //+------------------------------------------------------------------+ //| Custom indicator function | //+------------------------------------------------------------------+ int start() { //----+ Введение целых переменных и получение уже подсчитанных баров int reset,bar,MaxBar,limit,counted_bars=IndicatorCounted(); //---- проверка на возможные ошибки if (counted_bars<0)return(-1); //---- последний подсчитанный бар должен быть пересчитан if (counted_bars>0) counted_bars--; //---- определение номера самого старого бара, начиная с которого будет произедён пересчёт новых баров int limit=Bars-counted_bars-1; MaxBar=Bars-1; //----+ for(bar=limit;bar>=0;bar--) ( double Series=Close[bar]; //----+ Обращение к функции T3Series0 за номером 0 для расчёта буфера Ind_Buffer[], //параметры nT30.Curvature и nT30.Length не меняются на каждом баре (nT30.din=0) double Resalt=T3Series0(0,0,MaxBar,limit,Curvature,Length,Series,bar,reset); if (reset!=0)return(-1); Ind_Buffer[bar]=Resalt; } return(0); } //----+ */ //SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS+ //+++++++++++++++++++++++++++++++++++++++++++++++++++++++ <<< T3Series0 >>> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++| //SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS+ //----++ <<< Введение и инициализация переменных >>> +SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS+ double dT30.e1[1],dT30.e2[1],dT30.e3[1],dT30.e4[1],dT30.e5[1],dT30.e6[1]; double dT30.E1[1],dT30.E2[1],dT30.E3[1],dT30.E4[1],dT30.E5[1],dT30.E6[1]; double dT30.c1[1],dT30.c2[1],dT30.c3[1],dT30.c4[1],dT30.w1[1],dT30.w2[1]; double dT30.n[1],dT30.b2[1],dT30.b3[1],dT30.T3; int nT30.TIME[1],nT30.Error,nT30.num,nT30.Tnew,nT30.Old,nT30.size,nT30.Resize,nT30.Test[1]; //----++ <<< Объявление функции T3Series0() >>> +SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS+ double T3Series0 ( int nT30.number, int nT30.din, int nT30.MaxBar, int nT30.limit, int nT30.Curvature, int nT30.Period, double dT30.series, int nT30.bar, int& nT30.reset ) //SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS+ { nT30.num=nT30.number; nT30.reset=1; //=====+ <<< Проверки на ошибки >>> ==============================================================================+ if (nT30.bar==nT30.limit) { //----++ проверка на инициализацию функции T3Series0() if(nT30.Resize<1) { Print("T3Series0 number ="+nT30.num+ ". Не было сделано изменение размеров буферных переменных функцией T3Series0Resize()"); if(nT30.Resize==0) Print("T3Series0 number ="+nT30.num+ ". Следует дописать обращение к функции T3Series0Resize() в блок инициализации"); return(0.0); } //----++ проверка на ошибку в исполнении программного кода, предшествовавшего функции T3Series0() nT30.Error=GetLastError(); if(nT30.Error>4000) { Print("T3Series0 number ="+nT30.num+ ". В коде, предшествующем обращению к функции T3Series0() number = " +nT30.num+" ошибка!!!"); Print("T3Series0 number ="+nT30.num+ ". ",T3_ErrDescr0(nT30.Error)); } //----++ проверка на ошибку в задании переменных nT30.number и nT30Resize.Size nT30.size=ArraySize(dT30.e1); if (nT30.size< nT30.num) { Print("T3Series0 number ="+nT30.num+ ". Ошибка!!! Неправильно задано значение переменной nT30.number=" +nT30.num+" функции T3Series0()"); Print("T3Series0 number ="+nT30.num+ ". Или неправильно задано значение переменной nT30Resize.Size=" +nT30.size+" функции T3Series0Resize()"); return(0.0); } } //----++ +--------------------------------------------------------------------------------------------------------+ if (nT30.bar>nT30.MaxBar){nT30.reset=0;return(0.0);} if((nT30.bar==nT30.MaxBar)||(nT30.din!=0)) { //----++ <<< Расчёт коэффициентов >>> +SSSSSSSSSSSSSSSSSSSSSSSSSS+ nT30.Test[nT30.num]=1; double dT30.b=nT30.Curvature/100.0; dT30.b2[nT30.num]=dT30.b*dT30.b; dT30.b3[nT30.num]=dT30.b2[nT30.num]*dT30.b; dT30.c1[nT30.num]=-dT30.b3[nT30.num]; dT30.c2[nT30.num]=(3*(dT30.b2[nT30.num]+dT30.b3[nT30.num])); dT30.c3[nT30.num]=-3*(2*dT30.b2[nT30.num]+dT30.b+dT30.b3[nT30.num]); dT30.c4[nT30.num]=(1+3*dT30.b+dT30.b3[nT30.num]+3*dT30.b2[nT30.num]); if (nT30.Period<1) nT30.Period=1; dT30.n [nT30.num] = 1 + 0.5*(nT30.Period-1); dT30.w1[nT30.num] = 2 / (dT30.n[nT30.num] + 1); dT30.w2[nT30.num] = 1 - dT30.w1[nT30.num]; //----++SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS+ } if (nT30.Period<1)nT30.Period=1; //----++ проверка на ошибку в последовательности изменения переменной nT30.bar if((nT30.limit>=nT30.MaxBar)&&(nT30.bar==0)&&(nT30.din==0)) if((nT30.MaxBar>nT30.Period*3)&&(nT30.Test[nT30.num]==0)) Print("T3Series0 number ="+nT30.num+ ". Ошибка!!! Нарушена правильная последовательность изменения параметра nT30.bar внешним оператором цикла!!!"); if((nT30.bar==nT30.limit)&&(nT30.limit>> +SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS+ nT30.Tnew=Time[nT30.limit+1]; nT30.Old=nT30.TIME[nT30.num]; //--+ проверка на ошибки if(nT30.Tnew==nT30.Old) { dT30.e1[nT30.num]=dT30.E1[nT30.num]; dT30.e2[nT30.num]=dT30.E2[nT30.num]; dT30.e3[nT30.num]=dT30.E3[nT30.num]; dT30.e4[nT30.num]=dT30.E4[nT30.num]; dT30.e5[nT30.num]=dT30.E5[nT30.num]; dT30.e6[nT30.num]=dT30.E6[nT30.num]; } if(nT30.Tnew!=nT30.Old) { nT30.reset=-1; //--+ индикация ошибки в расчёте входного параметра T3.limit функции T3Series0() if (nT30.Tnew>nT30.Old) { Print("T3Series0 number ="+nT30.num+ ". Ошибка!!! Параметр nT30.limit функции T3Series0() меньше чем необходимо"); } else { int nT30.LimitERROR=nT30.limit+1-iBarShift(NULL,0,nT30.Old,TRUE); Print("T3Series0 number ="+nT30.num+ ". Ошибка!!! Параметр nT30.limit функции T3Series0() больше чем необходимо на " +nT30.LimitERROR+""); } //--+ return(0); } //----+SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS+ } //+--- Сохранение значений переменных +SSSS+ if((nT30.bar==0)&&(nT30.limit!=0)) { nT30.TIME[nT30.num]=Time[1]; dT30.E1[nT30.num]=dT30.e1[nT30.num]; dT30.E2[nT30.num]=dT30.e2[nT30.num]; dT30.E3[nT30.num]=dT30.e3[nT30.num]; dT30.E4[nT30.num]=dT30.e4[nT30.num]; dT30.E5[nT30.num]=dT30.e5[nT30.num]; dT30.E6[nT30.num]=dT30.e6[nT30.num]; } //+---+SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS+ //---- <<< вычисление dT30.T3 >>> --------------------------------------------------------------------+ dT30.e1[nT30.num] = dT30.w1[nT30.num]*dT30.series + dT30.w2[nT30.num]*dT30.e1[nT30.num]; dT30.e2[nT30.num] = dT30.w1[nT30.num]*dT30.e1[nT30.num] + dT30.w2[nT30.num]*dT30.e2[nT30.num]; dT30.e3[nT30.num] = dT30.w1[nT30.num]*dT30.e2[nT30.num] + dT30.w2[nT30.num]*dT30.e3[nT30.num]; dT30.e4[nT30.num] = dT30.w1[nT30.num]*dT30.e3[nT30.num] + dT30.w2[nT30.num]*dT30.e4[nT30.num]; dT30.e5[nT30.num] = dT30.w1[nT30.num]*dT30.e4[nT30.num] + dT30.w2[nT30.num]*dT30.e5[nT30.num]; dT30.e6[nT30.num] = dT30.w1[nT30.num]*dT30.e5[nT30.num] + dT30.w2[nT30.num]*dT30.e6[nT30.num]; //---- dT30.T3 = dT30.c1[nT30.num]*dT30.e6[nT30.num] + dT30.c2[nT30.num]*dT30.e5[nT30.num] + dT30.c3[nT30.num]*dT30.e4[nT30.num] + dT30.c4[nT30.num]*dT30.e3[nT30.num]; //---- -----------------------------------------------------------------------------------------------+ //----++ проверка на ошибку в исполнении программного кода функции T3Series0() nT30.Error=GetLastError(); if(nT30.Error>4000) { Print("T3Series0 number ="+nT30.num+". При исполнении функции T3Series0() произошла ошибка!!!"); Print("T3Series0 number ="+nT30.num+ ". ",T3_ErrDescr0(nT30.Error)); return(0.0); } nT30.reset=0; if (nT30.bar>> +SSSSSSSSSSSSSSSS+ if(ArrayResize(dT30.e1, nT30Resize.Size)==0){nT30Resize.reset=-1;break;} if(ArrayResize(dT30.e2, nT30Resize.Size)==0){nT30Resize.reset=-1;break;} if(ArrayResize(dT30.e3, nT30Resize.Size)==0){nT30Resize.reset=-1;break;} if(ArrayResize(dT30.e4, nT30Resize.Size)==0){nT30Resize.reset=-1;break;} if(ArrayResize(dT30.e5, nT30Resize.Size)==0){nT30Resize.reset=-1;break;} if(ArrayResize(dT30.e6, nT30Resize.Size)==0){nT30Resize.reset=-1;break;} if(ArrayResize(dT30.E1, nT30Resize.Size)==0){nT30Resize.reset=-1;break;} if(ArrayResize(dT30.E2, nT30Resize.Size)==0){nT30Resize.reset=-1;break;} if(ArrayResize(dT30.E3, nT30Resize.Size)==0){nT30Resize.reset=-1;break;} if(ArrayResize(dT30.E4, nT30Resize.Size)==0){nT30Resize.reset=-1;break;} if(ArrayResize(dT30.E5, nT30Resize.Size)==0){nT30Resize.reset=-1;break;} if(ArrayResize(dT30.E6, nT30Resize.Size)==0){nT30Resize.reset=-1;break;} if(ArrayResize(dT30.n, nT30Resize.Size)==0){nT30Resize.reset=-1;break;} if(ArrayResize(dT30.c1, nT30Resize.Size)==0){nT30Resize.reset=-1;break;} if(ArrayResize(dT30.c2, nT30Resize.Size)==0){nT30Resize.reset=-1;break;} if(ArrayResize(dT30.c3, nT30Resize.Size)==0){nT30Resize.reset=-1;break;} if(ArrayResize(dT30.c4, nT30Resize.Size)==0){nT30Resize.reset=-1;break;} if(ArrayResize(dT30.w1, nT30Resize.Size)==0){nT30Resize.reset=-1;break;} if(ArrayResize(dT30.w2, nT30Resize.Size)==0){nT30Resize.reset=-1;break;} if(ArrayResize(dT30.b2, nT30Resize.Size)==0){nT30Resize.reset=-1;break;} if(ArrayResize(dT30.b3, nT30Resize.Size)==0){nT30Resize.reset=-1;break;} if(ArrayResize(nT30.TIME,nT30Resize.Size)==0){nT30Resize.reset=-1;break;} if(ArrayResize(nT30.Test,nT30Resize.Size)==0){nT30Resize.reset=-1;break;} //----++SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS+ nT30Resize.cycle=1; } //--+ if(nT30Resize.reset==-1) { Print("T3Series0Resize: Ошибка!!! Не удалось изменить размеры буферных переменных функции T3Series0()."); int nT30Resize.Error=GetLastError(); if(nT30Resize.Error>4000)Print("T3Series0Resize: ",T3_ErrDescr0(nT30Resize.Error)); nT30.Resize=-2; return(0); } else { Print("T3Series0Resize: T3Series0 Size = "+nT30Resize.Size+""); nT30.Resize=nT30Resize.Size; return(nT30Resize.Size); } //----+ } //--+ --------------------------------------------------------------------------------------------+ /* //+SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS+ T3Series0Alert - Это дополнительная функция для индикации ошибки в задании внешних переменных | функции T3Series0. | -------------------------- входные параметры -------------------------- | T3Series0Alert.Number | T3Series0Alert.ExternVar значение внешней переменной для параметра nT30.Length | T3Series0Alert.name имя внешней переменной или nT30.Phase, если T3Series0Alert.Number=1 | -------------------------- Пример использования ----------------------- | int init() | //---- | Здесь какая-то иницмализация переменных и буферов | | //---- установка алертов на недопустимые значения внешних переменных | T3Series0Alert(0,"Length1",Length1); | T3Series0Alert(0,"Length2",Length2); | //---- завершение инициализации | return(0); | } | //+SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS+ */ void T3Series0Alert ( int T3Series0Alert.Number, string T3Series0Alert.name, int T3Series0Alert.ExternVar ) { //---- установка алертов на недопустимые значения входных параметров ==========================+ if(T3Series0Alert.Number==0)if(T3Series0Alert.ExternVar<1) {Alert("Параметр "+T3Series0Alert.name+" должен быть не менее 1" + " Вы ввели недопустимое " +T3Series0Alert.ExternVar+ " будет использовано 1" );} /* if(T3Series0Alert.Number==1) { if(T3Series0Alert.ExternVar<-100) {Alert("Параметр "+T3Series0Alert.name+" должен быть от -100 до +100" + " Вы ввели недопустимое "+T3Series0Alert.ExternVar+ " будет использовано -100");} if(T3Series0Alert.ExternVar> 100) {Alert("Параметр "+T3Series0Alert.name+" должен быть от -100 до +100" + " Вы ввели недопустимое "+T3Series0Alert.ExternVar+ " будет использовано 100");} } */ } //--+ -------------------------------------------------------------------------------------------+ // перевод сделан Николаем Косициным 01.12.2006 //+------------------------------------------------------------------+ //| T3_ErrDescr0_RUS(MQL4).mqh | //| Copyright © 2004, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ string T3_ErrDescr0(int error_code) { string error_string; //---- switch(error_code) { //---- MQL4 ошибки case 4000: error_string="Код ошибки = "+error_code+". нет ошибки"; break; case 4001: error_string="Код ошибки = "+error_code+". Неправильный указатель функции"; break; case 4002: error_string="Код ошибки = "+error_code+". индекс массива не соответствует его размеру"; break; case 4003: error_string="Код ошибки = "+error_code+". Нет памяти для стека функций"; break; case 4004: error_string="Код ошибки = "+error_code+". Переполнение стека после рекурсивного вызова"; break; case 4005: error_string="Код ошибки = "+error_code+". На стеке нет памяти для передачи параметров"; break; case 4006: error_string="Код ошибки = "+error_code+". Нет памяти для строкового параметра"; break; case 4007: error_string="Код ошибки = "+error_code+". Нет памяти для временной строки"; break; case 4008: error_string="Код ошибки = "+error_code+". Неинициализированная строка"; break; case 4009: error_string="Код ошибки = "+error_code+". Неинициализированная строка в массиве"; break; case 4010: error_string="Код ошибки = "+error_code+". Нет памяти для строкового массива"; break; case 4011: error_string="Код ошибки = "+error_code+". Слишком длинная строка"; break; case 4012: error_string="Код ошибки = "+error_code+". Остаток от деления на ноль"; break; case 4013: error_string="Код ошибки = "+error_code+". Деление на ноль"; break; case 4014: error_string="Код ошибки = "+error_code+". Неизвестная команда"; break; case 4015: error_string="Код ошибки = "+error_code+". Неправильный переход (never generated error)"; break; case 4016: error_string="Код ошибки = "+error_code+". Неинициализированный массив"; break; case 4017: error_string="Код ошибки = "+error_code+". Вызовы DLL не разрешены"; break; case 4018: error_string="Код ошибки = "+error_code+". Невозможно загрузить библиотеку"; break; case 4019: error_string="Код ошибки = "+error_code+". Невозможно вызвать функцию"; break; case 4020: error_string="Код ошибки = "+error_code+". Вызовы внешних библиотечных функций не разрешены"; break; case 4021: error_string="Код ошибки = "+error_code+". Недостаточно памяти для строки, возвращаемой из функции"; break; case 4022: error_string="Код ошибки = "+error_code+". Система занята (never generated error)"; break; case 4050: error_string="Код ошибки = "+error_code+". Неправильное количество параметров функции"; break; case 4051: error_string="Код ошибки = "+error_code+". Недопустимое значение параметра функции"; break; case 4052: error_string="Код ошибки = "+error_code+". Внутренняя ошибка строковой функции"; break; case 4053: error_string="Код ошибки = "+error_code+". Ошибка массива"; break; case 4054: error_string="Код ошибки = "+error_code+". Неправильное использование массива-таймсерии"; break; case 4055: error_string="Код ошибки = "+error_code+". Ошибка пользовательского индикатора"; break; case 4056: error_string="Код ошибки = "+error_code+". Массивы несовместимы"; break; case 4057: error_string="Код ошибки = "+error_code+". Ошибка обработки глобальныех переменных"; break; case 4058: error_string="Код ошибки = "+error_code+". Глобальная переменная не обнаружена"; break; case 4059: error_string="Код ошибки = "+error_code+". Функция не разрешена в тестовом режиме"; break; case 4060: error_string="Код ошибки = "+error_code+". Функция не подтверждена"; break; case 4061: error_string="Код ошибки = "+error_code+". Ошибка отправки почты"; break; case 4062: error_string="Код ошибки = "+error_code+". Ожидается параметр типа string"; break; case 4063: error_string="Код ошибки = "+error_code+". Ожидается параметр типа integer"; break; case 4064: error_string="Код ошибки = "+error_code+". Ожидается параметр типа double"; break; case 4065: error_string="Код ошибки = "+error_code+". В качестве параметра ожидается массив"; break; case 4066: error_string="Код ошибки = "+error_code+". Запрошенные исторические данные в состоянии обновления"; break; case 4067: error_string="Код ошибки = "+error_code+". Ошибка при выполнении торговой операции"; break; case 4099: error_string="Код ошибки = "+error_code+". Конец файла"; break; case 4100: error_string="Код ошибки = "+error_code+". Ошибка при работе с файлом"; break; case 4101: error_string="Код ошибки = "+error_code+". Неправильное имя файла"; break; case 4102: error_string="Код ошибки = "+error_code+". Слишком много открытых файлов"; break; case 4103: error_string="Код ошибки = "+error_code+". Невозможно открыть файл"; break; case 4104: error_string="Код ошибки = "+error_code+". Несовместимый режим доступа к файлу"; break; case 4105: error_string="Код ошибки = "+error_code+". Ни один ордер не выбран"; break; case 4106: error_string="Код ошибки = "+error_code+". Неизвестный символ"; break; case 4107: error_string="Код ошибки = "+error_code+". Неправильный параметр цены для торговой функции"; break; case 4108: error_string="Код ошибки = "+error_code+". Неверный номер тикета"; break; case 4109: error_string="Код ошибки = "+error_code+". Торговля не разрешена"; break; case 4110: error_string="Код ошибки = "+error_code+". Длинные позиции не разрешены"; break; case 4111: error_string="Код ошибки = "+error_code+". Короткие позиции не разрешены"; break; case 4200: error_string="Код ошибки = "+error_code+". Объект уже существует"; break; case 4201: error_string="Код ошибки = "+error_code+". Запрошено неизвестное свойство объекта"; break; case 4202: error_string="Код ошибки = "+error_code+". Объект не существует"; break; case 4203: error_string="Код ошибки = "+error_code+". Неизвестный тип объекта"; break; case 4204: error_string="Код ошибки = "+error_code+". Нет имени объекта"; break; case 4205: error_string="Код ошибки = "+error_code+". Ошибка координат объекта"; break; case 4206: error_string="Код ошибки = "+error_code+". Не найдено указанное подокно"; break; case 4207: error_string="Код ошибки = "+error_code+". Ошибка при работе с объектом"; break; default: error_string="Код ошибки = "+error_code+". неизвестная ошибка"; } //---- return(error_string); } //+------------------------------------------------------------------+