EA'da Çubukları geriye doğru analiz etme - sayfa 3

 
paranoyakX :

tavsiye için teşekkürler, işte kodumun çok basit bir versiyonu, bu benim gerçek kodum değil ama umarım bu daha açık olur.

dediğim gibi bu gerçek kod değil, kalıp bulma vb. sadece bir örnek. bu konuyu açmamın nedeni DetectExistingPattern() işlevidir.

OnTick() öğesinin ilk çalıştırmasında kodun nasıl çalıştırılacağına ilişkin size zaten örnek kod verdim, bu nedenle şimdi kod gönderinizi uygun şekilde güncelleyin, böylece DetectExistingPattern() öğesi OnTick() öğesinin ilk çağrısında çalışır ve OnInit() öğesinde değil .

Ayrıca, Yeni bir Çubuğu tespit etmek için "Çubukları" kullanamazsınız. Bu yanlış. "Zaman[0]" veya "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )" kullanmalısınız. İşte bir örnek:

 bool isNewBar()
{
   static datetime last_time = WRONG_VALUE ;
   datetime lastbar_time = ( datetime ) SeriesInfoInteger ( _Symbol , _Period , SERIES_LASTBAR_DATE ); // to be compatible with MQL5

   if ( last_time != WRONG_VALUE )
   {
       if ( last_time != lastbar_time )
      {
         last_time = lastbar_time;
         return ( true );
      }
   }
   else
      last_time = lastbar_time;

   return ( false );
}
 
FMIC :

OnTick() öğesinin ilk çalıştırmasında kodun nasıl çalıştırılacağına ilişkin size zaten örnek kod verdim, bu nedenle şimdi kod gönderinizi uygun şekilde güncelleyin, böylece DetectExistingPattern() öğesi OnTick() öğesinin ilk çağrısında çalışır ve OnInit() öğesinde değil .

Ayrıca, Yeni bir Çubuğu tespit etmek için "Çubukları" kullanamazsınız. Bu yanlış. "Zaman[0]" veya "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )" kullanmalısınız. İşte bir örnek:

teşekkürler @FMIC, @jjc istediği için basit kodu ekledim. Bu arada Barları 'dan öğrendim hatırladığım kadarıyla herkes öyle yazıyordu ben de öyle yaptım. Neden yanlış ? Yanlış çalışabilir mi?

ps: Metatrader 4 kullanıyorum, yani mql4 değil mi?

 
paranoyakX :

teşekkürler @FMIC, @jjc istediği için basit kodu ekledim. Bu arada Barları 'dan öğrendim hatırladığım kadarıyla herkes öyle yazıyordu ben de öyle yaptım. Neden yanlış ? Yanlış çalışabilir mi?

ps: Metatrader 4 kullanıyorum, yani mql4 değil mi?

Numara! Forumda, birçok kullanıcının "Çubuklar" yönteminin çok eski ve güvenilmez olduğunu gösterdiğini göreceksiniz, çünkü çubuk sayısı grafikler için "Seçenekler" tarafından değiştirilebilir veya başına maksimum çubuk sayısı sabit olabilir. grafiğe ulaşılmıştır. Bu nedenle kullanılması yanlıştır. "Time[0]" kullanın veya MQL5 ile de uyumlu olmasını istiyorsanız "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )" kullanın. Lütfen örneğime bakın.
 

FMIC :
No! On the forum, you will find that many users have shown that the "Bars" method is very old and unreliable because the number of bars can be changed by the "Options" for charts or it can be constant when the maximum number of bars per chart has been reached. So, it is wrong to use it. Use either "Time[0]" or if you want it to be compatible with MQL5 as well, use "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )". Please see my example.

vay be kodunuzu kullanacağımı bilmiyordum çok teşekkür ederim
 
Çubuklar güvenilmezdir (yenileme/yeniden bağlanma, çizelgedeki çubukların sayısını değiştirebilir) hacim güvenilmezdir (kayıp tikler) Daima süreyi kullanın. Yeni mum - MQL4 forumu
 
paranoyakX :

dediğim gibi bu gerçek kod değil, kalıp bulma vb. sadece bir örnek. bu konuyu açmamın nedeni DetectExistingPattern() işlevidir.

Orijinal sorunuza dönersek... Bu örnekte, CheckTrendPattern() işlevinizi belirli bir çubuktan başlaması söylenecek şekilde değiştirmeniz bir seçenek olacaktır. 1'den 10'a kadar olan sabit çubuk aralığını kullanmak yerine, bunun yerine belirli bir başlangıç noktasından 1'den 10'a kadar bir ofset kullanırsınız.

 bool CheckTrendPattern( int StartAtBar){
 
   for ( int i=StartAtBar + 10 ; i>=StartAtBar + 1 ; i--) {
     if (High[i]>High[i- 1 ])
       return false ;
  };
  HighestValue = High[StartAtBar + 10 ];
  LowestValue  = Low[StartAtBar + 1 ];
  
   return true ;
};

