#define OP_BUY 0
#define OP_SELL 1
#define OP_BUYLIMIT 2
#define OP_SELLLIMIT 3
#define OP_BUYSTOP 4
#define OP_SELLSTOP 5
#define MODE_OPEN 0
#define MODE_LOW 1
#define MODE_HIGH 2
#define MODE_CLOSE 3
#define MODE_VOLUME 4
#define MODE_TIME 5
#define MODE_TRADES 0
#define MODE_HISTORY 1
#define SELECT_BY_POS 0
#define SELECT_BY_TICKET 1
#define LONG_VALUE 4
#define FLOAT_VALUE 4
#define DOUBLE_VALUE 8
#define CHART_BAR 0
#define CHART_CANDLE 1
#define MODE_ASCEND 1
#define MODE_DESCEND 2
#define MODE_BID 9
#define MODE_ASK 10
#define MODE_POINT 11
#define MODE_DIGITS 12
#define MODE_SPREAD 13
#define MODE_STOPLEVEL 14
#define MODE_LOTSIZE 15
#define MODE_TICKVALUE 16
#define MODE_TICKSIZE 17
#define MODE_SWAPLONG 18
#define MODE_SWAPSHORT 19
#define MODE_STARTING 20
#define MODE_EXPIRATION 21
#define MODE_TRADEALLOWED 22
#define MODE_MINLOT 23
#define MODE_LOTSTEP 24
#define MODE_MAXLOT 25
#define MODE_SWAPTYPE 26
#define MODE_PROFITCALCMODE 27
#define MODE_MARGINCALCMODE 28
#define MODE_MARGININIT 29
#define MODE_MARGINMAINTENANCE 30
#define MODE_MARGINHEDGED 31
#define MODE_MARGINREQUIRED 32
#define MODE_FREEZELEVEL 33
#define MODE_CLOSEBY_ALLOWED 34
#define EMPTY -1
#define MODE_MAIN 0
#define MODE_SIGNAL 1
#define MODE_PLUSDI 1
#define MODE_MINUSDI 2
#define MODE_UPPER 1
#define MODE_LOWER 2
#define MODE_GATORJAW 1
#define MODE_GATORTEETH 2
#define MODE_GATORLIPS 3
#define MODE_TENKANSEN 1
#define MODE_KIJUNSEN 2
#define MODE_SENKOUSPANA 3
#define MODE_SENKOUSPANB 4
#define MODE_CHIKOUSPAN 5
#define MODE_CHINKOUSPAN 5
#define OBJPROP_TIME1 2000
#define OBJPROP_PRICE1 2001
#define OBJPROP_TIME2 2002
#define OBJPROP_PRICE2 2003
#define OBJPROP_TIME3 2004
#define OBJPROP_PRICE3 2005
#define OBJPROP_FIBOLEVELS 2006

//+------------------------------------------------------------------+
//|                                      LinearRegressionChannel.mq4 |
//|                                                           dimicr |
//|                                         http://www.signalsbg.com |
//|      SignalsBG.com - development of trading tools for Metatrader |
//////////////////////////////////////////////////////////////////////
//miro1360 mod: candle settings

#property copyright "Copyright © 2008 signalsbg.com"
#property link      "http://www.signalsbg.com"
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots 3
#property indicator_width1 1
#property indicator_width2 1
#property indicator_width3 1
#property indicator_color1 Gold
#property indicator_color2 Aqua
#property indicator_color3 OrangeRed

input bool UseClose = true;
input int  barsToCount=55;
input int  CandleHist=0;

double LR_line[];
double Sup_line[];
double Res_line[];

//////////////////////////////////////////////////////////////////////
void OnInit()
{
   //IndicatorShortName("LinearRegressionChannel:"+barsToCount);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,LR_line,INDICATOR_DATA,true);
   SetIndexEmptyValue(0,0.0);
   
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,Sup_line,INDICATOR_DATA,true);
   SetIndexEmptyValue(1,0.0);
   
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,Res_line,INDICATOR_DATA,true);
   SetIndexEmptyValue(2,0.0);
   
   
   return;
}

//////////////////////////////////////////////////////////////////////
void OnDeinit()
{  
   return;
}

