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

 

Herkese merhaba,

Bu gerçekten aptalca bir soru olabilir ama bunu yapmanın yolunu gerçekten bulamadım. Bir EA oluşturmaya çalışıyorum. bazı çubukları inceledikten sonra açıp sipariş edip etmemeye karar verir. Diyelim ki bir sipariş açtı. Bir şekilde EA'm durursa veya metatrader kapanırsa, yeniden açtığımda emrin açılmasına neden olan çubukları bulmak istiyorum. Bu yüzden siparişleri arıyorum ve siparişimi buluyorum (EA'nın yeni açtığı) ve çubukları analiz etmeye başlamak istiyorum. Bunu nasıl yapacağım? açık bar siparişlerimi nasıl bulabilirim ve barlara geri dönmeye başlayabilirim.

örneğin:

H1 döneminde koşuyorum ve 12:00, 13:00, 14:00 ve 15:00'deki barları arıyorum, sonra 16:00'da sipariş açmaya karar veriyorum. önemli barlar 12:00 - 15:00 arası ve ben bu barları tekrar tanımlamak istiyorum. bu yüzden EA'yı yeniden çalıştırdığımda önce siparişi bulacağım ve açılma tarihini bulacağım, bu tarihin hangi bara ait olduğunu tespit edeceğim ve o tarihten önce barlarda geriye doğru gitmeye başlayacağım.

Zaman dizisi vs kullanmayı düşündüm ama çubukları bulmaya çalışırken yeni bir çubuk gelirse ne olur? vardiyalar değişecek ve aramam mantıksız olacak.

Ben de bu bilgileri bir dosyaya yazmak istemiyorum. çok fazla zaman ve çok fazla istisna işleme vb. gerektirir.

Teşekkürler.

 
paranoyakX :

Zaman dizisi vs kullanmayı düşündüm ama çubukları bulmaya çalışırken yeni bir çubuk gelirse ne olur? vardiyalar değişecek ve aramam mantıksız olacak.


Bir EA kodunu yürütürken yeni bir çubuk çıkmamalıdır. OnTick() çağrıldığında yüklenen verilerle çalışır.

Yine de RefreshRates() kullanılırsa ne olacağından emin değilim.

 
GumRai : Yine de RefreshRates() kullanılırsa ne olacağından emin değilim.

Her ne kadar sık olmasa da (aslında çok nadiren), RefreshRates() kullanılırken, yeni bir çubuk oluşumu nedeniyle çubuk verilerinin kaydırılması deneyimini yaşadım. Bu sorunu aşmak için, gerekli tüm verileri başlangıçta değişkenlere kopyalamaya çalışıyorum ve ardından olay yürütmenin geri kalanında Geçmiş Veri Dizilerine veya eşdeğer işlevlere tekrar güvenmemeye çalışıyorum. Bu şekilde, kodumda RefreshRates() kullanmam gerekse bile, yine de başlangıç koşullarına güvenle başvurabilirim.

@paranoyakX: Yani, RefreshRates() kullanımından bağımsız olarak, benzer bir yaklaşımı deneyebilirsiniz. Aslında MQL5'te MQL4 ile aynı yeteneğe sahip değilsiniz ve verileri işlemek için kendi dizilerinize kopyalamanız ZORUNDASINIZ. Yani, bu şekilde yaparak, kodunuzu hem MQL4 hem de MQL5 ile uyumlu hale getirmek için aslında birkaç adım daha yakınsınız.

Ancak, en iyi çözüm, tüm bunları EA'da kodlamak değil, bunun yerine bu mantığın çoğunu, bu sorundan muzdarip olmayan bir Göstergede kodlamaktır, çünkü yaklaşım tamamen farklıdır. Bir göstergede Sinyal mantığını mümkün olduğunca programlamaya çalışın. Bu ayrıca yararlıdır, çünkü göstergeyi tam olarak istediğiniz gibi çalışana kadar görsel olarak kullanabilir ve test edebilirsiniz. Gösterge çözümünün bir başka kullanımı, yalnızca EA için değil, aynı zamanda manuel ticaret için de sinyal vermesini sağlamasıdır. O halde EA, sinyalizasyona değil, ticaret yönetimine odaklanmalıdır.

 
paranoyakX :

[...] Zaman dizisi vs kullanmayı düşündüm ama barları bulmaya çalışırken yeni bir bar gelirse ne olur? vardiyalar değişecek ve aramam mantıksız olacak.

Sorduğunuz şey potansiyel olarak o kadar basit ki, asıl noktayı kaçırıp kaçırmadığımı merak ediyorum. Önceki bir OrderSelect() verildiğinde, basitçe aşağıdakileri yaparak onun OrderOpenTime() ile ilişkili çubuk kaydırmasını arayabilirsiniz:

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

Örneğin:

  • H1 grafiği
  • Şu anki saat 16:32
  • Sipariş 14:23 de açıldı
  • Yukarıdaki kod, BarShiftOfOrderOpen = 2, yani H1 çubuğu saat 14:00'te dönmelidir ve Time[BarShiftOfOrderOpen] 14:00 olacaktır.
 
jjc : Sorduğun şey potansiyel olarak o kadar basit ki, asıl noktayı kaçırıyor muyum diye merak ediyorum. Önceki bir OrderSelect() verildiğinde, basitçe aşağıdakileri yaparak onun OrderOpenTime() ile ilişkili çubuk kaydırmasını arayabilirsiniz:

Örneğin:

  • H1 grafiği
  • Şu anki saat 16:32
  • Sipariş 14:23 de açıldı
  • Yukarıdaki kod, BarShiftOfOrderOpen = 2, yani H1 çubuğu saat 14:00'te dönmelidir ve Time[BarShiftOfOrderOpen] 14:00 olacaktır.

Evet, OP'nin söylediği tam olarak bu, ama sorguladığı şey, nasıl yapılacağı değil, yeni bir gelen kene tarafından yeni bir çubuk oluşturan yeni bir çubuk oluşturmasının neden olduğu bir çubuk kayması nedeniyle geçersiz hale gelmesinin nasıl önleneceğidir. veri.

Ancak, RefreshRates() kullandığınız durumlar dışında bu OLMAMALIDIR. Bu olasılık için (ki bu nadiren olur), MQL5'in yaptığı gibi alternatif yöntemler önerdim.

 
FMIC :

ancak yeni bir çubuk oluşturan yeni bir tik işaretinin neden olduğu bir çubuk kayması nedeniyle geçersiz hale gelmesi nasıl önlenir?

OP bunu nerede söylüyor? Soru bu olabilir , ama sanırım ayak sesleri duyuyorsunuz ve atlardan çok zebraları düşünüyorsunuz. EA durumunu MT4'ün yeniden başlatmalarında bir dosyada ısrar etmekten bahsetmek, bana sorunun aslında çok, çok daha basit olduğunu gösteriyor.
 

Selam beyler,

cevaplar için çok teşekkür ederim,

@FMIC, ilginç bir şekilde indikatör kullanmayı hiç düşünmemiştim ve sizin dediğiniz gibi bir tane oluşturup kullanırsam bu çok daha kolay olabilir ama tabii ki bu benim siparişimle eşleşen indikatör değerini nasıl bulacağım gibi yeni soruları da beraberinde getirecek. bu işlemi her seferinde yapmaz, sadece bir kez OnInit() yapar. bu yüzden belki bir EA kullanmak bunun için uygundur.

@jjc, çözümünüz için de teşekkür ederim. Aslında "yeni çubuk" hakkında biraz endişeliydim ama hepinizin dediği gibi, EA çalışırken vardiya değişimi olmayacak (ve RefreshRates() işlevini kullanmıyorum), bu yüzden kodunuzu da kullanabilirim. @FMIC'in söylediklerinden sonra şimdi merak ediyorum, bunu bir gösterge olarak oluştursam daha iyi olur mu?

 
jjc :
OP bunu nerede söylüyor? Soru bu olabilir , ama sanırım ayak sesleri duyuyorsunuz ve atlardan çok zebraları düşünüyorsunuz. EA durumunu MT4'ün yeniden başlatmalarında bir dosyada ısrar etmekten bahsetmek, bana sorunun aslında çok, çok daha basit olduğunu gösteriyor.

