uzman danışman - çeşitli sorular - sayfa 3

 
double LotCalculator(double lots)
  {
   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));
  }
 
honest_knave :
double LotCalculator( double lots){}

Çok takdir ediyorum.

Sadece bu kodu yazmaya başlamak istiyorum :)

Daha çok zamanımı kurtardın.

Çok teşekkürler!

 
Lot Size için de aynı mesajı aldım.
'OnChartEvent()' içinde 'LotCalculator()' adını veriyorum , bu doğru değil mi?
 

' MarketInfo & LotSize ' hesaplaması için iyi bir forum arıyorum.
Bu tür iyi forumları bilenler lütfen benimle paylaşın.

Teşekkürler.

 
Son satırı (NormalizeDouble) düzenlemeden önce kod parçacığımı kullandınız mı? Görüyorum ki benim mesajımdan sizinkine sadece 3 dakika kalmış ve hemen editledim.
 
Max Enrik : için NormalizeDouble kullanıyorum. Ama ' NormalizeDouble ' mesajı hakkında endişeleniyorum, ancak grafikte lot boyutunu şöyle görüyorum: 0.07

Bu yüzden iyi bir tavsiyeye ihtiyacım var, lütfen.

02 : 00 : 00.069 - custom expert EURUSD,H1: | _lotSize - NormalizeDouble : 0.07000000000000001
02 : 00 : 00.069 - custom expert EURUSD,H1: | _lotSize - DoubleToString : 0.07
  1. NormalizeDouble bir çift döndürür. Kayan noktanın sonsuz sayıda ondalık basamağı vardır, bu sizin kayan noktayı anlamamanız ve bazı sayıların tam olarak temsil edilememesidir. (1/10 gibi.) Çift duyarlıklı kayan nokta biçimi - Wikipedia, özgür ansiklopedi Ayrıca bkz . == işlenen. - MQL4 forumu
  2. NormalizeDouble'ı HİÇBİR ZAMAN KULLANMAYIN. HERHANGİ BİR Sebep için. Bu bir çamur, kullanmayın. Kullanımı her zaman yanlıştır
 
whroeder1 :
  1. NormalizeDouble'ı HİÇBİR ZAMAN KULLANMAYIN . HERHANGİ BİR Sebep için. Bu bir çamur, kullanmayın. Kullanımı her zaman yanlıştır

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):

double NormalizeLots( double lots, string pair= "" ){
     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:

Print (NormalizeLots( 2 / 3.0 ));

Sonuç:

0.7000000000000001

Şimdi kod ayarlandı:

double NormalizeLots( double lots, string pair= "" ){
     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ç:

0.7


 

 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.)

 
whroeder1 :

"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 - NormalizeDouble : 0.07000000000000001
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.