
Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
{
double minlot = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN),
maxlot = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX),
lotstep = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
lots = MathFloor(lots/lotstep)*lotstep;
lots = MathMax(lots,minlot);
lots = MathMin(lots,maxlot);
return(NormalizeDouble(lots,2));
}
Çok takdir ediyorum.
Sadece bu kodu yazmaya başlamak istiyorum :)
Daha çok zamanımı kurtardın.
Çok teşekkürler!
' MarketInfo & LotSize ' hesaplaması için iyi bir forum arıyorum.
Bu tür iyi forumları bilenler lütfen benimle paylaşın.
Teşekkürler.
Bu yüzden iyi bir tavsiyeye ihtiyacım var, lütfen.
02 : 00 : 00.069 - custom expert EURUSD,H1: | _lotSize - DoubleToString : 0.07
Hala NormalizeDouble()'a ihtiyacınız olduğuna inanıyorum.
İşte kod pasajınızı kullanarak bir örnek (aynısı MathFloor kullanan örneğim için de geçerlidir):
if (pair == "" ) pair = Symbol ();
double lotStep = MarketInfo (pair, MODE_LOTSTEP ),
minLot = MarketInfo (pair, MODE_MINLOT );
lots = MathRound (lots/lotStep) * lotStep;
if (lots < minLot) lots = 0 ; // or minLot
return (lots);
}
İsminde:
Sonuç:
Şimdi kod ayarlandı:
if (pair == "" ) pair = Symbol ();
double lotStep = MarketInfo (pair, MODE_LOTSTEP ),
minLot = MarketInfo (pair, MODE_MINLOT );
lots = MathRound (lots/lotStep) * lotStep;
if (lots < minLot) lots = 0 ; // or minLot
return ( NormalizeDouble (lots, 2 ) );
}
Sonuç:
Result: 0.7000000000000001
"Kayan noktayı anlamadığınız ve bazı sayıların tam olarak temsil edilemediği. (1/10 gibi.) Çift duyarlıklı kayan nokta biçimi - Wikipedia, özgür ansiklopedi "nin hangi kısmı belirsizdi?
NormalizeDouble(0.7, 2) aynı kesin sonucu verecektir (veya muhtemelen 0.6999999999999999.)
"Kayan noktayı anlamadığınız ve bazı sayıların tam olarak temsil edilemediği. (1/10 gibi.) Çift duyarlıklı kayan nokta biçimi - Wikipedia, özgür ansiklopedi "nin hangi kısmı belirsizdi?
NormalizeDouble(0.7, 2) aynı kesin sonucu verecektir (veya muhtemelen 0.6999999999999999.)
Geçerli bir OrderSend için NormalizeDouble() gerektiğini söylemiyorum. Bu yüzden ilk kod parçacığım onu hariç tuttu. Kayan nokta sayılarının nasıl temsil edildiği konusunda da net değilim.
Snippet'i dahil edecek şekilde düzenledim çünkü OP'nin sorununu anlamamı daha iyi ele aldığını hissettim (esas olarak bir görüntüleme sorunu, "lot normalleştirici" kodunda NormalizeDouble() kullanılarak veya ne zaman printf veya DoubleToStr kullanılarak çözülebilir). değerin görüntülenmesi gerekir).
Belki de OP'yi yanlış anladım.
02 : 00 : 00.069 - custom expert EURUSD,H1: | _lotSize - DoubleToString : 0.07
(gereksiz kısalığı ortadan kaldırmak için düzenlendi)
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart ()
{
//--- get minimum stop level
double minstoplevel= MarketInfo ( Symbol (), MODE_STOPLEVEL );
Print ( "Minimum Stop Level=" ,minstoplevel, " points" );
double price= Ask ;
//--- calculated SL and TP prices must be normalized
double stoploss= NormalizeDouble ( Bid -minstoplevel* Point , Digits );
double takeprofit= NormalizeDouble ( Bid +minstoplevel* Point , Digits );
//--- place market order to buy 1 lot
int ticket= OrderSend ( Symbol (), OP_BUY , 1 ,price, 3 ,stoploss,takeprofit, "My order" , 16384 , 0 , clrGreen );
if (ticket< 0 )
{
Print ( "OrderSend failed with error #" , GetLastError ());
}
else
Print ( "OrderSend placed successfully" );
//---
}
MQL4 belgeleri, örneklerin çoğunda NormalizeDouble() işlevini kullandığından, bu insanlar için kafa karıştırıcı olabilir.
Hatta normalleştirilmemiş fiyatın uygulanamayacağı uyarısına kadar gidiyor:
Not
Bir piyasa emrinin açılışında (OP_SELL veya OP_BUY), sadece Bid (satış için) veya Ask (satın almak için) en son fiyatları açık fiyat olarak kullanılabilir. Mevcut olandan farklı bir güvenlik ile işlem yapılırsa, bu güvenliğin alınabilmesi için en son fiyat teklifleri için MODE_BID veya MODE_ASK parametresi ile MarketInfo() fonksiyonunun kullanılması gerekir.
Hesaplanmış veya normalleştirilmemiş fiyat uygulanamaz. Fiyat dizisinde talep edilen açık fiyat yoksa veya ondalık noktadan sonraki basamak miktarına göre normalleştirilmemişse, 129 hatası (ERR_INVALID_PRICE) üretilecektir. İstenen açılış fiyatı tamamen güncel değilse, slippage parametresinde bağımsız olarak 138 hatası (ERR_REQUOTE) oluşturulacaktır. İstenen fiyat güncel değilse, ancak iş parçacığında mevcutsa, emir cari fiyattan ve sadece cari fiyatın fiyat+-slips aralığında olması durumunda açılacaktır.
Hatta MQL ile ilgili daha iyi kitapların bazılarında bile onu oldukça yoğun bir şekilde kullanıyorlar.
Uygulamasına bağlı olabilir, bir görüntüleme sorunu sipariş veya değişiklik hatalarından daha az dramatiktir.
Şahsen ben her zaman tamsayı değerlerine yükseltirim, bu yüzden nadiren onunla uğraşırım.