English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
Uzman Danışmanda Para Yönetimi için fonksiyonlar

Uzman Danışmanda Para Yönetimi için fonksiyonlar

MetaTrader 5Ticaret | 9 Aralık 2021, 10:50
68 0
MetaQuotes
MetaQuotes

Giriş

MQL5 dili, mql5 programının mevcut terminal koşulları ve ayrıca finansal enstrüman ve alım satım hesabı hakkında çok miktarda bilgi edinme fırsatı sunar. Sermaye yönetiminin fonksiyonlarını organize etmek için listelenen son iki bölümdeki özellikleri incelememiz ve aşağıdaki işlevler hakkında bilgi edinmemiz gerekecek:

Bu makalede, Uzman Danışmanlardaki fonksiyonların kullanımına odaklanılmasına rağmen, bu açıklamaların tümü göstergelere ve komut dosyalarına uygulanabilir.

Hesap bakiyeniz hakkında bilgi edinme

Bir alım satım hesabının ilk iki önemli özelliği - bakiye ve hisse senedi. Bu değerleri elde etmek için AccountInfoDouble() fonksiyonunu kullanın:

   double balance=AccountInfoDouble(ACCOUNT_BALANCE);
   double equity=AccountInfoDouble(ACCOUNT_EQUITY);

Bizi ilgilendiren bir sonraki şey, açık pozisyonlar için mevduat fonlarının büyüklüğü ve tüm açık pozisyonlar için hesaptaki toplam dalgalı kar veya zarardır.

   double margin=AccountInfoDouble(ACCOUNT_MARGIN);
   double float_profit=AccountInfoDouble(ACCOUNT_PROFIT);

Yeni pozisyonlar açabilmek veya mevcut pozisyonları güçlendirebilmek için mevduata katılmayan serbest kaynaklara ihtiyacımız var.

   double free_margin=AccountInfoDouble(ACCOUNT_FREEMARGIN);

Burada, yukarıdaki değerlerin parasal olarak ifade edildiğine dikkat edilmelidir.

AccountInfoDouble() fonksiyonu tarafından döndürülen parasal değerler, mevduat para birimi cinsinden ifade edilir. Yatırılan para birimini bulmak için AccountInfoString() fonksiyonunu kullanın.

string account_currency=AccountInfoString(ACCOUNT_CURRENCY);

Kişisel fonların seviyesi

Hesabın başka bir önemli özelliği daha vardır - Durdurma olayının gerçekleştiği seviye (açık pozisyonları sürdürmek için gerekli kişisel fon eksikliğinden dolayı pozisyonların zorunlu olarak kapatılması). Bu değeri elde etmek için AccountInfoDouble() fonksiyonunu yeniden kullanın:

double stopout_level=AccountInfoDouble(ACCOUNT_MARGIN_SO_SO);

Fonksiyon yalnızca değerin kendisini verir ancak bu değerin ne tür birimlerle ifade edildiğini açıklamaz. Durdurma için iki seviye belirleme modu vardır: yüzde ve para birimi cinsinden. Bunu bulmak için AccountInfoInteger() fonksiyonunu kullanın:  

//--- Get account currency
string account_currency=AccountInfoString(ACCOUNT_CURRENCY);

//--- Stop Out level
   double stopout_level=AccountInfoDouble(ACCOUNT_MARGIN_SO_SO);

//--- Stop Out mode
   ENUM_ACCOUNT_STOPOUT_MODE so_mode=(ENUM_ACCOUNT_STOPOUT_MODE)AccountInfoInteger(ACCOUNT_MARGIN_SO_MODE);
   if(so_mode==ACCOUNT_STOPOUT_MODE_PERCENT)

      PrintFormat("Stop Out level in percents %.2f%%",stopout_level);
   else
      PrintFormat("Stop Out level in currency %.2f %s",stopout_level,account_currency);


Hesapla ilgili ek bilgiler

Genellikle hesaplamalarda, alım satım hesabı kaldıracında sağlanan büyüklüğün bilinmesi gerekir. Bu bilgileri AccountInfoInteger() fonksiyonunu kullanarak elde edebilirsiniz:

   int leverage=(int)AccountInfoInteger(ACCOUNT_LEVERAGE);
Düzenlenmemiş Uzman Danışmanın yanlışlıkla gerçek bir hesapta çalıştırmamak için hesabın türünü bilmeniz gerekir. 
   ENUM_ACCOUNT_TRADE_MODE mode=(ENUM_ACCOUNT_TRADE_MODE)AccountInfoInteger(ACCOUNT_TRADE_MODE);
   switch(mode)
     {
      case ACCOUNT_TRADE_MODE_DEMO:    Comment("Account demo");               break;
      case ACCOUNT_TRADE_MODE_CONTEST: Comment(com,"Account Contest");        break;
      case ACCOUNT_TRADE_MODE_REAL:    Comment(com,"Account Real");           break;
      default:                         Comment(com,"Account unknown type");
     }
Her hesapta alım satım yapılamaz, örneğin yarışma hesaplarında alım satım işlemleri ancak yarışma başladıktan sonra yapılabilir. Bu bilgi ayrıca AccountInfoInteger() fonksiyonu tarafından da elde edilebilir:
   bool trade_allowed=(bool)AccountInfoInteger(ACCOUNT_TRADE_ALLOWED);
   if(trade_allowed)
      Print("Trade is allowed");
   else
      Print(com,"Trade is not allowed");

Bu hesapta işlem yapılmasına izin verilse bile bu, Uzman Danışmanın işlem yapma hakkına sahip olduğu anlamına gelmez. Uzman Danışmanın işlem yapmasına izin verilip verilmediğini kontrol etmek için şunu yazın:

   if(trade_allowed)
     {
      bool trade_expert=(bool)AccountInfoInteger(ACCOUNT_TRADE_EXPERT);
      if(trade_expert)
         Print("Experts are allowed to trade");

      else
         Print("Experts are not allowed to trade");

Bu örnekler ekteki Uzman Danışman Account_Info.mq5 dosyasında bulunabilir. Herhangi bir karmaşıklıktaki MQL5 programlarında kullanılabilirler.


Enstrüman hakkında bilgiler

Her finansal enstrümanın kendi tanımları vardır ve bu enstrümanın karakterize ettiği bir yola yerleştirilir. Terminalde EURUSD özellikleri penceresini açarsak, şöyle bir şey göreceğiz:

Bu durumda EURUSD için açıklama - "EURUSD, Euro / ABD Doları" şeklindedir. Bu bilgiyi elde etmek için SymbolInfoString() fonksiyonunu kullanırız:

   string symbol=SymbolInfoString(_Symbol,SYMBOL_DESCRIPTION);
   Print("Symbol: "+symbol);

   string symbol_path=SymbolInfoString(_Symbol,SYMBOL_PATH);
   Print("Path: "+symbol_path);

Standart bir sözleşmenin boyutunu öğrenmek için SymbolInfoDouble()'ı kullanın:

   double lot_size=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);
   Print("Standard contract: "+DoubleToString(lot_size,2));

Bu, bir para birimini satarken diğerini satın almak için FOREX enstrümanlarının bir özelliğidir. Sözleşme, satın alma işlemini gerçekleştirmek için gerekli olan para biriminde belirtilir. Bu bir temel para birimidir ve SymbolInfoString() fonksiyonu kullanılarak elde edilebilir:

   string base_currency=SymbolInfoString(_Symbol,SYMBOL_CURRENCY_BASE);
   Print("Base currency: "+base_currency);

Enstrümandaki fiyat değişiklikleri, satın alınan varlıkların fiyatında bir değişikliğe ve dolayısıyla açık bir pozisyon için kâr varyasyonuna yol açar (pozisyon zarar ediyorsa kâr negatif olabilir). Böylece fiyat değişikliği, gelirde belirli bir para biriminde ifade edilen değişikliklere yol açar. Bu para birimine karşıt para birimi denir. EURUSD para birimi çifti için temel para birimi genellikle Euro'dur ve karşıt para birimi ABD dolarıdır. Karşıt para birimini elde etmek için SymbolInfoString() fonksiyonunu da kullanabilirsiniz:

   string profit_currency=SymbolInfoString(_Symbol,SYMBOL_CURRENCY_PROFIT);

   Print("Currency quotes: "+profit_currency);

Enstrümanda bir pozisyon açmak için fonlara ihtiyacınız var ve bu fonlar da belirli bir para biriminde ifade ediliyor. Bu para birimine para birimi marjı veya mevduat denir. FOREX enstrümanları için marj ve temel para birimleri genellikle aynıdır. Yatırılan para biriminin değerini elde etmek için SymbolInfoString() fonksiyonunu kullanın:

   string margin_currency=SymbolInfoString(_Symbol,SYMBOL_CURRENCY_MARGIN);
   Print("Currency deposit: "+margin_currency);

Tanımlanan tüm fonksiyonlar Uzman Danışmanın Symbol_Info.mq5 kodunda verilmiştir. Aşağıdaki şekil, Comment() fonksiyonunu kullanarak EURUSD sembolündeki bilgilerin çıktısını göstermektedir.


Mevduat boyutunun hesaplanması

Yatırımcıların en çok ihtiyaç duyduğu finansal enstrümanlar hakkında bilgi, üzerinde bir pozisyon açmak için gereken fonların büyüklüğüdür. Belirli sayıda lotu almak veya satmak için ne kadar para gerektiğini bilmeden, sermaye yönetimi için Uzman Danışmanın sistemini uygulayamayız. Ayrıca hesap bakiyesini kontrol etmek de zorlaşır.

Daha ayrıntılı incelemeyi anlamakta zorluk çekiyorsanız, Forex Trading ABC makalesini okumanızı tavsiye ederim. Oradaki açıklamalar bu makale için de geçerlidir.

Para birimi mevduatındaki marjın boyutunu hesaplamamız gerekiyor, yani elde edilen değeri verilen hesap kaldıraç miktarına bölerek mevduatı ipotek para biriminden mevduat para birimine göre yeniden hesaplamamız gerekiyor. Bunu yapmak için GetMarginForOpening() fonksiyonunu yazıyoruz:
//+------------------------------------------------------------------+
//|  Return amount of equity needed to open position                 |
//+------------------------------------------------------------------+
double GetMarginForOpening(double lot,string symbol,ENUM_POSITION_TYPE direction)
  {
   double answer=0;
//--- 
    ...
//--- Return result - amount of equity in account currency, required to open position in specified volume
   return(answer);
  }

Burada:

  • lot - açık pozisyonun hacmi;
  • sembol - finansal enstrümanın ismi;
  • iddia edilen pozisyon yönü.
Böylece marjın boyutunu hesaplamak için aşağıdaki bilgilere sahibiz (açık pozisyonun ipoteği için para fonları):
  • mevduat para birimi
  • ipotek para birimi
  • Para birimi fiyatları (Çapraz Para Birimi çiftleri için gerekli olabilir)
  • sözleşme büyüklüğü

Bunu MQL5 dilinde yazın:

//--- Get contract size
   double lot_size=SymbolInfoDouble(symbol,SYMBOL_TRADE_CONTRACT_SIZE);

//--- Get account currency
   string account_currency=AccountInfoString(ACCOUNT_CURRENCY);

//--- Margin currency
   string margin_currency=SymbolInfoString(_Symbol,SYMBOL_CURRENCY_MARGIN);

//--- Profit currency
   string profit_currency=SymbolInfoString(_Symbol,SYMBOL_CURRENCY_PROFIT);

//--- Calculation currency
   string calc_currency="";
//--- Reverse quote - true, Direct quote - false
   bool mode;

Mod değişkeni, mevduat para biriminde sözleşmenin boyutunu nasıl hesaplayacağımızı etkiler. Bunu örneklere dayanarak düşünün, diğer tüm durumlarda mevduat para biriminin ABD doları olduğunu varsayalım.

Para birimi çiftleri genellikle üç kategoriye ayrılır:

  • Doğrudan Para Birimi Çiftleri - belirli bir para birimine göre ABD doları para birimi kuru. Örnekler: USDCHF, USDCAD, USDJPY, USDSEK;
  • Ters Para Birimi Çifti - belirli bir para biriminin ABD dolarına göre para birimi kuru. Örnekler: EURUSD, GBPUSD, AUDUSD, NZDUSD;
  • Çapraz Para Birimi Çiftleri - ABD dolarını içermeyen bir para birimi çifti. Örnekler: AUDCAD, EURJPY, EURCAD. 


1. EURUSD - ters para birimi çifti

Karşıt para biriminin hesap para birimi olduğu para birimi çiftlerini ters para birimi çiftleri olarak adlandıracağız. Örneklerimizde, hesap para birimi ABD doları ile temsil edilmektedir, bu nedenle para birimi çiftlerini sınıflandırmamız genel kabul görmüş sınıflandırma ile örtüşecektir. Ancak alım satım hesabınız farklı bir para birimi kullanıyorsa (USD değil) örtüşmeyecektir. Bu durumda daha ayrıntılı açıklamaları anlamak için hesap para birimini dikkate alın.

EURUSD için sözleşme boyutu - 100.000 Euro. Mevduatın para birimi olan ABD doları cinsinden 100.000 Euro'yu ifade etmemiz gerekiyor. Bunu yapmak için Euro’nun dolar olarak sayılabileceği döviz kurunu bilmeniz gerekir. Konsept hesaplama para birimini, yani ipotek para birimini mevduat para birimine dönüştürmek için gereken para birimini devreye alıyoruz.

//--- Calculation currency
   string calc_currency="";

Neyse ki EURUSD para birimi çifti, Euro'nun dolar karşısındaki döviz kurunu gösterir ve bu nedenle, bu durumda ipotek boyutunu hesaplamanız gereken EURUSD sembolü tam olarak döviz kurudur:

//--- If profit currency and account currency are equal
   if(profit_currency==account_currency)
     {
      calc_currency=symbol;
      mode=true;
     }

Mod değerini doğru olarak belirledik, yani Euro'yu dolara aktarmak için (ipotek para birimi mevduat para birimine dönüştürülebilir), mevcut EURUSD döviz kurunu sözleşmenin boyutuyla çarpacağız. Mod = false ise sözleşme boyutunu, hesaplama para biriminin döviz kuruna böleriz. Enstrümandaki güncel fiyatları almak için SymbolInfoTick() fonksiyonunu kullanın.

//--- We know calculation currency, let's get its last prices
   MqlTick tick;
   SymbolInfoTick(calc_currency,tick);

Bu fonksiyon, güncel fiyatı ve fiyatların son güncelleme zamanını MqlTick türü değişkene koyar - bu yapı özellikle bu amaç için tasarlanmıştır. 

Bu nedenle, bu sembol üzerindeki en son fiyatı elde etmek, sözleşmenin boyutu ve ardından lot sayısı ile çarpmanız yeterlidir. Ama bu enstrümanın bir alış fiyatı bir de satış fiyatı olduğunu düşünürsek hangi hesaplama fiyatını almalıyız? Mantıksal olarak: eğer satın alıyorsak, hesaplamalar için fiyat Satış fiyatına eşittir ve eğer satıyorsak, Alış fiyatını almamız gerekecektir.

//--- Now we have everything for calculation 
   double calc_price;
//--- Calculate for Buy
   if(direction==POSITION_TYPE_BUY)
     {
      //--- Reverse quote
      if(mode)
        {
         //--- Calculate using Buy price for reverse quote
         calc_price=tick.ask;
         answer=lot*lot_size*calc_price;
        }
     }

//--- calculate for Sell
   if(direction==POSITION_TYPE_SELL)
     {
      //--- Reverse quote
      if(mode)
        {
         //--- Calculate using Sell price for reverse quote

         calc_price=tick.bid;
         answer=lot*lot_size*calc_price;
        }
     }

Bu nedenle örneğimizde EURUSD sembolü için mevduat para birimi Euro'dur, sözleşme boyutu 100.000'dir ve son Satış fiyatı = 1,2500'tir. Hesap para birimi - ABD doları ve hesaplama para birimi aynı EURUSD para birimi çiftidir. 100.000'i 1,2500 ile çarpın ve 125.000 ABD doları elde edin - Satış fiyatı =1,2500 ise 1 EURUSD lot satın almak için standart bir sözleşme tam olarak bu kadardır. 

Karşıt para birimi hesap para birimine eşitse o zaman hesap para biriminin bir lotunun değerini elde etmek için sözleşmenin boyutunu, pozisyonun amaçlanan yönüne bağlı olarak uygun fiyat, Alış veya Satış ile çarptığımız sonucuna varabiliriz.

margin=lots*lot_size*rate/leverage;

2. USDCHF - doğrudan para birimi çifti

USDCHF eşleşmesi için ipotek para birimi ve hesap para birimi - ABD doları. İpotek para birimi ile hesap para biriminin aynı olduğu para birimi çiftlerine doğrudan para birimi çiftleri diyeceğiz. Sözleşme boyutu - 100.000. Bu en basit durumdur, sonucu geri göndermeniz yeterli.

