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

 
Expertboss , yani bir 2008 sunucusuna ihtiyacınız var mı? Bence 2003'ün olanakları oldukça yeterli, ayrıca kaynaklara daha az ihtiyaç duyuyor, bu da daha ucuz donanımları seçebileceğiniz anlamına geliyor.
 
Meat :

Bu saatiniz bir uzman ise (gösterge değil), büyük ihtimalle sadece döngülüdür, bu yüzden birçok sembol hakkında sorunsuz bilgi alır. Bunu daha önce yazmıştım, Expert Advisor'da kenelerle ilgili gerçekten büyük bir sorun yok çünkü ilmekli yapılabilir. Ancak gösterge ile böyle bir sayı çalışmayacaktır.

Çeşitli işletim sistemlerine gelince, benim için hala bir gizem. Yukarıda yazdığım gibi, normal olarak yediyi sürüyorum ama nedense başkaları yapmıyor. Belki izinlerle alakalıdır...

Bu arada "kütüphaneleri değiştirme" konusuna gelince, WinXP(2003)'den user32 ve kernel32 dosyalarını alıp Vista(2008)'in kurulu olduğu bilgisayardaki Experts\libraries klasörüne koymayı deneyin. Birdenbire işe yarayacak mı? :) ...şüpheli olsam da...

Size doğrudan kenelerden bahsedeceğim, “Sizin tarafındayım”, ancak saat konusunda, cevaba bakılırsa, fikrimi anlamadınız, kodla deneyeceğim:

int init()

{

ObjectCreate("ServerTime", OBJ_LABEL , 0,0,0,0,0,0,0);

ObjectSet("SunucuZamanı", OBJPROP_CORNER, 3);

ObjectSet("SunucuZamanı", OBJPROP_XDISTANCE, 10);

ObjectSet("SunucuZamanı", OBJPROP_YDISTANCE, 37);

ObjectSetText("SunucuZamanı", "", 20, "Arial", Yeşil);

dönüş;

}

int başlangıç()

{

ObjectSetText("ServerTime", TimeToStr(TimeCurrent(), TIME_SECONDS ));

...

dönüş;

}

bu grafik için yeni tik ile açık olduğu gibi işaretler VE EĞER "Piyasa İzleme" penceresinde grafiğin oluşturulduğu tek bir enstrüman varsa, o zaman bu saatin zamanı ve güncellenmesi de grafikteki tik ile çakışıyor ve buna göre, Uzman Danışmanın çalışmasıyla, Ancak, "piyasa izle" penceresinde, her şey olsa bile birkaç enstrüman maliyeti varsa, o zaman "piyasa saati: 22:59:58" başlığında görüntülenen küçük bir saatte , o zaman bu saatler neredeyse tüm enstrümanlar için tüm tırnaklarla tik tak etmeyi bırakmıyorlar, bir yerde tik taklar ve çiftimde alıntı nasıl değişti, bu yüzden saatlerim bunlara eşit oldu. İşte düşünce """"tüm bu tikler eklenebilir mi? yukarı ve Uzman Danışmanıma veya sonunda Uzman Danışmanın çalıştığı pencereye """ uygulandı ve yalnızca bir çiftin alıntısından daha sık kene olacağı ortaya çıktı.

İskender.

Kaynakları döngüye sokmak istemiyorum... Yani, tüm alıntılardaki tüm onayları tek bir grafiğe indirgemek mi?

 

Ve siz baylar neden bunun saldırganlık olduğuna karar verdiniz? Bu sadece nezaket ilkelerinin bir hatırlatıcısıdır. Bir şey teklif etmeden önce karşılığında bir şey koymalısın. Ve hiçbir şeyin yoksa, o zaman sadece sorabilirsin ve bu gerçek.

64-bit sistemlerde küçük bir uzmanım ama bu konu beni çok ilgilendiriyor ama burada yardımcı olamayacağım için bilenlere sormak zorundayım. Ve bunda yanlış bir şey görmüyorum.

 
FAQ :