GumRai bile bunu anladı ve ondan alıntı yaptı, burada tekrar yapacağım:

paranoyakX :

Zaman dizisi vs kullanmayı düşündüm ama çubukları bulmaya çalışırken yeni bir çubuk gelirse ne olur? vardiyalar değişecek ve aramam mantıksız olacak.

 
paranoyakX :

@FMIC, ilginç bir şekilde gösterge kullanmayı hiç düşünmemiştim ve sizin dediğiniz gibi bir tane oluşturup kullanırsam bu çok daha kolay olabilir ama elbette bu, siparişimle eşleşen gösterge değerini nasıl bulacağım gibi yeni soruları da beraberinde getirecek. bu işlemi her seferinde yapmaz, sadece bir kez OnInit() yapar. bu yüzden belki bir EA kullanmak bunun için uygundur.

@jjc, çözümünüz için de teşekkür ederim. Aslında "yeni çubuk" hakkında biraz endişeliydim ama hepinizin dediği gibi, EA çalışırken vardiya değişimi olmayacak (ve RefreshRates() işlevini kullanmıyorum), bu yüzden kodunuzu da kullanabilirim. @FMIC'in söylediklerinden sonra şimdi merak ediyorum, bunu bir gösterge olarak oluştursam daha iyi olur mu?

Sizin için çok karmaşıksa önerime aldırmayın! Şimdi sizin için en kolay olanı yapın ve daha sonra onunla daha rahat olduğunuzda, diğer yolu da deneyin.

not! OnInit()'inize herhangi bir mantık kodu koymamalısınız, bu sadece bir şeyleri başlattığınız yerdir ve asla geçmiş veri dizisi dizilerinden gelen verilerle hiçbir şey yapmazsınız. Tüm mantığınız ve ana kodunuz OnTick() veya OnCalculate() içinde olmalıdır.

 
FMIC :

GumRai bile bunu anladı ve ondan alıntı yaptı, burada tekrar yapacağım:

Sen ve Gumrai, kanıtların henüz garanti etmediği "yeni bir bar ortaya çıkarsa"nın anlamı hakkında büyük bir varsayımda bulunuyorsunuz. OP henüz " OnStart sırasında yeni bir çubuk ortaya çıkarsa" demedi.

ParanoyakX'in ticaret/sinyal ayrıntılarını EA'daki küresel değişkenlerde sakladığından şüpheleniyorum. Sanırım sorun, OnStart() çağrısı sırasında oluşan yeni çubuklar değil, bunun yerine EA'nın ömrü boyunca oluşan yeni çubuklardır.

 
jjc :

Sen ve Gumrai, kanıtların henüz garanti etmediği "yeni bir bar ortaya çıkarsa"nın anlamı hakkında büyük bir varsayımda bulunuyorsunuz. OP henüz " OnStart sırasında yeni bir çubuk ortaya çıkarsa" demedi.

ParanoyakX'in ticaret/sinyal ayrıntılarını EA'daki küresel değişkenlerde sakladığından şüpheleniyorum. Sanırım sorun, OnStart() çağrısı sırasında oluşan yeni çubuklar değil, bunun yerine EA'nın ömrü boyunca oluşan yeni çubuklardır.

EA'larda OnStart() yok ama ne demek istediğinizi anladım. Ancak, OP, yorumlarınıza yanıt olarak bile şunları söyledi ve alıntı yapıyorum:

Aslında "yeni çubuk" hakkında biraz endişeliydim ama hepinizin dediği gibi, EA çalışırken vardiya değişimi olmayacak (ve RefreshRates() işlevini kullanmıyorum)

Neden: