Rengi gölgelere ayırma işlevi. - sayfa 7

 
Vladislav Andruschenko :


Eh, İngilizce isimler bir sebepten dolayı icat edildi.

Rus isimleri kodunuzu öldürdüğünde size başka bir örnek verebilirim:

Kodu, Kiril alfabesi olmayan bir müşteriye aktarıyorsunuz. Herşey. .... her şey kaybolur ..... :-)

Müşterinin koda mı yoksa çözüme mi ihtiyacı var?

 
Реter Konow :

Müşterinin koda mı yoksa çözüme mi ihtiyacı var?

bu yüzden amaca ve son kullanıcılara karar vermelisiniz.

Kendinizi kullanıcının yerine koyun ve yaptığınız her şeyi unutun: kullanıcı nasıl hissedecek?

her şeyi anlayacak mı?

 
Vladislav Andruschenko :

bu yüzden amaca ve son kullanıcılara karar vermelisiniz.

Kendinizi kullanıcının yerine koyun ve yaptığınız her şeyi unutun: kullanıcı nasıl hissedecek?

her şeyi anlayacak mı?

Kabul ediyorum. İki dilde yazıyorum. Akıcı İngilizce konuşabiliyorum.

 
Реter Konow :

İngilizce konuşan biri olarak kararımı görmezden gelmekte özgürsün. Birkaç İngilizce kelime var.

Bu arada, İngilizce koduna çok aşina olduğunuz için Nikolai Semko tarafından önerilen kodu ayrıştırmama yardım edin:

Dürüst olmak gerekirse, nasıl çalıştığını anlamıyorum. Birçok kısa İngilizce hece var. Sadece sevdiğin şey.

İşin gerçeği şu ki, İngilizce'nin yaklaşık %30'unu biliyorum ve sadece teknik ama konuşma değil.

Programlamada sadece bir iki düzine kelime vardır ve bunları kelimenin tam anlamıyla 1-2 program yazarak hatırlayabilirsiniz.

PS Gönderdiğiniz kod, sadece 5 değişken var, bunlarla nasıl başa çıkamazsınız?

 
Vitaly Muzichenko :

İşin gerçeği şu ki, İngilizce'nin yaklaşık %30'unu biliyorum ve sadece teknik ama konuşma değil.

Programlamada sadece bir iki düzine kelime vardır ve bunları kelimenin tam anlamıyla 1-2 program yazarak hatırlayabilirsiniz.

PS Gönderdiğiniz kod, sadece 5 değişken var, bunlarla nasıl başa çıkamazsınız?

Kodumda 30 değişken saydım (ana fonksiyonda). Ne kadar zamandır düşünüyorsun? (şaka).

%30 teknik İngilizce çok güçlüdür. Teknik İngilizcenin ne kadar zengin olduğunu biliyor musunuz?

Programlamada birkaç düzine kelime mi? Şimdi birbirimizi neden anlamadığımız açık.))


not Nikolai'nin kodunu kastediyorsanız, nasıl çalıştığını aydınlatın.

 
Genel olarak konu kapanabilir. Kod birilerinin işine yararsa sevinirim. Hayır, hayır...
 
Реter Konow :

Bu arada, resme bakılırsa, buradaki renk ayrışması tam değil. Sadece yarısı. Aralık, belirli bir rengin tüm tonları boyunca mutlak beyazdan mutlak siyaha kadar uzanmalıdır.

Evet haklısın.

Onu uygulamaya ve kodunuzu analiz etmeye ve görselleştirmeye çalıştım.

Oradan şu çıktı:

 #include <Canvas\iCanvas.mqh> //https://www.mql5.com/ru/code/22164

