//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ //| b-PSI@Base.mq4 | //| Copyright © 2012, Igor Stepovoi aka TarasBY | //| taras_bulba@tut.by | //| 17.03.2012 Библиотека базовых функций. | //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ //| Данный продукт предназначен для некомерческого использования. Публикация разре- | //|шена только при указании имени автора (TarasBY). Редактирование исходного кода до- | //|пустима только при условии сохранения данного текста, ссылок и имени автора. Про- | //|дажа библиотеки или отдельных её частей ЗАПРЕЩЕНА. | //| Автор не несёт ответственности за возможные убытки, полученные в результате ис- | //|пользования библиотеки. | //| По всем вопросам, связанным с работой библиотеки, замечаниями или предложениями | //|по её доработке обращаться на Skype: TarasBY или e-mail. | //+-----------------------------------------------------------------------------------+ //| This product is intended for non-commercial use. The publication is only allo- | //|wed when you specify the name of the author (TarasBY). Edit the source code is va- | //|lid only under condition of preservation of the text, links and author's name. | //| Selling a module or(and) parts of it PROHIBITED. | //| The author is not liable for any damages resulting from the use of a module. | //| For all matters relating to the work of the module, comments or suggestions for | //|their improvement in the contact Skype: TarasBY or e-mail. | //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ #property copyright "Copyright © 2008-12, TarasBY WM R418875277808; Z670270286972" #property link "taras_bulba@tut.by" #property library //IIIIIIIIIIIIIIIIIII==================CONSTANS=================IIIIIIIIIIIIIIIIIIIIII+ //IIIIIIIIIIIIIIIIIII========Глобальные переменные модуля=======IIIIIIIIIIIIIIIIIIIIII+ //IIIIIIIIIIIIIIIIIII=========Подключение внешних модулей=======IIIIIIIIIIIIIIIIIIIIII+ //IIIIIIIIIIIIIIIIIII===========Перечень функций модуля=========IIIIIIIIIIIIIIIIIIIIII+ //|***********************************************************************************| //| РАЗДЕЛ: Общие функции | //|***********************************************************************************| //double fGet_Point (string fs_Symbol = "") // Функция, гарантированного получения Point /*bool fCCV_D (double fd_Value, // Проверяемый параметр int fi_IND)*/ // индекс параметра в массиве // Фиксирует факт изменения проверяемого double параметра /*bool fCCV_S (string fs_Value, // Проверяемый параметр int fi_IND)*/ // индекс параметра в массиве // Фиксирует факт изменения проверяемого string параметра /*bool fCCV_B (bool fb_Value, // Проверяемый параметр int fi_IND)*/ // индекс параметра в массиве // Фиксирует факт изменения проверяемого bool параметра //string fGet_NameOP (int fi_Type) // Функция возвращает наименование торговой операции //string fGet_NameTF (int fi_TF) // Возвращает наименование таймфрейма //string fGet_SignCurrency() // Функция возвращает значёк валюты депозита //string CheckBOOL (int M) // Возвращает наименование состояния (ДА\НЕТ) //string fGet_TimeToStr (datetime fdt_Time) // Возвращает продолжительность периода в D:H:M //double IIFd (bool condition, double ifTrue, double ifFalse) // Возвращает одно из двух значений DOUBLE в зависимости от условия //string IIFs (bool condition, string ifTrue, string ifFalse) // Возвращает одно из двух значений STRING в зависимости от условия //color IIFc (bool condition, color ifTrue, color ifFalse) // Возвращает одно из двух значений COLOR в зависимости от условия //|***********************************************************************************| //| РАЗДЕЛ: Работы с массивами | //|***********************************************************************************| /*int fGet_INDInArrayINT (int fi_Value, // Искомый элемент int ar_Array[])*/ // Проверяемый массив // Получаем индекс искомого элемента в массиве int /*int fGet_INDInArraySTR (string fs_Value, // Искомый элемент string ar_Array[])*/ // Проверяемый массив // Получаем индекс искомого элемента в массиве string //int fGet_NumPeriods (int fi_Period)// Получаем номер периода графика //void InitializeArray_STR (string& fsa_Array[], string fs_Value = "") // Инициализируем массив STRING /*void fCreat_ArrayGV (string& ar_Base[], // рабочий массив string ar_Add[])*/ // добавляемы массив // Создаём массив имён временных GV-переменных /*int fSplitStrToStr (string fs_List, // строка с данными string& ar_OUT[], // возвращаемый массив string fs_Delimiter = ",")*/ // разделитель данных в строке // Возвращает массив STRING из строки, разделённой sDelimiter /*void fCreat_StrToInt (string ar_Value[], // массив элементов string int& ar_OUT[], // возвращаемый массив int int fi_IND, // количество ячеек в массиве int fi_Factor = 1, // множитель string fs_NameArray = "")*/// имя возвращаемого массива // Возвращает массив INT из элементов массива STRING /*void fCreat_StrToDouble (string ar_Value[], // массив элементов string double& ar_OUT[], // возвращаемый массив double int fi_IND, // количество ячеек в массиве double fd_Factor = 1.0, // множитель string fs_NameArray = "")*/// имя возвращаемого массива // Возвращает массив DOUBLE из элементов массива STRING /*string fCreat_StrAndArray (int fi_First, // значение 1-го эелемента массива int& ar_OUT[], // возвращаемый массив int int fi_cntIND, // количество элементов в массиве string fs_Delimiter = ",")*/// разделитель элементов в возвращаемой строке // Возвращает строку из элементов массива INT и сам массив /*string fCreat_StrFromArray (string ar_Array[], // массив со значениями string fs_Delimiter = ",")*/// разделитель элементов в возвращаемой строке // Возвращает строку из элементов массива, разделённых fs_Delimiter /*int fInit_ArrayINT (int& ar_INT[], // Инициализируемый массив string fs_List, // Инициализируемые значения в строке int fi_Range, // Размер массива double fd_Factor = 1.0, // множитель string fs_NameArray = "", // имя возвращаемого массива string fs_Delimiter = ",")*/ // Разделитель значений в строке // Инициализация рабочего массива int /*int fInit_ArrayDBL (double& ar_DBL[], // Инициализируемый массив string fs_List, // Инициализируемые значения в строке int fi_Range, // Размер массива double fd_Factor = 1.0, // множитель string fs_NameArray = "", // имя возвращаемого массива string fs_Delimiter = ",")*/ // Разделитель значений в строке // Инициализация рабочего массива double /*int fInit_ArrayBOOL (bool& ar_BOOL[], // Инициализируемый массив string fs_List, // Инициализируемые значения в строке int fi_Range, // Размер массива double fd_Factor = 1.0, // множитель string fs_NameArray = "", // имя возвращаемого массива string fs_Delimiter = ",")*/// Разделитель значений в строке // Инициализация рабочего массива bool /*void fShiftIndex (double& ar_MAS[], // массив значений bool fb_Conditions = false)*/ // разрешение на увеличение размерности массива // Освобождаем 0-ячейку со сдвигом вверх для записи текущих значений /*double fChoiceSource (string fs_Symbol, // Symbol int fi_Bar, // Bar datetime fdt_Time, // Time int fi_TF, // Period double fda_Array[][], // массив с альтернативными котировками int fi_NSource, // индекс в 1-ом измерении массива bool fb_IsBufffer = true)*/// флаг "родной" истории // Альтернатива индикаторному буферу /*void fRun_Sort (int& ar_INDEX[], // массив индексов для сортировки double fda_Value[])*/ // массив значений // Сортируем индексы массива по убыванию //|***********************************************************************************| //| РАЗДЕЛ: Сервисных функций | //|***********************************************************************************| /*double fGet_ValueFromGV (string fs_Name, // имя GV-переменной double fd_Value, // если такой переменной нет, подставляемое значение bool fd_Condition = true,// условие на проверку наличия GV-переменной bool fd_CreatGV = false)*/// Разрешение на создание GV (если её нет) // Берём значение переменной или из GV, или (при её отстутствии) fd_Value //void fClear_GV (int fi_cnt = 5000) // кол-во очищаемых объектов (тикетов) // Подчищаем возможно оставшиеся GV-переменные /*void fPrintAlert (string fs_Symbol, // Symbol int fi_TF, // Таймфрейм int fi_IND)*/ // номер индекса в массиве // Предупреждаем об отсутствии истории на баре //+===================================================================================+ //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ //+===================================================================================+ //|***********************************************************************************| //| РАЗДЕЛ: Общие функции | //|***********************************************************************************| //+===================================================================================+ //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ //| Автор : TarasBY, taras_bulba@tut.by | //+-----------------------------------------------------------------------------------+ //| Функция, гарантированного получения Point | //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ double fGet_Point (string fs_Symbol = "") { double ld_Point = 0.0; //---- if (fs_Symbol == "") {fs_Symbol = Symbol();} ld_Point = MarketInfo (fs_Symbol, MODE_POINT); //---- Если результата нет if (ld_Point == 0.0) { int li_Digits = MarketInfo (fs_Symbol, MODE_DIGITS); if (li_Digits > 0) {ld_Point = 1.0 / MathPow (10, li_Digits);} } else {return (ld_Point);} //---- return (ld_Point); } //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ //| Автор : TarasBY, taras_bulba@tut.by | //+-----------------------------------------------------------------------------------+ //| Версия : 27.10.2009 (fControlChangeValue_D) | //| Описание : Фиксирует факт изменения проверяемого параметра | //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ bool fCCV_D (double fd_Value, // Проверяемый параметр int fi_IND) // индекс параметра в массиве { static double lda_Values[20]; static bool lb_first = true; //---- //---- При первом запуске инициализируем массив if (lb_first) {ArrayInitialize (lda_Values, 0.0); lb_first = false;} else if (lda_Values[fi_IND] != fd_Value) {lda_Values[fi_IND] = fd_Value; return (true);} //---- return (false); } //+-----------------------------------------------------------------------------------+ bool fCCV_S (string fs_Value, // Проверяемый параметр int fi_IND) // индекс параметра в массиве { static string lsa_Values[20]; static bool lb_first = true; //---- //---- При первом запуске инициализируем массив if (lb_first) {InitializeArray_STR (lsa_Values, ""); lb_first = false;} else if (lsa_Values[fi_IND] != fs_Value) {lsa_Values[fi_IND] = fs_Value; return (true);} //---- return (false); } //+-----------------------------------------------------------------------------------+ bool fCCV_B (bool fb_Value, // Проверяемый параметр int fi_IND) // индекс параметра в массиве { static bool lba_Values[20], lb_first = true; //---- //---- При первом запуске инициализируем массив if (lb_first) {ArrayInitialize (lba_Values, False); lb_first = false;} else if (lba_Values[fi_IND] != fb_Value) {lba_Values[fi_IND] = fb_Value; return (true);} //---- return (false); } //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ //| Автор : TarasBY, taras_bulba@tut.by | //+-----------------------------------------------------------------------------------+ //| Функция возвращает наименование торговой операции | //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ string fGet_NameOP (int fi_Type) { //---- switch (fi_Type) { case -2 : return ("trading"); case -1 : return ("ALL"); case OP_BUY : return ("BUY"); case OP_SELL : return ("SELL"); case OP_BUYLIMIT : return ("BUYLIMIT"); case OP_SELLLIMIT: return ("SELLLIMIT"); case OP_BUYSTOP : return ("BUYSTOP"); case OP_SELLSTOP : return ("SELLSTOP"); case 6 : if (OrderType() == 6) return ("balance"); else return ("UNI"); case 7 : return ("pending"); } return (StringConcatenate ("None (", fi_Type, ")")); //---- } //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ //| Автор : TarasBY, taras_bulba@tut.by | //+-----------------------------------------------------------------------------------+ //| Возвращает наименование таймфрейма | //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ string fGet_NameTF (int fi_TF) { //---- if (fi_TF == 0) fi_TF = Period(); switch (fi_TF) { case PERIOD_M1: return ("M1"); case PERIOD_M5: return ("M5"); case PERIOD_M15: return ("M15"); case PERIOD_M30: return ("M30"); case PERIOD_H1: return ("H1"); case PERIOD_H4: return ("H4"); case PERIOD_D1: return ("D1"); case PERIOD_W1: return ("W1"); case PERIOD_MN1: return ("MN1"); } //---- return ("UnknownPeriod"); } //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ //| Автор : TarasBY, taras_bulba@tut.by | //+-----------------------------------------------------------------------------------+ //| Функция возвращает значёк валюты депозита | //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ string fGet_SignCurrency() { //---- if (AccountCurrency() == "USD") return ("$"); if (AccountCurrency() == "EUR") return ("€"); //---- return ("RUB"); } //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ //| Автор : TarasBY, taras_bulba@tut.by | //+-----------------------------------------------------------------------------------+ //| Возвращает наименование состояния (ДА\НЕТ) | //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ string CheckBOOL (int M) { //---- switch (M) { case 0: return ("OFF"); case 1: return ("ON"); } //---- return ("Don`t know..."); } //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ //| Автор : TarasBY, taras_bulba@tut.by | //+-----------------------------------------------------------------------------------+ //| Возвращает продолжительность периода в D:H:M | //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ string fGet_TimeToStr (datetime fdt_Time) { int li_Day = fdt_Time / (1440 * 60); //---- //---- return (StringConcatenate (li_Day, ":", TimeToStr (fdt_Time, TIME_MINUTES))); } //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+-----------------------------------------------------------------------------------+ //| Версия : 01.02.2008 | //| Описание : Возвращает одно из двух значений взависимости от условия. | //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ double IIFd (bool condition, double ifTrue, double ifFalse) {if (condition) {return (ifTrue);} else return (ifFalse);} //+-----------------------------------------------------------------------------------+ string IIFs (bool condition, string ifTrue, string ifFalse) {if (condition) {return (ifTrue);} else return (ifFalse);} //+-----------------------------------------------------------------------------------+ color IIFc (bool condition, color ifTrue, color ifFalse) {if (condition) {return (ifTrue);} else return (ifFalse);} //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ //+===================================================================================+ //|***********************************************************************************| //| РАЗДЕЛ: Работы с массивами | //|***********************************************************************************| //+===================================================================================+ //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ //| Автор : TarasBY, taras_bulba@tut.by | //+-----------------------------------------------------------------------------------+ //| UNI: Получаем индекс искомого элемента в массиве | //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ int fGet_INDInArrayINT (int fi_Value, // Искомый элемент int ar_Array[]) // Проверяемый массив { //---- for (int li_IND = 0; li_IND < ArraySize (ar_Array); li_IND++) {if (ar_Array[li_IND] == fi_Value) return (li_IND);} //---- return (-1); } //+-----------------------------------------------------------------------------------+ int fGet_INDInArraySTR (string fs_Value, string ar_Array[]) { //---- for (int li_IND = 0; li_IND < ArraySize (ar_Array); li_IND++) {if (ar_Array[li_IND] == fs_Value) return (li_IND);} //---- return (-1); } //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ //| Автор : TarasBY, taras_bulba@tut.by | //+-----------------------------------------------------------------------------------+ //| UNI: Получаем номер периода графика | //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ int fGet_NumPeriods (int fi_Period) { static int lia_Periods[] = {1,5,15,30,60,240,1440,10080,43200}; //---- for (int l_int = 0; l_int < ArraySize (lia_Periods); l_int++) {if (lia_Periods[l_int] == fi_Period) return (l_int);} //---- return (-1); } //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ //| Автор : TarasBY, taras_bulba@tut.by | //+-----------------------------------------------------------------------------------+ //| UNI: Инициализируем Value массив STRING | //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ void InitializeArray_STR (string& fsa_Array[], string fs_Value = "") { int l_int, size = ArraySize (fsa_Array); //---- for (l_int = 0; l_int < size; l_int++) {fsa_Array[l_int] = fs_Value;} //---- } //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ //| Автор : TarasBY, taras_bulba@tut.by | //+-----------------------------------------------------------------------------------+ //| Создаём массив имён временных GV-переменных | //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ void fCreat_ArrayGV (string& ar_Base[], // рабочий массив string ar_Add[]) // добавляемый массив { int li_int, li_sizeB = ArraySize (ar_Base), li_sizeA = ArraySize (ar_Add); bool lb_duble; //---- for (int li_IND = 0; li_IND < li_sizeA; li_IND++) { lb_duble = false; //---- Осуществляем проверку на дубликаты for (li_int = 0; li_int < li_sizeB; li_int++) { if (ar_Add[li_IND] == ar_Base[li_int]) {lb_duble = true; break;} } //---- Если дубликат - идём дальше if (lb_duble) continue; //---- Увеличиваем счётчик li_sizeB++; //---- Увеличиваем базовый массив ArrayResize (ar_Base, li_sizeB); //---- Вносим в последнюю ячейку новое значение ar_Base[li_sizeB - 1] = ar_Add[li_IND]; } //---- } //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ //| Автор : TarasBY, taras_bulba@tut.by | //+-----------------------------------------------------------------------------------+ //| Возвращает массив STRING из строки, разделённой sDelimiter | //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ int fSplitStrToStr (string fs_List, // строка с данными string& ar_OUT[], // возвращаемый массив string fs_Delimiter = ",") // разделитель данных в строке { string tmp_str = "", tmp_char = ""; //---- ArrayResize (ar_OUT, 0); for (int i = 0; i < StringLen (fs_List); i++) { tmp_char = StringSubstr (fs_List, i, 1); if (tmp_char == fs_Delimiter) { if (StringTrimLeft (StringTrimRight (tmp_str)) != "") { ArrayResize (ar_OUT, ArraySize (ar_OUT) + 1); ar_OUT[ArraySize (ar_OUT) - 1] = tmp_str; } tmp_str = ""; } else {if (tmp_char != " ") tmp_str = tmp_str + tmp_char;} } if (StringTrimLeft (StringTrimRight (tmp_str)) != "") { ArrayResize (ar_OUT, ArraySize (ar_OUT) + 1); ar_OUT[ArraySize (ar_OUT) - 1] = tmp_str; } //---- return (ArraySize (ar_OUT)); } //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ //| Автор : TarasBY, taras_bulba@tut.by | //+-----------------------------------------------------------------------------------+ //| Возвращает массив INT из элементов массива STRING | //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ void fCreat_StrToInt (string ar_Value[], // массив элементов string int& ar_OUT[], // возвращаемый массив int int fi_IND, // количество ячеек в массиве int fi_Factor = 1, // множитель string fs_NameArray = "") // имя возвращаемого массива { int li_size = ArraySize (ar_Value); string ls_row = ""; //---- ArrayResize (ar_OUT, fi_IND); for (int li_int = 0; li_int < fi_IND; li_int++) { if (li_int < li_size) {ar_OUT[li_int] = StrToInteger (ar_Value[li_int]) * fi_Factor;} else {ar_OUT[li_int] = StrToDouble (ar_Value[li_size - 1]) * fi_Factor;} ls_row = StringConcatenate (ls_row, fs_NameArray, "[", li_int, "] = ", ar_OUT[li_int], "; "); } if (fs_NameArray != "") Print (ls_row); //---- } //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ //| Автор : TarasBY, taras_bulba@tut.by | //+-----------------------------------------------------------------------------------+ //| Возвращает массив DOUBLE из элементов массива STRING | //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ void fCreat_StrToDouble (string ar_Value[], // массив элементов string double& ar_OUT[], // возвращаемый массив double int fi_IND, // количество ячеек в массиве double fd_Factor = 1.0, // множитель string fs_NameArray = "") // имя возвращаемого массива { int li_size = ArraySize (ar_Value); string ls_row = ""; //---- ArrayResize (ar_OUT, fi_IND); for (int li_int = 0; li_int < fi_IND; li_int++) { if (li_int < li_size) {ar_OUT[li_int] = StrToDouble (ar_Value[li_int]) * fd_Factor;} else {ar_OUT[li_int] = StrToDouble (ar_Value[li_size - 1]) * fd_Factor;} ls_row = StringConcatenate (ls_row, fs_NameArray, "[", li_int, "] = ", ar_OUT[li_int], "; "); } if (fs_NameArray != "") Print (ls_row); //---- } //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ //| Автор : TarasBY, taras_bulba@tut.by | //+-----------------------------------------------------------------------------------+ //| Возвращает строку из элементов массива INT и сам массив | //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ string fCreat_StrAndArray (int fi_First, // значение 1-го эелемента массива int& ar_OUT[], // возвращаемый массив int int fi_cntIND, // количество элементов в массиве string fs_Delimiter = ",") // разделитель элементов в возвращаемой строке { string ls_row = ""; //---- ArrayResize (ar_OUT, fi_cntIND); for (int li_int = 0; li_int < fi_cntIND; li_int++) { if (li_int == fi_cntIND - 1) fs_Delimiter = ""; ar_OUT[li_int] = fi_First + li_int; ls_row = StringConcatenate (ls_row, ar_OUT[li_int], fs_Delimiter); } //---- return (ls_row); } //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ //| Автор : TarasBY, taras_bulba@tut.by | //+-----------------------------------------------------------------------------------+ //| Возвращает строку из элементов массива, разделённых fs_Delimiter | //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ string fCreat_StrFromArray (string ar_Array[], // массив со значениями string fs_Delimiter = ",") // разделитель элементов в возвращаемой строке { string ls_row = ""; int li_size = ArraySize (ar_Array); //---- for (int li_int = 0; li_int < li_size; li_int++) { if (li_int == li_size - 1) fs_Delimiter = ""; ls_row = StringConcatenate (ls_row, ar_Array[li_int], fs_Delimiter); } //---- return (ls_row); } //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ //| Автор : TarasBY, taras_bulba@tut.by | //+-----------------------------------------------------------------------------------+ //| Версия : 02.08.2012 | //| Описание : Инициализация рабочего массива. | //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ int fInit_ArrayINT (int& ar_INT[], // Инициализируемый массив string fs_List, // Инициализируемые значения в строке int fi_Range, // Размер массива double fd_Factor = 1.0, // множитель string fs_NameArray = "", // имя возвращаемого массива string fs_Delimiter = ",") // Разделитель значений в строке { //---- //---- Ищем в строке разделитель - признак наличия в строке > 1 параметра if (StringFind (fs_List, fs_Delimiter) == -1) return (1); else { string lsa_TMP[]; int li_cnt = fSplitStrToStr (fs_List, lsa_TMP, ","); if (fi_Range > 0) { if (li_cnt != fi_Range) { Print (fs_NameArray, ": не соотвествие в размерности массива !!!"); li_cnt = fi_Range; } } fCreat_StrToInt (lsa_TMP, ar_INT, li_cnt, fd_Factor, fs_NameArray); } //---- return (li_cnt); } //+-----------------------------------------------------------------------------------+ int fInit_ArrayDBL (double& ar_DBL[], // Инициализируемый массив string fs_List, // Инициализируемые значения в строке int fi_Range, // Размер массива double fd_Factor = 1.0, // множитель string fs_NameArray = "", // имя возвращаемого массива string fs_Delimiter = ",") // Разделитель значений в строке { //---- //---- Ищем в строке разделитель - признак наличия в строке > 1 параметра if (StringFind (fs_List, fs_Delimiter) == -1) return (1); else { string lsa_TMP[]; int li_cnt = fSplitStrToStr (fs_List, lsa_TMP, ","); if (fi_Range > 0) { if (li_cnt != fi_Range) { Print (fs_NameArray, ": не соотвествие в размерности массива !!!"); li_cnt = fi_Range; } } fCreat_StrToDouble (lsa_TMP, ar_DBL, li_cnt, fd_Factor, fs_NameArray); } //---- return (li_cnt); } //+-----------------------------------------------------------------------------------+ int fInit_ArrayBOOL (bool& ar_BOOL[], // Инициализируемый массив string fs_List, // Инициализируемые значения в строке int fi_Range, // Размер массива double fd_Factor = 1.0, // множитель string fs_NameArray = "", // имя возвращаемого массива string fs_Delimiter = ",") // Разделитель значений в строке { //---- //---- Ищем в строке разделитель - признак наличия в строке > 1 параметра if (StringFind (fs_List, fs_Delimiter) == -1) return (1); else { string lsa_TMP[]; int li_cnt = fSplitStrToStr (fs_List, lsa_TMP, ","), lia_TMP[]; if (fi_Range > 0) { if (li_cnt != fi_Range) { Print (fs_NameArray, ": не соотвествие в размерности массива !!!"); li_cnt = fi_Range; } } fCreat_StrToInt (lsa_TMP, lia_TMP, li_cnt, fd_Factor, fs_NameArray); } ArrayCopy (ar_BOOL, lia_TMP); //---- return (li_cnt); } //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ //| Автор : TarasBY, taras_bulba@tut.by | //+-----------------------------------------------------------------------------------+ //| Альтернатива индикаторному буферу | //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ double fChoiceSource (string fs_Symbol, // Symbol int fi_Bar, // Bar datetime fdt_Time, // Time int fi_TF, // Period double fda_Array[][], // массив с альтернативными котировками int fi_NSource, // индекс в 1-ом измерении массива bool fb_IsBufffer = true) // флаг "родной" истории { //---- if (fb_IsBufffer) { //---- Возвращаем значения из истории терминала switch (fi_NSource) { case 0: return (iOpen (fs_Symbol, fi_TF, fi_Bar)); case 1: return (iHigh (fs_Symbol, fi_TF, fi_Bar)); case 2: return (iLow (fs_Symbol, fi_TF, fi_Bar)); case 3: return (iClose (fs_Symbol, fi_TF, fi_Bar)); } } else { //---- Сверяемся по времени (синхронизация бара) if (fda_Array[fi_Bar][6] == fdt_Time) {return (fda_Array[fi_Bar][fi_NSource]);} else { for (int li_IND = 0; li_IND < ArrayRange (fda_Array, 0); li_IND++) { if (fdt_Time >= fda_Array[li_IND][6]) {return (fda_Array[li_IND][fi_NSource]);} } } } //---- return (0.0); } //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ //| Автор : TarasBY, taras_bulba@tut.by | //+-----------------------------------------------------------------------------------+ //| Освобождаем 0-ячейку со сдвигом вверх для записи текущих значений | //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ void fShiftIndex (double& ar_MAS[], // массив значений bool fb_Conditions = false) // разрешение на увеличение размерности массива { int li_size = ArraySize (ar_MAS); double lda_TMP[]; //---- //---- Задаём размер временному массиву ArrayResize (lda_TMP, li_size); //---- Копируем данные во временный массив ArrayCopy (lda_TMP, ar_MAS); //---- Если задано, увеличиваем размер исходного массива if (fb_Conditions) ArrayResize (ar_MAS, li_size + 1); //---- Обратно копируем данные из временного массива со здвигом на 1 ArrayCopy (ar_MAS, lda_TMP, 1); //---- Нулевую ячейку исходного массива обнуляем ar_MAS[0] = 0.0; //---- } //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ //| UNI: Сортируем индексы массива по убыванию | //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ void fRun_Sort (int& ar_INDEX[], // массив индексов для сортировки double fda_Value[]) // массив значений { int li_IND, li_int, li_tmp, li_size = ArraySize (fda_Value); //---- for (li_IND = 0; li_IND < li_size; li_IND++) {ar_INDEX[li_IND] = li_IND;} for (li_IND = 0; li_IND < li_size; li_IND++) { for (li_int = li_IND + 1; li_int < li_size; li_int++) { if (fda_Value[ar_INDEX[li_IND]] < fda_Value[ar_INDEX[li_int]]) { li_tmp = ar_INDEX[li_int]; ar_INDEX[li_int] = ar_INDEX[li_IND]; ar_INDEX[li_IND] = li_tmp; } } } //---- return; } //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ //+===================================================================================+ //|***********************************************************************************| //| РАЗДЕЛ: Сервисных функций | //|***********************************************************************************| //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ //| Автор : TarasBY, taras_bulba@tut.by | //+-----------------------------------------------------------------------------------+ // Берём значение переменной или из GV, или (при её отстутствии) fd_Value | //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ double fGet_ValueFromGV (string fs_Name, // имя GV-переменной double fd_Value, // если такой переменной нет, подставляемое значение bool fd_Condition = true, // условие на проверку наличия GV-переменной bool fd_CreatGV = false) // Разрешение на создание GV (если её нет) { //---- if (!fd_Condition) {return (fd_Value);} if (GlobalVariableCheck (fs_Name)) {return (GlobalVariableGet (fs_Name));} else {if (fd_CreatGV) {GlobalVariableSet (fs_Name, fd_Value);} return (fd_Value);} //---- } //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ //| Автор : TarasBY, taras_bulba@tut.by | //+-----------------------------------------------------------------------------------+ //| Подчищаем возможно оставшиеся GV-переменные | //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ void fClear_GV (int fi_cnt = 5000) // кол-во очищаемых объектов (тикетов) { string ls_Name, lsa_Name[] = {"_#Delta_SL","_#LastLossLevel","_#VirtSL", "_#VirtTP","_#BeginSL","_#SL","_#TP","_#Num","_#Lots","_#BU","_#STOP","_#OP"}; int li_size = ArraySize (lsa_Name), li_IND; //---- for (int li_CNT = 0; li_CNT < fi_cnt; li_CNT++) { for (li_IND = 0; li_IND < li_size; li_IND++) { ls_Name = StringConcatenate (li_CNT, lsa_Name[li_IND]); if (GlobalVariableCheck (ls_Name)) GlobalVariableDel (ls_Name); } } //---- } //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ //| Автор : TarasBY, taras_bulba@tut.by | //+-----------------------------------------------------------------------------------+ //| Предупреждаем об отсутствии истории на баре | //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+ void fPrintAlert (string fs_Symbol, // Symbol int fi_TF, // Таймфрейм int fi_IND) // номер индекса в массиве { static int lia_Minute[2] = {0,0}; //---- if (lia_Minute[fi_IND] != TimeMinute (TimeCurrent())) { lia_Minute[fi_IND] = TimeMinute (TimeCurrent()); Print (fs_Symbol, ": Нет истории на ", fGet_NameTF (fi_TF), " : ", TimeToStr (TimeCurrent())); } //---- } //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+