Negatif Değer Döndüren Konum Boyutu

 

Stratejimde, konum boyutlarını hesaplamak için GetPosSize() işlevini kullanıyorum. Şu anda sadece EURUSD ile strateji kullanıyorum ve hayatım boyunca posSize'ın neden negatif bir değer döndürdüğünü ve bu da OrderSend hatası 4051 ile sonuçlandığını anlayamıyorum. Herhangi bir yardım çok takdir edilecektir. İlgili tüm kodları buraya göndereceğim. Kod boyunca posSize için başka hiçbir hesaplama yapılmaz, yalnızca işlev çağrılır. Üç ayrı kod parçası da fonksiyon içindedir.

 double GetPosSize( string symbol, double pipsToSL)
{
   double marginReq;
   double marginAllot = AccountBalance()/Number_of_Pairs;
   double posSize;
   int pairsOpen = OpenOrderCount();
   int pairsNotOpen = Number_of_Pairs - pairsOpen;
   if (symbol == "EURUSD" )
   {
      marginReq = 2600 ;
   }
 if (pairsOpen == 0 )
   {
      posSize = (marginAllot * (PercentRisk/ 100 )/pipsToSL) / 10 ;
   }
 NormalizeDouble (posSize, 2 );
   Print (posSize);
   return (posSize);
 

Negatif sayının nereden geldiğini daraltmak için marginAllot, PercentRisk ve pipToSL değerlerini yazdırmayı deneyin. Spekülatif tahminim, pipsToSL'nin belirli koşullar altında negatif bir sayı olarak geçirildiği yönünde.

 
  1. NormalizeDouble (posSize, 2 );
    Bu çizgi hiçbir şey yapmaz.
  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
 
honest_knave :

Negatif sayının nereden geldiğini daraltmak için marginAllot, PercentRisk ve pipToSL değerlerini yazdırmayı deneyin. Spekülatif tahminim, pipsToSL'nin belirli koşullar altında negatif bir sayı olarak geçirildiği yönünde.

Aslında kodun geri kalanında pipToSL'nin yanlış olarak negatif olarak hesaplandığı bazı yerler bulabildim. Teşekkürler.

WHRoeder :
  1. Bu çizgi hiçbir şey yapmaz.
  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

Daha önce bununla ilgili gönderilerinizi okudum, ancak son bağlantınıza kadar amacınızı anlamadım. Teşekkürler.

 

MathRound() kullanıyorsam neden hala birden çok ondalık basamağa yanıt alıyorum? DoubleToString kullanmayı denedim ama bu hiç yardımcı olmadı. Bu tamamen Print()'in sınırlamalarından mı kaynaklanıyor yoksa yanlış olan başka bir şey mi var?

posSize = posSize * 10 ;
MathRound (posSize);
posSize = posSize / 10 ;
 
NoLimitations : MathRound() kullanıyorsam neden birden fazla ondalık basamağa yanıt alıyorum?
MathRound bir çift döndürür; sonsuz sayıda ondalık basamak.
 
WHRoeder :
NoLimitations : MathRound() kullanıyorsam neden birden fazla ondalık basamağa yanıt alıyorum?
MathRound bir çift döndürür; sonsuz sayıda ondalık basamak.

Bunun için doc sayfasına göre değil. https://docs.mql4.com/math/mathround

" Dönüş Değeri

Değer, en yakın tam sayıya yuvarlanır."

Yapması gerekiyorsa ama yapmıyorsa, MQ'ya bilgi verilmesi veya işleve bir uyarı etiketi koymaları gerekir.

 
JD4 haklı, doküman sayfası en yakın tam sayıya yuvarlandığını söylüyor. Belirli sayıda ondalık basamağı yuvarlamadan veya kesmeden yukarıda yapmaya çalıştığım şeyi başarmanın başka bir yolundan emin değilim. Tam sayı döndürmezlerse MathRound() veya round()'un anlamı ne olurdu?
 
NoLimitations :
JD4 haklı, belge sayfası en yakın tam sayıya yuvarlandığını söylüyor. Belirli sayıda ondalık basamağı yuvarlamadan veya kesmeden yukarıda yapmaya çalıştığım şeyi başarmanın başka bir yolundan emin değilim. Tam sayı döndürmezlerse MathRound() veya round()'un anlamı ne olurdu?
MathRound'un nöbet geçirdiğini söyledin. Sadece round() için önerilen alternatifi denediniz mi?
 
Evet, round(); tamamen aynı değerlerle sonuçlandı. Değeri daha az doğru bir şekilde hesaplamak ve şu an için sorunu aşmak için MathFloor() veya MathCeil()'i kullanmaya çalıştım, ancak ikisi de görünüşte hiçbir şey yapmıyor. Ben sadece lanet olası bir çifti int hahaha'ya çevirmek istiyorum
 

Ayrıca bunu boşuna kullanmayı denedim. Muhtemelen DTS, gerçek değeri değil, görünüm için bir değerin doğruluğunu değiştirir mi? Başka seçenek göremiyorum.

posSize = posSize * 100 ;
DoubleToString (posSize,0);
StringToDouble (posSize);
posSize = posSize / 100 ;