Loading ...

内置函数 _Cross 分析 及 使用说明

Author: 小小梦, Created: 2017-10-11 19:50:44, Updated: 2017-10-11 23:21:12

内置函数 _Cross 分析 及 使用说明

API 文档中 全局函数 栏中的 _Cross 函数 用来计算 两条指标线的 交叉状态

  • 函数实现 类似以下代码:

    需要注意的是, arr1 定义为 快线 指标数组,arr2 定义为慢线指标数组时, _Cross 函数 返回的值 为正数, 即 根据文档上 正数为上穿周期, 负数表示下穿的周期, 0指当前价格一样 可知, 此时 arr1 上穿 arr2 已经 n 个周期, 此时 就是 快线 上穿 慢线 代表 金叉。 同样 _Cross 函数 如果 返回 负数 ,即为死叉。

    如果 定义 arr1 为 慢线 指标数组 ,arr2 为快线 指标数组, 则相反。 _Cross 函数 返回的值 为正数 代表 死叉 _Cross 函数 返回的值 为负数 代表 金叉

// 返回上穿的周期数. 正数为上穿周数, 负数表示下穿的周数, 0指当前价格一样
$.Cross = function(arr1, arr2) {            // 参数个数为2个,从参数名可以看出,这两个 参数应该都是 数组类型,数组就
                                            // 好比是 在X轴为 数组索引值,Y轴为 指标值的 坐标系中的 线段, 该函数就是判断 两条线的 交叉情况 
    if (arr1.length !== arr2.length) {      // 首先要判断 比较的两个 数组 长度是否相等
        throw "array length not equal";     // 如果不相等 抛出错误,对于 不相等 的指标线  无法 判断相交
    }
    var n = 0;                              // 声明 变量 n  用来记录  交叉状态 ,初始  0 ,未相交 
    for (var i = arr1.length-1; i >= 0; i--) {      // 遍历 数组 arr1, 遍历顺序 为 从最后一个元素 向前 遍历
        if (typeof(arr1[i]) !== 'number' || typeof(arr2[i]) !== 'number') { // 当 arr1 或者 arr2 任何一个数组 为 非数值类型 (即 无效指标) 时,跳出 遍历循环。
            break;                                  // 跳出循环
        }
        if (arr1[i] < arr2[i]) {                    // 如果 arr1 小于 arr2 则 n-- , 会记录 开始时 arr1、arr2 的相对 状态,(即 开始时  n 会根据 arr1[i] 、 arr2[i] 相对大小 自行调整,一旦出现 另一种 和 n 状态 相反的 arr1[i]、arr2[i] 大小关系, 即发生了 两条线交叉。)
            if (n > 0) {
                break;
            }
            n--;
        } else if (arr1[i] > arr2[i]) {             // 如果 arr1 大于 arr2 则 n++
            if (n < 0) {
                break;
            }
            n++;
        } else {                                    //  arr1[i] == arr2[i] ,则立即 跳出
            break;
        }
    }
    return n;                                       // 返回 n 值,代表 已经交叉了多少周期, 0 即 指标值相等。
};
  • 我们 模拟一组 数据 传入 该参数 看看 结果如何

var arr1 = [1,2,3,4,5,6,8,8,9]     // 快线指标
var arr2 = [2,3,4,5,6,7,7,7,7]     // 慢线指标
function main(){
    Log("_Cross(arr1, arr2) : ", _Cross(arr1, arr2))
    Log("_Cross(arr2, arr1) : ", _Cross(arr2, arr1))
}

img

可以看到结果为 3 、-3 。

img

图中可以看到,交叉的位置 发生在 三个 K线柱之前。


More

phoenix7978 I try to call 'Cross' function in python script, but it raise a exception, is there the cross function in python api?

小韭菜来也 要是来回交叉呢?

小小梦 Thanks to supported BotVS , The question is that function named "$.Cross" is in JavaScript . In the python it named "ext.Cross" and you must add the Template for python . Right now , the function named "$.Cross" and "ext.Cross" all packaged to a function become an API named "_Cross" . The url : https://www.botvs.com/api#_Cross

小小梦 只检测 最近一次交叉, 看源码分析 可得知。