//+------------------------------------------------------------------+ //| buy_sell.mq4 | //| Unrealruslan | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Ruslan Mustafaev - Unrealruslan" #property link "ruslanmus@gmail.com" //---- input parameters //extern bool first_orders = false; // разрешение на запуск 2-х ордеров, покупки и продажи //extern double profit = 0.00100; // желаемый профит bool first_orders; int ticket_order_up, // стартовый ордер покупка ticket_order_down, // стартовый ордер продажа ticket_order_add_main, // дополнительный ордер ticket_order_add_second;// дополнительный ордер int i, // переменная цикла, используется при надобности k, // коэффициет умножения стартового лота magik, // идентификатор ордеров total, // общее количество ордеров slippage = 5, // проскальзывание цены control_start_orders, // контроль запуска начальных ордеров control_lavina_orders, // контроль запуска ордеров алгоритма Лавина start_lavina, // контроль включения алгоритма Лавина razvorot, // номер разворота Лавины err; // для контроля ошибок double profit, // желаемый профит (не забудь убрать как внешнюю переменную сверху) profit_all, // суммарный профит по всем ордерам lot_start, // начальный лот lot_add, // добавочный лот, используется в алгоритме Лавина a; // коэффициент для модифицированного алгоритма Лавина, для получения прибыли внутри канала, равен начальному лоту double level_up, // верхняя граница диапазона level_down, // нижняя граница диапазона start_price_buy, // цена покупки начального ордера start_price_sell; // цена продажи начального ордера datetime time_close_order_up, // время закрытия начального ордера покупка time_close_order_down; // время закрытия начального ордера продажа //---------------------------------------------------------------------------------------------------------------+ int init() { first_orders = true; lot_start = 0.1; k = 2; a = 0;//lot_start; // желательно чтобы был = 0 или = начальному лоту magik = 1; start_lavina = 0; // если 0 -то разворот запрещен, если 1 -то разворот сверху вниз разрешен, если (-1) -разворот снизу вверх разрешен razvorot = 0; // кол-во разворотов, меняется от 1 до ... control_start_orders = 0; control_lavina_orders = 0; //-------------------------+ ticket_order_up = -1; // стартовый ордер покупка ticket_order_down = -1; // стартовый ордер продажа ticket_order_add_main = -1; // дополнительный ордер ticket_order_add_second = -1; // дополнительный ордер return(0); } //------------------------------------------------ПОШЛИ ТИКИ------------------------------------------------------+ int start() { //======================================ОТКРЫВАЕМ ДВЕ НАЧАЛЬНЫЕ ПОЗИЦИИ===========================================+ if (first_orders == true) { profit = max_min (); //-для динамического изменения начального профита, чтобы двигаться по рынку, хотя может и не сработает first_orders = start_first_orders (first_orders); } //=ЗАКРЫВАЕМ ТОЛЬКО ОДИН НАЧАЛЬНЫЙ ОРДЕР ПРИ ДОСТИЖЕНИИ ЕГО ПРИБЫЛИ, ДРУГОЙ ОРДЕР ЕЩЕ ВИСИТ В УБЫТКЕ, ЗАДАЧА ЛАВИНЫ КОМПЕНСИРОВАТЬ ЕГО=+ if (control_start_orders == 1) { control_start_orders = close_first_orders (control_start_orders); } //===============================================ЛАВИНА===========================================================+ if (control_start_orders == -1) { razvorot = lavina (razvorot); // вызов функции реализующей алгоритм Лавина //-------------------ФИКСИРУЕМ УБЫТОК-------------------+ if (razvorot == 16) // лавина достигла максимального оборота, фиксируем убыток, можно ставить меньше 16 { will_close_all_orders (); //-------------------------+ start_lavina = 0; razvorot = 0; control_start_orders = 0; control_lavina_orders = 0; //-------------------------+ ticket_order_up = -1; ticket_order_down = -1; ticket_order_add_main = -1; ticket_order_add_second = -1; //-------------------------+ first_orders = false; // не запускаем начальные ордера Alert ("УВЫ, МЫ ПОЛУЧИЛИ БОЛЬШОЙ УБЫТОК. СОВЕТНИК ОСТАНОВЛЕН"); return(0); } //-------ПОДСЧЕТ ПРОФИТА И ЗАКРЫТИЕ ВСЕХ ОРДЕРОВ--------+ profit_all = summa_profit (); //---------------------------+ if (profit_all>=0) { will_close_all_orders (); //-------------------------+ start_lavina = 0; // если 0 -то разворот запрещен, если 1 -то разворот сверху вниз разрешен, если (-1) -разворот снизу вверх разрешен razvorot = 0; // кол-во разворотов, меняется от 1 до 13 control_start_orders = 0; control_lavina_orders = 0; //-------------------------+ ticket_order_up = -1; // стартовый ордер покупка ticket_order_down = -1; // стартовый ордер продажа ticket_order_add_main = -1; // дополнительный ордер ticket_order_add_second = -1; // дополнительный ордер //-------------------------+ first_orders = true; // запускаем начальные ордера заново } } //------------------------------------------------------+ return(0); } //===============================================================================================================+ //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\+ //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\+ //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\+ //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\+ //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\+ //===============================================ЗАДАНИЕ ФУНКЦИЙ=================================================+ //=========================================ОТКРЫВАЕМ ДВЕ НАЧАЛЬНЫЕ ПОЗИЦИИ=======================================+ //-ПЕРЕМЕННЫЕ: //-first_orders_ -контроль включения начальных ордеров //-control_start_orders -внешняя переменная, контроль выключения начальных ордеров //-ticket_order_up -внешняя переменная, тикет покупки //-ticket_order_down -внешняя переменная, тикет продажи //-lot_start -внешняя переменная, начальный лот //-level_up -внешняя переменная, верхний уровень необходимой цены //-level_down -внешняя переменная, нижний уровень необходимой цены //-start_price_buy -внешняя переменная, начальная цена покупки //-start_price_sell -внешняя переменная, начальная цена продажи //-profit -внешняя переменная, желаемый профит bool start_first_orders (bool first_orders_) { //-------------------------------покупка-------------------------------------+ ticket_order_up = will_open_order (Symbol(),0,lot_start,0,0); // процедура установки рыночного ордера покупка //-------------------------------продажа------------------------------------- ticket_order_down = will_open_order (Symbol(),1,lot_start,0,0); // процедура установки рыночного ордера продажа //------------------останавливаем процесс открытия ордеров-------------------+ if (OrderSelect(ticket_order_up,SELECT_BY_TICKET)) start_price_buy = OrderOpenPrice(); if (OrderSelect(ticket_order_down,SELECT_BY_TICKET)) start_price_sell = OrderOpenPrice(); //---------------------------------------------------------------------------+ level_up = start_price_buy + profit; level_down = start_price_sell - profit; //---------------------------------------------------------------------------+ control_start_orders = 1; first_orders_ = false; Alert ("---------------------------------------"); Alert ("НАЧАЛЬНЫЕ ОРДЕРА ОТКРЫТЫ И БОЛЬШЕ НЕ ОТКРОЮТСЯ"); //---------------------------------------------------------------------------+ return(first_orders_); } //===============================================================================================================+ //===============================================================================================================+ //=============================================ЗАКРЫВАЕМ ДВЕ НАЧАЛЬНЫЕ ПОЗИЦИИ===================================+ int close_first_orders (int control_start_orders_) { //-------------------Закрываем начальную покупку--------------------+ // Alert ("----Вошли в функцию close_first_orders----"); if (Bid>=level_up) { will_close_order (ticket_order_up); // процедура закрытия рыночного ордера //----------------------------------------------------------------+ level_down = start_price_sell; // перемещаем нижнюю границу control_start_orders_ = -1; control_lavina_orders = 1; start_lavina = 1; // разрешение на разворот сверху вниз razvorot = 1; Alert ("---------------------------------------"); Alert ("ЗАПУСКАЕМ ЛАВИНУ"); } //-------------------Закрываем начальную продажу--------------------+ if (Bid<=level_down) { will_close_order (ticket_order_down); // процедура закрытия рыночного ордера //----------------------------------------------------------------+ level_up = start_price_buy; // перемещаем верхнюю границу control_start_orders_ = -1; control_lavina_orders = -1; start_lavina = -1; // разрешение на разворот снизу вверх razvorot = 1; Alert ("---------------------------------------"); Alert ("ЗАПУСКАЕМ ЛАВИНУ"); } return (control_start_orders_); } //===============================================================================================================+ //===============================================================================================================+ //-----------------------------------------------АЛГОРИТМ ЛАВИНА-------------------------------------------------+ //-ПЕРЕМЕННЫЕ: //-level_up -внешняя переменная, равна профиту начального ордера, является расстоянием между ордерами лавины //-start_lavina -внешняя переменная, обозначает начальный цикл лавины //-lot_add -внешняя переменная //-razvorot -внешняя переменная //-k -внешняя переменная //-a -внешняя переменная int lavina (int razvorot_) { double ostatok_; int dir_ = -1, dir_add_ = -1; //----------------------------------------+ RefreshRates(); ostatok_ = MathMod(razvorot_,2); //----------------------------------------+ if (Bid>=level_up) if (control_lavina_orders ==1) if ((start_lavina ==1 && ostatok_ ==1) || (start_lavina ==-1 && ostatok_ ==0)) { dir_ = 0; //"up"; dir_add_ = 1; //"down"; lavina_add (razvorot_,dir_,dir_add_); //------------------------------------+ Alert ("----Вошли в функцию lavina----"); Alert ("start_lavina = ",start_lavina); Alert ("текущий разворот = ",razvorot_); //------------------------------------+ razvorot_ ++; control_lavina_orders = -1; return(razvorot_); } //----------------------------------------+ if (Bid<=level_down) if (control_lavina_orders ==-1) if ((start_lavina ==1 && ostatok_ ==0) || (start_lavina ==-1 && ostatok_ ==1)) { dir_ = 1; //"down"; dir_add_ = 0; //"up"; lavina_add (razvorot_,dir_,dir_add_); //------------------------------------+ Alert ("----Вошли в функцию lavina----"); Alert ("start_lavina = ",start_lavina); Alert ("текущий разворот = ",razvorot_); //------------------------------------+ razvorot_ ++; control_lavina_orders = 1; return(razvorot_); } //----------------------------------------+ return(razvorot_); } //===============================================================================================================+ //===============================================================================================================+ //--------------------------------Дополнительная функция для Лавины-запускает ордера-----------------------------+ void lavina_add (int razvorot_,int dir_,int dir_add_) { //---------------------------------------------+ Alert ("----Запускаем функцию подсчета лота----"); lot_add = lot_order (razvorot_,lot_start,k,a); Alert ("Лот подсчитан"); //---------------------------------------------+ Alert ("Если есть ордер внутри канала, закрываем его"); if (OrderSelect(ticket_order_add_second,SELECT_BY_TICKET)) { if (OrderType( ) == dir_) will_close_order (ticket_order_add_second); // закрытие ордера внутри канала, если он есть } else Alert ("Ордера внутри канала нет"); //---------------------------------------------+ Alert ("Запускаем функцию открытия внешнего ордера"); ticket_order_add_main = will_open_order (Symbol(),dir_,lot_add,0,0); // установка рыночного ордера //---------------------------------------------+ if (a>0) { Alert ("Т.к. коэфф. (А) больше 0, запускаем функцию открытия ордера внутри канала"); ticket_order_add_second = will_open_order (Symbol(),dir_add_,lot_start,0,0); // установка дополнительного рыночного ордера внутри канала } } //===============================================================================================================+ //===============================================================================================================+ //----------------------------------------УСТАНОВКА РЫНОЧНОГО ОРДЕРА---------------------------------------------+ //-ПЕРЕМЕННЫЕ: //-sym -валютная пара //-direction -покупка или продажа //-lot_add -лот операции //-slippage -проскальзывание цены, внешняя переменная //-stoploss -фиксированный убыток //-takeprofit-фиксированная прибыль int will_open_order (string sym_,int direction_,double lot_add_,double stoploss_,double takeprofit_) { int err_, ticket_order_ = -1; double price_; string word_; //-----------------------------------------------+ Alert ("***************************************"); Alert ("----Вошли в функцию will_open_order----"); while (!OrderSelect(ticket_order_,SELECT_BY_TICKET)) { RefreshRates(); if (direction_ == 0) {price_ = Ask; word_ = "ПОКУПКА";} // OP_BUY - это покупка if (direction_ == 1 ) {price_ = Bid; word_ = "ПРОДАЖА";} // OP_SELL - это продажа ticket_order_ = OrderSend(sym_,direction_,lot_add_,price_,slippage,stoploss_,takeprofit_); err_ = GetLastError(); if (err_ == 0) Alert (word_," ОТКРЫТА!"); else {Alert ("ошибка операции ",word_); errors_screen (err_);} Sleep(3000); } return(ticket_order_); } //==============================================================================================================+ //==============================================================================================================+ //--------------------------------------ЗАКРЫТИЕ ВСЕХ РЫНОЧНЫХ ОРДЕРОВ------------------------------------------+ void will_close_all_orders () { int total_, ticket_order_; //-------------------------------------------------------+ Alert ("---------------------------------------"); Alert ("----Вошли в функцию will_close_all_orders----"); total_ = OrdersTotal(); //-------------------------------------------------------+ while(total_ !=0 ) for(int i_=0;i_=1) { for(int i_=0;i_17) { Alert("Ошибка! Неправильный номер разворота. Возвращаем начальный лот"); return(lot_add_); } //--менее агрессивное наращивание----------------------------+ // X[0]=lot_add_; // for (int i_=1;i_<=razvorot_;i_++) // X[i_]=X[0]+ X[i_-1]+A; //------------------------------+ //--агрессивное наращивание лота---формулы написал напрямую, ломает придумывать цикл X[0]=lot_add_; X[1]=K*X[0]+A; X[2]=K*X[1]-X[0]+A; X[3]=K*(X[0]+X[2])-X[1]+A; X[4]=K*(X[1]+X[3])-X[2]-X[0]+A; X[5]=K*(X[0]+X[2]+X[4])-X[3]-X[1]+A; X[6]=K*(X[1]+X[3]+X[5])-X[4]-X[2]-X[0]+A; X[7]=K*(X[0]+X[2]+X[4]+X[6])-X[5]-X[3]-X[1]+A; X[8]=K*(X[1]+X[3]+X[5]+X[7])-X[6]-X[4]-X[2]-X[0]+A; X[9]=K*(X[0]+X[2]+X[4]+X[6]+X[8])-X[7]-X[5]-X[3]-X[1]+A; X[10]=K*(X[1]+X[3]+X[5]+X[7]+X[9])-X[8]-X[6]-X[4]-X[2]-X[0]+A; X[11]=K*(X[0]+X[2]+X[4]+X[6]+X[8]+X[10])-X[9]-X[7]-X[5]-X[3]-X[1]+A; X[12]=K*(X[1]+X[3]+X[5]+X[7]+X[9]+X[11])-X[10]-X[8]-X[6]-X[4]-X[2]-X[0]+A; X[13]=K*(X[0]+X[2]+X[4]+X[6]+X[8]+X[10]+X[12])-X[11]-X[9]-X[7]-X[5]-X[3]-X[1]+A; X[14]=K*(X[1]+X[3]+X[5]+X[7]+X[9]+X[11]+X[13])-X[12]-X[10]-X[8]-X[6]-X[4]-X[2]-X[0]+A; X[15]=K*(X[0]+X[2]+X[4]+X[6]+X[8]+X[10]+X[12]+X[14])-X[13]-X[11]-X[9]-X[7]-X[5]-X[3]-X[1]+A; X[16]=K*(X[1]+X[3]+X[5]+X[7]+X[9]+X[11]+X[13]+X[15])-X[14]-X[12]-X[10]-X[8]-X[6]-X[4]-X[2]-X[0]+A; //------------------------------+ Alert("Значение лота = ",X[razvorot_]); return(X[razvorot_]); } //===============================================================================================================+ //===============================================================================================================+ //================================ПОИСК НАИБОЛЬШЕГО И НАИМЕНЬШЕГО БАРА В ПЯТЕРКЕ=================================+ //-для динамического изменения начального профита, чтобы двигаться по рынку, хотя может и не сработает-----------+ double max_min () { double max,min; //------------+ Alert ("---------------------------------------"); Alert ("----Вошли в функцию max_min----"); RefreshRates(); //-----------поиск максимума в пятерке-----------+ // min = High[1]-Low[1]; // for (int i_=1;i_<=10;i_++) // if (min<=(High[i_]-Low[i_])) min = (High[i_]-Low[i_]); // else min = min; //-----------поиск минимума в пятерке------------+ // min = High[1]-Low[1]; // for (int i_=1;i_<=10;i_++) // if (min>=(High[i_]-Low[i_])) min = (High[i_]-Low[i_]); // else min = min; //------------+ min = High[iHighest(NULL,0,MODE_HIGH,24,1)]-Low[iLowest(NULL,0,MODE_LOW,24,1)]; min = min/4; Alert("Значение min = ",min); return (min); } //===============================================================================================================+ //============================================ФУНКЦИЯ ОТОБРАЖЕНИЯ ОШИБОК=========================================+ //===============================================================================================================+ void errors_screen (int err_) { switch(err_) { case 1 :Alert("Нет ошибки, но результат неизвестен");break; case 2 :Alert("Общая ошибка");break; case 3 :Alert("Неправильные параметры");break; case 4 :Alert("Торговый сервер занят");break; case 5 :Alert("Старая версия клиентского терминала");break; case 6 :Alert("Нет связи с торговым сервером");break; case 7 :Alert("Недостаточно прав");break; case 8 :Alert("Слишком частые запросы");break; case 9 :Alert("Недопустимая операция нарушающая функционирование сервера");break; case 64 :Alert("Счет заблокирован");break; case 65 :Alert("Неправильный номер счета");break; case 128:Alert("Истек срок ожидания совершения сделки");break; case 129:Alert("Неправильная цена");break; case 130:Alert("Неправильные стопы");break; case 131:Alert("Неправильный объем");break; case 132:Alert("Рынок закрыт");break; case 133:Alert("Торговля запрещена");break; case 134:Alert("Недостаточно денег для совершения операции");break; case 135:Alert("Цена изменилась");break; case 136:Alert("Нет цен");break; case 137:Alert("Брокер занят");break; case 138:Alert("Новые цены");break; case 139:Alert("Ордер заблокирован и уже обрабатывается");break; case 140:Alert("Разрешена только покупка");break; case 141:Alert("Слишком много запросов");break; case 145:Alert("Модификация запрещена, так как ордер слишком близок к рынку");break; case 146:Alert("Подсистема торговли занята");break; case 147:Alert("Использование даты истечения ордера запрещено брокером");break; case 148:Alert("Количество открытых и отложенных ордеров достигло предела, установленного брокером");break; case 149:Alert("Попытка открыть противоположную позицию к уже существующей в случае, если хеджирование запрещено");break; case 150:Alert("Попытка закрыть позицию по инструменту в противоречии с правилом FIFO");break; //--------------------------------------------------------+ case 4000 :Alert("Нет ошибки");break; case 4001 :Alert("Неправильный указатель функции");break; case 4002 :Alert("Индекс массива - вне диапазона");break; case 4003 :Alert("Нет памяти для стека функций");break; case 4004 :Alert("Переполнение стека после рекурсивного вызова");break; case 4005 :Alert("На стеке нет памяти для передачи параметров");break; case 4006 :Alert("Нет памяти для строкового параметра");break; case 4007 :Alert("Нет памяти для временной строки");break; case 4008 :Alert("Неинициализированная строка");break; case 4009 :Alert("Неинициализированная строка в массиве");break; case 4010 :Alert("Нет памяти для строкового массива");break; case 4011 :Alert("Слишком длинная строка");break; case 4012 :Alert("Остаток от деления на ноль");break; case 4013 :Alert("Деление на ноль");break; case 4014 :Alert("Неизвестная команда");break; case 4015 :Alert("Неправильный переход");break; case 4016 :Alert("Неинициализированный массив");break; case 4017 :Alert("Вызовы DLL не разрешены");break; case 4018 :Alert("Невозможно загрузить библиотеку");break; case 4019 :Alert("Невозможно вызвать функцию");break; case 4020 :Alert("Вызовы внешних библиотечных функций не разрешены");break; case 4021 :Alert("Недостаточно памяти для строки, возвращаемой из функции");break; case 4022 :Alert("Система занята");break; case 4050 :Alert("Неправильное количество параметров функции");break; case 4051 :Alert("Недопустимое значение параметра функции");break; case 4052 :Alert("Внутренняя ошибка строковой функции ");break; case 4053 :Alert("Ошибка массива");break; case 4054 :Alert("Неправильное использование массива-таймсерии");break; case 4055 :Alert("Ошибка пользовательского индикатора");break; case 4056 :Alert("Массивы несовместимы");break; case 4057 :Alert("Ошибка обработки глобальныех переменных"); break; case 4058 :Alert("Глобальная переменная не обнаружена");break; case 4059 :Alert("Функция не разрешена в тестовом режиме");break; case 4060 :Alert("Функция не разрешена");break; case 4061 :Alert("Ошибка отправки почты");break; case 4062 :Alert("Ожидается параметр типа string"); break; case 4063 :Alert("Ожидается параметр типа integer");break; case 4064 :Alert("Ожидается параметр типа double");break; case 4065 :Alert("В качестве параметра ожидается массив"); break; case 4066 :Alert("Запрошенные исторические данные в состоянии обновления"); break; case 4067 :Alert("Ошибка при выполнении торговой операции");break; case 4099 :Alert("Конец файла");break; case 4100 :Alert("Ошибка при работе с файлом"); break; case 4101 :Alert("Неправильное имя файла");break; case 4102 :Alert("Слишком много открытых файлов");break; case 4103 :Alert("Невозможно открыть файл");break; case 4104 :Alert("Несовместимый режим доступа к файлу");break; case 4105 :Alert("Ни один ордер не выбран");break; case 4106 :Alert("Неизвестный символ");break; case 4107 :Alert("Неправильный параметр цены для торговой функции");break; case 4108 :Alert("Неверный номер тикета");break; case 4109 :Alert("Торговля не разрешена. Необходимо включить опцию -Разрешить советнику торговать- в свойствах эксперта");break; case 4110 :Alert("Длинные позиции не разрешены. Необходимо проверить свойства эксперта");break; case 4111 :Alert("Короткие позиции не разрешены. Необходимо проверить свойства эксперта");break; case 4200 :Alert("Объект уже существует");break; case 4201 :Alert("Запрошено неизвестное свойство объекта");break; case 4202 :Alert("Объект не существует");break; case 4203 :Alert("Неизвестный тип объекта");break; case 4204 :Alert("Нет имени объекта");break; case 4205 :Alert("Ошибка координат объекта");break; case 4206 :Alert("Не найдено указанное подокно");break; case 4207 :Alert("Ошибка при работе с объектом");break; default : break; } } //===============================================================================================================+ //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\+ //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\+ //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\+ //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\+ //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\+ //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); }