"MQL5 Sihirbazı: Alım Satım Sinyalleri Modülü Nasıl Oluşturulur" makalesi için tartışma - sayfa 7

 
t101:
OnInit() içine manuel olarak mı eklemeliyim? Yani Sihirbaz aracılığıyla yapmak istediğim şeyi yapamaz mıyım?
Ne gibi sorunlar var? Ek işlevsellik getiriyorsunuz, bu nedenle biraz manuel çalışma yapmanız gerekiyor.
 
Karputov Vladimir:
Sorun nedir? Ek işlevsellik getiriyorsunuz, bu nedenle biraz manuel çalışma yapmanız gerekiyor.

Hiç sorun değil, ancak Master'ın her şeyi sinyaller, sermaye vb. için özel modüller temelinde yaptığı konsepte uymuyor. Ve makale modası geçmiş ve doğru değil:

CheckCloseLong () yöntemi, çıkış seviyesinin belirlenmesiyle uzun bir pozisyonu kapatmak için bir sinyal üretir. Uzman Danışman tarafından uzun bir pozisyonun kapatılmasının gerekliliğini belirlemek için çağrılır. Uzun bir pozisyonu kapatmak için bir sinyal üretilmesinin amaçlanması durumunda yöntemi geçersiz kılmak gerekir.

virtual bool CheckCloseLong(double& price);
Her durumda, yardımınız için teşekkür ederim.
[Silindi]  
Neredeyse 6 yıl geçti, makale güncel değil mi? Terminalin neredeyse her hafta güncellendiğini gördüğüm için emin değilim.
 
yerlan Imangeldinov:
Neredeyse 6 yıl geçti ve makale güncel değil mi? Terminalin neredeyse her hafta güncellendiğini gördüğüm için emin değilim.
Ticaret sinyal modülleri yazma hakkında daha yeni bir makale var:"Altı saat içinde bir ticaret robotu oluşturun!".
 

Herkese merhaba,

Burada ve Standart Kütüphanenin Ticaret Stratejisi Sınıflarını Keşfetme - Harvester tarafındanStratejiyi Özelleştirme'de önerilen yaklaşımı kullanarak gözlemlenen bir ticaret aralığından "çıkma" ve "girme" iki modeliyle CExpertSignal'ın soyundan nasıl oluşturulacağını merak ediyorum. Benim algım, her sinyal sınıfının aşırı yüklenerek uygulanabileceği (uygulanması gerektiği) yönündedir

//+------------------------------------------------------------------+
//| Fiyatın artacağına dair "oylama".|
//| GİRİŞ: hayır.|
//| ÇIKTI: fiyatın artacağı "oy" sayısı. |
//| NOT: hayır.|
//+------------------------------------------------------------------+
int CSignalBreakOutOrIn::LongCondition()
  {
   int result=0;
   int idx   =StartIndex();
//---
   //--- sadece bir çeşit varsayılan kalıp istersek diye
   if(IS_PATTERN_USAGE(0)) result=m_pattern_0;                                   // "onaylanıyor" sinyal numarası 0
   //--- model 1 kullanılıyorsa, model 1 için koşulu kontrol edin
   if(IS_PATTERN_USAGE(1) && ConditionForPattern1(idx)) result=m_pattern_1;      // sinyal numarası 1
   //--- model 2 kullanılıyorsa, model 2 için koşulu kontrol edin
   if(IS_PATTERN_USAGE(2) && ConditionForPattern2(idx)) result=m_pattern_2;      // sinyal numarası 2
//--- sonucu döndür
   return(result);
  }

ve

//+------------------------------------------------------------------+
//| Fiyatın düşeceğine dair "oylama".|
//| GİRİŞ: hayır.|
//| ÇIKTI: fiyatın düşeceğine dair "oy" sayısı. |
//| NOT: hayır.|
//+------------------------------------------------------------------+
int CSignalBreakOutOrIn::ShortCondition()
  {
   int result=0;
   int idx   =StartIndex();
//---
   //--- sadece bir çeşit varsayılan kalıp istersek diye
   if(IS_PATTERN_USAGE(0)) result=m_pattern_0;                                   // "onaylanıyor" sinyal numarası 0
   //--- model 1 kullanılıyorsa, model 1 için koşulu kontrol edin
   if(IS_PATTERN_USAGE(1) && ConditionForPattern1(idx)) result=m_pattern_1;      // sinyal numarası 1
   //--- model 2 kullanılıyorsa, model 2 için koşulu kontrol edin
   if(IS_PATTERN_USAGE(2) && ConditionForPattern2(idx)) result=m_pattern_2;      // sinyal numarası 2
//--- sonucu döndür
   return(result);
  }

