DiscoverExploreAI Skills
⌘ K

Bar1

影舞叶

3 followers, 1 following

No description

#Bar

数学函数 ABS 绝对值。

mylang

ABS(X),取的X的绝对值。

注: 1、正数的绝对值是它本身。 2、负数的绝对值是它的相反数。 3、0的绝对值还是0。

例1: ABS(-10); // 返回10 例2: ABS(CLOSE-10); // 返回收盘价和的10价差的绝对值 例3: ABS(C-O); // 当前K线实体长度 ACOS 反余弦值。

mylang

ACOS(X),返回X的反余弦值。

注: 1、X取值范围[-1,1]。 2、若X不在取值范围,返回值为空值。

例1: ACOS(-1); // 求-1的反余弦值 例2: ACOS(1); // 求1的反余弦值 ASIN 反正弦值。

mylang

ASIN(X),返回X的反正弦值。

注: 1、X取值范围[-1,1]。 2、若X不在取值范围,返回值为空值。

例1: ASIN(-1); // 求-1的反正弦值 例2: ASIN(1); // 求1的反正弦值 ATAN 反正切值。

mylang

ATAN(X),返回X的反正切值。

注:X的取值为R(实数集)。

例1: ATAN(-1.75); // 求-1.75的反正切值 例2: ATAN(1.75); // 求1.75的反正切值 CEILING 向上舍入。

mylang

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 余弦。

mylang

COS(X),返回X的余弦值。

注: 1、X的取值为R(实数集)。 2、值域为[-1,1]。

例1: COS(-1.57); // 返回-1.57的余弦值 例2: COS(1.57); // 返回1.57的余弦值 CUBE 立方函数。

mylang

CUBE(X),返回X的三次方。

例1: CUBE(4); // 求4的立方 EXP 指数。

mylang

EXP(X),求e的X次幂。

例1: C*EXP(0.01); // 求收盘价乘以e的0.01次幂 FLOOR 向下舍入。

mylang

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 取整。

mylang

INTPART(X),取X的整数部分。

例1: INTPART(12.3); // 返回值为12 例2: INTPART(-3.5); // 返回值为-3 例3: INTPART(10); // 返回值为10 例4: INTPART(C); // 求收盘价的整数部分 LN 自然对数。

mylang

LN(X),求X的自然对数。 注: 1、X取值范围为非0自然数,即1、2、3、4、5 ... 2、若X取值为0或负数,返回值为空值。

例: LN(OPEN); // 求开盘价的对数 LOG 常用对数。

mylang

LOG(X),求X的常用对数值。

注: 1、该函数中X的取值范围为X>0。 2、0和负数没有对数,X为0或负数时返回值为空值。

例1: LOG(100); // 返回2 例2: LOG(0); // 返回空值 MAX 最大值。

mylang

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 取最大值。

mylang

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 求中位数。

mylang

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 求中位数。

mylang

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 最小值。

mylang

MIN(A,B),取最小值。取A,B中较小者。

注: 若A=B,返回值为A或者B的值。

例1: MIN(OPEN,CLOSE); // 表示取开盘价和收盘价中的较小者 例2: MIN(C,MIN(O,REF(C,1))); // 求当前周期的开盘价,收盘价,以及上周期的收盘价间最小的数值 MIN1 取最小值。

mylang

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 取模。

mylang

MOD(A,B),取模。返回A对B求模。

例1: MOD(26,10); // 返回6,26除以10所得余数为6,即26对10的模为6 例2: MOD(A,2)=0; // 判断A为偶数 MODE 求众数。

mylang

MODE(X,N),求X在N个周期内最常出现的值。

注: 1、如果N个周期内不含有重复的数值,则函数返回空值。 2、N可以为变量。 POW 幂。

mylang

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 产生随机数的随机函数。

mylang

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 范围。

mylang

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 取相反值。

mylang

REVERSE(X),取相反值。返回-X。

例1: REVERSE(LOW); // 返回-LOW 例2: REVERSE(-55); // 返回值为55 例3: REVERSE(0); // 返回值为0 ROUND 指定位数四舍五入。

mylang

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 取符号。

mylang

SGN(X),取符号。若X>0返回1,若X<0返回-1,否则返回0。

例1: SGN(5); // 返回值为1 例2: SGN(-5); // 返回值为-1 例3: SGN(0); // 返回值为0 SIN

