//+------------------------------------------------------------------+
//|                                                      h_TS_BW.mqh |
//|                                                         olyakish |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "olyakish"
#property link      "http://www.mql5.com"



#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include<Trade\HistoryOrderInfo.mqh>
// перечисляемый список вариантов трейлинг стопа по аллигатору
enum type_support_position
  {
   Not_used=-1,               // Сопровождение стоповой цены у позиции не используется
   Trailing_On_Lips=0,        // Трейлиг стоп по по ЛинииГуб
   Trailing_On_Teeth=1,       // Трейлиг стоп по Линии Зубов
   Trailing_On_Jaws=2,        // Трейлиг стоп по Линии Челюстей
   Close_On_Lips=3,           // Закрытие позиции если цена закрылась за Губими Аллигатора
   Close_On_Teeth=4,          // Закрытие позиции если цена закрылась за Зубами Аллигатора
   Close_On_Jaw=5,            // Закрытие позиции если цена закрылась за Челюстью Аллигатора
   Close_Out_Alligator=6      // Закрытие за противоположной границей Аллигатора 
  };
//+------------------------------------------------------------------+
//|     Описание класса   C_TS_BW                                    |
//+------------------------------------------------------------------+

class C_TS_BW
  {
private:
   datetime          time[1];                                  // время при запросе 
   datetime          last_time[1];                             // время предыдущего запроса (нужны для определения появления нового бара)
   int               h_alligator,h_fractals,h_ao,h_ac;              //Хендлы  
   string            m_Symbol;                                      // символ на котором торгуем
   ENUM_TIMEFRAMES   m_Period;                                      // период символа на котором торгуем 
   CTrade            exp_trade;                                     //  торговые методы из стандартной библиотеки
   CSymbolInfo       s_info;                                        // методы доступа к информации по символу
   CPositionInfo     pos_info;                                      // методы получения информации по торговой позиции
   CHistoryOrderInfo h_info;                                        // методы доступа к истории ордеров
   bool              FindSignal_1_dimension(int type,double&price_out[],datetime &time_out[]);  // поиск сигналов от первого измерения
   bool              FindSignal_2_dimension(int type,int sub_type,double&price_out[],datetime &time_out[]);  // поиск сигналов от второго измерения
   bool              FindSignal_3_dimension(int type,int sub_type,double&price_out[],datetime &time_out[]);  // поиск сигналов от третьего измерения 
   bool              FindSignal_4_dimension(int type,int sub_type,double&price_out[],datetime &time_out[]);  // поиск сигналов от четвертого измерения 
   bool              FindSignal_5_dimension(int type,int sub_type,double&price_out[],datetime &time_out[]);  // поиск сигналов от пятого измерения
   bool              CheckForTradeSignal(int dimension,int type,int sub_type,double&price_out[],datetime &time_out[]);  // проверка сигналов на возможность торговли в текущей момент
   bool              SendOrder(ENUM_ORDER_TYPE type,double&price_out[],datetime &time_out[],string comment); // отправка ордера на сервер
   bool              CopyIndValue(int type,int countValue);
   ulong             CalcMagic(ulong  &magic);           // вычисление необходимого магика для нового ордера   
   double            High[],Low[],Close[],AO_color[],AO_value[],AC_color[],AC_value[];      // массивы для хранения значений 
   double            lips[],teeth[],jaw[];                       // массивы для хранения значений от Аллигатора 
   double            Lot; // лот для торговли
   double            StopLoss;            // Цена для установки стоплосс
   ulong             Magic;  // магик   

   struct l_signals         //// структура сигналов
     {
      double            fractal_up[1];  // цена последнего актуального фрактала на покупку (индикатор Фракталы)
      double            fractal_dn[1];  // цена последнего актуального фрактала на продажу (индикатор Фракталы)
      double            bludce_up[1];   // цена последнего актуального сигнала "блюдце" на  покупку (индикатор АО)
      double            bludce_dn[1];   // цена последнего актуального сигнала "блюдце" на  продажу (индикатор АО)
      double            cross_zero_up[1]; // цена последнего актуального сигнала "пересечение нулевой линии" на  покупку (индикатор АО)
      double            cross_zero_dn[1]; // цена последнего актуального сигнала "пересечение нулевой линии" на  продажу (индикатор АО)
      double            ac_2_bars_up[1];  // цена последнего актуального сигнала "по двум подряд зеленым барам от АС" на  покупку (индикатор АС)
      double            ac_2_bars_dn[1];  // цена последнего актуального сигнала "по двум подряд красным барам от АС" на  продажу (индикатор АС)
      double            ac_3_bars_up[1];  // цена последнего актуального сигнала "по трем подряд зеленым барам от АС" на  покупку (индикатор АС)
      double            ac_3_bars_dn[1];  // цена последнего актуального сигнала "по трем подряд красным барам от АС" на  продажу (индикатор АС)
      double            zone_up[1];       // цена последнего актуального сигнала "зеленая зона" на  покупку (индикаторы АО , АС и цена Close)
      double            zone_dn[1];       // цена последнего актуального сигнала "красная зона" на  продажу (индикаторы АО , АС и цена Close)
      double            zone_5_trall_green[1]; // цена последнего актуального сигнала "перенос стоп приказа по пяти подряд зеленым зонам" для позиции на покупку (индикаторы АО и  АС)
      double            zone_5_trall_red[1];   // цена последнего актуального сигнала "перенос стоп приказа по пяти подряд красным зонам" для позиции на продажу (индикаторы АО и  АС)
      double            five_dimension_2_bars_up[1]; // цена последнего актуального сигнала "покупка выше линии баланса (в зеленой зоне)"  на  покупку (индикатор Аллигатор и цена High)
      double            five_dimension_3_bars_up[1]; // цена последнего актуального сигнала "покупка выше линии баланса (в красной зоне)"  на  покупку (индикатор Аллигатор и цена High)
      double            five_dimension_2_bars_dn[1]; // цена последнего актуального сигнала "продажа ниже линии баланса (в красной зоне)"  на  продажу (индикатор Аллигатор и цена Low)
      double            five_dimension_3_bars_dn[1]; // цена последнего актуального сигнала "продажа ниже линии баланса (в зеленой зоне)"  на  продажу (индикатор Аллигатор и цена Low)
      bool              alligator_trend[2];          // идентификация тренда по аллигатру на нулевом баре

      datetime          fractal_up_time[1]; // время бара последнего актуального фрактала на покупку (индикатор Фракталы)
      datetime          fractal_dn_time[1]; // время бара последнего актуального фрактала на продажу (индикатор Фракталы)
      datetime          bludce_up_time[1];  // цена последнего актуального сигнала "блюдце" на  покупку (индикатор АО)
      datetime          bludce_dn_time[1];  // цена последнего актуального сигнала "блюдце" на  продажу (индикатор АО)
      datetime          cross_zero_up_time[1]; // время бара последнего актуального сигнала "пересечение нулевой линии" на  покупку (индикатор АО)
      datetime          cross_zero_dn_time[1]; // время бара последнего актуального сигнала "пересечение нулевой линии" на  продажу (индикатор АО)
      datetime          ac_2_bars_up_time[1]; // время бара последнего актуального сигнала "по двум подряд зеленым барам от АС" на  покупку (индикатор АС)
      datetime          ac_2_bars_dn_time[1]; // время бара последнего актуального сигнала "по двум подряд красным барам от АС" на  продажу (индикатор АС)
      datetime          ac_3_bars_up_time[1]; // время бара последнего актуального сигнала "по трем подряд зеленым барам от АС" на  покупку (индикатор АС)
      datetime          ac_3_bars_dn_time[1]; // время бара последнего актуального сигнала "по трем подряд красным барам от АС" на  продажу (индикатор АС)
      datetime          zone_up_time[1];      // время бара последнего актуального сигнала "зеленая зона" на  покупку (индикаторы АО , АС и цена Close)
      datetime          zone_dn_time[1];      // время бара последнего актуального сигнала "красная зона" на  продажу (индикаторы АО , АС и цена Close)
      datetime          five_dimension_2_bars_up_time[1]; // время бара последнего актуального сигнала "перенос стоп приказа по пяти подряд зеленым зонам" для позиции на покупку (индикаторы АО и  АС)
      datetime          five_dimension_3_bars_up_time[1]; // время бара последнего актуального сигнала "покупка выше линии баланса (в красной зоне)"  на  покупку (индикатор Аллигатор и цена High)
      datetime          five_dimension_2_bars_dn_time[1]; // время бара последнего актуального сигнала "продажа ниже линии баланса (в красной зоне)"  на  продажу (индикатор Аллигатор и цена Low)
      datetime          five_dimension_3_bars_dn_time[1]; // время бара последнего актуального сигнала "продажа ниже линии баланса (в зеленой зоне)"  на  продажу (индикатор Аллигатор и цена Low)
      void              l_signals_clear(ENUM_POSITION_TYPE type) // зачистка сигналов в зависимости от направления
        {
         alligator_trend[0]=false;
         alligator_trend[1]=false;
         if(type==POSITION_TYPE_BUY)
           {
            fractal_up[0]=-1;
            bludce_up[0]=-1;
            cross_zero_up[0]=-1;
            ac_2_bars_up[0]=-1;
            ac_3_bars_up[0]=-1;
            zone_up[0]=-1;
            zone_5_trall_green[0]=-1;
            five_dimension_2_bars_up[0]=-1;
            five_dimension_3_bars_up[0]=-1;

            fractal_up_time[0]=-1;
            bludce_up_time[0]=-1;
            cross_zero_up_time[0]=-1;
            ac_2_bars_up_time[0]=-1;
            ac_3_bars_up_time[0]=-1;
            zone_up_time[0]=-1;
            five_dimension_2_bars_up_time[0]=-1;
            five_dimension_3_bars_up_time[0]=-1;
           }
         if(type==POSITION_TYPE_SELL)
           {
            fractal_dn[0]=-1;
            bludce_dn[0]=-1;
            cross_zero_dn[0]=-1;
            ac_2_bars_dn[0]=-1;
            ac_3_bars_dn[0]=-1;
            zone_dn[0]=-1;
            zone_5_trall_red[0]=-1;
            five_dimension_2_bars_dn[0]=-1;
            five_dimension_3_bars_dn[0]=-1;

            fractal_dn_time[0]=-1;
            bludce_dn_time[0]=-1;
            cross_zero_dn_time[0]=-1;
            ac_2_bars_dn_time[0]=-1;
            ac_3_bars_dn_time[0]=-1;
            zone_dn_time[0]=-1;
            five_dimension_2_bars_dn_time[0]=-1;
            five_dimension_3_bars_dn_time[0]=-1;
           }
        }
     };
   l_signals         last_signals;
   // структура времен последних сработанных сигналов
   struct l_trade
     {
      datetime          fractal_up;
      datetime          fractal_dn;
      datetime          ao_blydce;
      datetime          ao_cross_zero;
      datetime          ac_2_bars;
      datetime          ac_3_bars;
      datetime          zone;
      datetime          five_dimension;
     };
   l_trade           last_trade;

   struct            s_input_parametrs // струкрура настроечных параметров 
     {
      double            lot;                // лот для торговли (входящий)
      type_support_position support_position; // Сопровождение стоповой цены у позиции
      int               alligator_jaw_period;//Аллигатор: период линии челюстей
      int               alligator_jaw_shift;//Аллигатор: сдвиг линии челюстей
      int               alligator_teeth_period;//Аллигатор: период линии зубов
      int               alligator_teeth_shift;//Аллигатор: сдвиг линии зубов
      int               alligator_lips_period;//Аллигатор: период линии губ
      int               alligator_lips_shift;//Аллигатор: сдвиг линии губ
      int               max_4_dimension_zone;  // Максимальное количество подряд баров зон одного цвета      
      bool              add_1_dimension;  // Разрешить доливку по фракталам
      bool              add_2_dimension_bludce;  // Разрешить доливку по сигналу "блюдце (АО)"
      bool              add_2_dimension_cross_zero;  // Разрешить доливку по сигналу "пересечение нулевой линии (АО)"
      bool              add_3_dimension_use_2_bars;  // Разрешить доливку по сигналу "покупка выше 0, продажа ниже 0" (АС 2 бара)
      bool              add_3_dimension_use_3_bars;  // Разрешить доливку по сигналу "покупка ниже 0, продажа выше 0" (АС 3 бара)
      bool              add_4_dimension_zone;  // Разрешить доливку по сигналам от красной или зеленой зон
      bool              add_5_dimension;       // Разрешить доливку по сигналам от линии баланса
      bool              trall_4_dimension;  // Разрешить тралл по 5 подряд барам зон одного цвета
      bool              agress_trade_mm;  // Агрессивный стиль доливания в открытую позицию
     };
   s_input_parametrs inp_param;        // внутренняя структура принятых настроек

public:
   void              C_TS_BW(); // конструктор

   s_input_parametrs inp_param_tmp;    // приемная структура настроек (получает по ссылке при инициализации класса)

   struct s_actual_action
     {
      bool              fractal_open_buy;
      bool              fractal_add_buy;
      bool              fractal_revers_buy_to_sell;
      bool              fractal_open_sell;
      bool              fractal_add_sell;
      bool              fractal_revers_sell_to_buy;
      bool              ao_bludce_buy;
      bool              ao_bludce_sell;
      bool              ao_cross_zero_buy;
      bool              ao_cross_zero_sell;
      bool              ac_2_bar_buy;
      bool              ac_2_bar_sell;
      bool              ac_3_bar_buy;
      bool              ac_3_bar_sell;
      bool              zone_buy;
      bool              zone_sell;
      bool              line_balance_2_bar_buy;
      bool              line_balance_2_bar_sell;
      bool              line_balance_3_bar_buy;
      bool              line_balance_3_bar_sell;
      bool              position_close;
      void              init()
        {
         fractal_open_buy=false;
         fractal_add_buy=false;
         fractal_revers_buy_to_sell=false;
         fractal_open_sell=false;
         fractal_add_sell=false;
         fractal_revers_sell_to_buy=false;
         ao_bludce_buy=false;
         ao_bludce_sell=false;
         ao_cross_zero_buy=false;
         ao_cross_zero_sell=false;
         ac_2_bar_buy=false;
         ac_2_bar_sell=false;
         ac_2_bar_buy=false;
         ac_3_bar_sell=false;
         zone_buy=false;
         zone_sell=false;
         line_balance_2_bar_buy=false;
         line_balance_2_bar_sell=false;
         line_balance_3_bar_buy=false;
         line_balance_3_bar_sell=false;
         position_close=false;
        }
     };
   s_actual_action   actual_action;
   bool              Init(string Symbol_for_trade,ENUM_TIMEFRAMES Period_for_trade,s_input_parametrs  &inp_param_tmp); // инициализация класса
   bool              NewBar();// проверка на новый бар на текущем символе\таймфрейме
   void              CheckSignal();  // поиск сигналов
   void              CheckActionOnTick();  // сбор желаемых действий на текущей тик
   void              TrailingStop();  // подтягивание стопа
   void              TradeActualSignals();//Торговля По Актуальным Сигналам()
   void              SetStopLoss(double  &stoploss);  // прием внешнего стопа

                                                      // Расчет лота (если !external то расчет идет внутренними силами класса иначе торгуем ext_lot)
   void              CalcLot(bool external,double ext_lot,int type);

  };
