Bir EA/göstergeden kenelerin öykünmesi - sayfa 3

 
Meat :

Evet, sorunun ne olduğu belli değil... O zaman şunu deneyin: #import "user32.dll" içe aktarma bölümüne şu işlevi ekleyin:

CallWindowProcA(int lpPrevWndFunc[], int hWnd, int Msg, int wParam, int lParam);

Ve SetMyTimer işlevinin sonuna şu satırı ekleyin: CallWindowProcA(code,0,0,0,0);

Ve bazı paralel çalışan göstergelerle, şu anda bir onay işareti oluşturulup oluşturulmadığını kontrol edin.

Şey, bir şeyler değişmiş gibi görünüyor, şimdi günlükte şöyle görünüyor:
10:42:52 EURUSD,H1 testi: başarıyla yüklendi
10:42:54 EURUSD,H1 testi: 02C310A8'de dll 'user32.dll' kritik hatası c0000005'ten 'CallWindowProcA' işlevi çağrısı.
10:42:54 EURUSD,H1 testi: başlat

tikiler nerede? ;)

 
Meat :

Zhunko , standart olmayan her şeye sahipseniz (kendi günlüğünüz, kendi gösterge uygulamanız vb.), O zaman neden tüm bu konuşmayı başlattınız? Burada aslında kendi geliştirmelerimizle değil, özellikle MT4 ile çalışmayı tartışıyoruz.

İlk gönderide, görev üçüncü taraf DLL'ler olmadan yapılacaksa, kodumun tam olarak yararlı olacağını özellikle belirttim, yani. yalnızca sistem kitaplıklarını kullanan kendi kendine yeterli bir Uzman Danışman/gösterge uygulayın. Ve kendi geliştirmelerinizi kullanırsanız, bu sizin için geçerli değildir.

Ve genel olarak, dağınık olmamak daha kolaysa, neden “işten sonra günlüğü manuel olarak temizlediğini” anlamıyorum. Sonuçta anladığım kadarıyla geliştirmelerinizi DLL'de uyguluyorsunuz. O zaman, burada önerdiğim gibi aynı zamanlayıcıyı orada ayarlamanızı engelleyen nedir. Sadece orada sadece birkaç satır kod alacaktır. Ama nedense tefli ve kütük temizlemeli her türlü dansı tercih ediyorsunuz. Her nasılsa bir programcı gibi düşünmüyorsunuz ... Görüyorsunuz, kodum sizi rahatsız ediyor ama günlükleri her gün temizleyecek kadar tembel değilsiniz :)

Bana kütük ancak tarihin değiş tokuşundan sonra dövülür. Çarşamba ve Cumartesi günleri oluyor. Otomatik temizlemesi nedeniyle ne olduğunu unuttum.

Uzun zaman önce çizelgelerin çevrimdışı güncellemesini yaptım. Burada uygulandı. İşlevi herhangi bir programdan bir kez çalıştırırsınız ve başka bir şey yapmanız gerekmez. Tüm yüksüz MQL4 programlarında bile güncelleme devam eder, çizelgelerin açılıp kapanması izlenir.

Kullandığım için değil, kodunuza bir alternatif önerdim. Bu, belirlediğiniz göreve bağlı olarak bu soruna basit bir çözümdür. Bir satır kod, kodunuzdan çok daha basittir. Günlükleri her gün temizlemeniz gerekmez. Sadece hafta sonu. Aksi takdirde, bu kod gerekli değildir. Bu mantıklı. Log, ne derse desin, her durumda onu temizlemek gerekir. Yani sebep bu değil.

=======================

Kodunuzu çalıştırın. Windows 7'de çalışmıyor.

Belki AddBytes() işlevinden kurtulun? Diziyi şu şekilde başlatın:

   int code[ 7 ] = { 0x558BEC6A , 0x16A0268 , 0 , 0 , 0 , 0 , 0x33C05DC3 };
  code[ 2 ] = MT4InternalMsg;
  code[ 3 ] = 0x68000000 + (hWnd >> 8 );
  code[ 4 ] = (hWnd << 24 ) + 0x00B80000 + (PostMsgAddr >> 16 );
  code[ 5 ] = (PostMsgAddr << 16 ) + 0x0000FFD0 ;
Daha kısa olacak. Ancak bu sadece bir kez yapılır.
 
Zhunko :

Bana kütük ancak tarihin değiş tokuşundan sonra dövülür. Çarşamba ve Cumartesi günleri oluyor. Otomatik temizlemesi nedeniyle ne olduğunu unuttum.

Uzun zaman önce çizelgelerin çevrimdışı güncellemesini yaptım. Burada uygulandı. Herhangi bir programdan bir işlevi bir kez çalıştırırsınız ve başka bir şey yapmanız gerekmez. Tüm yüksüz MQL4 programlarında bile güncelleme devam eder, çizelgelerin açılıp kapanması izlenir.

Kullandığım için değil, kodunuza bir alternatif önerdim. Bu, belirlediğiniz göreve bağlı olarak bu soruna basit bir çözümdür. Bir satır kod, kodunuzdan çok daha basittir. Günlükleri her gün temizlemeniz gerekmez. Sadece hafta sonu. Aksi takdirde, bu kod gerekli değildir. Bu mantıklı. Log, ne derse desin, her durumda onu temizlemek gerekir. Yani sebep bu değil.

=======================

Kodunuzu çalıştırın. Windows 7'de çalışmıyor.

Belki AddBytes() işlevinden kurtulun? Diziyi şu şekilde başlatın:

Daha kısa olacak. Ancak bu sadece bir kez yapılır.

Evet, tabii ki, gönderdiğim kodum sadece bir kaynak kod, yani anlamı açık ve tabii ki zaten paketlenmiş halde kullanmak daha uygun ... tabii daha sonra düzenlemeniz gerekmiyorsa :) Görünüşe göre derlemek için çok erken çünkü. Nedense pek çoğu için çalışmıyor :) Hem XP'de hem de 7'de benim için iyi çalışmasına rağmen, bir saat sürmeme rağmen hiçbir şey çökmüyor. Bir çeşit mistik...

Bir satır kod, kodunuzdan çok daha basittir. Günlükleri her gün temizlemeniz gerekmez. Sadece hafta sonu. Aksi takdirde, bu kod gerekli değildir. Bu mantıklı.

Kişisel olarak sizin için, paralel olarak çalışan bir "günlük temizleyiciniz" varsa bu çok önemli olmayabilir. Onlar. kendi mutfağın var. Ama genel durumdan bahsediyoruz. Teflerle bu tür danslara karışmayan sıradan bir kullanıcı düşünün. Ardından, göstergenizle normal tam teşekküllü çalışma için ayrıca bir "kütük temizleyicisine" ihtiyaç duyacağı ortaya çıktı. Onlar. bir dizi birkaç dosya. Ve bu, görüyorsunuz, zaten kodumun boyutundan çok daha büyük ;) Peki mantık ve özlülük ne olacak, bence yanılıyorsunuz. Özellikle kodumu önerdiğiniz gibi paketlenmiş halde alırsanız. Bu, elbette, bir satır değildir, ancak bunun için başka bir gadget'a gerek yoktur, yani. bu bitmiş bir üründür.

Log, ne derse desin, her durumda temizlemek gerekir

Neden aniden olsun ki? Hiçbir şeyle tıkamıyorsam, neden temizleyeyim?

 

Alexey, temizleyici mutlaka otomatik olmayabilir. Örneğin, bir klasöre sağ tıklayın ve " Boş Klasör " seçeneğini seçin. Bunu hafta sonları deney yaptıktan sonra yapın.

Yıl boyunca Expert Advisors ve dergide 365 dosya birikir. Onlar. 730 dosya. Temizlenmesi gerekmiyor mu? Bunu duymak garip. Hiçbir şey yapmadığınız için tıkanmaz. Günlük çalışma ile kütüklerin boyutu büyük ölçüde büyür.

 
Zhunko :

Alexey, temizleyici mutlaka otomatik olmayabilir. Örneğin, bir klasöre sağ tıklayın ve "Boş Klasörü" seçin. Bunu hafta sonları deney yaptıktan sonra yapın.

Yıl boyunca Expert Advisors ve dergide 365 dosya birikir. Onlar. 730 dosya. Temizlenmesi gerekmiyor mu? Bunu duymak garip. Hiçbir şey yapmadığınız için tıkanmaz. Günlük çalışma ile kütüklerin boyutu büyük ölçüde büyür.

Prensip olarak, evet, deneylerden sonra genellikle temizlenmesi gerektiğine katılıyorum. Ama sadece deneylerden bahsetmiyoruz. Sonuçta, gösterge sonuçta deneyler için değil, iş için yaratılmıştır. Bu nedenle, çalışma sürecinde zaten hata ayıklanmış bir gösterge günlükleri tıkamaya devam ederse, bu artık doğru değildir.

Genel olarak, eski kütüklerin kaldırılmasına gelince, bu zaten bir kişisel tercih meselesidir. Örneğin, bir yıl öncesinin günlüklerinde bazı bilgileri bulma ihtiyacı duydum. Bu yüzden onları silmiyorum. Ve özellikle eskileri (bir yıldan fazla) arşivliyorum. Eh, yani Herhangi bir deneyle değil, doğrudan ticaretle ilgili günlüklerden bahsediyoruz.

 
Meat :

Prensip olarak, evet, deneylerden sonra genellikle temizlenmesi gerektiğine katılıyorum. Ama sadece deneylerden bahsetmiyoruz. Sonuçta, gösterge sonuçta iş için oluşturulur, deneyler için değil . Bu nedenle, çalışması sırasında zaten hata ayıklanmış bir gösterge günlükleri tıkamaya devam ederse, bu artık doğru değildir.

Yani, böyle bir losyonun sadece hafta sonları gerekli olduğu gerçeğinden bahsediyorum. Zamanın geri kalanı gerekli değildir.
 

