sConvertCoords

Miscellaneous
It issuies visual alerts to the screen
0 Views
0 Downloads
0 Favorites
sConvertCoords
#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