资源加载中... loading...

发明者量化My语言(Mylang)文档

Author: 发明者量化-小小梦, Created: 2018-11-30 13:29:33, Updated: 2022-12-09 17:46:10

[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()函数部分
    

    发明者量化My语言(Mylang)文档

    • ## 变量

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

    开辟第一个变量

    // 将1赋值给变量a
    a:=1;
    

    麦语言中,从数据量上简单区分:

    1. 单值数据:只有一个值,例如01’abc’
    2. 序列数据:一堆单值数据组成的数据序列,例如Close(收盘价),这里的Close包含了n个周期的收盘价[ 10.1 , 10.2 , 10.3 , 10.4 , 10. 5 ...]

    从“变量类型”进行区分

    1. 字符串类型:必须使用''包裹,字符串类型不允许直接使用,需要配合函数输出到视图中。
    INFO(CLSOE>OPEN,'OK!');
    
    1. 数值类型:包括整数、浮点数(小数)。
    // 整数
    int:=2;
    
    
    // 小数
    float:=3.1;
    
    1. 布尔类型,使用1(代表真)或者0(代表假):1、0,真或者假。例如:A:=1>0;这句代码执行后,A的值就是1。
    // 当前周期收盘价大于-999,你会发现,每个周期的返回值都是1,代表true,因为收盘价几乎不可能为负数
    is_true:=Close>-999;
    
    1. 全局变量
    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线而定。

    • ### 命名规则

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

     1. 中文命名
    
      // 优雅的输出
      五日均线:=MA(C,5);
    
     2. 英文+下划线
    
      // 输出
      move_avg_5:=MA(C,5);
    

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

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

    • ## 数据类型

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

    • 1. 数值类型:
      1、2、3、1.1234、2.23456 ...
    
    • 2. 字符串类型(str):
      '1' 、'2' 、'3' ,字符串类型必须用 '' 包裹
    
    • 3. 序列数据:
      一系列单值数据构成的数据集合
    
    • 4. 布尔类型(boolean):

    1代表true0代表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);
    

    上述的变量ma5ma10的第一个参数X都是C(收盘价),实际上C也算一个函数(返回开盘至今的收盘价序列),只不过他没有参数。第二个参数5、10这是用来告诉MA()函数,我们要获取收盘价几日的移动平均线,通过参数,函数使用起来变得更加灵活。

    • 如何学习

      • 1. 首先,需要了解函数的作用,也就是这个函数可以给我们返回什么数据。
      • 2. 最后就是了解返回值的类型,毕竟我们使用函数就是为了获得返回值的。
      • 3. 其次我们需要了解参数的数据类型MA(x,n),如果不知道参数xn的数据类型也就无法正确的获得返回值。

    在后面的函数介绍、使用,遵循上述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线上多次加仓,或者多次减仓的。
    
    - ## 执行模式
    
    
    ![发明者量化My语言(Mylang)文档](/upload/asset/163640023a2b2802833a.png)
    
     - ### 收盘价模型
    
    
      收盘价模型指当前BAR走完才执行模型,在下根BAR开始的时候执行交易。
    
     - ### 实时价模型
    
    
      实时价模型指的是每次价格变动都执行一次模型,有信号就立即交易。
      实时价模型忽略前一天的信号(前一天的信号在前一天立即执行),实时价模型只看当前行情数据,判断是否触发信号。
    
    - ## 图表显示
    
     - ### 主图附加指标
    
    
      > 使用操作符```^^```,在给变量赋值的同时,设置指标显示在主图上。
    
    
    

    MA60^^MA(C, 60); // 计算参数为60的均线指标

    
    
      ![发明者量化My语言(Mylang)文档](/upload/asset/168d6ee1bbb8c7c9be63.png)
    
     - ### 副图附加指标
    
    
      使用操作符```:```,在给变量赋值的同时,设置指标显示在副图上。
    
    
    

    ATR:MA(MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW)),26); // 给ATR变量赋值,”:“符号后为计算ATR的公式

    
    
      ![发明者量化My语言(Mylang)文档](/upload/asset/7b032733df1539ff923b539b1dea72d0.png)
    
    
      如果不希望在主图或者副图上显示,使用 ".." 操作符。
    
    
    

    MA60..MA(C, 60); // 计算参数为60的均线指标

    
    
      ![发明者量化My语言(Mylang)文档](/upload/asset/1773e857c54620c6d1cf.png)
    
    
      可以使用```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

    取得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简写)。
    
    • ## HIGH

    取得K线图的最高价。

    最高价

    函数:HIGH,简写H

    参数:无

    解释:返回「该周期」最高价

    序列数据

    HIGH取得K线图的最高价。
    
    
    注:
    1、可简写为H。
    
    
    例1:
    HH:=H;         // 定义HH为最高价
    例2:
    HH:=HHV(H,5);  // 取的5个周期内最高价的最大值
    例3:
    REF(H,1);      // 取的前一根K线的最高价
    
    • ## LOW

    取得K线图的最低价。

    最低价

    函数:LOW,简写L

    参数:无

    解释:返回「该周期」最低价

    序列数据

    LOW取得K线图的最低价。
    
    
    注:
    1、可简写为L。
    
    
    例1:
    LL:=L;            // 定义LL为最低价
    例2:
    LL:=LLV(L,5);     // 取得5个周期内最低价的最小值
    例3:
    REF(L,1);         // 取得前一根K线的最低价
    
    • ## CLOSE

    取得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线的收盘价
    
    • ## VOL

    取得K线图的成交量。

    成交量

    函数:VOL,简写V

    参数:无

    解释:返回「该周期」成交量

    序列数据

    VOL取得K线图的成交量。
    
    
    注:
    可简写为V。
    该函数在当根TICK上的返回值为当天所有TICK成交量的累计值。
    
    
    例1:
    VV:=V;       // 定义VV为成交量
    例2:
    REF(V,1);    // 表示前一个周期的成交量
    例3:
    V>=REF(V,1); // 成交量大于前一个周期的成交量,表示成交量增加(V为VOL的简写)
    
    • ## OPI

    取当前期货(合约)市场的总持仓量。

    OpenInterest:OPI;
    
    • ## REF

    向前引用。

    引用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 取加载数据合约的交易单位。
    

    数字货币现货

    UNIT值为1。

    数字货币期货

    UNIT值与合约币种相关。

    OKEX期货币本位合约:BTC合约1张代表100美元,其它币种的1张合约代表10美元
    
    • ## MINPRICE

    数据合约的最小变动价位。

    取数据合约的最小变动价位。
    用法:
    MINPRICE; 取加载数据合约的最小变动价位。
    
    • ## MINPRICE1

    交易合约的最小变动价位。

    取交易合约的最小变动价位。
    用法:
    MINPRICE1; 取交易合约的最小变动价位。
    
  • 时间函数

    • ## BARPOS

    取K线的位置。

    BARPOS,返回从第一根K线开始到当前的周期数。
    
    
    注:
    1、BARPOS返回本地已有的K线根数,从本机上存在的数据开始算起。
    2、本机已有的第一根K线上返回值为1。
    
    
    例1:LLV(L,BARPOS);        // 求本地已有数据的最小值。
    
    
    例2:IFELSE(BARPOS=1,H,0); // 当前K线是本机已有的第一根K线取最高值,否则取0。
    
    • ## DAYBARPOS

    DAYBARPOS当根K线BAR为当天的第几根K线BAR。

    • ## PERIOD

    周期值为分钟数。

    1, 3, 5, 15, 30, 60, 1440
    
    • ## DATE

    日期函数DATE,取得该周期从1900以来的的年月日。

    例1:
    AA..DATE;                  // 测试时AA的值为220218,表示2022年2月18日
    
    • ## TIME

    取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,取得年份。
    
    
    注:
    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,返回某个周期的月份。
    
    
    注:
    MONTH的取值范围为1—12.
    
    
    例1:
    VALUEWHEN(MONTH=3&&DAY=1,C);                // 在K线日期为三月一日时取其收盘价
    例2:
    C>=VALUEWHEN(MONTH<REF(MONTH,1),O),SP;
    
    • ## DAY

    取得某周期的日数

    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,返回某周期的小时数。
    
    
    注:
    HOUR的取值范围为0—23
    
    
    例1:
    HOUR=10;                                   // 在10:00的K线上返回值为1,其余K线上返回值为0
    
    • ## MINUTE

    分钟。

    MINUTE,返回某个周期的分钟数。
    
    
    注:
    1:MINUTE的取值范围为0—59
    2:该函数只能加载在分钟周期上,返回当根K线开始的分钟数。
    例1:
    MINUTE=0;                                 // 在整点时刻的分钟K线上返回值为1,其余K线返回值为0
    例2:
    TIME>1400&&MINUTE=50,SP;                   // 在14:50的时候卖平仓
    
    • ## WEEKDAY

    取得星期数。

    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

    返回当前周期的位置状态。

    BARSTATUS 返回当前周期的位置状态。
    
    
    注:
    该函数返回1表示当前周期是第一个周期,返回2表示是最后一个周期,返回0表示当前周期处于中间位置。
    
    
    例:
    A:=IFELSE(BARSTATUS=1,H,0);              // 如果当前K线是第一个周期,变量A返回K线最高值,否则取0
    
    • ## BETWEEN

    介于。

    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

    BARSLASTCOUNT(COND) 从当前周期向前计算,统计连续满足条件的周期数。

    注:
    1、返回值为从当前周期计算COND连续不为0的周期数
    2、条件第一次成立的当根k线上BARSLASTCOUNT(COND)的返回值为1
    
    
    例:
    BARSLASTCOUNT(CLOSE>OPEN);
    //计算当根K线在内连续为阳线的周期数
    
    • ## CROSS

    交叉函数。

    CROSS(A,B) 表示A从下方向上穿过B,成立返回1(Yes),否则返回0(No)
    
    
    注:
    1、满足穿越的条件必须上根k线满足A<=B,当根k线满足A>B才被认定为穿越。
    
    
    例1:
    CROSS(CLOSE,MA(CLOSE,5));              // 表示收盘线从下方向上穿过5周期均线
    
    • ## CROSSDOWN

    向下穿越

    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

    向上穿越。

    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

    判断是否持续满足。

    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

    判断是否存在满足。

    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

    条件函数。

    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

    条件函数。

    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

    当前是否为指定的合约。

    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

    阴线。

    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

    平盘。

    ISEQUAL判断该周期是否平盘。
    
    
    注:
    1、ISEQUAL等同于C=O
    
    
    例1:
    EVERY(ISEQUAL=1,2),CLOSEOUT;                // 持续2根k线都是平盘,则全平
    
    • ## ISLASTBAR

    判断该周期是否为最后一根K线。

    ISLASTBAR判断该周期是否为最后一根k线。
    
    
    例1:
    VALUEWHEN(ISLASTBAR=1,REF(H,1));            // 当前k线是最后一根k线,则取前一周期的最高价
    
    • ## ISNULL

    判断空值。

    ISNULL判断空值。
    
    
    用法:ISNULL(N);如果N为空值,函数返回1;如果N为非空值,函数返回0。
    
    
    例:MA5:=IFELSE(ISNULL(MA(C,5))=1,C,MA(C,5));   // 定义五周期均线,K线数量不足五根时,返回当根K线的收盘价
    
    • ## ISUP

    阳线。

    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

    判断函数。

    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

    维持交叉函数。

    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

    非。

    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)表达同等意义
    
    • ## NULL

    返回空值。

    返回空值
    用法:
    MA5:=MA(C,5);
    MA10:=MA(C,10);
    A:=IFELSE(MA5>MA10,MA5,NULL),COLORRED;  // 当MA5>MA10时,画五日均线MA5,不满足MA5>MA10时,返回空值,不画线
    
    • ## VALUEWHEN

    取值。

    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

    循环条件函数。

    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

    第一个有效周期到当前的周期数。

    BARSCOUNT(COND)第一个有效周期到当前的周期数。
    
    
    注:
    1、返回值为COND从第一个有效周期开始计算,到现在为止的周期数。
    2、条件第一次成立的当根k线上BARSCOUNT(COND)的返回值为0。
    
    
    例:
    BARSCOUNT(MA(C,4));                       // 计算MA(C,4)第一次有返回值到当前的周期数
    
    • ## BARSLAST

    上一次条件成立位置。

    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

    第一个条件成立到当前的周期数。

    BARSSINCE(COND)第一个条件成立到当前的周期数。
    
    
    注:
    1、返回值为COND第一次成立到当前的周期数。
    2、条件第一次成立的当根k线上BARSSINCE(COND)的返回值为0。
    
    
    例:
    BARSSINCE(CLOSE>OPEN);                    // 统计第一次满足阳线这个条件的K线到现在的周期数
    
    • ## BARSSINCEN

    统计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周期内第一次满足阳线到当前的周期数
    
    • ## CONDBARS

    取得最近满足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

    统计总数。

    ”` COUNT(COND,N),统计N周期中满足COND条件的周期数。

    注: 1、N包含当前k线。 2、若N为0则从第一个有效值算起。 3、当N为有效值,但当前的k线数不足N根,从第一根统计


