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

 
  1. Evet yoğun bir şekilde kullanıyorlar. Bunların hepsi sadece paralar varken yazılmıştı. Şimdi metaller var ve kene boyutu != nokta ise düz yanlış.
  2. 02 : 00 : 00.069 - özel uzman EURUSD,H1: | _lotSize - NormalizeDouble : 0.0700000000000001
    OP, çift ila 15 basamak yazdırmaya devam ediyor ve neden tam olarak 0,07 olmadığını anlayamıyor. Çünkü bazı sayılar tam olarak 1/8 temsil edilemez. 1/10 olabilir. yapamamak.
 
honest_knave :
double  LotCalculator( double  lots)
  {
   ...
    return ( NormalizeDouble (lots, 2 ));
  }

Bu yorum gerçekten bana çok yardımcı oluyor ve bu faydalı ama bu bana daha fazla ondalık sayı veriyor.
(daha fazla ondalık sayı normaldir - çünkü bunu zaten okudum)

Hala ' NormalizeDouble ' için endişeleniyorum ve 'NormalizeDouble'dan daha iyi olan başka bir yol arıyorum

Teşekkürler!

 

Yorum yazanlara çok teşekkürler.

@whroeder1 - Yorumunuzu (/ linkler) geniş çapta araştıracağım, çok teşekkürler.
@Marco - LotSize LotStep sorunundan sonra kullanacağım. Teşekkürler!

 
Max Enrik :

Bu yorum gerçekten bana çok yardımcı oluyor ve bu faydalı ama bu bana daha fazla ondalık sayı veriyor.
(daha fazla ondalık sayı normaldir - çünkü bunu zaten okudum)

Hala ' NormalizeDouble ' için endişeleniyorum ve 'NormalizeDouble'dan daha iyi olan başka bir yol arıyorum

Teşekkürler!

Belki de tam olarak neyi başarmak istediğinizi belirlemek en iyisi olacaktır.

Bir fonksiyonun sipariş vermek için geçerli bir parti büyüklüğü döndürmesini istiyorsanız, NormalizeDouble() kullanmanıza gerek yoktur. Orijinal kod parçacığım veya WHRoeder's bunu sizin için başaracak. Aralarında kişisel tercih meselesi olacak ince farklılıklar vardır.

Ancak, bu lot değerinden düz bir Print() yaparsanız, 0.0700000000000001 gibi bazı "garip" sonuçlar alabilirsiniz.

Bu OrderSend() için bir sorun olmayacak ama görmeyi beklediğiniz gibi olmayabilir.

Sayıların "normal" bir şekilde görüntülenmesini istiyorsanız 2 seçeneğiniz var:

1. İşlevde NormalizeDouble() öğesini kullanabilirsiniz . Standart bir çıktı için değer beklediğiniz gibi olacaktır. Ancak (manuel olarak) yeterince ondalık basamak yazdırırsanız, sonunda sayının tam olarak düşündüğünüz gibi olmadığını göreceksiniz. WHRoeder'ın yapmaya çalıştığı nokta bu (sanırım). Bu çözüm en zarif değil, ancak en basit olanıdır. Veya...

2. Parti boyutunu olduğu gibi bırakabilir (yani NormalizeDouble kullanmayın ) ve ardından gerektiğinde değeri görüntüleme amacıyla ayarlayabilirsiniz. Neye ihtiyacınız olduğuna bağlı olarak, bunu başarmak için DoubleToStr() veya StringFormat() veya printf() kullanabilirsiniz. Bu daha esnek bir yaklaşımdır.

Gerçek değerin ve bu değerin nasıl görüntülendiğinin aynı olması gerekmediğini unutmayın. Tam olarak 0.07'yi asla depolayamazsınız:

   double myVal= 0.07 ;
   printf ( "%.24f" ,myVal);

Sonuç: 0.0700000000000000006661338

Ancak gerekirse kesinlikle 0.07 görüntüleyebilirsiniz.
 
honest_knave :

Belki de tam olarak neyi başarmak istediğinizi belirlemek en iyisi olacaktır.
...

Vay ne güzel yazmışsın, yorumunu beğenerek neredeyse anladım.
Bu yüzden yakında yeni yorum yazacağım.

//--- ikinci kez düzenlendi

Bahsettiğim gibi LotSize ve LotStep gösterilerine ihtiyacım yok, sadece ekranda, LotSize'a ihtiyacım var ve LotStep her yerde aynı şeyi gösterebilir.
Sadece bunun için endişeleniyorum.

 

Eh, dinamik lotizing ile ilgiliyse, her zaman basit bir dişli kutusu takabilirsiniz.

//Gearbox//
double Lots;
Balance= AccountInfoDouble ( ACCOUNT_BALANCE );

if (Balance> 10000 )
{Lots= 10 ; Print ( " Gear Two" );}
if (Balance> 100000 )
{Lots= 100 ; Print ( " Gear Three" );}
if (Balance> 1000000 )
{Lots= 1000 ; Print ( " Gear Four" );}
if (Balance> 10000000 )
{Lots= 10000 ; Print ( " Gear Five" );}

if (Balance< 10000000 )
{Lots= 1000 ; Print ( " Gear Four" );}
if (Balance< 1000000 )
{Lots= 100 ; Print ( " Gear Three" );}
if (Balance< 100000 )
{Lots= 10 ; Print ( " Gear Two" );}
if (Balance< 10000 )
{Lots= 1 ; Print ( " Gear One" );}
if (Balance> 1000000000 )
{Lots= 0 ;}
 

EA'mın bir kısmını sizinle paylaşmam gerekiyor, umarım beni daha net anlamanıza yardımcı olur.
Yani, bu iyi bir kod mu, yoksa ne olduğunu bilmem gerekiyor?

Lütfen bana iyi (açıkça) tavsiye veya yardım verin, şimdiden teşekkürler.

void OnChartEvent ( const int       id     , // Event ID
                   const long    & lparam , // Parameter of type long event
                   const double & dparam , // Parameter of type double event
                   const string & sparam   // Parameter of type string events
                  )
{

    _lotCalc();
     //-------Process Button---------------------------------------------------------|
     if ( sparam == _btnLotMinus )
    {
         ObjectSetInteger ( 0 , _btnLotMinus, OBJPROP_STATE , false );
        _lotSize -= _lotStep;

         if ( NormalizeDouble ( _lotSize, 2 ) <= 0 ) _lotSize = _lotMin;
        _calcUpdade( CALC_CHANGE_LOT );

         Print ( " | Lot:   " , _lotSize );
         return ;
    }   //---if Close
     //                          ...
}

double _lotCalc()
{
     //---
    _lotMin  = SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_MIN   );
    _lotMax  = SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_MAX   );
    _lotStep = SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_STEP );

     //---
     return ( NormalizeDouble ( _lotSize, 2 ) );
}
 
Max Enrik :

EA'mın bir kısmını sizinle paylaşmam gerekiyor, umarım beni daha net anlamanıza yardımcı olur.
Yani, bu iyi bir kod mu yoksa ne olduğunu bilmem gerekiyor?

Lütfen bana iyi (açıkça) tavsiye veya yardım verin, şimdiden teşekkürler.

Gece geç saatlerde, derlenmemiş, denenmemiş.

_lotSize'ı ilk nerede ayarladığınızı göremiyoruz... _lotSize öğesinin her zaman _lotStep'in katı olduğundan emin olmanız gerektiğini unutmayın.

IMHO, tüm lot hesaplamalarınızı OnChartEvent() ve _lotCalc() arasında bölmek yerine bir arada tutarsanız daha iyi olur. Min / maks / adımı kontrol eden ve artırma / eksiltmeyi yapan bir fonksiyon .

void OnChartEvent ( const int       id     , // Event ID
                   const long    & lparam , // Parameter of type long event
                   const double & dparam , // Parameter of type double event
                   const string & sparam   // Parameter of type string events
                  )
{
    _lotCalc();
     //-------Process Button---------------------------------------------------------|
     if ( sparam == _btnLotMinus )
    {
         ObjectSetInteger ( 0 , sparam , OBJPROP_STATE , false );
         _lotSize = fmax (_lotMin, _lotSize-_lotStep);
        _calcUpdade( CALC_CHANGE_LOT );
         printf ( " | Lot: %.2f  " , _lotSize );
         return ;
    }   //---if Close
     //                          ...
}

void _lotCalc()
{
     //---
    _lotMin  = SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_MIN   );
    _lotMax  = SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_MAX   );
    _lotStep = SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_STEP );

     //---
}
 
honest_knave :

Gece geç saatlerde, derlenmemiş, denenmemiş.
_lotSize'ı ilk nerede ayarladığınızı göremiyoruz... _lotSize öğesinin her zaman _lotStep'in katı olduğundan emin olmanız gerektiğini unutmayın.
IMHO, tüm lot hesaplamalarınızı OnChartEvent() ve _lotCalc() arasında bölmek yerine bir arada tutarsanız daha iyi olur. Min / maks / adımı kontrol eden ve artırma / eksiltmeyi yapan bir fonksiyon.

Bu bana çok yardımcı oldu, yani lotSize ve losStep sorunlarımı çözdü.
Çok teşekkürler dostum.

#Lot 0 (sıfır) & (çözülmüş Lot Büyüklüğü ve Lot Adımı sorunu arasında)- Kapalı

 

Evet lotSize kodunu unuttum, bu yüzden onu init işlevinde kullanıyorum.
_lotSize için iyi bir yer mi?

Teşekkürler!

int OnInit ()
{
    _pip = Point ;
     if ( Digits == 0 || Digits == 2 || Digits == 3 || Digits == 5 ) _pip = 10 * Point ;
    _lotSize = _lotValue * MarketInfo ( Symbol (), MODE_MINLOT );

     //...
}