Hatalar, hatalar, sorular - sayfa 443

 
voix_kas :

Sonuç:

Ya yanlış bir şey yapıyorum (lütfen beni düzeltin) ya da saygıdeğer MetaDriver teoride bir hata yaptı (algoritmayı tasarlarken).

:)

Algoritmanın "tasarımının" yaklaşık 3 dakika (ve uygulanması 7 dakika) sürdüğü gerçeği göz önüne alındığında, iyi bir iş çıkardım :) Amaç, çalışan bir fikir göstermek ve problem ifadesini netleştirmekti.

Ve sonunda tüm bunların faydalı olduğu ortaya çıktı - geliştiricilerin MathFloor () işlevini akla getirmek için gerçek bir nedenleri vardı - açıkçası her şey tamamen uygulanmadı.

Sonunda, devam etmek zorunda kaldım. Eğlenceliydi. Kararlı bir işlev (CountSignedDigits(double x) hakkında konuşuyorum) ancak neredeyse bir saatlik deneylerden sonra elde edildi.

Ve sonra - şimdi bile tüm girdi değerleri için tam olarak neyin işe yarayacağından emin değilim. Otomatik stres testi geliştirmedim, manuel olarak yaptım. Lütfen test edin.

Kayan noktadan sonra 10 ondalık basamağa kadar kararlı çalışma bekliyorum.

 int CountSignedDigits( double x)
{
   for ( int i= 0 ; i< 1000 ; i++,x*= 10 )
  {
     if (x- MathFloor (x+ 0.000000000005 )< double ( 0.000000000005 )) return i;
  }
   return - 1 ;
}
Stres testi eklendi. // Bazı ara uygulamaları koddan kaldırmadı. Denemek / yansıtmak için yorumlarda kaldı. Geliştiriciler dahil.
Dosyalar:
 
komposter :
1. Parti için dig tanımlamanıza gerek yoktur, sadece istenen adıma göre normalize edin:

2. Bir ticaret talebinin transferi sırasında lot değişkenine (onbirinci ondalık basamakta) çöp girse bile, terminalin kendisi tarafından filtrelenmesi gerekecektir.

3. En azından, bu tasarımı kullandığım birkaç yıldır herhangi bir sorun yaşamadım.

4. Ve güvenli oynamak istiyorsanız, normalleştirmeyi 8. (bir kenar boşluğu ile) ondalık basamağa kadar yapıştırabilirsiniz - "doğru" normalleştirme çöpünden sonra ortaya çıkarsa, o zaman çok daha fazla olacaktır.

İlk fikir doğru, gerisi şüpheli. :)

Uygulama, uygulama için çalışıyor, ancak "sorun başlatıcı" (c) tarafından tanımlanan yapay koşullar için yanlış. Ayrık adımlar için lot_min'e göre değil, sıfıra göre üretir. :)

Ancak, fark ederseniz düzeltmek kolaydır.

 double komposterNormalizeLot( double lot, double lot_step, double lot_min, double lot_max)
{
   lot = NormalizeDouble ( lot / lot_step, 0 ) * lot_step;
   if ( lot < lot_min ) lot = lot_min;
   if ( lot > lot_max ) lot = lot_max;
   return lot;
}
double metadriverNormalizeLot( double lot, double lot_step, double lot_min, double lot_max)
{
   lot = NormalizeDouble ((lot-lot_min) / lot_step, 0 ) * lot_step + lot_min;
   if ( lot > lot_max ) lot = lot_max;
   return lot;
}

// Bu incilerden tüm bunları çok ciddiye almamalarını istiyorum. Açıklamalar beyin eğitimi için tamamen teoriktir, çünkü pratikte lot_step'in örneğin 0.0231'e eşit olduğunu hiç görmedim....

;)

 
metadriverNormalizeLot

seçenek doğru. NL()'mde olduğu gibi lot_min için doğru bir şekilde hesaplandı.

 

Bir yığın seçeneğim. Lütfen bazı enstrümanlar için fiyat değişikliği adımının bir noktadan daha fazla olduğunu unutmayın.

 //---------------------------------------------------------------------
//  Нормализация цены:
//---------------------------------------------------------------------
double
NormalizePrice( string _symbol, double _org_price )
{
   double   norm_price = _org_price;

   double   min_price_step = NormalizeDouble ( current_tick_size / current_point, 0 );

  norm_price = NormalizeDouble ( NormalizeDouble (( NormalizeDouble ( _org_price / current_point, 0 )) / min_price_step, 0 ) * min_price_step * current_point, current_digits );

   return ( norm_price );
}

//---------------------------------------------------------------------
//  Вычисление лота:
//---------------------------------------------------------------------
double
NormalizeLot( double _required_lot )
{
   double         lot, k;

   if ( current_min_lot_step > 0 )
  {
    k = 1.0 / current_min_lot_step;
  }
   else
  {
    k = 1.0 / current_min_permitted_lot;
  }

  lot = MathFloor ( _required_lot * k ) / k;

   if ( lot < current_min_permitted_lot )
  {
   lot = current_min_permitted_lot;
  }

   if ( lot > current_max_permitted_lot )
  {
    lot = current_max_permitted_lot;
  }

  lot = NormalizeDouble ( lot, 2 );
   return ( lot );
}
 

Adımların sıfırdan değil, minimum lottan "gittiğini" bir aksiyom olarak alırsak, doğru algoritma aşağıdaki gibidir:

 double voixkasNormalizeLot( double lot, double lot_step, double lot_min, double lot_max)
{
  if ( lot < lot_min ) lot = lot_min;
   else lot = NormalizeDouble ((lot-lot_min) / lot_step, 0 ) * lot_step + lot_min;

   if ( lot > lot_max ) lot = lot_max;
   return NormalizeDouble (Lot, 8 );
}

Composter versiyonunda adımlar sıfırdan "gidiyor". Ki bu bana doğru gelmiyor.
MetaDriver türevinde kod, negatif değeri atlar. =P

 
voix_kas :
...

MetaDriver türevinde kod, negatif değeri atlar. =P

:)) ..... Eh işte! Evet, vapche sizin için çalışmayacak !! ;-P ;-b ;-P

 double voixkasNormalizeLot( double lot, double lot_step, double lot_min, double lot_max)
{
   if ( lot < lot_min ) lot = lot_min;
   else lot = NormalizeDouble ((lot-lot_min) / lot_step, 0 ) * lot_step + lot_min;

   if ( lot > lot_max ) lot = lot_max;
   return NormalizeDouble ( L ot , 8 );
}

Eh, o zaman, o zaman en kısa ve aynı zamanda "kesin gibi" seçeneği şudur:

 double mdNormalizeLot( double lot, double lot_step, double lot_min, double lot_max)
{
  lot = MathMin (lot, lot_min);
  lot = NormalizeDouble ((lot-lot_min) / lot_step, 0 ) * lot_step + lot_min;
   return NormalizeDouble ( MathMin (lot, lot_max), MathMax (CountSignedDigits(lot_min),CountSignedDigits(lot_step));
}

Ve bu, lot_step , lot_min ve lot_max'ın geçersizliğini ve olumsuzluğunu kontrol etmeden yapılır !!......

:))))

 

Yyy ... bir sinire dokundu. :)) Bir forum gönderisindeki manuel kuralların son satırı, bu yüzden affedilebilir. =)
Bu arada, kodunuz da derlenmiyor (son satırdaki kapanış parantezini unuttum). :-R
Ayrıca 2-3 kat daha yavaş çalışıyor (şimdi senaryoda ölçtüm) ve kontrolün kalitesi aynı. :-R

Genel olarak, anlamlı en az anlamlı basamağı belirlemek için yetkili bir kod olmamasına rağmen, Composter'ın tavsiyesini kullanacağım: hacmi 8. ondalık basamağa normalleştirin.
Umarım tuzaklar yoktur.

Yardımlarınız için hepinize teşekkür ederim.

 

gördüğüm kadarıyla komiksiniz.

ilk mesajında NL() vermiş, daha sonra sadece iki sayfa alabilmişsiniz;)

 

Guruya bir soru daha vardı. Çok para birimli bir ticaret platformunu test ederken hatalar meydana geliyor (ekran görüntüsü ekli).
Cevabını aldığım bir ticaret operasyonu yapmaya çalışıyorum: fiyat yok. Test cihazı, bu çift için fiyatların 2011.01.03 01 :00:00'da gelmeye başladığını gösterirken, bu hatayı gidermek için EURUSD de 2011.01.03 00:00:00'dan alıntılanıyor mu?

Hatalı ekran görüntüsü

 
voix_kas :

Guruya bir soru daha vardı. Çok para birimli bir ticaret platformunu test ederken hatalar meydana geliyor (ekran görüntüsü ekli).
Cevabını aldığım bir ticaret operasyonu yapmaya çalışıyorum: fiyat yok. Test cihazı, bu çift için fiyatların 2011.01.03 01 :00:00'da gelmeye başladığını, EURUSD de 2011.01.03 00:00:00'dan alıntılandığını gösteriyor bu hata nasıl aşılır?

Alım satım ve kotasyon oturumları sorunu çözmeye yardımcı olmayacak mı?