Mevcut bir sipariş olmadığında ve kalıbın şu anda karşılanıp karşılanmadığını kontrol etmek istediğinizde, CheckTrendPattern() yerine CheckTrendPattern(0)'ı kullanırsınız.

Başlarken, mevcut bir siparişiniz varsa, onu tetikleyen modeli aşağıdaki gibi arayabilirsiniz. Bu, başlangıçta yaptığım önerinin aynısı: mevcut siparişin açık zamanına eşdeğer olan çubuk indeksini alıyorsun ve oradan geriye doğru bakmaya başlıyorsun.

 int BarShiftOfOrderOpen = iBarShift( Symbol (), Period (), OrderOpenTime(), false );
CheckTrendPattern(BarShiftOfOrderOpen);

Ancak, FMIC'in dediği gibi, bu kontrolün OnInit() yerine OnTick()'e yapılan ilk çağrıda yapılması tercih edilir. Bunu önermemin kendi nedenlerimin "başlatmayı geciktirmek" ile hiçbir ilgisi yok. Bunun yerine, MT4 zaten bir grafiğe eklenmiş EA ile yeniden başladığında, komisyoncudan veya güncellenmiş bir çubuk geçmişinden henüz %100 güvenilir bir sipariş listesine sahip olmadığınızdan endişe duyarım.

Aklınızda bulundurmak isteyebileceğiniz bir diğer husus, tümü tek bir çubuk tarafından kapsanan süre boyunca gerçekleşen aşağıdaki senaryodur:

  • Bir kalıp bulursun ve bir ticaret yaparsın
  • Açık ticaretin kapalı, örneğin bir stop-loss'a ulaştığı için
  • MT4 kapanır (kasıtlı olsun veya olmasın)
  • MT4 yeniden başlatılıyor
  • EA mevcut modeli yeniden bulur ve açık ticaret olmadığı için aynı çubukta başka bir ticaret alır

Bunu önlemek için kapalı emirlerin yanı sıra açık emirleri de kontrol etmek isteyebilirsiniz.

 
@jjc , önerilerin çok güzel. deneyiminizi paylaştığınız için teşekkürler.
jjc :

Orijinal sorunuza dönersek... Bu örnekte, CheckTrendPattern() işlevinizi belirli bir çubuktan başlaması söylenecek şekilde değiştirmeniz bir seçenek olacaktır. 1'den 10'a kadar olan sabit çubuk aralığını kullanmak yerine, bunun yerine belirli bir başlangıç noktasından 1'den 10'a kadar bir ofset kullanırsınız.

Mevcut bir sipariş olmadığında ve kalıbın şu anda karşılanıp karşılanmadığını kontrol etmek istediğinizde, CheckTrendPattern() yerine CheckTrendPattern(0)'ı kullanırsınız.

Gerçek kalıbım bu değil yani sabit sayılar yok (10 örnek gibi) dinamik ama kalıp kontrol yöntemim farklı bu yüzden hatırlayamadım ve bu beni gerçekten rahatsız ediyor çünkü kalıp bulmak için benzer bir kod yazdım Yeniden. sorun şu ki EA çalışırken, kalıbım hala devam ediyorsa son çubuğu kontrol ediyorum ve devam ediyorsa hiçbir şey yapmıyorum, kalıp bozulduğunda bir sipariş açıyorum. O yüzden kalıbı tekrar bulurken o kodu kullanamıyorum çünkü bu sefer ileri değil barlarda geri gitmem gerekiyor. Ayrıca kalıbı geriye doğru aramak istemedim çünkü bu durumda aynı çubukları tekrar tekrar kontrol edeceğim. Sadece performans sorunuyla ilgileniyorum ama bir sorun olmayacağını gördüğüm için, desen bulma yöntemimi değiştirmeyi düşünüyorum, böylece dediğin gibi hem başlangıçta hem de çalışırken kullanabilirim. bu aynı zamanda kalıbımı değiştirirsem, unuttuğum kalıp bulma prosedürünü değiştirmek zorunda kalacağım gibi olası sorunları da önleyecektir.Bunun için teşekkürler. Ayrıca @FMIC'in dediği gibi, belki bu kısmı bir gösterge olarak yapmalıyım (ki pek yazmadım) ki tekrar bulup bulmakta sorun olmasın.
jjc :

