// 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