스크립트의 "시장 조사" 창에서 선택한 모든 도구를 프로그래밍 방식으로 반복하려면 어떻게 해야 합니까? - 페이지 3

 
getch :

대본에는 왜곡이 없습니다. 약간 비표준적인 접근 방식이며 그 이상은 아닙니다.

물론 대본 자체에는 왜곡이 없습니다. 나는 나를 아주 정확하게 표현하지 못했습니다. 목록에 액세스하는 방식의 변태입니다. 그러나 도구 목록에 대한 액세스는 Windows 창이 아니라 터미널을 사용하여 구현해야 한다는 데 동의해야 합니다. 그리고 스크립트는 특히 Windows에서 작업한 경험이 없는 나 같은 초보 프로그래머에게 매우 유용합니다. 다시 한 번 감사합니다. 필요한 솔루션이 많이 포함되어있어 혼자 공부하는 데 많은 시간이 걸립니다.
 

그리고 많은 변태를 발명하는 데 필요한 이유는... MarketWatch 개체에서 필요한 데이터를 추출하는 외부 DLL을 작성하는 것이 더 쉽습니다. MQL4를 통해 이 작업을 수행할 수 없습니다. 메모리를 할당 해야 합니다

 
MQL4에서는 DLL을 작성하지 않고 이 데이터를 추출하는 것이 가능(테스트)되었습니다. 그러나 위의 접근 방식은 훨씬 더 다양합니다. 왜냐하면 WriteSymbol() 함수에 쉽고 친숙한 편리함으로 많은 것을 채울 수 있습니다...
 
 
동영상에 문제가 있습니다...
원칙적으로 스크립트가 작동하는 방식은 분명합니다. 그러나 이것은 분명히 신뢰할 수 없는 솔루션이며 자주 터미널 정지로 이어질 것입니다. 꽤 자주 걸려요...

getch :
MQL4에서는 DLL을 작성하지 않고 이 데이터를 추출하는 것이 가능(테스트)되었습니다. 그러나 위의 접근 방식은 훨씬 더 다양합니다. 왜냐하면 WriteSymbol() 함수에 쉽고 친숙한 편리함으로 많은 것을 채울 수 있습니다...

흥미롭고 어떻게 꺼낼 수 있습니까 ?? 어떤 팀? 이게 정말 가능하다면 정말 감사할 따름입니다... 그런 가능성이 있는지는 의구심이 들지만...


나 자신이 "Market Watch"에서 데이터를 가져왔지만 C++에서만 가능했습니다. 이를 위해 먼저 새 프로세스가 생성되고(OpenProcess), 여기에 메모리가 예약되고(VirtualAllocEx) 필요한 데이터 구조 가 거기에 배치되고 객체의 필요한 정보가 이미 거기에 저장됩니다. 글쎄, 우리는 거기에서 필요한 데이터를 읽습니다. 그리고 당신은 메시지만으로는 정보를 얻을 수 없습니다. 나는 시도했습니다. ListView 유형의 개체가 있습니다.

 

알 수 없는 이유로 포럼에서 비디오를 올바르게 표시할 수 없습니다. 그래서 ZIP 아카이브에 첨부했습니다.


이 스크립트의 작동 불가능성과 신뢰성을 충족할 수 없었습니다.

파일:
symbols.zip  1630 kb
 

더 간단하고(하나의 전역 변수 만) 더 안정적인(해시 함수 없이) 스크립트 버전:

 // Запись в файл названий и торговых условий всех символов из окна "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 )

이미 열려 있는 차트 의 기호를 "재설정"할 수 있는 명령은 무엇입니까? 저것들. 현재 차트를 필요한 기호로 전환하시겠습니까?

 

ZG_All Quotings 1-80924 입니다 !!!

훌륭한 아이디어와 생각의 비행에 대한 getch 에게 감사드립니다!!!

주인공 이름을 알고 싶습니다 :-)

이 스크립트는 브로커로부터 견적을 받는 마지막 방법입니다.

더 힘든 방법은 견적을 내기 위해 특별한 장비를 가지고 브로커를 직접 방문하는 것입니다.

 
다리미로, 그렇지?
사유: