SL ve Hesap Riskine dayalı para yönetimi LOT boyutu formülüne ihtiyacınız var! - sayfa 3

 

Tamam arkadaşlar! Bu kod benim tarafımdan yazılmıştır ve kendi EA'larımda kullandığım koddur. Oldukça karmaşıktır çünkü % Risk ve StopLoss'un yanı sıra Marjin Riski %'sini de hesaba katar ve Lot Büyüklüğünü Minimum, Maksimum ve Adım Büyüklüğüne göre düzeltir. Ayrıca, bunlardan sadece birini kullanmak yerine her zaman Cari Bakiye ve Özkaynak minimum değerini kullanır. Bu şekilde daha güvenli olduğunu hissediyorum.

Ancak unutmayınız ki, hesaplamada spread kullanmamaktadır, çünkü kullanılacak StopLoss'u hesaplarken bunu ayrı olarak hesaplıyorum. Aşağıdaki işlev, bu nedenle, göreli bir durma kaybı boyutu kullanır. EA'larımda dblStopLossPips argümanı strateji, yayılma, ATR, vb. gibi çeşitli faktörlere bağlı olarak önceden hesaplanır; bu nedenle, dblLotsRisk() işlevine iletilen son değer, kullanılacak Lot boyutunu hesaplamak için zaten bir son değerdir.

 // Function to Determine Tick Point Value in Account Currency

         double dblTickValue( string strSymbol )
        {
                 return ( MarketInfo ( strSymbol, MODE_TICKVALUE ) );
        }
        

// Function to Determine Pip Point Value in Account Currency

         double dblPipValue( string strSymbol )
        {
                 double dblCalcPipValue = dblTickValue( strSymbol );
                 switch ( MarketInfo ( strSymbol, MODE_DIGITS ) )
                {
                         case 3 :
                         case 5 :
                                dblCalcPipValue *= 10 ;
                                 break ;
                }
                
                 return ( dblCalcPipValue );
        }
        

// Calculate Lot Size based on Maximum Risk & Margin

         double dblLotsRisk( string strSymbol, double dblStopLossPips,
                 double dblRiskMaxPercent, double dblMarginMaxPercent,
                 double dblLotsMin, double dblLotsMax, double dblLotsStep )
        {
                 double
                        dblValueAccount = MathMin ( AccountEquity (), AccountBalance () )
                ,       dblValueRisk    = dblValueAccount * dblRiskMaxPercent / 100.0
                ,       dblValueMargin  = AccountFreeMargin () * dblMarginMaxPercent / 100.0
                ,       dblLossOrder    = dblStopLossPips * dblPipValue( strSymbol )
                ,       dblMarginOrder  = MarketInfo ( strSymbol, MODE_MARGINREQUIRED )
                ,       dblCalcLotMin
                                = MathMax ( dblLotsMin, MarketInfo ( strSymbol, MODE_MINLOT ) )
                ,       dblCalcLotMax
                                = MathMin ( dblLotsMax, MarketInfo ( strSymbol, MODE_MAXLOT ) )
                ,       dblModeLotStep  = MarketInfo ( strSymbol, MODE_LOTSTEP )
                ,       dblCalcLotStep  = MathCeil ( dblLotsStep / dblModeLotStep ) * dblModeLotStep
                ,       dblCalcLotLoss
                                = MathFloor ( dblValueRisk / dblLossOrder / dblCalcLotStep ) * dblCalcLotStep
                ,       dblCalcLotMargin
                                = MathFloor ( dblValueMargin / dblMarginOrder / dblCalcLotStep ) * dblCalcLotStep
                ,       dblCalcLot = MathMin ( dblCalcLotLoss, dblCalcLotMargin )
                ;
                
                 if ( dblCalcLot < dblCalcLotMin ) dblCalcLot = dblCalcLotMin;
                 if ( dblCalcLot > dblCalcLotMax ) dblCalcLot = dblCalcLotMax;

                 return ( dblCalcLot );
        }
 
GumRai :

Bu, parantezleri çözmeye çalışırken bana bir baş ağrısı veriyor!

Dürüst olmak gerekirse, burada neyi başarmaya çalıştığınız konusunda kesinlikle hiçbir fikrim yok.