//+------------------------------------------------------------------+ 

C_TS_BW::C_TS_BW(void)
  {
  }
//+------------------------------------------------------------------+
//| Инициализация класса                                             +
//|       Symbol_for_trade - Символ для торговли                     +
//|       Period_for_trade- Период графика для торговли              +
//|  При неудачной инициализации возвращает false - необходимо повторная переинициализация
//+------------------------------------------------------------------+
bool C_TS_BW::Init(string Symbol_for_trade,ENUM_TIMEFRAMES Period_for_trade,s_input_parametrs  &inp_param_tmp)
  {
   inp_param=inp_param_tmp;
   time[0]=-1;                                  // время при запросе 
   last_time[0]=-2;
   m_Symbol=Symbol_for_trade;
   m_Period=Period_for_trade;
   Lot=inp_param.lot;
   StopLoss=-1;
   Magic=-1;
// распределение хендлов
   h_alligator=iAlligator(m_Symbol,m_Period,inp_param.alligator_jaw_period,0,inp_param.alligator_teeth_period,0,inp_param.alligator_lips_period,0,MODE_SMMA,PRICE_MEDIAN);
   if(h_alligator==INVALID_HANDLE){return(false);}
   h_fractals=iFractals(m_Symbol,m_Period);
   if(h_fractals==INVALID_HANDLE){return(false);}
   h_ao=iAO(m_Symbol,m_Period);
   if(h_ao==INVALID_HANDLE){return(false);}
   h_ac=iAC(m_Symbol,m_Period);
   if(h_ac==INVALID_HANDLE){return(false);}
// индексация в массивах как таймсерия 
   ArraySetAsSeries(AO_color,true);
   ArraySetAsSeries(AO_value,true);
   ArraySetAsSeries(AC_color,true);
   ArraySetAsSeries(AC_value,true);
   ArraySetAsSeries(High,true);
   ArraySetAsSeries(Low,true);
   ArraySetAsSeries(Close,true);
   ArraySetAsSeries(lips,true);
   ArraySetAsSeries(teeth,true);
   ArraySetAsSeries(jaw,true);
// инициализация наследуемых классов
   s_info.Name(m_Symbol);       // С каким инструментом работаем
   s_info.Refresh();            // получаем окружение по символу
   return(true);
  }