Başlarken, mevcut bir siparişiniz varsa, onu tetikleyen modeli aşağıdaki gibi arayabilirsiniz. Bu, başlangıçta yaptığım önerinin aynısı: mevcut siparişin açık zamanına eşdeğer olan çubuk indeksini alıyorsun ve oradan geriye doğru bakmaya başlıyorsun. Ancak, FMIC'in dediği gibi, bu kontrolün OnInit() yerine OnTick()'e yapılan ilk çağrıda yapılması tercih edilir. Bunu önermemin kendi nedenlerimin "başlatmayı geciktirmek" ile hiçbir ilgisi yok. Bunun yerine, MT4 zaten bir grafiğe eklenmiş EA ile yeniden başladığında, komisyoncudan veya güncellenmiş bir çubuk geçmişinden henüz %100 güvenilir bir sipariş listesine sahip olmadığınızdan endişe duyarım.

Aklınızda bulundurmak isteyebileceğiniz bir diğer husus, tümü tek bir çubuk tarafından kapsanan süre boyunca gerçekleşen aşağıdaki senaryodur:

  • Bir kalıp bulursun ve bir ticaret yaparsın
  • Açık ticaretiniz kapalı, örneğin bir stop-loss vurduğu için
  • MT4 kapanır (kasıtlı olsun veya olmasın)
  • MT4 yeniden başlatılıyor
  • EA mevcut modeli yeniden bulur ve açık ticaret olmadığı için aynı çubukta başka bir ticaret alır

Şimdi neden OnInit'te yapmam gerektiği daha net anlaşıldı, güvenilirlik elbette en önemli nokta ve dikkate alma uyarınızı düşünmedim. bu kısım gerçekten önemli, gereksiz siparişler açabilirim, belki nadir ama mümkün. Bunu bir şekilde halletmeliyim. Gerçekten çok teşekkür ederim.

@ WHRoeder yeni çubuk kontrol kontrolünüz çok basit ve güzel. Yönteminizi koduma ekledim, teşekkür ederim.

 

Herkese merhaba,

@FMIC'in önerdiği gibi, kalıbımı bulan bir gösterge yazıp, bir sinyal ve emirlerim için kullanacağım birkaç veri daha veriyorum (farklı fiyatlarla birden fazla emir açabiliyorum). Şimdi EA'mda kullanmak istiyorum ama bir sorum var, aslında deneyiminize ihtiyacım var. İndikatörümden bir sinyal aldığımda, tekrar açtığımda mt4'üm herhangi bir nedenle çökerse, emir açacağım veya emir vereceğim (satış limiti veya alış limiti vb.) Açılan emrin hangi sinyale ait olduğunu nasıl bulabilirim? benim göstergemde. Bunun için bar shift kullanmak uygun mudur? daha önce konuştuğumuz gibi, sipariş oluşturma zamanını bulabilirim, sonra o çubuk kaymasını bulabilirim ve bu kaydırmayı kullanarak gösterge değerini elde etmeye çalışmalı mıyım? Bu sıralama ve gösterge kaymasını nasıl eşleştirebilirim?

Teşekkürler.

 
paranoyakX : Herkese merhaba, @FMIC'in tavsiye ettiği gibi, kalıbımı bulan, sinyal veren ve emirlerim için kullanacağım birkaç veriyi yazan ve göstergeyi yazıyorum (farklı fiyatlarla birden fazla emir açabilirim). Şimdi EA'mda kullanmak istiyorum ama bir sorum var, aslında deneyiminize ihtiyacım var. İndikatörümden bir sinyal aldığımda, tekrar açtığımda mt4'üm herhangi bir nedenle çökerse, emir açacağım veya emir vereceğim (satış limiti veya alış limiti vb.) Açılan emrin hangi sinyale ait olduğunu nasıl bulabilirim? benim göstergemde. Bunun için bar shift kullanmak uygun mudur? daha önce konuştuğumuz gibi, sipariş oluşturma zamanını bulabilirim, sonra o çubuk kaymasını bulabilirim ve bu kaydırmayı kullanarak gösterge değerini elde etmeye çalışmalı mıyım? Bu sıralama ve gösterge kaymasını nasıl eşleştirebilirim?
Evet, iBarShift() işlevini kullanabilirsiniz, tıpkı jjc'nin daha önceki bir gönderide size açıkladığı gibi, ardından göstergenizin verilerine iCustom() işlevi aracılığıyla başvurmak için.
 
FMIC :
Evet, iBarShift() işlevini kullanabilirsiniz, tıpkı jjc'nin daha önceki bir gönderide size açıkladığı gibi, ardından göstergenizin verilerine iCustom() işlevi aracılığıyla başvurmak için.
@FMIC'e çok teşekkür ederim, o zaman shift kullanmak iyi bir çözüm. Modelimi gösterge olarak yapmak gerçekten iyi bir tavsiyeydi. Elbette tüm kodumu değiştireceğim ama daha tutarlı olacak.