색상을 음영으로 분해하는 기능. - 페이지 7

 
Vladislav Andruschenko :


글쎄, 영어로 된 이름은 이유가 있습니다.

러시아어 이름이 코드를 죽일 때와 같은 또 다른 예를 들 수 있습니다.

키릴 문자가 없는 고객에게 코드를 전송합니다. 모두. .... 다 없어졌어..... :-)

그리고 고객에게 코드가 필요합니까, 아니면 솔루션이 필요합니까?

 
Реter Konow :

그리고 고객에게 코드가 필요합니까, 아니면 솔루션이 필요합니까?

그렇기 때문에 목적과 최종 사용자를 결정해야 합니다.

사용자 입장에서 모든 것을 잊어버리십시오. 사용자는 어떻게 느낄까요?

그는 모든 것을 이해할까요?

 
Vladislav Andruschenko :

그렇기 때문에 목적과 최종 사용자를 결정해야 합니다.

사용자 입장에서 모든 것을 잊어버리십시오. 사용자는 어떻게 느낄까요?

그는 모든 것을 이해할까요?

동의한다. 저는 두 가지 언어로 글을 씁니다. 나는 유창한 영어를 말할 수 있습니다.

 
Реter Konow :

당신은 영어를 할 줄 아는 사람으로서 내 결정을 무시해도 됩니다. 영어 단어가 거의 없습니다.

그건 그렇고, 당신은 영어 코드에 너무 익숙하기 때문에 Nikolai Semko가 제안한 코드를 구문 분석하는 것을 도와주세요.

솔직히 말해서, 나는 그것이 어떻게 작동하는지 이해하지 못합니다. 짧은 영어 음절이 많이 있습니다. 당신이 좋아하는 것.

문제의 사실은 내가 영어의 약 30%를 알고 있고 기술적인 부분만 알고 대화형은 아니라는 것입니다.

프로그래밍에는 수십 개의 단어만 있고 말 그대로 1-2개의 프로그램을 작성하면 기억할 수 있습니다.

추신 님이 올리신 코드는 변수가 5개밖에 없는데 어떻게 처리를 못하나요?

 
Vitaly Muzichenko :

문제의 사실은 내가 영어의 약 30%를 알고 있고 기술적인 부분만 알고 대화형은 아니라는 것입니다.

프로그래밍에는 수십 개의 단어만 있고 말 그대로 1-2개의 프로그램을 작성하면 기억할 수 있습니다.

추신 님이 올리신 코드는 변수가 5개밖에 없는데 어떻게 처리를 못하나요?

글쎄, 나는 내 코드(주 함수에서)에서 30개의 변수를 세었다. 얼마나 생각하세요? (농담).

30% 기술 영어는 매우 강력합니다. 테크니컬 영어가 얼마나 풍부한지 아세요?

프로그래밍에서 수십 단어? 이제 우리가 서로를 이해하지 못하는 이유가 분명합니다.))


추신 Nikolai의 코드를 의미하는 경우 작동 방식을 알려주십시오.

 
일반적으로 주제를 닫을 수 있습니다. 코드가 누군가에게 유용하다면 기쁩니다. 글쎄, 아니, 아니...
 
Реter Konow :

그건 그렇고, 사진으로 판단하면 여기에서 색상 분해가 완료되지 않았습니다. 반만. 범위는 특정 색상의 모든 음영을 통해 절대 흰색에서 절대 검정색으로 확장되어야 합니다.

그래, 너가 맞아.

나는 그것을 구현하고 당신의 코드를 분석하고 시각화하려고 노력했습니다.

그것이 나온 것입니다.

 #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;
        }
     }
  }

당신의 선택


내 버전:


설명하겠습니다:

흰색 선은 톤 선(R+B+G 색상의 합)입니다. 이상적으로는 완전히 직선인 대각선이어야 합니다. 나는 그것을 구현했지만 당신은하지 않습니다.

빨강, 파랑 및 녹색 선은 색 비율 선입니다. 스펙트럼의 고조파라고 합시다. 이상적으로는 수직이어야 합니다. 그러나 이것은 초기 최대 색상이 255가 된 후에는 수행할 수 없습니다. 그러나 다른 한편으로 변곡점(빨간색 화살표로 표시)이 없고 부드러운 호가 있는 상황을 달성할 수 있습니다. 그러면 그라디언트가 "덩어리" 없이 보일 것입니다. 이 문제는 당신과 나의 알고리즘에 존재합니다. 이것은 고칠 수 있지만 아직 요점이 보이지 않아 시간이 많이 아쉽습니다. 실제로는 한 색상에서 다른 색상으로의 그라디언트가 필요합니다. 이것은 스펙트럼의 엄격한 수직 고조파로 쉽게 구현됩니다(상단 고조파의 플러핑은 반올림의 결과이므로 정상입니다). 이 문제에서는 그라디언트가 검은색에서 세 번째 색상을 통해 흰색으로 이동하므로 이러한 꼬임이 존재합니다.

이상하게도 MQL5로 작성했다고 확신했습니다. 그러나 4-ki 프로그램 자체가 있다는 사실 외에도 4-ki 프로그래밍 스타일도 있습니다. 귀하의 알고리즘을 5-ku로 이전하려고 시도했지만 아무 일도 일어나지 않았습니다. 일반적으로 몇 가지 색 줄무늬를 그립니다. 이는 변수의 범위와 혼동이 있기 때문일 가능성이 높지만 코드를 디버깅할 수 없고 손을 흔들었다는 점에서 수정하기가 극도로 어렵다. 나는 당신이 당신의 프로그래밍 스타일에 익숙하고 내 스타일이 명확하지 않다는 것을 이해합니다. 상호적이기 때문에 나는 프로그램을 책처럼 읽는 것이 아니라 프로그램의 구조를 보는 데 익숙하다. 그리고 당신은 변수 정의의 어느 지점에서 디버깅 및 이해가 불가능할 뿐만 아니라 긴 변수 이름이 프로그램 텍스트의 90%를 채우고 결과적으로 프로그램 구조가 손실되어 이러한 긴 바비 색으로 분해됩니다. 변수 이름. 일반적으로 개인적으로 귀하의 코드는 일종의 사도마소로 인식됩니다.  

게다가 당신의 알고리즘은 10배 느린 것으로 밝혀졌고, 그 이유는 MQL 4도 아닌데.. 도저히 알 수가 없었다. RGB 만 있을 때 어떤 접선, 어떤 삼각형이 있습니까?

그리고 노동 조합 을 마스터하려고 - 매우 유용한 것.

내가 말한 내용을 더 잘 이해하려면 귀하의 알고리즘(MQL4)과 내 알고리즘(MQL5)에 첨부한 두 스크립트를 모두 실행하는 것이 좋습니다.


다음과 같은 경우도 있습니다.

나는 아직 그것을 알아내지 못했습니다. 이것은 MT4의 느림과 알고리즘의 오류의 문제입니다.

파일:
 
Nikolai Semko :


1. Nikolay, 당신이 가져온 처음 두 사진을 비교해도 회색 안개가 당신의 버전 위에 걸려 있음을 즉시 알 수 있습니다. 주의 깊게 봐. 그리고 내 버전에서는 색상이 훨씬 더 밝습니다. 귀하의 버전이 색상을 더 잘 전달한다고 생각하십니까?

2. 표준의 경우 Windows 색상 팔레트를 사용했습니다. 99%의 색상 일치를 달성했습니다. Windows 색상과 일치하는지 색상을 확인하십시오. 내가 한 것처럼 음영으로 배열을 인쇄하십시오. 그런 다음 차트 속성 과 팔레트를 엽니다. 상자에 원래 색상의 구성 요소 값을 입력한 다음 슬라이더를 위아래로 이동합니다. 숫자가 변경됩니다. 인쇄물에서 이 숫자를 찾고 어떻게 일치하는지 확인합니다.

3. 특정 구현이 다를 수 있음을 이해합니다. 나는 특별히 내 알고리즘의 속도를 확인하지 않았고 속도를 위해 최적화하지도 않았습니다. 아마도 귀하의 솔루션이 더 빠른 속도를 제공할 것입니다. 나는 부정하지 않을 것이다.

4. 광학에는 프리즘이라는 개념이 있습니다. 빛의 굴절. 이것이 바로 제가 시작하는 패러다임입니다. 저는 256*256(0에서 255까지)을 그렸습니다. 다음으로 라인을 만들었습니다. 색상의 굴절 축을 찾았습니다. 그래프의 중앙에 있습니다. 각 구성 요소는 두 개의 세그먼트로 구성된 곡선입니다. 전체적으로 색상에는 세 개의 곡선이 있으며 각 곡선은 그래프 중앙에서 굴절되어 두 개의 세그먼트로 나뉩니다. 각 세그먼트에는 고유한 각도가 있습니다. 원래 색상은 차트에 좌표가 있습니다. 그늘에서 찾을 수 있습니다. 내 임무는 원래 색상을 찾고, 6개 세그먼트 모두의 각도를 결정하고, 선을 따라 각 구성 요소의 값을 가져오는 것이었습니다.

5. 접선은 인접한 다리와 반대쪽 다리의 비율입니다. 세그먼트의 각도를 계산하고 반대쪽 다리의 높이(특정 색조의 구성 요소 값)를 계산하는 데 필요합니다.