更多内容

98K-系列高阶交易指标 k线上穿j1 收阳线站上j1后 回踩j1 开单 ,可回测时 却在阴线且没有站上j1的位置 也开单了 ,小梦老师 请教下 这是哪里错误了 D1:=if(jk<0 && CROSS(close,j1) and CLOSE>OPEN and close>j1,j1,0); D1,BK; /upload/asset/2af6fee82ea8bb3725687.png

98K-系列高阶交易指标 国内的爱交易平台 有麦语言的函数库 ,不知以后可否兼容下,像兼容tradingview上的函数一样,这样两边的指标策略,直接就可以平移到发明者上来量化了

98K-系列高阶交易指标 isLast(x) 函数说明:判断当前数据是否为最后一条数据。发明者上的这个函数功能有吗

wanghehe711@qq.com 麦语言可以实现一个实盘多品种运行吗

ltcrem 如果要挂MARK单需要嵌入JAVA或PYHON吗?能否给个例子?

麦语言支持okex合约吗?能接入okex合约的api吗

发明者量化-小小梦 好的,这边看下。

发明者量化-小小梦 暂时,没有支持这个isLast指令

发明者量化-小小梦 麦语言是单品种单平台策略,只能操作一个品种,一个账号。

发明者量化-小小梦 这样设计 比较复杂, 建议如果 是挂单策略,直接使用JS,PY 编写策略。

发明者量化-小小梦 支持,可以用于OKEX合约。