[TOC]
My语言是对麦语言的兼容并增强的一种程序化交易语言。FMZ量化的My语言会进行严格的语法检查,例如在使用语言增强嵌入JavaScript语言代码时,在%%操作符之后多跟一个空格字符都会引起报错。
数字货币合约
数字货币合约
this_week 数字货币期货当周合约
next_week 数字货币期货次周合约
month 数字货币期货月度合约
quarter 数字货币期货季度合约
next_quarter 数字货币期货次季度合约
third_quarter 数字货币期货第三季度合约
last_quarter 最后季度合约
XBTUSD BITMEX永续合约
swap 除BITMEX交易所以外数字货币期货永续合约
具体可以参看JavaScript/Python/C++文档的exchange.SetContractType()函数部分

变量是电脑内存中开辟的一块用来存数据的空间,简单说就是用来保存数据的。
开辟第一个变量
// 将1赋值给变量a
a:=1;
在麦语言中,从数据量上简单区分:
0、1、’abc’。Close(收盘价),这里的Close包含了n个周期的收盘价[ 10.1 , 10.2 , 10.3 , 10.4 , 10. 5 ...]从“变量类型”进行区分
''包裹,字符串类型不允许直接使用,需要配合函数输出到视图中。INFO(CLSOE>OPEN,'OK!');
// 整数
int:=2;
// 小数
float:=3.1;
A:=1>0;这句代码执行后,A的值就是1。// 当前周期收盘价大于-999,你会发现,每个周期的返回值都是1,代表true,因为收盘价几乎不可能为负数
is_true:=Close>-999;
VARIABLE:VALUE1:10; // 声明一个全局变量,赋值为10,只执行一次。
回测时需注意:
VARIABLE:NX:0; // 初始一个全局变量NX为0
NX..NX+1; // 每次累加1
INFO(1,NX); // 每次打印NX
最初INFO语句打印的是101,可能有疑问初始不是0么 ?
原因是回测时初始的K线有100根,已经跑过了100根K线,累加了100次。
实盘根据初始获取多少K线而定。
在多数的系统中,变量命名不允许使用系统“保留字”(内置变量名、函数名)。例如众所周知的Close、C。此外,不允许纯数字或者数字开头。最后不允许很长,不同的系统长度限制不同。
其实你大可不必纠结主流系统对于中文的解析的效率,相信“麦语言”它对中文是非常友好的。撸码无数的老司机,推荐你使用如下两种命名规范:
1. 中文命名
// 优雅的输出
五日均线:=MA(C,5);
2. 英文+下划线
// 输出
move_avg_5:=MA(C,5);
如果你偏爱英文,请尽可能让人可以理解你变量的含义。不要使用诸如:A1,AAA,BBB…这类的命名方式。相信我过些时日你再次复查你的指标代码时,由于记忆的缺失你会非常痛苦。同样的当你把代码导出给他人的时候,阅读者的心态一定是崩溃的。
那么从现在开始,尽情地拥抱“麦语言”吧!但愿它能成为你节分析、决策的强大工具。
数据类型是一个基础的概念,在编写中当我们将一个明确的数据赋值给变量时,这个变量也就变成了数据自身的类型。
1、2、3、1.1234、2.23456 ...
'1' 、'2' 、'3' ,字符串类型必须用 '' 包裹
一系列单值数据构成的数据集合
用1代表true,0代表false。
示例
// 声明一个数值类型的变量
var_int := 1;
// 声明一个序列数据的变量
var_arr := Close;
// 字符串类型不能单独声明,需要结合函数
INFO(C>O, '阳线');
用于执行指标代码的运算、计算,简单而言就是参与运算的符号。
用于给某个变量赋值
- 1. `:`
```:```,代表赋值并且输出到图(副图)中。
```
Close1:Close; // 将Close赋值给变量Close1,并且输出到图中
```
- 2. `:=`
```:=```,代表赋值,但不输出到图(主图、副图...)中,也不显示在状态栏表格中。
```
Close2:=Close; // 将Close赋值给变量Close2
```
- 3. `^^`
```^^```,两个```^```符号代表赋值,给变量赋值并且输出到图(主图)中。
```
lastPrice^^C;
```
- 4. `..`
```..```,两个```.```符号代表赋值,给变量赋值并且显示变量名、数值在图表中,但是不画图到图表(主图、副图...)中。
```
openPrice..O
```
关系运算符是双目运算符,用在条件表达式中。用于判断两个数据之间的关系。
返回值:布尔类型,不是true(1)、就是false(0)。
- 1. 大于```>```
```
// 将2>1的运算结果赋值给rv1变量,此时rv1=1
rv1:=2>1;
```
- 2. 小于```<```
```
// 返回false,也就是0,因为2大于1
rv3:=2<1;
```
- 3. 大于等于```>=```
```
x:=Close;
// 将收盘价大于等于10的运算的结果赋值给变量rv2
// 注意,由于close是一个序列数据,当进行close>=10运算的时候,本质是每个周期都进行运算,所以每个周期都会有一个1、0的返回值
rv2:=Close>=10;
```
- 4. 小于等于```<=```
```
此处省略
```
- 5. 等于```=```
```
A:=O=C; // 判断开盘价是不是等于收盘价。
```
- 6. 不等于```<>```
```
1<>2 // 判断1是否不等于2,返回值为1(true)
```
返回值:布尔类型,不是true(1)、就是false(0)。
1. 逻辑与```&&```,可以使用```and```替代,与连接的左右两边必须同时成立。
// 判断 cond_a,cond_b,cond_c 是否同时成立
cond_a:=2>1;
cond_b:=4>3;
cond_c:=6>5;
cond_a && cond_b and cond_c; // 返回值为1,成立
2. 逻辑或```||```,可以使用```or```替代或链接左右两边,一边成立(true),整体则成立(返回值 true)。
cond_a:=1>2;
cond_b:=4>3;
cond_c:=5>6;
cond_a || cond_b or cond_c; // 返回值为1,成立
3. ```()```运算符,计算时会先计算括号内的表达式。
1>2 AND (2>3 OR 3<5) // 运算结果为假
1>2 AND 2>3 OR 3<5 // 运算结果为真
返回值:数值类型
算术运算符即算术运算符号。是完成基本的算术运算(arithmetic operators)符号,就是用来处理四则运算的符号。
- **加 +**
```
A:=1+1; // 返回 2
```
- **减 -**
```
A:=2-1; // 返回 1
```
- **乘 \***
```
A:=2*2; // 返回 4
```
- **除 /**
```
A:=4/2; // 返回 2
```
在编程的世界里,“函数”其实就是一段实现了某种功能的代码。并且可以供其它代码调用,一般形式如下:
function(param1,param2,...)
- 构成:
函数名(参数1,参数2,...),可能没有参数或者有多个参数。例如```MA(x,n);```代表返回```n```周期的内```x```的简单移动平均值。其中```MA()```就是一个函数。```x```和```n```就是函数的参数。
使用函数的时候我们需要了解函数基本定义,也就是调用该函数可以获得什么数据。通常而言函数都带有参数,当我们传入参数的时候需要确保传入的数据类型是符合的。现阶段多数的IDE 的代码提示功能非常的不完善。有给出参数的数据类型,给我们的使用带来的一定的困扰,对```MA(x,n);```解释为:
```
返回简单移动平均
用法:
AVG:=MA(X,N): X的N日简单移动平均,算法(X1+X2+X3+...+Xn)/N,N支持变量
```
这对于初学者来说非常的不友好。接下来我们对函数进行彻底的剖析,试图寻找一个快速学习、使用函数的方法。
为了快速学习函数,首先我们需要理解一个概念。叫做「返回值」。“返回”顾名思义,就是「还回来」。值则代表「具体的数值」,那么返回值的意思即:可以拿到的数据。
// 因为后面的代码中会用到,所以用变量 return_value 接收、保存 function()的返回值
// retrun_value := function(param1,param2);
// 例如:
AVG:=MA(C,10); // AVG即retrun_value,function函数即:MA函数,param1参数:C即收盘价序列数据,param2参数:10。
其次函数的第二个概念重要概念就是参数,传入不同的参数可以得到不同的返回值。
// 变量ma5接收5日收盘价移动平均值
ma5:=MA(C,5);
// 变量ma10接收10日收盘价移动平均值
ma10:=MA(C,10);
上述的变量ma5、ma10的第一个参数X都是C(收盘价),实际上C也算一个函数(返回开盘至今的收盘价序列),只不过他没有参数。第二个参数5、10这是用来告诉MA()函数,我们要获取收盘价几日的移动平均线,通过参数,函数使用起来变得更加灵活。
MA(x,n),如果不知道参数x、n的数据类型也就无法正确的获得返回值。在后面的函数介绍、使用,遵循上述3条原则。
麦语言与JavaScript语言混合编程 %%
// 这里面可以调用发明者量化的任何API
scope.TEST = function(obj) {
return obj.val * 100;
}
%%
收盘价:C;
收盘价放大100倍:TEST(C);
上一个收盘价放大100倍:TEST(REF(C, 1)); // 鼠标移动到回测的K线上就会提示变量值
- ```scope```对象
```scope```对象可以添加属性并赋值匿名函数给属性,在麦语言代码部分就可以调用这个属性引用的匿名函数。
- ```scope.getRefs(obj)```函数
在```JavaScript```代码块中,调用```scope.getRefs(obj)```函数返回传入的```obj```对象的数据。
以下```%% %%```符号包裹的```JavaScript```代码中会获取到麦语言代码中```TEST(C)```函数调用时传入的```C```收盘价。
```scope.getRefs```函数会返回这个K线数据的所有的收盘价。由于使用了```throw "stop"```中断程序。所以变量```arr```只包含了第一根Bar的收盘价。可以尝试删除```throw "stop"```就会执行```JavaScript```代码最后的```return```,返回所有的收盘价数据。
```
%%
scope.TEST = function(obj){
var arr = scope.getRefs(obj)
Log("arr:", arr)
throw "stop"
return
}
%%
TEST(C);
```
- scope.bars
在```JavaScript```代码块中访问所有K线bar。
```TEST```函数返回一个数值。1是阴线,0是阳线。
```
%%
scope.TEST = function(){
var bars = scope.bars
return bars[bars.length - 1].Open > bars[bars.length - 1].Close ? 1 : 0 // 只能返回数值
}
%%
arr:TEST;
```
```
# 注意:
# TEST接收的匿名函数,返回值必须是数值。
# 如果匿名函数没有参数,在调用TEST的时候直接写VAR:=TEST;写VAR:=TEST();会报错。
# scope.TEST中的TEST必须是大写。
```
- scope.bar
在```JavaScript```代码块中,访问当前bar。
计算高开低收价格的平均数。
```
%%
scope.TEST = function(){
var bar = scope.bar
var ret = (bar.Open + bar.Close + bar.High + bar.Low) / 4
return ret
}
%%
avg^^TEST;
```
- scope.depth
访问市场深度数据(订单薄)。
```
%%
scope.TEST = function(){
Log(scope.depth)
throw "stop" // 打印一次深度数据后就抛出异常,暂停
}
%%
TEST;
```
- scope.symbol
获取当前交易对名称字符串。
```
%%
scope.TEST = function(){
Log(scope.symbol)
throw "stop"
}
%%
TEST;
```
- scope.barPos
获取K线Bar位置。
```
%%
scope.TEST = function(){
Log(scope.barPos)
throw "stop"
}
%%
TEST;
```
- scope.get\_locals('name')
该函数用于获取麦语言代码部分中的变量。
```
V:10;
%%
scope.TEST = function(obj){
return scope.get_locals('V')
}
%%
GET_V:TEST(C);
```
```
# 注意:
# 如果某个变量,由于周期不足的时候计算不出数据,这个时候在JavaScript代码中调用scope.get_locals函数
# 获取这个变量时,会报错:line:XX - undefined locals某个变量名undefined
```
- scope.canTrade
```canTrade```属性标记当前是否可以交易(当前的Bar是不是最后一根)
例如判断当策略处于可以交易下单的状态下打印行情数据
```
%%
scope.LOGTICKER = function() {
if(exchange.IO("status") && scope.canTrade){
var ticker = exchange.GetTicker();
if(ticker){
Log("ticker:", ticker);
return ticker.Last;
}
}
}
%%
LASTPRICE..LOGTICKER;
```
应用例子:
%%
scope.TEST = function(a){
if (a.val) {
throw "stop"
}
}
%%
O>C,BK;
C>O,SP;
TEST(ISLASTSP);
开仓、平仓一次后停止策略。
系统会自动选择一个合适的底层K线周期,用这个底层K线周期数据来合成所有引用的K线数据,确保数据的精准性。
#EXPORT 公式名 ... #END创建一个公式。如果仅仅为了获取不同周期的数据不做公式计算,也可以写空公式。空公式即:
#EXPORT TEST
NOP;
#END // 结束
#IMPORT [MIN,周期,公式名] AS 变量值引用公式。获取设置的周期的各项数据(收盘价、开盘价等等,通过变量值获取)。
代码范例:
// 本代码演示如何引用不同周期的公式在同一代码里 // #EXPORT扩展语法,以#END结束标记为一个公式,可以声明多个 #EXPORT TEST 均值1:EMA(C, 20); 均值2:EMA(C, 10); #END // 结束
#IMPORT [MIN,15,TEST] AS VAR15 // 引用公式,K线周期用15分钟 #IMPORT [MIN,30,TEST] AS VAR30 // 引用公式,K线周期用30分钟 CROSSUP(VAR15.均值1, VAR30.均值1),BPK; CROSSDOWN(VAR15.均值2, VAR30.均值2),SPK; 十五分最高价:VAR15.HIGH; 三十分最高价:VAR30.HIGH; AUTOFILTER;
- 多周期引用数据时使用```REF```、```LLV```、```HHV```等指令引用数据需要注意
(*backtest start: 2021-08-05 00:00:00 end: 2021-08-05 00:15:00 period: 1m basePeriod: 1m exchanges: [{“eid”:“Futures_OKCoin”,“currency”:“ETH_USD”}] args: [[“TradeAmount”,100,126961],[“ContractType”,“swap”,126961]] *)
%% scope.PRINTTIME = function() { var bars = scope.bars; return _D(bars[bars.length - 1].Time); } %% BARTIME:PRINTTIME;
#EXPORT TEST REF1C:REF(C,1); REF1L:REF(L,1); #END // 结束
#IMPORT [MIN,5,TEST] AS MIN5 INFO(1, ‘C:’, C, ‘MIN5.REF1C:’, MIN5.REF1C, ‘REF(MIN5.C, 1):’, REF(MIN5.C, 1), ‘触发BAR时间:’, BARTIME, ‘#FF0000’); INFO(1, ‘L:’, L, ‘MIN5.REF1L:’, MIN5.REF1L, ‘REF(MIN5.L, 1):’, REF(MIN5.L, 1), ‘触发BAR时间:’, BARTIME, ‘#32CD32’); AUTOFILTER;
比较```MIN5.REF1C```和```REF(MIN5.C, 1)```的不同可以发现:
```MIN5.REF1C```是5分钟K线数据当前时刻的倒数第二个BAR的收盘价数值。
```REF(MIN5.C, 1)```是当前模型的K线周期(以上代码回测周期设置为1分钟,即```period: 1m```),当前时刻的倒数第二个BAR所在5分钟周期的收盘价。
这两种定义是有区别的,可以根据需求使用。
- ## 模式说明
- ### 一开一平信号过滤模型
模型中通过写入```AUTOFILTER```函数来控制和实现一开一平的信号过滤,有多个开仓信号都满足条件的时候,取第一个信号作为有效信号,后面的k线上的同样信号将被过滤掉。
过滤模型支持的指令:BK、BP、BPK、SK、SP、SPK、CLOSEOUT,不支持BK(5)等带手数的指令。
例如:
MA1:MA(CLOSE,5); MA2:MA(CLOSE,10); CROSSUP(C,MA1),BK; CROSSUP(MA1,MA2),BK; C>BKPRICE+10||C
理解:
如上范例,没有设置 AUTOFILTER 时,第三行BK 和第四行BK 第五行SP,依次触发,每根K线触发一次信号。开仓后,再到平仓,即重置模型状态。
如果设置 AUTOFILTER , 触发BK后,只能触发SP,其它的BK 信号被忽略,每根K线触发一次信号。
- ### 加减仓模型
模型中不写入```AUTOFILTER```函数,允许连续出开仓信号或者连续出平仓信号,可以实现加仓、减仓。
支持的指令:BK(N)、BP(N)、SK(N)、SP(N)、CLOSEOUT、BPK(N)、SPK(N),不支持不带手数的开平仓指令。
(1)支持指令分组。
(2)多个指令条件同时满足时,按条件语句编写的先后顺序执行信号。
例如:
MA1:MA(CLOSE,5); MA2:MA(CLOSE,10); CROSSUP(C,MA1),BK(1); CROSSUP(MA1,MA2),BK(1); C>BKPRICE+10||C
使用```TRADE\_AGAIN```
可以让同一个指令行,连续出多个信号。
理解: 以上例子,逐个信号执行,执行后的信号不再触发。平仓后重置模型状态。一个K线触发一次信号。
- ### 一根K线一个信号的模型
不管k线是否走完,计算出信号就进行实时下单,即K线未走完前下单;K线结束时复核,如果持仓方向与k线结束时的信号方向不符会自动同步持仓。
例如:
MA1:MA(CLOSE,5); MA2:MA(CLOSE,10); CROSSUP(MA1,MA2),BPK; // 5周期均线上穿10周期均线做多。 CROSSDOWN(MA1,MA2),SPK; // 5周期均线下穿10周期均线做空。 AUTOFILTER;
- ### 一根K线多个信号的模型
模型通过使用```multsig```来控制并实现一根K线出多个信号。
不管k线是否走完,计算出信号就进行实时下单。
信号不进行复核,不存在信号消失的情况,信号方向与持仓方向始终一致。
一根K线中如果满足多个信号条件可以反复多次执行。
例如: MA1:MA(CLOSE,5); MA2:MA(CLOSE,10); CROSSUP(MA1,MA2),BK; C>BKPRICE+10||C
```MULTSIG```可以使一根K线内多次执行不同指令行。
一个指令行只出一次信号。
O,BK; // 这些条件在一个K线Bar内,可能都执行,但是每行只出一次信号 10+O,BK; // 策略加上TRADE_AGAIN(10);可以使每行出多次信号 20+O,BK; 40+O,BK; MULTSIG(1,1,10);
补充:
1、加减仓模型,一根k线一根信号的二种方式:收盘价下单、指令价下单,都是是支持的。
2、加减仓模型,也支持一根k线多次信号下单的。
加减仓模型,写上```multsig```函数,就实现一根k线上多次加仓,或者多次减仓的。
- ## 执行模式

- ### 收盘价模型
收盘价模型指当前BAR走完才执行模型,在下根BAR开始的时候执行交易。
- ### 实时价模型
实时价模型指的是每次价格变动都执行一次模型,有信号就立即交易。
实时价模型忽略前一天的信号(前一天的信号在前一天立即执行),实时价模型只看当前行情数据,判断是否触发信号。
- ## 图表显示
- ### 主图附加指标
> 使用操作符```^^```,在给变量赋值的同时,设置指标显示在主图上。
MA60^^MA(C, 60); // 计算参数为60的均线指标

- ### 副图附加指标
使用操作符```:```,在给变量赋值的同时,设置指标显示在副图上。
ATR:MA(MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW)),26); // 给ATR变量赋值,”:“符号后为计算ATR的公式

如果不希望在主图或者副图上显示,使用 ".." 操作符。
MA60..MA(C, 60); // 计算参数为60的均线指标

可以使用```DOT```、```COLORRED```设置线的线型、颜色等,符合熟悉麦语言的用户的习惯。
- ## 常见问题
> 介绍指标编写过程中普遍遇到的**问题**,通常是在编写时需要注意的点(持续补充)。
- 注意分号```;```结尾。
- 注意系统关键字不能作为变量声明。
- 注意字符串使用**单引号**,例如:```'开仓'```这个字符串。
- ### 注释
注释符
- ```// 注释内容```(输入法中英文键入皆可),代表代码在执行过程中不被编译,也就是不执行```//```后面的内容,通常我们用来标注代码的含义,方便代码复查时,可以快速理解、回忆。
- ```{ 注释内容 }```块注释。
```
A:=MA(C,10);
{上一行代码是计算均线。}
```
- ```(* 注释内容 *)```块注释。
```
A:=MA(C,10);
(*上一行代码是计算均线。*)
```
- ### 输入法
在编写代码的时候,经常因为输入法中英文切换,造成符号错误。常见的有如下几种:冒号```:```、结束符```;```、逗号```,```、括号```()```等等,这些中英文状态下不同的字符需要注意。
> 如果使用搜狗、百度、Bing输入法,可以通过按一次```shift```键,快速切换中英文。
- ### 易错逻辑
1. 至少、不少于、不小于:对应的关系运算符```>=```。
2. 至多、最多、不超过:对应的关系运算符```<=```。
- ### 策略启动同步
在期货策略中,如果在策略机器人启动前,有手动开仓持有的仓位,则机器人启动时,会检测持仓信息,同步为实际的持仓状态。
在策略中就可以使用 ```SP``` , ```BP``` ,```CLOSEOUT``` 命令平仓。
%% if (!scope.init) { var ticker = exchange.GetTicker(); exchange.Buy(ticker.Sell+10, 1); scope.init = true; } %% C>0, CLOSEOUT; “`
麦语言不支持同一个合约,同时有多空持仓。
取得K线图的开盘价。
开盘价
函数:OPEN,简写O
参数:无
解释:返回「该周期」开盘价
序列数据
OPEN取得K线图的开盘价。
注:
1、可简写为O。
例1:
OO:=O; //定义OO为开盘价;注意O与0的区别。
例2:
NN:=BARSLAST(DATE<>REF(DATE,1));
OO:=REF(O,NN); //取的当日的开盘价
例3:
MA5:=MA(O,5); //定义开盘价的5周期均线(O为OPEN简写)。
取得K线图的最高价。
最高价
函数:HIGH,简写H
参数:无
解释:返回「该周期」最高价
序列数据
HIGH取得K线图的最高价。
注:
1、可简写为H。
例1:
HH:=H; // 定义HH为最高价
例2:
HH:=HHV(H,5); // 取的5个周期内最高价的最大值
例3:
REF(H,1); // 取的前一根K线的最高价
取得K线图的最低价。
最低价
函数:LOW,简写L
参数:无
解释:返回「该周期」最低价
序列数据
LOW取得K线图的最低价。
注:
1、可简写为L。
例1:
LL:=L; // 定义LL为最低价
例2:
LL:=LLV(L,5); // 取得5个周期内最低价的最小值
例3:
REF(L,1); // 取得前一根K线的最低价
取得K线图的收盘价。
收盘价
函数:CLOSE,简写C
参数:无
解释:返回「该周期」收盘价
序列数据
CLOSE取得K线图的收盘价
注:
1、当盘中k线没有走完的时候,取得最新价。
2、可简写为C。
例1:
A:=CLOSE; //定义变量A为收盘价(盘中k线没有走完的时候A为最新价)
例2:
MA5:=MA(C,5); //定义收盘价的5周期均线(C为CLOSE简写)
例3:
A:=REF(C,1); //取得前一根k线的收盘价
取得K线图的成交量。
成交量
函数:VOL,简写V
参数:无
解释:返回「该周期」成交量
序列数据
VOL取得K线图的成交量。
注:
可简写为V。
该函数在当根TICK上的返回值为当天所有TICK成交量的累计值。
例1:
VV:=V; // 定义VV为成交量
例2:
REF(V,1); // 表示前一个周期的成交量
例3:
V>=REF(V,1); // 成交量大于前一个周期的成交量,表示成交量增加(V为VOL的简写)
取当前期货(合约)市场的总持仓量。
OpenInterest:OPI;
向前引用。
引用X在N个周期前的值。
注:
1、当N为有效值,但当前的k线数不足N根,返回空值;
2、N为0时返回当前X值;
3、N为空值时返回空值。
4、N可以为变量
例1:
REF(CLOSE,5);表示引用当前周期前第5个周期的收盘价
例2:
AA:=IFELSE(BARSBK>=1,REF(C,BARSBK),C);//取最近一次买开仓信号K线的收盘价
// 1)发出BK信号的当根k线BARSBK返回空值,则发出BK信号的当根k线REF(C,BARSBK)返回
空值;
// 2)发出BK信号的当根k线BARSBK返回空值,不满足BARSBK>=1,则当根k线的收盘价。
// 3)发出BK信号之后的k线BARSBK返回买开仓的K线距离当前K线的周期数,REF(C,BARSBK)
返回开仓k线的收盘价。
// 4)例:1、2、3 三根k线,1 K线为开仓信号的当根k线,则返回当根k线的收盘价,2、3
K线返回 1 K线的收盘价。
取数据合约的交易单位。
取数据合约的交易单位。
用法:
UNIT 取加载数据合约的交易单位。
数字货币现货
UNIT值为1。
数字货币期货
UNIT值与合约币种相关。
OKEX期货币本位合约:BTC合约1张代表100美元,其它币种的1张合约代表10美元
数据合约的最小变动价位。
取数据合约的最小变动价位。
用法:
MINPRICE; 取加载数据合约的最小变动价位。
交易合约的最小变动价位。
取交易合约的最小变动价位。
用法:
MINPRICE1; 取交易合约的最小变动价位。
取K线的位置。
BARPOS,返回从第一根K线开始到当前的周期数。
注:
1、BARPOS返回本地已有的K线根数,从本机上存在的数据开始算起。
2、本机已有的第一根K线上返回值为1。
例1:LLV(L,BARPOS); // 求本地已有数据的最小值。
例2:IFELSE(BARPOS=1,H,0); // 当前K线是本机已有的第一根K线取最高值,否则取0。
DAYBARPOS当根K线BAR为当天的第几根K线BAR。
周期值为分钟数。
1, 3, 5, 15, 30, 60, 1440
日期函数DATE,取得该周期从1900以来的的年月日。
例1:
AA..DATE; // 测试时AA的值为220218,表示2022年2月18日
取K线的时间。
TIME,取K线时间。
注:
1、该函数在盘中实时返回,在K线走完后返回K线的起始时间。
2、该函数返回的是交易所数据接收时间,也就是交易所时间。
3、TIME函数在秒周期使用时返回六位数的形式,即:HHMMSS,在其他周期上显示为四位数的形式,即:HHMM.
4、TIME函数只能加载在日周期以下的周期中,在日周期及日周期以上的周期中该函数返回值始终为1500。
5、使用TIME函数进行尾盘平仓的操作需要注意
(1)尾盘平仓设置的时间建议设置为K线返回值中实际可以取到的时间(如:螺纹指数 5分钟周期 最后一根K线返回时间为1455,尾盘平仓设置为TIME>=1458,CLOSEOUT;则效果测试中不能出现尾盘平仓的信号)
(2)使用TIME函数作为尾盘平仓的条件的,建议开仓条件也要做相应的时间限制(如设置尾盘平仓条件为TIME>=1458,CLOSEOUT;则相应的开仓条件中需要添加条件TIME<1458;避免平仓后再次开仓的情况)
例1:
C>O&&TIME<1450,BK;
C<O&&TIME<1450,SK;
TIME>=1450,SP;
TIME>=1450,BP;
AUTOFILTER;
// 在14:50后平仓。
例2:
ISLASTSK=0&&C>O&&TIME>=0915,SK;
年份。
YEAR,取得年份。
注:
YEAR的取值范围为1970—2033。
例1:
N:=BARSLAST(YEAR<>REF(YEAR,1))+1;
HH:=REF(HHV(H,N),N);
LL:=REF(LLV(L,N),N);
OO:=REF(VALUEWHEN(N=1,O),N);
CC:=REF(C,N); // 取上一年的最高价,最低价,开盘价,收盘价
例2:
NN:=IFELSE(YEAR>=2000 AND MONTH>=1,0,1);
取月份。
MONTH,返回某个周期的月份。
注:
MONTH的取值范围为1—12.
例1:
VALUEWHEN(MONTH=3&&DAY=1,C); // 在K线日期为三月一日时取其收盘价
例2:
C>=VALUEWHEN(MONTH<REF(MONTH,1),O),SP;
取得某周期的日数
DAY,返回某一周期的日数。
注:
DAY取值范围为1-31。
例1:
DAY=3&&TIME=0915,BK; // 当日起为3日,时间为9点15分时,买开
例2:
N:=BARSLAST(DATE<>REF(DATE,1))+1;
CC:=IFELSE(DAY=1,VALUEWHEN(N=1,O),0); // 当日期为1时,取开盘价,否则取值为0
小时。
HOUR,返回某周期的小时数。
注:
HOUR的取值范围为0—23
例1:
HOUR=10; // 在10:00的K线上返回值为1,其余K线上返回值为0
分钟。
MINUTE,返回某个周期的分钟数。
注:
1:MINUTE的取值范围为0—59
2:该函数只能加载在分钟周期上,返回当根K线开始的分钟数。
例1:
MINUTE=0; // 在整点时刻的分钟K线上返回值为1,其余K线返回值为0
例2:
TIME>1400&&MINUTE=50,SP; // 在14:50的时候卖平仓
取得星期数。
WEEKDAY,取得星期数。
注:
1:WEEKDAY的取值范围是0—6。(星期日 ~ 星期六)
例1:
N:=BARSLAST(MONTH<>REF(MONTH,1))+1;
COUNT(WEEKDAY=5,N)=3&&TIME>=1450,BP;
COUNT(WEEKDAY=5,N)=3&&TIME>=1450,SP;
AUTOFILTER; // 每个月交割日尾盘自动平仓
例2:
C>VALUEWHEN(WEEKDAY<REF(WEEKDAY,1),O)+10,BK;
AUTOFILTER;
返回当前周期的位置状态。
BARSTATUS 返回当前周期的位置状态。
注:
该函数返回1表示当前周期是第一个周期,返回2表示是最后一个周期,返回0表示当前周期处于中间位置。
例:
A:=IFELSE(BARSTATUS=1,H,0); // 如果当前K线是第一个周期,变量A返回K线最高值,否则取0
介于。
BETWEEN(X,Y,Z) 表示X是否处于Y和Z之间,成立返回1(Yes),否则返回0(No)。
注:
1、其中若X=Y、X=Z、或X=Y且Y=Z时函数返回值为1(Yse)。
例1:
BETWEEN(CLOSE,MA5,MA10); // 表示收盘价介于5日均线与10日均线之间
BARSLASTCOUNT(COND) 从当前周期向前计算,统计连续满足条件的周期数。
注:
1、返回值为从当前周期计算COND连续不为0的周期数
2、条件第一次成立的当根k线上BARSLASTCOUNT(COND)的返回值为1
例:
BARSLASTCOUNT(CLOSE>OPEN);
//计算当根K线在内连续为阳线的周期数
交叉函数。
CROSS(A,B) 表示A从下方向上穿过B,成立返回1(Yes),否则返回0(No)
注:
1、满足穿越的条件必须上根k线满足A<=B,当根k线满足A>B才被认定为穿越。
例1:
CROSS(CLOSE,MA(CLOSE,5)); // 表示收盘线从下方向上穿过5周期均线
向下穿越
CROSSDOWN(A,B):表示当A从上方向下穿B,成立返回1(Yes),否则返回0(No)
注:
1、CROSSDOWN(A,B)等同于CROSS(B,A),CROSSDOWN(A,B)编写更利于理解
例1:
MA5:=MA(C,5);
MA10:=MA(C,10);
CROSSDOWN(MA5,MA10),SK; // MA5下穿MA10卖开仓
// CROSSDOWN(MA5,MA10),SK;与CROSSDOWN(MA5,MA10)=1,SK;表达同等意义
向上穿越。
CROSSUP(A,B)表当A从下方向上穿过B,成立返回1(Yes),否则返回0(No)
注:
1、CROSSUP(A,B)等同于CROSS(A,B),CROSSUP(A,B)编写更利于理解。
例1:
MA5:=MA(C,5);
MA10:=MA(C,10);
CROSSUP(MA5,MA10),BK; // MA5上穿MA10,买开仓
// CROSSUP(MA5,MA10),BK;与CROSSUP(MA5,MA10)=1,BK;表达同等意义
判断是否持续满足。
EVERY(COND,N),判断N周期内是否一直满足COND条件。若满足函数返回值为1,不满足函数返回值为0。
注:
1、N包含当前k线。
2、若N是有效数值,但前面没有那么多K线,或者N为空值,代表条件不满足,函数返回值为0。
3、N可以是变量。
例1:
EVERY(CLOSE>OPEN,5); // 表示5个周期内一直是阳线
例2:
MA5:=MA(C,5); // 定义5周期均线
MA10:=MA(C,10); // 定义10周期均线
EVERY(MA5>MA10,4),BK; // 4个周期内MA5都大于MA10,则买开仓
// EVERY(MA5>MA10,4),BK;与EVERY(MA5>MA10,4)=1,BK;表达同等意义
判断是否存在满足。
EXIST(COND,N)判断N个周期内是否有满足COND的条件。
注:
1、N包含当前k线。
2、N可以是变量。
3、若N是有效数值,但前面没有那么多K线,按实际周期数计算。
例1:
EXIST(CLOSE>REF(HIGH,1),10); // 表示10个周期中是否存在收盘价大于前一个周期的最高价,存在返回1,不存在则返回0
例2:
N:=BARSLAST(DATE<>REF(DATE,1))+1;
EXIST(C>MA(C,5),N); // 表示当天是否有满足收盘价大于5周期均线的k线,存在返回1,不存在返回0
条件函数。
IF(COND,A,B)若COND条件成立,则返回A,否则返回B。
注:
1、COND是判断条件;A、B可以是条件,也可以是数值。
2、该函数支持变量循环引用前一周期自身变量,即支持下面这样的写法Y:IF(CON,X,REF(Y,1))。
例1:
IF(ISUP,H,L); // k线为阳线,取最高价,否则取最低价
例2:
A:=IF(MA5>MA10,CROSS(DIFF,DEA),IF(CROSS(D,K),2,0)); // 当MA5>MA10时,取是否满足DIFF上穿DEA,否则(MA5不大于MA10),当K,D死叉时,令A赋值为2,若上述条件都不满足,A赋值为0
A=1,BPK; // 当MA5>MA10,以DIFF上穿DEA作为开多仓条件
A=2,SPK; // 当MA5不大于MA10,以K、D死叉作为开空仓条件
条件函数。
IFELSE(COND,A,B) 若COND条件成立,则返回A,否则返回B。
注:
1、COND是判断条件;A、B可以是条件,也可以是数值。
2、该函数支持变量循环引用前一周期自身变量,即支持下面这样的写法Y: IFELSE(CON,X,REF(Y,1));
例1:
IFELSE(ISUP,H,L); // k线为阳线,取最高价,否则取最低价
例2:
A:=IFELSE(MA5>MA10,CROSS(DIFF,DEA),IFELSE(CROSS(D,K),2,0)); // 当MA5>MA10时,取是否满足DIFF上穿DEA,否则(MA5不大于MA10),当K,D死叉时,令A赋值为2,若上述条件都不满足,A赋值为0
A=1,BPK; // 当MA5>MA10,以DIFF上穿DEA作为开多仓条件
A=2,SPK; // 当MA5不大于MA10,以K、D死叉作为开空仓条件
当前是否为指定的合约。
ISCONTRACT(CODE)当前是否为指定的合约。
用法:ISCONTRACT(CODE);是当前合约返回1,不是当前合约返回0。
注:
1、判断是否为指定合约时,CODE可以为合约的交易代码。
例:
ISCONTRACT('this_week'); // 数字货币OKEX期货合约
ISCONTRACT('XBTUSD'); // 数字货币BITMEX期货合约
支持正则表达式。
判断合约
ISCONTRACT('this_week'); // 判断当前合约是否为OKEX期货 this_week(当周)合约
判断交易所名称
ISCONTRACT('@Futures_(Binance|FTX)'); // 判断当前交易所对象是否为Binance期货或者FTX期货
ISCONTRACT('@(OKEX|Bitfinex)'); // 判断交易所,需要在开头加@字符
阴线。
ISDOWN判断该周期是否收阴。
注:
1、ISDOWN等同于C<O
例:
ISDOWN=1&&C<REF(C,1),SK; // 当根k线收阴并且收盘价小于前一周期收盘价,则开空
// ISDOWN=1&&C<REF(C,1),SK;与ISDOWN&&C<REF(C,1),SK; 表达同等意义
平盘。
ISEQUAL判断该周期是否平盘。
注:
1、ISEQUAL等同于C=O
例1:
EVERY(ISEQUAL=1,2),CLOSEOUT; // 持续2根k线都是平盘,则全平
判断该周期是否为最后一根K线。
ISLASTBAR判断该周期是否为最后一根k线。
例1:
VALUEWHEN(ISLASTBAR=1,REF(H,1)); // 当前k线是最后一根k线,则取前一周期的最高价
判断空值。
ISNULL判断空值。
用法:ISNULL(N);如果N为空值,函数返回1;如果N为非空值,函数返回0。
例:MA5:=IFELSE(ISNULL(MA(C,5))=1,C,MA(C,5)); // 定义五周期均线,K线数量不足五根时,返回当根K线的收盘价
阳线。
ISUP判断该周期是否收阳。
注:
1、ISUP等同于C>O。
例:
ISUP=1&&C>REF(C,1),BK; // 若当根k线收阳并且收盘价大于前一周期收盘价,则开多
// ISUP=1&&C>REF(C,1),BK; 与 ISUP&&C>REF(C,1),BK
// 表达同等意义
判断函数。
LAST(COND,N1,N2)判断过去N1到N2周期内,是否一直满足COND条件。
注:
1、若N1与N2只相差一个周期(如N1=3,N2=2),则函数判断距离当前K线最近的那个周期上是否满足条件(即判断过去N2个周期的那根K线上是否满足条件)。
2、当N1/N2为有效值,但当前的k线数不足N1/N2根,或者N1/N2空值的情况下,代表不成立,该函数返回0。
3、N1、N2不可以是变量。
例1:
LAST(CLOSE>OPEN,10,5); // 表示从过去第10个周期到第5个周期内一直是阳线
例2:
MA5:=MA(C,5);
LAST(C>MA5,4,3); // 判断距离当前k线3个周期的那根k线上是否满足C大于MA5
维持交叉函数。
LONGCROSS(A,B,N)表示A在N个周期内都小于B,本周期A从下向上穿越B。
注:
1、当N为有效值,但当前的k线数不足N根时,LONGCROSS函数返回空值。
2、N不支持变量。
例1:
LONGCROSS(CLOSE,MA(CLOSE,10),20); // 表示收盘线在10日均线之下持续20周期后从下向上穿过10日均线
非。
NOT(X):取非。当X=0时返回1,否则返回0。
例1:
NOT(ISLASTBK);如果上一个信号不是BK信号,则NOT(ISLASTBK)返回值为1;上一个信号是BK信号,则NOT(ISLASTBK)返回值为0。
例2:
NOT(BARSBK>=1)=1; // BK信号发出的当根K线上满足条件
// NOT(BARSBK>=1)=1与NOT(BARSBK>=1)表达同等意义
返回空值。
返回空值
用法:
MA5:=MA(C,5);
MA10:=MA(C,10);
A:=IFELSE(MA5>MA10,MA5,NULL),COLORRED; // 当MA5>MA10时,画五日均线MA5,不满足MA5>MA10时,返回空值,不画线
取值。
VALUEWHEN(COND,X)当COND条件成立时,取X的当前值。如COND条件不成立,则取上一次COND条件成立时X的值。
注:
X可以是数值也可以是条件。
例1
VALUEWHEN(HIGH>REF(HHV(HIGH,5),1),HIGH); // 表示当前最高价大于前五个周期最高价的最大值时返回当前最高价
例2:
VALUEWHEN(DATE<>REF(DATE,1),O); // 表示取当天第一根k线的开盘价(即当天开盘价)
例3:
VALUEWHEN(DATE<>REF(DATE,1),L>REF(H,1)); // 表示在当天第一根k线上判断当前最低价是否大于昨天最后一根K线的最高价。返回1,说明当天跳空高开。返回0,说明当天不满足跳空高开条件
循环条件函数。
LOOP2(COND,A,B);循环条件函数若COND条件成立,则返回A,否则返回B。
注:
1、COND是判断条件;A、B可以是条件,也可以是数值。
2、该函数支持变量循环引用前一周期自身变量,即支持下面这样的写法Y:=LOOP2(CON,X,REF(Y,1));
例1:
X:=LOOP2(ISUP,H,REF(X,1)); // k线为阳线,取当根K线的最高价,否则取上一次是阳线的K线的最高价;若之前未出现过阳线时,X返回为空值
例2:
BB:=LOOP2(BARSBK=1,LOOP2(L>LV(L,4),L,LV(L,4)),LOOP2(L>REF(BB,1),L,REF(BB,1))); // 持有多单时,开多单那根的前面4个周期内的最低价为起始止损点BB,后续K线最低价比前一个最低价高,取当前最低价为止损点,否则取前一个低点为止损点
SS:=LOOP2(BARSSK=1,LOOP2(H<HV(H,4),H,HV(H,4)),LOOP2(H<REF(SS,1),H,REF(SS,1))); // 持有空单时,开空单那根的前面4个周期内的最高价为起始止损点SS,最高价比前一个最高价低,取当前最高价为止损点,否则取前一个高点为止损点
H>HV(H,20),BK;
L<LV(L,20),SK;
C<BB,SP;
C>SS,BP;
AUTOFILTER;
第一个有效周期到当前的周期数。
BARSCOUNT(COND)第一个有效周期到当前的周期数。
注:
1、返回值为COND从第一个有效周期开始计算,到现在为止的周期数。
2、条件第一次成立的当根k线上BARSCOUNT(COND)的返回值为0。
例:
BARSCOUNT(MA(C,4)); // 计算MA(C,4)第一次有返回值到当前的周期数
上一次条件成立位置。
BARSLAST(COND),上一次条件COND成立到当前的周期数。
注:
1、条件成立的当根k线上BARSLAST(COND)的返回值为0。
例1:
BARSLAST(OPEN>CLOSE); // 上一根阴线到现在的周期数
例2:
N:=BARSLAST(DATE<>REF(DATE,1))+1; // 分钟周期,当日k线数
// 由于条件成立的当根k线上BARSLAST(COND)的返回值为0,所以“+1”才是当日k线根数
说明BARSLAST函数:
- 1、如果当前K线条件成立,就会返回0。
- 2、如果不成立会一直往前追溯,直到找到条件成立的那根K线,返回一个追溯的周期数。
- 3、如果追溯到尽头,都没有找到条件成立的那根K线,就返回无效值。
第一个条件成立到当前的周期数。
BARSSINCE(COND)第一个条件成立到当前的周期数。
注:
1、返回值为COND第一次成立到当前的周期数。
2、条件第一次成立的当根k线上BARSSINCE(COND)的返回值为0。
例:
BARSSINCE(CLOSE>OPEN); // 统计第一次满足阳线这个条件的K线到现在的周期数
统计N周期内第一次条件成立到当前的周期数。
BARSSINCEN(COND,N)统计N周期内第一次条件成立到当前的周期数。
注:
1、N包含当前k线。
2、当N为有效值,但当前的k线数不足N根,按照实际的根数计算。
3、若N为0返回无效值。
4、N可以为变量。
例:
N:=BARSLAST(DATE<>REF(DATE,1))+1; // 分钟周期,当日K线数
BARSSINCEN(ISUP,N); // 统计N周期内第一次满足阳线到当前的周期数
取得最近满足A,B条件的K线间周期数。
CONDBARS(A,B);取得最近的满足A、B条件的k线间周期数。
注意:
1、该函数返回周期数不包含最后满足条件的K线。
2、距离当前K线最近的满足的条件为B条件,则该函数返回值为最后一次满足A条件的K线到满足B条件的K线的周期数(A条件满足后的第一次满足B条件的K线)。
距离当前K线最近的满足的条件为A条件,则该函数返回值为最后一次满足B条件的K线到满足A条件的K线的周期数(B条件满足后的第一次满足A条件的K线)。
例1:
MA5:=MA(C,5); // 5周期均线
MA10:=MA(C,10); // 10周期均线
CONDBARS(CROSSUP(MA5,MA10),CROSSDOWN(MA5,MA10)); // 最近一次满足5周期均线上穿10周期均线与5周期均线下穿10周期均线之间的周期数
统计总数。
COUNT(COND,N),统计N周期中满足COND条件的周期数。
注:
1、N包含当前k线。
2、若N为0则从第一个有效值算起。
3、当N为有效值,但当前的k线数不足N根,从第一根统计到当前周期。
4、N 为空值时返回值为空值 。
5、N可以为变量。
例1:
N:=BARSLAST(DATE<>REF(DATE,1))+1; // 分钟周期,当日k线数
M:=COUNT(ISUP,N); // 统计分钟周期上开盘以来阳线的根数
例2:
MA5:=MA(C,5); // 定义5周期均线
MA10:=MA(C,10); // 定义10周期均线
M:=COUNT(CROSSUP(MA5,MA10),0); // 统计从申请到的行情数据以来到当前这段时间内,5周期均线上穿10周期均线的次数
动态移动平均。
DMA(X,A):求X的动态移动平均,其中A必须小于1大于0。
注:
1、A可以为变量。
2、如果A<=0或者A>=1,返回无效值。
计算公式:DMA(X,A)=REF(DMA(X,A),1)*(1-A)+X*A
例1:
DMA3:=DMA(C,0.3); // 计算结果为REF(DMA3,1)*(1-0.3)+C*0.3
指数加权移动平均。
EMA(X,N):求N周期X值的指数加权移动平均(平滑移动平均)。
注:
1、N包含当前k线。
2、对距离当前较近的k线赋予了较大的权重。
3、当N为有效值,但当前的k线数不足N根,按实际根数计算。
4、N为0或空值时返回值为空值。
5、N可以为变量。
EMA(X,N)=2*X/(N+1)+(N-1)*REF(EMA(X,N),1)/(N+1)
例1:
EMA10:=EMA(C,10); // 求收盘价10周期指数加权移动平均值
线性加权移动平均。
EMA2(X,N); // 求N周期X值的线性加权移动平均(也称WMA)
EMA2(X,N)=[N*X0+(N-1)*X1+(N-2)*X2+...+1*X(N-1)]/[N+(N-1)+(N-2)+...+1],X0表示本周期值,X1表示上一周期值
注:
1、N包含当前k线。
2、当N为有效值,但当前的k线数不足N根,返回值为空值。
3、N为0或空值时返回值为空值。
4、N可以为变量。
例1:
EMA2(H,5); // 求最高价在5个周期的线性加权移动平均值
指数加权移动平均。
EMAWH(C,N),指数加权移动平均,也叫平滑移动平均,采用指数加权方法,对距离当前较近的K线赋予了较大的权重。
注:
1、当N为有效值,当前的k线数不足N根时,或者前面周期的取值仍作用于当前周期时,EMAWH返回值为空值。
因为EMAWH计算公式中着重考虑了当周期的权重,所以当周期较长,前面的周期取值对当前的影响越小,EMAWH从前面数据对当前周期不再影响时的取值开始显示,所以即使选择的数据起始时间不同,当前已经显示的K线的EMAWH的取值也不会发生变化。
2、当N为0或空值时返回值均为空值。
3、N不能为变量。
EMAWH(C,N)=2*C/(N+1)+(N-1)*REF(EMAWH(C,N),1)/(N+1)
注:
EMAWH用法同EMA(C,N)
调和平均值。
HARMEAN(X,N),求X在N个周期内的调和平均值。
算法举例:HARMEAN(X,5)=1/[(1/X1+1/X2+1/X3+1/X4+1/X5)/5]
注:
1、N包含当前k线。
2、调和平均值与倒数的简单平均值互为倒数。
3、当N为有效值,但当前的k线数不足N根,函数返回空值。
4、N为0或空值的情况下,函数返回空值。
5、X为0或空值的情况下,函数返回空值。
6、N可以为变量。
例:
HM5:=HARMEAN(C,5); // 求5周期收盘价的调和平均值
最高值。
HHV(X,N):求X在N个周期内的最高值。
注:
1、N包含当前k线。
2、若N为0则从第一个有效值开始算起。
3、当N为有效值,但当前的k线数不足N根,按照实际的根数计算。
4、N为空值时,返回空值。
5、N可以是变量。
例1:
HH:=HHV(H,4); // 求4个周期最高价的最大值,即4周期高点(包含当前k线)
例2:
N:=BARSLAST(DATE<>REF(DATE,1))+1; // 分钟周期,日内k线根数
HH1:=HHV(H,N); // 在分钟周期上,日内高点
除当前K线外最高值。
HV(X,N),求X在N个周期内(不包含当前k线)的最高值。
注:
1、若N为0则从第一个有效值开始算起(不包含当前K线)。
2、当N为有效值,但当前的k线数不足N根,按照实际的根数计算,第一根k线返回空值。
3、N为空值时,返回空值。
4、N可以是变量。
例1:
HH:=HV(H,10); // 求前10根k线的最高点
例2:
N:=BARSLAST(DATE<>REF(DATE,1))+1;
NN:=REF(N,N);
ZH:=VALUEWHEN(DATE<>REF(DATE,1),HV(H,NN)); // 在分钟周期上,求昨天最高价
例3:
HV(H,5)和REF(HHV(H,5),1)的结果是一样的,用HV编写更加方便。
前一最高点位置。
HHVBARS(X,N),求N周期内X最高值到当前周期数。
注:
1、若N为0则从第一个有效值开始算起(不包含当前K线)。
2、当N为有效值,但当前的k线数不足N根,按照实际的根数计算,第一根k线返回空值。
3、N为空值时,返回空值。
4、N可以是变量。
例1:
HHVBARS(VOL,0); // 求历史成交量最大的周期到当前的周期数(最大值那根k线上HHVBARS(VOL,0);的返回值为0,最大值后的第一根k线返回值为1,依次类推)
例2:
N:=BARSLAST(DATE<>REF(DATE,1))+1; // 分钟周期,日内k线根数
ZHBARS:=REF(HHVBARS(H,N),N)+N; // 在分钟周期上,求昨天最高价所在的k线到当前k线之间的周期数
最低值。
LLV(X,N),求X在N个周期内的最小值。
注:
1、N包含当前k线。
2、若N为0则从第一个有效值开始算起。
3、当N为有效值,但当前的k线数不足N根,按照实际的根数计算。
4、N为空值时,返回空值。
5、N可以是变量。
例1:
LL:=LLV(L,5); // 求5根k线最低点(包含当前k线)
例2:
N:=BARSLAST(DATE<>REF(DATE,1))+1; // 分钟周期,日内k线根数
LL1:=LLV(L,N); // 在分钟周期上,求当天第一根k线到当前周期内所有k线最低价的最小值
除当前K线外最低值。
LV(X,N),求X在N个周期内的最小值(不包含当前k线)。
注:
1、若N为0则从第一个有效值开始算起。
2、当N为有效值,但当前的k线数不足N根,按照实际的根数计算。
3、N为空值时,返回空值。
4、N可以是变量。
例1:
LL:=LV(L,10); // 求前面10根k线的最低点(不包含当前k线)
例2:
N:=BARSLAST(DATE<>REF(DATE,1))+1; // 分钟周期,日内k线根数
NN:=REF(N,N);
ZL:=VALUEWHEN(DATE<>REF(DATE,1),LV(L,NN)); // 在分钟周期上,求昨天最低价
例3:
LV(L,5)和REF(LLV(L,5),1)的结果是一样的,用LV编写更加方便。
前一个最低点位置。
LLVBARS(X,N),求N周期内X最低值到当前周期数。
注:
1、若N为0则从第一个有效值开始算起(不包含当前K线)。
2、当N为有效值,但当前的k线数不足N根,按照实际的根数计算,第一根k线返回空值。
3、N为空值时,返回空值。
4、N可以是变量。
例1:
LLVBARS(VOL,0); // 求历史成交量最小的周期到当前的周期数(最小值那根k线上LLVBARS(VOL,0);的返回值为0,最小值后的第一根k线返回值为1,依次类推)
例2:
N:=BARSLAST(DATE<>REF(DATE,1))+1; // 分钟周期,日内k线根数
ZLBARS:=REF(LLVBARS(L,N),N)+N; // 在分钟周期上,求昨天最低价所在的k线到当前k线之间的周期数
算数移动平均。
MA(X,N),求X在N个周期内的简单移动平均。
算法:MA(X,5)=(X1+X2+X3+X4+X5)/5
注:
1、N包含当前k线。
2、简单移动平均线沿用最简单的统计学方式,将过去某特定时间内的价格取其平均值。
3、当N为有效值,但当前的k线数不足N根,函数返回空值。
4、N为0或空值的情况下,函数返回空值。
5、N可以为变量。
例1:
MA5:=MA(C,5); // 求5周期收盘价的简单移动平均
例2:
N:=BARSLAST(DATE<>REF(DATE,1))+1; // 分钟周期,日内k线根数
M:=IFELSE(N>10,10,N); // k线超过10根,M取10,否则M取实际根数
MA10:=MA(C,M); // 在分钟周期上,当天k线不足10根,按照实际根数计算MA10,超过10根按照10周期计算MA10
取均值。
MV(A,...P),取A到P的均值。
注:
1、支持取2-16个数值的均值。
2、A...P可以为数字也可以为变量。
例1:
MV(CLOSE,OPEN); // 取收盘价和开盘价的平均值
自然数幂方和。
NUMPOW(X,N,M),自然数幂方和。
算法:
NUMPOW(x,n,m)=n^m*x+(n-1)^m*ref(x,1)+(n-2)^m*ref(x,2)+...+2^m*ref(x,n-2)+1^m*ref(x,n-1)
注意:
1、N为自然数,M为实数;且N与M不能为变量。
2、X为基础变量。
例:
JZ:=NUMPOW(C,5,2);
抛物转向。
SAR(N,STEP,MAX),返回抛物转向值。
根据公式SAR(n)=SAR(n-1)+AF*(EP(n-1)-SAR(n-1))计算。
其中:
SAR(n-1):上根K线SAR的绝对值。
AF:加速因子,当AF小于MAX时,逐根的通过AF+STEP累加,涨跌发生转换时,AF重新计算。
EP:一个涨跌内的极值,在上涨行情中为上根K线的最高价;下跌行情中为上根K线的最低价。
注:
1、参数N,Step,Max均不支持变量。
例1:
SAR(17,0.03,0.3); // 表示计算17个周期抛物转向,步长为3%,极限值为30%
扩展指数加权移动平均。
SMA(X,N,M) 求X的N个周期内的扩展指数加权移动平均,M为权重。
计算公式:SMA(X,N,M)=REF(SMA(X,N,M),1)*(N-M)/N+X(N)*M/N
注:
1、当N为有效值,但当前的k线数不足N根,按实际根数计算。
2、 N为0或空值的情况下,函数返回空值。
例1:
SMA10:=SMA(C,10,3); // 求的10周期收盘价的扩展指数加权移动平均,权重为3
通畅移动平均。
SMMA(X,N),X为变量,N为周期,SMMA(X,N)表示当前K线上X在N个周期的通畅移动平均线
算法:SMMA(X,N)=(SUM1-MMA+X)/N
其中SUM1=X1+X2+.....+XN
MMA=SUM1/N
例1:
SMMA(C,5); // 收盘价的5周期通畅移动平均线
取排序在相应位置的值。
SORT(Type,POS,N1,N2,...,N16);按升(降)序排列,取第POS个参数对应的值。
注:
1、当Type为0按升序排列,当Type为1按降序排列。
2、TYPE,POS,不支持变量。
3、N1,...,N16为参数,支持常量、变量,最多支持16个参数。
例:
SORT(0,3,2,1,5,3); // 2、1、5、3按升序排列,取排列第三的数字3
求和。
SUM(X,N),求X在N个周期内的总和。
注:
1、N包含当前k线。
2、若N为0则从第一个有效值开始算起。
3、当N为有效值,但当前的k线数不足N根,按照实际的根数计算。
4、N为空值时,返回空值。
5、N可以为变量。
例1:
SUM(VOL,25);表示统计25周期内的成交量总和。
例2:
N:=BARSLAST(DATE<>REF(DATE,1))+1; // 分钟周期,日内k线根数
SUM(VOL,N); // 分钟周期上,取当天成交量总和
累加到指定值的周期数。
SUMBARS(X,A),求累加到指定值的周期数。
注:
参数A支持变量。
例1:
SUMBARS(VOL,20000);将成交量向前累加直到大于等于20000,返回这个区间的周期数。
三角移动平均。
TRMA(X,N),求X在N个周期的三角移动平均值。
算法:三角移动平均线公式,是采用算数移动平均,并且对第一个移动平均线再一次应用算数移动平均。
TRMA(X,N)算法如下:
ma_half= MA(X,N/2)
trma=MA(ma_half,N/2)
注:
1、N包含当前k线。
2、当N为有效值,但当前的k线数不足N根,函数返回空值。
3、N为0或空值的情况下,函数返回空值。
4、N支持使用变量。
例1:
TRMA5:=TRMA(CLOSE,5); // 计算5个周期内收盘价的三角移动平均。(N不能被2整除)
// TRMA(CLOSE,5)=MA(MA(CLOSE,(5+1)/2)),(5+1)/2);
例2:
TRMA10:=TRMA(CLOSE,10); // 计算10个周期内收盘价的三角移动平均。(N能被2整除)
// TRMA(CLOSE,10)=MA(MA(CLOSE,10/2),(10/2)+1));
时间序列移动平均。
TSMA(X,N),求X在N个周期内的时间序列三角移动平均。
TSMA(a,n) 算法如下:
ysum=a[i]+a[i-1]+...+a[i-n+1]
xsum=i+i-1+..+i-n+1
xxsum=i*i+(i-1)*(i-1)+...+(i-n+1)*(i-n+1)
xysum=i*a[i]+(i-1)*a[i-1]+...+(i-n+1)*a[i-n+1]
k=(xysum -(ysum/n)*xsum)/(xxsum- xsum/n * xsum) // 斜率
b= ysum/n - k*xsum/n
forcast[i]=k*i+b // 线性回归
tsma[i] = forcast[i]+k // 线性回归+斜率
注:
1、当N为有效值,但当前的k线数不足N根,函数返回空值。
2、N为0或空值的情况下,函数返回空值。
3、N支持使用变量。
例1:
TSMA5:=TSMA(CLOSE,5); // 计算5个周期内收盘价的序列三角移动平均
平均绝对偏差。
AVEDEV(X,N),返回X在N周期内的平均绝对偏差。
注:
1、N包含当前k线。
2、N为有效值,但当前的k线数不足N根,该函数返回空值。
3、N为0时,该函数返回空值。
4、N为空值,该函数返回空值。
5、N不能为变量。
算法举例:计算AVEDEV(C,3);在最近一根K线上的值。
用麦语言函数可以表示如下:
(ABS(C-(C+REF(C,1)+REF(C,2))/3)+ABS(REF(C,1)-(C+REF(C,1)+REF(C,2))/3)+ABS(REF(C,2)-(C+REF(C,1)+REF(C,2))/3))/3;
例:
AVEDEV(C,5); // 返回收盘价在5周期内的平均绝对偏差
// 表示5个周期内每个周期的收盘价与5周期收盘价的平均值的差的绝对值的平均值,判断收盘价与其均值的偏离程度
皮尔森相关系数。
COEFFICIENTR(X,Y,N),求X、Y在N个周期内的皮尔森相关系数。
注:
1、N包含当前k线。
2、N为有效值,但当前的k线数不足N根,该函数返回空值。
3、N为0时,该函数返回空值。
4、N为空值,该函数返回空值。
5、N可以为变量。
算法举例:计算COEFFICIENTR(O,C,3);在最近一根K线上的值。
用麦语言函数可以表示如下:
(((O-MA(O,3))*(C-MA(C,3))+(REF(O,1)-MA(O,3))*(REF(C,1)-MA(C,3))+(REF(O,2)-MA(O,3))*(REF(C,2)-MA(C,3))) /(STD(O,3)*STD(C,3)))/(3-1);
例:
COEFFICIENTR(C,O,10); //求在10个周期内的皮尔森相关系数
//皮尔森相关系数是衡量两个随机变量之间的相关程度的指标
相关系数。
CORRELATION(X,Y,N),求X、Y在N个周期内的相关系数。
注:
1、N包含当前k线。
2、N为有效值,但当前的k线数不足N根,该函数返回空值。
3、N为0时,该函数返回空值。
4、N为空值,该函数返回空值。
5、N可以为变量。
算法举例:计算CORRELATION(O,C,3);在最近一根K线上的值。
用麦语言函数可以表示如下:
(((O-MA(O,3))*(C-MA(C,3))+(REF(O,1)-MA(O,3))*(REF(C,1)-MA(C,3))+(REF(O,2)-MA(O,3))*(REF(C,2)-MA(C,3))))/SQRT((SQUARE(O-MA(O,3))+SQUARE(REF(O,1)-MA(O,3))+SQUARE(REF(O,2)-MA(O,3)))*(SQUARE(C-MA(C,3))+SQUARE(REF(C,1)-MA(C,3))+SQUARE(REF(C,2)-MA(C,3))));
例:
CORRELATION(C,O,10); // 求在10个周期内的相关系数
// 相关系数是衡量两个随机变量之间的相关程度的指标
协方差。
COVAR(X,Y,N) 求X、Y在N个周期内的协方差。
注:
1、N包含当前k线。
2、N为有效值,但当前的k线数不足N根,该函数返回空值。
3、N为0时,该函数返回空值。
4、N为空值,该函数返回空值。
5、N可以为变量。
算法举例:计算COVAR(O,C,3);在最近一根K线上的值。
用麦语言函数可以表示如下:
(((O-MA(O,3))*(C-MA(C,3))+(REF(O,1)-MA(O,3))*(REF(C,1)-MA(C,3))+(REF(O,2)-MA(O,3))*(REF(C,2)-MA(C,3))) )/3;
例:
COVAR(C,O,10); // 求在10个周期内的协方差
// 两个不同变量之间的方差就是协方差,如果两个变量的变化趋势一致,那么两个变量之间的协方差就是正值;如果两个变量的变化趋势相反,那么两个变量之间的协方差就是负值
取得数据偏差平方和。
DEVSQ(X,N):计算数据X的N个周期的数据偏差平方和。
注:
1、N包含当前k线。
2、N为有效值,但当前的k线数不足N根,该函数返回空值。
3、N为0时,该函数返回空值。
4、N为空值,该函数返回空值。
5、N不支持为变量。
算法举例:计算DEVSQ(C,3);在最近一根K线上的值。
用麦语言函数可以表示如下:
SQUARE(C-(C+REF(C,1)+REF(C,2))/3)+SQUARE(REF(C,1)-(C+REF(C,1)+REF(C,2))/3)+SQUARE(REF(C,2)-(C+REF(C,1)+REF(C,2))/3);
例:
DEVSQ(C,5); // 计算数据收盘价5个周期的数据偏差平方和
// 表示收盘价与收盘价均值偏差分别平方之后求和,DEVSQ(C,5)表示5个周期的收盘价与收盘价均值偏差分别平方之后求和
线性回归值。
FORCAST(X,N),为X的N周期线性回归预测值。
注:
1、N包含当前k线。
2、N为有效值,但当前的k线数不足N根,该函数返回空值。
3、N为0时,该函数返回空值。
4、N为空值,该函数返回空值。
5、N可以是变量。
算法举例:用最小平方法计算FORCAST(C,3)在最近一根K线上的值。
1、建立一元线性方程:y=a+b*i+m
2、y的估计值:y(i)^=a+b*i
3、求残差:m^=y(i)-y(i)^=y(i)-a-b*i
4、误差平方和:
Q=m(1)*m(1)+...+m(3)*m(3)=[y(1)-a-b*1]*[y(1)-a-b*1]+...+[y(3)-a-b*3]*[y(3)-a-b*3]
5、对线性方程中的参数a,b求一阶偏导:
2*{[y(1)-a-b*1]+...+[y(3)-a-b*3]}*(-1)=0
2*[y(1)-a-b*1]*(-1)+...+[y(3)-a-b*3]*(-3)=0
6、联立以上两个公式,解出a,b的值:
a=(y(1)+y(2)+y(3))/3-b(i(1)+i(2)+i(3))/3
b=(y(1)*i(1)+y(2)*i(2)+y(3)*i(3)-(3*((i(1)+i(2)+i(3))/3)*((y(1)+y(2)+y(3))/3))/((i(1)^2+i(2)^2+i(3)^2)-3*((i(1)+i(2)+i(3))/3)^2)
7、将a,b,i值带入1,求出y值。
以上公式用麦语言函数可以表示如下:
BB:=(3*C+2*REF(C,1)+REF(C,2)-(3*((1+2+3)/3)*MA(C,3)))/((SQUARE(1)+SQUARE(2)+SQUARE(3))-3*SQUARE((1+2+3)/3));
AA:=MA(C,3)-BB*(1+2+3)/3;
YY:=AA+BB*3;
例:
FORCAST(CLOSE,5); // 表示求5周期线性回归预测值
峰度系数。
KURTOSIS(X,N),求X在N个周期内的峰度系数。
注:
1、N包含当前k线。
2、N为有效值,但当前的k线数不足N根,该函数返回空值。
3、N为0时,该函数返回空值。
4、N为空值,该函数返回空值。
5、N可以为变量。
6、N至少为4,少于4返回空值。
算法举例:计算KURTOSIS(C,4);在最近一根K线上的值。
用麦语言函数可以表示如下:
((POW(C-MA(C,4),4)+POW(REF(C,1)-MA(C,4),4)+POW(REF(C,2)-MA(C,4),4)+POW(REF(C,3)-MA(C,4),4)) /POW(STD(C,4),4))*(4*(4+1)/((4-1)*(4-2)*(4-3)))-3*SQUARE(4-1)/((4-2)*(4-3));
例:
KURTOSIS(C,10); // 表示收盘价的10周期峰值。峰值反映与正态分布相比某一分布的尖锐度或平坦度。正峰值表示相对尖锐的分布。负峰值表示相对平坦的分布
正态分布概率密度。
NORMPDF(X,MU,SIGMA),返回参数为MU和SIGMA的正态分布密度函数在X处的值。
注:
1、MU或SIGMA为空值,该函数返回空值。
2、MU和SIGMA支持变量。
算法举例:随机变量X服从一个位置参数为MU、尺度参数为SIGMA的概率分布,其概率密度为NORMPDF(X,MU,SIGMA)。
用麦语言函数可以近似的表示如下:
(1/(SQRT(2*3.14)*SIGMA))*EXP((-SQUARE(X-MU))/(2*SQUARE(SIGMA)));
例:
TR:=MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW));
ATR:=MA(TR,26); // 求26个周期内的TR的简单移动平均
ZZ..NORMPDF(ATR,0,1); // 定义变量ZZ,返回ATR服从标准正态分布的概率密度
偏度系数。
SKEWNESS(X,N),求X在N个周期内的偏度系数。
注:
1、N包含当前k线。
2、N为有效值,但当前的k线数不足N根,该函数返回空值。
3、N为0时,该函数返回空值。
4、N为空值,该函数返回空值。
5、N可以为变量。
6、N至少为3,少于3返回空值。
算法举例:计算SKEWNESS(C,3);在最近一根K线上的值。
用麦语言函数可以表示如下:
((POW(C-MA(C,3),3)+POW(REF(C,1)-MA(C,3),3)+POW(REF(C,2)-MA(C,3),3)) /POW(STD(C,3),3))*3/((3-1)*(3-2));
例:
SKEWNESS(C,10); // 表示收盘价的10周期偏度,偏度反映分布的不对称度,不对称度反映以平均值为中心的分布的不对称程度。正不对称度表示不对称部分的分布更趋向正值,负不对称度表示不对称部分的分布更趋向负值
线性回归的斜率。
SLOPE(X,N),得到X的N周期的线型回归的斜率。
注:
1、N包含当前k线。
2、N为有效值,但当前的k线数不足N根,该函数返回空值。
3、N为0时,该函数返回空值。
4、N为空值,该函数返回空值。
5、N可以为变量。
举例:
用最小平方法计算SLOPE(CLOSE,5)在最近一根K线上的的值:
1、建立一元线性方程:close=a+slope*i+m
2、close的估计值:close(i)^=a+slope*i
3、求残差:m^=close(i)-close(i)^=close(i)-a-slope*i
4、误差平方和:
Q=m(1)*m(1)+...+m(5)*m(5)=[close(1)-a-slope*1]*[close(1)-a-slope*1]+...+[close(5)-a-slope*5]*[close(5)-a-slope*5]
5、对线性方程中的参数a,slope求一阶偏导:
2*{[close(1)-a-slope*1]+...+[close(5)-a-slope*5]}*(-1)=0
2*{[close(1)-a-slope*1]+...+[close(5)-a-slope*5]}*(-5)=0
6、联立以上两个公式,反解出slope的值:
slope={[5*close(1))+...+1*close(5)]-[close(1)+...+close(5)]*(1+2+3+4+5)/5}/[(1*1+...+5*5)-(1+...+5)(1+...+5)/5]
以上公式用麦语言函数可以表示如下:
((5*C+4*REF(C,1)+3*REF(C,2)+2*REF(C,3)+1*REF(C,4))-SUM(C,5)*(1+2+3+4+5)/5)/((SQUARE(1)+SQUARE(2)+SQUARE(3)+SQUARE(4)+SQUARE(5))-SQUARE(1+2+3+4+5)/5);
例:
SLOPE(CLOSE,5); // 表示求收盘价5个周期线性回归线的斜率
样本标准差。
STD(X,N),求X在N个周期内的样本标准差。
注:
1、N包含当前k线。
2、N为有效值,但当前的k线数不足N根,该函数返回空值。
3、N为0时,该函数返回空值。
4、N为空值,该函数返回空值。
5、N可以为变量。
算法举例:计算STD(C,3);在最近一根K线上的值。
用麦语言函数可以表示如下:
SQRT((SQUARE(C-MA(C,3))+SQUARE(REF(C,1)-MA(C,3))+SQUARE(REF(C,2)-MA(C,3)))/2);
例:
STD(C,10); // 求收盘价在10个周期内的样本标准差
// 标准差表示总体各单位标准值与其平均数离差平方的算术平均数的平方根,它反映一个数据集的离散程度。STD(C,10)表示收盘价与收盘价的10周期均线之差的平方和的平均数的算术平方根。样本标准差是样本方差的平方根
总体标准差。
STDP(X,N),为X的N周期总体标准差。
注:
1、N包含当前k线。
2、N为有效值,但当前的k线数不足N根,该函数返回空值。
3、N为0时,该函数返回空值。
4、N为空值,该函数返回空值。
5、N可以为变量。
算法举例:计算STDP(C,3);在最近一根K线上的值。
用麦语言函数可以表示如下:
SQRT((SQUARE(C-MA(C,3))+SQUARE(REF(C,1)-MA(C,3))+SQUARE(REF(C,2)-MA(C,3)))/3);
例:
STDP(C,10); // 为收盘价的10周期总体标准差
// 总体标准差是反映研究总体内个体之间差异程度的一种统计指标,总体方差是一组资料中各数值与其算术平均数离差平方和的平均数,总体标准差则是总体方差的平方根
样本方差。
VAR(X,N),求X在N周期内的样本方差。
注:
1、N包含当前k线。
2、N为有效值,但当前的k线数不足N根,该函数返回空值。
3、N为0时,该函数返回空值。
4、N为空值,该函数返回空值。
5、N支持使用变量。
算法举例:计算VAR(C,3);在最近一根K线上的值。
用麦语言函数可以表示如下:
(SQUARE(C-MA(C,3))+SQUARE(REF(C,1)-MA(C,3))+SQUARE(REF(C,2)-MA(C,3)))/(3-1);
例:
VAR(C,5); // 求收盘价在5周期内的样本方差
// 表示总体方差的N/(N-1)倍,VAR(C,5)表示收盘价的5周期总体样本方差的5/4倍
总体方差。
VARP(X,N),为X的N周期总体方差。
注:
1、N包含当前k线。
2、N为有效值,但当前的k线数不足N根,该函数返回空值。
3、N为0时,该函数返回空值。
4、N为空值,该函数返回空值。
5、N支持使用变量。
算法举例:计算VARP(C,3);在最近一根K线上的值。
用麦语言函数可以表示如下:
(SQUARE(C-MA(C,3))+SQUARE(REF(C,1)-MA(C,3))+SQUARE(REF(C,2)-MA(C,3)))/3;
例:
VARP(C,5); // 为收盘价的5周期总体方差
// 表示数据偏差平方和除以总周期数N,VARP(C,5)表示收盘价5个周期的数据偏差平方和除以5
绝对值。
ABS(X),取的X的绝对值。
注:
1、正数的绝对值是它本身。
2、负数的绝对值是它的相反数。
3、0的绝对值还是0。
例1:
ABS(-10); // 返回10
例2:
ABS(CLOSE-10); // 返回收盘价和的10价差的绝对值
例3:
ABS(C-O); // 当前K线实体长度
反余弦值。
ACOS(X),返回X的反余弦值。
注:
1、X取值范围[-1,1]。
2、若X不在取值范围,返回值为空值。
例1:
ACOS(-1); // 求-1的反余弦值
例2:
ACOS(1); // 求1的反余弦值
反正弦值。
ASIN(X),返回X的反正弦值。
注:
1、X取值范围[-1,1]。
2、若X不在取值范围,返回值为空值。
例1:
ASIN(-1); // 求-1的反正弦值
例2:
ASIN(1); // 求1的反正弦值
反正切值。
ATAN(X),返回X的反正切值。
注:X的取值为R(实数集)。
例1:
ATAN(-1.75); // 求-1.75的反正切值
例2:
ATAN(1.75); // 求1.75的反正切值
向上舍入。
CEILING(X,Y),返回指定实数(X)在沿绝对值增大的方向上第一个能整除基数(Y)的值。
注:
1、如果X和Y符号相同,则对值按远离0的方向进行舍入。
2、X和Y符号不同的情况下:
(1)如果X为负,Y为正,则对值按朝向0的方向进行向上舍入。
(2)如果X为正,Y为负,CEILING返回无效值。
3、X、Y均可以为变量。
4、若X、Y中任意一个为空值,则该函数返回空值。
例1:
CEILING(2.1,1); // 求得3
例2:
CEILING(-8.8,-2); // 求得-10
例3:
CEILING(CLOSE*1.01,1); // 求收盘价的1.01倍向上取整
例4:
CEILING(-7,2); // 求得-6
例5:
CEILING(8,-2); // 返回无效值
余弦。
COS(X),返回X的余弦值。
注:
1、X的取值为R(实数集)。
2、值域为[-1,1]。
例1:
COS(-1.57); // 返回-1.57的余弦值
例2:
COS(1.57); // 返回1.57的余弦值
立方函数。
CUBE(X),返回X的三次方。
例1:
CUBE(4); // 求4的立方
指数。
EXP(X),求e的X次幂。
例1:
C*EXP(0.01); // 求收盘价乘以e的0.01次幂
向下舍入。
FLOOR(A),向数值减小方向舍入。
注:
FLOOR(A)返回沿A数值减小方向最接近的整数,若A为整数,则返回值为A。
例1:
FLOOR(2.1); // 返回值为2
例2:
FLOOR(-8.8); // 返回值为-9
例3:
FLOOR(5); // 返回值为5
例4:
IFELSE(C-INTPART(C)>=0.5,CEILING(C),FLOOR(C)); // 对收盘价四舍五入后取整数部分
取整。
INTPART(X),取X的整数部分。
例1:
INTPART(12.3); // 返回值为12
例2:
INTPART(-3.5); // 返回值为-3
例3:
INTPART(10); // 返回值为10
例4:
INTPART(C); // 求收盘价的整数部分
自然对数。
LN(X),求X的自然对数。
注:
1、X取值范围为非0自然数,即1、2、3、4、5 ...
2、若X取值为0或负数,返回值为空值。
例:
LN(OPEN); // 求开盘价的对数
常用对数。
LOG(X),求X的常用对数值。
注:
1、该函数中X的取值范围为X>0。
2、0和负数没有对数,X为0或负数时返回值为空值。
例1:
LOG(100); // 返回2
例2:
LOG(0); // 返回空值
最大值。
MAX(A,B),取最大值。取A,B中较大者。
注:
若A=B,返回值为A或者B的值。
例1:
MAX(CLOSE,OPEN); // 表示取开盘价和收盘价中较大者
例2:
MAX(CLOSE-OPEN,0); // 表示若收盘价大于开盘价返回它们的差值,否则返回0
例3:
MAX(A,MAX(B,MAX(C,D))); // 求 A、B、C、D四者中的最大值
取最大值。
MAX1(A...P),在A到P中取最大值。
注:
1、支持2-16个数值进行比较。
2、A...P可以为数字也可以为变量。
例1:
MAX1(CLOSE,OPEN); // 表示取开盘价和收盘价中较大者
例2:
MAX1(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16); // 表示取数字1-16中的最大值
求中位数。
MEDIAN(X,N) 求X在N个周期内居于中间的数值。
注:
1、N个周期内所有X排序后,若N为奇数,则选择第(N+1)/2个为中位数,若N为偶数,则中位数是(N/2以及N/2+1)的平均数。
2、N可以为变量。
例1:
豆粕1509最近3日的收盘价为2727、2754、2748,那么当前MEDIAN(C,3)的返回值是2748。
例2:
豆粕1509最近4日的开盘价为2752、2743、2730、2728,那么当前MEDIAN(O,4)的返回值是2736.5。
求中位数。
MEDIAN1(A,...,P),求A到P内居于中间的数值。
注:
1、支持最多16个参数进行计算。
2、A...P可以为数值也可以为变量。
3、若参数个数为N,对N个参数排序后,N为奇数,则选择第(N+1)/2个为中位数,若N为偶数,则中位数是(N/2以及N/2+1)的平均数。
例1:
AA:=MEDIAN1(O,C,H); // 开盘价、收盘价、最高价按数值排序,取居中的数值
例2:
BB:=MEDIAN1(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16); // 表示取数字1-16的中位数,BB返回8.5
最小值。
MIN(A,B),取最小值。取A,B中较小者。
注:
若A=B,返回值为A或者B的值。
例1:
MIN(OPEN,CLOSE); // 表示取开盘价和收盘价中的较小者
例2:
MIN(C,MIN(O,REF(C,1))); // 求当前周期的开盘价,收盘价,以及上周期的收盘价间最小的数值
取最小值。
MIN1(A...P),在A到P中取最小值。
注:
1、支持2-16个数值进行比较。
2、A...P可以为数字也可以为变量。
例1:
MIN1(CLOSE,OPEN); // 表示取开盘价和收盘价中较小者
例2:
MIN1(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16); // 表示取数字1-16中的最小值
取模。
MOD(A,B),取模。返回A对B求模。
例1:
MOD(26,10); // 返回6,26除以10所得余数为6,即26对10的模为6
例2:
MOD(A,2)=0; // 判断A为偶数
求众数。
MODE(X,N),求X在N个周期内最常出现的值。
注:
1、如果N个周期内不含有重复的数值,则函数返回空值。
2、N可以为变量。
幂。
POW(X,Y),求X的Y次幂。
注:
1、当X为负数时,Y必须为整数,因为底数为负时,不能进行开方运算,返回值为空值。
2、X,Y可以为数值,也可以为变量。
例1:
POW(CLOSE,2); // 求得收盘价的2次方
例2:
POW(10,2); // 返回值为100
例3:
POW(1/2,-2); // 返回值为4
例4:
POW(100,O-C); // 返回100的O-C次方
产生随机数的随机函数。
RAND(X,Y),产生随机数的随机函数,返回范围在X到Y之间的随机数。
注:
1、X、Y参数均支持设置为变量。
2、该函数仅支持返回整数。
3、当X>Y时,函数返回空值。
4、当X与Y的范围小于1时,函数返回无效值。
例1:
RAND(1,60); // 返回1到60之间的随机数值
例2:
RAND(C,O); // 返回收盘价到开盘价之间的随机数值
范围。
RANGE(X,Y,Z):介于某个范围之内。表示X大于Y同时小于Z时返回1,否则返回0
例1:
RANGE(5,4,6); // 返回值为1
例2:
RANGE(8,3,6); // 返回值为0
例3:
MA5:=MA(C,5);
MA10:=MA(C,10);
MA20:=MA(C,20);
RANGE(MA10,MA20,MA5),BK; // 10周期均线在5周期均线与20周期均线之间买开仓
// RANGE(MA10,MA20,MA5)=1,BK;与RANGE(MA10,MA20,MA5),BK;表达同等意义
取相反值。
REVERSE(X),取相反值。返回-X。
例1:
REVERSE(LOW); // 返回-LOW
例2:
REVERSE(-55); // 返回值为55
例3:
REVERSE(0); // 返回值为0
指定位数四舍五入。
ROUND(N,M),对数字N进行位数为M的四舍五入。
注:
1、N支持写为变量和参数;M不支持写为变量,可以写为参数。
2、M>0,则对数字N小数点后M位小数进行四舍五入。
3、M=0,则将数字N四舍五入为整数。
4、M<0,则在数字N小数点左侧前M位进行四舍五入。
例1:
ROUND(125.345,2); // 返回125.35
例2:
ROUND(125.345,0); // 返回125
例3:
ROUND(125.345,-1); // 返回130
取符号。
SGN(X),取符号。若X>0返回1,若X<0返回-1,否则返回0。
例1:
SGN(5); // 返回值为1
例2:
SGN(-5); // 返回值为-1
例3:
SGN(0); // 返回值为0
求正弦。
SIN(X),求X的正弦值。
注:
1、X的取值为R(实数集)。
2、值域为(-1,1)。
例1:
SIN(-1.57); // 返回-1.57的正弦值
例2:
SIN(1.57); // 返回1.57的正弦值
平方根。
SQRT(X),求X的平方根。
注:
X的取值为正数,X为负数时返回空值。
例1:
SQRT(CLOSE); // 收盘价的平方根
平方。
SQUARE(X)求X的平方。
例1:
SQUARE(C); // 收盘价的平方
例2:
SQUARE(2); // 2的平方
正切。
TAN(X),返回X的正切值。
例1:
TAN(0); // 返回0的正切值
例2:
TAN(-3.14); // 返回-3.14的正切值
BK 买开仓。
BP 买平仓。
SK 卖开仓。
SP 卖平仓。
BPK 买平后买开新仓。
SPK 卖平后卖开新仓。
CLOSEOUT 清仓指令,平掉所有方向的持仓。
SELECT 在符合条件的K线上标识一个图型,一般用于形态识别。
TRADE_AGAIN(N),含有该函数的加减仓模型中,同一指令行可以连续出N个信号。
AUTOFILTER,启用一开一平信号过滤机制。
MULTSIG(Sec1, Sec2, N),设置一根k线多信号的指令价方式(TICK逐笔回测,可设置回测精度)。
开仓信号出信号Sec1秒下单,不复核。
平仓信号出信号Sec2秒下单,不复核。
FILTER(COND,N),过滤连续出现的信号。 COND条件成立时,其后N周期内的数据返回0。
例如:
a:=FILTER(CLOSE>OPEN, 3) // 查找阳线,3个周期内再次出现的阳线不被记录在内
注意:不能与BKPRICE,BARSBK,SKPRICE,BARSSK一起使用。
启用一开一平信号过滤机制。
AUTOFILTER启用一开一平信号过滤机制。
用法:
模型中含有AUTOFILTER函数,则启用一开一平信号过滤机制。
模型中不写入该函数,则每个指令都有效,支持加减仓。
模型的过滤规则:
1、连续的同方向指令只有第一个有效,其他的将被过滤;
2、交易指令必须先开仓后平仓,一开一平配对出现:
出现BK指令,下一个指令只允许出现SP\SPK指令;
出现SK指令,下一个指令只允许出现BP\BPK指令;
出现SP/BP/CLOSEOUT等平仓指令,下一个可以是BK/SK/SPK/BPK指令任一个;
反手指令SPK和BPK交叉出现。
例:
CLOSE>OPEN,BK;
CLOSE<OPEN,SP;
AUTOFILTER; // 启用一开一平信号过滤机制
限制信号函数。
TRADE_AGAIN(N),同一指令行可以连续出N个信号。
用法:
TRADE_AGAIN(N)含有该函数的加减仓模型中,同一指令行可以连续出N个信号。
注:
1、该函数只适用于加减仓模型。
2、模型中写入该函数,一根K线只支持一个信号。不可以和 MULTSIG 函数同时使用。
3、N个信号必须连续执行,如果期间出现其他信号,则N从新计算。
4、N不可以写为变量。
例:
C>O,BK(1); // K线为阳线,买开1手
C<O,SP(BKVOL); // K线为阴线,卖平多头持仓
TRADE_AGAIN(3); // 同一指令行可以连续执行3次(如果连续三根阳线,则连续三次买开仓)
返回数据合约最近一次买开信号价位。
BKPRICE返回数据合约最近一次买开信号价位。
用法:
BKPRICE返回数据合约最近一次买开信号发出时的行情的最新价。
注:
1、当数据合约和交易合约相同时BKPRICE值和BKPRICE1值相等。
2、当模型存在连续多个开仓信号(加仓)的情况下,该函数返回的是最近一次开仓信号的价格,而不是开仓均价。
3、不同信号执行方式,其返回值分别为:
(1)信号执行方式为不进行信号复核
历史回测:BKPRICE返回信号发出时的数据合约行情最新价。
(2)信号执行方式选择K线走完确认信号下单
历史回测:BKPRICE返回信号发出时数据合约当根K线的收盘价。
(3)信号执行方式设置为K线走完进行信号复核
历史回测:BKPRICE返回信号发出时数据合约当根K线的收盘价。
例:
BKPRICE-CLOSE>60 && BKPRICE>0 && BKVOL>0, SP; // 如果买开价位比当前价位高出60,且多头持仓存在,卖平仓
返回数据合约多头开仓均价。
BKPRICEAV返回数据合约多头开仓均价。
用法:
BKPRICEAV返回数据合约多头开仓均价。
注:
1、一开一平信号过滤模型:
(1)开仓信号后,未出平仓信号时:BKPRICEAV取值和BKPRICE取值相同。
(2)平仓信号后:BKPRICEAV返回值为0。
2、加减仓模型:
(1)持仓不为0时:BKPRICEAV返回数据合约持仓的开仓均价。
(2)加减仓模型持仓为0时:BKPRICEAV返回值为0。
注:
该函数的计算考虑滑点。
例:
CLOSE-BKPRICEAV>60,SP(BKVOL); // 当前价位比多头开仓均价高出60,平掉所有多头持仓
买开信号手数。
买开信号手数。
用法:
BKVOL返回模型当前的多头持仓。
1、加载运行:
(1)回测系统运行中,BKVOL不受资金情况的限制,按照信号显示开仓手数。
2、回测运行中:
(1)如果资金不够开仓,开仓手数为0,BKVOL返回值为0。
(2)BK(BPK)信号出现并且确认固定后,BKVOL的取值增加开仓手数的数值;SP(SPK)信号出现并且确认固定后,BKVOL的取值减少平仓手数的数值。
例:
BKVOL=0&&C>O,BK(1); // 多头持仓为0并且收盘价大于开盘价时,买开一手
BKVOL>=1&&H>HV(H,5),BK(2); // 多头持仓大于等于1,并且当根K线的最高价大于前面5个周期中最高价中最大值时,加仓2手
BKVOL>0&&L<REF(L,5),SP(BKVOL); // 多头持仓大于0,并且当根K线的最低价小于5个周期前K线的最低价时,卖平所有多头持仓
返回数据合约买开仓以来的最高价。
返回数据合约买开仓以来的最高价。
用法:
BKHIGH返回数据合约最近一次模型买开位置到当前的最高价。
1、不同信号执行方式,其返回值分别为:
(1)信号执行方式为K线走完确认信号下单。
a.历史信号计算中,BK(BPK)信号之后的K线返回委托以来的数据合约行情的最高价。
b.加载运行过程中,BK(BPK)信号当根K线返回的为信号发出时数据合约行情的最新价,BK之后的K线返回委托以来的数据合约行情最高价。
从BK(BPK)信号发出时开始统计数据合约行情的最高价;信号消失,返回上次买开以来的数据合约行情的最高价,信号确认存在,返回当根K线记录的数据合约行情的最高价。
注:BK信号发出后,中间出了信号消失,从最后一次信号出现开始统计数据合约最高价。
(3)信号执行方式选择不进行信号复核(例如:在模型中写入MULTSIG)。
BK(BPK)信号的当根K线返回从信号发出到K线走完时数据合约行情的最高价;BK(BPK)信号之后的K线返回信号发出以来数据合约行情的最高价。
例:
C>O,BK;
C>BKPRICE&&C<BKHIGH-5,SP;
AUTOFILTER; // 最新价低于买开仓以来的数据合约最高价5个点,止盈平仓
返回数据合约买开仓以来的最低价。
返回数据合约买开仓以来的最低价。
用法:
BKLOW返回数据合约最近一次模型买开位置到当前的最低价。
1、不同信号执行方式,其返回值分别为:
(1)K线走完确认信号下单
a.历史信号计算中,BK(BPK)信号之后的K线返回委托以来的数据合约行情的最低价。
b.加载运行过程中,BK(BPK)信号当根K线返回的为信号发出时数据合约行情的最新价,BK之后的K线返回委托以来的数据合约行情最低价。
从BK(BPK)信号发出时行情时开始统计数据合约行情的最低价;信号消失,返回上次买开以来的数据合约行情的最低价,信号确认存在,返回当根K线记录的数据合约行情的最低价。
注:BK信号发出后,中间出了信号消失,从最后一次信号出现开始统计数据合约最低价。
(3)信号执行方式选择不进行信号复核(例如:在模型中写入MULTSIG)
BK(BPK)信号的当根K线返回的从信号发出到K线走完时数据合约行情的最低价;BK(BPK)信号之后的K线返回信号发出以来数据合约行情的最低价。
例:
C>O,BK;
C>BKLOW+5,SP;
AUTOFILTER; // 最新价高于买开仓以来数据合约的最低价5个点,平仓
返回数据合约最近一次卖开信号价位。
SKPRICE 返回数据合约最近一次卖开信号价位。
用法:
SKPRICE 返回数据合约最近一次卖开信号发出时的行情的最新价。
注:
1、当数据合约和交易合约相同时SKPRICE值和SKPRICE1值相等。
2、当模型存在连续多个开仓信号(加仓)的情况下,该函数返回的是最近一次开仓信号的价格,而不是开仓均价。
3、不同信号执行方式,其返回值分别为:
(1)信号执行方式为不进行信号复核
a.历史回测:SKPRICE返回信号发出时的数据合约行情最新价。
(2)信号执行方式选择K线走完确认信号下单
a.历史回测:SKPRICE返回信号发出时数据合约当根K线的收盘价。
(3)信号执行方式设置为K线走完进行信号复核
a.历史回测:SKPRICE返回信号发出时数据合约当根K线的收盘价。
例:
CLOSE-SKPRICE>60 && SKPRICE>0 && SKVOL>0, BP; // 如果卖开价位比当前价位低出60,且空头持仓存在,买平仓
返回数据合约空头开仓均价。
SKPRICEAV 返回数据合约空头开仓均价。
用法:
SKPRICEAV 返回返回数据合约空头开仓均价。
注:
1、一开一平信号过滤模型:
(1)开仓信号后,未出平仓信号时:SKPRICEAV取值和SKPRICE取值相同。
(2)平仓信号后:SKPRICEAV返回值为0。
2、加减仓模型:
(1)持仓不为0时:SKPRICEAV返回数据合约持仓的开仓均价。
(2)加减仓模型持仓为0时:SKPRICEAV返回值为0。
注:
该函数的计算考虑滑点。
例:
SKPRICEAV-CLOSE>60,BP(SKVOL); // 当前价位比空头开仓均价低出60,平掉所有空头持仓
卖开信号手数。
卖开信号手数
用法:
SKVOL返回模型当前的空头持仓。
1、加载运行:
(1)回测系统运行中,SKVOL不受资金情况的限制,按照信号显示开仓手数。
2、回测运行中:
(1)如果资金不够开仓,开仓手数为0,SKVOL返回值为0。
(2)SK(SPK)信号出现并且确认固定后,SKVOL的取值增加开仓手数的数值;BP(BPK)信号出现并且确认固定后,SKVOL的取值减少平仓手数的数值。
例:
SKVOL=0&&C<O,SK(1); // 空头持仓为0并且收盘价小于开盘价时,卖开一手
SKVOL>=1&&L<LV(L,5),SK(2); // 空头持仓大于等于1,并且当根K线的最低价小于前面5个周期中最低价中最小值时,加仓2手
SKVOL>0&&H>REF(H,5),BP(SKVOL); // 空头持仓大于0,并且当根K线的最高价大于5个周期前K线的最高价时,买平所有空头持仓
返回数据合约卖开仓以来的最高价。
返回数据合约卖开仓以来的最高价。
用法:
SKHIGH返回数据合约最近一次模型卖开位置到当前的最高价。
1、不同信号执行方式,其返回值分别为:
(1)K线走完确认信号下单
a.历史信号计算中,SK(SPK)信号之后的K线返回委托以来的数据合约行情的最高价。
b.加载运行过程中,SK(SPK)信号当根K线返回的为信号发出时数据合约行情的最新价,SK之后的K线返回委托以来的数据合约行情最高价。
从SK(SPK)信号发出时开始统计数据合约行情的最高价;信号消失,返回上次卖开以来的数据合约行情的最高价,信号确认存在,返回当根K线记录的数据合约行情的最高价。
注:SK信号发出后,中间出了信号消失,从最后一次信号出现开始统计数据合约最高价。
(3)信号执行方式选择不进行信号复核(例如:在模型中写入MULTSIG)
SK(SPK)信号的当根K线返回的从信号发出到K线走完时数据合约行情的最高价;SK(SPK)信号之后的K线返回信号发出以来数据合约行情的最高价。
例:
C<O,SK;
C<SKHIGH-5,BP;
AUTOFILTER; // 最新价低于卖开仓以来数据合约的最高价5个点,平仓
返回数据合约卖开仓以来的最低价。
返回数据合约卖开仓以来的最低价。
用法:
SKLOW返回数据合约最近一次模型卖开位置到当前的最低价。
1、不同信号执行方式,其返回值分别为:
(1)K线走完确认信号下单
a.历史信号计算中,SK(SPK)信号之后的K线返回委托以来的数据合约行情的最低价。
b.加载运行过程中,SK(SPK)信号当根K线返回的为信号发出时数据合约行情的最新价,SK之后的K线返回委托以来的数据合约行情最低价。
信号发出时行情时开始统计数据合约行情的最低价;信号消失,返回上次卖开以来的数据合约行情的最低价,信号确认存在,返回当根K线记录的数据合约行情的最低价。
注:SK信号发出后,中间出了信号消失,从最后一次信号出现开始统计数据合约最低价。
(3)信号执行方式选择不进行信号复核(例如:在模型中写入MULTSIG)
SK(SPK)信号的当根K线返回的从信号发出到K线走完时数据合约行情的最低价;SK(SPK)信号之后的K线返回信号发出以来数据合约行情的最低价。
例:
C<O,SK;
C<SKPRICE&&C>SKLOW+5,BP;
AUTOFILTER; // 最新价高于卖开仓以来数据合约的最低价5个点,止盈平仓
判断上一个信号是否是BK。
ISLASTBK判断上一个交易信号是否是BK。
用法:
ISLASTBK上一个交易信号是BK则返回1(Yes),否则返回0(No)。
BK信号未确认时,ISLASTBK返回值0。
BK信号确认后,ISLASTBK返回1。
b.信号执行方式选择不进行信号复核(例如:在模型中写入MULTSIG),BK信号当根ISLASTBK返回值为1。
注:模型中含有BPK条件,且上一个信号为平仓信号时,由BPK指令产生的BK信号,ISLASTBK返回0,ISLASTBPK返回1。
例:
C>O,BK;
ISLASTBK&&C>BKPRICE,SP;
AUTOFILTER; // 上一个信号是BK信号,且最新价大于开仓价格,卖平仓
判断上一个信号是否是SK。
ISLASTSK判断上一个交易信号是否是SK。
用法:
ISLASTSK上一个交易信号是SK则返回1(Yes),否则返回0(No)。
SK信号未确认时,ISLASTSK返回值0。
SK信号确认后,ISLASTSK返回1。
b.信号执行方式选择不进行信号复核(例如:在模型中写入MULTSIG),SK信号当根ISLASTSK返回值为1。
注:模型中含有SPK条件,且上一个信号为平仓信号时,由SPK指令产生的SK信号,ISLASTSK返回0,ISLASTSPK返回1。
例:
C<O,SK;
ISLASTSK&&C<SKPRICE,BP;
AUTOFILTER; // 上一个信号是SK信号,且最新价小于开仓价格,买平仓
判断上一个信号是否是BP。
ISLASTBP判断上一个交易信号是否是BP。
用法:
ISLASTBP上一个交易信号是BP则返回1(Yes),否则返回0(No)。
BP信号未确认时,ISLASTBP返回值0。
BP信号确认后,ISLASTBP返回1。
b.信号执行方式选择不进行信号复核(例如:在模型中写入MULTSIG),BP信号当根ISLASTBP返回值为1。
例:
C<O,SK(2);
C>O,BP(1);
ISLASTBP,BP(1); // 上一个信号是买平仓信号,则减仓一手
判断上一个信号是否是SP。
ISLASTSP判断上一个交易信号是否是SP。
用法:
ISLASTSP,上一个交易信号是SP则返回1(Yes),否则返回0(No)。
SP信号未确认时,ISLASTSP返回值0。
SP信号确认后,ISLASTSP返回1。
b.信号执行方式选择不进行信号复核(例如:在模型中写入MULTSIG),SP信号当根ISLASTSP返回值为1。
例:
C>O,BK(2);
C<O,SP(1);
ISLASTSP,SP(1); // 上一个信号是卖平仓信号,则减仓一手
判断上一个信号是否是BPK。
ISLASTBPK判断上一个交易信号是否是BPK。
用法:
ISLASTBPK上一个交易信号是BPK则返回1(Yes),否则返回0(No)。
BPK信号未确认时,ISLASTBPK返回值0。
BPK信号确认后,ISLASTBPK返回1。
b.信号执行方式选择不进行信号复核(例如:在模型中写入MULTSIG),BPK信号当根ISLASTBPK返回值为1。
注:模型中含有BPK条件,且上一个信号为平仓信号时,由BPK指令产生的BK信号,ISLASTBK返回0,ISLASTBPK返回1。
例:
C>O,BPK;
ISLASTBPK&&C<O,SPK;
AUTOFILTER; // 上一个信号是BPK信号,则反手SPK
判断上一个信号是否是SPK。
ISLASTSPK判断上一个交易信号是否是SPK。
用法:
ISLASTSPK上一个交易信号是SPK则返回1(Yes),否则返回0(No)。
SPK信号未确认时,ISLASTSPK返回值0。
SPK信号确认后,ISLASTSPK返回1。
b.信号执行方式选择不进行信号复核(例如:在模型中写入MULTSIG),SPK信号当根ISLASTSPK返回值为1。
注:模型中含有SPK条件,且上一个信号为平仓信号时,由SPK指令产生的SK信号,ISLASTSK返回0,ISLASTSPK返回1。
例:
C<O,SPK;
ISLASTSPK&&C>O,BPK;
AUTOFILTER; // 上一个信号是SPK信号,则反手BPK
判断上一个信号是否是STOP。
ISLASTSTOP判断上一个交易信号是否是STOP。
用法:
ISLASTSTOP上一个交易信号是STOP则返回1(Yes),否则返回0(No)。
注:收盘价模型STOP信号下根K线ISLASTSTOP返回值为1;指令价模型STOP信号当根K线ISLASTSTOP返回值为1。
例:
CROSS(C,MA(C,5)),BK(2);
STOP(0,5);
ISLASTSTOP&&CROSS(C,MA(C,10)),BK(1); // 上一个信号是STOP信号,且价格上穿10周期均线,开仓一手
判断上一个信号是否是CLOSEOUT。
ISLASTCLOSEOUT判断上一个信号是否CLOSEOUT。
用法:
ISLASTCLOSEOUT上一个交易信号是CLOSEOUT返回1(Yes),否则返回0(No)。
CLOSEOUT信号未确认时,ISLASTCLOSEOUT返回值0。
CLOSEOUT信号确认后,ISLASTCLOSEOUT返回1。
b.信号执行方式选择不进行信号复核(例如:在模型中写入MULTSIG),CLOSEOUT信号当根ISLASTCLOSEOUT返回值为1。
例:
ISLASTCLOSEOUT&&C>O,BK(1); // 上一个信号是清仓信号,并且当根K线是阳线,则买开一手
上一次买开信号位置。
BARSBK上一次买开信号位置。
用法:
BARSBK返回上一次买开仓的K线距离当前K线的周期数(不包含出现BK信号的那根K线)。
取包含BK信号出现的那根K线到当前K线的周期数,则需要在此函数后+1,即BARSBK+1;由于发出BK信号的当根k线BARSBK返回空值,则BARSBK+1在发出BK信号当根k线返回空值。
注:
1、若当前K线之前无BK信号,则函数返回值为空值。
2、BK信号固定后BARSBK返回为空值。
(1)设置信号执行方式为K线走完确认信号下单。
BARSBK返回值为上一个BK信号距离当前的K线根数(包含当前K线)
(2)设置信号执行方式为出信号立即下单,不复核(例如:在模型中写入MULTSIG)
a.历史信号计算中,出现BK信号的当根K线,BARSBK返回空值。
b.加载运行过程中,信号固定后BARSBK返回空值。
BARSBK返回值为上一个BK信号距离当前的K线根数(包含当前K线)。
例:
1、BARSBK>10,SP; // 上一次买开仓(不包含出现买开信号的那根K线)距离当前K线的周期数大于10,卖平
2、HHV(H,BARSBK+1); // 上一次买开仓(包含开仓信号出现的当根k线)到当前的最高价的最大值
当根K线出现BK信号,AA返回为空值,需要返回当根K线上最高价,模型需要修改为:
AA:=IFELSE(BARSBK>=1,HHV(H,BARSBK+1),H);
(1)当根K线出现BK信号,BARSBK返回为空值,不满足BARSBK>=1的条件,则取值为当根K线的最高价H。
(2)发出BK信号之后K线BARSBK返回买开仓的K线距离当前K线的周期数,满足BARSBK>=1的条件,则取值为HHV(H,BARSBK+1),即买开仓(包含开仓信号出现的当根k线)到当前的最高价的最大值。
修改后如果平仓条件中用到了AA的值,当根K线满足了平仓条件,可以出现平仓信号。
3、AA:=IFELSE(BARSBK>=1,REF(C,BARSBK),C); // 取最近一次买开仓K线的收盘价
(1)发出BK信号的当根k线BARSBK返回空值,则当根K线不满足BARSBK>=1的条件,AA返回当根k线的收盘价。
(2)发出BK信号之后的k线BARSBK返回买开仓的K线距离当前K线的周期数,则AA返回REF(C,BARSBK),即开仓k线的收盘价。
(3)例:1、2、3三根k线,1中的K线为开仓信号的当根k线,则返回当根k线的收盘价,2、3中的K线AA返回值为1中的K线的收盘价。
上一次卖开信号位置。
BARSSK上一次卖开信号位置。
用法:
BARSSK返回上一次卖开仓的K线距离当前K线的周期数(不包含出现SK信号的那根K线)。
取包含SK信号出现的那根K线到当前K线的周期数,需要在此函数后+1,即BARSSK+1;由于发出SK信号的当根k线BARSSK返回空值,则BARSSK+1在发出SK信号当根k线返回空值。
注:
1、若当前K线之前无SK信号,则函数返回值为空值。
2、SK信号固定后BARSSK返回为空值。
(1)设置信号执行方式为K线走完确认信号下单。
BARSSK返回值为上一个SK信号距离当前的K线根数(包含当前K线)
(2)设置信号执行方式为出信号立即下单,不复核(例如:在模型中写入MULTSIG)
a.历史信号计算中,出现SK信号当根K线,BARSSK返回空值。
b.加载运行过程中,SK信号当根K线,信号固定后BARSSK返回空值。
BARSSK返回值为上一个SK信号距离当前的K线根数(包含当前K线)。
例:
1、BARSSK>10,BP; // 上一次卖开仓(不包含出现买开信号的那根K线)距离当前K线的周期数大于10,买平
2、LLV(L,BARSSK+1); // 上一次卖开仓(包含开仓信号出现的当根k线)到当前的最低价的最小值
当根K线出现SK信号,AA返回为空值,如果需要返回当根K线上最低价,模型需要修改为:
AA:=IFELSE(BARSSK>=1,LLV(L,BARSSK+1),L);
(1)当根K线出现SK信号,BARSSK返回为空值,不满足BARSSK>=1的条件,则取值为当根K线的最低价L。
(2)发出SK信号之后K线SARSBK返回卖开仓的K线距离当前K线的周期数,满足BARSSK>=1的条件,则取值为LLV(L,BARSSK+1),即卖开仓(包含开仓信号出现的当根k线)到当前的最低价的最小值。
修改后如果平仓条件中用到了AA的值,当根K线满足了平仓条件,可以出现平仓信号。
3、AA:=IFELSE(BARSSK>=1,REF(C,BARSSK),C); // 取最近一次卖开仓K线的收盘价
(1)发出SK信号的当根k线BARSSK返回空值,则当根K线不满足BARSSK>=1的条件,AA返回当根k线的收盘价。
(2)发出SK信号之后的k线BARSSK返回卖开仓的K线距离当前K线的周期数,则AA返回REF(C,BARSSK),即开仓k线的收盘价。
(3)例:1、2、3三根k线,1K线为开仓信号的当根k线,则返回当根k线的收盘价,2、3K线AA返回值为1K线的收盘价。
上一次卖平信号位置。
BARSSP上一次卖平信号位置。
用法:
BARSSP返回上一次卖平仓的K线距离当前K线的周期数(不包含出现SP信号的那根K线)。
取包含SP信号出现的那根K线到当前K线的周期数,则需要在此函数后+1,即BARSSP+1。由于发出SP信号的当根k线BARSSP返回空值,则BARSSP+1在发出SP信号当根k线返回空值。
注:
1、若当前K线之前无SP信号,则函数返回值为空值。
2、SP信号固定后BARSSP返回为空值。
(1)设置信号执行方式为K线走完确认信号下单。
BARSBP返回值为上一个BP信号距离当前的K线根数(包含当前K线)。
(2)设置信号执行方式为出信号立即下单,不复核(例如:在模型中写入MULTSIG)
a.历史信号计算中,出现SP信号当根K线,BARSSP返回空值。
b.加载运行过程中,SP信号当根K线,信号固定后BARSSP返回空值。
BARSSP返回值为上一个SP信号距离当前的K线根数(包含当前K线)。
例:
1、BARSSP>10,BK; // 上一次卖平仓(不包含出现卖平信号的那根K线)距离当前K线的周期数大于10,买开
2、AA:=HHV(H,BARSSP+1); // 上一次,卖平仓(包含平仓信号出现的当根k线)到当前的最高价的最大值
当根K线出现SP信号,AA返回为空值,如果需要返回当根K线上最高价,模型需要修改为:
AA:=IFELSE(BARSSP>=1,HHV(H,BARSSP+1),H);
(1)当根K线出现SP信号,BARSSP返回为空值,不满足BARSSP>=1的条件,则取值为当根K线的最高价H。
(2)发出SP信号之后K线BARSSP返回买平仓的K线距离当前K线的周期数,满足BARSSP>=1的条件,则取值为HHV(H,BARSSP+1),即卖平仓(包含平仓信号出现的当根k线)到当前的最高价的最大值。
3、AA:=IFELSE(BARSSP>=1,REF(C,BARSSP),C); // 取最近一次卖平仓K线的收盘价
(1)发出SP信号的当根k线BARSSP返回空值,则当根K线不满足BARSSP>=1的条件,AA返回当根k线的收盘价。
(2)发出SP信号之后的k线BARSSP返回卖平仓的K线距离当前K线的周期数,则AA返回REF(C,BARSSP),即平仓k线的收盘价。
(3)1、2、3三根k线,1中的K线为平仓信号的当根k线,则返回当根k线的收盘价,2、3中的K线AA返回值为1中的K线的收盘价。
上一次买平信号位置。
BARSBP上一次买平信号位置。
用法:
BARSBP返回上一次买平仓的K线距离当前K线的周期数(不包含出现BP信号的那根K线)。
取包含BP信号出现的那根K线到当前K线的周期数,则需要在此函数后+1,即BARSBP+1。由于发出BP信号的当根k线BARSBP返回空值,则BARSBP+1在发出BP信号当根k线返回空值。
注:
1、若当前K线之前无BP信号,则函数返回值为空值。
2、BP信号固定后BARSBP返回为空值。
(1)设置信号执行方式为K线走完确认信号下单。
BARSBP返回值为上一个BP信号距离当前的K线根数(包含当前K线)
(2)设置信号执行方式为出信号立即下单,不复核(例如:在模型中写入MULTSIG)
a.历史信号计算中,出现BP信号当根K线,BARSBP返回空值。
b.加载运行过程中,BP信号当根K线,信号固定后BARSBP返回空值。
BARSBP返回值为上一个BP信号距离当前的K线根数(包含当前K线)。
例:
1、BARSBP>10,BK; // 上一次买平仓(不包含出现买平信号的那根K线)距离当前K线的周期数大于10,买开
2、AA:=HHV(H,BARSBP+1); // 上一次买平仓(包含平仓信号出现的当根k线)到当前的最高价的最大值
当根K线出现BP信号,AA返回为空值,如果需要返回当根K线上最高价,模型需要修改为:
AA:=IFELSE(BARSBP>=1,HHV(H,BARSBP+1),H);
(1)当根K线出现BP信号,BARSBP返回为空值,不满足BARSBP>=1的条件,则取值为当根K线的最高价H。
(2)发出BP信号之后K线BARSBP返回买平仓的K线距离当前K线的周期数,满足BARSBP>=1的条件,则取值为HHV(H,BARSBP+1),即买平仓(包含平仓信号出现的当根k线)到当前的最高价的最大值。
3、AA:=IFELSE(BARSBP>=1,REF(C,BARSBP),C);//取最近一次买平仓K线的收盘价:
(1)发出BP信号的当根k线BARSBP返回空值,则当根K线不满足BARSBP>=1的条件,AA返回当根k线的收盘价。
(2)发出BP信号之后的k线BARSBP返回买平仓的K线距离当前K线的周期数,则AA返回REF(C,BARSBP),即平仓k线的收盘价。
(3)例:1、2、3三根k线,1中的K线为平仓信号的当根k线,则返回当根k线的收盘价,2、3中的K线AA返回值为1中的K线的收盘价。
返回从当根K线开始倒数第N个固定的Sig信号的信号手数(反手指令取开仓手数)。
用法:
注:
1、Sig位置支持的信号有:```BK```,```SK```,```BP```,```SP```,```BPK```,```SPK```,```CLOSEOUT```,```STOP```。
2、如果倒数第N个固定的Sig信号在当根K线上,那么该函数返回当前信号手数。
4、N为0或空值时,该函数返回0。
5、参数N支持变量。
例:
// 如果从当根K线开始倒数第3个固定的BK信号所在的距离当前K线有5根K线,并且信号手数大于2,平掉所有持仓 REFSIG_PLACE(BK,3)=5&&REFSIG_VOL(BK,3)>2,SP(BKVOL);
- ## REFSIG_PRICE
返回从当根K线开始倒数第N个固定的Sig信号的信号价位。
用法:
```REFSIG_PRICE(Sig,N);```,判断从当根K线开始倒数第N个固定的Sig信号的信号价位。如果没有Sig信号,或者没有固定的Sig信号,则该函数返回空值。
注:
1、Sig位置支持的信号有:```BK```,```SK```,```BP```,```SP```,```BPK```,```SPK```,```CLOSEOUT```,```STOP```。
2、如果当根K线上有固定的Sig信号,那么该函数计算信号时,包括当根K线的信号。
3、N为0或空值时,该函数返回空值。
4、参数N支持变量。
例:
// 如果从当根K线开始倒数第3个固定的BK信号的开仓价位为3000,并且多头持仓大于0,卖平仓 REFSIG_PRICE(BK,3)=3000&&BKVOL>0,SP;
- ## COUNTSIG
统计N周期内,X信号的数量。
用法:
```COUNTSIG(X,N);```统计N周期内,X信号的数量。
X可以为```BK```,```SK```,```SP```,```BP```,```SPK```,```BPK```,```CLOSEOUT```,```STOP```。
注:
1、统计周期时,
(1)包含当前k线。
(2)若N为0则从第一个有效值算起。
(3)当N为有效值,但当前的k线数不足N根,从第一根统计到当前周期。
(4)N为空值时返回值为空值。
(5)N可以为变量。
2、统计信号时:
(1)信号执行方式选择为K线走完确认信号或者K线走完复核(例如:在模型中写入CHECKSIG(SIG,'A',0,'D',0,0);),不包含当根K线上未固定的信号,即返回已经固定的信号个数。
(2)信号执行方式选择为不进行信号复核(例如:在模型中写入MULTSIG或MULTSIG_MIN;),包含当根K线上信号发出并且固定后的信号。
3、由BPK指令产生的BK信号按BPK信号处理,SPK指令产生的SK信号同理。
例:
N:=BARSLAST(DATE<>REF(DATE,1))+1; BKN:=COUNTSIG(BK,N); MA5:=MA(C,5); BKN=0&&C>MA5,BK; // 当日内日未出现过BK信号并且最新价大于5周期均线,则买开仓
- ## ENTRYSIG_PLACE
取指定开仓信号的K线位置。
用法:
```ENTRYSIG_PLACE(N);```,取一次完整交易中第N个开仓信号所在K线的位置。如果没有开仓信号,则该函数返回空值。
注:
1、开仓信号有:```BK```,```SK```,```BPK```,```SPK```。
2、从开仓到持仓为0被视为一次完整交易。
3、一次完整交易中开仓信号个数小于N时,该函数返回空值。
4、K线位置是指当前K线到指定开仓信号所在K线的根数。
5、N为0或空值时,该函数返回空值。
6、参数N不支持为变量。
例:
ENTRYSIG_PLACE(3)=5&&BKVOL>0,SP; // 如果第3个开仓信号所在K线距离当前K线有5根K线,并且多头持仓大于0,卖平仓
- ## ENTRYSIG_PRICE
取指定开仓信号的价格。
用法:
```ENTRYSIG_PRICE(N);```,取一次完整交易中第N个开仓信号的价格。如果没有开仓信号,则该函数返回空值。
注:
1、开仓信号有:```BK```,```SK```,```BPK```,```SPK```。
2、从开仓到持仓为0被视为一次完整交易。
3、一次完整交易中开仓信号个数小于N时,该函数返回空值。
4、N为0或空值时,该函数返回空值。
5、参数N不支持为变量。
6、该函数的计算包含滑点。
7、收盘价模型:在指定信号的当根K线函数的取值不会发生变化。
指令价模型:在指定信号的当根K线返回当次交易第N个开仓信号的价格。
例:
ENTRYSIG_PRICE(3)=3000&&BKVOL>0,SP; // 如果第3个固定的开仓信号的开仓价位为3000,并且多头持仓大于0,卖平仓
- ## ENTRYSIG_VOL
取指定开仓信号的信号手数。
用法:
```ENTRYSIG_VOL(N);```,取一次完整交易中第N个开仓信号的信号手数。如果没有开仓信号,则该函数返回空值。
注:
1、开仓信号有:```BK```,```SK```,```BPK```,```SPK```。
2、从开仓到持仓为0被视为一次完整交易。
3、一次完整交易中开仓信号个数小于N时,该函数返回空值。
4、N为0或空值时,该函数返回空值。
5、参数N不支持为变量。
6、收盘价模型:在指定信号的当根K线函数的取值不会发生变化。
指令价模型:在指定信号的当根K线返回当次交易第N个开仓信号的信号手数。
例:
ENTRYSIG_PRICE(3)=3000&&ENTRYSIG_VOL(3)>2,SP; // 如果第3个固定的开仓信号的开仓价位为3000,并且第3个固定的开仓信号的信号手数大于2,卖平仓
- ## EXITSIG_PLACE
取指定平仓信号的K线位置。
用法:
```EXITSIG_PLACE(N);```,取一次完整交易中第N个平仓信号所在K线的位置。如果没有平仓信号,则该函数返回空值。
注:
1、平仓信号有:```BP```,```SP```,```CLOSEOUT```,```STOP```。
2、从开仓到持仓为0被视为一次完整交易。
3、平仓信号个数小于N时,该函数返回空值。
4、K线位置是指当前K线到指定平仓信号所在K线的根数。
5、N为0或空值时,该函数返回空值。
6、参数N不支持为变量。
例:
EXITSIG_PLACE(3)=5&&BKVOL<=0,BK; // 如果第3个平仓信号所在K线距离当前K线有5根K线,并且没有多头持仓,买开仓
- ## EXITSIG_PRICE
取指定平仓信号的价格。
用法:
```EXITSIG_PRICE(N);```,取一次完整交易中第N个平仓信号的价格。如果没有平仓信号,则该函数返回空值。
注:
1、平仓信号有:```BP```,```SP```,```CLOSEOUT```,```STOP```。
2、从开仓到持仓为0被视为一次完整交易。
3、一次完整交易中平仓信号个数小于N时,该函数返回空值。
4、N为0或空值时,该函数返回0。
5、参数N不支持为变量。
6、该函数的计算包含滑点
7、收盘价模型:在指定信号的当根K线函数的取值不会发生变化。
指令价模型:在指定信号的当根K线返回当次交易第N个平仓信号的价格。
例:
EXITSIG_PRICE(3)=3000&&BKVOL>0,SP; // 如果第3个固定的平仓信号的平仓价位为3000,并且多头持仓大于0,卖平仓
- ## EXITSIG_VOL
取指定平仓信号的信号手数。
用法:
```EXITSIG_VOL(N)```取一次完整交易中第N个平仓信号的信号手数。如果没有平仓信号,则该函数返回空值。
注:
1、平仓信号有:```BP```,```SP```,```CLOSEOUT```,```STOP```。
2、从开仓到持仓为0被视为一次完整交易。
3、一次完整交易中平仓信号个数小于N时,该函数返回空值。
4、N为0或空值时,该函数返回0。
5、参数N不支持为变量。
6、收盘价模型:在指定信号的当根K线函数的取值不会发生变化。
指令价模型:在指定信号的当根K线返回当次交易第N个平仓信号的信号手数。
例:
EXITSIG_PRICE(3)=3000&&EXITSIG_VOL(3)>2,BK; // 如果第3个固定的平仓信号的平仓价位为3000,并且第3个固定的平仓信号的信号手数大于2,买开仓 “`
取下单手数。
MYVOL取下单手数。
用法:取下单手数,多用于在加减仓模型加载多个合约的时候的手数计算。
注:
回测:返回回测参数中设置的手数。
例:
// 加载参数中下单手数设置为3时,下面编写BK的下单手数为6
C>O,BK(2*MYVOL);
C<O,SP(BKVOL);
账户可用资金。
MONEY账户可用资金。
用法:MONEY返回账户可用资金,用于仓位、手数等计算。
计算方法:
1、账户中MONEY的初始值为保证金参数中设置的起始资金。
2、历史回测中MONEY的初始值为回测参数中设置的初始资金。
3、开仓信号当根k线的MONEY值:开仓前可用资金-持仓保证金-手续费,其中持仓保证金=开仓价格*保证金比例*交易单位*手数。
4、开仓后未平仓的k线的MONEY值=开仓信号前k线的MONEY值+浮动盈亏PROFIT。
5、平仓信号当根k线的MONEY值:平仓前可用资金+平仓盈亏+平仓释放的保证金-手续费,其中平仓释放的保证金=开仓价格*保证金比例*交易单位*手数。
注:
1、信号执行方式为,‘K线走完确认下单’或‘XX下单,K线走完复核’:
a.开仓信号当根K线,MONEY返回值为上根K线的可用资金-开仓保证金-手续费。
b.平仓信号当根K线,MONEY返回值为上根K线的可用资金+平仓盈亏+持仓释放的保证金-手续费。
2、信号执行方式选择,‘出信号下单,不进行复核’:
a.开仓信号当根K线,MONEY返回值为当根k线开仓之前的可用资金-开仓保证金-手续费。
b.平仓信号当根K线,MONEY返回值为当根K线平仓之前的可用资金+平仓盈亏+平仓释放的保证金-手续费。
3、信号执行方式为‘K线走完确认信号下单’时,平仓盈亏=(平仓信号当根K线的收盘价-开仓价格)*手数*交易单位-手续费。
4、信号执行方式为‘出信号立即下单,不复核’时,平仓盈亏=(平仓信号的指令价-开仓价格)*手数*交易单位-手续费。
5、账户初始化后,MONEY返回值为初始化框中可用资金。
例:
K:=MONEY*0.2/(C*MARGIN*UNIT+FEE); // 账户可用资金的20%可以开仓的手数(此写法适用于按固定手数收取手续费的合约),FEE自定义,或者计算
账户权益。
MONEYTOT账户权益。
用法:MONEYTOT返回当前账户权益,模型进行仓位控制、下单手数等资金管理时使用。
计算方法:MONEYTOT=账户可用资金+持仓保证金。
注:
1、账户中MONEYTOT的初始值为保证金参数中设置的起始资金。
2、历史回测中MONEYTOT的初始值为回测参数中设置的初始资金。
3、账户初始化时:
a.当前信号为开仓信号,MONEYTOT返回值为初始化框中账户可用资金。
b.当前信号为平仓信号,则MONEYTOT返回初始化框中账户可用资金+持仓保证金。
4、开仓信号当根k线:MONEYTOT=账户可用资金+持仓保证金。
5、开仓后平仓前:MONEYTOT返回当前账户可用资金+持仓保证金。
6、平仓信号当根k线:持仓为0时,MONEYTOT=可用资金;持仓不为0时,MONEYTOT=可用资金+持仓占用的保证金。
注:
持仓列表可用资金为包含了浮动盈亏的可用资金(= 当前权益 - 持仓占用的保证金)。
例:
K:=MONEYTOT*0.2/(C*MARGIN*UNIT+FEE); // 账户权益的20%可以开仓的手数(此写法适用于按固定手数收取手续费的合约),FEE自定义,或者计算。
返回交易账户中的可用资金,等价于MONEY。
用法:
- ## ACCOUNTMONEYTOT
返回交易账户中的权益,等价于```MONEYTOT```。
用法:
```ACCOUNTMONEYTOT```返回交易账户中的权益。
- ## COINS
数字货币现货账户可用币数。
1、用于数字货币现货,获取当前可用币数。
- ## MARGIN
杠杆率。
> 数字货币现货
a := MARGIN; // 固定为值1
> 数字货币期货
数字货币期货设置杠杆。

a := MARGIN; // 声明变量a,给a赋值当前合约杠杆率 “`
取得TICK的卖一价。
取得TICK的卖二价。
取得TICK的卖三价。
取得TICK的卖四价。
取得TICK的卖五价。
取得TICK的卖一量。
取得TICK的卖二量。
取得TICK的卖三量。
取得TICK的卖四量。
取得TICK的卖五量。
取得TICK的买一价。
取得TICK的买二价。
取得TICK的买三价。
取得TICK的买四价。
取得TICK的买五价。
取得TICK的买一量。
取得TICK的买二量。
取得TICK的买三量。
取得TICK的买四量。
取得TICK的买五量。
取得TICK的最新价。
抛出一个错误文本,程序退出。
EXIT('msg'); // 需要传入参数,字符串参数需要使用''包裹,抛出一个错误,错误文本为字符串msg
日志输出
INFO(cond, param, ...);
1、cond 为条件变量,为真输出日志。
2、条件变量后可跟多个可变参数。
例子:
INFO(1, C, '<-收盘价');
使用CONTRACT获取当前设置的合约映射的交易所合约代码。
INFO(1, CONTRACT);

使用DATA指令加载数据。
(*backtest
start: 2020-01-21 00:00:00
end: 2020-02-12 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*)
A:DATA('https://www.fmz.com/upload/asset/32bf73a69fc12d36e76.json');
INFO(1, CONTRACT, A);
C>HV(H, 10),SPK;
C<LV(L, 15),BPK;
AUTOFILTER;
使用['属性名称']取数据中的某个属性值,https://www.fmz.com/upload/asset/1ef31d778467ed9dd00.json为外部数据链接,可以是其它服务程序提供数据的链接,也可以是发明者量化交易平台数据中心提供的数据,例如例子中注释的部分(*消费指数:DATA('CPI')['城市'];*),使用代码CPI获取数据(数据暂时未全部开放)。
(*backtest
start: 2018-01-21 00:00:00
end: 2020-02-12 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*)
消费指数:DATA('https://www.fmz.com/upload/asset/1ef31d778467ed9dd00.json')['城市'];
(*消费指数:DATA('CPI')['城市'];*)
消费指数>HV(消费指数, 90),BPK;
消费指数<LV(消费指数, 90),SPK;
AUTOFILTER;


在BITMEX期货交易所,价格最小点数为0.5。 在OKEX期货交易所,价格最小点数为0.01。
有些合约价格比较低的时候,需要注意定价货币精度,交易品种精度这些参数的设置,是否合适。
变量最长周期数
影响图表K线BAR数量,与javascript策略中调用SetMaxBarLen函数作用相同。
麦语言策略,状态栏表格上显示的持仓数量。
均为实际持仓数量。

IF H > C THEN
BEGIN
X:=10;
END
范例:
VARIABLE:N:0;
IF N <> BARPOS AND ISLASTBAR = 1 THEN
BEGIN
N:=BARPOS;
INFO(1, '123');
END