发明者量化My语言(Mylang)文档 My语言是对麦语言的兼容并增强的一种程序化交易语言。FMZ量化的My语言会进行严格的语法检查,例如在使用语言增强嵌入JavaScript语言代码时,在%%操作符之后多跟一个空格字符都会引起报错。

基础说明 合约 数字货币合约

数字货币合约

mylang

this_week 数字货币期货当周合约 next_week 数字货币期货次周合约 month 数字货币期货月度合约 quarter 数字货币期货季度合约 next_quarter 数字货币期货次季度合约 third_quarter 数字货币期货第三季度合约 last_quarter 最后季度合约

XBTUSD BITMEX永续合约 swap 除BITMEX交易所以外数字货币期货永续合约

具体可以参看JavaScript/Python/C++文档的exchange.SetContractType()函数部分 img

变量 变量是电脑内存中开辟的一块用来存数据的空间,简单说就是用来保存数据的。

开辟第一个变量

mylang

// 将1赋值给变量a a:=1; 在麦语言中,从数据量上简单区分:

单值数据:只有一个值,例如0、1、’abc’。 序列数据:一堆单值数据组成的数据序列,例如Close(收盘价),这里的Close包含了n个周期的收盘价[ 10.1 , 10.2 , 10.3 , 10.4 , 10. 5 ...] 从“变量类型”进行区分

字符串类型:必须使用''包裹,字符串类型不允许直接使用,需要配合函数输出到视图中。 mylang

INFO(CLSOE>OPEN,'OK!'); 数值类型:包括整数、浮点数(小数)。 mylang

// 整数 int:=2;

// 小数 float:=3.1; 布尔类型,使用1(代表真)或者0(代表假):1、0,真或者假。例如:A:=1>0;这句代码执行后,A的值就是1。 mylang

// 当前周期收盘价大于-999,你会发现,每个周期的返回值都是1,代表true,因为收盘价几乎不可能为负数 is_true:=Close>-999; 全局变量 javascript

VARIABLE:VALUE1:10; // 声明一个全局变量,赋值为10,只执行一次。 回测时需注意:

mylang

VARIABLE:NX:0; // 初始一个全局变量NX为0 NX..NX+1; // 每次累加1 INFO(1,NX); // 每次打印NX 最初INFO语句打印的是101,可能有疑问初始不是0么 ? 原因是回测时初始的K线有100根,已经跑过了100根K线,累加了100次。 实盘根据初始获取多少K线而定。

命名规则 在多数的系统中,变量命名不允许使用系统“保留字”(内置变量名、函数名)。例如众所周知的Close、C。此外,不允许纯数字或者数字开头。最后不允许很长,不同的系统长度限制不同。 其实你大可不必纠结主流系统对于中文的解析的效率,相信“麦语言”它对中文是非常友好的。撸码无数的老司机,推荐你使用如下两种命名规范:

中文命名 mylang

// 优雅的输出 五日均线:=MA(C,5); 英文+下划线 mylang

// 输出 move_avg_5:=MA(C,5); 如果你偏爱英文,请尽可能让人可以理解你变量的含义。不要使用诸如:A1,AAA,BBB...这类的命名方式。相信我过些时日你再次复查你的指标代码时,由于记忆的缺失你会非常痛苦。同样的当你把代码导出给他人的时候,阅读者的心态一定是崩溃的。

那么从现在开始,尽情地拥抱“麦语言”吧!但愿它能成为你节分析、决策的强大工具。

数据类型 数据类型是一个基础的概念,在编写中当我们将一个明确的数据赋值给变量时,这个变量也就变成了数据自身的类型。

数值类型:

1、2、3、1.1234、2.23456 ... 字符串类型(str): javascript

'1' 、'2' 、'3' ,字符串类型必须用 '' 包裹 序列数据:

一系列单值数据构成的数据集合 布尔类型(boolean): 用1代表true,0代表false。

示例

mylang

var_int := 1;
// 声明一个序列数据的变量
var_arr := Close;
// 字符串类型不能单独声明,需要结合函数
INFO(C>O, '阳线');
运算符
用于执行指标代码的运算、计算,简单而言就是参与运算的符号。

赋值运算符
用于给某个变量赋值

:
:,代表赋值并且输出到图(副图)中。

javascript

Close1:Close;      // 将Close赋值给变量Close1,并且输出到图中
:=
:=,代表赋值,但不输出到图(主图、副图...)中,也不显示在状态栏表格中。

mylang

Close2:=Close;     // 将Close赋值给变量Close2
^^
^^,两个^符号代表赋值,给变量赋值并且输出到图(主图)中。

mylang

lastPrice^^C; .. ..,两个.符号代表赋值,给变量赋值并且显示变量名、数值在图表中,但是不画图到图表(主图、副图...)中。

mylang

openPrice..O 关系运算符 关系运算符是双目运算符,用在条件表达式中。用于判断两个数据之间的关系。

返回值:布尔类型,不是true(1)、就是false(0)。

大于> mylang

// 将2>1的运算结果赋值给rv1变量,此时rv1=1 rv1:=2>1; 小于< mylang

// 返回false,也就是0,因为2大于1 rv3:=2<1; 大于等于>= mylang

x:=Close; // 将收盘价大于等于10的运算的结果赋值给变量rv2 // 注意,由于close是一个序列数据,当进行close>=10运算的时候,本质是每个周期都进行运算,所以每个周期都会有一个1、0的返回值 rv2:=Close>=10; 小于等于<=

此处省略 等于= mylang

A:=O=C; // 判断开盘价是不是等于收盘价。 不等于<> javascript

1<>2 // 判断1是否不等于2,返回值为1(true) 逻辑运算符 返回值:布尔类型,不是true(1)、就是false(0)。

逻辑与&&,可以使用and替代,与连接的左右两边必须同时成立。 mylang

// 判断 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,成立 逻辑或||,可以使用or替代或链接左右两边,一边成立(true),整体则成立(返回值 true)。 mylang

cond_a:=1>2; cond_b:=4>3; cond_c:=5>6; cond_a || cond_b or cond_c; // 返回值为1,成立 ()运算符,计算时会先计算括号内的表达式。 javascript

1>2 AND (2>3 OR 3<5) // 运算结果为假 1>2 AND 2>3 OR 3<5 // 运算结果为真 算数运算符

返回值:数值类型 算术运算符即算术运算符号。是完成基本的算术运算(arithmetic operators)符号,就是用来处理四则运算的符号。

加 +

mylang

A:=1+1; // 返回 2 减 -

mylang

A:=2-1; // 返回 1 乘 *

mylang

A:=2*2; // 返回 4 除 /

mylang

A:=4/2; // 返回 2 函数 函数 在编程的世界里,“函数”其实就是一段实现了某种功能的代码。并且可以供其它代码调用,一般形式如下:

javascript

function(param1,param2,...) 构成:

函数名(参数1,参数2,...),可能没有参数或者有多个参数。例如MA(x,n);代表返回n周期的内x的简单移动平均值。其中MA()就是一个函数。x和n就是函数的参数。

使用函数的时候我们需要了解函数基本定义,也就是调用该函数可以获得什么数据。通常而言函数都带有参数,当我们传入参数的时候需要确保传入的数据类型是符合的。现阶段多数的IDE 的代码提示功能非常的不完善。有给出参数的数据类型,给我们的使用带来的一定的困扰,对MA(x,n);解释为:

mylang

返回简单移动平均 用法: AVG:=MA(X,N): X的N日简单移动平均,算法(X1+X2+X3+...+Xn)/N,N支持变量 这对于初学者来说非常的不友好。接下来我们对函数进行彻底的剖析,试图寻找一个快速学习、使用函数的方法。

返回值 为了快速学习函数,首先我们需要理解一个概念。叫做「返回值」。“返回”顾名思义,就是「还回来」。值则代表「具体的数值」,那么返回值的意思即:可以拿到的数据。

mylang

// 因为后面的代码中会用到,所以用变量 return_value 接收、保存 function()的返回值 // retrun_value := function(param1,param2); // 例如: AVG:=MA(C,10); // AVG即retrun_value,function函数即:MA函数,param1参数:C即收盘价序列数据,param2参数:10。 参数 其次函数的第二个概念重要概念就是参数,传入不同的参数可以得到不同的返回值。

mylang

// 变量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语言混合编程

mylang

%% // 这里面可以调用发明者量化的任何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,返回所有的收盘价数据。

javascript

%% 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是阳线。

javascript

%% scope.TEST = function(){ var bars = scope.bars return bars[bars.length - 1].Open > bars[bars.length - 1].Close ? 1 : 0 // 只能返回数值 } %% arr:TEST;
python

注意:

TEST接收的匿名函数,返回值必须是数值。

如果匿名函数没有参数,在调用TEST的时候直接写VAR:=TEST;写VAR:=TEST();会报错。

scope.TEST中的TEST必须是大写。

scope.bar

在JavaScript代码块中,访问当前bar。

计算高开低收价格的平均数。

javascript

%% scope.TEST = function(){ var bar = scope.bar var ret = (bar.Open + bar.Close + bar.High + bar.Low) / 4 return ret } %% avg^^TEST; scope.depth

访问市场深度数据(订单薄)。

javascript

%% scope.TEST = function(){ Log(scope.depth) throw "stop" // 打印一次深度数据后就抛出异常,暂停 } %% TEST; scope.symbol

获取当前交易对名称字符串。

javascript

%% scope.TEST = function(){ Log(scope.symbol) throw "stop" } %% TEST; scope.barPos

获取K线Bar位置。

javascript

%% scope.TEST = function(){ Log(scope.barPos) throw "stop" } %% TEST; scope.get_locals('name')

该函数用于获取麦语言代码部分中的变量。

javascript

V:10; %% scope.TEST = function(obj){ return scope.get_locals('V') } %% GET_V:TEST(C); python

注意:

如果某个变量,由于周期不足的时候计算不出数据,这个时候在JavaScript代码中调用scope.get_locals函数

获取这个变量时,会报错:line:XX - undefined locals某个变量名undefined

scope.canTrade

canTrade属性标记当前是否可以交易(当前的Bar是不是最后一根)

例如判断当策略处于可以交易下单的状态下打印行情数据

pine

%% scope.LOGTICKER = function() { if(exchange.IO("status") && scope.canTrade){ var ticker = exchange.GetTicker(); if(ticker){ Log("ticker:", ticker); return ticker.Last; } } } %% LASTPRICE..LOGTICKER; 应用例子:

mylang

%% scope.TEST = function(a){ if (a.val) { throw "stop" }
} %% O>C,BK; C>O,SP; TEST(ISLASTSP); 开仓、平仓一次后停止策略。

多周期引用 系统会自动选择一个合适的底层K线周期,用这个底层K线周期数据来合成所有引用的K线数据,确保数据的精准性。

使用:#EXPORT 公式名 ... #END创建一个公式。如果仅仅为了获取不同周期的数据不做公式计算,也可以写空公式。

空公式即:

python

#EXPORT TEST NOP; #END // 结束 使用: #IMPORT [MIN,周期,公式名] AS 变量值引用公式。获取设置的周期的各项数据(收盘价、开盘价等等,通过变量值获取)。

IMPORT命令中的MIN意思为分钟级别。发明者量化平台的麦语言,IMPORT命令中仅支持MIN级别。现在已经支持非标准周期,例如可以使用#IMPORT [MIN,240,TEST] AS VAR240导入240分钟周期(4小时)K线等数据。

代码范例:

mylang

// 本代码演示如何引用不同周期的公式在同一代码里 // #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等指令引用数据需要注意

mylang

(*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)等带手数的指令。

例如:

mylang

MA1:MA(CLOSE,5); MA2:MA(CLOSE,10); CROSSUP(C,MA1),BK; CROSSUP(MA1,MA2),BK; C>BKPRICE+10||C<BKPRICE-5,SP; AUTOFILTER; mylang

理解: 如上范例,没有设置 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)多个指令条件同时满足时,按条件语句编写的先后顺序执行信号。 例如:

mylang

MA1:MA(CLOSE,5); MA2:MA(CLOSE,10); CROSSUP(C,MA1),BK(1); CROSSUP(MA1,MA2),BK(1); C>BKPRICE+10||C<BKPRICE-5,SP(BKVOL); 使用TRADE_AGAIN 可以让同一个指令行,连续出多个信号。

理解: 以上例子,逐个信号执行,执行后的信号不再触发。平仓后重置模型状态。一个K线触发一次信号。 一根K线一个信号的模型 不管k线是否走完,计算出信号就进行实时下单,即K线未走完前下单;K线结束时复核,如果持仓方向与k线结束时的信号方向不符会自动同步持仓。

例如:

mylang

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线中如果满足多个信号条件可以反复多次执行。

mylang

例如: MA1:MA(CLOSE,5); MA2:MA(CLOSE,10); CROSSUP(MA1,MA2),BK; C>BKPRICE+10||C<BKPRICE-5,SP; AUTOFILTER; MULTSIG(0,0,2,0); MULTSIG可以使一根K线内多次执行不同指令行。 一个指令行只出一次信号。

mylang

O<C,BK; // 这些条件在一个K线Bar内,可能都执行,但是每行只出一次信号 10+O<C,BK; // 策略加上

Comments

No comments yet