diff --git a/formula/README.md b/formula/README.md index 3334258db288b9d4b2c2314432122829c24ee6af..a723b40ae7fe8580fd5793091ee3e454d7180c0b 100644 --- a/formula/README.md +++ b/formula/README.md @@ -38,7 +38,7 @@ formula | 1 | BARSLAST | 上一次条件成立到当前的周期数 | BARSLAST(X) | [√] | [√] | | 1 | BARSLASTCOUNT | 统计连续满足S条件的周期数 | BARSLASTCOUNT(X) | [√] | [ ] | | 1 | BARSSINCEN | N周期内第一次S条件成立到现在的周期数 | BARSSINCEN(S,N) | [√] | [√] | -| 1 | CROSS | 判断向上金叉穿越,两个序列互换就是判断向下死叉穿越 | CROSS(MA(C,5),MA(C,10)) | [X] | [X] | +| 1 | CROSS | 判断向上金叉穿越,两个序列互换就是判断向下死叉穿越 | CROSS(MA(C,5),MA(C,10)) | [√] | [ ] | | 1 | LONGCROSS | 两条线维持一定周期后交叉,S1在N周期内都小于S2,本周期从S1下方向上穿过S2时返回1,否则返回0 | LONGCROSS(MA(C,5),MA(C,10),5) | [X] | [X] | | 1 | VALUEWHEN | 当S条件成立时,取X的当前值,否则取VALUEWHEN的上个成立时的X值 | VALUEWHEN(S,X) | [X] | [X] | | 1 | BETWEEN | S处于A和B之间时为真。 包括 AS>B | BETWEEN(S,A,B) | [X] | [X] | diff --git a/formula/cross.go b/formula/cross.go new file mode 100644 index 0000000000000000000000000000000000000000..635665fd0fb002611102e0b8f488c9c954971719 --- /dev/null +++ b/formula/cross.go @@ -0,0 +1,23 @@ +package formula + +import ( + "gitee.com/quant1x/pandas" + "github.com/viterin/vek" +) + +// CROSS +// +// 判断向上金叉穿越 CROSS(MA(C,5),MA(C,10)) +// 判断向下死叉穿越 CROSS(MA(C,10),MA(C,5)) +func CROSS(S1, S2 pandas.Series) []bool { + r1 := S1.DTypes() + r2 := S2.DTypes() + r11 := S1.Ref(1).DTypes() + r12 := S2.Ref(1).DTypes() + + b1 := CompareLt(r11, r12) + b2 := CompareGte(r1, r2) + + c := vek.And(b1, b2) + return c +} diff --git a/formula/cross_test.go b/formula/cross_test.go new file mode 100644 index 0000000000000000000000000000000000000000..3a3d293bb7e3ffe9093a88ea87e3bbaa0f76a481 --- /dev/null +++ b/formula/cross_test.go @@ -0,0 +1,17 @@ +package formula + +import ( + "fmt" + "gitee.com/quant1x/pandas" + "testing" +) + +func TestCROSS(t *testing.T) { + d1 := []float64{1, 2, 3, 4, 5, 6, 7, 8, 8, 10} + d2 := []float64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} + + s1 := pandas.NewSeriesWithoutType("d1", d1) + s2 := pandas.NewSeriesWithoutType("d2", d2) + + fmt.Println(CROSS(s1, s2)) +}