MODE_STOPLEVEL veya SPREAD'in ne kadar alakalı olduğunu göremiyorum, elbette hesaplamalarınızı mevcut fiyattan stop-loss mesafesine dayandırmalısınız?

Hesap para biriminin ne olduğu fark etmemelidir, TICKVALUE hesap para biriminde olduğu için hesaplama aynı olmalıdır.

Lütfen unutmayın, kod satırınızı 2 satıra koyarak yazı o kadar geniş değil ve sağa sola kaydırmadan okumayı kolaylaştırıyor :)

Birkaç sayfa geride, lotu nasıl hesaplayacağımı formülümü gösterdiğim bir resim yayınladım. Ama pip değeri veya tick değeri ya da her ne olursa olsun her zaman ortalıkta dolaşıp duruyor. Alıntı-> temel para birimi ve kafa karıştırıcı olan diğer şeyler, ama şu ana kadar formülüm doğru olduğundan emin olmasam da iyi bir iş çıkardı.

SPREAD alakasız olabilir, ancak durma seviyesi gereklidir. SL'yi, durma seviyesi olan orderopenprice'a mümkün olan en yakın şekilde koydum, ancak dalgalanmalar ve ani yükselmeler nedeniyle, bazen manuel olarak ayarlamam gerekiyor, bu yüzden SL'yi oynaklığa veya her neyse ayarlayabileceğim bir STOPSLIP değişkeni koydum. .

FMIC :

Tamam arkadaşlar! Bu kod benim tarafımdan yazılmıştır ve kendi EA'larımda kullandığım koddur. Oldukça karmaşıktır çünkü % Risk ve StopLoss'un yanı sıra Marjin Riski %'sini de hesaba katar ve Lot Büyüklüğünü Minimum, Maksimum ve Adım Büyüklüğüne göre düzeltir. Ayrıca, bunlardan sadece birini kullanmak yerine her zaman Cari Bakiye ve Özkaynak minimum değerini kullanır. Bu şekilde daha güvenli olduğunu hissediyorum.

Ancak unutmayınız ki, hesaplamada spread kullanmamaktadır, çünkü kullanılacak StopLoss'u hesaplarken bunu ayrı olarak hesaplıyorum. Aşağıdaki işlev, bu nedenle, göreli bir durma kaybı boyutu kullanır. EA'larımda dblStopLossPips argümanı strateji, yayılma, ATR, vb. gibi çeşitli faktörlere bağlı olarak önceden hesaplanır; bu nedenle, dblLotsRisk() işlevine iletilen son değer, kullanılacak Lot boyutunu hesaplamak için zaten bir son değerdir.

Teşekkürler, test edip geri bildirimimi söyleyeceğim!

Oraya neden bu kadar çok değişken koyduğunu anlamasam da, kodun tamamı 1 satıra sığdırılabilir :)

 
Proximus :

Birkaç sayfa geride, lotu nasıl hesaplayacağımı formülümü gösterdiğim bir resim yayınladım. Ama pip değeri veya onay değeri veya her ne olursa olsun her zaman ortalıkta dolaşıp duruyor. Alıntı->temel para birimi ve kafa karıştıran diğer şeyler, ama şu ana kadar benim formülüm doğru olduğundan emin olmasam da iyi bir iş çıkardı.

SPREAD alakasız olabilir, ancak durma seviyesi gereklidir. SL'yi, durma seviyesi olan orderopenprice'a mümkün olan en yakın şekilde koydum, ancak dalgalanmalar ve ani yükselmeler nedeniyle, bazen manuel olarak ayarlamam gerekiyor, bu yüzden SL'yi oynaklığa veya her neyse ayarlayabileceğim bir STOPSLIP değişkeni koydum. .

Teşekkürler, test edip geri bildirimimi söyleyeceğim!

Oraya neden bu kadar çok değişken koyduğunu anlamasam da, kodun tamamı 1 satıra sığdırılabilir :)


Evet, kodun tümü tek bir satıra konabilir, ancak bana güvenin, gezegendeki en hızlı olmak için kodunuzdan her son CPU döngüsünü sıkıştırmaya çalışmadığınız sürece, bu ASLA kodlamanın iyi bir yolu değildir.

