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



Sample





Analysis



Market Information Used:

Series array that contains open time of each bar
Series array that contains open prices of each bar
Series array that contains the highest prices of each bar


Indicator Curves created:



Indicators Used:



Custom Indicators Used:

Order Management characteristics:

Other Features: