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

 
KimIV :
VBAG :
Geçenlerde bu sorunu kendim için çözdüm.
DC'lerin çiftin adına kendilerine ait bir şey ekledikleri yerde çalışmaz. Örneğin, "m", "!", "." veya "_".
Evet, elbette, bunu araştırma amacıyla yaptım, ancak eğer öyle hissediyorsanız, radikal bir şey yapabilirsiniz - dinlenin ve tüm ASCII karakterlerinin kombinasyonlarının sayısını, diyelim ki, maksimum makul karakter sayısına göre sıralayın. enstrüman adı (8-10). Böyle bir komut dosyası muhtemelen birkaç saat çalışacaktır, ancak otomatik ve garantilidir.


Zhunko'ya
- Hatırladım, elbette, fikri senin kodundan çıkardım. Önyükleyicinizle birkaç gün çalıştım - komik bir şey! Teşekkür ederim.
 
KimIV :
VBAG :

Geçenlerde bu sorunu kendim için çözdüm.
DC'lerin çiftin adına kendilerine ait bir şey ekledikleri yerde çalışmaz. Örneğin, "m", "!", "." veya "_".
Böyle birkaç DC vardır ve kullandıkları sembollerin sayısı azdır. Öngörülebilir.
Moneyrain çiftleriyle yaptığım şey buydu. "Mini" ve "profesyonel" nerede.
In Light'ta, bir tür saçmalığın da atfedildiği görülüyor.
Onlar. enstrümanları DC'ye göre gruplara ayırabilirsiniz.
Yalnızca şu DC'lerle ilgileniyordum: Alpari, ForexBest, MoneyRain, NorthFinance, NWBroker.
Bu, maksimum sayıda enstrümana sahip bir DC'dir. Ve döviz endekslerini hesaplamak için teklif göndermeleri gerekiyordu.
İşte onlar için "ZZ_All Quotings 0-0080" betiği.
 
// Запись в файл названий и торговых условий всех символов из окна "Market Watch"
// Во время работы скрипта желательно не производить никаких действий в терминале
// NB: Используемая Хэш-функция не является корректной для данной задачи 
 
#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 VAR_HASH "Symbol_Hash"
#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;
}
 
// Хэш-функция перевода строки в целое число
// NB: данная функция не совершенна (приводит к коллизиям)
int Hash( string Str )
{
  int HashRes = 0;
  int i; 
  
  i = StringLen(Str) - 1;
  
  while (i >= 0)
  {  
    HashRes += StringGetChar(Str, i);
    i--;
  }
 
  HashRes %= 101;
  
  return(HashRes);
}
 
// Запускает выбранный в окне "Navigator" скрипт (индикатор или советник) 
void RunScript()
{
  PostMessageA(Parent(), WM_COMMAND, 33042, 0); // исполнить скрипт на текущем графике
  
  return;
}
 
// Записывает характеристика текущего торгового символа в файл
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, i = 1;
  
  if (GlobalVariableCheck(VAR_HASH))  // Запустили не первый раз...
  {
    GlobalVariableSet(VAR_HANDLE, WindowHandle(Symbol(), Period()));
 
    if (GlobalVariableGet(VAR_HASH) != Hash(Symbol())) // проверка достижения конца списка символов окна "Market Watch"
    {  
      GlobalVariableSet(VAR_HASH, Hash(Symbol()));
      WriteSymbol();
    }
    else
      GlobalVariableDel(VAR_HASH);
  }
  else  // запустили первый раз
  {
    GlobalVariableSet(VAR_HASH, -1);
    
    handle = FileOpen(FileName, FILE_WRITE); // обнулили файл с данными
    FileClose(handle);
 
    while(!IsStopped())
    {
      OpenChart(i); // открыли график очередного символа из окна "Market Watch"
      Sleep(Pause);
      
      RunScript(); // запустили на только что открытом графике текущий скрипт
      Sleep(Pause);
      
      CloseChart(GlobalVariableGet(VAR_HANDLE)); // закрыли окно графика
      Sleep(Pause);
      
      if (!GlobalVariableCheck(VAR_HASH)) // Достигнут ли конец списка символов окна "Market Watch"?
        break;
        
      i++;
    }
    
    GlobalVariableDel(VAR_HANDLE);
    i--;
    
    // записали в файл количество символов в окне "Market Watch"
    handle = FileOpen(FileName, FILE_READ|FILE_WRITE);
    FileSeek(handle, 0, SEEK_END);
 
    FileWrite(handle, "AMOUNT OF SYMBOLS = " + i);
    FileClose(handle);
  }
  
 
  return;
}
 
Eğlenceli bir oyuncak ama düzgün çalışmıyor. Son enstrümana takıntılıyım. Durdurmaya çalışırken bir MT4 hatası oluştu.
Her aracın pencerelerini her TF ile açalım.
İşte başlangıçta eksik olan bir prosedür:
 #property show_inputs
 
Vay! Harika!
Teşekkür ederim!
 
oha şimdi deneyeceğim
 
Zhunko :
Eğlenceli bir oyuncak ama düzgün çalışmıyor. Son enstrümana takıntılıyım. Durdurmaya çalışırken bir MT4 hatası oluştu.
Her aracın pencerelerini her TF ile açalım.
İşte başlangıçta eksik olan bir prosedür:
 #property show_inputs


Yapmak
 extern int Pause = 1000 ; // Техническая пауза в миллисекундах

Bir hataya neden olduysa, başlamadan önce aşağıdaki global değişkenleri tekrar kaldırın (F3):

 " Symbol_Hash "
" Symbol_Handle "
Not: Senaryo, soruna olası bir çözüm fikrinin yalnızca bir gösterimidir.
 
getch :

Not: Senaryo, soruna olası bir çözüm fikrinin yalnızca bir gösterimidir.

programlama deneyimi, hem insan zihninin becerikliliğini hem de aracın işlevsellik eksikliğini mükemmel bir şekilde gösterir .. şerefe ve ne yazık ki ..
 
Shu :

araç işlevselliği eksikliği .. şerefe ve ne yazık ki ..
Umalım ki MQL5'te böyle sapıklığa zorlanmayacağız.

Not Öte yandan - süreç önemlidir!
 

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

Fikir: komut dosyası dönüşümlü olarak "Piyasa İzleme" penceresinden her alım satım aracının grafik pencerelerini açar, kendini onlarda başlatır ve pencereyi kapatır. Oluşturduğu (ve çalışmanın sonunda silinen) global değişkenler aracılığıyla kendini düzenler. Herşey.


Aşağıdaki koşullar yerine getirildiğinde komut dosyası vakaların %99'unda çalışacaktır:

- DLL'yi manuel onay olmadan kullanmasına izin verilecek;

- Duraklatma değişkeninin değeri 1000'den fazla olarak ayarlanacaktır (teknik bir duraklama, bilgisayarın ve İnternet bağlantısının performansına bağlıdır. Bu özellikler ne kadar iyi olursa, Duraklatma değerini o kadar az ayarlayabilir ve buna göre komut dosyasını azaltabilirsiniz) çalışma süresi);

- komut dosyasını başlatmadan önce, genel değişkenleri (F3) "Symbol_Hash" ve "Symbol_Handle" silin (daha önce komut dosyasının başarısız bir şekilde başlatılması durumunda olabilir).


Komut dosyasının bitiminden sonra terminal, başlatmadan öncekiyle aynı görünür. Tüm sembol verileri Symbols.txt dosyasındadır.