O zaman şunu buluruz

int CExpertSignal::Direction()
  {
   ...
   int result=LongCondition()-ShortCondition();
   ...
  }

'de signal.m_threshold_open ve signal.m_threshold_close' akarşı test edilir.

  1. bool CExpertSignal::CheckOpenLong(...),
  2. bool CExpertSignal::CheckOpenShort(...),
  3. bool CExpertSignal::CheckCloseLong(...),
  4. bool CExpertSignal::CheckCloseShort(...),
  5. bool CExpertSignal::CheckReverseLong(...), ve
  6. bool CExpertSignal::CheckReverseShort(...).

Piyasaya giriş seviyelerini belirleyen ve zararı durdur ve kar al fiyatlarını ayarlayan parametreler şu şekilde döndürülür

//+------------------------------------------------------------------+
//| Satın alma seviyelerinin tespit edilmesi|
//+------------------------------------------------------------------+
bool CExpertSignal::OpenLongParams(double &price,double &sl,double &tp,datetime &expiration)
  {
  }
//+------------------------------------------------------------------+
//| Satış için seviyelerin tespit edilmesi|
//+------------------------------------------------------------------+
bool CExpertSignal::OpenShortParams(double &price,double &sl,double &tp,datetime &expiration)
  {
  }

standart uygulaması tarafından çağrılan bool CExpertSignal::CheckOpenLong(...) ve bool CExpertSignal::CheckOpenShort(...) temel sınıfta tanımlandığı gibi. Bu nedenle, aşırı yükleme yapmak yeterli olmalıdır

  1. int CExpertSignal::LongCondition(...),
  2. int CExpertSignal::ShortCondition(...),
  3. bool CExpertSignal::OpenLongParams(...),
  4. bool CExpertSignal::OpenShortParams(...),
  5. bool CExpertSignal::CloseLongParams(...), ve
  6. bool CExpertSignal::CloseShortParams(...)

rastgele yeni bir sinyal tanımlamak için kullanılır. CExpertTrade 'in, istenen giriş fiyatının piyasa emri vermek için mevcut fiyattan çok uzak olup olmadığını tespit etmek için kod içerdiğini ve bir stop veya limit emri verilip verilmeyeceğine otomatik olarak karar vermek için giriş fiyatı seçimini kullandığınıunutmayın.

Bununla birlikte, işlem aralığı son n çubuğun en yüksek (HH) ve en düşük (LL) arasındaki bölge olarak tanımlanırsa, LL < fiyat < HH koşulu her zaman doğrudur. Bu nedenle hem int CExpertSignal::LongCondition(...)hem de int CExpertSignal::ShortCondition(...) her zaman 0 "break out" kalıbını tespit etmelidir ve bu kalıba hangi değeri atarsak atayalım int CExpertSignal::Direction() fonksiyonu her zaman sıfır döndürecektir!

Aşırı yüklemenin doğal yaklaşımı

  1. bool CExpertSignal::CheckOpenLong(...) ve
  2. bool CExpertSignal::CheckOpenShort(...)

öyle ki önceki kontroller

  1. LongCondition()>m_threshold_open ve ikincisi kontrol eder
  2. ShortCondition()>m_threshold_open

yerine

  1. m_direction>=m_threshold_open ve
  2. -m_direction>=m_threshold_open

henüz başarılı bir versiyona dönüştürülemedi. Belirtildiği gibi, bool CExpertSignal::OpenLongParams(...)' ın HH giriş fiyatını döndürmesi ve bool CExpertSignal::OpenShortParams(...)'ın 2 stop emri oluşturarak sinyali tamamlamak için LL giriş fiyatını döndürmesibasit olurdu.

Benim gözümde, bu standart koparma stratejisinin standart kütüphane açısından nasıl uygulanacağını gösteren ve LL ve HH'de limit emirleriyle sonuçlanan alternatif "koparma" modelini sağlayarak yeterince esnek hale getiren bir örneğe sahip olmak arzu edilir. Açıkçası, böyle bir sinyal aşağıdaki stratejileri birleştirecektir

  1. yüksek al ve daha yüksek sat veya düşük sat ve daha düşük al alternatifinin yanı sıra
  2. düşük al ve yüksek sat veya yüksek sat ve düşük al.

bunları kalıplar olarak sağlayarak. Bu yaklaşımı tamamlama konusunda yardımınız için son derece minnettar olacağım.

 
AnonymousTrades:

Herkese merhaba,

Burada ve Standart Kütüphanenin Ticaret Stratejisi Sınıflarını Keşfetme - Harvester tarafındanStratejiyi Özelleştirme'de önerilen yaklaşımı kullanarak gözlemlenen bir ticaret aralığından "çıkma" ve "girme" iki modeliyle CExpertSignal'ın soyundan nasıl oluşturulacağını merak ediyorum. Benim algım, her sinyal sınıfınıniki fonksiyonu aşırı yükleyerek uygulanabileceği (uygulanması gerektiği) yönündedir

int CSignalBreakOutOrIn::LongCondition()  { if(IS_PATTERN_USAGE(X) && LongConditionForPatternX(idx)) return(m_pattern_X); }
int CSignalBreakOutOrIn::ShortCondition() { if(IS_PATTERN_USAGE(X) && ShortConditionForPatternX(idx)) return(m_pattern_X); }

CExpertTrade 'in, istenen giriş fiyatının piyasa emri vermek için mevcut fiyattan çok uzak olup olmadığını tespit etmek için kod içerdiğini ve bir stop veya limit emri verilip verilmeyeceğine otomatik olarak karar vermek için giriş fiyatı seçimini kullandığınıunutmayın.

[...]

Benim gözümde, bu standart break out stratejisinin standart kütüphane açısından nasıl uygulanacağını gösteren ve LL ve HH'de limit emirleriyle sonuçlanan alternatif "break in" modelini sağlayarak yeterince esnek hale getiren bir örneğe sahip olmak arzu edilir. Bu yaklaşımı tamamlama konusunda yardım için son derece minnettar olacağım.


Endişelerimi mümkün olduğunca kolay anlaşılır kılmak için yeniden ifade etmeye karar verdim. Benim gözümde bu iki makale

  1. MQL5 Sihirbazı: Alım Satım Sinyalleri Modülü Nasıl Oluşturulur (bu) ve
  2. Standart Kütüphanenin Ticaret Stratejisi Sınıflarını Keşfetme - Harvester Trading ileStratejileri Özelleştirme

genel olarak kendi sinyal sınıflarımızı en basit şekilde nasıl yazacağımızı gösterir. Bu algımı aşağıda özetleyeceğim.

Bununla birlikte, fiyat son n dönemde gözlemlenen en yüksek / en düşük fiyattan daha yüksek / daha düşük olduğunda alım / satım önermek için bu yaklaşımı kullanan bir sinyalin uygulanmasını bitirmek için hala bir fikre ihtiyacım var. Bunun, mevcut fiyatın üstünde ve altında bir çift durdurma emri verilmesiyle sonuçlanması gerekiyor. Bunu zaten koşulu değiştirerek başarmaya çalıştım

  • Direction()>=m_threshold_open by
  • LongCondition()>=m_threshold_open, örneğin,

ama hala çalışmıyor gibi görünüyor. Bu bana hiç mantıklı gelmiyor çünkü OpenLongParams(...) ve OpenShortParams(...) fonksiyonlarını da aşırı yükledim. Bunlar, istenen durdurma emirlerinin yerleştirileceği seviyeleri belirler. MetaQuotes geliştiricilerinin fikirleri hakkında daha fazla bilgi sahibi olan herhangi biri, bu en temel çıkış stratejisini nasıl uygulayacaklarını açıklayabilir mi?

Kaynak kodu genellikle herhangi bir yazılımın en iyi dokümantasyonu olarak görüldüğünden, MQL5\Include\Expert\ExpertSignal.mqh dosyasındaki CExpertSignal sınıfını analiz etmek için biraz zaman harcadım