//+------------------------------------------------------------------+
//|  Поиск нового бара (Если новый то true иначе false               |
//+------------------------------------------------------------------+
bool C_TS_BW::NewBar(void)
  {
   int copy=-1;
   copy=CopyTime(m_Symbol,m_Period,0,1,time);
   if(copy>0 && time[0]>last_time[0])
     {
      last_time[0]=time[0];
      return(true);
     }
   else
     {return(false);}
  }
//+------------------------------------------------------------------+
//    поиск сигналов от 5-и измерений 
//+------------------------------------------------------------------+
void C_TS_BW::CheckSignal(void)
  {
   CopyClose(m_Symbol,m_Period,0,3,Close);
   datetime tmp_timer[1];
   last_signals.alligator_trend[0]=false;
   last_signals.alligator_trend[1]=false;
   CopyIndValue(0,2);  // достаем аллигатор на нулевом баре
   CopyIndValue(2,10);  // достаем АО
   CopyIndValue(3,10);  // достаем АС  



   bool select_pos=pos_info.Select(m_Symbol);
   if(select_pos)
     {
      switch(inp_param.support_position)
        {
         case 3:        //Close_On_Lips=3,           // Закрытие позиции если цена закрылась за Губими Аллигатора
           {
            if(((ENUM_POSITION_TYPE)pos_info.PositionType()==POSITION_TYPE_BUY && Close[1]<lips[1]) ||
               ((ENUM_POSITION_TYPE)pos_info.PositionType()==POSITION_TYPE_SELL && Close[1]>lips[1]))
              {actual_action.position_close=true;}
            break;
           }
         case 4:           //Close_On_Teeth=4,          // Закрытие позиции если цена закрылась за Зубами Аллигатора
           {
            if(((ENUM_POSITION_TYPE)pos_info.PositionType()==POSITION_TYPE_BUY && Close[1]<teeth[1]) ||
               ((ENUM_POSITION_TYPE)pos_info.PositionType()==POSITION_TYPE_SELL && Close[1]>teeth[1]))
              {actual_action.position_close=true;}
            break;
           }
         case 5:           //Close_On_Jaw=5             // Закрытие позиции если цена закрылась за Челюстью Аллигатора     
           {
            if(((ENUM_POSITION_TYPE)pos_info.PositionType()==POSITION_TYPE_BUY && Close[1]<jaw[1]) ||
               ((ENUM_POSITION_TYPE)pos_info.PositionType()==POSITION_TYPE_SELL && Close[1]>jaw[1]))
              {actual_action.position_close=true;}
            break;
           }
         case 6:           //Close_Out_Alligator=6            
           {
            if(((ENUM_POSITION_TYPE)pos_info.PositionType()==POSITION_TYPE_BUY && Close[1]<MathMin(jaw[1],MathMin(lips[1],teeth[1]))) ||
               ((ENUM_POSITION_TYPE)pos_info.PositionType()==POSITION_TYPE_SELL && Close[1]>MathMax(jaw[1],MathMax(lips[1],teeth[1]))))
              {actual_action.position_close=true;}
            break;
           }           
        }
     }

   last_signals.l_signals_clear(POSITION_TYPE_BUY);
   last_signals.l_signals_clear(POSITION_TYPE_SELL);
//--- тренд по аллигатору 
   if(lips[0]>teeth[0] && teeth[0]>jaw[0]){last_signals.alligator_trend[0]=true;}
   if(lips[0]<teeth[0] && teeth[0]<jaw[0]){last_signals.alligator_trend[1]=true;}   
   FindSignal_1_dimension(0,last_signals.fractal_up,last_signals.fractal_up_time);  // ищим актуальный фрактал на покупку
   FindSignal_1_dimension(1,last_signals.fractal_dn,last_signals.fractal_dn_time);  // ищим актуальный фрактал на продажу
   if(select_pos && (ENUM_POSITION_TYPE)pos_info.PositionType()==POSITION_TYPE_BUY && last_signals.alligator_trend[0])
     {
      FindSignal_2_dimension(0,0,last_signals.cross_zero_up,last_signals.cross_zero_up_time);  //  АО Пересечение нулевой линии (на покупку)
      FindSignal_2_dimension(0,1,last_signals.bludce_up,last_signals.bludce_up_time);  //  АО Блюдце (на покупку)
      FindSignal_3_dimension(0,0,last_signals.ac_2_bars_up,last_signals.ac_2_bars_up_time);  //  AC (на покупку) по двум зеленым барам 
      FindSignal_3_dimension(0,1,last_signals.ac_3_bars_up,last_signals.ac_3_bars_up_time);  //  AC (на покупку) по трем зеленым барам 
      FindSignal_4_dimension(0,0,last_signals.zone_up,last_signals.zone_up_time);            //поиск  сигнала на покупку от зеленой зоны
      FindSignal_4_dimension(0,1,last_signals.zone_5_trall_green,tmp_timer);            //поиск  цены для переноса стопа по пятибаровой зеленой зоне 
      FindSignal_4_dimension(0,2,last_signals.zone_up,last_signals.zone_up_time);            //ограничения на вход по сигналам от зеленой зоны по количеству подряд зеленых зон
      FindSignal_5_dimension(0,0,last_signals.five_dimension_2_bars_up,last_signals.five_dimension_2_bars_up_time);            //поиск  сигнала на покупку от линии баланса (2 бара)
      FindSignal_5_dimension(0,1,last_signals.five_dimension_3_bars_up,last_signals.five_dimension_3_bars_up_time);            //поиск  сигнала на покупку от линии баланса (3 бара)      
     }
   if(select_pos && (ENUM_POSITION_TYPE)pos_info.PositionType()==POSITION_TYPE_SELL && last_signals.alligator_trend[1])
     {
      FindSignal_2_dimension(1,0,last_signals.cross_zero_dn,last_signals.cross_zero_dn_time);  //  АО Пересечение нулевой линии (на продажу)
      FindSignal_2_dimension(1,1,last_signals.bludce_dn,last_signals.bludce_dn_time);  //  АО Блюдце (на продажу)
      FindSignal_3_dimension(1,0,last_signals.ac_2_bars_dn,last_signals.ac_2_bars_dn_time);  //  AC (на продажу) по двум красным барам 
      FindSignal_3_dimension(1,1,last_signals.ac_3_bars_dn,last_signals.ac_3_bars_dn_time);  //  AC (на продажу) по трем красным барам 
      FindSignal_4_dimension(1,0,last_signals.zone_dn,last_signals.zone_dn_time);            //поиск  сигнала на продажу от красной зоны
      FindSignal_4_dimension(1,1,last_signals.zone_5_trall_red,tmp_timer);            //поиск  цены для переноса стопа по пятибаровой красной зоне       
      FindSignal_4_dimension(1,2,last_signals.zone_dn,last_signals.zone_dn_time);            //ограничения на вход по сигналам от красной  зоны по количеству подряд красных зон
      FindSignal_5_dimension(1,0,last_signals.five_dimension_2_bars_dn,last_signals.five_dimension_2_bars_dn_time);            //поиск  сигнала на продажу от линии баланса (2 бара)   
      FindSignal_5_dimension(1,1,last_signals.five_dimension_3_bars_dn,last_signals.five_dimension_3_bars_dn_time);            //поиск  сигнала на продажу от линии баланса (3 бара)
     }
  }
