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 Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---