% mevduattan doğru lot hesaplaması

 

Merhaba,

Son zamanlarda, programcılardan biri - Roger, %'den lot hesaplama işlevini yanlış yazdığım gerçeğine gözlerimi açtı.


benim işlevim şudur:


double GetSizeLot() //Функция возвращает значение лотов,
{ //если включен ММ то значение лотов,
double lots,MD,RM,MinLots,LotSize; int lotsdigit; //вычисляется путем:Свободные средства*Risk
LotSize = MarketInfo(Symbol(), MODE_LOTSIZE); //поделить на стоимость одного лота
MD = NormalizeDouble(MarketInfo(Symbol(), MODE_LOTSTEP), 2); //А также вычисляет колличество знаков
if(MD==0.01) lotsdigit=2; //присваивает значения максимума лотов
if(MD==0.1) lotsdigit=1;
if(MM>1) {lots=NormalizeDouble((AccountFreeMargin()*MM/LotSize),lotsdigit);Lot=lots;}
else lots=Lot;
MinLots=NormalizeDouble(MarketInfo(Symbol(),MODE_MINLOT),2);
if(lots < MinLots) lots = MinLots;
if(lots > MaxLot) lots = MaxLot;
return(NormalizeDouble(lots,2));
}



ama sonra bana öyle dediklerini söyledi ve bu yüzden kaldıracı ve cari fiyatı da kullanmalıyız,


Pekala, bir profesyonel gibi kontrol edeceğimi düşünmeme izin verin ve HERKES! kesinlikle, yeniden kontrol edilen 1000 uzman, hepsi aynı işleve sahip,


gerçek nerede?


%'den lotu hesaplamak için doğru işlevi söyle

 
Genellikle sorun, mevduat yükü ile pozisyon başına risk miktarı arasında bir karışıklık olmasıdır. Her ikisinin de kontrol edilmesi arzu edilir. Yukarıdaki kodda dikkate alınan yük, daha doğrusu yüke göre parti büyüklüğüdür.
 
Bu garzdo daha iyi, burada kaldıraç hesaplaması yok, çözmenin başka bir yolu var. gerçekten hoşuma gitti

double LotSize( int type, double LotRisk, int SL  )
{   //    int znakov_lot=0;
        double  lot_min         = MarketInfo( Symbol (), MODE_MINLOT  ); 
        double  lot_max         = MarketInfo( Symbol (), MODE_MAXLOT  ); 
        double  lot_step        = MarketInfo( Symbol (), MODE_LOTSTEP ); 
        double  lotcost         = MarketInfo( Symbol (), MODE_TICKVALUE );       
                
        double  lot             = 0.0 ;
        double  dollarsPerPip   = 0.0 ;
        
        lot = AccountBalance()*LotRisk/ 100.0 ;
        dollarsPerPip = lot/SL;
     //   if (lot_min<2) {znakov_lot=0;  if (lot_min<0.2) {znakov_lot=1;  if (lot_min<0.02) {znakov_lot=3;  if (lot_min<0.002) {znakov_lot=4; }}}}      
        lot = NormalizeDouble ( dollarsPerPip/lotcost, 2 );      
        
        lot = NormalizeDouble ( lot / lot_step, 0 ) * lot_step;
        
        if ( lot < lot_min ) lot = lot_min;
        if ( lot > lot_max ) lot = lot_max;
        
        if ( AccountFreeMarginCheck( Symbol (), type, lot ) < 10 || GetLastError () == 134 ) 
        { 
                Alert ( "Impossible to open position with lot = " , DoubleToStr( lot, 2 ), ". Not enough money." );
                return (- 1 );
        }

        return ( lot );
}
Belirli bir mesafe için % depodan parti hesaplaması pp. onlar. "10pp için deponun %20'sini boşaltmak için = ihtiyacınız var mı? lot" işlevi bir sorudur ve dikkate alınır
 
wenay :
Bu garzdo daha iyi, burada kaldıraç hesaplaması yok, çözmenin başka bir yolu var. Belirli bir mesafe pp için % depodan lot hesaplamasını gerçekten beğendim. onlar. "10pp için deponun %20'sini boşaltmak için = ihtiyacınız var mı? lot" işlevi bir sorudur ve dikkate alınır

Bence kaldıraç lot hesaplamalarına dahil edilmelidir.

1) Kaldıraç oranını hesaba katmazsanız, bu TS'nin büyük bir kazanç sağlayamadığı anlamına gelir.

2) Depo zaten yeterince büyükse, ds kaldıracı azaltır (benim ds'mde otomatik olarak), bu nedenle " Yanlış hacim " hatası görünür.

Bu bir omuz, lastik değil.

PS bu benim IMHO'm

 
rensbit :

> kaldıraç hesaplaması yok

Bence kaldıraç lot hesaplamalarına dahil edilmelidir.

1) Kaldıraç oranını hesaba katmazsanız, bu TS'nin büyük bir kazanç sağlayamadığı anlamına gelir.

2) Depo zaten yeterince büyükse, ds kaldıracı azaltır (otomatik olarak benim ds'mde), bu nedenle "Yanlış hacim" hatası görünecektir.


PS bu benim IMHO'm


kene maliyeti hesaplamasını kullanarak kaldıraç yerine daha yakından bakın. Kaldıracınız 1k1 ise, o zaman bir kene pahalı değildir (orada 1 sent diyelim), 1k 500 ise, o zaman pahalıdır (5 dolar). Onlar. sistem açıkça herhangi bir kaldıraçla çalışıyor, hesaplamanın başka bir yolu var, bana daha uygun ve doğru görünüyor

DC'niz için doğru, çünkü sistem otomatik olarak diğer omuza geçecektir

 
Vladon :
...hala omzunu kullanman gerekiyor...
Risk yüzde olarak verilirse:
lot = AccountEquity()* 0.01 *Risk / MarketInfo( Symbol (), MODE_MARGINREQUIRED);
 

Roger, ayrı bir saygı duyduğu bu konuda çok yardımcı oldu !!!!


Hesabın para birimini kendim belirleyebilmek için biraz yeniden düzenledim


 int Percent= 10 ;
string Valdepo=AccountCurrency () ;

int start()
{
double Lot,MinLots,MaxLots;
int lotdig;
if (MarketInfo( Symbol (),MODE_LOTSTEP)== 0.01 )lotdig= 2 ; else lotdig= 1 ;
if (Valdepo== "USD" )
   {
   if ( StringSubstr ( Symbol (), 0 , 3 )== "USD" )Lot= NormalizeDouble (AccountFreeMargin()*Percent*AccountLeverage()/ 100 /MarketInfo( Symbol (),MODE_LOTSIZE),lotdig);
   else if ( StringSubstr ( Symbol (), 3 , 3 )== "USD" )Lot= NormalizeDouble (AccountFreeMargin()*Percent*AccountLeverage()/Ask/ 100 /MarketInfo( Symbol (),MODE_LOTSIZE),lotdig);
   else 
      {
       double pr=MarketInfo( StringSubstr ( Symbol (), 0 , 3 )+ "USD" ,MODE_ASK);
       if (pr!= 0 )Lot= NormalizeDouble (AccountFreeMargin()*Percent*AccountLeverage()/pr/ 100 /MarketInfo( Symbol (),MODE_LOTSIZE),lotdig);
       else Lot= NormalizeDouble (AccountFreeMargin()*Percent*AccountLeverage()/ 100 /MarketInfo( Symbol (),MODE_LOTSIZE),lotdig);
      }
   }
if (Valdepo== "EUR" )
   {
   if ( StringSubstr ( Symbol (), 0 , 3 )== "EUR" )Lot= NormalizeDouble (AccountFreeMargin()*Percent*AccountLeverage()/ 100 /MarketInfo( Symbol (),MODE_LOTSIZE),lotdig);
   else
      {
      pr=MarketInfo( "EUR" + StringSubstr ( Symbol (), 0 , 3 ),MODE_BID);
       if (pr!= 0 )Lot= NormalizeDouble (AccountFreeMargin()*Percent*AccountLeverage()*pr/ 100 /MarketInfo( Symbol (),MODE_LOTSIZE),lotdig);
       else Lot= NormalizeDouble (AccountFreeMargin()*Percent*AccountLeverage()/ 100 /MarketInfo( Symbol (),MODE_LOTSIZE),lotdig);
      }
   }
MinLots=MarketInfo( Symbol (),MODE_MINLOT);
MaxLots=MarketInfo( Symbol (),MODE_MAXLOT);
if (Lot < MinLots) Lot = MinLots;
if (Lot > MaxLots) Lot = MaxLots;
return ( 0 );
}
 

Başka hesap para birimi yok mu? ;-)

Ve riskler hala yanda mı? Sonuçta, bu seçenek de sadece deponun yüklenmesinden sayılır ve düşüşler sırasında hangi risklerin (deponun %'si olarak) olacağı göz ardı edilir. Açtığınızda, ilk andan son ana kadar her zaman yönü ile tahmin ettiğinizi düşünebilirsiniz.

 

işe yaramaz işlev, yanı sıra hatalarla ..

 if (Lot < MinLots) Lot = MinLots;

bu nedir? Zaten açmak için yeterli paramız yok mu?

100 dolarımız varsa, %100 ve %100 riskten yararlanın, yani. sonuna kadar aç, ne elde ederiz?

 if ( StringSubstr ( Symbol (), 0 , 3 )== "USD" )
Lot= NormalizeDouble (AccountFreeMargin()*Percent*AccountLeverage()/ 100 /MarketInfo( Symbol (),MODE_LOTSIZE),lotdig);

parti = 100 * 100 * 100 / 100 / 100 = 100

hiçbir şeyi karıştırmadım mı? 100 dolara, herhangi bir çift için 100 lot açamazsınız..

 
keekkenen :

100 dolarımız varsa, %100 ve %100 riskten yararlanın, yani. sonuna kadar aç, ne elde ederiz?

parti = 100 * 100 * 100 / 100 / 100 = 100

hiçbir şeyi karıştırmadım mı? 100 dolara, herhangi bir çift için 100 lot açamazsınız..



Tabii ki karıştırdım, gerçek böyle olacak - 100*100*100/100/100000=0.1
 
ah, pardon, altına bakıyordum .. o zaman neden şimdi formülünüze göre altın ticareti yapmıyorsunuz?