Author: Copyright � 2010-2011, FXMaster.de
Price Data Components
Series array that contains the highest prices of each barSeries array that contains the lowest prices of each barSeries array that contains tick volumes of each bar
0 Views
0 Downloads
0 Favorites
5PriceStat
//+------------------------------------------------------------------+
//|                                                 			 PriceStat |
//|                               Copyright © 2010-2011, FXMaster.de |
//|     programming & support - Alexey Sergeev (profy.mql@gmail.com) |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010-2011, FXMaster.de"
#property link      "profy.mql@gmail.com | Alex Sergeev"

#property indicator_chart_window
#property indicator_color1 SkyBlue
#property indicator_color2 YellowGreen
#property indicator_color3 Tomato

extern int gTF=1; // òðåáóåìûé ÒÔ, 0-òåêóùèé
extern double Discret=1; // øàã äèñêðåòèçàöèè øêàëû öåíû
extern double Width=100; // øèðèíà ãèñòîãðàììû (â áàðàõ)
extern bool Present=true; // ïîêàçûâàòü öåíòðàëüíóþ ãèñòîãðàììó (ìåæäó äâóìÿ âåðòèêàëÿìè)
extern double Future=1; // ìíîæèòåëü äëÿ ãëóáèíû ðàñ÷åòà îò ëåâîé âåðòèêàëè (â áóäóøåå)
extern double Past=1; // ìíîæèòåëü äëÿ ãëóáèíû ðàñ÷åòà îò ïðàâîé âåðòèêàëè (â ïðîøëîå)
extern bool bVolume=false; // ñ÷èòàòü ïîêðûòèå áàðà ñ ó÷¸òîì Volume

bool first;
string g_inf;
datetime pdt1, pdt2;
string gsID;
//-------------------------------------------------------  init
int init() { first=true; gsID="stat"; pdt1=0; pdt2=0; return(0); }
//-------------------------------------------------------  deinit
int deinit() { ObjectsDeleteAll2(0, OBJ_TREND, gsID); }
//-------------------------------------------------------  start
int start()
{
	g_inf="";
	main();
	Comment(g_inf);
}
//-------------------------------------------------------  main
void main()
{
	string smb=Symbol();
	int tf=Period(); if (gTF!=0) tf=gTF;
	
	string name[]; int n=ObjectSelect(0, OBJ_VLINE, "", name);
	if (n!=2) { INF("- âåðòèêàëüíûõ ëèíèé íå 2"); return; }
	double from=ObjectGet(name[0], OBJPROP_TIME1); 
	double to=ObjectGet(name[1], OBJPROP_TIME1);
	
	datetime dt; if (from<to) { dt=from; from=to; to=dt; }
	int w=GetWidth(smb, tf, from, to);

	if (pdt1!=from || pdt2!=to) first=true;
	if (!first) return; // åñëè óæå âû÷èñëÿëè, òî âûõîäèì
	first=false; pdt1=from; pdt2=to;
	double hi, lo, pr[]; 

	// ïñòðîèëè òåêóùåå
	if (Present)
	{
		string sID=gsID+"pres";
		datetime dt1=from; datetime dt2=to;
		n=GetStat(smb, tf, dt1, dt2, pr, hi, lo); 
		ObjectsDeleteAll2(0, OBJ_TREND, sID); // çà÷èñòèëè
		SetLine(sID+"Hi", dt1, hi*Point, dt2, hi*Point, indicator_color1, 1, STYLE_DOT, "");
		SetLine(sID+"Lo", dt1, lo*Point, dt2, lo*Point, indicator_color1, 1, STYLE_DOT, "");
		for (int i=0; i<n; i++) SetLine(sID+i+"L", dt1, (i*Discret+lo)*Point, dt1-pr[i]*w, (i*Discret+lo)*Point, indicator_color1, 1, STYLE_SOLID, "");
		for (i=0; i<n; i++) SetLine(sID+i+"R", dt2, (i*Discret+lo)*Point, dt2+pr[i]*w, (i*Discret+lo)*Point, indicator_color1, 1, STYLE_SOLID, "");
	}	
	// ïîñòðîèëè áóäóùåå
	if (Future>0)
	{
		sID=gsID+"future";
		ObjectsDeleteAll2(0, OBJ_TREND, sID); // çà÷èñòèëè
		dt=(from-to)*Future; dt2=from; dt1=from+dt;
		n=GetStat(smb, tf, dt1, dt2, pr, hi, lo);
		SetLine(sID+"Hi", dt1, hi*Point, dt2, hi*Point, indicator_color2, 1, STYLE_DOT, "");
		SetLine(sID+"Lo", dt1, lo*Point, dt2, lo*Point, indicator_color2, 1, STYLE_DOT, "");
		for (i=0; i<n; i++) SetLine(sID+i, dt2, (i*Discret+lo)*Point, dt2+pr[i]*w, (i*Discret+lo)*Point, indicator_color2, 1, STYLE_SOLID, "");
	}
	// ïîñòðîèëè áóäóùåå
	if (Past>0)
	{
		sID=gsID+"past";
		ObjectsDeleteAll2(0, OBJ_TREND, sID); // çà÷èñòèëè
		dt=(from-to)*Past; dt1=to; dt2=to-dt;
		n=GetStat(smb, tf, dt1, dt2, pr, hi, lo);
		SetLine(sID+"Hi", dt1, hi*Point, dt2, hi*Point, indicator_color3, 1, STYLE_DOT, "");
		SetLine(sID+"Lo", dt1, lo*Point, dt2, lo*Point, indicator_color3, 1, STYLE_DOT, "");
		for (i=0; i<n; i++) SetLine(sID+i, dt1, (i*Discret+lo)*Point, dt1-pr[i]*w, (i*Discret+lo)*Point, indicator_color3, 1, STYLE_SOLID, "");
	}
}
//------------------------------------------------------------------ GetWidth
int GetWidth(string smb, int tf, datetime from, datetime to)
{
	int b1=iBarShift(smb, tf, from);
	int b2=iBarShift(smb, tf, to);
	double pr=iHigh(smb, tf, iHighest(smb, tf, MODE_HIGH, b2-b1+1, b1))/Point;

	string name=gsID+"metr";
	if (ObjectFind(name)<0) SetLine(name, from, pr*Point, from-Width*60*Period(), pr*Point, SkyBlue, 3, STYLE_SOLID, "");
	datetime dt1=ObjectGet(name, OBJPROP_TIME1); b1=iBarShift(smb, tf, dt1);
	datetime dt2=ObjectGet(name, OBJPROP_TIME2); b2=iBarShift(smb, tf, dt2);
	int w=MathAbs(b1-b2)*60*tf;
	if (ObjectGet(name, OBJPROP_TIME1)!=from) SetLine(name, from, pr*Point, from-w, pr*Point, SkyBlue, 3, STYLE_SOLID, "");
	return(w);
}
//------------------------------------------------------------------ GetStat
int GetStat(string smb, int tf, datetime from, datetime to, double &pr[], double &hi, double &lo)
{
	// ÷èñëî áàðîâ äëÿ àíàëèçà
	int b1=iBarShift(smb, tf, from);
	int b2=iBarShift(smb, tf, to);
	// êðàéíèå òî÷êè
	hi=iHigh(smb, tf, iHighest(smb, tf, MODE_HIGH, b2-b1+1, b1))/Point;
	lo=iLow(smb, tf, iLowest(smb, tf, MODE_LOW, b2-b1+1, b1))/Point;
	// ðàçìåðíîñòü
	int n=(hi-lo)/Discret; if (n<=0) { INF("-n==0"); return; }
	INF("n="+n);
	ArrayResize(pr, n); ArrayInitialize(pr, 0);
	for (int b=b1; b<=b2; b++) // ïðîñóììèðîâàëè ÷àñòîòó
	{
		int ll=(iLow(smb, tf, b)/Point-lo)/Discret; int hh=(iHigh(smb, tf, b)/Point-lo)/Discret;
		for (int i=ll; i<=hh; i++) if (!bVolume) pr[i]++; else pr[i]+=iVolume(smb, tf, b); 
	}
	// îòúþñòèðîâàëè
	i=ArrayMinimum(pr); double m=pr[i]; for (i=0; i<n; i++) pr[i]-=m-1;
	i=ArrayMaximum(pr); m=pr[i]; for (i=0; i<n; i++) pr[i]=pr[i]/m;
	return(n);
}
//------------------------------------------------------------------ SetLine
void SetLine(string name, datetime dt1, double pr1, datetime dt2, double pr2, color clr, int width, int style, string st)
{
	ObjectCreate(name, OBJ_TREND, 0, 0, 0); ObjectSet(name, OBJPROP_RAY, false);
	ObjectSet(name, OBJPROP_TIME1, dt1); ObjectSet(name, OBJPROP_PRICE1, pr1);
	ObjectSet(name, OBJPROP_TIME2, dt2); ObjectSet(name, OBJPROP_PRICE2, pr2);
	ObjectSet(name, OBJPROP_WIDTH, width); ObjectSet(name, OBJPROP_COLOR, clr);
	ObjectSetText(name, st); ObjectSet(name, OBJPROP_STYLE, style);
}
//------------------------------------------------------------------ ObjectSelect
int ObjectSelect(int wnd, int type, string pref, string &name[])
{
	string names[]; int k=0, n=ObjectsTotal(); ArrayResize(names, n);
	for (int i=0; i<n; i++) 
	{
		string st=ObjectName(i);
		if (wnd>=0) if (ObjectFind(st)!=wnd) continue;
		if (type>=0) if (ObjectType(st)!=type) continue;
		if (pref!="") if (StringSubstr(st, 0, StringLen(pref))!=pref) continue;
		names[k]=st; k++;
	}
	ArrayResize(name, k);
	for (i=0; i<k; i++) name[i]=names[i]; return(k);
}
//------------------------------------------------------------------ ObjectsDeleteAll2
void ObjectsDeleteAll2(int wnd=-1, int type=-1, string pref="")
{
	string names[]; int n=ObjectsTotal(); ArrayResize(names, n);
	for (int i=0; i<n; i++) names[i]=ObjectName(i);
	for (i=0; i<n; i++) 
	{
		if (wnd>=0) if (ObjectFind(names[i])!=wnd) continue;
		if (type>=0) if (ObjectType(names[i])!=type) continue;
		if (pref!="") if (StringSubstr(names[i], 0, StringLen(pref))!=pref) continue;
		ObjectDelete(names[i]);
	}
}
//---------------------------------------------------------------   INF
void INF(string st, bool ini=false) { if (ini) g_inf=g_inf+"\n        "+st; else g_inf=g_inf+"\n            "+st; }

Comments