Düğme ve fare tıklamalarının durdurulmasıyla otomasyon. - sayfa 11

 
DKeN :
cm=GetDlgItem(hdlg,ID_SYMBOL);
int pos=SendMessageA(cm,CB_GETCOUNT,0,0);//listedeki miktarı al
// bir çift bul
dizi fs="";
for(int l=0;l<pos;l++){
int ll=SendMessageA(cm,CB_GETLBTEXT,l,fs);
Print(ll," ",fs);
}

Sipariş penceresindeki (F9) enstrüman listesini nasıl alacağımı söyle?

Eleman sayısını alıyorum, ancak tam olarak satırları sayıya göre alamıyorum, -1 döndürüyor.

#define ID_SYMBOL 0x053E //seçilecek sembol adı

cm tutamaç ComboBox

Herhangi bir metin almadan önce, bu metni alacak kadar büyük bir arabellek hazırlamanız gerekir. Ve fs dizginizin hiç uzunluğu sıfır. Böyle bir rezalet yüzünden terminalinizin düşmemesi garip. Bu nedenle, fs önceden yeterince uzun bir dize ile başlatılmalıdır. Genel durumu ele alırsak, alınan dizenin uzunluğu herhangi bir büyük olabileceği zaman, hangi arabellek boyutunun gerekli olduğunu bilmek için önce CB_GETLBTEXTLEN mesajını kullanarak bu uzunluğu bulmalıyız.
 
lasso :

Alexey, teşekkürler, işlev çalışıyor, ama ..


Yalnızca iş parçacığı kimliği gereklidir, çünkü İki terminalim var.

Başlık tanımlamasından çıktım, ancak yine de test cihazının altından iş parçacığı kimliğini nasıl belirleyeceğimi bilmek ister miyim?

Geçerli iş parçacığının kimliği GetCurrentProcessId() işlevi kullanılarak elde edilebilir.
 
Meat :
Herhangi bir metin almadan önce, bu metni alacak kadar büyük bir arabellek hazırlamanız gerekir. ......

BU ARADA!!!

İşlevini ihtiyaçlarıma göre uyarladığımda

 int FindWindow( string class , string caption, bool captionexactly= false )

işlev düzeyinde yerel olarak bildirilen dize arabelleği dizesi textbuf'un ilk çağrıda yalnızca bir kez başlatıldığı gerçeğiyle karşı karşıya kaldığında,

ve bundan böyle statik bir değişken gibi davranır.

 string  textbuf= "Абвгдежзийклмнопрсту";   // В_ЭТОЙ_СТРОКЕ_255_СИМВОЛОВ
Print("textbuf после инициализации =",textbuf);
Bu durumu yorumlayabilir misiniz?
 
lasso :

BU ARADA!!!

İşlevini ihtiyaçlarıma göre uyarladığımda

işlev düzeyinde yerel olarak bildirilen dize arabelleği dizesi textbuf'un ilk çağrıda yalnızca bir kez başlatıldığı gerçeğiyle karşı karşıya kaldığında,

ve bundan böyle statik bir değişken gibi davranır.

Bu durumu yorumlayabilir misiniz?

Ne hakkında olduğu anlaşıldı. GetText'ten alınan eski değerin arabellekte saklandığını kastetmiştiniz. Beni de şaşırttığını hatırlıyorum. Ancak bunlar MQL'nin özellikleridir. Forumda bir yerde, geliştiriciler derleyici düzeyinde ayarlanan tüm sabit dizelerin bellekte kalıcı olarak ayrı bir yerde saklandığını ve işlevden çıkarken kaybolmadığını (üzerine yazılmadığını) söyledi. Adresleri başlangıçta bilinir ve program çalışırken değişmez. Bu nedenle fonksiyon tekrar çağrıldığında, aynı sabit dizgeye erişildiğinde aynı adresten alınır. Ama orada zaten GetText işlevi tarafından yerleştirilmiş farklı bir metnimiz var.
Benzer şekilde, basitçe Print("Abvgdeziyklmnoprstu") yapabilirsiniz ve orada da farklı bir metin alırsınız :) I.e. bu textbuf değişkeniyle ilgili değil, sabit dizeyle ilgili. Derleme aşamasında, tüm sabit diziler kontrol edilir ve olduğu gibi veritabanına yerleştirilir ve yalnızca benzersiz dizeler. Aynı satırlar bulunursa, bunlar için veritabanında yalnızca bir ortak örnek oluşturulur. Buna göre, işlem sırasında bu örneği bozarsanız, programın herhangi bir yerinden böyle bir hatta yapılan tüm çağrılar da bozuk bir sonuç döndürür.

Bu size uymuyorsa, programlı olarak bir arabellek oluşturabilirsiniz:

 string textbuf= "" ;
for ( int i= 0 ; i< 255 ; i++)
  textbuf=textbuf+ " " ;

O zaman böyle bir sorun olmayacak. Doğrusu bunu yapmanın mümkün olup olmadığını hatırlamıyorum. Depolamaya erişim hataları olup olmayacağı... Deneyin.

 
Meat :
O zaman böyle bir sorun olmayacak. Doğrusu bunu yapmanın mümkün olup olmadığını hatırlamıyorum. Depolamaya erişim hataları olup olmayacağı... Deneyin.

"255 karakterin ekrana sığmadığı ve forumun görüntüsünün bozulduğu" gerçeğini okuduğumda - tam da bunu yaptım.

Ama bu seçenek işe yaramadı, API işlevi hiçbir şey döndürmedi... Bu yüzden seçeneğinizi bıraktım.

......

Her neyse, başka bir ayrıntılı cevap için çok teşekkür ederim.

 
lasso :

"255 karakterin ekrana sığmadığı ve forumun görüntüsünün bozulduğu" gerçeğini okuduğumda - tam da bunu yaptım.

Ama bu seçenek işe yaramadı, API işlevi hiçbir şey döndürmedi... Bu yüzden seçeneğinizi bıraktım.

......

Her neyse, başka bir ayrıntılı cevap için çok teşekkür ederim.


Rica ederim.

Anladığım kadarıyla nedeni, bu durumda işleve, değişkene ait orijinal metin arabelleğine değil, kopyasına, yani kopyasına bir referans iletilmesidir. işlev çağrılmadan önce oluşturulan geçici arabellek. Buna göre, işlev bu arabellekteki metni değiştirse bile, orijinal arabellek değişmeden kaldığı için hiçbir şey vermez. Ve işlev çıktığında geçici arabelleğe yapılan başvuru kaybolur. Bir keresinde bir dizenin DLL'ye aktarılmasıyla bunun yüzünden acı çektim. Ama bir çözüm var. Dize dizisinin bir öğesini işleve iletmeniz gerekir. Bu durumda, ara arabellek oluşturulmaz ve işlev, orijinal arabelleğe bir bağlantı alır.

 string buffer[ 1 ]={""};
for ( int i= 0 ; i< 500 ; i++)
  buffer[ 0 ]=buffer[ 0 ]+ " " ;

GetWindowTextA(h,buffer[0],500);

Bu şekilde çalışması gerekir.

 
void SetSymbol( int hdlg, string symbol, int len){
   int cm=GetDlgItem(hdlg,ID_SYMBOL);
   int pos=SendMessageA(cm,CB_GETCOUNT, 0 , 0 ); //получим количество в списке
   string fs,ff;
   
   for ( int l= 0 ;l<pos;l++){
       //SendMessageA(cm,CB_SETCURSEL,l,0);
       int len_text=SendMessageA(cm,CB_GETLBTEXTLEN,l, 0 );
       fs= " " ;
       for ( int m= 0 ;m<len_text+ 1 ;m++) fs= StringConcatenate (fs, " " );
       int ll=SendMessageA(cm,CB_GETLBTEXT,l,fs);
       Print (len_text, " = " ,fs); //пусто!!! длину получает.

          
       ff= StringSubstr (fs, 0 ,len);
       // Print(symbol);
       if (ff==symbol) {
            SendMessageA(cm,CB_SETCURSEL,l, 0 );
             break ;
       }
   }
}

Normalde uzunluğu alıyorum ama metni alamıyorum :-(

dizenin nasıl düzgün şekilde başlatılacağını açıklayın ve bunu harici bir dll olmadan uygulamak genellikle mümkün müdür?

bu, araçlar listesinde sembolü bulmak ve seçmek için gereklidir.


 
DKeN :

Normalde uzunluğu alıyorum ama metni alamıyorum :-(

dizenin nasıl doğru şekilde başlatılacağını açıklayın ve bunu harici bir dll olmadan uygulamak genellikle mümkün müdür?

bu, araçlar listesinde sembolü bulmak ve seçmek için gereklidir.

Dizenin başlatılmasına gelince, bir keresinde bir arkadaşım kemente bir önceki mesajımda açıkladım. Ya dize dizisinin bir öğesini kullanmanız ya da dize değişkenini yeterli uzunlukta bir sabitle başlatmanız gerekir. Sizin durumunuzda, elde edilen dizenin boyutunun 78 baytı geçmeyeceği önceden bilindiği için bir sabit kullanmak daha kolaydır:

12 bayt (enstrüman ticker) + 2 bayt (virgül ve boşluk) + 64 bayt (tam enstrüman adı) . Bu, mümkün olan maksimum dizi uzunluğudur. 80'e kadar yuvarlayabilirsiniz.

Ancak listedeki belirli bir aracı SEÇMEK istiyorsanız, adını almanıza gerek yoktur. CB_SELESTRING mesajını kullanmanız yeterlidir. Orada, bir dize parametresi olarak, adın yalnızca ilk bölümünü ("EURUSD") göndermeniz yeterlidir ve listeden uygun öğeyi bulup seçecektir.

 

Yakın Gelecek Milyon Dolarlık Robot API: Terminalde bir sürü karlı ticaret çekiyor... :) ve yeni bir milyoner bir veya iki ay içinde komisyoncudan kar çekmeye çalıştığında, tek bir tane olmadığını öğreniyor. ticaret... danışman bitti... :))))))))))

 

Arkadaşlar lütfen Sipariş penceresindeki Al/Sat butonlarının tutamaçlarını tanımlamama yardım edin. Tutamacı Sipariş penceresinden buldum:

 int chart_handle = WindowHandle ( Symbol (), Period ());
int MT_handle = GetAncestor(chart_handle, GA_ROOT); // GA_ROOT 2
PostMessageA(MT_handle, WM_KEYDOWN, VK_F9, 0 ); // открываем окошко Ордер
Sleep ( 1000 ); // Wait. This is important!
int Order_handle = GetLastActivePopup(MT_handle); // хэндл от Ордер-а

Sonra düğme tutamağını belirlemeye çalışıyorum (örneğin Bai), ancak yanıt olarak 0 alıyorum.

 int Buy_handle = GetDlgItem(Order_handle, 0x40C ); // 0x40C найдено с помощью WinSpy++

En ilginç şey, " Hemen yürütme " kutusundaki herhangi bir öğeden tutamacı bulmanın mümkün olmamasıdır. Ve Anında Gerçekleştirmenin kendisinden de bulunamaz. WinSpy++ onu ayrı bir öğe olarak görmesine ve bunun için 0xFFFF kimliğini göstermesine rağmen.

Lütfen kesinlikle yargılamayın, ben bir acemiyim.