龙听期货论坛's Archiver

龙听 发表于 2023-10-30 15:33

multicharts 同一图表不同信号指标之间传递数值和字符

一、访问未来数据
     
MC可以访问历史数据和当根bar的数据,不可以访问未来数据,但是可以访问下一根bar的 Open、Date、Time、DateTime和Time_s数据;举例,当我们需要访问收盘价Close的前第3根bar的数据时,使用语句Close 3 bar ago或者Close[3]来访问;访问当根bar的收盘价,直接使用Close关键字就可以了,后面不需要附带0 bar ago 或者[0]字样;当我们试图通过Close[-1]来访问未来第一根bar时,就会弹出“试图访问未来数据”提示窗口,但是并不能说完全不能访问未来数据,MC只可以在信号脚本中(不能使用在指标中,也不可以在函数中)访问Open、Date、Time、DateTime和Time_s关键字的下一根bar的数据,而且必须在关键字的后面加上next bar来访问,如通过 Open next bar 来访问下一根bar的开盘价,不能通过Open[-1]来访问。

二、信号脚本执行的优先顺序
      
当在一个图表上插入多个信号脚本时,信号脚本的执行顺序默认对应到它们在“设置对象”窗口“信号”栏位的排列顺序;图1中,test3排列在test4前面,所以信号test3的执行顺序也在test4前面;若test4排列在test3前面,那么信号test4的执行顺序就在test3的前面;排列顺序可以通过右侧的“上移”和“下移”进行调整。
      
然而,当信号脚本test3中有引用下一根bar的数据的语句时,如Opennext bar语句时,那么信号实际执行的顺序是test4先执行,test3后面执行,尽管在图1中信号test3排列在test4前面;当test3和test4两个信号脚本中都有引用下一根bar的数据时,那么它们执行的顺序还是对应它们在“信号”栏位的排列顺序。

三、数值和字符传递
      
MC中有许多关键字可以在图表上标记,也有很多关键字是取图表上的标记的,那么我们可以利用一个信号先在图表上进行标记,然后通过另一个信号在图表上取这个标记,从而达到不同信号之间进行传递信息的目的,而传递的信息类型可以是数值,也可以是字符,布尔逻辑类型可以通过数值进行转换。在图表上做标记的关键字有text_new_bn和arw_new_bn等等,下面我们简单介绍如何利用text系列关键字传递正整数和字符,以及进一步扩展到浮点数和布尔类型。

1、  传递正整数和字符串

信号test3代码:[code]
once cleardebug;
[/code]{清空输出窗口的数据}[code]
once (true) begin
    text_new_bn(currentbar,close,"text");
end;
[/code]{第一次执行代码的时候,在图表上新建一个文本,第一个文本的编号为1}[code]
text_setstring(1,numtostr(close,3));
[/code]{首先将收盘价转换为字符串,然后将编号为1的文本的文字设置为该字符串}[code]
text_setsize(1,barnumber);
[/code]{将编号为1的文本的文字的大小设置为当根bar的编号}[code]
print(" test3 ",date:7:0,time:7:0,"currentbar=",currentbar,"text_string=",text_getstring(1),"text_size=",text_getsize(1));
[/code]{利用关键字print将括号中的内容显示到公式编辑器的“输出”窗口,其中通过text_getstring来取编号为1的文本的字符串,通过text_getsize来取编号为1的文本的字体大小}

信号text5代码:[code]
print(" test5 ",date:7:0,time:7:0,"currentbar=",currentbar,"text_string=",text_getstring(1),"text_size=",text_getsize(1));
[/code]{利用print将后面括号中的内容显示到公式编辑器的“输出“窗口,通过text_getstring来取字符串,通过text_getsize来取数值}

通过在图表上新建一个文本,就可以将该文本作为该图表的全局变量来传递整数和字符串;由于两个信号的执行有先后顺序,所以信息的传递会考虑到顺序问题,先假设test3的执行先于test5的执行,那么字符串和整数会先通过test3进行存储,然后test5再取存储的整数和字符串,这两个步骤发生在同一个bar内(如果开启bar内,会发生在同一笔tick内);若test5的执行先于test3的执行,那么test5中取的整数和字符串就是上一根bar上(如果开启bar内,会发生在上一笔tick)test3存储的整数和字符串,因为当根bar上的存储是由test3中的语句执行的,而test3的执行后于test5,所以导致了延迟。

由于插入到该图表上的所有指标和信号都可以取图表上的标记,那么该文本可以将信息从一个信号或者指标传递到任意一个该图表上的指标或者信号脚本。

2、 传递浮点数和布尔型
      
布尔型是true和false,而我们可以分别使用两个不同的整数来分别对应到true和false就可以了;对于浮点数,那么也可以将整数部分和小数部分拆开,然后分别将该浮点数的正负、整数部分、小数部分和小数位数存储到图表上的4个文本上去,那么在取的时候,再进行拼接就可以了。

3、 全局变量
      
无论是投资组合交易中的无图表全局变量还是全局函数gvsetnameddouble、gvgetnameddouble、gvsetnamedint和gvgetnamedint,它们的存储与读取逻辑都是与上述步骤相同的,也就是先存储,然后再读取,如果在当根bar上(或者开启bar内)是先执行了读取,再执行了存储,那么就会首先一根bar(一笔tick)的延迟,也就是说,在当根bar上,读取的是上一根bar(上一笔tick)上存储的数据。

全局函数gvsetnameddouble、gvgetnameddouble、gvsetnamedint、gvgetnamedint不能用于传递字符串,只能传递数值,double对应到浮点数,而int对应到整数;当两个信号或者指标分别插入到不同的图表上,通过全局函数进行传递信息时,那么逻辑也是先存储再读取,只是这种情况下,有可能一个存储了很多次,另一个才读取了一次(读取最近存储的那个值),这个是由于不同的商品合约收盘的时间(开启bar,就是tick的时间不一致导致的)不一致导致的。

[img]http://p.algo2.net/2023/1030/924c1e245be58.png[/img]
图1 信号排列顺序

页: [1]