Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 577

 
Artyom Trishkin :
Tüm bunları bir fonksiyona koyar ve ihtiyacım olduğunda çağırırdım - en azından her tikte (gerekçeli ve gerekliyse), en azından yeni bir mumun açılışında - saatte bir, örneğin çalışırsak H1'de.

İşlevi ile elbette uygundur. Neyin ne olduğunu kodu çözdüm. Şimdi açık. İstediğim hedeflere nasıl ulaştıracağımı düşüneceğim ve gerekli verileri ne zaman ve hangi aşamada çıkaracağımı anlayacağım.

 
Koldun Zloy :

Doğrudan "pervasızlığın zirvesi" olsaydı, yasak olurdu.

WinAPI, MQL'nin olanaklarını önemli ölçüde genişletir. Ve dll olmadan aptalca şeyler yapabilirsiniz.

Ve işte panoya bir dize geçirme örneği:

Harika ve yorumlarla.

Sayesinde.

Bir soru daha.

Verilen koordinatlarda bir "fare" tıklamasının öykünmesini yapmak mümkün müdür?

 
mila.com :

Harika ve yorumlarla.

Sayesinde.

Bir soru daha.

Verilen koordinatlarda bir "fare" tıklamasının öykünmesini yapmak mümkün müdür?

MQL'den yapmanız gerekmiyorsa, AutoIT'e bakın, orada istediğinizi yapabilirsiniz. Ürün ücretsizdir, MQL ile etkileşim için yalnızca bir DLL gereklidir.
 
mila.com :

Harika ve yorumlarla.

Sayesinde.

Bir soru daha.

Verilen koordinatlarda bir "fare" tıklamasının öykünmesini yapmak mümkün müdür?

Yapabilir.

 #define MK_LBUTTON     0x0001
#define WM_LBUTTONDOWN 0x0201
#define WM_LBUTTONUP   0x0202

struct POINT
{
   int x;
   int y;
};

#import "User32.dll"
   uint WindowFromPoint( int x, int y );
   uint PostMessageW( uint hWnd, uint Msg, uint wParam, uint lParam );
   int ScreenToClient( uint hWnd, POINT& lpPoint );
#import

int x = 1000 ;   // Экранные координаты
int y = 350 ;

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
{
   uint hwnd = WindowFromPoint( x, y ); // Получаем дескриптор окна в нужном месте
   
   if ( hwnd ){
      POINT point;
      point.x = x;
      point.y = y;
      ScreenToClient( hwnd, point );   // Преобразуем экранные координаты в координаты рабочей области окна
      
       uint lParam = (point.y * 65536 ) + (point.x & 0xFFFF );   // Упаковываем координаты в 32-разрядное целое
      
      PostMessageW( hwnd, WM_LBUTTONDOWN, MK_LBUTTON, lParam ); // Посылаем сообщения от "мыши"
      PostMessageW( hwnd, WM_LBUTTONUP, MK_LBUTTON, lParam );
   }
}
 
Artyom Trishkin :
Tüm bunları bir fonksiyona koyar ve ihtiyacım olduğunda çağırırdım - en azından her tikte (gerekçeli ve gerekliyse), en azından yeni bir mumun açılışında - saatte bir, örneğin çalışırsak H1'de.

Artem, doğru anlıyorum ki, eğer bir döngümüz varsa: for(int i=0; i<copy_bars; i++) ve yuvalanmış for(int j=0; j<copy_bars; j++) , burada if(j= =i) devam ediyor ; ,

o zaman bu, saymanın paralel olduğu anlamına gelir ve kabaca 5 mumumuz varsa, karşılaştırma şöyle olur:

1 ile 1 - atın.

2'den 1, 3'ten 1, 4'ten 1, 5'ten 1.

sonra döngü başlayacak, nerede olacak:

1.'den 2., 3.'den 2., 4.'den 2., 5.'den 2.

vb.

Aynı mı olacak?

 
Andrey Koldorkin :

Artem, doğru anlıyorum ki, eğer bir döngümüz varsa: for(int i=0; i<copy_bars; i++) ve yuvalanmış for(int j=0; j<copy_bars; j++) , burada if(j= =i) devam ediyor ; ,

o zaman bu, saymanın paralel olduğu anlamına gelir ve kabaca 5 mumumuz varsa, karşılaştırma şöyle olur:

1 ile 1 - atın.

2'den 1, 3'ten 1, 4'ten 1, 5'ten 1.

sonra döngü başlayacak, nerede olacak:

1.'den 2., 3.'den 2., 4.'den 2., 5.'den 2.

vb.

Aynı mı olacak?

Evet.
 
Artyom Trishkin :
Evet.

Başka bir soru: Mevcut mumu karşılaştırmamız gerekmiyorsa, hesabı sıfırdan değil 1'den başlatmamız gerekmez mi?

ya da burada 0'ın mum 1, 1'in mum 2, vb. olduğunu anlamalı mısınız?

 
Andrey Koldorkin :

Başka bir soru: Mevcut mumu karşılaştırmamız gerekmiyorsa, hesabı sıfırdan değil 1'den başlatmamız gerekmez mi?

ya da burada 0'ın mum 1, 1'in mum 2, vb. olduğunu anlamalı mısınız?

Burada sıfır, dizinin başlangıcıdır. Ve dizide mumları ilkinden, ...'e, "to"ya değil, ihtiyacımız olan miktarda yazıyoruz:

 int copied= CopyRates ( Symbol (), PERIOD_CURRENT , 1 ,copy_bars,array);

1, kopyalamaya başlanacak mum sayısıdır ve copy_bars, kopyalanacak mum sayısıdır.

Bu nedenle, dizi[] dizisinde, 0 dizinli hücrede ihtiyacımız olan mum var - ya 1 ya da 1+kopya_çubukları-1. dizi[] dizininin indeksleme yönüne bağlı olarak (ArraySetAsSeries(), ArrayGetAsSeries(), ArrayIsSeries() kullanılarak kontrol edilebilen indeksleme yönünü ayarlar )

 
Artyom Trishkin :

Burada sıfır, dizinin başlangıcıdır. Ve dizide mumları ilkinden, ...'e, "to"ya değil, ihtiyacımız olan miktarda yazıyoruz:

1, kopyalamaya başlanacak mum sayısıdır ve copy_bars, kopyalanacak mum sayısıdır.

Bu nedenle, dizi[] dizisinde, 0 dizinli hücrede ihtiyacımız olan mum var - ya 1 ya da 1+kopya_çubukları-1. dizi[] dizininin indeksleme yönüne bağlı olarak (ArraySetAsSeries(), ArrayGetAsSeries(), ArrayIsSeries() kullanılarak kontrol edilebilen indeksleme yönünü ayarlar )

Ah, bu programlama. Ormana ne kadar uzaksa...

İlk önce ne verdiğini Alert aracılığıyla kontrol ettim. Bunun tersinin doğru olduğu ortaya çıktı, yani. mevcut olana en yakın mum maksimum sayıya sahiptir.

Sonra şunu kontrol ettim:

bool series=ArrayIsSeries(dataCandle);

Uyarı(seri);

ve komut dosyası "yanlış" döndürdü

mantığıma göre, eğer yanlışsa, bu yanlış taraftan ise, o zaman ihtiyaç duyulandan doğru olacaktır.

Yazdım:

ArraySetAsSeries(dataCandle, true); //Yönü değiştir

bool series=ArrayIsSeries(dataCandle); // ne olduğunu tekrar kontrol et

Uyarı(seri); // Sonucu ekranda gösteriyorum.

Ama yine de ondan sonra "yanlış" alıyorum.

Benim kemanım nedir?

 
Andrey Koldorkin :

Ah, bu programlama. Ormana ne kadar uzaksa...

İlk önce ne verdiğini Alert aracılığıyla kontrol ettim. Bunun tersinin doğru olduğu ortaya çıktı, yani. mevcut olana en yakın mum maksimum sayıya sahiptir.

Sonra şunu kontrol ettim:

bool series=ArrayIsSeries(dataCandle);

Uyarı(seri);

ve komut dosyası "yanlış" döndürdü

mantığıma göre, eğer yanlışsa, bu yanlış taraftan ise, o zaman ihtiyaç duyulandan doğru olacaktır.

Yazdım:

ArraySetAsSeries(dataCandle, true); //Yönü değiştir

bool series=ArrayIsSeries(dataCandle); // ne olduğunu tekrar kontrol et

Uyarı(seri); // Sonucu ekranda gösteriyorum.

Ama yine de ondan sonra "yanlış" alıyorum.

Benim kemanım nedir?

dataCandles bir yapıdır. Mumları geçmişten yazdığımız bir dizi - dizi[]. Bu nedenle, indekslemesinin grafikteki mumların indekslenmesiyle çakışması için bir zaman serisi olarak yapılması gerekir. Yani, [] dizisinin sıfır hücresi, geçerli tarihe en yakın mumlara karşılık gelir.

Yani 1. mumları dizi[] dizisine kopyalayın, 2. onu bir zaman dizisi yapın, ardından ondan değerleri yapıya okuyun.

[] dizisi olmadan yapmak mümkün olurdu - verileri doğrudan grafikten yapıya yazın, ancak bunu beş ile uyumluluk için önerdim - yalnızca yüksek [i], düşük kullanarak doğrudan göstergede kopyalayabilirsiniz. [i] ve diğer veriler, ancak bir komut dosyasında veya bir Uzman Danışmanda, yine de önce istenen geçmiş bölümünü bir diziye kopyalamamız gerekiyor, hemen yaptım.