Bu nedenle " GumRai" , diğer kodun başını veya sonunu yapmaya çalışırken baş ağrısından şikayet etti. Basitçe çok okunaklı değildi veya kolayca anlaşılmadı ve bu da hata ayıklamayı çok zorlaştırıyor.

Yolum daha ayrıntılı olabilir, ancak hata ayıklaması ve bakımı daha kolay olduğu kadar sizin gibi başkaları tarafından daha okunabilir ve anlaşılması daha kolaydır.

Ancak hepsini tek bir satırda sıkıştırmaktan çekinmeyin. Aynı sonuçları vermiyorsa şikayet etmeyin. BU hatayı ayıklamak için size bırakacağım.

 

Bu konuyu yeniden açtığım için üzgünüm ama bir şeyi doğrulamak çok önemli, bu yüzden bulduğum işlev bu (genel olarak açıyorum, daha sonra bana teşekkür edebilirsiniz):

 double LOTUNITSTORISK()
{
double LOTS=((AccountBalance()*RISKPERCENT/ 100 ) / (  MarketInfo( Symbol (), MODE_TICKVALUE)*MarketInfo( Symbol (), MODE_TICKSIZE)*STOPSIZE     ));
return LOTS;
}


Bu fonksiyon, EUR her zaman temel para birimi olduğundan, hesap riskine dayalı ve bir EUR hesabı üzerinden hesaplanan lot birimlerini döndürmelidir.

Lot birimi anlamına gelir = bir pozisyonun gerçek para büyüklüğü, yani %1 risk içeren 100 €'luk bir hesap için 1 € döndürmeli, örneğin STOPLOSS'a dayalı olarak 100 pipet stoploss 1000 lot birimi olmalıdır (MT4 EŞDEĞERİNDE 0.01 LOT)

Hesap para biriminin EURO olması önemlidir, başka bir şey değil.

LOTUNITTORISK()'ı çağırdığımızda, gerçek parti büyüklüğünü MT4 formatında (MT4'te 1000 nakit birim 0.01 LOT) elde etmek için sonuçları 100.000'e böleceğiz.

RISKPERCENT = bir int ve risk aldığımız risk yüzdesi 1,2,3,4 olabilir

STOPSIZE = bir int ve stoploss büyüklüğümüzün pipet sayısıdır (5 haneli komisyoncuda pip/10), yani örneğin 60 pipet SL, 6 pip SL'dir

Fonksiyonun LOT UNITS'i doğru hesaplayıp hesaplamadığını bilmek istiyorum, lütfen test edin ve herhangi bir hata bulursanız lütfen bana yardım edin :)

Binlerce kez teşekkürler!

 
Proximus :
MarketInfo( Symbol (), MODE_TICKVALUE) * MarketInfo( Symbol (), MODE_TICKSIZE)*STOPSIZE

Risk  = lotsize * StopSize * TickValue / TickSize
         1       *   0.0100   *  $ 10.00    / 0.0001
$1000 = one lot * 100 pips *  $ 10.00    / pip
  1. Stop'u olması gereken yere, yani takas sebebinin artık geçerli olmadığı yere yerleştirirsiniz. Örneğin, bir destek sıçraması ticareti, durdurma desteğin altına düşer.
  2. Hesap Bakiyesi * yüzde = RİSK = (OrderOpenPrice - OrderStopLoss)*DIR * OrderLots * DeltaPerlot (Not OOP-OSL, SPREAD'i içerir)
  3. TickValue'u tek başına KULLANMAYIN - DeltaPerlot
  4. Stop out'tan kaçınmak için FreeMargin'i de kontrol etmelisiniz.
 
WHRoeder :
  1. Stop'u olması gereken yere, yani takas sebebinin artık geçerli olmadığı yere yerleştirirsiniz. Örneğin, bir destek sıçraması ticareti, durdurma desteğin altına düşer.
  2. Hesap Bakiyesi * yüzde = RİSK = (OrderOpenPrice - OrderStopLoss)*DIR * OrderLots * DeltaPerlot (Not OOP-OSL, SPREAD'i içerir)
  3. TickValue'u tek başına KULLANMAYIN - DeltaPerlot
  4. Stop out'tan kaçınmak için FreeMargin'i de kontrol etmelisiniz.

1) İşlev, MT4 birimini değil, yalnızca para birimindeki PARTİ BOYUTU'nu döndürür, başka bir şey değil, emir verdiğimde sırasıyla STOPSIZE, AL ve satış durumunda Sor'a eklenir / çıkarılır. MT4, TP ve SL'yi yönetir.

AL, ASK'da açıldı, BID'de kapandı

SATIŞ BID'de açıldı, ASK'da kapandı

2) OrderOpenprice man'i kullanamıyorum çünkü bu fonksiyon hesaplanmadan emir açılmadı.Spreadler dahil değildir, emir açıldıktan sonra STOPSIZE eklediğimde/çıkardığımda spreadler işlenecek.

Ama ondan önce parti büyüklüğünü belirlememiz gerekiyor, bu mantıklı.

3) Bunu anlamıyorum.

4) Açıkçası, ama tekrar vurguluyorum, sipariş yerleştirme işlevi bundan sonra çalıştırılır ve bu işlevle çok az ilgisi vardır. Bu işlevin sahip olduğu tek amaç parti büyüklüğünü belirlemektir, başka bir şey değil.


TickValue / TickSize

Yanlış, bölersem yanlış numarayı alıyorum, belki USD hesaplar için böyle yapılmalı, ama bu bir EUR hesabı.Çarpılması gerekiyor.

 
Proximus :

ALIM ASK'da açıldı, BID SATIŞ'ta kapandı BID'de açıldı, ASK'da kapandı

2) OrderOpenprice'i kullanamıyorum

3) Bunu anlamıyorum.

4)t, bölersem yanlış sayı alıyorum, belki USD hesaplar için böyle yapılmalı, ama bu bir EUR hesabı.Çarpılması gerekiyor.

  1. Ask , bir satın alma için OrderOpenPrice'dir
  2. Teklif , bir satış için OrderOpenPrice'dir . Neden kullanamıyorsun, onu OrderSend'e iletmek için bilmek zorundasın?
  3. Tik değeri/tick boyutu kullanmanız ZORUNLUDUR. Tickvalue tek başına anlamsızdır.
  4. Birimleri doğru elde etmek için BÖLMELİSİNİZ (Fiyatta değişiklik) * (tickValue) /(fiyatta değişiklik) size bir değer verir. Pip başına 10$ = puan başına 1$ = değer/değişim. Sonucun hesap para birimi olduğunu hatırlayın, bu yüzden onu riskinize böldüğünüzde, saf bir sayı elde edersiniz, birimler yine $risk(BAL%)/$risk(SL)'yi iptal eder. Birden fazla yapmanız gerekiyorsa, yanlış bir şey yapıyorsunuz veya komisyoncu değerleri berbat.
 
WHRoeder :
Proksimus :

ALIM ASK'da açıldı, BID SATIŞ'ta kapandı BID'de açıldı, ASK'da kapandı

2) OrderOpenprice'i kullanamıyorum

3) Bunu anlamıyorum.

4)t, bölersem yanlış sayı alıyorum, belki USD hesaplar için böyle yapılmalı, ama bu bir EUR hesabı.Çarpılması gerekiyor.

  1. Ask , bir satın alma için OrderOpenPrice'dir
  2. Teklif , bir satış için OrderOpenPrice'dir . Neden kullanamıyorsun, onu OrderSend'e iletmek için bilmek zorundasın?
  3. Tik değeri/tick boyutu kullanmanız ZORUNLUDUR. Tickvalue tek başına anlamsızdır.
  4. Birimleri doğru elde etmek için BÖLMELİSİNİZ (Fiyatta değişiklik) * (tickValue) /(fiyatta değişiklik) size bir değer verir. Pip başına 10$ = puan başına 1$ = değer/değişim. Sonucun hesap para birimi olduğunu hatırlayın, bu yüzden onu riskinize böldüğünüzde, saf bir sayı elde edersiniz, birimler yine $risk(BAL%)/$risk(SL)'yi iptal eder. Birden fazla yapmanız gerekiyorsa, yanlış bir şey yapıyorsunuz veya komisyoncu değerleri berbat.


1,2 Bunu biliyorum, ancak bunun başka bir işlev tarafından yapıldığını anlayın, bununla hiçbir ilgisi yok

3) Anladığım kadarıyla tik değeri, temel para birimindeki 1 pip değeridir, bu yüzden hangi çifti kullandığıma bağlı olarak ya bölmek ya da onunla çarpmak zorunda kalacak. EUR hesabı olması durumunda çarpmamız gerekiyor gibi görünüyor. bölmek.

İşte bunu daha iyi gösteren bir resim:


%3'lük bir risk ticareti için EUR/USD'de bunu başarmak için MT4 birimlerinde 0.02 LOTS yuvarlatılmış 1798 birim açmamız gerekiyor.

STOPLOSS boyutu başka bir fonksiyon tarafından belirlenir.

Test ettiğimde doğru gibi görünüyor ama formülün gerçekten kesin olup olmadığından emin değilim, burada belirlemeye çalıştığım şey bu, bu yüzden lütfen bu konuda yardım edin.

 

Ben de bu lot büyüklüğü hesaplamasını SL, hesap riski VE Marjin Çağrı Düzeyine göre özellikle Teminat Çağrısı Düzeyi %100 değil, örneğin %120 olduğunda çözmeye çalışıyorum. Bulduğum en iyi cevap, WHRoeder'ın burada whrea.mq4 kodunda paylaştığı şey. whrea.mq4 kodunun biraz düzeltilmesi gerekiyordu ama WHRoeder bu düzeltmeyi RaptorUK'un yorumuna verdiği yanıtta zaten verdi. Dolayısıyla parti büyüklüğünü hesaplamanın tam cevabı orada ama WHRoeder'ın neler paylaştığını tam olarak anlamak için biraz çaba gerekiyor.

Teminat Çağrısı Seviyesinin %100'den fazla olduğu uzun bir ticaret için lot boyutunu hesaplamak için en son yeni MT4 yapısıyla derlemek için WHRoeder'ın whrea.mq4'ünden çıkardığım ve değiştirdiğim kodu ekledim.

Ancak, bir marj çağrısından kaçınmak için Margin Call Level %'yi hesaba katmak için MarginCallLevel % ile çarpmanın doğru olup olmadığından emin değilim. MarginCallLevel %100 ise, o zaman her iki kod satırı da doğru olur, ancak MarginCallLevel %120 ise, MarginCallLevel % ile çarpmak doğru bir Marjin Çağrısı testi olur mu? Değilse, bunu yapmanın doğru yolu nedir? WHRoeder, bu konuda yardımcı olabilir misiniz? William, elimden geleni yaptım.

İşte bir Uzun ticaret için Marjin Testi bölümündeki kod:

 extern double MarginCallLevel = 120 ; //As a percentage

double MarginCallLevel1 = MarginCallLevel * 0.01 ; 

         double   AFMC    = AccountFreeMarginCheck( Symbol (), OP_BUY, tradesize),
                        eRisk   = equityatrisk + atrisk new ;

         //Test for margin
         //Note: Not sure if multiplying by the MarginCallLevel % here is correct to 
         //take the Margin Call Level % into account for avoiding a margin call.
         //If the MarginCallLevel is 100% then both lines of code would be correct
         //but if the MarginCallLevel is 120% would multiplying by the MarginCallLevel %
         //be a correct Margin Call test? If not, then what is the correct way to do this?

         //if (AFMC*0.99 <= eRisk){
         if (AFMC* 0.99 <= eRisk*MarginCallLevel1){
            tradesize *= 0.95 ;     // Must still round to lotStep.
             continue ;   }   // Prevent margin call if new trade goes against us.
Dosyalar:
 

... kodun bu bölümünde yeni derlemeyle ilgili bir sorun var (hata ---> 'MarketInfo' - geçersiz anahtar ifade türü) belki de MT4 600+ derlemesine kadar her şey yolundaydı ... ama o zamandan beri değil artık çalışma.

 // Function to Determine Pip Point Value in Account Currency

         double dblPipValue( string strSymbol )
        {
                 double dblCalcPipValue = dblTickValue( strSymbol );
                 switch ( MarketInfo ( strSymbol, MODE_DIGITS ) )
                {
                         case 3 :
                         case 5 :
                                dblCalcPipValue *= 10 ;
                                 break ;
                }
                
                 return ( dblCalcPipValue );
        }
        

Yani, lütfen daha yeni bir sürüm yayınlayabilir misiniz ... tabii ki hala buralardaysanız.