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

 
Denis Kirichenko #:

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

Doggy'nin herhangi bir işlemin sembolü anlamına geldiği @= biçimindeki tüm işleçler her zaman sağ işlenen üzerinden yürütülür ve işlem yürütülmeden önce tam olarak sayılır. Bu konu Bölüm 2'de Değişiklik İşlemleri başlığı altında ele alınmıştır.

Marj hesaplama dosyası altıncı bölümde açıklanmaktadır ve burada önceki bölümlerin öğrenildiği varsayılmaktadır. Kitabın sonuna doğru karmaşıklık artıyor - buna itirazım yok, bu nedenle geçmiş bölümlerdeki büyük kavram ve ilkelere, bunların yapı taşları olarak kullanıldığı (hafızanızı tazelemek için) sonraki bölümlerden referanslar yapmaya çalıştım, ancak böyle küçük şeyler için değil.

 
Stanislav Korotky #:

...Kitabın sonuna doğru karmaşıklık artıyor - buna itirazım yok, bu nedenle geçmiş bölümlerdeki büyük kavramlar ve ilkeler için, yapı taşı olarak kullanıldığı sonraki bölümlerden referanslar yapmaya çalıştım (hafızamı tazelemek için), ancak böyle küçük şeyler için değil.

Stanislav, seninkinden farklı olarak programlama konusunda daha mütevazı bir seviyeye sahibim. Hata ayıklayıcıda kontrol etmenin daha kolay olması için kod yazmaya çalışıyorum. Bu yüzden üçlü operatörü sık kullanmıyorum. Kullanırsam da parantezlerle birlikte kullanırım... Birbirine dahil olan birkaç üçlü operatör yazan çok becerikli insanlar var. Bu, meslektaşım fxsaber'in makro programlama tarzına yakın bir şey. Muhtemelen her yaklaşımın bir yaşam hakkı vardır. Ve bu zaten bir zevk meselesi...

Öğretici için büyük saygı ve saygı! Bazı ilginç şeyler Dokümantasyondan daha ayrıntılı olarak açıklanmıştır.

 
Aleksandr Slavskii #:

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

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

Lütfen kontrol için komut dosyasını ekleyin. Şimdi tüm piyasaya genel bakış üzerinde çalıştırdım - hacimden bağımsız olarak standart işlevle çakışıyor.

 
Denis Kirichenko #:

Ve derleyici çok kızdı:

Muhtemelen derleyicide bir şeyler değişmiştir. Kitabın yayınlandığı tarihte, tanıtım amaçlı kasıtlı düzensizliklerin olduğu durumlar dışında, tüm kaynaklar uyarı veya hata olmadan derleniyordu.

 
Denis Kirichenko #:

Hata ayıklayıcıda kontrol etmenin daha kolay olacağı şekilde kod yazmaya çalışıyorum. Bu yüzden üçlü operatörü sık kullanmıyorum. Ve eğer yaparsam, parantez içinde kullanırım....

Ben de aynı fikirdeyim. Ben de basit durumlar dışında bu kurala bağlı kalıyorum - ancak burada herkesin kendi basitlik bariyeri var. Kodun okunabilirliği ayrı ayrı ele alınır, genellikle "hepsi bir satırda" ve "her belirteç ayrı bir satırda" yaklaşımı arasında bir "altın ortalama" ararız. Parantezlerle - benzer şekilde. Yazılım şirketleri genellikle kaynak kod düzeni konusunda bir dizi kurala sahiptir - bu durumda böyle bir kural yoktur.

 
Ekonomik takvim okuma ve CSV'ye aktarma için daha fazla hata düzeltmesi ve iyileştirme kod tabanında yayınlandı. Özellikle, sıralama algoritması çoğunlukla sıralanmış büyük diziler (genellikle MQL5 takvim API'sinden alınan) için düzeltildi, böylece yavaşlamalar ve yığın taşmaları ortadan kaldırıldı.
Economic Calendar CSV
Economic Calendar CSV
  • www.mql5.com
This script saves a predefined set of economic events from the MetaTrader's built-in economic calendar into CSV file.
 
Stanislav Korotky #:

Lütfen doğrulama için komut dosyasını ekleyin. Şimdi bunu tüm piyasa genel görünümü üzerinde çalıştırdım - hacimden bağımsız olarak standart işlevle çakışıyor.

Oh, adamım. Bu mesajı görmediğime inanamıyorum. Oh, adamım.

Aslında, benim için değişen bir şey yok.

Metaquot sunucusu, terminal sürümü 4420.

Kod şu şekilde

#include "MarginProfitMeter.mqh"
//+------------------------------------------------------------------+
int OnInit(void)
  {
   EventSetTimer(1);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnTimer()
  {
   double margin = 0;
   double volume = 10;
   ENUM_ORDER_TYPE type = ORDER_TYPE_BUY;
   double price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   if(_OrderCalcMargin(type, _Symbol, volume, price, margin))
      Print("Symbol ", _Symbol, "; volume ", volume, "; MarginProfitMeter margin = ", margin);

   margin = 0;
   if(OrderCalcMargin(type, _Symbol, volume, price, margin))
      Print("Symbol ", _Symbol, "; volume ", volume, "; OrderCalcMargin margin = ", margin);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   EventKillTimer();
  }
//+------------------------------------------------------------------+

Sonuç şu.

18:53:40.877    11 (EURUSD,H1)  Symbol EURUSD; volume 10.0; MarginProfitMeter margin = 10421.6
18:53:40.877    11 (EURUSD,H1)  Symbol EURUSD; volume 10.0; OrderCalcMargin margin = 23264.8

Birisi yanlış sayıyor.


MPM ad alanından yanlışlıkla kurtulmuş olabilirim. Ne olduğunu ve neden gerekli olduğunu bilmiyorum, ancak EA'yı derlememe izin vermedi.

Aslında, sadece namespace MPM satırını kaldırdım , ondan sonra küme parantezleri ve OrderCalcMargin' i yeniden adlandırdım , alt çizgiyi ekledim.

Genel olarak dosya bu şekilde derlendi. Hatanın bu olması mümkün mü?

//+------------------------------------------------------------------+
//|MarginProfitMeter.mqh |
//|Telif Hakkı (c) 2018-2022, Marketeer |
//| https://www.mql5.com/en/users/marketeer |
//|| Marj, potansiyel kar/zarar, ||| hesaplamak için bir dizi fonksiyon
//| puan değeri ve kaplama oranları.|
//+------------------------------------------------------------------+
// Göstergelerde izin verilmeyen yerleşik OrderCalcMargin'in analogu
bool _OrderCalcMargin(const ENUM_ORDER_TYPE action, const string symbol,
                     double volume, double price, double &margin)
  {
   double marginInit, marginMain;
   MqlTick ticks;

// verilen parametreleri kontrol et
   if((action != ORDER_TYPE_BUY && action != ORDER_TYPE_SELL) || volume < 0 || price < 0)
      return false;

// formüllerde kullanılan tüm özellikleri isteyin
   if(!SymbolInfoTick(symbol, ticks))
      return false;
   if(!SymbolInfoMarginRate(symbol, action, marginInit, marginMain))
      return false;
   const double contract = SymbolInfoDouble(symbol, SYMBOL_TRADE_CONTRACT_SIZE);
   long leverage = AccountInfoInteger(ACCOUNT_LEVERAGE);
   if(volume == 0)
      volume = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN);
   if(price == 0)
      price = action == ORDER_TYPE_BUY ? ticks.ask : ticks.bid;

   if(margin == DBL_MAX)
      marginInit = marginMain;
   margin = 0;

   const ENUM_SYMBOL_CALC_MODE m = (ENUM_SYMBOL_CALC_MODE)SymbolInfoInteger(symbol, SYMBOL_TRADE_CALC_MODE);

   switch(m)
     {
      case SYMBOL_CALC_MODE_FOREX_NO_LEVERAGE:
         leverage = 1;

      case SYMBOL_CALC_MODE_FOREX:
         margin = volume * contract / leverage * marginInit;
         break;

      case SYMBOL_CALC_MODE_CFD:
         margin = volume * contract * price * marginInit;
         break;

      case SYMBOL_CALC_MODE_CFDINDEX:
         margin = volume * contract * price * SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE)
                  / SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_SIZE) * marginInit;
         break;

      case SYMBOL_CALC_MODE_CFDLEVERAGE:
         margin = volume * contract * price / leverage * marginInit;
         break;

      case SYMBOL_CALC_MODE_EXCH_STOCKS:
      case SYMBOL_CALC_MODE_EXCH_STOCKS_MOEX:
         if(price == 0)
            price = ticks.last;
         margin = volume * contract * price * marginInit;
         break;

      case SYMBOL_CALC_MODE_FUTURES:
      case SYMBOL_CALC_MODE_EXCH_FUTURES:
      case SYMBOL_CALC_MODE_EXCH_FUTURES_FORTS:
         margin = volume * SymbolInfoDouble(symbol, SYMBOL_MARGIN_INITIAL) * marginInit;
         break;
      default:
         PrintFormat("Unsupported symbol %s trade mode: %s", symbol, EnumToString(m));
     }

   string account = AccountInfoString(ACCOUNT_CURRENCY);
   string current = SymbolInfoString(symbol, SYMBOL_CURRENCY_MARGIN);
   if(current != account)
     {
      if(!_Convert(current, account, action == ORDER_TYPE_SELL, margin))
         return false;
     }

   return true;
  }

// 'cari' ve 'hesap' para birimlerinin tek bir yapısı için mevcut sembolleri arayın
int _FindExchangeRate(const string current, const string account, string &result)
  {
   for(int i = 0; i < SymbolsTotal(true); i++)
     {
      const string symbol = SymbolName(i, true);
      const ENUM_SYMBOL_CALC_MODE m = (ENUM_SYMBOL_CALC_MODE)SymbolInfoInteger(symbol, SYMBOL_TRADE_CALC_MODE);
      if(m == SYMBOL_CALC_MODE_FOREX || m == SYMBOL_CALC_MODE_FOREX_NO_LEVERAGE)
        {
         string base = SymbolInfoString(symbol, SYMBOL_CURRENCY_BASE);
         string profit = SymbolInfoString(symbol, SYMBOL_CURRENCY_PROFIT);
         if(base == current && profit == account)
           {
            result = symbol;
            return +1;
           }
         else
            if(base == account && profit == current)
              {
               result = symbol;
               return -1;
              }
        }
     }
   return 0;
  }

// Geçmişte belirli bir anda belirli bir sembolün oranını tahmin edin
double GetHistoricPrice(const string symbol, const datetime moment, const bool ask)
  {
   const int offset = iBarShift(symbol, _Period, moment);
// NB: iClose, borsa sembolleri için Teklif yerine Son fiyatı tutabilir
// bunu halletmenin hızlı bir yolu yok, sadece tik geçmişi analizi
   return iClose(symbol, _Period, offset) +
          (ask ? iSpread(symbol, _Period, offset) * SymbolInfoDouble(symbol, SYMBOL_POINT) : 0);
  }

// _Convert amount of 'current' money into 'account' money
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;
  }

// Belirli bir sembolün puan değerini (hesap para birimi cinsinden) döndürür
double PointValue(const string symbol, const bool ask = false, const datetime moment = 0)
  {
   const double point = SymbolInfoDouble(symbol, SYMBOL_POINT);
   const double contract = SymbolInfoDouble(symbol, SYMBOL_TRADE_CONTRACT_SIZE);
   const ENUM_SYMBOL_CALC_MODE m = (ENUM_SYMBOL_CALC_MODE)SymbolInfoInteger(symbol, SYMBOL_TRADE_CALC_MODE);
   double result = 0;

   switch(m)
     {
      case SYMBOL_CALC_MODE_FOREX_NO_LEVERAGE:
      case SYMBOL_CALC_MODE_FOREX:
      case SYMBOL_CALC_MODE_CFD:
      case SYMBOL_CALC_MODE_CFDINDEX:
      case SYMBOL_CALC_MODE_CFDLEVERAGE:
      case SYMBOL_CALC_MODE_EXCH_STOCKS:
      case SYMBOL_CALC_MODE_EXCH_STOCKS_MOEX:
         result = point * contract;
         break;

      case SYMBOL_CALC_MODE_FUTURES:
      case SYMBOL_CALC_MODE_EXCH_FUTURES:
      case SYMBOL_CALC_MODE_EXCH_FUTURES_FORTS:
         result = point * SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE) / SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_SIZE);
         break;
      default:
         PrintFormat("Unsupported symbol %s trade mode: %s", symbol, EnumToString(m));
     }

   string account = AccountInfoString(ACCOUNT_CURRENCY);
   string current = SymbolInfoString(symbol, SYMBOL_CURRENCY_PROFIT);

   if(current != account)
     {
      if(!_Convert(current, account, ask, result, moment))
         return 0;
     }

   return result;
  }
//+------------------------------------------------------------------+
 
Aleksandr Slavskii #:

Kod aşağıdaki gibidir

Sonuç şu şekildedir

Birileri yanlış sayıyor.


İşte 2024'ün başındaki (yani kitabın yazılmasından sonra) 4150 - https://www.metatrader5.com/en/releasenotes/terminal/2342 yapısıyla ilgili haberlerde bulundu.

Hacme Göre Değişken Marj

Sunucu ayarlarına ve sembol spesifikasyon arayüzüne marjın hacme bağımlılığını eklemişler.

Bu özelliklere MQL5'ten nasıl ulaşılacağını bulamadım.

Belirli bir broker / enstrümanda bu değişken marj ayarı etkinleştirilmemiş olabilir, bu yüzden MQ demosunda kontrol ederken herhangi bir fark görmedim.

MetaTrader 5 build 4150: Trading report export and new machine learning methods in MQL5
MetaTrader 5 build 4150: Trading report export and new machine learning methods in MQL5
  • 2024.01.18
  • MetaQuotes
  • www.metatrader5.com
Added export of trading reports to HTML and PDF files. With this option, you can easily share your trading achievements with colleagues and investors. New export commands are available in the File menu and in the report menu. Added ability to save the current state of the Market Watch window to a CSV file. To do this, select Export in the...
 
Stanislav Korotky #:

Sunucu ayarlarına ve sembol spesifikasyon arayüzüne hacim marjı bağımlılığı eklendi.

MQL5'ten bu özelliklere nasıl ulaşacağımı bulamadım.

Ben de aradım ve bulamadım)
Kafamda bir hata olduğunu düşünmüştüm ama öyle olmadığı ortaya çıktı.
Teşekkürler.
 

Renat Fatkhullin

Bu özellikleri MQL5'ten alma yeteneği eklemek için herhangi bir plan var mı?

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi üzerine forum

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

Stanislav Korotky, 2024.11.23 20:26

Burada 2024'ün başındaki haberlerde (yani kitap yazıldıktan sonra) 4150 - https://www.metatrader5.com/en/releasenotes/terminal/2342 derlemesi hakkında buldum.

Hacme Göre Değişken Marj

Sunucu ayarlarında ve sembol spesifikasyon arayüzünde hacme marj bağımlılığı eklediler.

Bu özelliklere MQL5'ten nasıl ulaşılacağını bulamadım.

Belirli bir broker / enstrümanda bu değişken marj ayarı etkinleştirilmemiş olabilir, bu yüzden MQ demosunda kontrol ederken herhangi bir fark görmedim.