Zero Divide (Sorunu buldum - ama neden?) - sayfa 2

 
RaptorUK :

Bu basit sorunu çözmek için günlerinizi harcamak istiyorsanız, elbette çekinmeyin. . . . yapmazdım.

Sırt testiniz sırasında ne zaman olduğunu biliyorsanız, bulmak kolaydır. . . Geri teste, olduğu tarihten bir gün önce başlayın. . . tam olarak, ne zaman olacağını dakikasına öğrenin. . . kodunuzdaki tüm bölümler için. . . evet, hepsi, böleni yazdıran bölümü ve söz konusu kod satırına bir referansı içeren satırın önüne bir Print() ekleyin. . .

Örneğin:

Kodunuz sıfıra bölme hatasıyla sona erdiğinde, günlük dosyasını kontrol edin ve son birkaç baskıda, hatayı üreten kod satırını ve hangi değişkenin sıfıra ayarlandığını gösteren baskı olacaktır. . .

. . . daha akıllı çalışmayı öğrenin ve sorunlarınızı mantıklı ve verimli bir şekilde araştırın.


Bununla nasıl başa çıkacağım konusunda bana yardım ettiğiniz ve bana doğru yönde işaret ettiğiniz için teşekkür ederiz! Sorunu buldum (uzun bir süre sonra her yerde baskıları tokatlarken!)

Aslında, komisyoncumun (ILQ) kavramsal bir besleme kullanması ve bu forumun bir üyesinin bu konudaki yardımından kaynaklanıyor. Özetle bu aşağıdaki koddur - ILQ ile 1 birim kadar düşük işlem yapabilirsiniz. MT4 işlem penceresinde istediğiniz kesin birim boyutunu (yani 0.01 || 874 birim) koyabilirsiniz.

Oku koyduğum yerde bu formülün hangi kısmının yanlış gittiğini anlamama yardım edebilir misiniz? Baktığım yerden matematik iyi görünüyor?

 //+------------------------------------------------------------------+
//| Order Enter Function                                             |
//+------------------------------------------------------------------+
void OrderEntry( int direction)
{
   //Padding for the stop and padding for the entry too. 
   double ATR_Pad = iATR ( NULL , 60 , 14 , 1 )/ 2 ;
       if (ATR_Pad == 0.0 ) Print ( " ATR_Pad = " , ATR_Pad); 
   double Buy_Pad = NormalizeDouble (ATR_Pad, Digits );
   double Sell_Pad = NormalizeDouble (ATR_Pad, Digits );
   
   //Get Highest Price in our lookback range and set buy price above it.
   int iTBT = iBarShift( NULL , 60 , triggerBarTime, true ),
   iHH = iHighest( NULL , 60 , MODE_HIGH, iTBT + CandlesBeforeBiasObtained, 0 );
   double Buy_Here = High[iHH] + Buy_Pad;
   double buyPrice= NormalizeDouble (Buy_Here, Digits );

   //Get Lowest Price in our lookback range and set sell price below it.
   int iTBT_1 = iBarShift( NULL , 60 , triggerBarTime, true ),
   iLL = iLowest( NULL , 60 , MODE_LOW, iTBT_1 + CandlesBeforeBiasObtained, 0 );
   double Sell_Here =Low[iLL] - Sell_Pad;
   double sellPrice = NormalizeDouble (Sell_Here, Digits );
   
   //Stop calculations.    
   double ATR = iATR ( NULL , 60 , 14 , 1 );
   double MA = iMA ( NULL , 60 ,MA_Period, 0 , 1 , 0 , 1 );
   double BuyStopPriceMath = MA - ATR;
   double SellStopPriceMath = MA + ATR;
   double BuyStopPrice = NormalizeDouble (BuyStopPriceMath, Digits );
   double SellStopPrice = NormalizeDouble (SellStopPriceMath, Digits );

   //get our buystop price from below the ma and our takeprofit based on our r:r ratio.
   double pips_to_bsl = buyPrice-BuyStopPrice;
   double buy_tp_price=(pips_to_bsl*RewardRatio)+buyPrice;
   double buy_takeprofit_price= NormalizeDouble (buy_tp_price, Digits );

   //get our sellstop price from below the ma and our takeprofit based on our r:r ratio.
   double pips_to_ssl=SellStopPrice-sellPrice;
   double sell_tp_price=sellPrice-(pips_to_ssl*RewardRatio);
   double sell_takeprofit_price= NormalizeDouble (sell_tp_price, Digits );
   
   //Lot calculation - Facilitates Notional and Lots within MT4 - As well as find the tick value relative to the account denomination.   
   double risk_amount = AccountEquity( )*RiskPercent/ 100 ;
       if ( risk_amount == 0.0 ) Print ( " risk_amount = " , risk_amount);
   double Lot_Step = MarketInfo( Symbol (), MODE_LOTSTEP);
   double ts = MarketInfo( Symbol (), MODE_TICKSIZE);
   double tv = MarketInfo( Symbol (), MODE_TICKVALUE);
   double minlot = MarketInfo( Symbol (), MODE_MINLOT);
         
   double loss_for_1_lot = pips_to_bsl/ ts * tv ; //<<<<<<<<<<<<<<<<<<<<<<<<<<< This is giving me a "0" randomly sometimes?
       if ( loss_for_1_lot == 0.0 ) Print ( " loss_for_1_lot = " , loss_for_1_lot);
   //Alert(loss_for_1_lot);
   double LotSize_Buy = MathFloor ( risk_amount / loss_for_1_lot/ Lot_Step) * Lot_Step ;
       if ( LotSize_Buy == 0.0 ) Print ( " LotSize_Buy = " , LotSize_Buy);
   //Alert(LotSize_Buy);
      
   double loss_for_1_lot1 = pips_to_ssl/ ts * tv ;   //<<<<<<<<<<<<<<<<<<<<<<<<<<< This is giving me a "0" randomly sometimes?
       if ( loss_for_1_lot1 == 0.0 ) Print ( " loss_for_1_lot1 = " , loss_for_1_lot1);
   //Alert(loss_for_1_lot1);
   double LotSize_Sell = MathFloor ( risk_amount / loss_for_1_lot1/ Lot_Step) * Lot_Step ;
       if ( LotSize_Sell == 0.0 ) Print ( " LotSize_Sell = " , LotSize_Sell);
   //Alert(LotSize_Sell);
 
DomGilberto :


Bununla nasıl başa çıkacağım konusunda bana yardım ettiğiniz ve bana doğru yönde işaret ettiğiniz için teşekkür ederiz! Sorunu buldum (her yere baskıları tokatlarken uzun süre harcadıktan sonra!)

Aslında, komisyoncumun (ILQ) kavramsal bir besleme kullanması ve bu forumun bir üyesinin bu konudaki yardımından kaynaklanıyor. Özetle bu aşağıdaki koddur - ILQ ile 1 birim kadar düşük işlem yapabilirsiniz. MT4 işlem penceresinde istediğiniz kesin birim boyutunu (yani 0.01 || 874 birim) koyabilirsiniz.

Oku koyduğum yerde bu formülün hangi kısmının yanlış gittiğini anlamama yardım edebilir misiniz? Baktığım yerden matematik iyi görünüyor?

Tamam, alternatif parti büyüklüğü hesaplamasıyla ilgili diğer konunuzu kısaca okudum, ancak yeterince ayrıntılı değil, ancak genel olarak bu sorunu çözmek için yapabileceğim şey bu. . .

Soruna neden olan nedir? ts? televizyon ? ya da her ikisi de ? herhangi biri 0.0 ise, o zaman ts ve tv'nin çarpımı 0.0 olacaktır. . . bt yalnızca biri ara sıra 0.0 olarak döndürülüyorsa, sorunu yalnızca biriyle çözmeniz gerekir. . .


TickSize değişmeyecek (bildiğim kadarıyla). . . okumaya devam etmenize gerek yok, init() içinde okuyun, ancak döndürülen 0.0 değeri almadığınızı kontrol edin veya isterseniz okumaya devam edin, ancak yalnızca 0.0 değilse döndürülenleri kullanın.

TickValue değişebilir, ancak asla 0.0 olmamalıdır, bu yüzden okursanız ve 0.0 ise, değerini güncellemeyin. . . veya tekrar deneyin ve ardından güncelleyin.

Bu roket bilimi değil . . .

 

Bunu neden sormaya devam etmen gerektiğini anlamıyorum, basit sağduyu sana Raptor'un az önce söylediğini yapmanı söylemeli. Bu ortaya çıkarsa, sorun ts*tv değil, bölücü olarak kullanılan diğer tüm değişkenleri yazdırın.

 

@SDC - Bunu zaten yaptım lol? Nereden geldiğini zaten belirledim, tek söylediğim, parti boyutlandırma formülünün bana iyi göründüğü ve bir şeyleri gözden kaçırıp kaçırmadığımı görmek için kodu gönderdim.

Kodda, neyin "0" veya sıfır bölme yazdırdığını belirten "<<<<" olduğunu fark edeceksiniz ....

@ RaptorUK - teşekkürler dostum, bunu kırdığın için teşekkür ederim. Sanırım söylediklerinizi nasıl çözeceğimi biliyorum - birazdan onunla oynayacağım ve sorunun çözüldüğünü onaylamak için geri bildireceğim :)

 
Tamam, "0" döndüren "TickValue".

"Statik çift tv = 0;" kullanmayı denedim ve ardından "int init" içinde onay değerini atamak ve ardından "tv==0" ise her yeni H1 mumunda bu statik çifti güncelleyin, ancak yine de "0"dan yüksek bir şey üretmeyecek mi? Söz konusu döviz çifti GBPJPY'dir (Bunun tamamı Strateji Test Aracı'ndadır )

Yavaş davranıyorsam özür dilerim...?
 
DomGilberto :
Tamam, "0" döndüren "TickValue".

"Statik çift tv = 0;" kullanmayı denedim ve ardından "int init" içinde onay değerini atamak ve ardından "tv==0" ise her yeni H1 mumunda bu statik çifti güncelleyin, ancak yine de "0"dan yüksek bir şey üretmeyecek mi? Söz konusu döviz çifti GBPJPY'dir (Bunun tamamı Strateji Test Aracı'ndadır)

Yavaş davranıyorsam özür dilerim...?
TICKVALUE 0.0 gibi yanlış bir değer döndürdüyse, tv değerini neden güncelleyesiniz? tv'yi yalnızca TICKVALUE sıfırdan farklı bir değer döndürürse güncellemelisiniz. . .
 

Üzgünüm, temelde her iki yolu da denediğimi söylemek istedim. Bu yüzden sadece "tv = MarketInfo(Symbol(), MODE_TICKVALUE);" yapmayı denedim. "int init" bölümünde... (ve "static double tv = 0;")

Temelde kene değeri her zaman "0" mı? (Elbette benim için yazdırdım!)

Aynı şekilde, EURUSD'de geriye dönük teste geçtiğimde, onay değeri de bana "0" diyor, ancak 2001-2013 arası sıfır bölme hatası olmadan tüm geriye dönük testi başarıyla çalıştırmayı başarıyor?

GÜNCELLEME: Bu yüzden, çok temelli beslemeye sahip canlı piyasalarda normal bir komisyoncu üzerinde bir test yaptım ve onay değeri > 0 rakamı döndürüyordu. Ancak, aynı betiği aynı canlı piyasa komisyoncusuna bıraktığımda kavramsal besleme, onay değeri "0" olarak mı döndürüldü? Kavramsal besleme seçeneğini kullanırken (1 birim kadar düşük ticaret) bu parti boyutlandırma hatasını nasıl aştığım hakkında bir fikriniz var mı?

 
DomGilberto :

Üzgünüm, temelde her iki yolu da denediğimi söylemek istedim. Bu yüzden sadece "tv = MarketInfo(Symbol(), MODE_TICKVALUE);" yapmayı denedim. "int init" bölümünde... (ve "static double tv = 0;")

Temelde kene değeri her zaman "0" mı? (Elbette benim için yazdırdım!)

Aynı şekilde, EURUSD'de geriye dönük teste geçtiğimde, onay değeri de bana "0" diyor, ancak 2001-2013 arası sıfır bölme hatası olmadan tüm geriye dönük testi başarıyla çalıştırmayı başarıyor?

Göstermiş olduğunuz koddan. . . gösterdiğiniz işlevi çağırmadığınız sürece bu mümkün değildir. . .

   double ts = MarketInfo( Symbol (), MODE_TICKSIZE);
   double tv = MarketInfo( Symbol (), MODE_TICKVALUE);
   double minlot = MarketInfo( Symbol (), MODE_MINLOT);
         
   double loss_for_1_lot = pips_to_bsl/ ts * tv ;

TICKVALUE her zaman 0.0 ise tv 0.0'dır, yani ts * tv = 0.0 yani her zaman sıfıra bölme hatası alırsınız. . .

Terminaliniz Broker'ınıza bağlı mı? yoksa bağlantısız olarak mı çalışıyorsunuz?

 

Yaptığım bu videonun (40 saniye kadar) neden bahsettiğimi gösterdiğini umuyorum (açıklayıp açıklamadığımdan emin değilim).

Video: http://screencast.com/t/uMHY5DpM

Senaryoyu canlı grafiğe (gerçek hesap) bıraktığımda ilk kısımda, tik değeri ve kene boyutunun lot penceresinde (birimler) gösterdiğim o "kavramsal hesap"ta "0" döndürdüğünü göreceksiniz.

İkinci kısım aynı broker ile ama lot bazlı feed'de ve bu sefer bir tick değeri ve tick boyutu döndürüyor. Yine lot kullanarak işlem yaptığınızı gösteriyorum....

Dolayısıyla strateji test cihazıyla ilgili olarak, neden çalıştığı ve bazen çalışmadığı hakkında hiçbir fikrim yok. Ben de geriye dönük testleri çalıştırırken hesap bağlandı (bir demo kavramsal beslenen hesapta (birimler)).

Bir sonraki sorum şu olurdu, eğer bu kavramsal federal hesaptan alacağım tipik yanıt buysa, bu durumda pozisyon boyutlandırma hesaplamamı nasıl düzeltebileceğimi önerebilir misiniz? Çok temelli bir besleme için mükemmel çalışıyor... Bunu biraz daha iyi açıklar mı?

 
DomGilberto :
Tamam, "0" döndüren "TickValue".

"Statik çift tv = 0;" kullanmayı denedim ve ardından "int init" içinde onay değerini atamak ve ardından "tv==0" ise her yeni H1 mumunda bu statik çifti güncelleyin, ancak yine de "0"dan yüksek bir şey üretmeyecek mi? Söz konusu döviz çifti GBPJPY'dir (Bunun tamamı Strateji Test Aracı'ndadır)

Yavaş davranıyorsam özür dilerim...?


TickValue'u nasıl yazdırıyorsunuz?

GBPJPY'deki Rakamlar genellikle 3 olduğundan, yeterli ondalık basamak olmadığından TickValue'nin sıfır yazdırıyor olması oldukça olasıdır.

Kesinlikle emin olmak için, basılan ondalık sayıları genişletmek bir fikir olabilir.

DoubleToStr(MarketInfo( Symbol (),MODE_TICKVALUE), 8 )

Bunu not et

 double loss_for_1_lot = pips_to_bsl/ ts * tv ; //<<<<<<<<<<<<<<<<<<<<<<<<<<< This is giving me a "0" randomly sometimes?

pips_to_bsl sıfırsa da sıfırla sonuçlanır. Mümkün mü?