Genel olarak, kene üretimi bazen hafta içi günlerde gereklidir. Muhtemelen sadece sembolünün tırnaklarını kullanan bir danışman/gösterge düşünüyorsunuz. Ancak genel durumda, analiz edilen birkaç sembol olabilir ve hepsi için hızlı bir şekilde yeni veriler almanız gerekir. Elbette, kenelerin sıklıkla geldiği EURUSD gibi bazı sıvı enstrümanlarda çalıştırabilirsiniz... ama yine de, bu her derde deva değil ve çok uygun olmayabilir.

 

Her durumda, kene gelmeden sonucu görmek istediğinizde.

Yani araştırma amaçlı.

 

Sorunun ne olduğunu anladım. Bir dizi yerel olarak değil global olarak bildirilmelidir.

Düzeltilmiş halini gönderiyorum. Bu arada kodu kısalttım. Ve Zhunko'nun önerdiği seçenek, bundan 3 satır daha kısa olmasına rağmen, algoritmanın algılanması için çok çarpık ve elverişsizdir, bu yüzden bu kodun ne yaptığını anlamayacaksınız, aniden bir tür virüs var: ) Ve hiç esnek değil . O yüzden kodu kısaltmak için aşırıya kaçmamak gerektiğini düşünüyorum.

 #property indicator_chart_window

#import "user32.dll"
   int    RegisterWindowMessageA( string lpString);
   int    SetTimer( int hWnd, int nIDEvent, int uElapse, int & lpTimerFunc[]);
   bool   KillTimer( int hWnd, int uIDEvent);
#import "kernel32.dll"
   int    GetModuleHandleA( string lpModuleName);
   int    GetProcAddress( int hModule, string lpProcName);
  
int TimerId= 666 ;
int TimerCode[ 7 ];

//----------------------------------------------------------------------

int init()
{
  SetMyTimer( 1000 );   // интервал в миллисекундах
}
//----------------------------------------------------------------------

int deinit()
{
  KillMyTimer();
   Comment ( "" );
}  

//+------------------------------------------------------------------+
//| program start function                                           |
//+------------------------------------------------------------------+
int start()
{
   static int n= 0 ;
  n++; 
   Comment ( "tick:  " ,n);
   PlaySound ( "tick.wav" );
}
//-------------------------------------------------------------------

int SetMyTimer( int interval)
{    
   int MT4InternMsg= RegisterWindowMessageA( "MetaTrader4_Internal_Message" );
   int hWnd= WindowHandle ( Symbol (), Period ());
   int PostMsgAddr= GetProcAddress(GetModuleHandleA( "user32.dll" ), "PostMessageA" );
   if (PostMsgAddr== 0 ) return ( 0 );
   // push ebp; move ebp,esp; push 01; push 02; push MT4InternMsg; push hWnd; mov eax,PostMsgAddr; call eax; pop ebp; ret;    
   int value[]={ 0x55 , 0x8B , 0xEC , 0x6A , 01 , 0x6A , 02 , 0x68 , 0000 , 0x68 , 0000 , 0xB8 , 0000 , 0xFF , 0xD0 , 0x5D , 0xC3 };
   int len[]=  { 1 ,     1 ,   1 ,     1 ,   1 ,   1 ,   1 ,   1 ,   4 ,     1 ,   4 ,     1 ,   4 ,     1 ,   1 ,     1 ,     1    };
  value[ 8 ]=MT4InternMsg;  value[ 10 ]=hWnd;  value[ 12 ]=PostMsgAddr; 
   int byte= 0 ;
   for ( int i= 0 ; i< ArraySize (value); i++)
     for ( int j= 0 ;  j<len[i];  j++, byte++)
      TimerCode[byte/ 4 ] += (value[i]>>( 8 *j)& 0xFF ) <<(byte% 4 * 8 );
  
   return ( SetTimer(hWnd, TimerId, interval, TimerCode) );
}

//---------------------------------------------------

bool KillMyTimer()
{
   return ( KillTimer( WindowHandle ( Symbol (), Period ()), TimerId) );
}
 
Meat :

Genel olarak, kene üretimi bazen hafta içi günlerde gereklidir. Muhtemelen sadece sembolünün tırnaklarını kullanan bir danışman/gösterge düşünüyorsunuz. Ancak genel durumda, analiz edilen birkaç sembol olabilir ve hepsi için hızlı bir şekilde yeni veriler almanız gerekir. Elbette, kenelerin sıklıkla geldiği EURUSD gibi bazı sıvı enstrümanlarda çalıştırabilirsiniz... ama yine de, bu her derde deva değil ve çok uygun olmayabilir.

En az bir örnek?

Ne kadar yazıp kullansam da hafta sonları hariç hiç ihtiyacım olmadı.

Uzman + gösterge. Bu, Uzman Danışmanı döngüye sokarak çözülür. Sonuç sizinkiyle aynı. Verileri zamanında almak için sunucu saat değişikliklerine tepki vermek yeterlidir. Bunun için WinAPI'ye ihtiyacınız yok.

Gerekli olduğu tek durum, Uzman Danışmanın hafta sonu başladığı zamandır. Bu bile yukarıda ortaya çıkan çizgi ile uygulanabilir. Sadece uzman için.