#property copyright "http://dmffx.com"
#property link "http://dmffx.com"
#import "user32.dll"
int GetWindowDC(int);
int ReleaseDC(int,int);
bool GetWindowRect(int,int & z[4]);
#import
#import "gdi32.dll"
int GetPixel(int hDC, int x, int y);
#import
//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
int start(){
if(!IsDllsAllowed()){
Alert("Ðàçðåøèòå DLL");
return(0);
}
int Window=0;
double Shift=10;
double Price=High[10];
Alert("======================================================================");
Alert("Èñõîäíûå çíà÷åíÿ: Shift - ",DoubleToStr(Shift,8),", Price - ",DoubleToStr(Price,8));
int X,Y;
if(fConvertCoords(Window,Shift,Price,X,Y,1)==0){
Alert("Ïîñëå ïðÿìîãî ïðåîáðàçîâàíèÿ(1): X - ",X,", Y=",Y);
if(fConvertCoords(Window,Shift,Price,X,Y,2)==0){
Alert("Ïîñëå îáðàòíîãî ïðåîáðàçîâàíèÿ(1): Shift - ",DoubleToStr(Shift,8),", Price - ",DoubleToStr(Price,8));
//===
fConvertCoords(Window,Shift,Price,X,Y,1);
Alert("Ïîñëå ïðÿìîãî ïðåîáðàçîâàíèÿ(2): X - ",X,", Y=",Y);
fConvertCoords(Window,Shift,Price,X,Y,2);
Alert("Ïîñëå îáðàòíîãî ïðåîáðàçîâàíèÿ(2): Shift - ",DoubleToStr(Shift,8),", Price - ",DoubleToStr(Price,8));
//===
}
else{
Alert("Îøèáêà ïðè ðåæèìå 2");
}
}
else{
Alert("Îøèáêà ïðè ðåæèìå 1");
}
}
int fConvertCoords( int aWindow, // Íîìåð îêíà, 0 - îêíî ñ ãðàôèêîì öåíû, äàëüøå ñâåðõó âíèç - 1, 2...
double & aShift, // Íîìåð áàðà ñïðàâà íàëåâî ñ íóëÿ
double & aPrice, // Çíà÷åíèå öåíû èëè èíäèêàòîðà â ïîäîêíå
int & aX, // Êîîðäèíàòà X â ïèêñåëÿõ
int & aY, // Êîîðäèíàòà Ó â ïèêñåëÿõ
int aMode // Ðåæèì: 1 - ïðåîáðàçîâàíèå öåíû è íîìåðà áàðà â êîîðäèíàòû îêíà X è Y,
// 2 - ïðåîáðàçîâàíèå êîîðäèíàò X è Y â öåíó è íîìåð áàðà.
// Ïðè aMode=1 ïåðåäàåì â ôóíêöèþ çíà÷åíèÿ aShift è aPrice,
// çàòåì, ñìîòðèì çíà÷åíèÿ aX è aY, ïðè aMode=2 ïåðåäàåì â ôóíêöèþ
// çíà÷åíèÿ aX è aY, çàòåì, ñìîòðèì çíà÷åíèÿ aShift è aPrice
){
/*
Ôóíêöèÿ äëÿ ïðåîáðàçîâàíèÿ êîîðäèíàò (áàð, âðåìÿ) â êîîðäèíàòû (X, Y) îêíà (â ïèêñåëè).
Ðàáîòàåò ñ îñíîâíûì îêíîì ñ ãðàôèêîì öåíû è ñ ïîäîêíàìè.
Ïðè óñïåøíîì âûïîëíåíèè âîçâðàùàåò 0, ïðè îøèáêå îòðèöàòåëüíîå çíà÷åíèå îò -1 äî -5.
*/
int x1,x2,y[][2];
int rv=fGetWindCoords(x1,x2,y);
if(rv<1)return(-1); // âñå ñîâñåì ïëîõî
if(aWindow>=rv)return(-2); // íàéäåíî ìåíüøå îêîí
double ph=WindowPriceMax(aWindow);
double pl=WindowPriceMin(aWindow);
double fb=WindowFirstVisibleBar();
double bc=WindowBarsPerChart();
int DPWidth=32*((x2-x1-2)/32);
int BPWidth=DPWidth/bc;
if(BPWidth!=32){
DPWidth=16*((x2-x1-2)/16);
BPWidth=DPWidth/bc;
if(BPWidth!=16){
DPWidth=8*((x2-x1-2)/8);
BPWidth=DPWidth/bc;
if(BPWidth!=8){
DPWidth=4*((x2-x1-2)/4);
BPWidth=DPWidth/bc;
if(BPWidth!=4){
DPWidth=2*((x2-x1-2)/2);
BPWidth=DPWidth/bc;
if(BPWidth!=2){
DPWidth=1*((x2-x1-2)/1);
BPWidth=DPWidth/bc;
}
}
}
}
}
if(aMode==1){
double div=(ph-pl);
if(div==0)return(-3);
aY=MathRound((ph-aPrice)/div*(y[aWindow][1]-y[aWindow][0]-1));
aX=MathRound((fb-aShift)*BPWidth);
}
else{
if(BPWidth==0)return(-4);
aShift=(fb*BPWidth-aX)/BPWidth;
div=((y[aWindow][1]-y[aWindow][0]-1));
if(div==0)return(-5);
aPrice=(ph*(y[aWindow][1]-y[aWindow][0]-1)-aY*(ph-pl))/div;
}
//----
return(0);
}
//+------------------------------------------------------------------+
int fGetWindCoords( int & aX1, // Êîîðäèíàòà X ëåâîãî êðàÿ îêíà
int & aX2, // Êîîðäèíàòà Y ïðàâîãî êðàÿ
int & aY[][] // Êîîðäèíàòû Y îêîí, [íîìåð îêíà][0] - êîîðäèíàòà âåðõíåãî êðàÿ, [íîìåð îêíà][1] - êîîðäèíàòà íèæíåãî êðàÿ
){
/*
Ôóíêöèÿ ïîëó÷åíèÿ êîîðäèíàò ïîäîêîí.
Ïðè óñïåøíîì âûïîëíåíèè âîçâðàùàåò 0, ïðè îøèáêå - -1.
*/
int Rv=-1;
aX1=-1;
ArrayResize(aY,0);
int sts=0;
int h=WindowHandle(Symbol(),Period());
int hDC=GetWindowDC(h);
color BGCol=GetPixel(hDC,1,1);
color FrameCol;
color Col;
int Rect[4];
bool Rez=false;
for(int i=2;i<1000;i++){
FrameCol=GetPixel(hDC,i,i);
if(FrameCol!=BGCol){
Rez=true;
break;
}
}
if(Rez){
int x;
int y;
Rez=false;
for(int j=i-1;j>0;j--){
Col=GetPixel(hDC,i,j);
if(Col!=FrameCol){
y=j+1;
Rez=true;
break;
}
}
if(Rez){
Rez=false;
for(j=i-1;j>0;j--){
Col=GetPixel(hDC,j,i);
if(Col!=FrameCol){
x=j+1;
Rez=true;
break;
}
}
aX1=x;
}
if(Rez){
GetWindowRect(h,Rect);
int H=Rect[3]-Rect[1];
int W=Rect[2]-Rect[0];
Rez=false;
for(i=x;i<W;i++){
Col=GetPixel(hDC,i,y);
if(Col!=FrameCol){
aX2=i-1;
Rez=true;
break;
}
}
if(Rez){
int yy=y;
x=aX1;
for(i=y;i<H-18;i++){
Col=GetPixel(hDC,x,i);
if(Col!=FrameCol){
ArrayResize(aY,sts+1);
aY[sts][0]=yy;
aY[sts][1]=i-1;
sts++;
Rez=false;
Rv=sts;
for(j=i;j<H;j++){
Col=GetPixel(hDC,x,j);
if(Col==FrameCol){
yy=j;
i=j-1;
Rez=true;
break;
}
}
if(Rez)continue;
break;
}
}
}
}
}
ReleaseDC(h,hDC);
return(Rv);
}
Comments