union rgb { uint clr; uchar c[ 4 ];};
void OnStart ()
  {
   rgb c,cc;
   double d= 5 ;
   while (! IsStopped ())
     {
      c.c[ 2 ]= uchar ( 127.5 *( 1 + sin (d* 1.2 ))+ 0.4999 ); c.c[ 1 ]= uchar ( 127.5 *( 1 + sin (d* 1.9 ))+ 0.4999 ); c.c[ 0 ]= uchar ( 127.5 *( 1 + sin (d* 2.8 ))+ 0.4999 );   // генерируем новый цвет
      cc.clr=c.clr;
       uint CLR[];
       ulong t= GetMicrosecondCount ();
      Gradient(c.clr,CLR,W.Height);
      t= GetMicrosecondCount ()-t;
       for ( int y= 0 ; y<W.Height; y++)
        {
         Canvas.LineHorizontal( 0 ,W.Width- 1 ,y, ColorToARGB (CLR[y], 240 ));
         c.clr=CLR[y];
         Canvas.PixelSet(( int )c.c[ 2 ]+( int )c.c[ 1 ]+( int )c.c[ 0 ],y, ColorToARGB ( clrWhite ));
         if (c.c[ 1 ]> 0 ) Canvas.PixelSet( int ( 50.0 *( int )c.c[ 2 ]/( double )c.c[ 1 ]+ 50.0 *( int )c.c[ 0 ]/( double )c.c[ 1 ]),y, ColorToARGB ( clrGreen ));
         if (c.c[ 2 ]> 0 ) Canvas.PixelSet( int ( 50.0 *( int )c.c[ 1 ]/( double )c.c[ 2 ]+ 50.0 *( int )c.c[ 0 ]/( double )c.c[ 2 ]),y, ColorToARGB ( clrRed ));
         if (c.c[ 0 ]> 0 ) Canvas.PixelSet( int ( 50.0 *( int )c.c[ 2 ]/( double )c.c[ 0 ]+ 50.0 *( int )c.c[ 1 ]/( double )c.c[ 0 ]),y, ColorToARGB ( clrBlue ));
        }
      Canvas.FillRectangle(W.Width/ 2 - 80 ,W.Height/ 2 - 50 ,W.Width/ 2 + 80 ,W.Height/ 2 + 50 , ColorToARGB (cc.clr, 240 ));
      Canvas.CurentFont( "Tahoma" , 20 , 22 , ColorToARGB (~cc.clr)); // 20 -  размер шрифта, 22 - межстрочный интервал
      Canvas.TextPosition(W.Width/ 2 - 70 ,W.Height/ 2 - 40 ); // Стартовая позиция для шрифта в пикселях
      Canvas.Comm( "Текущий цвет:" );
      Canvas.Comm( "R = " + string (cc.c[ 2 ]));
      Canvas.Comm( "G = " + string (cc.c[ 1 ]));
      Canvas.Comm( "B = " + string (cc.c[ 0 ]));
      Canvas.CurentFont( "Times New Roman" , 30 );
      Canvas.TextPosition( 25.0 , 10.0 );   // Стартовая позиция для шрифта в процентах от размеров экрана
      Canvas.Comm( "Время формирования градиентного массива из " + string (W.Height)+ " элементов = " + string (t)+ " микросекунд" );
      ChartChanged(); // на всякий случай контролируем изменение размеров окна, т.к. это скрипт (в индикаторах и экспертах это происходит автоматически)
      Canvas.Update();
      d+= 0.01 ;
       Sleep ( 30 );
     }
  }
//+------------------------------------------------------------------+

void Gradient( uint clr, uint &arr[], uint size)
  {
   if (size== 0 ) return ;
   ArrayResize (arr,size);
   rgb c;
   c.clr=clr;
   uchar R=c.c[ 2 ],G=c.c[ 1 ],B=c.c[ 0 ];
   uint i= 0 , tone= uint ((size- 1 )*((( double )R+( double )G+( double )B)/ 765.0 )+ 0.4999 );
   double kR,kG,kB;
   if (tone!= 0 )
     {
      kR=( double )R/tone;
      kG=( double )G/tone;
      kB=( double )B/tone;
       for (i= 0 ;i<=tone;i++)
        {
         c.c[ 2 ]= uchar (i*kR+ 0.4999 );
         c.c[ 1 ]= uchar (i*kG+ 0.4999 );
         c.c[ 0 ]= uchar (i*kB+ 0.4999 );
         arr[i]=c.clr;
        }
     }
   if (tone!=(size- 1 ))
     {
      kR=( double )( 255 -R)/(size-i);
      kG=( double )( 255 -G)/(size-i);
      kB=( double )( 255 -B)/(size-i);
       for ( uint j= 1 ;i<size;i++,j++)
        {
         c.c[ 2 ]= uchar (R+j*kR+ 0.4999 );
         c.c[ 1 ]= uchar (G+j*kG+ 0.4999 );
         c.c[ 0 ]= uchar (B+j*kB+ 0.4999 );
         arr[i]=c.clr;
        }
     }
  }

senin seçeneğin


benim versiyonum:


Açıklamama izin ver:

Beyaz çizgi ton çizgisidir (R+B+G renklerinin toplamı) - ideal olarak kesinlikle düz çapraz bir çizgi olmalıdır. Ben uyguladım, sen uygulamıyorsun.

Kırmızı, mavi ve yeşil çizgiler renk oranı çizgileridir. Bunlara spektrumun harmonikleri diyelim. İdeal olarak dikey olmalıdır. Ancak bu, başlangıçtaki maksimum renk 255 olduktan sonra yapılamaz. Ancak diğer yandan, bükülme noktalarının (kırmızı oklarla işaretlenmiş) olmayacağı, ancak düz bir yay olacağı bir duruma ulaşmak mümkündür. Ardından gradyan "kümeler" olmadan görünecektir. Bu sorun senin ve benim algoritmalarımda var. Bu düzeltilebilir, ancak noktayı henüz göremiyorum, bu yüzden zamana yazık. Pratikte, bir renkten diğerine geçişe ihtiyacım var. Bu, spektrumun kesinlikle dikey harmonikleri ile kolayca uygulanabilir (üstteki harmoniğin kabarması normaldir, çünkü bu yuvarlamanın bir sonucudur). Bu problemde, gradyan üçüncü renk üzerinden siyahtan beyaza gider, dolayısıyla bu bükülmeler mevcuttur.

Garip, MQL5'te yazdığınızdan emindim. Ama bir 4-ki programının kendisi olmasının yanında bir de 4-ki programlama stiliniz var. Algoritmanızı 5-ku'ya aktarmaya çalıştım ve hiçbir şey olmadı çünkü. genellikle bazı renkli şeritler çizer. Bu büyük olasılıkla değişkenlerin kapsamıyla ilgili karışıklıktan kaynaklanıyor, ancak kodun hata ayıklanamaması nedeniyle düzeltmek son derece zor ve elimi salladım. Programlama tarzınıza alışkın olduğunuzu anlıyorum ve tarzım sizin için net değil. Karşılıklı çünkü Programı kitap gibi okumaya değil, programın yapısını görmeye alışkınım. Ve siz, bir değişken tanımının hangi noktasında hata ayıklama ve anlama imkansızlığının yanı sıra, uzun değişken isimleri program metninin %90'ını dolduruyor, bunun sonucunda program yapısı kayboluyor, bu uzun barbie renginde çözülüyor. değişken isimleri Genel olarak, şahsen benim için kodunuz bir tür sadomaso olarak algılanıyor.  

Ayrıca algoritmanız on kat daha yavaş çıktı ve bunun nedeni MQL 4 bile değil. Bir türlü çözemedim. Sadece RGB olduğunda hangi teğetler, hangi üçgenler ?

Ve birliğe hakim olmaya çalış - çok faydalı bir şey.

Neden bahsettiğimi daha iyi anlamak için, hem sizin algoritmanızla (MQL4) hem de benimkiyle (MQL5) eklediğim komut dosyalarını çalıştırmaya değer.


Bunun gibi vakalarınız da var:

Henüz anlamadım, bu MT4 yavaşlığı sorunu ve algoritmanızın hatası.

Dosyalar:
 
Nikolai Semko :


1. Nikolay, getirdiğiniz ilk iki resmi karşılaştırsanız bile, sürümünüzün üzerinde gri bir sis asılı olduğunu hemen görebilirsiniz. Dikkatli bak. Ve benim versiyonumda renk çok daha parlak. Sürümünüzün rengi daha iyi aktardığını düşünüyor musunuz?

2. Standart için Windows renk paletini aldım. %99 renk uyumu sağladım. Renklerinizi Windows renkleriyle eşleşip eşleşmediğini kontrol edin. Benim yaptığım gibi gölgeli bir dizi yazdırın. Ardından grafik özelliklerini ve paletini açın. Orijinal rengin bileşenlerinin değerlerini kutulara girin ve ardından kaydırıcıyı yukarı ve aşağı hareket ettirin. Rakamlar değişecek. Çıktınızda bu sayıları arar ve nasıl eşleştiğini görürsünüz.

