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
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
> 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
...hala omzunu kullanman gerekiyor...
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..
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
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
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