//////////////////////////////////////////////////////////////////////
int OnCalculate(const int _rates_total,      // size of input time series
           const int _prev_calculated,  // bars handled in previous call
           const datetime& _time[],     // Time
           const double& _open[],       // Open
           const double& _high[],       // High
           const double& _low[],        // Low
           const double& _close[],      // Close
           const long& _tick_volume[],  // Tick Volume
           const long& _volume[],       // Real Volume
           const int& _spread[]         // Spread
)
{
	FXD_ONCALCULATE_FAIL = false; // will be set to true if some indicator won't load

   // variables
   double a,b,c,
          sumy=0.0,
          sumx=0.0,
          sumxy=0.0,
          sumx2=0.0,
          h=0.0,l=0.0;   
   int x;
   
   // calculate linear regression
   
   for(int i=0+CandleHist; i<(barsToCount+CandleHist); i++)
   {
      sumy+=iClose(_Symbol,_Period,i);
      sumxy+=iClose(_Symbol,_Period,i)*i;
      sumx+=i;
      sumx2+=i*i;
   }
   
   c=sumx2*barsToCount-sumx*sumx;
   
   if(c==0.0)
   {
      Alert("Error in linear regression!");
      return;
   }
   
   
   // Line equation    
   b=(sumxy*barsToCount-sumx*sumy)/c;
   a=(sumy-sumx*b)/barsToCount;
   
   // Linear regression line in buffer
   for(x=0+CandleHist;x<(barsToCount+CandleHist);x++)
      LR_line[x]=a+b*x;
   
   

   
   // Use PRICE_CLOSE for support-resistance
   if (UseClose)
     for(x=0+CandleHist;x<(barsToCount+CandleHist);x++)
     {
       if(iClose(_Symbol,_Period,x)-LR_line[x] > h) h = iClose(_Symbol,_Period,x)-LR_line[x];
       if(LR_line[x] - iClose(_Symbol,_Period,x)> l) l = LR_line[x] - iClose(_Symbol,_Period,x);
     }  
   
   // Use HIGH - LOW
   else
     for(x=0+CandleHist;x<(barsToCount+CandleHist);x++)
     {
       if(iHigh(_Symbol,_Period,x)-LR_line[x] > h) h = iHigh(_Symbol,_Period,x)-LR_line[x];
       if(LR_line[x] - iLow(_Symbol,_Period,x)> l) l = LR_line[x] - iLow(_Symbol,_Period,x);
     }
   
   // Drawing support - resistance lines   
   if (h>l)
   {
     for(x=0+CandleHist;x<(barsToCount+CandleHist);x++)
     {
       Sup_line[x]=a-h+b*x;
       Res_line[x]=a+h+b*x;
     } 
   }
   else
   {
     for(x=0+CandleHist;x<(barsToCount+CandleHist);x++)
     {
       Sup_line[x]=a-l+b*x;
       Res_line[x]=a+l+b*x;
     }
   }
   
   LR_line[x]  = 0.0;
   Sup_line[x] = 0.0;
   Res_line[x] = 0.0;
	if (FXD_ONCALCULATE_FAIL) {return -1;}

	return _rates_total;

   return(0);
}




//== fxDreema MQL4 to MQL5 Converter ==//

//-- Global Variables
int FXD_SELECTED_TYPE = 0; // Indicates what is selected by OrderSelect(), 1 for trade, 2 for pending order, 3 for history trade
ulong FXD_SELECTED_TICKET = 0; // The ticket number selected by OrderSelect()
bool FXD_ONCALCULATE_FAIL = false; // Flag that causes OnCalculate() to return nothing if some indicator is used and failed to load, which means that indicator calculations must be repeated


//-- Functions
void SetIndexStyle(
	int index,
	int type,
	int style=EMPTY,
	int width=EMPTY,
	color clr=clrNONE)
{
	if(width>-1)
		PlotIndexSetInteger(index,PLOT_LINE_WIDTH,width);
	if(clr!=CLR_NONE)
		PlotIndexSetInteger(index,PLOT_LINE_COLOR,clr);
	switch(type)
	{
		case 0:
			PlotIndexSetInteger(index,PLOT_DRAW_TYPE,DRAW_LINE); break;
		case 1:
			PlotIndexSetInteger(index,PLOT_DRAW_TYPE,DRAW_SECTION); break;
		case 2:
			PlotIndexSetInteger(index,PLOT_DRAW_TYPE,DRAW_HISTOGRAM); break;
		case 3:
			PlotIndexSetInteger(index,PLOT_DRAW_TYPE,DRAW_ARROW); break;
		case 4:
			PlotIndexSetInteger(index,PLOT_DRAW_TYPE,DRAW_ZIGZAG); break;
		case 12:
			PlotIndexSetInteger(index,PLOT_DRAW_TYPE,DRAW_NONE); break;

		default:
			PlotIndexSetInteger(index,PLOT_DRAW_TYPE,DRAW_LINE);
	}
	switch(style)
	{
		case 0:
			PlotIndexSetInteger(index,PLOT_LINE_STYLE,STYLE_SOLID); break;
		case 1:
			PlotIndexSetInteger(index,PLOT_LINE_STYLE,STYLE_DASH); break;
		case 2:
			PlotIndexSetInteger(index,PLOT_LINE_STYLE,STYLE_DOT); break;
		case 3:
			PlotIndexSetInteger(index,PLOT_LINE_STYLE,STYLE_DASHDOT); break;
		case 4:
			PlotIndexSetInteger(index,PLOT_LINE_STYLE,STYLE_DASHDOTDOT); break;

		default: return;
	}
}

bool SetIndexBuffer( 
   int                    index,
   double                 &buffer[],
   ENUM_INDEXBUFFER_TYPE  data_type,
   bool set_as_series
   )
{
	bool ret = SetIndexBuffer(index, buffer, data_type);
	if (ret) {
		ArraySetAsSeries(buffer, true);
	}
	
	return ret;
}

void SetIndexEmptyValue(int index, double value)
{
	PlotIndexSetDouble(index, PLOT_EMPTY_VALUE, value);
}

//== fxDreema MQL4 to MQL5 Converter ==//