将颜色分解为阴影的功能。 - 页 7

 
Vladislav Andruschenko:


嗯,英文名字的发明是有原因的。

我可以给你另一个例子,当俄罗斯名字会杀死你的代码。

你把你的代码给一个没有西里尔文的客户。就这样了。....全部消失.....:-)

而客户需要的是代码,还是解决方案?

 
Реter Konow:

客户要的是代码还是解决方案?

这就是为什么你需要决定目标和终端用户。

设身处地为用户着想,忘记你所做的一切:用户会有什么感觉?

一切都会对他或她有意义吗?

 
Vladislav Andruschenko:

这就是为什么你需要决定目标和终端用户。

设身处地为用户着想,忘记你所做的一切:用户会有什么感觉?

他或她会理解一切吗?

我同意。我确实用两种语言写作。我可以纯粹用英语来做。

 
Реter Konow:

你,作为一个讲英语的人,可以随意忽略我的决定。那里的英语单词很少。

顺便说一下,既然你对英文代码这么在行,请帮我看看Nikolay Semko提议的代码。

说实话,我不明白它是如何运作的。它有很多短的英语音节。就是你喜欢的。

这就是问题所在,我知道大约30%的英语,而且只是技术性的,不是对话性的。

在编程中,只有几十个单词,在写完字面上的1-2个程序后,你就可以记住它们了。

P.S. 你发布的代码,只有5个变量,他们怎么会不明白?

 
Vitaly Muzichenko:

这就是问题所在,我知道大约30%的英语,而且只是技术性的,不是对话性的。

在编程中,只有几十个单词,通过编写字面上的1-2个程序就可以记住它们了。

P.S. 你发布的代码,只有5个变量,他们怎么会不明白?

好吧,我在我的代码中计算了30个变量(在主函数中)。那你要数到多少呢?(开玩笑)。

30%的技术英语是非常强的。你知道技术英语有多丰富吗?

几十个字的编程?现在我知道为什么我们不理解对方了))。


zy。如果你指的是尼古拉的代码,请说明它是如何工作的。

 
总而言之,这个话题可以结束了。如果有人发现这些代码有用,我很高兴。如果没有,那就没有...
 
Ре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的程序本身,你也有4的编程风格。我试着把你的算法转移到5,但没有成功,因为它只显示一些颜色的条纹。这很可能是因为变量范围的混淆而发生的,但由于代码不适合调试,要解决这个问题是非常困难的,所以我放弃了。我理解,你习惯于你的编程风格,而你不理解我的风格。这是相互的,因为我习惯于看到一个程序的结构,而不是像书一样阅读它。而且在你的代码中,不可能调试和了解在什么时候定义的变量,长长的变量名占据了90%的程序文本,结果是程序结构丢失,溶于这些长长的芭比色的变量名中。总而言之,你的代码在我个人看来像是某种S&M。

此外,你的算法结果是慢了几十倍,而原因甚至不是 MQL4。我搞不清楚。只有 RGB时候,什么切线,什么三角形

并尝试掌握 工会 --非常有用的东西。

为了更好地理解我的意思,你应该试着用你的算法(MQL4)和我的算法(MQL5)运行我所附的两个脚本。


你也有这样的失误。

只是我还不明白,是MT4速度慢的问题还是你的算法有问题。

附加的文件:
 
Nikolai Semko:


1.尼古拉,即使比较你引用的前两张图片,你也能立即看出你的版本上笼罩着一层灰色的阴霾。仔细看看。而在我的版本中,颜色要亮得多。你认为你的版本能更好地传达颜色吗?

2.我把Windows的调色板作为一个参考。我得到了99%的颜色匹配。检查你的颜色,看它们是否与Windows匹配。像我一样打印出一系列的色调。然后打开图表属性 和调色板。在窗口中输入初始颜色的成分值,然后上下移动滑块。数字会发生变化。你在打印纸上寻找这些数字,看看它们的匹配程度。

3.我理解具体的执行情况可能有所不同。我没有专门检查过我的算法的速度,我也没有针对速度进行优化。你的解决方案可能看起来给你一个更好的速度。我不否认这一点。

4.在光学领域有一个棱镜的概念。有一个光的折射的概念。我正是从这个范式开始的。我绘制了256*256(从0到255)。然后我绘制了线条。我发现了颜色的折射轴。它位于图表的中心。每个组件是一条由两段组成的曲线。该颜色总共有三条弧线,每条弧线都在图形的中心折射,分为两段。每段都有自己的角度。原始颜色在图形上有一个坐标。它可以在其阴影中找到。我的任务是找到初始颜色,确定所有六条线段的角度,并沿其线段得到每个分量的值。

5.切线是相邻的切线与相对的切线的比率。它对于计算线段的角度和计算对立面的高度是必要的(这是在一个具体的颜色色调中的一个组成部分的价值)。

6.至于编程风格,我建议我们不要讨论这个问题。对这个话题的本质是不相关的。

7.关于不测--也许是这样。但我还没有遇到过他们。因此,我不知道。


顺便说一下,告诉我颜色分解在你的版本中是如何工作的。我并不完全了解它。

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


只是还不明白,是MT4速度慢的问题还是你的算法有问题。

关于算法的速度差异。

1.你的算法是填充uint 数组 而我的算法是填充字符串 数组。(我需要的正是字符串,以便轻松地从阴影中提取必要的成分,然后用它们工作)。你可以从下面的脚本中看到填充两种类型数组的速度差异。

2.你的算法对МТ5有效,而我的算法对МТ4有效。我在这里讨论了这些平台上的阵列填充速度的差异--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上测量了30 000个int和string数组单元的速度(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. 它填充的是字符串数组而不是uint数组。
  2. 你只在MT4上测试。平台之间填充阵列的速度可以相差几十倍。
P.S. 此外,我的算法可以返回原始颜色所在的数组单元格的数量。它有助于创造一个梯度。毕竟,你需要知道从哪个单元格向左或向右移动。
MT5 vs MT4. Скорость заполнения массивов.
MT5 vs MT4. Скорость заполнения массивов.
  • 2017.12.12
  • www.mql5.com
Возникла необходимость замерить и сравнить скорость заполнения локальных и глобальных массивов на МТ4 и МТ5...
 
Реter Konow:

关于算法的速度差异。

1.你的算法填充了一个uint 数组 而我的算法填充了一个字符串 数组。(我需要字符串来轻松地从阴影中提取必要的成分,然后用它们工作)。你可以从下面的脚本中看到填充两种类型的数组的速度差异。

2.你的算法对МТ5有效,而我的算法对МТ4有效。我在这里讨论了这些平台上的阵列填充速度的差异--https://www.mql5.com/ru/forum/222333。 从下面的脚本中,你可以自己看到区别。把它放在两个平台上并进行比较。

我在MT4和MT5上测量了30 000个int和string数组单元的速度(ms)。

正如你所看到的,我的算法比较慢,有两个原因。

  1. 它填充的是字符串数组而不是uint数组。
  2. 你只在MT4上测试。平台之间填充阵列的速度可以相差几十倍。
P.S. 此外,我的算法可以返回原始颜色所在的数组单元格的数量。它有助于创造一个梯度。毕竟,你需要知道从哪个单元格向左或向右移动。
我从你的算法中取出了丁字裤。我对你为什么使用它们感到很神秘。看看代码,那我如何输出真实的颜色。 你有很多不必要的检查,你使用了正切、数组排序等函数,我只+-*//。Mt4比较慢,这是可以理解的,但不会慢30倍。
好吧,我一会儿把我的算法放在4号上看看。你为什么还要用4呢?对于GUI来说,4是完全不好的。它甚至不读取资源。从4到5,转换代码要比其他方式难得多。