Lütfen bu işlevde neyin yanlış olduğunu açıklayabilir misiniz?

 
" Geliştiricilerle Service Desk aracılığıyla iletişim kurun!" ile ilgili olmayan yorumlar bu konuya taşınmıştır.
 
MetaQuotes Software Corp. :

Herhangi bir yeni yazılım ürünü, kaçınılmaz olarak, şirket içindeki en kapsamlı testlerle bile her zaman tespit edilemeyen hatalar içerir. Bu yüzden programlarımızda bulunan sorunlarla ilgili tüm kullanıcı raporlarına büyük önem veriyor ve her birine cevap vermeye çalışıyoruz.

Önce hatalı bir cevap varsa ve sonra görmezden gelinirse nasıl iletişim kurulur. Başvuru 2016.06.22 08:06 , #1499568

Belki topluluk açıklayabilir?


İşte danışman kodunun bir kısmı. İç boşluk OnTick()

   bool openNew, newDay, newHour;

    if (( int )mqlDateTime.hour == startHour) // startHour = 0 Это условие выполнено.
     {
      newDay = newBar.IsNewBar( _Symbol , PERIOD_D1 , oldDay); // 
    if (newDay)
     Print ( "***** newDay " , newDay, " mqlDateTime.hour " , mqlDateTime.hour); // Судя по распечатке newDay = true
       newHour = newBar.IsNewBar( _Symbol , PERIOD_H1 , oldHour);
     if (newHour)
      Print ( "***** newHour " , newHour); // Судя по распечатке newHour = true
        if (newDay && newHour) // A ЭТО УСЛОВИЕ НЕ ВЫПОЛНЕНО НЕСМОТРЯ НА ПРЕДЫДУЩИЕ РАСПЕЧАТКИ.
         {
          openNew = openNew_or_No();
            Print ( "***** openNew " , openNew, " ***** PositionsTotal " , PositionsTotal ()); // Эта распечатка отсутствует
            if (openNew || PositionsTotal () == 0 )
             
              // Продолжение кода...
              // На несоответствие количества открывающих и закрывающих фигурных скобок прошу не обращать внимания.

Bu, "Uzmanlar" sekmesinin içeriğidir

 2016.06 . 22 00 : 00 : 44.531 Toad Green (EURUSD,M15) ***** newHour true
2016.06 . 22 00 : 00 : 44.331 Toad Green (USDJPY,M15) ***** newHour true
2016.06 . 22 00 : 00 : 18.361 Toad Green (EURUSD,M15) ***** newDay true mqlDateTime.hour 0
2016.06 . 22 00 : 00 : 12.770 Toad Green (USDJPY,M15) ***** newDay true mqlDateTime.hour 0

Yukarıdaki kodun düzgün çalıştığı açıkça görüldüğü 21.06 günlük dosyasının ilk satırları.

GM       0        00 : 00 : 30.116     Trades   '3265046' : instant buy 0.01 EURUSD at 1.13188 tp: 1.13388 (deviation: 55 )
NK       0        00 : 00 : 30.246     Trades   '3265046' : accepted instant buy 0.01 EURUSD at 1.13188 tp: 1.13388 (deviation: 55 )
IE       0        00 : 00 : 30.246     Trades   '3265046' : deal # 73303810 buy 0.01 EURUSD at 1.13188 done (based on order # 87892298 )
KI       0        00 : 00 : 30.246     Trades   '3265046' : order # 87892298 buy 0.01 / 0.01 EURUSD at 1.13188 done in 130 ms
ON       0        00 : 00 : 30.256     Trades   '3265046' : instant sell 0.01 EURUSD at 1.13093 tp: 1.12893 (deviation: 55 )
LQ       0        00 : 00 : 30.366     Trades   '3265046' : accepted instant sell 0.01 EURUSD at 1.13093 tp: 1.12893 (deviation: 55 )
HG       0        00 : 00 : 30.376     Trades   '3265046' : deal # 73303813 sell 0.01 EURUSD at 1.13093 done (based on order # 87892301 )
RK       0        00 : 00 : 30.376     Trades   '3265046' : order # 87892301 sell 0.01 / 0.01 EURUSD at 1.13093 done in 120 ms
MJ       0        00 : 00 : 30.376     Trades   '3265046' : modify # 87608748 sell 0.01 EURUSD sl: 0.00000 , tp: 1.12031 -> sl: 0.00000 , tp: 1.12462
GK       0        00 : 00 : 30.476     Trades   '3265046' : accepted modify # 87608748 sell 0.01 EURUSD sl: 0.00000 , tp: 1.12031 -> sl: 0.00000 , tp: 1.12462
OK       0        00 : 00 : 30.486     Trades   '3265046' : modify # 87608748 sell 0.01 EURUSD -> sl: 0.00000 , tp: 1.12462 done in 107 ms
OH       0        00 : 00 : 30.486     Trades   '3265046' : modify # 87892301 sell 0.01 EURUSD sl: 0.00000 , tp: 1.12893 -> sl: 0.00000 , tp: 1.12462
GJ       0        00 : 00 : 30.586     Trades   '3265046' : accepted modify # 87892301 sell 0.01 EURUSD sl: 0.00000 , tp: 1.12893 -> sl: 0.00000 , tp: 1.12462
KI       0        00 : 00 : 30.596     Trades   '3265046' : modify # 87892301 sell 0.01 EURUSD -> sl: 0.00000 , tp: 1.12462 done in 109 ms
EN       0        04 : 20 : 25.608     Trades   '3265046' : deal # 73317674 sell 0.01 EURUSD at 1.13388 done (based on order # 87906853 )

Ertesi günün başlangıcına kadar danışman dinlenir.

21.06 için günlük dosyasının son 2 satırı

OD      0       23:09:20.196    Network '3265046': scanning network for access points
NR      0       23:09:33.496    Network '3265046': scanning network finished

ve 22.06 günlüğünün başlangıcı

PM      1       02:13:39.422    Network '3265046': connection to MetaQuotes-Demo lost
GF      2       02:13:39.582    MQL5.community  authorization failed
DO      2       02:13:39.682    MQL5.community  authorization failed
IP      2       02:13:40.052    MQL5.community  authorization failed
PK      0       02:13:43.252    Network '3265046': authorized on MetaQuotes-Demo through Access Point RU Moscow (ping: 117.48 ms)
DI      0       02:13:43.252    Network '3265046': previous successful authorization performed from 31.173.80.184 on 2016.06.21 14:55:11
Destek Ekibi 2016.06.22 08:36

Hem NewDay hem de NewHour'u aynı anda yazdırdıysanız, günlüklerde bunlar yan yana olmalıdır. aynı zamanda

Ve günlüklerinizde bunlar yalnızca farklı uzmanlardan (EURUSD ve USDJPY) değil, genel olarak farklı zamanlardadır.
Ve uygulama kapandı...
Alexey Viktorov 2016.06.22 11:25

Rahatsız ettiğim için özür dilerim, bir süre dikkat etmedim. Ancak!!! O zaman neden yeni bir günün ilk çubuğu göründüğünde, aynı zamanda yeni bir saatin ve yeni bir dakikanın ilk çubuğu oluyor, aynı işlev birine true, birine false dönüyor ve istediği zaman her şeyi doğru döndürebiliyor. herkese?

Lütfen bu işlevde neyin yanlış olduğunu açıklayabilir misiniz?

 /*****************Определение появления нового бара******************/
class cNewBar
{
   public :
bool IsNewBar( string symbol, ENUM_TIMEFRAMES timeframe, datetime & m_tOld)
 {
   datetime tNew = ( datetime ) SeriesInfoInteger (symbol, timeframe, SERIES_LASTBAR_DATE );
   if (tNew > m_tOld)
    {
     m_tOld = tNew;
     return ( true );
    }
   return ( false );
 }
};
/********************************************************************/
Neden bir haftadan fazla her şey düzgün çalıştı ve aniden böyle bir felaket olabilir ???
LÜTFEN böyle bir sınıfın kullanımını değerlendirmekten kaçının.

Destek Ekibi 2016.06.22 11:31

Bu işlev nedeniyle birden çok kez kullanılamaz

m_tOld = tNew;

Alexey Viktorov 2016.06.23 10:17

Dün bir şeyin hemen farkına varmadım... Sonuçta, global değişkenler düzeyinde bildirilen ve m_tOld değişkenine referans olarak bir değişken aktarılıyor ve bu değişkene farklı değişkenler iletilirse çoklu çağrıyı hiçbir şekilde etkilememesi gerekiyor. referansa göre işlev. Değil mi? Bu, birincisi ve ikincisi - nedense, test cihazında ve hata ayıklamada her şey düzgün çalışıyor, ancak demo hesabında çok garip çalışıyor, bazen çalışıyor, bazen çalışmıyor.

Destek Ekibi 2016.06.23 10:24

Bu çek ne olacak?

   if (tNew > m_tOld)


Destek Ekibi 2016.06.23 10:24

İşlevinizi arka arkaya 2 kez arayın. İlk aramada true dönerse, aynı tik ile çağırsanız bile bir sonraki aramada false döndürür.


Alexey Viktorov 2016.06.23 10:36

Eh, böyle denir. Gerekli tüm kodları verdim. Bu neden test cihazına ve hata ayıklamaya müdahale etmiyor, ancak demoda istediği gibi oluyor? Anlayamadığım şey şu. Eh, böyle bir sorun bazen test cihazında kayıyorsa, yeni yollar aramak mümkün ve gerekliydi, ancak test cihazında herhangi bir sorun yok...

Tüm bunlara rağmen, şimdi aynı işlevi mql4'te kullanan Expert Advisor korunmadı, ancak herhangi bir sorun çıkmadı. Bu sorun sadece mql5'te çıktı.

Alexey Viktorov 2016.06.23 10:41


Ne olmuş? Pekala, kontrol edin... Sonuçta, kontrol etmeden önce tNew değişkenine bir değer atanır ve m_tOld değişkeninin kendisiyle değil, referans tarafından geçirilen değişkenle karşılaştırılır, ancak bu m_tOld, zamanın değerine sahip olabilir. belirtilen dönemin bir önceki çubuğu veya bu ilk çağrıysa 01/01/1970. Ve sadece her periyot için bir sonraki tikte aynı çubuğun değerleri karşılaştırılacaktır.

Alexey Viktorov 2016.06.23 10:57


Lütfen işleve farklı değişkenlerin ve farklı dönemlerin iletildiğini unutmayın.

      newDay = newBar.IsNewBar( _Symbol , PERIOD_D1 , oldDay );
   

       newHour = newBar.IsNewBar( _Symbol , PERIOD_H1 , oldHour );


Ve HER ŞEY... Bundan sonrası tam bir yok sayma. Anında yanıt verdiğiniz için teşekkür ederiz, ancak net bir yanıt gelmedi. Eğer mql5'te bir hata varsa, o zaman "anlıyoruz, bekle" gibi bir şey yazabilirsiniz... Ve böylece sorunun basitçe göz ardı edildiği ortaya çıkıyor.

Mql4'teki benzer bir işlev, zamandaki değişimi 15 saniyenin katları olarak belirledi, ancak mql5'te aniden böyle bir sorun oluştu...

 

Deney sırasında yanlış gözlem organizasyonunun anlamı budur.

 
Dmitry, tekrar başladı mı? "21/06/2016 tarihinde siparişler neden sorunsuz açıldı ve 06/22/2016 tarihinde teftiş organizasyonu neden birdenbire yanlış oldu sorusuna veya başka bazı problemlere cevap vermek daha kolay olabilir...
 
Alexey Viktorov :
...

Cevaplamak için - bir koda ihtiyacınız var. Kod parçacıklarınız var. Minimal bir kod yapın - öyle ki herkes bu kodu çalıştırabilir.

Koddaki değişkenlerin değerlerini - fonksiyona girişte ve fonksiyondan çıkışta yazdırmak güzel olurdu.


 
Alexey Viktorov :
Dmitry, tekrar başladı mı? "21/06/2016 tarihinde siparişler neden sorunsuz açıldı ve 06/22/2016 tarihinde teftiş organizasyonu neden birdenbire yanlış oldu sorusuna veya başka bazı problemlere cevap vermek daha kolay olabilir...
Doğrudan ve olduğu gibi cevap verirsem, büyük olasılıkla bunun için yasaklanacağım.
 
Dmitry Fedoseev :
Doğrudan ve olduğu gibi cevap verirsem, büyük olasılıkla bunun için yasaklanacağım.
sonsuza dek, ebediyen, daima...
 
Alexander Bereznyak :
sonsuza dek, ebediyen, daima...

Uyumak için bile dinlenmek yok, çok mu rüya görüyorsun?

Peki ya anlamı? Sonuçta, buna aldanmayacaksın.

Muhtemelen hayatın anlamı nefretken yaşamak güzel midir? ANCAK?

 
Karputov Vladimir :

Cevaplamak için - bir koda ihtiyacınız var. Kod parçacıklarınız var. Minimal bir kod yapın - öyle ki herkes bu kodu çalıştırabilir.

Koddaki değişkenlerin değerlerini - fonksiyona girişte ve fonksiyondan çıkışta yazdırmak güzel olurdu.


Sorun yok.

Ancak hiçbir sorun olmadığını ve aniden ... neden? Kod parçacıklarına ek olarak, 21/06/2016 tarihinde ve ondan önce olması gerektiği gibi bir haftadan fazla çalıştığını ancak 22/06/2016 tarihinde aniden sorunların ortaya çıktığını görebileceğiniz günlükler var. SD'ye yazmadan önce, defalarca test cihazında çalıştırdım, geçmişte hata ayıkladım ve hiçbir sorun bulunamadı.

Bu yüzden kodu düzenlemenin faydasından şüpheliyim. Eğlence hariç.

 #property strict

datetime oldDay, oldHour;
MqlDateTime mqlDateTime;
/*******************Expert initialization function*******************/
int OnInit ()
{
   return ( INIT_SUCCEEDED );
} /*******************************************************************/

/************************Expert tick function************************/
void OnTick ()
{
  bool newDay, newHour;
    TimeToStruct ( TimeCurrent (), mqlDateTime);
     if (( int )mqlDateTime.hour == 0 )
     {
      newDay = IsNewBar( _Symbol , PERIOD_D1 , oldDay); // Обратите внимание на то, что это отдельная переменная передаваемая в функцию по ссылке
   if (newDay)
     Print ( "***** newDay " , newDay, " mqlDateTime.hour " , mqlDateTime.hour); // Судя по распечатке newDay = true
       newHour = IsNewBar( _Symbol , PERIOD_H1 , oldHour); // А это совсем другая переменная
     if (newHour)
     Print ( "***** newHour " , newHour); // Судя по распечатке newHour = true
         if (newDay && newHour) // A ЭТО УСЛОВИЕ НЕ ВЫПОЛНЕНО НЕСМОТРЯ НА ПРЕДЫДУЩИЕ РАСПЕЧАТКИ.
         {
           Print ( "Ордер должен откыться. " );
         }
     }
} /*******************************************************************/

/*****************Определение появления нового бара******************/
bool IsNewBar( string symbol, ENUM_TIMEFRAMES timeframe, datetime &m_tOld)
 {
   datetime tNew = ( datetime ) SeriesInfoInteger (symbol, timeframe, SERIES_LASTBAR_DATE );
   if (tNew > m_tOld)
    {
     m_tOld = tNew;
     return ( true );
    }
   return ( false );
 }
/********************************************************************/

/******************Expert deinitialization function******************/
void OnDeinit ( const int reason)
{
 Comment ( "" );
} /*******************************************************************/
 

Yazar istemediği için deneyeceğim:

 //+------------------------------------------------------------------+
//|                                                   test_1Vc2f.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link        "http://wmua.ru/slesar/"
#property version    "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---

//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   bool openNew,newDay,newHour;
//---
   newDay=IsNewBar( _Symbol , PERIOD_D1 ,oldDay); // 
   if (newDay)
       Print ( "***** newDay " ,newDay, " mqlDateTime.hour " ,mqlDateTime.hour); // Судя по распечатке newDay = true
   newHour=IsNewBar( _Symbol , PERIOD_H1 ,oldHour);
   if (newHour)
       Print ( "***** newHour " ,newHour); // Судя по распечатке newDay = true
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool IsNewBar( string symbol, ENUM_TIMEFRAMES timeframe, datetime &m_tOld)
  {
   datetime tNew=( datetime ) SeriesInfoInteger (symbol,timeframe, SERIES_LASTBAR_DATE );
   if (tNew>m_tOld)
     {
       Print ( "in: m_tOld = " ,m_tOld);
      m_tOld=tNew;
       Print ( "out: m_tOld = " ,m_tOld);
       return ( true );
     }
   return ( false );
  }
//+------------------------------------------------------------------+

Geriye " mqlDateTime " yapısının ne olduğuna ve "oldDay" ve "oldHour" değişkenlerinin nerede bildirileceğine karar vermek kalıyor...

 
Karputov Vladimir :

Yazar istemediği için deneyeceğim:

Geriye " mqlDateTime " yapısının ne olduğuna ve "oldDay" ve "oldHour" değişkenlerinin nerede bildirileceğine karar vermek kalıyor...

Tüm cevaplar yukarıdaki mesajda.
Neden: