Hatalar, hatalar, sorular - sayfa 1931

 

Sabahlar akşamlardan daha akıllıdır... :)

 
Aleksey Vyazmikin :

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 metin hizalama yöntemi seçeneği eklemelerini istiyorum!


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

Ve kızmıyorsunuz, ancak yardımı dikkatlice okuyun:

OBJ_LABEL, OBJ_BITMAP_LABEL ve OBJ_RECTANGLE_LABEL nesneleri için, nesnenin bağlantı noktasının konumlandığı tablo açısını göreli olarak ayarlayabilirsiniz. Bu köşe, nesnenin dört ENUM_BASE_CORNER numaralandırma değerinden birine sahip olabilen OBJPROP_CORNER özelliği aracılığıyla ayarlanır:

tanımlayıcı

Tanım

CORNER_LEFT_UPPER

Bağlantı noktası koordinatları, grafiğin sol üst köşesine göre ayarlanır

CORNER_LEFT_LOWER

Bağlantı noktası koordinatları, grafiğin sol alt köşesine göre ayarlanır

CORNER_RIGHT_LOWER

Bağlantı noktası koordinatları, grafiğin sağ alt köşesine göre ayarlanır

CORNER_RIGHT_UPPER

Bağlantı noktası koordinatları, grafiğin sağ üst köşesine göre ayarlanır

Nesnenin bağlantı noktasının konumu, OBJPROP_ANCHOR özelliği tarafından belirlenir ve ENUM_ANCHOR_POINT numaralandırmasının 9 değerinden biri olabilir:

tanımlayıcı

Tanım

ANCHOR_LEFT_UPPER

Sol üst köşedeki bağlantı noktası

ANCHOR_LEFT

Bağlantı noktası sol orta

ANCHOR_LEFT_LOWER

Sol alt köşedeki bağlantı noktası

ANCHOR_LOWER

Bağlantı noktası alt orta

ANCHOR_RIGHT_LOWER

Sağ alt köşedeki bağlantı noktası

ANCHOR_RIGHT

Bağlantı noktası sağ merkez

ANCHOR_RIGHT_UPPER

Sağ üst köşedeki bağlantı noktası

ANCHOR_UPPER

Bağlantı noktası üst merkez

ANCHOR_CENTER

Bağlantı noktası kesinlikle nesnenin merkezinde

 
Artyom Trishkin :

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.

Tabii ki her şeyi taşıdım - belki aptalım ..



 void OnStart ()
  {
      Label( "0" , //Название
             0 ,       //Окно
             10 ,       //X
             32 ,       //Y
             "0 - Центр координат в левом верхнем углу графика" ,
             10 , //Размер шрифта
            Yellow, //Цвет шрифта
             0          //Выбор угла: 3 - нижний правый, 1 - верхний правый. 2 - нижний левый, 4 - верхний левый                   
            );     
      Label( "1" , //Название
             0 ,       //Окно
             10 ,       //X
             32 ,       //Y
             "1 - Центр координат в левом нижнем углу графика" ,
             10 , //Размер шрифта
            Yellow, //Цвет шрифта
             1          //Выбор угла: 3 - нижний правый, 1 - верхний правый. 2 - нижний левый, 4 - верхний левый                   
            );     
      Label( "2" , //Название
             0 ,       //Окно
             10 ,       //X
             32 ,       //Y
             "2 - Центр координат в правом нижнем углу графика" ,
             10 , //Размер шрифта
            Yellow, //Цвет шрифта
             2          //Выбор угла: 3 - нижний правый, 1 - верхний правый. 2 - нижний левый, 4 - верхний левый                   
            );
      Label( "3" , //Название
             0 ,       //Окно
             10 ,     //X
             32 ,       //Y
             "3 - Центр координат в правом верхнем углу графика" ,
             10 , //Размер шрифта
            Yellow, //Цвет шрифта
             3        //Выбор угла: 3 - нижний правый, 1 - верхний правый. 2 - нижний левый, 4 - верхний левый                   
            ); 

  }

//+------------------------------------------------------------------+
//|Функция вывода информации на экран -- Старый вариант              |
//+------------------------------------------------------------------+
void Label( 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(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);
  }
*/    
 
Artyom Trishkin :

Ve kızmıyorsunuz, ancak yardımı dikkatlice okuyun:

OBJ_LABEL, OBJ_BITMAP_LABEL ve OBJ_RECTANGLE_LABEL nesneleri için, nesnenin bağlantı noktasının konumlandığı tablo açısını göreli olarak ayarlayabilirsiniz. Bu köşe, nesnenin dört ENUM_BASE_CORNER numaralandırma değerinden birine sahip olabilen OBJPROP_CORNER özelliği aracılığıyla ayarlanır:

tanımlayıcı

Tanım

CORNER_LEFT_UPPER

Bağlantı noktası koordinatları, grafiğin sol üst köşesine göre ayarlanır

CORNER_LEFT_LOWER

Bağlantı noktası koordinatları, grafiğin sol alt köşesine göre ayarlanır

CORNER_RIGHT_LOWER

Bağlantı noktası koordinatları, grafiğin sağ alt köşesine göre ayarlanır

CORNER_RIGHT_UPPER

Bağlantı noktası koordinatları, grafiğin sağ üst köşesine göre ayarlanır

Nesnenin bağlantı noktasının konumu, OBJPROP_ANCHOR özelliği tarafından belirlenir ve ENUM_ANCHOR_POINT numaralandırmasının 9 değerinden biri olabilir:

tanımlayıcı

Tanım

ANCHOR_LEFT_UPPER

Sol üst köşedeki bağlantı noktası

ANCHOR_LEFT

Bağlantı noktası sol orta

ANCHOR_LEFT_LOWER

Sol alt köşedeki bağlantı noktası

ANCHOR_LOWER

Bağlantı noktası alt orta

ANCHOR_RIGHT_LOWER

Sağ alt köşedeki bağlantı noktası

ANCHOR_RIGHT

Bağlantı noktası sağ merkez

ANCHOR_RIGHT_UPPER

Sağ üst köşedeki bağlantı noktası

ANCHOR_UPPER

Bağlantı noktası üst merkez

ANCHOR_CENTER

Bağlantı noktası kesinlikle nesnenin merkezinde

Teşekkürler yarın çözmeye çalışacağım...

 
prostotrader :

Sabahlar akşamlardan daha akıllıdır... :)

Genellikle öyle :)
 
SD'de bu durumda her şeyin doğru olduğunu söylüyorlar

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Hatalar, hatalar, sorular

fxsaber , 2017.07.18 09:51

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.


Örneği anlamak oldukça zor, o yüzden bir tane daha verdim.

 void OnStart ()
{
   Print (( double ) "8.905" == 8.905 ); // true
   Print ((( string )( double ) "8.905" )); // 8.904999999999999
}

İşte bununla ilgili

Строковая в double переводится без проблем. Обратно - получаем другой результат.

Onlar. "8.905" dizesini aldı, ikiye katladı ve hemen dizeye dönüştürdü, 8.9049999999999999 elde etti. Ama OnStart'ın ilk satırı (çift)"8.905" == 8.905 olduğunu gösteriyor. Onlar. 8.905 çıktısı olmalıdır.

Tabii ki, bariz boş sonlandırılmış durum çalışmamalıdır:

(double)"8.905 0 " == 8.905 0 koşulu doğruysa , (string)(double)"8.905 0 " == "8.905 0 " koşulu da doğru olmalıdır .

Konuyu biraz araştırdıktan sonra şu duruma geldim.

 void OnStart ()
{
   const double Num = 8.274 ;
   const double Norm = NormalizeDouble (Num, 3 );
  
   Print (Num);   // 8.273999999999999
   Print (Norm); // 8.274000000000001
}

Lütfen double -> string dönüşümünün neden hala doğru kabul edildiğini açıklayın. Son örnek tamamen akıllara durgunluk veriyor.

 
fxsaber :

Lütfen double -> string dönüşümünün neden hala doğru kabul edildiğini açıklayın. Son örnek tamamen akıllara durgunluk veriyor.

Son örneğe yorum yapın

Gerçek sayılar, üzerlerinde aynı dönüşümler yapıldıysa aynı kabul edilebilir. Görünüşte özdeş dönüşümler bile - num*0.5 ve num/2.0 farklı sonuçlara yol açar. Aynı şey ayna işlemleri için de söylenebilir. sayı*=sayı2, sayı/=sayı2. Ortaya çıkan sayı, orijinal sayıya eşit olmayacaktır. Gerçek sayıların dünyasına hoş geldiniz.

Bu örnekte, gerçek bir sayı ile normalleştirme sürecinde 3 işlem yapılmıştır - num*=1000, num+=0.5, num/=1000

Hata ayıklayıcıda adım adım kontrol edebilirsiniz

 
fxsaber :
SD'de bu durumda her şeyin doğru olduğunu söylüyorlar

Ve neden utanç verici?

Ondalık reel sayıların büyük çoğunluğu, kalansız ikili bir kesir olarak temsil edilemez. Üzerine iki katı bir depolama formatı dayatıyoruz ve böyle bir çirkinlik alıyoruz.

Genel olarak, ondalık tür zarar vermez, kullanışlı bir şeydir.

 
Slava :

Son örneğe yorum yapın

Gerçek sayılar, üzerlerinde aynı dönüşümler yapıldıysa aynı kabul edilebilir. Görünüşte özdeş dönüşümler bile - num*0.5 ve num/2.0 farklı sonuçlara yol açar. Aynı şey ayna işlemleri için de söylenebilir. sayı*=sayı2, sayı/=sayı2. Ortaya çıkan sayı, orijinal sayıya eşit olmayacaktır. Gerçek sayıların dünyasına hoş geldiniz.

Bu örnekte, gerçek bir sayı ile normalleştirme sürecinde 3 işlem yapılmıştır - num*=1000, num+=0.5, num/=1000

Hata ayıklayıcıda adım adım kontrol edebilirsiniz


Çok yapıcı bir açıklama, teşekkürler!


Ama işte birkaç beyni çıkaran böyle bir karşı örnek.

 void OnStart ()
{
   const double Num = 8.274 ;
   const double Norm = NormalizeDouble (Num, 3 );
   
   Print (Num);   // 8.273999999999999
   Print (Norm); // 8.274000000000001
  
   Print (( double ) DoubleToString (Num, 3 ) == Num);     // true - без нормализации все замечательно
   Print (( double ) DoubleToString (Norm, 3 ) == Norm);   // false - а после нормализации полный облом!
}

Normalleşme böyle mi yürümeli?

 
Комбинатор :

Ve neden utanç verici?

Açıklamadan sonra, Glory artık utanç verici değil, ancak daha sonra NormalizeDouble'ın çalışmasının doğruluğundan şüphe duyan bir örnek ortaya çıktı.