Komut dosyasındaki "Piyasa İzleme" penceresinde seçilen tüm enstrümanları programlı olarak nasıl yineleyebilirim? - sayfa 3

 
getch :

Senaryoda herhangi bir sapkınlık yok. Biraz standart dışı bir yaklaşım ve daha fazlası değil.

Senaryonun kendisinde elbette bir sapkınlık yok - kendimi tam olarak ifade edemedim. Listeye erişim biçiminde bir sapkınlık. Ancak, araçlar listesine erişimin Windows pencerelerinden değil, terminal kullanılarak gerçekleştirilmesi gerektiğini kabul etmelisiniz. Ve komut dosyası, özellikle benim gibi Windows altında çalışma deneyimi olmayan acemi programcılar için çok kullanışlıdır. Tekrar teşekkür ederim, kendi başıma çalışmak için çok zamanımı alacak birçok gerekli çözümü içeriyor.
 

Ve bir sürü sapkınlık icat etmek ne için gerekliydi... Gerekli verileri MarketWatch nesnesinden çıkarmak için harici bir DLL yazmak daha kolay. Bunu MQL4 ile yapmak mümkün olmayacak çünkü bellek ayırmanız gerekiyor

 
MQL4'te bu verileri DLL yazmadan çıkarmak mümkündür (test edilmiştir). Ancak yukarıdaki yaklaşım çok daha çok yönlüdür. Çünkü WriteSymbol() işlevine kolaylıkla ve tanıdık rahatlıkla birçok şey doldurulabilir...
 
 
Videonuzda bir sorun var...
Prensipte senaryonun nasıl çalışacağı açık olmasına rağmen. Ancak bu açıkça güvenilmez bir çözümdür ve kesinlikle sık sık terminal donmalarına yol açacaktır. Bana çok sık takılıyor...

getch :
MQL4'te bu verileri DLL yazmadan çıkarmak mümkündür (test edilmiştir). Ancak yukarıdaki yaklaşım çok daha çok yönlüdür. Çünkü WriteSymbol() işlevine kolaylıkla ve tanıdık rahatlıkla birçok şey doldurulabilir...

İlginç ve nasıl çıkarabilirim? Hangi takımlar? Bu gerçekten mümkünse, çok minnettar olurum ... Böyle bir olasılıktan şiddetle şüphe etsem de ...


Ben kendim "Piyasa İzleme" den veri çektim, ancak yalnızca C ++. Bunu yapmak için önce yeni bir işlem oluşturulur (OpenProcess), içinde bellek ayrılır (VirtualAllocEx), gerekli veri yapısı oraya yerleştirilir ve nesneden gerekli bilgiler zaten orada saklanır. Peki, o zaman gerekli verileri oradan okuruz. Ve sadece mesajlarla bilgiyi alamazsın, denedim. ListView türünde bir nesne var

 

Bilinmeyen bir nedenden dolayı forum videoyu düzgün görüntüleyemiyor. Bu yüzden bir ZIP arşivine ekledim.


Bu betiğin çalışmazlığını ve güvenilmezliğini karşılamak mümkün değildi.

Dosyalar:
symbols.zip  1630 kb
 

Komut dosyasının daha basit (yalnızca bir global değişken ) ve daha güvenilir (karma işlevi olmayan) bir sürümü:

 // Запись в файл названий и торговых условий всех символов из окна "Market Watch"
// Во время работы скрипта желательно не производить никаких действий в терминале

#include < WinUser32 . mqh >

extern string FileName = " Symbols . txt ";   // Имя файла для записи информации по символам
extern int Pause = 200 ; // Техническая пауза в миллисекундах

#import " user32.dll "
   int GetParent ( int hWnd ) ;
   int GetDlgItem ( int hDlg , int nIDDlgItem ) ;
#import

#define VK_HOME 0x24
#define VK_DOWN 0x28

#define LVM_GETITEMCOUNT 0x1004

// Названия используемых глобальных переменных
#define VAR_HANDLE " Symbol_Handle "

// Возвращает хэндл основного окна терминала
int Parent ()
{
   int hwnd = WindowHandle ( Symbol () , Period ()) ;
   int hwnd_parent = 0 ;

   while ( ! IsStopped ())
   {
     hwnd = GetParent ( hwnd ) ;
     
     if ( hwnd == 0 )
       break ;
       
     hwnd_parent = hwnd ;
   }
   
   return ( hwnd_parent ) ;
}

// Открывает окно графика символа, расположенного в строке номер Num окна "Market Watch"
void OpenChart ( int Num )
{
   int hwnd = Parent () ;
   
   if ( hwnd != 0 )    // нашли главное окно
   {
     hwnd = GetDlgItem ( hwnd , 0xE81C ) ; // нашли "Market Watch"
     hwnd = GetDlgItem ( hwnd , 0x50 ) ;
     hwnd = GetDlgItem ( hwnd , 0x8A71 ) ;
   
     PostMessageA ( hwnd , WM_KEYDOWN , VK_HOME , 0 ) ; // верхняя строчка окна "Market Watch"
     
     while ( Num > 1 )   
     {
       PostMessageA ( hwnd , WM_KEYDOWN , VK_DOWN , 0 ) ; // сместились на нужную строчку
       Num --;
     }
   }

   PostMessageA ( Parent () , WM_COMMAND , 33160 , 0 ) ; // открыли график

   return ;
}

// Закрывает окно графика
void CloseChart ( int hwnd )
{
   PostMessageA ( GetParent ( hwnd ) , WM_CLOSE , 0 , 0 ) ;
  
   return ;
}

// Запускает выбранный в окне "Navigator" скрипт (индикатор или советник) 
void RunScript ()
{
   PostMessageA ( Parent () , WM_COMMAND , 33042 , 0 ) ; // исполнить скрипт на текущем графике
  
   return ;
}

// Возвращает количество символов в окне "Market Watch"
int SymbolCount ()
{
   int hwnd = Parent () ;
   int Count = 0 ;    

   if ( hwnd != 0 )    // нашли главное окно
   {
     hwnd = GetDlgItem ( hwnd , 0xE81C ) ; // Нашли список символов
     hwnd = GetDlgItem ( hwnd , 0x50 ) ;
     hwnd = GetDlgItem ( hwnd , 0x8A71 ) ;
   
     Count = SendMessageA ( hwnd , LVM_GETITEMCOUNT , 0 , 0 ) ; // получили количество элементов списка
   }
   
   return ( Count ) ;
}

// Записывает характеристика текущего торгового символа в файл
void WriteSymbol ()
{
   int handle ;
   string Str ;
  
  
   Str = " \n " + Symbol () + " : " ;
   Str = Str + " \n   Spread = " + DoubleToStr ( MarketInfo ( Symbol () , MODE_SPREAD ) , 0 ) ;
   Str = Str + " \n   StopLevel = " + DoubleToStr ( MarketInfo ( Symbol () , MODE_STOPLEVEL ) , 0 ) ;
   Str = Str + " \n   Digits = " + DoubleToStr ( MarketInfo ( Symbol () , MODE_DIGITS ) , 0 ) ;
   Str = Str + " \n   Price(Example) = " + DoubleToStr ( Bid , Digits ) ;

   handle = FileOpen ( FileName , FILE_READ | FILE_WRITE ) ;
   FileSeek ( handle , 0 , SEEK_END ) ;

   FileWrite ( handle , Str ) ;
   FileClose ( handle ) ;
   return ;
}

void start ()
{
   int handle , Count , i = 1 ;
  
   if ( GlobalVariableCheck ( VAR_HANDLE ))    // Запустили не первый раз...
   {
     GlobalVariableSet ( VAR_HANDLE , WindowHandle ( Symbol () , Period ())) ;
     WriteSymbol () ;
   }
   else    // запустили первый раз
   {
     GlobalVariableSet ( VAR_HANDLE , WindowHandle ( Symbol () , Period ())) ;

     handle = FileOpen ( FileName , FILE_WRITE ) ; // обнулили файл с данными
     FileClose ( handle ) ;
    
     Count = SymbolCount () ;

     while ( ! IsStopped ())
     {
       if ( i > Count )
         break ;
      
       OpenChart ( i ) ; // открыли график очередного символа из окна "Market Watch"
       Sleep ( Pause ) ;
      
       RunScript () ; // запустили на только что открытом графике текущий скрипт
       Sleep ( Pause ) ;
      
       CloseChart ( GlobalVariableGet ( VAR_HANDLE )) ; // закрыли окно графика
       Sleep ( Pause ) ;

       i ++;
     } 
    
     GlobalVariableDel ( VAR_HANDLE ) ;
    
     // записали в файл количество символов в окне "Market Watch"
     handle = FileOpen ( FileName , FILE_READ | FILE_WRITE ) ;
     FileSeek ( handle , 0 , SEEK_END ) ;

     FileWrite ( handle , " \n AMOUNT OF SYMBOLS = " + Count ) ;
     FileClose ( handle ) ;
   }
  
   return ;
}
 
getch :

 // Открывает окно графика символа, расположенного в строке номер Num окна "Market Watch"
void OpenChart ( int Num )

ve zaten açık olan bir grafikte bir sembolü hangi komut "sıfırlayabilir"? onlar. mevcut tabloyu ihtiyacım olan sembole çevir?

 

İşte ZG_All Quotings 1-80924 !!!

Harika fikir ve düşünce uçuşu için getch'e teşekkürler!!!

Kahramanın adını bilmek istiyorum :-)

Bu komut dosyası, bir komisyoncudan teklif almanın son yoludur.

Daha da zor bir yol, komisyoncuya özel ekipmanla kişisel bir ziyaret yapmaktır.

 
Ütülerle, değil mi?