Hatalar, hatalar, sorular - sayfa 1930

 
Neredeyse çocukça soru: neden öyle?
 void OnStart ()
{
   const double Norm = NormalizeDouble ( 8905 / 1000.0 , 3 );
   Print (Norm); // 8.904999999999999
   Print ( DoubleToString (Norm, 3 )); // 8.905
  
   const double Norm2 = ( double ) DoubleToString (Norm, 3 );
   Print (Norm2); // 8.904999999999999
   Print (Norm == Norm2); // true
}

Nedense DoubleToString'in normalleştirmeden sonra anlamsız olduğundan emindim. Ama hayır, senaryonun gösterdiği gibi. Nedenmiş?

Görünüşe göre double -> string cast düzgün çalışmıyor.

 
PositionGet işlevleri test cihazında çok yavaş çalışır. Göstermek için, böyle bir Uzman Danışman yazılmıştır
 // #include <TesterBench.mqh> // https://www.mql5.com/ru/code/18804/

input int Interval = 3600 ;
input double Lots = 1 ;

void OnTick ()
{
   if (! PositionSelect ( _Symbol ))
  {
     if ( HistorySelect ( 0 , TimeCurrent ()))
    {
       const int Total = HistoryDealsTotal () - 1 ;

       MqlTradeRequest Request = { 0 };
       MqlTradeCheckResult CheckResult;
  
      Request.action = TRADE_ACTION_DEAL ;
  
      Request.symbol = _Symbol ;
      Request.type = ((Total >= 0 ) && (( ENUM_DEAL_TYPE ) HistoryDealGetInteger ( HistoryDealGetTicket (Total), DEAL_TYPE ) == DEAL_TYPE_SELL )) ?
                     ORDER_TYPE_SELL : ORDER_TYPE_BUY ;;
  
      Request.volume = Lots;
      Request.price = SymbolInfoDouble (Request.symbol, (Request.type == ORDER_TYPE_BUY ) ? SYMBOL_ASK : SYMBOL_BID );

       if ( OrderCheck (Request, CheckResult))
      {
         MqlTradeResult Result;

         const bool AntiWarning = OrderSend (Request, Result);            
      }
    }
  }
   else
  {
     // Если раскоментировать эти строки, одиночный прогон станет на 20% медленнее.
//    string Symbol = ::PositionGetString(POSITION_SYMBOL);
//    string Comment = ::PositionGetString(POSITION_COMMENT);

     if ( TimeCurrent () - PositionGetInteger ( POSITION_TIME ) >= Interval)      
    {
       MqlTradeRequest Request = { 0 };
       MqlTradeResult Result;
      
      Request.action = TRADE_ACTION_DEAL ;
      Request.position = PositionGetInteger ( POSITION_TICKET );
  
      Request.symbol = PositionGetString ( POSITION_SYMBOL );
      Request.type = ( ENUM_ORDER_TYPE )( 1 - PositionGetInteger ( POSITION_TYPE ));
  
      Request.volume = PositionGetDouble ( POSITION_VOLUME );
      Request.price = PositionGetDouble ( POSITION_PRICE_CURRENT );
          
       const bool AntiWarning = OrderSend (Request, Result);
    }
  }
}


Sarı çizgiler yorumlandığında tek bir çalıştırmanın sonucu

Core 1    2017.07 . 17 23 : 59 : 58    Interval = 7.09 s.
Core 1   EURUSD,M1: 13369675 ticks, 47426 bars generated. Environment synchronized in 0 : 00 : 00.857 . Test passed in 0 : 00 : 09.720 (including ticks preprocessing 0 : 00 : 01.950 ).
Core 1   EURUSD,M1: total time from login to stop testing 0 : 00 : 10.577 (including 0 : 00 : 00.857 for history data synchronization)


Sarı çizgiler yorumlanmadığında tek bir çalıştırmanın sonucu

Core 1    2017.07 . 17 23 : 59 : 58    Interval = 9.336 s.
Core 1   EURUSD,M1: 13369675 ticks, 47426 bars generated. Environment synchronized in 0 : 00 : 00.062 . Test passed in 0 : 00 : 11.997 (including ticks preprocessing 0 : 00 : 01.934 ).
Core 1   EURUSD,M1: total time from login to stop testing 0 : 00 : 12.059 (including 0 : 00 : 00.062 for history data synchronization)


TesterBench kitaplığı aynı çalışma zamanı düşüşünü gösterir.


PS Sadece PositionGet'i değil, OrderGet, HistoryDealGet, HistoryOrderGet'i de yavaşlatırlar.

 

Test cihazında (1629), işlemler sıfır fiyatla açılır

Uzman Danışmanı test cihazında FIBOGroup-MT5 Sunucu ticaret sunucusunun gerçek tıklamaları üzerinde başlatma


 

Geliştiricilere ve ilgilenen meslektaşlarına soru.

Test Cihazında, görselleştirme modunda CiMA sınıfının bir nesnesi kullanılır - hareketli bir ortalama.

Mod = "Her tik, gerçek tiklere dayalıdır". Görüntüleyicideki hız maksimuma yakın.

Sorun şu. Yeni bir çubuk göründüğünde, CiMA tipi hareketlerin değerlerinin veya daha doğrusu hareketli tampondaki değerlerin güncellenmesi için bir cehennem yeni kene bulutu beklemeniz gerekir.

Aynı zamanda, CiMA::Refresh(-1) yöntemi kullanılarak her onay için bir yenileme zorlanır.

Test Cihazı neden bu kadar kötü çalışıyor?

Gerçekte, böyle sorunlar yoktur.

 

garip itmeler artık yok:

uest/302788

istek/302788

Tahmin ettiğim gibi aday olarak gösterilen ve aynı sırayla yorum yapan bendim.

Ancak mesajlar kodlayıcılar için olduğu gibidir)

 

Belgelerden

ENUM_BASE_CORNER

tanımlayıcı

Tanım

CORNER_LEFT_UPPER

Grafiğin sol üst köşesindeki koordinatların merkezi

CORNER_LEFT_LOWER

Grafiğin sol alt köşesindeki koordinatların merkezi

CORNER_RIGHT_LOWER

Grafiğin sağ alt köşesindeki koordinatların merkezi

CORNER_RIGHT_UPPER

Grafiğin sağ üst köşesindeki koordinatların merkezi

Soru: Tablo neden sayısal sırayla derlenemedi? 1 koyarsınız - ve beklenen " Grafiğin sol üst köşesindeki koordinatların merkezi " yerine " Grafiğin sağ alt köşesindeki koordinatların merkezi " alırsınız.

Şimdi böyle görünüyor

1 - Grafiğin sol alt köşesindeki koordinatların merkezi
2 - Grafiğin sağ alt köşesindeki koordinatların merkezi
3 - Grafiğin sağ üst köşesindeki koordinatların merkezi
4 - Grafiğin sol üst köşesindeki koordinatların merkezi

 
Aleksey Vyazmikin :

Belgelerden

ENUM_BASE_CORNER

tanımlayıcı

Tanım

CORNER_LEFT_UPPER

Grafiğin sol üst köşesindeki koordinatların merkezi

CORNER_LEFT_LOWER

Grafiğin sol alt köşesindeki koordinatların merkezi

CORNER_RIGHT_LOWER

Grafiğin sağ alt köşesindeki koordinatların merkezi

CORNER_RIGHT_UPPER

Grafiğin sağ üst köşesindeki koordinatların merkezi

Soru: Tablo neden sayısal sırayla derlenemedi? 1 koyarsınız - ve beklenen " Grafiğin sol üst köşesindeki koordinatların merkezi " yerine " Grafiğin sağ alt köşesindeki koordinatların merkezi " alırsınız.

Şimdi böyle görünüyor

1 - Grafiğin sol alt köşesindeki koordinatların merkezi
2 - Grafiğin sağ alt köşesindeki koordinatların merkezi
3 - Grafiğin sağ üst köşesindeki koordinatların merkezi
4 - Grafiğin sol üst köşesindeki koordinatların merkezi

Sayma sıfırdan başlar.

Sayı yerine CORNER_LEFT_UPPER girmenizi engelleyen nedir? Bu yüzden numaralandırmalar, sayılar hakkında düşünmenize gerek kalmayacak şekilde yapılmıştır.

 

yardımda

MT4:

Sabit boyutlu nesneler için: OBJ_BUTTON, OBJ_RECTANGLE_LABEL ve OBJ_EDIT, OBJPROP_XDISTANCE ve OBJPROP_YDISTANCE özellikleri, piksel cinsinden X ve Y koordinatlarının sayılacağı grafik köşesine (OBJPROP_CORNER) göre nesnenin sol üst noktasının konumunu ayarlar.


MT5:

Sabit boyutlu nesneler için: OBJ_BUTTON, OBJ_RECTANGLE_LABEL, OBJ_EDIT ve OBJ_CHART, OBJPROP_XDISTANCE ve OBJPROP_YDISTANCE özellikleri, X ve Y'nin piksel cinsinden koordinatları olacağı grafik köşesine (OBJPROP_CORNER) göre nesnenin sol üst noktasının konumunu ayarlar. sayıldı.

Aynı şey gibi görünüyor, sadece MT4'te OBJ_LABEL için nesnenin sol noktası yok - doğru bir tane var, ancak bu benim öfkeme neden olmadı, gerçek şu ki ObjectSet kullanan eski MT4 kodunun nesnelerin göreceli olarak yerleştirilmesine izin vermesi. kenarlar (köşeler) - sol taraftaki nesneler için pikseller ilk karakterden, sağ taraf için - son karakterden hesaplanmıştır ve yeni sürüm her zaman girintiyi ilk karakterden hesaplar, bu da etiketleri konumlandırmayı zorlaştırır metinle, kaç metin karakteri olacağı her zaman bilinmediğinden. Geliştiricilerden bir dizi metin hizalama yöntemi eklemelerini istiyorum!

 //+------------------------------------------------------------------+
//|Функция вывода информации на экран -- Старый вариант              |
//+------------------------------------------------------------------+

void Label_MQL4( string _name, int _window, int _x, int _y, string _text, int _font, color _color, int corner)
  {
   ObjectDelete (_name);
   ObjectCreate (_name, OBJ_LABEL ,_window, 0 , 0 );
   ObjectSet (_name, OBJPROP_CORNER ,corner);
   ObjectSet (_name, OBJPROP_XDISTANCE ,_x);
   ObjectSet (_name, OBJPROP_YDISTANCE ,_y);
   ObjectSetText (_name,_text,_font, "Arial" ,_color);
  }
  
//+------------------------------------------------------------------+
//|Функция вывода информации на экран -- Новый вариант               |
//+------------------------------------------------------------------+
void Label_MQL5( string _name, int _window, int _x, int _y, string _text, int _font, color _color, int corner)
  {
   //corner=4;
   ObjectDelete ( 0 ,_name);
   ObjectCreate ( 0 ,_name, OBJ_LABEL ,_window, 0 , 0 );
   ObjectSetInteger ( 0 ,_name, OBJPROP_CORNER ,corner);
   ObjectSetInteger ( 0 ,_name, OBJPROP_XDISTANCE ,_x);
   ObjectSetInteger ( 0 ,_name, OBJPROP_YDISTANCE ,_y);
   ObjectSetText (_name,_text,_font, "Arial" ,_color);
  }  


MT5'te sağa ve sola hizalamayı bilen biri varsa, lütfen ilgili işlevi paylaşın!

 
Artyom Trishkin :

Sayma sıfırdan başlar.

Sayı yerine CORNER_LEFT_UPPER girmenizi engelleyen nedir? Bu yüzden numaralandırmalar, sayılar hakkında düşünmenize gerek kalmayacak şekilde yapılmıştır.

Sıfırdan mı? Pekala, bu iyi - sıfırdan olmasına izin ver - hesaba katmadım - ama yine de çalışmıyor!

Çünkü benim için daha net ve daha önce kullanıldı ...

 
Aleksey Vyazmikin :

Sıfırdan mı? Pekala, bu iyi - sıfırdan olmasına izin ver - hesaba katmadım - ama yine de çalışmıyor!

Çünkü benim için daha net ve daha önce kullanmıştım...

4 rakamı ile adlandırmaya çalıştığınız ve orada olmayan liste maddesini sizin için yukarı mı taşıyayım? Sıfır olur - ve her şey yerli yerindedir.