龙听期货论坛's Archiver

龙听 发表于 2018-5-8 16:48

MultiCharts编程-PowerLanguage脚本如何执行

[b]二、脚本如何执行[/b]

PowerLanguage公式可用在由MultiCharts创建的图表和投资组合回测(Portfolio Backtester)中。
可用的PL公式分为两个主要类型:指标(Indicators)和信号(Signals)。
一个指标是一个可视的技术分析工具,用来分析市场条件、定义和预测趋势以及市场模式。指标即是一个可视化的数学公式,包含一个或多个画线、直方图、一系列点或穿越状态、高价和低价、左右的tick或在一个图上包含以上全部的信息。指标的计算只能用价格、成交量数据。
一个信号是一个机械的技术分析工具,用来系统地根据一系列交易规则指定进场或出场点位。交易点位在图表上以文字和箭头标示。策略可以容易地由多个信号组合。由信号指定的进出场点位,可以用来发送委托单到交易商,完成全自动的交易执行。
根据它们不同的使用目的,指标和信号对于价格数据的计算有不同的方式。下面分别阐述两者。
在阐述前,需要先了解两个基本概念:完成bar和指标运算参考的最大bars数量。
A.完成bar
当一个bar已经收盘并且无法加入额外的tick时,可认为此bar是一个完成bar。
*基于时间的图表,一旦设定的bar周期的时间间隔已过,下一个时间戳的第一笔tick已接收到,那么这个bar为已收盘;或者三秒内没有再收到额外的tick,也视为这个bar已经结束。
*基于tick的图表,一旦定义的bar数量已经到来,则这个bar视为已结束。

*基于范围的图表,一旦接收的新tick的价格超出原始的价格范围,则这个bar视为已结束。
*基于量的图表,一旦接收到的tick为当前bar所带来的成交量达到定义的合约数目,则这个bar视为已结束。
*基于变动的图表,一旦接收到的tick为当前bar所带来的的价格达到定义的价格变动数,则这个bar视为已结束。
B.指标运算参考的最大Bars数量
一个公式脚本可以参考前面bars的值来用于当前bar的计算。当在脚本中参考了前面N根bar,则公式可以从第N+1根bar开始可以看到绘图或委托行为。为了能让脚本开始执行计算, 前面预留了bars数目,叫做指标运算参考的最大Bars数量,或MaxBarsBack。MaxBarsBack的值可以选择「自动检测」或「用户指定」(可在设置指标->属性中设定)。
当选择为「自动检测」时,MaxBarsBack将会初始化为指标中引用的最大数据偏移量(即最大的N Bars Ago中的N值)。然而,脚本中引用的数据偏移如果是变量,MaxBarsBack的初始值可能会太小;在这种情形下,MaxBarsBack的值将自动增加5或乘以1.618,产生一个较高的值,在重新计算指标。
MaxBarsBack自动检测的过程可能会导致:在指标第一次应用到图表上时,某些函数在图上最开始的一些bar的计算重复。为了避免这种情况,MaxBarsBack可以设定为「用户指定」。
选择最小的MaxBarsBack来满足一个特定的指标或信号的计算,可手动设定这个值。推荐的初始值为50。
1.指标执行方式
指标的目的是在图表上绘出可视的数学公式,绘图的创建基于一个或多个价格数据系列。
当指标被插入到图表中时,第一次的计算是对于完成bar一个接着一个的计算,并从图上第一个bar开始。整个脚本对于每个完成bar都执行一次。在每个bar上,依据计算结果,指标脚本可以向外输出图形、文字、改变绘图颜色、音频警报等。如果指标脚本中含有前面bar的引用值,那么指标执行输出的第一个Bar将跟随“指标参考运算的最大Bars数量”的不同而不同。
一旦图上所有的完成bar都执行完成,一个指标将继续执行图上最后一个bar,以tick by tick的运算,不等待这根bar的形成。一个未完成bar是自上一个bar完成以来,接收到的所有tick的总和。新的一笔tick接收时,整个脚本将会在那根Bar执行,直到此bar已完

全形成并且下一个Bar已开始。指标脚本对于未完成bar的方式和已完成bar相同,并可以在基于未完成bar的计算结果上做出行动。
请注意只有最后的未完成bar在每一个新的tick收到时会重新计算,并非整个数据系列。
指标在一个bar的执行过程叫做重新计算或更新。默认指标更新是基于每笔tick资料的。但是,在某些情形下,它可能出现不良状况;
每笔tick更新大量的复杂指标需要更多实质性的系统资源。每笔tick资料都更新的操作可以在MultiCharts的设置中关闭。
2.信号执行方式
信号是策略的基本组件。信号实质上比指标更复杂,需要考虑大量的因素。信号支持回测和自动交易执行。
当信号被插入到图表中时,第一次的计算是对于完成bar一个接着一个的计算,并从图上第一个bar开始。整个脚本对于每个完成bar都执行一次。在每个bar上,依据计算结果,信号脚本可以执行一个或多个交易委托。委托单会在图上标记箭头或其他标识,可伴有弹出框或音频警报等。如果信号脚本中含有前面bar的引用值,那么信号执行输出的第一个Bar将跟随“指标参考运算的最大Bars数量”的不同而不同。
默认,一旦图上所有的完成bar都执行完成,一个信号将中断执行,直到新的完成bar已形成,然后全部脚本会在新的bar再次执行。
信号执行方式可以选择启用bar内交易来调整。当开启bar内交易执行状态为已启用时,信号对于最新的bar计算不用等到它的完成。而是,每当新的一笔tick接收到时,最新的bar就会重新计算一次,直到这根bar的完成并且下一根bar已经开始。一个未完成bar是自上一个bar完成以来,接收到的所有tick的总和。启用bar内模式,信号脚本对于未完成bar的方式和已完成bar相同,并可以在基于未完成bar的计算结果上做出行动。
请注意只有最后的未完成bar在每一个新的tick收到时会重新计算,并非整个数据系列。
A.委托单执行优先级
一个信号可以在一个bar中执行多个委托单。委托单可以由相同或不同的语句执行。
根据执行语句类型的不同,委托单的执行分为3组:

1.由 This Bar [On] Close语句执行
2.由 Next Bar [At] Market和Next Bar [At] Open语句执行
3.由Next Bar [At] Price Limit和Next Bar [At] Price Stop语句执行


[p=30, 2, left][font=宋体][size=13.0pt]在一个委托组内,委托单执行的优先级排序是基于当前部位(持仓)的:[/size][/font][size=13.0pt][/size][/p][table=98%]
[tr]  [td=4,1]  [p=30, 2, center][b][font=宋体]委托单执行优先级表[/font][/b][b][/b][/p]  [/td] [/tr]
[tr]  [td=4,1]  [p=30, 2, center][font=宋体]数值高者优先级高[/font][/p]  [/td] [/tr]
[tr]  [td=1,1,34%]  [p=30, 2, left][b][font=宋体]持仓部位[/font][/b][b][/b][/p]  [/td]  [td=1,1,21%]  [p=30, 2, center][b][font=宋体]无持仓[/font][/b][b](Flat)[/b][/p]  [/td]  [td=1,1,22%]  [p=30, 2, center][b][font=宋体]多头[/font][/b][b](Long)[/b][/p]  [/td]  [td=1,1,22%]  [p=30, 2, center][b][font=宋体]空头[/font][/b][b](Short)[/b][/p]  [/td] [/tr]
[tr]  [td=1,1,34%]  [p=30, 2, left][b][font=宋体]多头进场[/font][/b][b](Long Entry)[/b][/p]  [/td]  [td=1,1,21%]  [p=30, 2, center]1[/p]  [/td]  [td=1,1,22%]  [p=30, 2, center]1[/p]  [/td]  [td=1,1,22%]  [p=30, 2, center]2[/p]  [/td] [/tr]
[tr]  [td=1,1,34%]  [p=30, 2, left][b][font=宋体]空头进场[/font][/b][b](Short Entry)[/b][/p]  [/td]  [td=1,1,21%]  [p=30, 2, center]1[/p]  [/td]  [td=1,1,22%]  [p=30, 2, center]2[/p]  [/td]  [td=1,1,22%]  [p=30, 2, center]1[/p]  [/td] [/tr]
[tr]  [td=1,1,34%]  [p=30, 2, left][b][font=宋体]多头出场[/font][/b][b](Long Exit)[/b][/p]  [/td]  [td=1,1,21%]  [p=30, 2, center]-[/p]  [/td]  [td=1,1,22%]  [p=30, 2, center]1[/p]  [/td]  [td=1,1,22%]  [p=30, 2, center]-[/p]  [/td] [/tr]
[tr]  [td=1,1,34%]  [p=30, 2, left][b][font=宋体]空头出场[/font][/b][b](Short Exit)[/b][/p]  [/td]  [td=1,1,21%]  [p=30, 2, center]-[/p]  [/td]  [td=1,1,22%]  [p=30, 2, center]-[/p]  [/td]  [td=1,1,22%]  [p=30, 2, center]1[/p]  [/td] [/tr]
[/table]

龙听 发表于 2018-5-8 17:11

[p=30, 2, left][font=宋体][size=13.0pt]多个同方向的委托被分配的相对于彼此的优先级,是基于委托语句在信号脚本中的列表顺序而顺序执行。当多个信号组合来创建一个策略时,由不同信号执行的、同方向的委托被分配的相对于彼此的优先级,是基于委托单所在信号出现在信号标签中的顺序。先插入到图表中的信号顺序靠前。[/size][/font][size=13.0pt][/size][/p][p=30, 2, left][font=宋体][size=13.0pt]一旦委托单被排序后,优先级最高的先执行。有一个重要注意事项:与当前持仓部位方向相反的进场委托,不是简单的只平掉当前的持仓,而是会反向开仓。比如:当持有[/size][/font][size=13.0pt]1[/size][font=宋体][size=13.0pt]手空头[/size][/font][size=13.0pt](Short)[/size][font=宋体][size=13.0pt]时,[/size][/font][size=13.0pt]1[/size][font=宋体][size=13.0pt]手多头[/size][/font][size=13.0pt](Long)[/size][font=宋体][size=13.0pt]的进场委托,结果将会是平掉空头持仓,并且建立[/size][/font][size=13.0pt]1[/size][font=宋体][size=13.0pt]手多头持仓。[/size][/font][size=13.0pt][/size][/p][p=30, 2, left][font=宋体][size=13.0pt]考虑到持仓部位的变化、委托单执行的结果,余下的委托单将会再排序,最高优先级的委托仍然先执行。[/size][/font][size=13.0pt][/size][/p][p=30, 2, left][font=宋体][size=13.0pt]这个过程一直重复,直到全部的委托单都已执行,或直到剩下的委托没有可以被执行的。比如:只剩出场委托单,而当前已经没有持仓。[/size][/font][size=13.0pt][/size][/p][p=30, 2, left][font=宋体][size=13.0pt]如果所剩的进场委托方向和当前持仓部位相同,那么在[b]部位限制[/b]启用(打勾)的状态下,这些委托单可以被执行。部位限制的设定可最多允许[/size][/font][size=13.0pt]N[/size][font=宋体][size=13.0pt]笔与目前仓位同向的进场委托单(详细见策略属性[/size][/font][size=13.0pt]->[/size][font=宋体][size=13.0pt]属性[/size][/font][size=13.0pt]->[/size][font=宋体][size=13.0pt]部位限定)。[/size][/font][size=13.0pt][/size][/p][p=30, 2, left][font=宋体][size=13.0pt]剩下的不可执行的委托单会被丢弃。[/size][/font][size=13.0pt][/size][/p][p=30, 2, left][b]B.[/b][b][font=宋体]委托单执行优先级举例:[/font][/b][/p][p=30, 2, left][font=宋体]在如下委托中:空头出场[/font](SX)[font=宋体]、空头进场[/font](SE)[font=宋体]、多头进场[/font](LE)[font=宋体]、多头出场[/font](LX)[font=宋体]、多头进场[/font](LE)[font=宋体],当前持仓部位为空头,则多个委托单执行状况如下:[/font][/p][table]
[tr][td=1,1,72%]  [p=30, 2, left]1.[font=宋体]委托单的顺序根据优先级以降序排列:多头进场[/font](LE)[font=宋体]、多头进场[/font](LE)[font=宋体]、空头出场[/font](SX)[font=宋体]、空头进场[/font](SE)[font=宋体](不可执行委托:多头出场[/font](LX)[font=宋体])[/font][/p]  [/td][td=1,1,27%]  [table]
[tr][td=1,1,33]   [align=center]SX[/align]
    [/td][td=1,1,33]   [align=center]SE[/align]
    [/td][td=1,1,33]   [align=center]LE[/align]
    [/td][td=1,1,33]   [align=center]LX[/align]
    [/td][td=1,1,33]   [align=center]LE[/align]
    [/td][/tr]
[/table]  
  [/td][/tr]
[tr][td=1,1,72%]  [p=30, 2, left]2. [font=宋体]多头进场[/font](LE)[font=宋体]执行;当前持仓为多头[/font][/p]  [/td][td=1,1,27%]  [table]
[tr][td=1,1,33]   [align=center]SX[/align]
    [/td][td=1,1,33]   [align=center]SE[/align]
    [/td][td=1,1,33]  [b]√[/b]
    [/td][td=1,1,33]   [align=center]LX[/align]
    [/td][td=1,1,33]   [align=center]LE[/align]
    [/td][/tr]
[/table]  
  [/td][/tr]
[/table]

龙听 发表于 2018-5-8 17:14

[table]
[tr][td=1,1,67%]  [p=30, 2, left]3.[font=宋体]委托单的顺序根据优先级以降序排列:空头进场[/font](SE)[font=宋体]、多头进场[/font](LE)[font=宋体]、多头出场[/font](LX)[font=宋体](不可执行委托:空头出场[/font](SX)[font=宋体])[/font][/p]  [/td][td=1,1,32%]  
  
  [/td][/tr]
[tr][td=1,1,67%]  [p=30, 2, left]4. [font=宋体]空头进场[/font](SE)[font=宋体]执行;当前持仓为空头[/font][/p]  [/td][td=1,1,32%]  [table]
[tr][td=1,1,33]   [align=center]SX[/align]
    [/td][td=1,1,33]    [p=30, 2, left][b]√[/b][/p]    [/td][td=1,1,33]    [p=30, 2, left][b]√[/b][/p]    [/td][td=1,1,33]    [p=30, 2, center]LX[/p]    [/td][td=1,1,33]    [p=30, 2, center]LE[/p]    [/td][/tr]
[/table]  
  [/td][/tr]
[tr][td=1,1,67%]  [p=30, 2, left]5. [font=宋体]委托单的顺序根据优先级以降序排列:多头进场[/font](LE)[font=宋体]、空头出场[/font](SX)[font=宋体](不可执行委托:多头出场[/font](LX)[font=宋体])[/font][/p]  [/td][td=1,1,32%]  
  [/td][/tr]
[tr][td=1,1,67%]  [p=30, 2, left]6. [font=宋体]多头进场[/font](LE)[font=宋体]执行;当前持仓为多头[/font][/p]  [/td][td=1,1,32%]  [table]
[tr][td=1,1,33]   [align=center]SX[/align]
    [/td][td=1,1,33]    [p=30, 2, left][b]√[/b][/p]    [/td][td=1,1,33]    [p=30, 2, left][b]√[/b][/p]    [/td][td=1,1,33]    [p=30, 2, center]LX[/p]    [/td][td=1,1,33]    [p=30, 2, left][b]√[/b][/p]    [/td][/tr]
[/table]  
  [/td][/tr]
[tr][td=1,1,67%]  [p=30, 2, left]7. [font=宋体]委托单的顺序根据优先级以降序排列:多头出场[/font](LX)[font=宋体](不可执行委托:空头出场[/font](SX)[font=宋体])[/font][/p]  [/td][td=1,1,32%]  
  [/td][/tr]
[tr][td=1,1,67%]  [p=30, 2, left]8.[font=宋体]多头出场[/font](LX)[font=宋体]执行;当前无持仓[/font][/p]  [/td][td=1,1,32%]  [table]
[tr][td=1,1,33]   [align=center]SX[/align]
    [/td][td=1,1,33]    [p=30, 2, left][b]√[/b][/p]    [/td][td=1,1,33]    [p=30, 2, left][b]√[/b][/p]    [/td][td=1,1,33]    [p=30, 2, left][b]√[/b][/p]    [/td][td=1,1,33]    [p=30, 2, left][b]√[/b][/p]    [/td][/tr]
[/table]  
  [/td][/tr]
[tr][td=1,1,67%]  [p=30, 2, left]9.[font=宋体]只剩一个空头出场[/font](SX)[font=宋体]的委托,不可执行,将被丢弃。[/font][/p]  [/td][td=1,1,32%]  [table]
[tr][td=1,1,33]   [align=center][color=#c000]SX[/color][/align]
    [/td][td=1,1,33]    [p=30, 2, left][b]√[/b][/p]    [/td][td=1,1,33]    [p=30, 2, left][b]√[/b][/p]    [/td][td=1,1,33]    [p=30, 2, left][b]√[/b][/p]    [/td][td=1,1,33]    [p=30, 2, left][b]√[/b][/p]    [/td][/tr]
[/table]  
  [/td][/tr]
[/table]

龙听 发表于 2018-5-8 17:15

以上委托单执行结果,将从一个空头持仓变成无持仓。

页: [1]