帆布很酷! - 页 22

 
Nikolai Semko:

注意,彼得,我是如何实现6种颜色的多梯度的。

其中p从0到1变化。

uint Grad(double p)
  {
   static uint Col[6]={0xFFFF0000,0xFFFF00FF,0xFF0000FF,0xFF00FFFF,0xFF00FF00,0xFFFFFF00};
   p=p*5;
   int n=(int)p;
   if(n==5) return Col[5];
   double k=1-p+(int)p;
   argb c1,c2;
   c1.clr=Col[n];
   c2.clr=Col[n+1];
   return ARGB(255,c2.c[0]+uchar(k*((int)c1.c[0]-(int)c2.c[0])+0.5),
               c2.c[1]+uchar(k*((int)c1.c[1]-(int)c2.c[1])+0.5),
               c2.c[2]+uchar(k*((int)c1.c[2]-(int)c2.c[2])+0.5));
  }

ZS 但最外面的颜色有一个问题,我还没来得及解决。

非常原始。) p是一个任意的用户数,还是与某些参数相联系?

这是为了什么?

p=p*5;

你可以一次性发送正确的数字。 在这一行之后,p 不会返回到初始值。

在这里。

double k=1-p+(int)p;

你可以写。

double k=1-p+n;

而你为什么不使用代替

int n=(int)p;
int n=MathRound(p);

?

ARGB功能是一个标准的CCanvas功能,还是你的?

 
Nikolai Semko:

然而,最外层的颜色有一个错误,尚未得到纠正。

修正了它。

uint Grad(double p)
  {
   static uint Col[6]={0xFF0000FF,0xFFFF00FF,0xFFFF0000,0xFFFFFF00,0xFF00FF00,0xFF00FFFF};
   if(p>0.9999) return Col[5];
   if(p<0.0001) return Col[0];
   p=p*5;
   int n=(int)p;
   double k=p-n;
   argb c1,c2;
   c1.clr=Col[n];
   c2.clr=Col[n+1];
   return ARGB(255,c1.c[2]+uchar(k*(c2.c[2]-c1.c[2])+0.5),
                   c1.c[1]+uchar(k*(c2.c[1]-c1.c[1])+0.5),
                   c1.c[0]+uchar(k*(c2.c[0]-c1.c[0])+0.5));
  }

上面的代码已被纠正。

 
Реter Konow:

ARGB功能是CCanvas的内部功能,还是你的?

ARGB是CCanvas的一个定义。要想知道,你把鼠标指针点击在名字上,然后按Alt+G

ReTag Konow

这是做什么用的?

5是颜色的数量-1

 
Реter Konow:

而你为什么不使用它来代替

当我不需要双倍的时候,我更喜欢这个选项,因为它要快得多。
 
Nikolai Semko:

ARGB是CCanvas的一个定义。要想知道,请将鼠标指针按在名字上,然后按Alt+G

5是颜色的数量-1

好的。我不是在批评,只是在问。你很善于利用色彩工作。

 
Реter Konow:

你对颜色很有研究。

这只是一个爱好而已 :)
 
Artyom Trishkin:

我同意。但有一类用户的需求是不同的。

那如果kanvas指标返回的数据超过512怎么办?在这种情况下,缓冲区不会有帮助。而用户只是想从他们的程序中接收指标的数据。而且他们不想把它们嵌入专家顾问的正文中(我会放过一只猫头鹰--让它在没有摇铃的情况下飞翔......)。他们希望接收任何要求的条形数据,而不仅仅是可见的数据。而这是有道理的。而它的理由不仅是懒惰和想要得到一切容易和简单的东西,而且是TS的要求。

尼古拉-森科

如果我们谈论的是绝大部分不是程序员的用户,他们需要的是猫头鹰或指标。他们不需要为猫头鹰设立指标。

我只是提供了一些信息供大家思考,我并没有强加什么。让程序员自己决定哪些是方便的,哪些是不方便的。然而,我个人认为,我不会在我的EA中使用iCustom功能。

也许,我说得不太对。

很合乎逻辑的假设是,一个从市场上购买或下载了这样一个无画布缓冲指标的用户会想在他的EA中使用其数据。

那么对我来说,最合理的是通过这个指标的生产者所创建的一个专门的结构进行交换,这个结构是通过一个资源来读取的。

程序员应该在他/她的kanoval无缓冲区指示器中注意使这个结构在资源中保持最新,并向用户提供indu-file,在其中使用用户事件或在每个tick的到来时读取这个结构(我认为使用定时器是不合理的)。

而用户只需要包括一行代码#include...然后这个结构将一直有指标的实际数据。

你知道,这将比iCustom的 经典用法 更方便,因为这个结构可以包含方便命名的变量和不同类型的数据数组(不仅仅是双倍类型,如经典指标的缓冲区)。

我很确定,MQ的资源是以与指标的缓冲区相同的方式实现的。

 
Nikolai Semko:

我想我说得不太对。

假设一个从市场上购买或下载了这样一个canva指标的用户会想在他的EA中使用其数据,这是非常合乎逻辑的。

在这种情况下,对我来说最合理的是通过这个指标的生产者所创建的一个专门的结构进行交换,这个结构是通过一个资源来读取。

程序员应该在他/她的kanoval bufferless指示器中注意使这个结构在资源中保持最新,并向用户提供使用用户事件读取这个结构的indu-file。

而用户只需要包括一行代码#include...而这一结构将始终与指标的实际数据一起提供。

我认为这比iCustom 的经典用法 还要方便,因为它可以包含方便命名的变量和数据数组,用户不必费心考虑缓冲区数字的含义,只需在程序中包含一行代码就可以完全方便地访问指标数据。

我很确定,MQ的资源是以与指示器缓冲区相同的方式实现的。

通过资源本身传输数据的机制是非常简单的。这更多是关于两个项目之间的 "沟通 "方法。一个程序写,另一个程序读。因此,将数据(指标)写入资源的程序必须遵守指定的消息格式,而读取的程序必须 "知道 "这种格式。然后,程序之间的通信将是普遍和有效的。

 
Реter Konow:

通过资源本身传输数据的机制是非常简单的。这更多是关于两个方案之间的 "沟通 "方法。一个程序是写,另一个是读。因此,将其数据(指标)写入资源的程序必须遵守消息格式,而读取的程序必须 "知道 "这种格式。然后,沟通将是普遍和适用的。

当然会的。毕竟,接收和发射部分是由唯一设计指标本身的开发者完成的。

通过资源共享的机制并不那么简单。这需要一定的技能。这就是我认为这种方法的优点,因为这将是更高级的程序员的特权。

ZS彼得,一个月前你还不觉得这是极其简单和必要的。很高兴你听到并理解了我的信息。:))

 
Nikolai Semko:

嗯,当然会的。毕竟,接收和发射部分只由一个开发者制作,他自己开发了这个指标。

通过资源交换的机制并不那么简单。这需要一定的技能。这就是我认为这种方法的优点,因为这将是更高级的程序员的特权。

ZS彼得,一个月前你还不觉得这是极其简单和必要的。很高兴你听到并理解了我的信息。:))

是的,尼古拉,资源被证明是一种在程序之间交换数据 的非常有效的方法,它们的使用是基于你告诉我的联盟(也包括瓦西里)。所以,谢谢你们俩)。

将数据传输到一个资源中并从中读取的机制本身是很简单的,但如果你努力追求普遍性,信息格式就是一个棘手的问题。如果我们解决一个特定指标的问题,一切都很简单。