//+------------------------------------------------------------------+
//    сопровождение позиции (Трайлинг Стоп)
//+------------------------------------------------------------------+
void C_TS_BW::TrailingStop(void)
  {
   bool select=pos_info.Select(m_Symbol);
   if(select && (ENUM_POSITION_TYPE)pos_info.PositionType()==POSITION_TYPE_BUY
      && last_signals.zone_5_trall_green[0]>0 && inp_param.trall_4_dimension)
     {StopLoss=last_signals.zone_5_trall_green[0];}
   if(select && (ENUM_POSITION_TYPE)pos_info.PositionType()==POSITION_TYPE_SELL
      && last_signals.zone_5_trall_red[0]>0 && inp_param.trall_4_dimension)
     {StopLoss=last_signals.zone_5_trall_red[0];}
   if(select && StopLoss<0)
     {
      switch(inp_param.support_position)
        {
         case -1:       //Not_used=-1,               // Сопровождение стоповой цены у позиции не используется
           {break;}
         case 0:        //Trailing_On_Lips=0,        // Трейлиг стоп по по ЛинииГуб
           {StopLoss=lips[0];break;}
         case 1:        //Trailing_On_Teeth=1,       // Трейлиг стоп по Линии Зубов
           {StopLoss=teeth[0];break;}
         case 2:       //Trailing_On_Jaws=2,        // Трейлиг стоп по Линии Челюстей
           {StopLoss=jaw[0];break;}
        }
     }

//---
   if(StopLoss>0 && 
      ((pos_info.StopLoss()+s_info.Point()<StopLoss && (ENUM_POSITION_TYPE)pos_info.PositionType()==POSITION_TYPE_BUY && StopLoss<Close[0]-(s_info.StopsLevel()+s_info.Spread()*2)*s_info.Point()) || // проверка на минимальное изменение стопа
      (((pos_info.StopLoss()-s_info.Point()>StopLoss && pos_info.StopLoss()>0) || (pos_info.StopLoss()<s_info.Point()*5)) && (ENUM_POSITION_TYPE)pos_info.PositionType()==POSITION_TYPE_SELL && StopLoss>Close[0]+(s_info.StopsLevel()+s_info.Spread()*2)*s_info.Point()))) // проверка на минимальное изменение стопа
     {
      //MathSrand((int)TimeCurrent());
      //string nameojb="stop"+(string) MathRand();
      //ResetLastError();
      //datetime t1[1];
      //CopyTime(m_Symbol,m_Period,0,1,t1);
      //bool draw=ObjectCreate(0,nameojb,OBJ_ARROW_STOP,0,t1[0],StopLoss);
      //Print(nameojb," ",(string)draw,GetLastError());

      if(exp_trade.PositionModify(m_Symbol,NormalizeDouble(StopLoss,s_info.Digits()),pos_info.TakeProfit()))
        {StopLoss=-1.0;}
     }

   StopLoss=-1.0;

  }
//+------------------------------------------------------------------+
//    Торговля актуальных сигналов
//+------------------------------------------------------------------+
void C_TS_BW::TradeActualSignals(void)
  {
   s_info.Refresh();            // получаем окружение по символу
   if(actual_action.position_close)
     {
      if(exp_trade.PositionClose(m_Symbol,-1))
        {actual_action.position_close=false;}
     }
   if(actual_action.fractal_open_buy || actual_action.fractal_add_buy || actual_action.fractal_revers_sell_to_buy) // необходимо отправить ордер на покупку по сигналу от фрактала
     {
      if(Lot<0 && actual_action.fractal_open_buy){last_signals.zone_5_trall_green[0]=-1;} // нет открытых позиций - входим стартовым лотом
                                                                                          //if(Lot<0 && actual_action.fractal_add_buy){} // есть открытая позиция  Buy- входим доливочным лотом
      if(Lot<0 && actual_action.fractal_revers_sell_to_buy){last_signals.zone_5_trall_green[0]=-1;} // есть открытая позиция  Sell - входим переворотным лотом 
                                                                                                    //if(Lot>0)
        {
         last_trade.fractal_up=last_signals.fractal_up_time[0];
         if(SendOrder(ORDER_TYPE_BUY,last_signals.fractal_up,last_signals.fractal_up_time,"TC_BW_fr_"+TimeToString(last_signals.fractal_up_time[0])))
           {
            actual_action.fractal_open_buy=false;
            actual_action.fractal_add_buy=false;
            actual_action.fractal_revers_sell_to_buy=false;
            return;
           }
        }
     }
   if(actual_action.fractal_open_sell || actual_action.fractal_add_sell || actual_action.fractal_revers_buy_to_sell) // необходимо отправить ордер на продажу по сигналу от фрактала
     {
      if(Lot<0 && actual_action.fractal_open_sell){last_signals.zone_5_trall_red[0]=-1;} // нет открытых позиций - входим стартовым лотом
                                                                                         //if(Lot<0 && actual_action.fractal_add_sell){} // есть открытая позиция  Sell- входим доливочным лотом
      if(Lot<0 && actual_action.fractal_revers_buy_to_sell){last_signals.zone_5_trall_red[0]=-1;} // есть открытая позиция  Buy - входим переворотным лотом 
                                                                                                  //if(Lot>0)
        {
         last_trade.fractal_dn=last_signals.fractal_dn_time[0];
         if(SendOrder(ORDER_TYPE_SELL,last_signals.fractal_dn,last_signals.fractal_dn_time,"TC_BW_fr"+TimeToString(last_signals.fractal_dn_time[0])))
           {
            actual_action.fractal_open_sell=false;
            actual_action.fractal_add_sell=false;
            actual_action.fractal_revers_buy_to_sell=false;
            return;
           }
        }
     }
//---доливки от 2-5 измерений покупка
//---блюдце         
   if(actual_action.ao_bludce_buy) // необходимо отправить ордер на покупку по сигналу от АО "блюдце"
     {
      last_trade.ao_blydce=last_signals.bludce_up_time[0];
      if(SendOrder(ORDER_TYPE_BUY,last_signals.bludce_up,last_signals.bludce_up_time,"TC_BW_bl_"+TimeToString(last_signals.bludce_up_time[0])))
        {actual_action.ao_bludce_buy=false;return;}
     }
//--- пересечение нулевой линии          
   if(actual_action.ao_cross_zero_buy) // необходимо отправить ордер на покупку по сигналу от АО "пересечение нулевой линии"
     {
      last_trade.ao_cross_zero=last_signals.cross_zero_up_time[0];
      if(SendOrder(ORDER_TYPE_BUY,last_signals.cross_zero_up,last_signals.cross_zero_up_time,"TC_BW_cz_"+TimeToString(last_signals.cross_zero_up_time[0])))
        {actual_action.ao_cross_zero_buy=false;return;}
     }
//--- 2-х баровый сигнал на покупку от АС
   if(actual_action.ac_2_bar_buy) // необходимо отправить ордер на покупку по сигналу от АC "два зеленых бара"
     {
      last_trade.ac_2_bars=last_signals.ac_2_bars_up_time[0];
      if(SendOrder(ORDER_TYPE_BUY,last_signals.ac_2_bars_up,last_signals.ac_2_bars_up_time,"TC_BW_2g_"+TimeToString(last_signals.ac_2_bars_up_time[0])))
        {actual_action.ac_2_bar_buy=false;return;}
     }
//--- 3-х баровый сигнал на покупку от АС
   if(actual_action.ac_3_bar_buy) // необходимо отправить ордер на покупку по сигналу от АC "три зеленых бара"
     {
      last_trade.ac_3_bars=last_signals.ac_3_bars_up_time[0];
      if(SendOrder(ORDER_TYPE_BUY,last_signals.ac_3_bars_up,last_signals.ac_3_bars_up_time,"TC_BW_3g_"+TimeToString(last_signals.ac_3_bars_up_time[0])))
        {actual_action.ac_3_bar_buy=false;return;}
     }
//--- зеленая зона
   if(actual_action.zone_buy) // необходимо отправить ордер на покупку по сигналу от "зеленой зоны"
     {
      last_trade.zone=last_signals.zone_up_time[0];
      if(SendOrder(ORDER_TYPE_BUY,last_signals.zone_up,last_signals.zone_up_time,"TC_BW_z_"+TimeToString(last_signals.zone_up_time[0])))
        {actual_action.zone_buy=false;return;}
     }
//--- линия баланса 2-х баровый сигнал
   if(actual_action.line_balance_2_bar_buy) // необходимо отправить ордер на покупку по сигналу от линии бананса
     {
      last_trade.five_dimension=last_signals.five_dimension_2_bars_up_time[0];
      if(SendOrder(ORDER_TYPE_BUY,last_signals.five_dimension_2_bars_up,last_signals.five_dimension_2_bars_up_time,"BW_lb2_"+TimeToString(last_signals.five_dimension_2_bars_up_time[0])+DoubleToString(last_signals.five_dimension_2_bars_up[0],5)))
        { actual_action.line_balance_2_bar_buy=false;return;}
     }
//--- линия баланса 3-х баровый сигнал
   if(actual_action.line_balance_3_bar_buy) // необходимо отправить ордер на покупку по сигналу от линии бананса
     {
      last_trade.five_dimension=last_signals.five_dimension_3_bars_up_time[0];
      if(SendOrder(ORDER_TYPE_BUY,last_signals.five_dimension_3_bars_up,last_signals.five_dimension_3_bars_up_time,"BW_lb3_"+TimeToString(last_signals.five_dimension_3_bars_up_time[0])+DoubleToString(last_signals.five_dimension_3_bars_up[0],5)))
        {actual_action.line_balance_3_bar_buy=false;return;}
     }

//---
//---доливки в открытую позицию по направлению продажи
//---
   if(actual_action.ao_bludce_sell) // необходимо отправить ордер на продажу по сигналу от АО "блюдце"
     {
      last_trade.ao_blydce=last_signals.bludce_dn_time[0];
      if(SendOrder(ORDER_TYPE_SELL,last_signals.bludce_dn,last_signals.bludce_dn_time,"TC_BW_bl_"+TimeToString(last_signals.bludce_dn_time[0])))
        {actual_action.ao_bludce_sell=false;return;}
     }
   if(actual_action.ao_cross_zero_sell) // необходимо отправить ордер на продажу по сигналу от АО "пересечение нулевой линии"
     {
      last_trade.ao_cross_zero=last_signals.cross_zero_dn_time[0];
      if(SendOrder(ORDER_TYPE_SELL,last_signals.cross_zero_dn,last_signals.cross_zero_dn_time,"TC_BW_cz_"+TimeToString(last_signals.cross_zero_dn_time[0])))
        {actual_action.ao_cross_zero_sell=false;return;}
     }
//--- 2-х баровый сигнал на продажу от АС
   if(actual_action.ac_2_bar_sell) // необходимо отправить ордер на продажу по сигналу от АC "два красных бара"
     {
      last_trade.ac_2_bars=last_signals.ac_2_bars_dn_time[0];
      if(SendOrder(ORDER_TYPE_SELL,last_signals.ac_2_bars_dn,last_signals.ac_2_bars_dn_time,"TC_BW_2g_"+TimeToString(last_signals.ac_2_bars_dn_time[0])))
        {actual_action.ac_2_bar_sell=false;return;}
     }
//--- 3-х баровый сигнал на покупку от АС
   if(actual_action.ac_3_bar_sell) // необходимо отправить ордер на продажу по сигналу от АC "три красных бара"
     {
      last_trade.ac_3_bars=last_signals.ac_3_bars_dn_time[0];
      if(SendOrder(ORDER_TYPE_SELL,last_signals.ac_3_bars_dn,last_signals.ac_3_bars_dn_time,"TC_BW_3g_"+TimeToString(last_signals.ac_3_bars_dn_time[0])))
        {actual_action.ac_3_bar_sell=false;return;}
     }
//--- красная зона
   if(actual_action.zone_sell) // необходимо отправить ордер на продажу по сигналу от "красной зоны"
     {
      last_trade.zone=last_signals.zone_dn_time[0];
      if(SendOrder(ORDER_TYPE_SELL,last_signals.zone_dn,last_signals.zone_dn_time,"TC_BW_z_"+TimeToString(last_signals.zone_dn_time[0])))
        {actual_action.zone_sell=false;return;}
     }
//--- линия баланса 2-х баровый сигнал
   if(actual_action.line_balance_2_bar_sell) // необходимо отправить ордер на продажу по сигналу от линии бананса
     {
      last_trade.five_dimension=last_signals.five_dimension_2_bars_dn_time[0];
      if(SendOrder(ORDER_TYPE_SELL,last_signals.five_dimension_2_bars_dn,last_signals.five_dimension_2_bars_dn_time,"BW_lb2_"+TimeToString(last_signals.five_dimension_2_bars_dn_time[0])+DoubleToString(last_signals.five_dimension_2_bars_dn[0],5)))
        {actual_action.line_balance_2_bar_sell=false;return;}
     }
//--- линия баланса 3-х баровый сигнал
   if(actual_action.line_balance_3_bar_sell) // необходимо отправить ордер на продажу по сигналу от линии бананса
     {
      last_trade.five_dimension=last_signals.five_dimension_3_bars_dn_time[0];
      if(SendOrder(ORDER_TYPE_SELL,last_signals.five_dimension_3_bars_dn,last_signals.five_dimension_3_bars_dn_time,"BW_lb3_"+TimeToString(last_signals.five_dimension_3_bars_dn_time[0])+DoubleToString(last_signals.five_dimension_3_bars_dn[0],5)))
        {actual_action.line_balance_3_bar_sell=false;return;}
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//    Копирование значений индикакторов в массивы для поиска сигналов
//  type - что требуем  (0- аллигатор, 2 - АО, 3 - АС  )
//  countValue -  количество данных 
//+------------------------------------------------------------------+
bool C_TS_BW::CopyIndValue(int type,int countValue)
  {
   int copyCount=-1;
   switch(type)
     {
      case 0: // аллигатор
         copyCount=CopyBuffer(h_alligator,0,inp_param.alligator_jaw_shift,countValue,jaw); // челюсть
         //copyCount=CopyBuffer(h_alligator,0,0,countValue,jaw); // челюсть
         if(copyCount<1){break;}
         copyCount=CopyBuffer(h_alligator,1,inp_param.alligator_teeth_shift,countValue,teeth); // зубы
         if(copyCount<1){break;}
         copyCount=CopyBuffer(h_alligator,2,inp_param.alligator_lips_shift,countValue,lips); // губы
         if(copyCount<1){break;}
         break;
      case 2:     // AO
         copyCount=CopyBuffer(h_ao,0,0,countValue,AO_value);
         if(copyCount<1){break;}
         copyCount=CopyBuffer(h_ao,1,0,countValue,AO_color);
         if(copyCount<1){break;}
         break;
      case 3:     // AC
         copyCount=CopyBuffer(h_ac,0,0,countValue,AC_value);
         if(copyCount<1){break;}
         copyCount=CopyBuffer(h_ac,1,0,countValue,AC_color);
         if(copyCount<1){break;}
         break;
     }
   if(copyCount<1){return(false);}
   else{return(true);}

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|  // поиск сигналов от первого измерения                          |
//+------------------------------------------------------------------+

bool C_TS_BW::FindSignal_1_dimension(int type,double &price_out[],datetime &time_out[])
  {
   int i,copyCount=-1;
   double tmp_buf[1];
   price_out[0]=-1;
   for(i=3;i<50;i++)
     {
      copyCount=CopyBuffer(h_fractals,type,i,1,tmp_buf);
      if(copyCount<1){return(false);}
      if(tmp_buf[0]!=EMPTY_VALUE && price_out[0]==-1)
        {
         price_out[0]=tmp_buf[0];
         CopyTime(m_Symbol,m_Period,i,1,time_out); // копируем время найденного фрактала 
        }
     }
   return(true);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|    // поиск сигналов от второго измерения                        |
//+------------------------------------------------------------------+
bool C_TS_BW::FindSignal_2_dimension(int type,int sub_type,double &price_out[],datetime &time_out[])
  {
   int copyCount=-1;
// поиск сигналов от АО
   if((AO_value[1]>0 && AO_value[2]<0 && type==0 && sub_type==0) || // пересечение нулевой линии АО снизу вверх
      (AO_color[1]==0 && AO_color[2]==1 && AO_value[2]>0 && type==0 && sub_type==1)) // блюдце выше нулевой линии
     {
      CopyHigh(m_Symbol,m_Period,1,1,price_out);
      CopyTime(m_Symbol,m_Period,1,1,time_out);
     }
   if((AO_value[1]<0 && AO_value[2]>0 && type==1 && sub_type==0) || // пересечение нулевой линии АО cверху вниз 
      (AO_color[1]==1 && AO_color[2]==0 && AO_value[2]<0 && type==1 && sub_type==1)) // блюдце ниже нулевой линии
     {
      CopyLow(m_Symbol,m_Period,1,1,price_out);
      CopyTime(m_Symbol,m_Period,1,1,time_out);
     }
   return(true);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| поиск сигналов от  третьего измерения                            |
//+------------------------------------------------------------------+
bool C_TS_BW::FindSignal_3_dimension(int type,int sub_type,double &price_out[],datetime &time_out[])
  {
   int copyCount=-1;
   if((AC_color[1]==0  &&  AC_value[1]>0  &&  AC_color[2]==0  &&  AC_color[3]==1  &&  type==0  &&  sub_type==0) || //(покупка) АС по двум зеленым барам 
      (AC_color[1]==0 && AC_value[1]<0 && AC_color[2]==0 && AC_color[3]==0 && AC_color[4]==1 && type==0 && sub_type==1)) //(покупка) АС по трем  зеленым барам (когда третий зеленый ниже нуля)
     {
      copyCount=CopyHigh(m_Symbol,m_Period,1,1,price_out);
      if(copyCount<1){return(false);}
      CopyTime(m_Symbol,m_Period,1,1,time_out);
     }
   if((AC_color[1]==1  &&  AC_value[1]<0  &&  AC_color[2]==1  &&  AC_color[3]==0  &&  type==1  &&  sub_type==0) || //(продажа) АС по двум красным барам 
      (AC_color[1]==1 && AC_value[1]>0 && AC_color[2]==1 && AC_color[3]==1 && AC_color[4]==0 && type==1 && sub_type==1)) //(продажа) АС по трем  красным барам (когда третий красный выше нуля)
     {
      copyCount=CopyLow(m_Symbol,m_Period,1,1,price_out);
      if(copyCount<1){return(false);}
      CopyTime(m_Symbol,m_Period,1,1,time_out);

     }
   return(true);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|  поиск cигналов от четвертого измерения                          |
//+------------------------------------------------------------------+
bool C_TS_BW::FindSignal_4_dimension(int type,int sub_type,double &price_out[],datetime &time_out[])
  {
   int copyCount=-1;
   bool find_green_zone=true,find_red_zone=true;
   bool limit_green_zone=true,limit_red_zone=true;
   double tmp_h[1],tmp_l[1]; // временные массивы для хая и лоу
   if(sub_type==0) // поиск входов по сигналам от зон
     {
      copyCount=CopyClose(m_Symbol,m_Period,0,3,Close);
      if(copyCount<1){return(false);}
      if(AO_color[1]==0 && AO_color[2]==0 && AC_color[1]==0 && AC_color[2]==0 && Close[1]>Close[2] && type==0) // два подряд зеленых бара 
        {
         CopyHigh(m_Symbol,m_Period,1,1,price_out);
         CopyTime(m_Symbol,m_Period,1,1,time_out);
        }
      if(AO_color[1]==1 && AO_color[2]==1 && AC_color[1]==1 && AC_color[2]==1 && Close[1]<Close[2] && type==1) // два подряд красных бара
        {
         CopyLow(m_Symbol,m_Period,1,1,price_out);
         CopyTime(m_Symbol,m_Period,1,1,time_out);
        }
     }
   if(sub_type==1) // трайлинг стоп по 5-ти барам одного цвета
     {
      for(int y=1;y<=5;y++)
        {
         if(AO_color[y]==1 || AC_color[y]==1){find_green_zone=false;}
         if(AO_color[y]==0 || AC_color[y]==0){find_red_zone=false;}
        }
      if(find_green_zone && price_out[0]<0 && type==0)
        {
         CopyLow(m_Symbol,m_Period,1,1,price_out);  // если у нас небыло цены для тралла то устанавливаем ее под лоу 1-го бара (пятый зеленый)
        }
      if(find_red_zone && price_out[0]<0 && type==1)
        {
         CopyHigh(m_Symbol,m_Period,1,1,price_out); // если у нас небыло цены для тралла то устанавливаем ее над хаем 1-го бара (пятый красный)
        }
      // подтягивание несработанного стопа при необходимости (возвращаем цену для переноса стоплосса)
      CopyHigh(m_Symbol,m_Period,1,1,tmp_h);
      CopyLow(m_Symbol,m_Period,1,1,tmp_l);
      if(price_out[0]>0 && type==0)
        {
         if(price_out[0]>tmp_l[0]){price_out[0]=-1;}           // поидее должен был сработать стоп 
         if(price_out[0]<tmp_l[0]){price_out[0]=tmp_l[0];}    // переносим стоп выше
        }
      if(price_out[0]>0 && type==1)
        {
         if(price_out[0]<tmp_h[0]){price_out[0]=-1;}               // поидее должен был сработать стоп 
         if(price_out[0]>tmp_h[0]){price_out[0]=tmp_h[0];}         // переносим стоп ниже
        }
     }//if(sub_type==1)
   if(sub_type==2) //ограничения на вход по количеству подряд зон
     {
      for(int t=1;t<=inp_param.max_4_dimension_zone;t++)
        {
         if((AO_color[t]==1 || AC_color[t]==1) && type==0){limit_green_zone=false;}
         if((AO_color[t]==0 || AC_color[t]==0) && type==1){limit_red_zone=false;}
        }
      if((limit_green_zone && type==0) || (limit_red_zone && type==1)){price_out[0]=-1;time_out[0]=-1;}
     }
   return(true);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| поиск сигналов от пятного измерения                              |
//+------------------------------------------------------------------+
bool C_TS_BW::FindSignal_5_dimension(int type,int sub_type,double &price_out[],datetime &time_out[])
  {
   int copyCount=-1;
   int count_2_bars=0,count_3_bars=0,n;
   double high_tmp,low_tmp;
   price_out[0]=-1;
   time_out[0]=-1;
   if(type==0)
     {
      copyCount=CopyHigh(m_Symbol,m_Period,0,10,High);
      if(copyCount<1){return(false);}
      high_tmp=High[0];
      if(High[0]>jaw[0])
        {
         for(n=1;n<10;n++)
           {
            if(high_tmp<High[n]){high_tmp=High[n];count_2_bars++;count_3_bars++;}
            if((count_2_bars==1 && sub_type==0) || (count_3_bars==2 && sub_type==1))
              {
               price_out[0]=high_tmp;
               CopyTime(m_Symbol,m_Period,n,1,time_out);
               break;
              }
           }
        }
     }
   if(type==1)
     {
      copyCount=CopyLow(m_Symbol,m_Period,0,10,Low);
      if(copyCount<1){return(false);}
      low_tmp=Low[0];
      if(Low[0]<jaw[0])
        {
         for(n=1;n<10;n++)
           {
            if(low_tmp>Low[n]){low_tmp=Low[n];count_2_bars++;count_3_bars++;}
            if((count_2_bars==1 && sub_type==0) || (count_3_bars==2 && sub_type==1))
              {
               price_out[0]=low_tmp;
               CopyTime(m_Symbol,m_Period,n,1,time_out);
               break;
              }
           }
        }
     }

   return(false);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|  Проверка сигналов на возможность входа по текущей цене          |
//+------------------------------------------------------------------+
bool C_TS_BW::CheckForTradeSignal(int dimension,int type,int sub_type,double &price_out[],datetime &time_out[])
  {
   int copyCount=-1;
   copyCount=CopyHigh(m_Symbol,m_Period,0,1,High);
   if(copyCount<1){return(false);}
   copyCount=CopyLow(m_Symbol,m_Period,0,1,Low);
   if(copyCount<1){return(false);}
   switch(dimension)
     {
      case 1:   // проверка фракталов
        {
         if((type==0 && High[0]>price_out[0] && High[0]<teeth[0] && price_out[0]>0) || // пробитие фрактала на покупку ниже чем зубы аллигаторы - выключаем данный фрактал из работы
            (type==1 && Low[0]<price_out[0] && Low[0]>teeth[0] && price_out[0]>0)) // пробитие фрактала на продажу выше чем зубы аллигаторы - выключаем данный фрактал из работы
           {
            if(type==0){last_trade.fractal_up=time_out[0];}
            if(type==1){last_trade.fractal_dn=time_out[0];}
            time_out[0]=-1;
            price_out[0]=-1;
            return(false);
            break;
           }
         //--- покупка
         if(type==0                                   // если направление Бай
            && High[0]>price_out[0]                   // если текущий Хай больше чем актуальный фрактал на покупку
            && time_out[0]!=last_trade.fractal_up     // если данный сигнал еще не торговался
            && High[0]>teeth[0]                       // если текущей Хай больше зубов на нулевом баре
            && price_out[0]>0)                        // если цена фрактала больше нуля (не сброшена в -1)
           {return(true);}                            // поступает команда на отправку ордера
         //--- продажа
         if(type==1                                   // если направление Cелл
            && Low[0]<price_out[0]                    // если текущий Лоу Меньше чем актуальный фрактал на продажу
            && time_out[0]!=last_trade.fractal_dn     // если данный сигнал еще не торговался
            && Low[0]<teeth[0]                        // если текущей Лоу меньше зубов на нулевом баре
            && price_out[0]>0)                        // если цена фрактала больше нуля (не сброшена в -1)
           {return(true);}                            // поступает команда на отправку ордера
         break;
        }
      case 2:   // проверка сигналов от АО
        {
         if(High[0]>price_out[0] &&  High[0]>teeth[0] &&  price_out[0]>0  &&  type==0  &&  // покупку
            ((time_out[0]!=last_trade.ao_blydce && sub_type==1) ||                         // блюдце
            (time_out[0]!=last_trade.ao_cross_zero && sub_type==0)))                       // пересечение нулеовой линии
           {return(true);}
         if(Low[0]<price_out[0] && Low[0]<teeth[0] && price_out[0]>0 && type==1 && // продажа
            ((time_out[0]!=last_trade.ao_blydce && sub_type==1) ||                         // блюдце
            (time_out[0]!=last_trade.ao_cross_zero && sub_type==0)))                       // пересечение нулеовой линии
           {return(true);}
         break;
        }
      case 3:   // проверка сигналов от АC
        {
         if(High[0]>price_out[0] &&  High[0]>teeth[0] &&  price_out[0]>0  &&  type==0  &&  // покупку
            ((time_out[0]!=last_trade.ac_2_bars && sub_type==0) ||                         // по двум зеленым барам
            (time_out[0]!=last_trade.ac_3_bars && sub_type==1)))                           // по трем зеленым барам
           {
            if(AC_color[0]==1){price_out[0]=-1;time_out[0]=-1;return(false);}              // если текущей бар на момент сработки сигнала на АО красный - анулируем сигнал
            else{return(true);}
           }
         if(Low[0]<price_out[0] && Low[0]<teeth[0] && price_out[0]>0 && type==1 && // продажа
            ((time_out[0]!=last_trade.ac_2_bars && sub_type==0) ||                         // по двум красным барам
            (time_out[0]!=last_trade.ac_3_bars && sub_type==1)))                           // по трем красным барам
           {
            if(AC_color[0]==0){price_out[0]=-1;time_out[0]=-1;return(false);}              // если текущей бар на момент сработки сигнала на АО зеленый - анулируем сигнал
            else{return(true);}
           }
         break;
        }
      case 4:
        {
         if(High[0]>teeth[0]&& price_out[0]>0 && type==0 && time_out[0]!=last_trade.zone){return(true);}
         if(Low[0]<teeth[0] && price_out[0]>0 && type==1 && time_out[0]!=last_trade.zone){return(true);}
         break;
        }
      case 5:
        {
         if(High[0]>price_out[0] && High[0]>teeth[0] && price_out[0]>0 && type==0 && // покупка
            time_out[0]!=last_trade.five_dimension && 
            ((AO_color[0]==0 && AC_color[0]==0 && sub_type==0) ||   // зеленая зона и двухбаровый сигнал
            ((AO_color[0]==1 || AC_color[0]==1) && sub_type==1)))   // красная или серая зона и трехбаровый сигнал
           {return(true);}
         if(Low[0]<price_out[0] && Low[0]<teeth[0] && price_out[0]>0 && type==1 && // продажа
            time_out[0]!=last_trade.five_dimension && 
            ((AO_color[0]==1 && AC_color[0]==1 && sub_type==0) ||   // красная  зона и двухбаровый сигнал
            ((AO_color[0]==0 || AC_color[0]==0) && sub_type==1)))   // зеленая или серая зона и трехбаровый сигнал

           {return(true);}
         break;
        }
      break;
     }
   return(false);// по умолчанию возвразаем false
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| отпрвка ордера на сервер с вызовом  проверки результата          |
//+------------------------------------------------------------------+
bool C_TS_BW::SendOrder(ENUM_ORDER_TYPE type,double &price_out[],datetime &time_out[],string comment)
  {
// расчет магика
   bool needCalcMagic=true;
   //Print("mag=",(string) Magic," lot=",Lot);
   if(actual_action.fractal_open_buy || actual_action.fractal_open_sell){needCalcMagic=false;Magic=1000;actual_action.init();}
   if(actual_action.fractal_revers_buy_to_sell || actual_action.fractal_revers_sell_to_buy){needCalcMagic=false;Magic=999;actual_action.init();}
   if(needCalcMagic){CalcMagic(Magic);}

   exp_trade.SetExpertMagicNumber(Magic); // устанавливаем магик
                                          //exp_trade.PrintRequest();
   double price,sl,tp=0.0;
   bool ret=false;
   s_info.RefreshRates();
// вычисляем необходимый лот 

   if(Lot<0) // внешний лот не установлен
     {
      if(inp_param.agress_trade_mm)
        {
         if(Magic==1000){CalcLot(false,0.0,0);}  // стартовый 
         if(Magic==999){CalcLot(false,0.0,-1);}   // переворотный
         if(Magic==1005){CalcLot(false,0.0,5);}   // доливочный х5
         if(Magic==1004){CalcLot(false,0.0,4);}   // доливочный х4
         if(Magic==1003){CalcLot(false,0.0,3);}   // доливочный х3
         if(Magic==1002){CalcLot(false,0.0,2);}   // доливочный х2
         if(Magic==1001){CalcLot(false,0.0,1);}   // доливочный х1
        }
      else
        {
         if(Magic>=1000 && Magic<=1005){CalcLot(false,0.0,1);}  // стартовый 
         if(Magic==999){CalcLot(false,0.0,-1);}   // переворотный
        }
     }
   //Print("m=",(string) Magic," lot=",Lot);
   if(type==ORDER_TYPE_BUY)
     {
      price=s_info.Ask();
      //sl=NormalizeDouble(jaw[0],s_info.Digits());
      sl=0.0;
      if(exp_trade.PositionOpen(m_Symbol,ORDER_TYPE_BUY,Lot,price,sl,0.0,comment))
        {ret=true;}
     }
   if(type==ORDER_TYPE_SELL)
     {
      price=s_info.Bid();
      //sl=NormalizeDouble(jaw[0],s_info.Digits());
      sl=0.0;
      if(exp_trade.PositionOpen(m_Symbol,ORDER_TYPE_SELL,Lot,price,sl,0.0,comment))
        {ret=true;}
     }
   price_out[0]=-1; time_out[0]=-1;Lot=-1.0;

   if(ret)
     {
      if(actual_action.fractal_open_buy || actual_action.fractal_open_sell){actual_action.init();}
      if(actual_action.fractal_revers_buy_to_sell || actual_action.fractal_revers_sell_to_buy){actual_action.init();}
     }

   return(ret);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|  Расчет лота                                                                 |
//+------------------------------------------------------------------+
void C_TS_BW::CalcLot(bool external,double ext_lot,int type)
  {
   if(external){Lot=ext_lot;return;}
   if(!external)
     {
      if(type==0) // стартовый лот
        {if(inp_param.lot>0){Lot=inp_param.lot;}}
      if(type==-1) // переворотный лот 
        {if(inp_param.lot>0){Lot=inp_param.lot+pos_info.Volume();}}
      if(type==5) // доливочный х5
        {if(inp_param.lot>0){Lot=inp_param.lot*5;}}
      if(type==4) // доливочный х4
        {if(inp_param.lot>0){Lot=inp_param.lot*4;}}
      if(type==3) // доливочный х3
        {if(inp_param.lot>0){Lot=inp_param.lot*3;}}
      if(type==2) // доливочный х2
        {if(inp_param.lot>0){Lot=inp_param.lot*2;}}
      if(type==1) // доливочный х1
        {if(inp_param.lot>0){Lot=inp_param.lot*1;}}
     }

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|  проверка необходимых действий на текущем тике                   |
//+------------------------------------------------------------------+
void C_TS_BW::CheckActionOnTick(void)
  {
   bool select_pos=pos_info.Select(m_Symbol);
/// нет торговой позиции по данному инструменту -  проверяем необходимость входов по фракталам за  пределами пасти аллигатора

   if(CheckForTradeSignal(1,0,0,last_signals.fractal_up,last_signals.fractal_up_time)) // необходимо отправить ордер на покупку по сигналу от фрактала
     {
      if(!select_pos){actual_action.fractal_open_buy=true;} // нет открытых позиций - входим стартовым лотом
      if(select_pos && (ENUM_POSITION_TYPE)pos_info.PositionType()==POSITION_TYPE_BUY && inp_param.add_1_dimension && last_signals.alligator_trend[0]){actual_action.fractal_add_buy=true;} // есть открытая позиция  Buy- входим доливочным лотом
      if(select_pos && (ENUM_POSITION_TYPE)pos_info.PositionType()==POSITION_TYPE_SELL){actual_action.fractal_revers_sell_to_buy=true;} // есть открытая позиция  Sell - входим переворотным лотом 
     }
   if(CheckForTradeSignal(1,1,0,last_signals.fractal_dn,last_signals.fractal_dn_time)) // необходимо отправить ордер на продажу по сигналу от фрактала
     {
      if(!select_pos){actual_action.fractal_open_sell=true;} // нет открытых позиций - входим стартовым лотом
      if(select_pos && (ENUM_POSITION_TYPE)pos_info.PositionType()==POSITION_TYPE_SELL && inp_param.add_1_dimension  && last_signals.alligator_trend[1]){actual_action.fractal_add_sell=true;} // есть открытая позиция  Sell- входим доливочным лотом
      if(select_pos && (ENUM_POSITION_TYPE)pos_info.PositionType()==POSITION_TYPE_BUY){actual_action.fractal_revers_buy_to_sell=true;} // есть открытая позиция  Buy - входим переворотным лотом 
     }
//---доливки от 2-5 измерений buy
   if(select_pos && (ENUM_POSITION_TYPE)pos_info.PositionType()==POSITION_TYPE_BUY) /// доливки в открытую позицию по направлению покупки
     {
      //---блюдце         
      if(inp_param.add_2_dimension_bludce && CheckForTradeSignal(2,0,1,last_signals.bludce_up,last_signals.bludce_up_time)) // необходимо отправить ордер на покупку по сигналу от АО "блюдце"
        {actual_action.ao_bludce_buy=true;}
      //--- пересечение нулевой линии          
      if(inp_param.add_2_dimension_cross_zero && CheckForTradeSignal(2,0,0,last_signals.cross_zero_up,last_signals.cross_zero_up_time)) // необходимо отправить ордер на покупку по сигналу от АО "пересечение нулевой линии"
        {actual_action.ao_cross_zero_buy=true;}
      //--- 2-х баровый сигнал на покупку от АС
      if(inp_param.add_3_dimension_use_2_bars && CheckForTradeSignal(3,0,0,last_signals.ac_2_bars_up,last_signals.ac_2_bars_up_time)) // необходимо отправить ордер на покупку по сигналу от АC "два зеленых бара"
        {actual_action.ac_2_bar_buy=true;}
      //--- 3-х баровый сигнал на покупку от АС
      if(inp_param.add_3_dimension_use_3_bars && CheckForTradeSignal(3,0,1,last_signals.ac_3_bars_up,last_signals.ac_3_bars_up_time)) // необходимо отправить ордер на покупку по сигналу от АC "три зеленых бара"
        {actual_action.ac_3_bar_buy=true;}
      //--- зеленая зона
      if(inp_param.add_4_dimension_zone && CheckForTradeSignal(4,0,0,last_signals.zone_up,last_signals.zone_up_time)) // необходимо отправить ордер на покупку по сигналу от AO + AC (Зеленая зона)
        {actual_action.zone_buy=true;}
      //--- пятое измерение двух баровый сигнал покупка
      if(inp_param.add_5_dimension && CheckForTradeSignal(5,0,0,last_signals.five_dimension_2_bars_up,last_signals.five_dimension_2_bars_up_time)) // необходимо отправить ордер на покупку по сигналу от линии баланса  
        {actual_action.line_balance_2_bar_buy=true;}
      //--- пятое измерение трех баровый сигнал покупка
      if(inp_param.add_5_dimension && CheckForTradeSignal(5,0,1,last_signals.five_dimension_3_bars_up,last_signals.five_dimension_3_bars_up_time)) // необходимо отправить ордер на покупку по сигналу от линии баланса  
        {actual_action.line_balance_3_bar_buy=true;}

     }
//--- доливки от 2-5 измерений sell
   if(select_pos && (ENUM_POSITION_TYPE)pos_info.PositionType()==POSITION_TYPE_SELL) /// доливки в открытую позицию по направлению продажи
     {
      //--- блюдце
      if(inp_param.add_2_dimension_bludce && CheckForTradeSignal(2,1,1,last_signals.bludce_dn,last_signals.bludce_dn_time)) // необходимо отправить ордер на продажу по сигналу от АО "блюдце"
        {actual_action.ao_bludce_sell=true;}
      //--- пересечение нулевой линии
      if(inp_param.add_2_dimension_cross_zero && CheckForTradeSignal(2,1,0,last_signals.cross_zero_dn,last_signals.cross_zero_dn_time)) // необходимо отправить ордер на продажу по сигналу от АО "пересечение нулевой линии"
        {actual_action.ao_cross_zero_sell=true;}
      //--- 2-х баровый сигнал на продажу от АС
      if(inp_param.add_3_dimension_use_2_bars && CheckForTradeSignal(3,1,0,last_signals.ac_2_bars_dn,last_signals.ac_2_bars_dn_time)) // необходимо отправить ордер на продажу по сигналу от АC "два красных бара"
        {actual_action.ac_2_bar_sell=true;}
      //--- 3-х баровый сигнал на покупку от АС
      if(inp_param.add_3_dimension_use_3_bars && CheckForTradeSignal(3,1,1,last_signals.ac_3_bars_dn,last_signals.ac_3_bars_dn_time)) // необходимо отправить ордер на продажу по сигналу от АC "три красных бара"
        {actual_action.ac_3_bar_sell=true;}
      //---красная зона
      if(inp_param.add_4_dimension_zone && CheckForTradeSignal(4,1,0,last_signals.zone_dn,last_signals.zone_dn_time)) // необходимо отправить ордер на продажу по сигналу от AO + AC (красная зона)
        {actual_action.zone_sell=true;}
      //--- пятое измерение двух баровый сигнал продажа
      if(inp_param.add_5_dimension && CheckForTradeSignal(5,1,0,last_signals.five_dimension_2_bars_dn,last_signals.five_dimension_2_bars_dn_time)) // необходимо отправить ордер на продажу по сигналу от линии баланса  
        {actual_action.line_balance_2_bar_sell=true;}
      //--- пятое измерение трех баровый сигнал продажа
      if(inp_param.add_5_dimension && CheckForTradeSignal(5,1,1,last_signals.five_dimension_3_bars_dn,last_signals.five_dimension_3_bars_dn_time)) // необходимо отправить ордер на продажу по сигналу от линии баланса  
        {actual_action.line_balance_3_bar_sell=true;}
     }
   return;
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|  Вычисление магика                                               |
//+------------------------------------------------------------------+
ulong C_TS_BW::CalcMagic(ulong  &magic)
  {
   if(magic==-1) // только после старта 
     {
      HistorySelect(TimeCurrent()-PeriodSeconds(PERIOD_MN1)*3,TimeCurrent());
      int countHistoryOrders=HistoryOrdersTotal();
      for(int n=countHistoryOrders-1;n>=0;n++)
        {
         h_info.SelectByIndex(n);
         magic=h_info.Magic();
         if(magic>0 && h_info.Symbol()==m_Symbol && magic>1000 && magic<=1005)
           {
            break;
           }
        }
     }
// генерим новый магик
   switch(magic)
     {
      case 999: // последним в истории был переворотный ордер
        {magic=1005;break;}
      case 1000: // // последним в истории был ордер стартовым лотом 
        {magic=1005;break;}
      case 1005: // последним в истории был второй по счету ордер в позиции (если включено inp_param.agress_trade_mm то х5 лотом)
        {magic=1004;break;}
      case 1004: // последним в истории был третий по счету ордер в позиции (если включено inp_param.agress_trade_mm х4 лотом )
        {magic=1003;break;}
      case 1003: // последним в истории был четвертый по счету ордер в позиции (если включено inp_param.agress_trade_mm х3 лотом )
        {magic=1002;break;}
      case 1002: // последним в истории был пятый по счету ордер в позиции (если включено inp_param.agress_trade_m m х2` лотом )
        {magic=1001;break;}
      case 1001: // последним в истории был шестой и более по счету ордер в позиции (если включено inp_param.agress_trade_mm  х1 лотом )
        {magic=1001;break;}
     }
   return(magic);
  }
//+------------------------------------------------------------------+
//|  Прием внешнего стопа                                            |
//+------------------------------------------------------------------+
void C_TS_BW::SetStopLoss(double &stoploss)
  {StopLoss=stoploss;return;}

//+------------------------------------------------------------------+
//| Конец                                                                  |
//+------------------------------------------------------------------+
