Ticker Trail_v1

Author: mandorr@gmail.com
Ticker Trail_v1
Price Data Components
Series array that contains open prices of each barSeries array that contains the highest prices of each bar
0 Views
0 Downloads
0 Favorites
Ticker Trail_v1
// Ticker Trail.mq4
// Èíäèêàòîð

#property copyright "mandorr@gmail.com"
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Gray
#property indicator_width1 1
#property indicator_style1 0

#property indicator_color2 Gray
#property indicator_width2 2
#property indicator_style2 0

extern int Trail=10;         // Òðàë
extern int BarsCount=1000;   // Êîëè÷åñòâî îòîáðàæàåìûõ áàðîâ

double buffer0[];
double buffer1[];

int tickers[];
int trails[];

int ticker;
int trail;
int price_prev;
int win_index;

string obj_name;
string win_name;

void init() {
   SetIndexBuffer(0,buffer0);
   SetIndexBuffer(1,buffer1);
   SetIndexLabel(0,"Value");
   SetIndexLabel(1,"Trail");
   SetIndexDrawBegin(0,0);
   SetIndexDrawBegin(1,0);
   SetIndexEmptyValue(0,0.0);
   SetIndexEmptyValue(1,0.0);
   price_prev=0;
   ticker=0;
   trail=MathMax(1,Trail);
   win_name="Ticker Trail ("+trail+")";
}

void deinit() {
   ObjectsDeleteAll(win_index);
}

void start() {
   int i, price;
   if (ticker==0) {
      Clean();
      Setup();
   }
   price=MathRound(Bid/Point);
   if (price==0) {return;}
   if (price==price_prev) {return;}
   price_prev=price;
   ticker++;
   if (ticker>BarsCount) {ticker=BarsCount;}
   else {
      ArrayResize(tickers,ticker);
      ArrayResize(trails,ticker);
   }
   if (ticker>1) {
      for (i=ticker-1; i>0; i--) {
         tickers[i]=tickers[i-1];
         trails[i]=trails[i-1];
      }
      tickers[0]=price;
   }
   if (trails[0]<price-trail) {trails[0]=price-trail;}
   if (trails[0]>price+trail) {trails[0]=price+trail;}
   for (i=0; i<ticker; i++) {
      buffer0[i]=tickers[i]*Point;
      buffer1[i]=trails[i]*Point;
   }
   buffer0[ticker]=0.0;
   buffer1[ticker]=0.0;
   IndicatorShortName(win_name);
   win_index=WindowFind(win_name);
   obj_name="Win"+win_index+"_Bid";
   if (ObjectFind(obj_name)!=win_index) {
      ObjectCreate(obj_name,OBJ_HLINE,win_index,Time[0],Bid);
   }
   ObjectSet(obj_name,OBJPROP_PRICE1,Bid);
   ObjectSet(obj_name,OBJPROP_STYLE,DRAW_LINE);
   ObjectSet(obj_name,OBJPROP_WIDTH,1);
   ObjectSet(obj_name,OBJPROP_COLOR,Silver);
}

// î÷èñòèòü ãðàôèê
void Clean() {
   for (int i=0; i<=BarsCount; i++) {
      buffer0[i]=0.0;
      buffer1[i]=0.0;
   }
   IndicatorShortName(win_name);
   win_index=WindowFind(win_name);
   ObjectsDeleteAll(win_index);
}

// Èñïîëüçîâàíèå ïîñëåäîâàòåëüíîñòè òèêîâ èç OHL ìèíóòíîãî ãðàôèêà
void Setup() {
   int i, j, k, total, value_prev, value[4];
   double open, high, low, median;
   // íà÷àëüíîå çíà÷åíèå
   ticker++;
   ArrayResize(tickers,ticker);
   ArrayResize(trails,ticker);
   total=BarsCount; if (total>iBars(NULL,PERIOD_M1)) {total=iBars(NULL,PERIOD_M1);}
   open=iOpen(NULL,PERIOD_M1,total-1);
   value[0]=MathRound(open/Point);
   tickers[0]=value[0];
   trails[0]=value[0];
   value_prev=0;
   // Ýìóëÿöèÿ ïîñëåäîâàòåëüíîñòè òèêîâ èç OHL ìèíóòíîãî ãðàôèêà
   for (i=total-1; i>=0; i--) {
      open=iOpen(NULL,PERIOD_M1,i);
      high=iHigh(NULL,PERIOD_M1,i);
      low =iLow (NULL,PERIOD_M1,i);
      median=0.5*(high+low);
      value[0]=MathRound(open/Point);
      value[1]=MathRound(high/Point);
      value[2]=MathRound(low /Point);
      value[3]=0;
      if (open<median) {
         // Ïîìåíÿòü ïîñëåäîâàòåëüíîñòü ñ OHL íà OLH
         value[3]=value[1];
         value[1]=value[2];
         value[2]=value[3];
      }
      for (k=0; k<=2; k++) {
         if (value[k]==value_prev) {continue;}
         value_prev=value[k];
         ticker++;
         if (ticker>BarsCount) {ticker=BarsCount;}
         else {
            ArrayResize(tickers,ticker);
            ArrayResize(trails,ticker);
         }
         if (ticker>1) {
            for (j=ticker-1; j>0; j--) {
               tickers[j]=tickers[j-1];
               trails[j]=trails[j-1];
            }
            tickers[0]=value[k];
         }
         if (trails[0]<value[k]-trail) {trails[0]=value[k]-trail;}
         if (trails[0]>value[k]+trail) {trails[0]=value[k]+trail;}
      }
   }
   for (i=0; i<ticker; i++) {
      buffer0[i]=tickers[i]*Point;
      buffer1[i]=trails[i]*Point;
   }
   buffer0[ticker]=0.0;
   buffer1[ticker]=0.0;
   IndicatorShortName(win_name);
   RefreshRates();
   price_prev=value_prev;
}

// End

Comments