#property copyright "Copyright 2011-2021, Level Up Software"

static bool IS_TESTING = (bool)MQLInfoInteger(MQL_TESTER);

enum ENUM_BOOL
{
#ifdef P_RENKO_BR
   BFalse = 0,                // Não 
   BTrue = 1,                 // Sim 
#else
   BFalse = 0,                // No 
   BTrue = 1,                 // Yes 
#endif
};

enum ENUM_MA_METHOD_EXT
{
#ifdef P_RENKO_BR
   _MODE_SMA = 0,             // Simples 
   _MODE_EMA,                 // Exponencial 
   _MODE_SMMA,                // Suavizada 
   _MODE_LWMA,                // Ponderada
   _VWAP_TICKVOL = 997,       // VWMA (tick volume)
   _VWAP_REALVOL = 998,       // VWMA (real volume)
   _LINEAR_REGRESSION = 999,  // Linear regression
#else
   _MODE_SMA = 0,             // Simple
   _MODE_EMA,                 // Exponential
   _MODE_SMMA,                // Smoothed
   _MODE_LWMA,                // Linear-weighted
   _VWAP_TICKVOL = 997,       // Volume-weighted (tick volume)
   _VWAP_REALVOL = 998,       // Volume-weighted (real volume)
   _LINEAR_REGRESSION = 999,  // Linear regression
#endif
};

enum ENUM_CHANNEL_TYPE
{
#ifdef AMP_VERSION

   _None = 0,                 // No
   _Keltner_Channel = 4,      // Yes

#else

   #ifdef P_RENKO_BR
      _None = 0,                 // Nenhum
      _Donchian_Channel = 1,     // Canais de Donchian
      _Bollinger_Bands = 2,      // Bandas de Bollinger
      _SuperTrend = 3,           // Super Trend
      _Keltner_Channel = 4,      // Canais de Keltner
   #else   
      _None = 0,                 // None
      _Donchian_Channel = 1,     // Donchian Channel
      _Bollinger_Bands = 2,      // Bollinger Bands
      _SuperTrend = 3,           // Super Trend
      _Keltner_Channel = 4,      // Keltner Channel
   #endif

#endif // AMP_VERSION   
};

enum ENUM_TICK_PRICE_TYPE
{
   tickBid,                   // Bid price
   tickAsk,                   // Ask price
   tickLast,                  // Last price
};

enum ENUM_PIVOT_POINTS
{
#ifdef P_RENKO_BR
   ppNone = 0,                // Nenhum
   ppPrevHLC,                 // HLC Dia Anterior
   ppClassic,                 // Clássico
   ppClassicPrevHLC,          // Clássico + HLC Dia Anterior
   ppFibo,                    // Fibonacci
   ppFiboPrevHLC,             // Fibonacci + HLC Dia Anterior
#else
   ppNone = 0,                // None
   ppPrevHLC,                 // Previous day HLC
   ppClassic,                 // Classic
   ppClassicPrevHLC,          // Classic + Prev HLC
   ppFibo,                    // Fibonacci
   ppFiboPrevHLC,             // Fibonacci + Prev HLC
#endif
};

enum ENUM_PIVOT_TYPE
{
#ifdef P_RENKO_BR
   ppCalcNone = 0,             // Nenhum
   ppHLC3 = 1,                 // (H+L+C) / 3
   ppOHLC4 = 2,                // (O+H+L+C) / 4
#else
   ppCalcNone = 0,             // None
   ppHLC3 = 1,                 // (H+L+C) / 3
   ppOHLC4 = 2,                // (O+H+L+C) / 4
#endif
};

enum ENUM_ALERT_TYPE 
{
   ALERT_NEW_BAR_BULL = 0,
   ALERT_NEW_BAR_BEAR,
   ALERT_MA_CROSS_BULL,
   ALERT_MA_CROSS_BEAR,
};

enum ENUM_MA_LINE_TYPE
{
   MA_NONE = DRAW_NONE,       // Don't show
#ifdef P_RENKO_BR
   MA_LINE = DRAW_LINE,       // Linha   
   MA_DOTS = DRAW_ARROW,      // Pontilhado
#else
   MA_LINE = DRAW_LINE,       // Line   
   MA_DOTS = DRAW_ARROW,      // Dots
#endif 
};

enum ENUM_CHART_INFO
{
   CHART_INFO_NONE = 0,       // None   
};

enum ENUM_VOLUME_CHART_CALCULATION
{
   VOLUME_CHART_USE_VOLUME,   // Volume chart
   VOLUME_CHART_USE_TICKS,    // Tick chart
};

enum ENUM_ALERT_WHEN
{
#ifdef P_RENKO_BR
   ALERT_WHEN_None = 0,       // Nenhum
   ALERT_WHEN_NewBar,         // Nova barra
   ALERT_WHEN_Reversal,       // Barra de reversão
   ALERT_WHEN_NewBullishReversal, // Barra de reversão de alta
   ALERT_WHEN_NewBearishReversal, // Barra de reversão de baixa
   ALERT_WHEN_MaCross,        // Cruzamento Médias MA1 e MA2
   ALERT_WHEN_NewBarReversal, // Nova barra & Barra de Reversão
   ALERT_WHEN_NewBarMaCross,  // Nova barra & Cruzamento Médias
   ALERT_WHEN_ReversalMaCross,// Barra de Reversão & Cruzamento Médias
   ALERT_WHEN_All,            // Nova Barra & Barra de Reversão & Cruzamento Médias
#else
   ALERT_WHEN_None = 0,       // None
   ALERT_WHEN_NewBar,         // New bar
   ALERT_WHEN_Reversal,       // Reversal bar
   ALERT_WHEN_NewBullishReversal, // Bullish reversal bar
   ALERT_WHEN_NewBearishReversal, // Bearish reversal bar
   ALERT_WHEN_MaCross,        // MA1 & MA2 crossover
   ALERT_WHEN_NewBarReversal, // New bar & Reversal bar
   ALERT_WHEN_NewBarMaCross,  // New bar & MA cross
   ALERT_WHEN_ReversalMaCross,// Reversal bar & MA cross
   ALERT_WHEN_All,            // New bar & reversal bar & MA cross
#endif
};

enum ENUM_ALERT_NOTIFY_TYPE
{
#ifdef P_RENKO_BR
   ALERT_NOTIFY_TYPE_None = 0,   // Nenhum
   ALERT_NOTIFY_TYPE_Msg,        // Mostrar com box de alerta
   ALERT_NOTIFY_TYPE_Sound,      // Tocar som
   ALERT_NOTIFY_TYPE_Push,       // Enviar Notificação Push
   ALERT_NOTIFY_TYPE_MsgSound,   // Mostrar alerta & Tocar som
   ALERT_NOTIFY_TYPE_SoundPush,  // Tocar som & Enviar notificação push
   ALERT_NOTIFY_TYPE_MsgPush,    // Mostrar alerta & Enviar notificação push
   ALERT_NOTIFY_TYPE_All,        // Mostrar alerta & Tocar som & Enviar notificação push
#else
   ALERT_NOTIFY_TYPE_None = 0,   // None
   ALERT_NOTIFY_TYPE_Msg,        // Show in alert box
   ALERT_NOTIFY_TYPE_Sound,      // Play sound
   ALERT_NOTIFY_TYPE_Push,       // Send push notification
   ALERT_NOTIFY_TYPE_MsgSound,   // Show alert & Sound
   ALERT_NOTIFY_TYPE_SoundPush,  // Play sound & Push notify
   ALERT_NOTIFY_TYPE_MsgPush,    // Show alert & Push notify
   ALERT_NOTIFY_TYPE_All,        // Alert & Sound & Push notify
#endif
};

//
//  Settigns used by CustomBarProcessor class for alert & info purposes
//

struct ALERT_INFO_SETTINGS
{
   string            TradingSessionTime;
   color             OffMarketColor;
   
   double            TopBottomPaddingPercentage;
   ENUM_PIVOT_POINTS showPiovots;
   ENUM_PIVOT_TYPE   pivotPointCalculationType; 
   color             Rcolor;
   color             Pcolor;
   color             Scolor;
   color             PDHColor;
   color             PDLColor;
   color             PDCColor;   
   ENUM_BOOL         showNextBarLevels;
   color             HighThresholdIndicatorColor;
   color             LowThresholdIndicatorColor;
   ENUM_BOOL         showCurrentBarOpenTime;
   color             InfoTextColor;
   
   ENUM_BOOL         NewBarAlert;
   ENUM_BOOL         ReversalBarAlert;
   ENUM_BOOL         BullishReversalAlert;
   ENUM_BOOL         BearishReversalAlert;
   ENUM_BOOL         MaCrossAlert;
   ENUM_BOOL         UseAlertWindow;
   ENUM_BOOL         UseSound; 
   ENUM_BOOL         UsePushNotifications;
   string            SoundFileBull;
   string            SoundFileBear;
   
   ENUM_BOOL         DisplayAsBarChart;
};

//
// Settgins used for custom symbol chart
// 

struct CUSTOM_SYMBOL_SETTINGS
{
   string            CustomChartName;
   string            ApplyTemplate;
   bool              ForBacktesting;
   bool              ForceFasterRefresh;
};

//
// Settings used for on chart indicators
//

struct CHART_INDICATOR_SETTINGS
{
   //ENUM_BOOL            MA1on; 
   ENUM_MA_LINE_TYPE    MA1lineType;
   int                  MA1period;
   ENUM_MA_METHOD_EXT   MA1method;
   ENUM_APPLIED_PRICE   MA1applyTo;
   int                  MA1shift;
   ENUM_BOOL            MA1priceLabel;
   
   //ENUM_BOOL            MA2on; 
   ENUM_MA_LINE_TYPE    MA2lineType;
   int                  MA2period;
   ENUM_MA_METHOD_EXT   MA2method;
   ENUM_APPLIED_PRICE   MA2applyTo;
   int                  MA2shift;
   ENUM_BOOL            MA2priceLabel;
   
   //ENUM_BOOL            MA3on; 
   ENUM_MA_LINE_TYPE    MA3lineType;
   int                  MA3period;
   ENUM_MA_METHOD_EXT   MA3method;
   ENUM_APPLIED_PRICE   MA3applyTo;
   int                  MA3shift;
   ENUM_BOOL            MA3priceLabel;

   //ENUM_BOOL            MA4on; 
   ENUM_MA_LINE_TYPE    MA4lineType;   
   int                  MA4period;
   ENUM_MA_METHOD_EXT   MA4method;
   ENUM_APPLIED_PRICE   MA4applyTo;
   int                  MA4shift;
   ENUM_BOOL            MA4priceLabel;            
   
   ENUM_CHANNEL_TYPE    ShowChannel;      
   ENUM_APPLIED_PRICE   ChannelAppliedPrice;
   int                  ChannelPeriod;
   int                  ChannelAtrPeriod;
   double               ChannelMultiplier;
   double               ChannelBandsDeviations;
   ENUM_BOOL            ChannelPriceLabel;
   ENUM_BOOL            ChannelMidPriceLabel;
   
   ENUM_BOOL            UsedInEA;
   ENUM_BOOL            ShiftObj;
};

#ifdef P_RENKO_BOT
   #define P_RENKO_BR
#endif

#ifdef P_RENKO_BR
enum ENUM_CHART_SIZE
{
   _1R = 1, //1R (Renko)
   _2R, //2R (Renko)
   _3R, //3R (Renko)
   _4R, //4R (Renko)
   _5R, //5R (Renko)
   _6R, //6R (Renko)
   _7R, //7R (Renko)
   _8R, //8R (Renko)
   _9R, //9R (Renko)
   _10R, //10R (Renko)
   _11R, //11R (Renko)
   _12R, //12R (Renko)
   _13R, //13R (Renko)
   _14R, //14R (Renko)
   _15R, //15R (Renko)
   _16R, //16R (Renko)
   _17R, //17R (Renko)
   _18R, //18R (Renko)
   _19R, //19R (Renko)
   _20R, //20R (Renko)
   _21R, //21R (Renko)
   _22R, //22R (Renko)
   _23R, //23R (Renko)
   _24R, //24R (Renko)
   _25R, //25R (Renko)
   _26R, //26R (Renko)
   _27R, //27R (Renko)
   _28R, //28R (Renko)
   _29R, //29R (Renko)
   _30R, //30R (Renko)
   _31R, //31R (Renko)
   _32R, //32R (Renko)
   _33R, //33R (Renko)
   _34R, //34R (Renko)
   _35R, //35R (Renko)
   _36R, //36R (Renko)
   _37R, //37R (Renko)
   _38R, //38R (Renko)
   _39R, //39R (Renko)
   _40R, //40R (Renko)
   _41R, //41R (Renko)
   _42R, //42R (Renko)
   _43R, //43R (Renko)
   _44R, //44R (Renko)
   _45R, //45R (Renko)
   _46R, //46R (Renko)
   _47R, //47R (Renko)
   _48R, //48R (Renko)
   _49R, //49R (Renko)
   _50R, //50R (Renko)
   _1P, //1P (Preço)
   _2P, //2P (Preço)
   _3P, //3P (Preço)
   _4P, //4P (Preço)
   _5P, //5P (Preço)
   _6P, //6P (Preço)
   _7P, //7P (Preço)
   _8P, //8P (Preço)
   _9P, //9P (Preço)
   _10P, //10P (Preço)
   _11P, //11P (Preço)
   _12P, //12P (Preço)
   _13P, //13P (Preço)
   _14P, //14P (Preço)
   _15P, //15P (Preço)
   _16P, //16P (Preço)
   _17P, //17P (Preço)
   _18P, //18P (Preço)
   _19P, //19P (Preço)
   _20P, //20P (Preço)
   _21P, //21P (Preço)
   _22P, //22P (Preço)
   _23P, //23P (Preço)
   _24P, //24P (Preço)
   _25P, //25P (Preço)
   _26P, //26P (Preço)
   _27P, //27P (Preço)
   _28P, //28P (Preço)
   _29P, //29P (Preço)
   _30P, //30P (Preço)
   _31P, //31P (Preço)
   _32P, //32P (Preço)
   _33P, //33P (Preço)
   _34P, //34P (Preço)
   _35P, //35P (Preço)
   _36P, //36P (Preço)
   _37P, //37P (Preço)
   _38P, //38P (Preço)
   _39P, //39P (Preço)
   _40P, //40P (Preço)
   _41P, //41P (Preço)
   _42P, //42P (Preço)
   _43P, //43P (Preço)
   _44P, //44P (Preço)
   _45P, //45P (Preço)
   _46P, //46P (Preço)
   _47P, //47P (Preço)
   _48P, //48P (Preço)
   _49P, //49P (Preço)
   _50P, //50P (Preço)
};
#endif

#ifdef P_RENKO_BOT
   #undef P_RENKO_BR
#endif

enum ENUM_CUSTOM_BAR_TYPE
{
   cbtCustom = 0,          // No
   cbtRenko,               // Renko
   cbtMedianRenko,         // Median Renko
   cbtPointO,              // PointO
   cbtTurboRenko075,       // Turbo Renko
   cbtHybridRenko075,      // Hybrid Renko   
};

enum ENUM_INTERVAL
{
   INTERVAL_SECONDS = 0,      // Seconds
   INTERVAL_MINUTES = 1,     // Minutes
   INTERVAL_HOURS = 2,     // Hours
   INTERVAL_DAYS = 3,     // Days
   INTERVAL_WEEKS = 4,   // Weeks
   INTERVAL_MONTHS = 5, // Months
};

const long _INTERVAL_MULT[6] = {1,60,3600,86400,604800,2592000};
const string _INTERVALS[6] = {"sec","min","hrs","day","week","month"};