Uzman Danışmanlar: Yatırımcılar için MQL5 Programlama - Kitaptan kaynak kodları. Bölüm 7

 

Yatırımcılar için MQL5 Programlama - Kitaptan kaynak kodları. Bölüm 7:

Kitabın yedinci ve son bölümü, MetaTrader 5 için program geliştirirken faydalı olacak MQL5 API'sinin gelişmiş yeteneklerini tartışmaktadır. Bunlar arasında özel finansal semboller, yerleşik ekonomik takvim olayları ve ağ, veri tabanları ve kriptografi gibi genel amaçlı teknolojiler bulunmaktadır.

Yatırımcılar için MQL5 Programlama - Kitaptan kaynak kodları. Bölüm 7

Yazar: MetaQuotes

 
İyi öğrenme kaynakları
 
Öğrenmek
 
İşte takvim önbelleği ve filtresi için küçük hata düzeltmeleri ve iyileştirmeler.
MQL5 Book: Advanced language tools / Economic calendar / Transferring calendar database to tester
MQL5 Book: Advanced language tools / Economic calendar / Transferring calendar database to tester
  • www.mql5.com
The calendar is available for MQL programs only online, and therefore testing news trading strategies poses some difficulties. One of the solutions...
Dosyalar:
 

Bunun bir hata mı olduğunu yoksa bir şeyi anlamadığımı söyleyebilir misiniz?

MarginProfitMeter.mqh dosyası.

// 'Cari' para miktarını 'hesap' parasına dönüştürün
bool Convert(const string current, const string account,
             const bool ask, double &margin, const datetime moment = 0)
  {
   string rate;
   int dir = FindExchangeRate(current, account, rate);
   if(dir == +1)
     {
      margin *= moment == 0 ?
                SymbolInfoDouble(rate, ask ? SYMBOL_BID : SYMBOL_ASK) :
                GetHistoricPrice(rate, moment, ask);
     }
   else
      if(dir == -1)
        {
         margin /= moment == 0 ?
                   SymbolInfoDouble(rate, ask ? SYMBOL_ASK : SYMBOL_BID) :
                   GetHistoricPrice(rate, moment, ask);
        }
      else
        {
         static bool once = false;
         if(!once)
           {
            Print("Can't convert ", current, " -> ", account);
            once = true;
           }
        }
   return true;
  }

Sıfıra bölmek imkansız, değil mi?


Ayrıca, bu yöntem marjı döndürmelidir, ancak fiyatı döndürür. Bir yerde bu fiyatın sözleşme büyüklüğü ile çarpılması gerektiğini anlıyorum, ancak bunu nerede doğru yapacağımı anlamıyorum.

Bu fonksiyona mı eklemeliyim yoksa bu fonksiyonu nereden çağırmalıyız?

 
Aleksandr Slavskii #:

Bunun bir hata mı olduğunu yoksa bir şeyi mi kaçırdığımı söyleyebilir misiniz?

Dosya MarginProfitMeter.mqh

Sıfıra bölmek imkansızdır, değil mi?

Aslında, yapamazsınız.

margin /= moment == 0 ?
                   SymbolInfoDouble(rate, ask ? SYMBOL_ASK : SYMBOL_BID) :
                   GetHistoricPrice(rate, moment, ask);

Bölme sembolünden sonra "/=" ataması ile üçlü bir operatör vardır. Yani eğer momet==0 ise, o zaman:

margin /= SymbolInfoDouble(rate, ask ? SYMBOL_ASK : SYMBOL_BID)

aksi halde:

margin /= GetHistoricPrice(rate, moment, ask)

Ancak yine de her iki fonksiyondan da sıfır için bir kontrol eklerdim....


Ayrıca, bu yöntem marj döndürmelidir, ancak fiyat döndürür. Bir yerde bu fiyatın sözleşme büyüklüğü ile çarpılması gerektiğini anlıyorum, ancak bunu nerede daha doğru yapacağımı anlamıyorum....

Açıklamaya göre değerlendirirsek

// 'Cari' para miktarını 'hesap' parasına dönüştürün

yöntem mevcut parayı (para birimini) mevduatın parasına (para birimine) dönüştürür. Ve koda bakılırsa, yöntem marjı mevduat para birimine dönüştürür.

Başarılı olursa, yöntem true değerini döndürür. Ayrıca yeni, düzeltilmiş marj miktarını hesaplar ve marj değişkeninde saklar. Bu, bağlantıdaki bir parametredir:

double &margin

Böylece hesaplamanın bir sonucu olarak alabilirsiniz.

 
Denis Kirichenko #:

Gerçekten yapamazsın.

Bölme sembolünden sonra "/=" ataması ile üçlü bir operatör vardır. Eğer momet==0 ise, o zaman:

Evet. Doğru, üçlü operatör. Bu sabah yorgunum, aptallaşıyorum.


Denis Kirichenko #:

Açıklamaya bakılırsa

yöntem mevcut parayı (para birimi) mevduat parasına (para birimi) dönüştürür. Ve koda bakılırsa, yöntem marjı para yatırma para birimine dönüştürüyor.

Hayır, şimdi bu da doğru.


Özür dilerim, kodda küçük bir hata yapmışım.


Zaten çok az faydası var, çünkü sonuçta hacim üçten fazlaysa marjı hala yanlış sayıyor.

EURUSD; margin = 24668.8  //  OrderCalcMargin()
EURUSD; margin = 10889.599999999999 // MarginProfitMeter.mqh 

On sözleşme için marj hesaplaması.

 
Denis Kirichenko #:
marj /= moment == 0? SymbolInfoDouble(rate, ask ? SYMBOL_ASK: SYMBOL_BID): GetHistoricPrice(rate, moment, ask);

Biraz yanlış.(margin /= moment)==0 koşulu ve ardından üçlü operatör...

 
Alexey Viktorov #:

Biraz yanlış. (marj /= moment)==0 koşulu ve ardından üçlü bir operatör...

Nedense katılmıyorum. Önce bu koşulu yerine getirmeye çalışın:

double margin = 1.5;
datetime moment = 0;
margin /= moment;

O zaman kirpileri kirpilere bölmüş olursunuz ki bu da kendi içinde tartışmalıdır.

Ve atama işlemleri çok düşük bir önceliğe sahiptir, sadece zpt daha düşük bir önceliğe sahiptir.

Derleyici de sinirleniyor:

possible loss of data due to type conversion from 'datetime' to 'double'

Ve fonksiyonun mantığı marj dönüşümüdür. Anladığım kadarıyla, moment = 0 şimdi. Sonra:

margin /= moment == 0 ?
                SymbolInfoDouble(rate, ask ? SYMBOL_ASK : SYMBOL_BID) :
                GetHistoricPrice(rate, moment, ask);

şimdi ise, mevcut fiyatı soruyoruz anlamına geliyor. Ve eğer geçmişte ise, geçmiş fiyatlara başvuruyoruz. Ve istenen fiyatı elde ettikten sonra, en sonunda marj değerini atama ile bu fiyata böleriz.... ve sizin mantığınızla, moment = 0 olduğunda, marj dönüşümünü değil, sadece piyasa fiyatını veya geçmişteki fiyatı alacağımız ortaya çıkıyor....


Genel olarak, bir ders kitabı için parantez içinde yazmak daha iyi olacaktır:

margin /= (moment == 0) ?
                   SymbolInfoDouble(rate, ask ? SYMBOL_ASK : SYMBOL_BID) :
                   GetHistoricPrice(rate, moment, ask);
 
Denis Kirichenko #:

Nedense katılmıyorum. Önce bu koşulu yerine getirmeye çalışın:

Bu da kirpileri kirpilere ayırır ki bu da zaten başlı başına tartışmalıdır.

Ve atama işlemleri çok düşük bir önceliğe sahiptir, sadece zpt daha düşük bir önceliğe sahiptir.

Ve derleyici de sinirleniyor:

Ve fonksiyonun mantığı marj dönüşümüdür. Anladığım kadarıyla, moment = 0 şimdi. O zaman:

şu anlama gelir: eğer şimdi ise, mevcut fiyatı sorarız. Ve eğer geçmişte ise, o zaman geçmiş fiyatlara başvururuz. Ve istenen fiyatı elde ettikten sonra, en sonunda marj değerini atama ile bu fiyata böleriz.... ve sizin mantığınızla, moment = 0 ise, bir marj dönüşümü değil, sadece bir piyasa fiyatı veya geçmişten bir fiyat alacağımız ortaya çıkıyor...


Genel olarak, bir ders kitabı için parantez içinde yazmak daha iyi olacaktır:

İkna edici. Katılıyorum, dikkatsiz davrandım. Ancak bir ders kitabı için yazıyorsanız ve benim için bile anlaşılabilir olacaksa, o zaman şöyle daha iyi olurdu

margin /= ( moment == 0 ?
                   SymbolInfoDouble(rate, ask ? SYMBOL_ASK : SYMBOL_BID) :
                   GetHistoricPrice(rate, moment, ask));