6. 프로그래밍 스타일에 관해서는 이에 대해 논의하지 않는 것이 좋습니다. 주제와 관련이 없습니다.

7. 사건에 관해서는 - 아마도 그럴 것입니다. 하지만 지금까지 나는 잡히지 않았다. 그러므로 나는 모른다.


그건 그렇고, 귀하의 버전에서 색상 분해가 어떻게 작동하는지 알려주십시오. 나는 완전히 이해하지 못했습니다.

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


나는 아직 그것을 알아내지 못했습니다. 이것은 MT4의 느림과 알고리즘의 오류의 문제입니다.

알고리즘 속도의 차이:

1. 귀하의 알고리즘은 uint 배열을 채우고 광산은 문자열 배열을 채웁니다.   (필요한 구성 요소를 그늘에서 쉽게 분리한 다음 작업하려면 정확한 문자열이 필요합니다.) 아래 스크립트에서 두 가지 유형의 배열을 채우는 속도의 차이를 확인할 수 있습니다.

2. 귀하의 알고리즘은 MT5에서 작동하고 광산은 MT4에서 작동합니다. 이러한 플랫폼에서 배열을 채우는 속도의 차이는 https://www.mql5.com/ru/forum/222333 에서 제가 논의했습니다. 아래 스크립트에서 차이점을 직접 확인할 수 있습니다. 두 플랫폼에 놓고 비교하십시오.

 //+------------------------------------------------------------------+
//|                        Проверка скорости заполнения массивов.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 및 MT5 플랫폼에서 int 및 string형 배열의 30,000개 셀을 채우는 비율을 측정한 결과(ms):

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

보시다시피 내 알고리즘은 두 가지 이유로 느립니다.

  1. 배열을 단위가 아닌 문자열로 채웁니다.
  2. MT4에서만 확인했습니다. 플랫폼 간에 어레이를 채우는 속도는 수십 배 차이가 날 수 있습니다.
PS 또한 내 알고리즘은 원래 색상이 있는 배열 셀의 번호를 반환할 수 있습니다. 이것은 그라디언트를 만드는 데 도움이 됩니다. 결국 왼쪽 또는 오른쪽으로 이동할 셀을 알아야 합니다.
MT5 vs MT4. Скорость заполнения массивов.
MT5 vs MT4. Скорость заполнения массивов.
  • 2017.12.12
  • www.mql5.com
Возникла необходимость замерить и сравнить скорость заполнения локальных и глобальных массивов на МТ4 и МТ5...
 
Реter Konow :

알고리즘 속도의 차이:

1. 귀하의 알고리즘은 uint 배열을 채우고 광산은 문자열 배열을 채웁니다.   (필요한 구성 요소를 그늘에서 쉽게 분리한 다음 작업하려면 정확한 문자열이 필요합니다.) 아래 스크립트에서 두 가지 유형의 배열을 채우는 속도의 차이를 확인할 수 있습니다.

2. 귀하의 알고리즘은 MT5에서 작동하고 광산은 MT4에서 작동합니다. 이러한 플랫폼에서 배열을 채우는 속도의 차이는 https://www.mql5.com/ru/forum/222333 에서 제가 논의했습니다. 아래 스크립트에서 차이점을 직접 확인할 수 있습니다. 두 플랫폼에 놓고 비교하십시오.

MT4 및 MT5 플랫폼에서 int 및 string형 배열의 30,000개 셀을 채우는 비율을 측정한 결과(ms):

보시다시피 내 알고리즘은 두 가지 이유로 느립니다.

  1. 배열을 단위가 아닌 문자열로 채웁니다.
  2. MT4에서만 확인했습니다. 플랫폼 간에 어레이를 채우는 속도는 수십 배에 달할 수 있습니다.
PS 또한 내 알고리즘은 원래 색상이 있는 배열 셀의 번호를 반환할 수 있습니다. 이것은 그라디언트를 만드는 데 도움이 됩니다. 결국 왼쪽 또는 오른쪽으로 이동할 셀을 알아야 합니다.
귀하의 알고리즘에서 문자열을 제거했습니다. 왜 그것들을 사용했는지는 미스터리였습니다. 코드를 보면 실제 색상을 어떻게 표시할까요? 불필요한 검사가 많고 접선, 배열 정렬과 같은 기능을 사용합니다. 저는 +-*/만 사용합니다. Mt4는 더 느리고 이해할 수 있지만 30배는 아닙니다.
글쎄, 조금 후에 나는 내 알고리즘을 4에 놓고 볼 것입니다. 왜 4를 전혀 사용합니까? 그래픽 인터페이스의 경우 4는 전혀 적합하지 않습니다. 리소스도 읽지 않습니다. 4에서 5로 코드를 다시 실행하는 것은 그 반대의 경우보다 훨씬 어렵습니다.