MT sürümlerinin arşivi. - sayfa 2

 
Сергей Таболин :

Zihinsel olarak , aktarımın kodun geri kalanını çalıştırmadan hemen yapılması gerektiği varsayılır. Böyle?

Aslında, TesterStop() testi hiç durdurmaz!

Zihne göre, kodun daha fazla yürütülmesini durdurmanız gerekirse, sadece return yazmanız yeterlidir ve devamı olmayacaktır. Ve TesterStop() ve ExpertRemove()

ExpertRemove() işlevi çağrıldığında Expert Advisor hemen durdurulmaz, Expert Advisor'ı durdurmak için yalnızca bir bayrak ayarlanır . Yani, Expert Advisor artık herhangi bir sonraki olayı işlemeyecek ve OnDeinit() çağrılacak ve kaldırılacak ve grafikten kaldırılacaktır.

Ve ikinci fark edilen söve şu ki

 tester_stop = false ;

tamamen yersiz.

 
Alexey Viktorov :

Zihne göre, kodun daha fazla yürütülmesini durdurmanız gerekirse, sadece return yazmanız yeterlidir ve devamı olmayacaktır. Ve TesterStop() ve ExpertRemove()

Ve ikinci fark edilen söve şu ki

tamamen yersiz.

Bir sonraki olay OnTick() ?

OnTick()'ten nereden çıkabilirsiniz?

Neden yerinde değil? TesterStop() çalışırsa , yürütmenin bu satıra ulaşmaması bekleniyordu.

 
Сергей Таболин :

Bir sonraki olay OnTick() ?

OnTick()'ten nereden çıkabilirsiniz?

Neden yerinde değil? TesterStop() çalışırsa, yürütmenin bu satıra ulaşmaması bekleniyordu.

Nereye gidileceği ve neye devam edileceği geliştiricinin işidir.

       if ((stop_loss_buy > 0 && stop_loss_buy < 700 ) || (stop_loss_sell > 0 && stop_loss_sell < 700 ))
      {
         Print ( "Результат в OnTester() должен быть -99999999999.99" );
         TesterStop ();
      }
      check_init  = true ;
       tester_stop = false ;

Bu kodda, TesterStop() 'un yürütülüp yürütülmediğinden bağımsız olarak tester_stop bayrağı false olarak ayarlanacaktır.

 
Alexey Viktorov :

Nereye gidileceği ve neye devam edileceği geliştiricinin işidir.

Bu kodda, TesterStop()'un yürütülüp yürütülmediğinden bağımsız olarak tester_stop bayrağı false olarak ayarlanacaktır.

Yani ben zaten bunu anladım)))

Soru şu - ne yapmalı? Test nasıl durdurulur? özellikle. Geliştiriciler, OnInit'te () INIT_PARAMETERS_INCORRECT kullanırsanız neredeyse yemin eder ve bu, genetiği omuz bıçaklarına koyar.

Bir çözüm bulundu, yakın zamana kadar hiçbir sorun yoktu. Ve şimdi ... sadece korkunç)))

Yine de OnTick()'ten nereden çıkabilirsiniz?

 
Сергей Таболин :

Yani ben zaten bunu anladım)))

Soru şu - ne yapmalı? Test nasıl durdurulur? özellikle. Geliştiriciler, OnInit'te () INIT_PARAMETERS_INCORRECT kullanırsanız neredeyse yemin eder ve bu, genetiği omuz bıçaklarına koyar.

Bir çıkış yolu buldum, ancak son kez sorun yoktu. Ve şimdi ... sadece korkunç)))

Peki, sorunun ne olduğunu anlarsan?

         TesterStop ();
      tester_stop = false ;
       return ;

TesterStop yürütüldükten sonra tüm kodlar yürütülmez. Yani, işin derhal durdurulması sağlanacaktır. Ayrıca, tester_stop bayrağına odaklanarak ayarlamak zaten mümkündür ...

Ve başka bir soru: Ne tür bir sayı buldunuz? Eksi bir sürü dokuz, nedir bu? Fazladan hemorajik olmaya mı çalışıyorsun? Burası gerçekten korkutucu hale geldiği yer...

 
Alexey Viktorov :

Peki, sorunun ne olduğunu anlarsan?

TesterStop yürütüldükten sonra tüm kodlar yürütülmez. Yani, işin derhal durdurulması sağlanacaktır. Ayrıca, tester_stop bayrağına odaklanarak ayarlamak zaten mümkündür ...

Ve başka bir soru: Ne tür bir sayı buldunuz? Eksi bir sürü dokuz, nedir bu? Fazladan hemorajik olmaya mı çalışıyorsun? Burası gerçekten korkutucu hale geldiği yer...

Eksi bir sürü dokuz - bu, çıkışın tam olarak TesterStop () tarafından yapıldığını belirlemek içindir. Bunu yalnızca INIT_PARAMETERS_INCORRECT yerine kullanıyorum. Bu nedenle, ondan sonraki her şey gerekli değildir. Ve şimdi tüm kodun yürütüldüğü ve bir sıfıra bölme hatasının ortaya çıktığı ortaya çıktı. Doğal olarak, dizinin boyutu 1 ise, ikincisinin değeri eksi birincisinin değeri her zaman sıfır olacaktır! Ve bu pervazdan , ah, üzgünüm, yanlış anlaşılmalara karşı sigortalı değildim.

İade eklemeye çalıştım ... Sadece biraz yanlış yerde))):

       if ((stop_loss_buy > 0 && stop_loss_buy < 700 ) || (stop_loss_sell > 0 && stop_loss_sell < 700 ))
      {
         Print ("Результат в OnTester () должен быть - 99999999999.99 ");
         TesterStop ();
         return ;
      }

Sonunda:

DM       0        15 : 32 : 01.518     Core 1    2016.10 . 01 00 : 00 : 00    153128312914612747
PE       0        15 : 32 : 01.518     Core 1    2016.10 . 01 00 : 00 : 00    Советник получил MAGIC = 153128312914612747 .
IF       0        15 : 32 : 01.518     Core 1    2016.10 . 03 00 : 00 : 00    Результат в OnTester () должен быть - 99999999999.99
RS       3        15 : 32 : 01.518     Core 1    TesterStop () called on 0 % of testing interval
GK       0        15 : 32 : 01.518     Core 1    final balance 10000.00 USD
JM       0        15 : 32 : 01.518     Core 1    OnTester result - 99999999999.99001

sadece çıldırmak)))

Büyük bir TEŞEKKÜR EDERİM!!!

 
Сергей Таболин :

Eksi bir sürü dokuz - bu, çıkışın tam olarak TesterStop () tarafından yapıldığını belirlemek içindir. Bunu yalnızca INIT_PARAMETERS_INCORRECT yerine kullanıyorum. Bu nedenle, ondan sonraki her şey gerekli değildir. Ve şimdi tüm kodun yürütüldüğü ve bir sıfıra bölme hatasının ortaya çıktığı ortaya çıktı. Doğal olarak, dizinin boyutu 1 ise, ikincisinin değeri eksi birincisinin değeri her zaman sıfır olacaktır! Ve bu pervazdan , ah, üzgünüm, yanlış anlaşılmalara karşı sigortalı değildim.

İade eklemeye çalıştım ... Sadece biraz yanlış yerde))):

Sonunda:

sadece çıldırmak)))

Büyük bir TEŞEKKÜR EDERİM!!!

Sergey Tabin :

Teşekkürler, anladım zaten. Ama bu sorunu çözmez. MQL_TESTER_STOP sabiti veya dönüşü void'den bool'a değiştirerek çözülebilir.

Beklenmedik bir karar Alexey Viktorov tarafından önerildi. TesterStop()'tan sonra dönüşü kullanırsanız, her şey normale dönmüş gibi görünüyor. Bu kişisel olarak nasıl ve neden oluyor, yetişemiyorum ... Yine de ...

Buradan, bu noktayı belgelere ekleyin veya void'i bool olarak değiştirin.

not 2085'te bu sorunla karşılaştım. Ondan önce hiçbir sorun yoktu. Bana göre bu bir şey ifade ediyor mu? )))

Sergey, bunda beklenmedik bir şey yok. Aksine, her şey doğal ve tutarlıdır. Farklı durumlar var. Bazen danışman bitmeden olayın işlenmesini tamamlamak gerekir, bazen de sizin durumunuzda olduğu gibi acilen tamamlamanız gerekir. Bu nedenle, geliştiricilerin önünde, yapılacak doğru şeyin ne olduğu, kesin olarak kesintiye uğratılması, yürütmeyi tamamlaması gerekenlerden memnuniyetsizlik alması veya olay işlemenin tamamlanmasından sonra durması sorusu ortaya çıkıyor. Aynı zamanda, herhangi bir programcının cephaneliğinde bir geri dönüş ifadesi vardır ve zorla sonlandırılan hiçbir şey yoktur.

Ve void türünü hangi amaçla bool olarak değiştirmeniz gerekiyordu, çünkü yine programcının cephaneliğinde TesterStop()'tan önce veya sonra değiştirilebilen statik değişkenler var ve prensipte her şey istediğiniz gibi olacak. Ve nedense onu örneğimden attın.

 
Alexey Viktorov :

Sergey, bunda beklenmedik bir şey yok. Aksine, her şey doğal ve tutarlıdır. Farklı durumlar var. Bazen danışman bitmeden olayın işlenmesini tamamlamak gerekir, bazen de sizin durumunuzda olduğu gibi acilen tamamlamanız gerekir. Bu nedenle, geliştiricilerin önünde, yapılacak doğru şeyin ne olduğu, kesin olarak kesintiye uğratılması, yürütmeyi tamamlaması gerekenlerden memnuniyetsizlik alması veya olay işlemenin tamamlanmasından sonra durması sorusu ortaya çıkıyor. Aynı zamanda, herhangi bir programcının cephaneliğinde bir geri dönüş ifadesi vardır ve zorla sonlandırılan hiçbir şey yoktur.

Ve void türünü hangi amaçla bool olarak değiştirmeniz gerekiyordu, çünkü yine programcının cephaneliğinde TesterStop()'tan önce veya sonra değiştirilebilen statik değişkenler var ve prensipte her şey istediğiniz gibi olacak. Ve nedense onu örneğimden attın.

Alex, yardımın için çok teşekkür ederim.

Geliştiricilerin karşılaştığı soruyu anlıyorum, bu yüzden böyle bir çözüm öneriyorum. Duruma uygun şekilde cevap verebilmek için.

Statik değişkenlere ve "attığım" örneğinize gelince ... Üzgünüm, ama ne hakkında olduğunu tam olarak anlamıyorum. Sakıncası yoksa açıkla.

Ve biraz hoşgörü ve sabır istiyorum. Şimdi çok kötü bir yaşam durumum var, çünkü çok sinirliyim (bunu anlıyorum ama şu ana kadar bu konuda hiçbir şey yapamam) ve dikkatli değilim.

Ve burada, genel olarak, yanlış anlamalar kayıyor. Kafa dönüşü...

Misal:

Kodumdan, dizinin son değeri eksi dizinin ilk değeri erken sıfırsa, sonucun -999999999999.88 olması gerektiği görülebilir.

Ve optimize ederken aşağıdaki sonucu alıyorum:

 2019.06 . 16 16 : 27 : 09.847 Core 1    final balance 9587.10 USD
2019.06 . 16 16 : 27 : 09.847 Core 1    OnTester result - 99999999999.88

9587 - 10000 hiçbir şekilde sıfıra eşit değildir ve sonuç -999999999999.88'dir. Nasıl?!?!? zaten tıkandım...

 
Сергей Таболин :

Alex, yardımın için çok teşekkür ederim.

Geliştiricilerin karşılaştığı soruyu anlıyorum, bu yüzden böyle bir çözüm öneriyorum. Duruma uygun şekilde cevap verebilmek için.

Statik değişkenlere ve "attığım" örneğinize gelince ... Üzgünüm, ama ne hakkında olduğunu tam olarak anlamıyorum. Sakıncası yoksa açıkla.

Ve biraz hoşgörü ve sabır istiyorum. Şimdi çok kötü bir yaşam durumum var, çünkü çok sinirliyim (bunu anlıyorum ama şu ana kadar bu konuda hiçbir şey yapamam) ve dikkatli değilim.

Ve burada, genel olarak, yanlış anlamalar kayıyor. Kafa dönüşü...

Misal:

Kodumdan, dizinin son değeri eksi dizinin ilk değeri erken sıfırsa, sonucun -999999999999.88 olması gerektiği görülebilir.

Ve optimize edildiğinde aşağıdaki sonucu alıyorum:

9587 - 10000 hiçbir şekilde sıfıra eşit değildir ve sonuç -999999999999.88'dir. Nasıl?!?!? zaten tıkandım...

Bunun iyi mi yoksa kötü mü olduğunu bilmiyorum ama asla tüm kodu incelemem, bu yüzden statik bir değişkenden bahsettim. Ve tester_stop bayrağının programın farklı bölümlerinde kullanıldığına bakılırsa, bu bayrak global değişkenler düzeyinde bildirilmelidir.

Bu nedenle, örneğimden bayrağın değerindeki değişikliği düşüncesizce "attığınız" onaylandı.

İşte kullanım

   if (tester_stop) return (- 99999999999. 99 );

Ve görünüşe göre bu bayrak ya hiç değişmiyor ya da değişikliğin olması gerektiği yerde sağlanmadığı için değişmiyor.

 
Alexey Viktorov :
Bazen danışmanın bitiminden önce olayın işlenmesini tamamlamak gerekir.

Aynı zamanda, herhangi bir programcının cephaneliğinde bir geri dönüş ifadesi vardır ve zorla sonlandırılan hiçbir şey yoktur .


Bu bağlamda bir kontrol yapamaz mıyız?

 if ( IsStopped ())
if (! IsStopped ())