Ve siz baylar neden bunun saldırganlık olduğuna karar verdiniz? Bu sadece nezaket ilkelerinin bir hatırlatıcısıdır. Bir şey teklif etmeden önce karşılığında bir şey koymalısın. Ve hiçbir şeyin yoksa, o zaman sadece sorabilirsin ve bu gerçek.

64-bit sistemlerde küçük bir uzmanım ama bu konu beni çok ilgilendiriyor ama burada yardımcı olamayacağım için bilenlere sormak zorundayım. Ve bunda yanlış bir şey görmüyorum.


Muhtemelen parkta her şey ve duygular ortaya çıktı, ama sen moderatörsün ve sözlerin için teşekkürler sözlerini takip et, şevkimi soğutmaya çalışacağım.

UV ile İskender.

 
expertboss :

Yani """"bütün bu keneleri toplamak ve Uzman Danışmanıma veya Uzman Danışmanın çalıştığı pencereye uygulamak mümkün mü""" düşüncesi, sonuç olarak, çok daha fazla kene olacağı ortaya çıkacaktır. sadece bir çiftin alıntısından daha fazla.

İskender.

Kaynakları döngüye sokmak istemiyorum... Yani, tüm alıntılardaki tüm onayları tek bir grafiğe indirgemek mi?

EA yalnızca kendi kenelerine tepki verir, bu nedenle hiçbir şey "ekleyemezsiniz". Yalnızca iki seçenek vardır: ya bir zamanlayıcı ayarlayın (önerdiğim gibi) ya da başka bir çizelgede, Uzman Danışmanınızı "işaretleyecek" paralel döngülü bir Uzman Danışman çalıştırın. Ve bu döngüsel Uzman Danışmanda, bir şekilde "işaretlemeniz" gereken koşulları belirleyebilirsiniz. Örneğin, tanımladığınız durumda olduğu gibi TimeCurrent() değeri değiştiyse. Yine de, orijinal danışmanı (yani saatinizi) döngüye sokabilirseniz, ek bir danışmanda bu noktayı görmüyorum.

 
Genel olarak, IMHO, tüm sorunların çözümü, bellekte Başlat işlevinin adresini bulmak olacaktır :) O zaman , programın çok iş parçacıklı yürütülmesine kadar birçok şey ortaya çıkabilir.
 
Terminal düzenli tikler almadığında ve zamanlayıcı buna göre çalıştığında, danışman kod üzerinden çalıştığında ve bir noktada danışman yanlış istekler göndermeye başladığında, örneğin bir siparişi kapatmak için böyle bir plan sorunuyla karşılaştım, döner sunucunun genel bir hata "2" ve ardından "3" hatası gönderdiğini ve ayrıca sipariş numarası vb. OrdersTotal()==0){Uyarı (" Silinecek bir şey yok "); Sleep(1000);break;} // Eğer ord. kapalı döngüden çıkış yok.""""""""""" (while'dan çıkış), ancak kendiniz biraz yanlış anlıyorsunuz. Soru: Bir şekilde bunu bir şekilde yapmak mümkün mü? komut veya operatörün (ne diyeceğimi bilmiyorum bile), böylece örneğin sunucudan bir yanıt doğru olana kadar keneleri duraklatmak mümkün olur (örnek true =OrderClose (OrderTicket(), .. ..) o zaman her zamanki gibi devam edin, tabii bu bir rica, mümkün olduğu kadar. Ve bir gözlem daha (hafta sonu fark ettim) - grafiği hareket ettirirseniz , o zaman tikte jeneratörden veya normal kene yerine geri döner, "danışmanlar" düğmesine basılır, çıktı kenesi yoktur, ancak grafik hala yerine dönüyor, danışmanı grafikten silmiş, her şey durmuş. UV ile İskender.
 
Meat :

