//+------------------------------------------------------------------+ //| bottom_up_segment.mq5 | //| Bottom-up Segment Copyright 2016, fxborg | //| http://fxborg-labo.hateblo.jp/ | //+------------------------------------------------------------------+ #property copyright "Copyright 2016, fxborg" #property link "http://fxborg-labo.hateblo.jp/" #property version "1.00" #include #include #property indicator_chart_window #property indicator_buffers 1 #property indicator_plots 1 #property indicator_type1 DRAW_SECTION #property indicator_color1 clrRed #property indicator_width1 2 double SEG1[]; input int InpMaxRange=1000; // MaxRange input double InpMaxError=5; // MaxError(Point) double MaxError=InpMaxError*_Point; int min_rates_total=InpMaxRange+2; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- SetIndexBuffer(0,SEG1,INDICATOR_DATA); //--- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- int i,first; if(rates_total<=min_rates_total) return(0); //--- int begin_pos=min_rates_total; first=begin_pos; if(first+1=MaxError)break; ((CArrayDouble *)segments.At(idx)).Update(0,( (CArrayDouble *)mergesegments.At(idx)).At(0)); ((CArrayDouble *)segments.At(idx)).Update(1,( (CArrayDouble *)mergesegments.At(idx)).At(1)); ((CArrayDouble *)segments.At(idx)).Update(2,( (CArrayDouble *)mergesegments.At(idx)).At(2)); ((CArrayDouble *)segments.At(idx)).Update(3,( (CArrayDouble *)mergesegments.At(idx)).At(3)); segments.Delete(idx+1); if(idx>0) { int a=int( ((CArrayDouble *)segments.At(idx-1)).At(0) ); int b=int( ((CArrayDouble *)segments.At(idx)).At(2) ); double x0,y0,x1,y1; create_segment(x0,y0,x1,y1,close,a,b); ((CArrayDouble *)mergesegments.At(idx-1)).Update(0,x0); ((CArrayDouble *)mergesegments.At(idx-1)).Update(1,y0); ((CArrayDouble *)mergesegments.At(idx-1)).Update(2,x1); ((CArrayDouble *)mergesegments.At(idx-1)).Update(3,y1); mergecosts.Update(idx-1,compute_error(close,x0,x1)); } else if(idx+1