Elde ettiğim sonuç, işlem koşullarını kontrol eden işlevlerin esasen Direction() { return(LongCondition()-ShortCondition()); } işlevinin değerini aşağıdaki gibi test etmeye indirgenmesiydi:

bool CExpertSignal::CheckOpenLong(...)     { if(Direction()>=m_threshold_open && OpenLongParams(price,sl,tp,expiration)) return(true); return(false); }
bool CExpertSignal::CheckOpenShort(...)    { if(-Direction()>=m_threshold_open && OpenShortParams(price,sl,tp,expiration)) return(true); return(false); }
bool CExpertSignal::CheckCloseLong(...)    { if(-Direction()>=m_threshold_close && CloseLongParams(price,sl,tp,expiration)) return(true); return(false); }
bool CExpertSignal::CheckCloseShort(...)   { if(Direction()>=m_threshold_close && CloseShortParams(price,sl,tp,expiration)) return(true); return(false); }
bool CExpertSignal::CheckReverseLong(...)  { if(!CheckCloseLong(c_price) || !CheckOpenShort(price,sl,tp,expiration)) return(false); return(true); }
bool CExpertSignal::CheckReverseShort(...) { if(!CheckCloseShort(c_price) || !CheckOpenLong(price,sl,tp,expiration)) return(false); return(true); }

(İşlevselliğe herhangi bir şekilde katkıda bulunmadan yalnızca kararlı yürütme için gerekli görünen bazı kodları çıkardım).

Bu özet, herhangi bir özelleştirilmiş strateji sınıfı için fonksiyonları aşırı yüklemenin yeterli olması gerektiğini göstermektedir

  1. int CExpertSignal::LongCondition(...),
  2. int CExpertSignal::ShortCondition(...),
  3. bool CExpertSignal::OpenLongParams(...),
  4. bool CExpertSignal::OpenShortParams(...),
  5. bool CExpertSignal::CloseLongParams(...), ve
  6. bool CExpertSignal::CloseShortParams(...)

ve Harvester'ın yukarıda bağlantısı verilen 2. makalesi, IS_PATTERN_USAGE(x) makrosunun ilk ikisinde nasıl kullanılacağını açıklar, böylece ortaya çıkan sinyal önceden tanımlanmış birkaç modeli algılar.

Şu sorunu görüyorum: Fiyatın son n çubuğun en yüksek en yüksek ve en düşük en düşük arasında olup olmadığı koşulu her zaman doğru olmalıdır. Bu nedenle, hem LongCondition (... ) hem de ShortCondition (...), koparma ticareti için modelle ilişkili aynı değeri döndürür ve CheckOpenLong (...) ve CheckOpenShort (...) içindeki koşullar değiştirilmedikçe Direction() değeri zorunlu olarak sıfırdır.

Ancak LongCondition()>=m_threshold_open ve ShortCondition()>=m_threshold_open kullanmak neden yeterli değil?

 
yankai0219:

makaleye eklediğiniz dosyayı kullandığımda, yanlış bir şey var.

Tip ile ilgili yorumun aşağıdaki gibi olması gerektiğini düşünüyorum:

//| Type=SignalAdvanced                                          |

Mesajınız için teşekkür ederim. Mesajınız sorunumu çözdü. Şerefe!

George

 

Merhaba,

Kodu derlediğimde üç uyarı aldım

'm_open' bildirimi üyeyi gizler samplesignal.mqh 42 23

'm_close' bildirimi üyeyi gizler samplesignal.mqh 43 23

'm_expiration' bildirimi üyeyi gizler samplesignal.mqh 52 23


m_open ve m_close ExpertBase.mqh dosyasında tanımlanmıştır ancak farklı tiptedir.

m_expiratin ExpertSignal.mqh içinde tanımlanmıştır.

Yukarıdaki üç satırı yorumlayın. Uyarılar gitti.

George

 
Bu programın tam, eksiksiz ve çalıştırılabilir kodunu yeniden yazmak ve hatalarını düzeltmek ve buraya koymak mümkünse
 
touhid Qolizadeh #:
Bu programın tam, eksiksiz ve çalıştırılabilir kodunu yeniden yazmak ve hatalarını düzeltmek ve buraya koymak mümkünse

Al bakalım!

Şerefe, Zarik

Dosyalar: