Author: Copyright 2006-2012, FXmaster.de
0 Views
0 Downloads
0 Favorites
Monitor_v1
//+------------------------------------------------------------------+
//|                                                          Monitor |
//|                                 Copyright 2006-2012, FXmaster.de |
//|     programming & support - Alexey Sergeev (profy.mql@gmail.com) |
//+------------------------------------------------------------------+
#property copyright "Copyright 2006-2012, FXmaster.de"
#property link      "profy.mql@gmail.com"

#include <stderror.mqh>
#include <stdlib.mqh>

// èìïîðòèðóåì 
#define ERROR_FILE_NOT_FOUND		2 

// Flag values
#define modeOpen								0 // ôëàã îòêðûòèÿ
#define modeCreate							1 // ôëàã ñîçäàíèÿ

#import "MemMap.dll"
int MemOpen(string path, int size, int mode, int &err[]); // îòêðûâàåì/ñîçäàåì ôàéë â ïàìÿòè, ïîëó÷àåì õåíäë
void MemClose(int hmem); // çàêðûâàåì ôàéë â ïàìÿòè
int MemGrows(int hmem, string path, int newsize, int &err[]); // óâåëè÷èâàåì ðàçìåð ôàéëà â ïàìÿòè
int MemWrite(int hmem, int &v[], int pos, int sz, int &err[]); // çàïèñü int(4) âåêòîðà v â ïàìÿòü ñ óêàçàííîé ïîçèöèè pos, ðàçìåðîì sz
int MemRead(int hmem, int &v[], int pos, int sz, int &err[]); // ÷òåíèå âåêòîðà v ñ óêàçàííîé ïîçèöèè pos ðàçìåðîì sz
int MemWriteStr(int hmem, string str, int pos, int sz, int &err[]); // çàïèñü ñòðîêè
int MemReadStr(int hmem, string str, int pos, int &sz[], int &err[]); // ÷òåíèå ñòðîêè âåêòîðà 
#import

extern int MaxLate=5000; // ÷èñëî ìèëèñåêóíä çàäåðæêè äëÿ ôèëüòðà ñòàðîé êîòèðîâêè

// äàííûå ôàéëà
#define HEAD		8 // ðàçìåð â íà÷àëå ôàéëà, äëÿ õðàíåíèÿ ñïåöèíôîðìàöèè
#define iSize		16 // ðàçìåð âåêòîðà äëÿ çàïèñè (4*int(4))
#define sSize		34 // ðàçìåð âåêòîðà äëÿ çàïèñè (30*char)
#define Size		50 // ïîëíûé ðàçìåð âåêòîðà äëÿ çàïèñè
#define kprice	0.000001 // ìíîæèòåëü äëÿ ïåðåâîäà öåíû â öåëîå ÷èñëî

int hmem, err[1], price[][4], start_adr=0; string term[]; // ìàññèâû îáìåíà
string file; // èìÿ ôàéëà â ïàìÿòè

string sID;
string g_inf;
//------------------------------------------------------------------	init
int init()
{
	file="Local\\Monitor_"+StringSubstr(Symbol(), 0, MathMin(6, StringLen(Symbol()))); // èìÿ ôàéëà â ïàìÿòè
	sID="memmapobj."; // ïðèñòàâêà äëÿ ëèíèé êîòèðîâîê
	
	int head[2];
	hmem=MemOpen(file, -1, modeOpen, err); // îòêðûâàåì èìåþùèéñÿ ôàéë
	if (hmem>0) // åñëè îòêðûëè
	{
		Print("open OK h="+hmem);
		int r=MemRead(hmem, head, 0, HEAD, err); Print("read head uses="+head[0]+"  start_adr="+head[1]+"  | r="+r+"  err="+err[0]);
 ///*!! ïîñòàâüòå äëÿ ñáðîñà ÷èñëà òåðìèíàëîâ.*/ head[0]=0; head[1]=0;
		head[0]++; head[1]++; start_adr=head[1]; // ÷èñëî èñïîëüçîâàíèÿ ôàéëà è àäðåñ òåêóùåãî òåðìèíàëà â ôàéëå
		hmem=MemGrows(hmem, file, HEAD+(start_adr+1)*Size, err); Print("grows to "+(HEAD+(start_adr+1)*Size)+"  | h="+hmem+"  err="+err[0]);
		int w=MemWrite(hmem, head, 0, HEAD, err);	Print("write head w="+w+"  err="+err[0]);
	}
	else if (err[0]==ERROR_FILE_NOT_FOUND) // åñëè íå îòêðûëè, òî ñîçäàåì åãî
	{
		Print("-err("+err[0]+") memfile not found. Create it...'"+file+"'"); 
		head[0]=1; head[1]=0; start_adr=head[1]; 
		hmem=MemOpen(file, HEAD+(start_adr+1)*Size, modeCreate, err); Print("create size="+(HEAD+(start_adr+1)*Size)+"  h="+hmem+"  err="+err[0]); 
		if (hmem<=0 || err[0]!=0) { Print("-err("+err[0]+") create memfile  h="+hmem); return(0); } else Print("create OK h="+hmem);
		w=MemWrite(hmem, head, 0, HEAD, err); Print("write head w="+w+"  err="+err[0]);
		if (err[0]!=0) { Print("-err("+err[0]+") write memfile  h="+hmem); return(0); }
	}
	else { Print("-unknow err("+err[0]+")  h="+hmem); return(0); }
	Print("OK ("+err[0]+") h="+hmem);
	start();
	return(0);
}
//------------------------------------------------------------------	deinit
int deinit()
{
	if (hmem>0) // åñëè áûë îòêðûò õåíäë
	{
		int head[2];
		int r=MemRead(hmem, head, 0, HEAD, err); Print("Deinit head uses="+head[0]+"  start_adr="+head[1]+"  | r="+r+"  err="+err[0]);
		head[0]--;
		int w=MemWrite(hmem, head, 0, HEAD, err); Print("write head  w="+w+"  err="+err[0]);
		if (head[0]>0) Print("reduce use of memfile "+hmem+"  to "+head[0]);
		else { Print("close memfile "+hmem); MemClose(hmem); }
	}
	ObjectsDeleteAll2(0, -1, sID); // óäàëèëè âñå îáúåêòû
	return(0);
}
//------------------------------------------------------------------	start
int start()
{
	Print("started");
	while(true)
	{
		g_inf="";
		INF("");
		INF("File to "+file, true);
		int w=WritePrice(); INF("write="+w+"  err="+err[0]);
		int c, n=ReadPrice(c);
		if (n==-1) INF("-err read Head");
		if (n==-2) INF("-err read Data");
		int t=GetTickCount();
		INF(TimeToStr(TimeLocal(), TIME_MINUTES|TIME_SECONDS)+" || "+t);
		INF("-----------------------------------------------------");
		INF("Terminals="+n+"  active="+c, true); INF("");
		for (int i=0; i<c; i++)
		{
			int tm=price[i][0]; int acc=price[i][1]; double bid=price[i][2]*kprice;
			INF((t-tm)+" ("+tm+") | "+acc+" | "+DTS(bid,6)+" | "+term[i]+" | MT "+DTS(price[i][3],0));
			SetHLine(sID+i, bid, Lime, 1, STYLE_DOT, ""); // ñòàâèì ëèíèè
		}
		for (i=c; i<n; i++) ObjectDelete(sID+i);
		Comment(g_inf);
		if (IsStopped() || !IsExpertEnabled()) { Print("stopped"); break; }
		Sleep(500);
	}
	return(0);
}
//------------------------------------------------------------------	WritePrice
int WritePrice()
{
	if (hmem<=0) return(0);
	int data[4]; RefreshRates();
	data[0]=GetTickCount(); data[1]=AccountNumber(); data[2]=Bid/kprice; data[3]=4;/*ÌT4*/
	string name=StringSubstr(TerminalCompany(), 0, sSize-4);
	int w0=MemWrite(hmem, data, HEAD+start_adr*Size, iSize, err);
	int w1=MemWriteStr(hmem, name, HEAD+start_adr*Size+iSize, StringLen(name), err);
//	INF("w0="+w0+"  w1="+w1+"  name='"+name+"'");
	return(w0+w1);
}
//------------------------------------------------------------------	ReadPrice
int ReadPrice(int &c)
{
	if (hmem<=0) return(0);
	int data[4], head[2]; string name="0123456789.0123456789.0123456789"; // 30 ñèìâîëîâ äëÿ èìåíè
	int r=MemRead(hmem, head, 0, HEAD, err); INF("read head  uses="+head[0]+"  start_adr="+head[1]+"  | r="+r+"  err="+err[0]);
	if (r<HEAD || err[0]!=0) return(-1);
	int n=head[1]+1; ArrayResize(price, 0); ArrayResize(term, 0); c=0; // ÷èñëî ðåãèñòðèðîâàâøèõñÿ òåðìèíàëîâ
	int rs[1], t=GetTickCount();
	for (int i=0; i<n; i++)
	{
		ArrayInitialize(data, 0);
		r=MemRead(hmem, data, HEAD+i*Size, iSize, err); if (r<iSize || err[0]!=0) return(-2);
		r=MemReadStr(hmem, name, HEAD+i*Size+iSize, rs, err); if (r<=0 || err[0]!=0) return(r);
		if (MathAbs(t-data[0])>MaxLate) continue;
		ArrayResize(price, c+1); price[c][0]=data[0]; price[c][1]=data[1]; price[c][2]=data[2]; price[c][3]=data[3];
		ArrayResize(term, c+1); term[c]=StringSubstr(name, 0, rs[0]);
		c++;
	}
	return(n);
}
//------------------------------------------------------------------ SetHLine
void SetHLine(string name, double pr, color clr, int width, int style, string st)
{
	ObjectCreate(name, OBJ_HLINE, 0, 0, 0); ObjectSet(name, OBJPROP_PRICE1, pr);
	ObjectSet(name, OBJPROP_WIDTH, width); ObjectSet(name, OBJPROP_COLOR, clr);
	ObjectSetText(name, st); ObjectSet(name, OBJPROP_STYLE, style);
}

//---------------------------------------------------------------   INF
void INF(string st, bool ini=false) { if (ini) g_inf=g_inf+"\n        "+st; else g_inf=g_inf+"\n            "+st; }
//---------------------------------------------------------------   DTS
string DTS(double d, int n=-1) { if (d==EMPTY_VALUE) return("<>"); if (n<0) return(DoubleToStr(d, Digits)); else return(DoubleToStr(d, n)); }
//------------------------------------------------------------------ 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]);
	}
}

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---