Genel olarak, işlevin son hali şöyledir:

// ebp'ye bas; ebp, esp'yi hareket ettirin; 01'e basın; 02'ye basın; MT4InternMsg'ye basın; hWnd'ye basın; mov eax,PostMsgAddr; çağrı eax; pop ebp; ret0010;

Anladığım kadarıyla PostMessageA(hwnd, RegisterWindowMessageA("MetaTrader4_Internal_Message"), 2, 1) komutunu kullanıyorsunuz. Bu komut, bir Uzman Danışman için onay işaretlerini taklit eder (WinUser32.h'deki açıklamaya göre). İşaretler, göstergeler için taklit edilmez, bu nedenle gösterge güncellenmez. Ne yazık ki, kontrol edilecek bir WinXP yok, ancak XP altındaki gösterge için keneler hala öykünüyorsa, şaşırırım.

Ayrıca, algoritmanızı kontrol ettim.

   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 );

VisualStudio hata ayıklayıcı altında ve sonuç olarak TimerCode dizisinde elde ettiğim sonuç, beklenen sonuca hiç karşılık gelmiyordu. Bu algoritmanın hata içermediğinden emin misiniz? Olanların sonucunun kodunu ve ekran görüntüsünü verebilirim. Dilerseniz daha detaylı analiz yapabiliriz.

 

Bu konu şu anda çok alakalı olmasa da, yeni yapılara geçmek için acelesi olmayanlar olduğunu düşünüyorum :) Bu nedenle, eğer Win7/Win8'de tick timer çalışmıyorsa, ya DEP aracını devre dışı bırakmalısınız ya da böyle bir işlev ekleyin:

 #import "kernel32.dll"
  bool   VirtualProtect( int lpAddress[], int dwSize, int flNewProtect, int & lpflOldProtect[]);

Ve son olarak bu seçenek:

 int SetMyTimer( int interval= 1000 , int timerId= 0 )
{    
   int MT4InternMsg= RegisterWindowMessageA( "MetaTrader4_Internal_Message" );
   int hWnd= WindowHandle ( Symbol (), Period ());
   int PostMsgAddr= GetProcAddress(GetModuleHandleA( "user32.dll" ), "PostMessageA" );
   if (PostMsgAddr== 0 || hWnd== 0 ) return ( 0 );
   static int TimerCode[ 7 ];   ArrayInitialize (TimerCode, 0 );
   int oldprotect[ 1 ]; 
  VirtualProtect(TimerCode, ArraySize (TimerCode)* 4 , 0x40 , oldprotect);   // PAGE_EXECUTE_READWRITE
  // push ebp; move ebp,esp; push 01; push 02; push MT4InternMsg; push hWnd; mov eax,PostMsgAddr; call eax; pop ebp; ret 0010;    
   int bytes[]={ 0x55 , 0x8B , 0xEC , 0x6A , 01 , 0x6A , 02 , 0x68 , 0000 , 0x68 , 0000 , 0xB8 , 0000 , 0xFF , 0xD0 , 0x5D , 0xC2 , 0x10 };
   int len[]=  { 1 ,     1 ,   1 ,     1 ,   1 ,   1 ,   1 ,   1 ,   4 ,     1 ,   4 ,     1 ,   4 ,     1 ,   1 ,     1 ,     1 ,   2 };
  bytes[ 8 ]=MT4InternMsg;  bytes[ 10 ]=hWnd;  bytes[ 12 ]=PostMsgAddr;
   int nbyte= 0 ;  
   for ( int i= 0 ;  i< ArraySize (bytes);  i++)
     for ( int j= 0 ;  j<len[i];  j++, nbyte++)
      TimerCode[nbyte/ 4 ] |= bytes[i]>>( 8 *j)& 0xFF <<(nbyte% 4 * 8 );
  timerId= SetTimer(hWnd, timerId, interval, TimerCode);
   return (timerId);
}