//--- if the base currency symbol and the deposit currency are the same
   if(margin_currency==account_currency)
     {
      calc_currency=symbol;
      //--- Just return the contract value, multiplied by the number of lots
      return(lot*lot_size);
     }

Mevduat para birimi hesap para birimi ile örtüşüyorsa, hesap para birimindeki mevduatın değeri, standart sözleşmenin lot (sözleşme) ile çarpımının kaldıraç büyüklüğüne bölünmesinin sonucuna eşittir.

margin=lots*lot_size/leverage;

3. CADCHF - çapraz para birimi çifti

CADCHF para birimi çifti örnek amaçlı alınmıştır ve mevduat para birimi ile karşıt para biriminin, hesap para birimi ile örtüştüğü diğer herhangi bir başka çift kullanılabilir. Bu para birimi çiftlerine çapraz denir, çünkü üzerlerindeki marjı ve kârı hesaplamak için para birimlerinden birinde bununla kesişen başka bir para birimi çiftinin döviz kurunu bilmemiz gerekir.

Genellikle, çapraz para birimi çiftleri, fiyatlarında ABD doları kullanılmayan çiftlerdir. Ancak tekliflerinde hesap para birimini içermeyen tüm çiftleri çapraz para birimi çiftleri olarak adlandıracağız. Bu nedenle, hesap para birimi Euro cinsinden ise, mevduat para birimi İngiliz sterlini ve para birimi teklifleri ABD doları cinsinden olduğundan GBPUSD çifti, çapraz para birimi çifti olacaktır. Bu durumda marjı hesaplamak için sterlini (GBP) Euro (EUR) olarak ifade etmemiz gerekecek.

Ancak sembolün CADCHF para birimi çifti olduğu bir örneği ele almaya devam edeceğiz. Mevduat para birimi Kanada Doları (CAD) cinsindendir ve ABD doları (USD) ile örtüşmemektedir. Karşıt para birimi İsviçre Frangı cinsindendir ve ayrıca Amerikan doları ile örtüşmez.

Sadece 1 lotta pozisyon açma mevduatının 100.000 Kanada dolarına eşit olduğunu söyleyebiliriz. Görevimiz, mevduatı ABD doları cinsinden hesap para birimine göre yeniden hesaplamaktır. Bunu yapmak için döviz kuru ABD doları ve mevduat para birimi - CAD içeren para birimi çiftini bulmamız gerekiyor. Toplam iki potansiyel seçenek vardır:

  • CADUSD
  • USDCAD

CADCHF için çıktı verilerine sahibiz:

margin_currency=CAD (Canadian dollar)
profit_currency=CHF (Swiss frank)

Terminalde hangi para birimi çiftlerinin bulunduğunu önceden bilmiyoruz ve MQL5 dili açısından her iki seçenek de tercih edilmez. Bu nedenle, verilen para birimi grupları için hesaplamalarda bize ilk eşleşen para birimi çiftini verecek olan GetSymbolByCurrencies() fonksiyonunu yazıyoruz.

//+------------------------------------------------------------------+
//| Return symbol with specified margin currency and profit currency |
//+------------------------------------------------------------------+
string GetSymbolByCurrencies(string margin_currency,string profit_currency)
  {
//--- In loop process all symbols, that are shown in Market Watch window
   for(int s=0;s<SymbolsTotal(true);s++)
     {
      //--- Get symbol name by number in Market Watch window
      string symbolname=SymbolName(s,true);

      //--- Get margin currency
      string m_cur=SymbolInfoString(symbolname,SYMBOL_CURRENCY_MARGIN);

      //--- Get profit currency (profit on price change)
      string p_cur=SymbolInfoString(symbolname,SYMBOL_CURRENCY_PROFIT);

      //--- if If symbol matches both currencies, return symbol name
      if(m_cur==margin_currency && p_cur==profit_currency) return(symbolname);
     }
   return(NULL);
  }

Koddan da anlaşılacağı gibi, "Piyasa Görünümü" penceresinde bulunan tüm sembollerin numaralandırılmasına başlıyoruz (SymbolsTotal() fonksiyonu "true" parametresi ile bize bu miktarı verecektir). "Piyasa Görünümü" listesindeki sayıya göre her sembolün adını almak için true parametresi ile SymbolName() fonksiyonunu kullanıyoruz!  Parametreyi "false" olarak ayarlarsak, işlem sunucusunda sunulan tüm sembolleri numaralandırırız ve bu genellikle terminalde seçilenden çok daha fazladır.

  Daha sonra, para birimi yatırma ve teklifleri elde etmek ve bunları GetSymbolByCurrencies() fonksiyonuna iletilenlerle karşılaştırmak için sembolün adını kullanırız. Başarılı olunması durumunda, sembolün adını döndürürüz ve fonksiyonun çalışması başarıyla ve planlanandan önce tamamlanır. Döngü tamamlandıysa ve fonksiyonun son satırına ulaşırsak, hiçbir şey uymaz ve sembol bulunamaz - NULL döndürün.

Artık GetSymbolByCurrencies() fonksiyonunu kullanarak çapraz para birimi çifti için hesaplama para birimini elde edebileceğimize göre, iki deneme yapacağız: ilk denemede, mevduat para birimi margin_currency olan (mevduat para birimi CADCHF - CAD) ve karşıt para biriminin hesap para birimi (USD) olduğu sembolü arayacağız. Başka bir deyişle, CADUSD çiftine benzer bir şey arıyoruz.

//--- If calculation currency is still not determined
//--- then we have cross currency
   if(calc_currency="")
     {
      calc_currency=GetSymbolByCurrencies(margin_currency,account_currency);
      mode=true;
      //--- If obtained value is equal to NULL, then this symbol is not found
      if(calc_currency==NULL)
        {
         //--- Lets try to do it reverse
         calc_currency=GetSymbolByCurrencies(account_currency,margin_currency);
         mode=false;
        }
     }

Deneme başarısız olursa, başka bir seçenek bulmaya çalışın: mevduat para birimi account_currency (USD) ve karşıt para birimi margin_currency (CADCHF - CAD için mevduat para birimi) olan bir sembol arayın. USDCAD'e benzer bir şey arıyoruz.

Artık para birimi çifti hesaplamalarını bulduğumuza göre, iki seçenekten biri olabilir - doğrudan veya ters. Mod değişkeni, ters para birimi çifti için "true" değerini alır. Doğrudan para birimi çiftimiz varsa, değer "false"a eşittir. "True" değeri için bunu para birimi çiftinin döviz kuru ile çarparız, false değeri için bunu, hesap para birimindeki standart bir sözleşmenin mevduat değerine böleriz.

Bulunan hesaplama para birimi için hesap para birimi cinsinden mevduat boyutunun son hesaplaması buradadır. Her iki seçeneğe de uygundur - doğrudan ve ters para birimi çiftleri.

//--- We know calculation currency, let's get its last prices
   MqlTick tick;
   SymbolInfoTick(calc_currency,tick);

//--- Now we have everything for calculation
   double calc_price;
//--- Calculate for Buy
   if(direction==POSITION_TYPE_BUY)
     {
      //--- Reverse quote
      if(mode)
        {
         //--- Calculate using Buy price for reverse quote
         calc_price=tick.ask;
         answer=lot*lot_size*calc_price;
        }
      //--- Direct quote 
      else
        {
         //--- Calculate using Sell price for direct quote
         calc_price=tick.bid;
         answer=lot*lot_size/calc_price;
        }
     }

//--- Calculate for Sell
   if(direction==POSITION_TYPE_SELL)
     {
      //--- Reverse quote
      if(mode)
        {
         //--- Calculate using Sell price for reverse quote
         calc_price=tick.bid;
         answer=lot*lot_size*calc_price;
        }
      //--- Direct quote 
      else
        {
         //--- Calculate using Buy price for direct quote
         calc_price=tick.ask;
         answer=lot*lot_size/calc_price;
        }
     }

Elde edilen sonucu döndürün

 //--- Return result - amount of equity in account currency, required to open position in specified volume
return  (Answer);

GetMarginForOpening() fonksiyonu bu noktada işini tamamlar. Yapılması gereken son şey, elde edilen değeri sağlanan kaldıraç boyutuna bölmektir, ardından varsayılan yönde belirtilen hacimde açık pozisyonlar için marj değerini elde edeceğiz. Ters veya çapraz para birimi çiftini temsil eden semboller için marj değerinin tik ile değişeceğini unutmayın.

İşte SymbolInfo_Advanced.mq5 Uzman Danışman kodunun bir parçası buradadır. Kodun tamamı bir dosya olarak eklenmiştir.

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- String variable for comment
   string com="\r\n";
   StringAdd(com,Symbol());
   StringAdd(com,"\r\n");

//--- Size of standard contract
   double lot_size=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);

//--- Margin currency
   string margin_currency=SymbolInfoString(_Symbol,SYMBOL_CURRENCY_MARGIN);
   StringAdd(com,StringFormat("Standard contract: %.2f %s",lot_size,margin_currency));
   StringAdd(com,"\r\n");

//--- Leverage
   int leverage=(int)AccountInfoInteger(ACCOUNT_LEVERAGE);
   StringAdd(com,StringFormat("Leverage: 1/%d",leverage));
   StringAdd(com,"\r\n");

//--- Calculate value of contract in account currency
   StringAdd(com,"Deposit for opening positions in 1 lot consists ");

//--- Calculate margin using leverage
   double margin=GetMarginForOpening(1,Symbol(),POSITION_TYPE_BUY)/leverage;
   StringAdd(com,DoubleToString(margin,2));
   StringAdd(com," "+AccountInfoString(ACCOUNT_CURRENCY));

   Comment(com);
  }

Grafik üzerindeki çalışmasının sonucu.


Sonuç

Verilen örnekler, alım satım hesabının en önemli özellikleri ve finansal enstrümanların özellikleri hakkında bilgi edinmenin ne kadar kolay ve basit olduğunu göstermektedir.

MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal makale: https://www.mql5.com/ru/articles/113

Başka Bir Göstergeye Dayalı Bir Gösterge Nasıl Yazılır? Başka Bir Göstergeye Dayalı Bir Gösterge Nasıl Yazılır?
MQL5'te, hem sıfırdan hem de zaten mevcut olan, istemci terminalinde yerleşik veya özel bir gösterge temelinde bir gösterge yazabilirsiniz. Burada ayrıca iki yolunuz var - bir göstergeyi ona yeni hesaplamalar ve grafik stilleri ekleyerek geliştirmek veya istemci terminalinde yerleşik bir gösterge veya iCustom() ya da IndicatorCreate() fonksiyonları aracılığıyla özel bir gösterge kullanmak.
Standart Kitaplık Sınıflarını ve Google Grafik API (Uygulama Programlama Arayüzü) kullanarak Bilgi Panosu oluşturmak Standart Kitaplık Sınıflarını ve Google Grafik API (Uygulama Programlama Arayüzü) kullanarak Bilgi Panosu oluşturmak
MQL5 programlama dili öncelikli olarak otomatik alım satım sistemlerinin ve karmaşık teknik analiz enstrümanlarının oluşturulmasını hedef alır. Bunun yanı sıra piyasadaki durumları izlemek için ilginç bilgi sistemlerini oluşturmamızı sağlar ve yatırımcıya bir dönüş bağlantısı sağlar. Makalede MQL5 Standart Kitaplık bileşenleri açıklanır ve bu hedeflere ulaşmak için bunların uygulamalı kullanımının örnekleri gösterilir. Ayrıca grafiklerin oluşturulması için Google Grafik API’sinin kullanım örneğini gösterir.
MQL5'te 20 Alım Satım Sinyali MQL5'te 20 Alım Satım Sinyali
Bu makale size bir alım satım sisteminin çalışması için gerekli olan alım satım sinyallerini nasıl alacağınızı öğretecektir. 20 alım satım sinyali oluşturma örneği burada, Uzman Danışmanlar geliştirilirken kullanılabilecek ayrı özel fonksiyonlar olarak verilmiştir. Size kolaylık sağlamak için makalede kullanılan tüm fonksiyonlar, gelecekteki bir Uzman Danışmana kolayca bağlanabilen tek bir mqh içerme dosyasında birleştirilmiştir.
Yeni Başlayanlar için MQL5’te Uzman Danışman Yazmak İçin Adım Adım Açıklamalı Kılavuz Yeni Başlayanlar için MQL5’te Uzman Danışman Yazmak İçin Adım Adım Açıklamalı Kılavuz
MQL5’te Uzman Danışmanların programlanması basittir ve kolayca öğrenilebilir. Bu adım adım açıklamalı kılavuzda geliştirilmiş bir alım satım stratejisine dayanarak basit bir Uzman Danışman yazmak için gereken temel adımları göreceksiniz. Uzman Danışmanın yapısı, yerleşik teknik talimatlar ve alım satım fonksiyonları, Hata Ayıklama modunun ayrıntıları ve Strateji Test Cihazının kullanımı açıklanmaktadır.