3. Özel uygulamanın değişebileceğini anlıyorum. Algoritmamı özellikle hız için kontrol etmedim ve hız uğruna optimize etmedim. Belki de çözümünüz daha fazla hız sağlar. inkar etmeyeceğim.

4. Optikte prizma kavramı vardır. Işığın kırılmaları. Bu tam olarak başladığım paradigma. 256*256 (0'dan 255'e kadar) çizdim. Daha sonra hatları kurdum. Rengin kırılma eksenini buldu. Grafiğin ortasındadır. Her bileşen, iki segmentten oluşan bir eğridir. Toplamda, rengin, her biri grafiğin merkezinde kırılan ve iki bölüme ayrılan üç eğri çizgisi vardır. Her segmentin kendi açısı vardır. Orijinal rengin grafikte bir koordinatı vardır. Gölgeleri arasında bulunabilir. Benim görevim orijinal rengi bulmak, altı parçanın hepsinin açılarını belirlemek ve çizgisi boyunca her bileşenin değerlerini almaktı.

5. Teğetler, bitişik bacakların karşıtlara oranlarıdır. Segmentlerin açılarını hesaplamak ve karşıt ayakların yüksekliğini hesaplamak için gereklidir (belirli bir renk tonunda bileşenin değeridir).

6. Programlama stillerine gelince, bunu tartışmamanızı öneririm. Konu ile alakası yok.

7. Olaylara gelince - belki de öyledir. Ama şimdiye kadar yakalanmadım. Bu nedenle, bilmiyorum.


Bu arada, bize sürümünüzde renk ayrıştırmasının nasıl çalıştığını söyleyin. tam olarak anlamadım.

Просмотр и настройка графиков - Графики котировок, технический и фундаментальный анализ - MetaTrader 5
Просмотр и настройка графиков - Графики котировок, технический и фундаментальный анализ - MetaTrader 5
  • www.metatrader5.com
Графики в торговой платформе отображают изменение котировок финансовых инструментов во времени. Они необходимы для проведения технического анализа и работы советников. Они позволяют трейдерам наглядно следить за котировками валют и акций в режиме реального времени и моментально реагировать на любое изменение ситуации на финансовых рынках...
 
Nikolai Semko :


Henüz çözemedim, bu MT4'teki yavaşlık sorunu ve algoritmanızın hatası.

Algoritmaların hızındaki fark hakkında:

1. Sizin algoritmanız uint dizisini, benimki ise dizi dizisini dolduruyor.   (Gerekli bileşenleri gölgeden kolayca izole etmek ve onlarla çalışmak için tam olarak ipe ihtiyacım var). Aşağıdaki komut dosyasından her iki dizi türünü de doldurma hızındaki farkı görebilirsiniz.

2. Algoritmanız MT5'te, benimki ise MT4'te çalışıyor. Bu platformlarda dizi doldurma hızındaki fark benim tarafımdan burada tartışıldı - https://www.mql5.com/ru/forum/222333 . Aşağıdaki komut dosyasından farkı kendiniz göreceksiniz. Her iki platforma da koyun ve karşılaştırın.

 //+------------------------------------------------------------------+
//|                        Проверка скорости заполнения массивов.mq5 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link        "https://www.mql5.com"
#property version    "1.00"
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int int_Array[ 30000 ];
string string_Array[ 30000 ];
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
   ulong t1 = GetMicrosecondCount ();
   //--------------------------
   for ( int b1 = 0 ; b1 < 30000 ; b1++)int_Array[b1] = 1 ;
   //--------------------------
   ulong t2 = GetMicrosecondCount ();
   //--------------------------
   int q = int_Array[ 0 ] + int_Array[ 1 ]; //Этот код нужен, иначе компилятор не заполняет массив.
   //--------------------------
   Print ( "//----------------------------------------------------------------------------------" );
   Print ( " Время заполнения массива      int:  " ,t2-t1);
   
 
 
   ulong t3 = GetMicrosecondCount ();
   //--------------------------
   for ( int b2 = 0 ; b2 < 30000 ; b2++)string_Array[b2] = "1" ;
   //--------------------------
   ulong t4 = GetMicrosecondCount ();
   //--------------------------
   int q2 = int_Array[ 0 ] + int_Array[ 1 ]; //Этот код нужен, иначе компилятор не заполняет массив.
   //--------------------------
   Print ( " Время заполнения массива string:  " ,t4-t3);   
   Print ( "//----------------------------------------------------------------------------------" );
   
   Alert (q + q2); //Этот код нужен, иначе компилятор не заполняет массив.
  }
//+------------------------------------------------------------------+

MT4 ve MT5 platformlarında (ms) 30 bin hücre int ve string dizilerinin dolum hızının ölçülmesinin sonuçları:

MT5
2018.10 . 11 13 : 29 : 24.502 Замер скорости заполнения массивов (RTS- 12.18 ,H1)  Время заполнения массива string :   464
2018.10 . 11 13 : 29 : 24.502 Замер скорости заполнения массивов (RTS- 12.18 ,H1)  Время заполнения массива     int :   14

MT4
2018.10 . 11 13 : 30 : 39.199 Замер скорости заполнения массивов GBPUSD,M30:     Время заполнения массива string :   692
2018.10 . 11 13 : 30 : 39.199 Замер скорости заполнения массивов GBPUSD,M30:     Время заполнения массива     int :   363

Gördüğünüz gibi, algoritmam iki nedenden dolayı daha yavaş:

  1. Diziyi bir uint ile değil bir dize ile doldurur.
  2. Yalnızca MT4'te kontrol ettiniz. Platformlar arasında dizi doldurma hızı onlarca kez değişebilir.
Not Ek olarak, algoritmam orijinal rengin bulunduğu dizi hücresinin numarasını döndürebilir. Bu, degradeyi oluşturmaya yardımcı olur. Sonuçta, hangi hücreden sola veya sağa hareket edeceğinizi bilmeniz gerekir.
MT5 vs MT4. Скорость заполнения массивов.
MT5 vs MT4. Скорость заполнения массивов.
  • 2017.12.12
  • www.mql5.com
Возникла необходимость замерить и сравнить скорость заполнения локальных и глобальных массивов на МТ4 и МТ5...
 
Реter Konow :

Algoritmaların hızındaki fark hakkında:

1. Sizin algoritmanız uint dizisini, benimki ise dizi dizisini dolduruyor.   (Gerekli bileşenleri gölgeden kolayca izole etmek ve onlarla çalışmak için tam olarak ipe ihtiyacım var). Aşağıdaki komut dosyasından her iki dizi türünü de doldurma hızındaki farkı görebilirsiniz.

2. Algoritmanız MT5'te, benimki ise MT4'te çalışıyor. Bu platformlarda dizi doldurma hızındaki fark benim tarafımdan burada tartışıldı - https://www.mql5.com/ru/forum/222333 . Aşağıdaki komut dosyasından farkı kendiniz göreceksiniz. Her iki platforma da koyun ve karşılaştırın.

MT4 ve MT5 platformlarında (ms) 30 bin hücre int ve string dizilerinin dolum hızının ölçülmesinin sonuçları:

Gördüğünüz gibi, algoritmam iki nedenden dolayı daha yavaş:

  1. Diziyi bir uint ile değil bir dize ile doldurur.
  2. Yalnızca MT4'te kontrol ettiniz. Dizileri platformlar arasında doldurma hızı onlarca kez değişebilir.
Not Ek olarak, algoritmam orijinal rengin bulunduğu dizi hücresinin numarasını döndürebilir. Bu, degradeyi oluşturmaya yardımcı olur. Sonuçta, hangi hücreden sola veya sağa hareket edeceğinizi bilmeniz gerekir.
Algoritmanızdan dizeleri kaldırdım. Onları neden kullandığın benim için bir gizemdi. Koda bakın, daha sonra gerçek rengi nasıl gösterirdim. Çok gereksiz kontrolleriniz var, teğet, dizi sıralama gibi işlevleri kullanıyorsunuz, ben sadece +-*/ kullanıyorum. Mt4 daha yavaş, bu anlaşılabilir, ancak 30 kat değil.
Pekala, biraz sonra algoritmamı 4'e koyacağım ve göreceğim. Neden 4 kullanıyorsun? Grafiksel bir arayüz için 4 hiç uygun değildir. Kaynakları bile okumuyor. Kodu 4'ten 5'e yeniden yapmak, tersinden çok daha zordur.
Neden: