|
|
@@ -40,48 +40,46 @@ function statisticB(kLines, index) {
|
|
|
}
|
|
|
|
|
|
/* 形态学说 */
|
|
|
-// 最近2根k线出现上涨吞没,或3根k线的组合形态是上涨吞没
|
|
|
-function statisticC(kLines, index) {
|
|
|
- let kPrev1 = kLines[index - 1]
|
|
|
- let kPrev2 = kLines[index - 2]
|
|
|
|
|
|
- if (!kPrev1 || !kPrev2) return 0
|
|
|
+// 如果前一根k线是阴线,并且收了影线,影线涨幅>=实体跌幅*0.732【有用,能过滤60%的交易,但是过滤的交易很多都是能盈利的,所以这个因子只能说保留一下】
|
|
|
+function statisticD(kLines, index) {
|
|
|
+ let k = kLines[index - 1]
|
|
|
|
|
|
- // 检查 kPrev2 是否为跌势中的黑色蜡烛
|
|
|
- const isPrev2Bearish = kPrev2.Close < kPrev2.Open;
|
|
|
- // 检查 kPrev1 是否为白色蜡烛
|
|
|
- const isPrev1Bullish = kPrev1.Close > kPrev1.Open;
|
|
|
- // 检查 kPrev1 的实体是否完全覆盖了 kPrev2 的实体
|
|
|
- let isEngulfing = kPrev1.Close > kPrev2.Open;
|
|
|
+ if (!k) return 0
|
|
|
|
|
|
- if (isPrev2Bearish && isPrev1Bullish && isEngulfing) return 1
|
|
|
+ // 计算实体的跌幅
|
|
|
+ const bodyDecline = k.Open - k.Close;
|
|
|
|
|
|
- // 组合实体判断
|
|
|
- let kPrev3 = kLines[index - 3]
|
|
|
+ // 如果跌幅小于5%,不适用这个过滤
|
|
|
+ if (100 * (k.Low - k.Open) / k.Open > -10) return 1
|
|
|
|
|
|
- if (!kPrev3) return 0
|
|
|
+ // 计算下影线的涨幅
|
|
|
+ const lowerShadowGain = Math.min(k.Open, k.Close) - k.Low;
|
|
|
|
|
|
- const isPrev3Bearish = kPrev3.Close < kPrev3.Open;
|
|
|
- const isPrev2Bullish = kPrev2.Close > kPrev2.Open;
|
|
|
- // 组合实体满足条件
|
|
|
- isEngulfing = kPrev1.Close > kPrev3.Open;
|
|
|
- if (isPrev3Bearish && isPrev2Bullish && isPrev1Bullish && isEngulfing) return 1
|
|
|
+ // 判断下影线的涨幅是否大于或等于实体的跌幅
|
|
|
+ const hasLongLowerShadow = (lowerShadowGain / k.Low) >= (bodyDecline / k.Open) * 1;
|
|
|
|
|
|
- return 0
|
|
|
+ // 阴线并且下影线涨幅大于或等于实体跌幅
|
|
|
+ return hasLongLowerShadow ? 1 : 0;
|
|
|
}
|
|
|
|
|
|
-// 前一根k线是阴线,并且收了影线,影线涨幅>=实体跌幅
|
|
|
-function statisticD(kLines, index) {}
|
|
|
+// 现在应该想一个形态,能过滤一下熊市时的亏损,牛市时的回撤无所谓
|
|
|
+function statisticC(kLines, index) {
|
|
|
+
|
|
|
+}
|
|
|
|
|
|
// 指标过滤
|
|
|
function filter(kLines, index) {
|
|
|
- // 一共N天涨幅超过M%
|
|
|
- if (statisticB(kLines, index) !== 0) return false
|
|
|
-
|
|
|
// 过去N日累计涨幅,85表示亏15%,115表示赚15%,100是分界线
|
|
|
let upRateN = statisticA(kLines, index)
|
|
|
if (upRateN >= 85 && upRateN <= 100) return false
|
|
|
|
|
|
+ // 一共N天涨幅超过M%
|
|
|
+ if (statisticB(kLines, index) !== 0) return false
|
|
|
+
|
|
|
+ // 前一根k线是阴线,并且收了影线,影线涨幅>=实体跌幅*0.732
|
|
|
+ if (statisticD(kLines, index) === 0) return false
|
|
|
+
|
|
|
return true
|
|
|
}
|
|
|
|
|
|
@@ -163,7 +161,7 @@ function dragonAnalysis(btcKLines, kLinesMap, dragonMap, dayCount) {
|
|
|
let kLines = kLinesMap[symbol]
|
|
|
let index = kLines.length - (dayCount + 1)
|
|
|
|
|
|
- let x = statisticC(kLines, index)
|
|
|
+ let x = statisticD(kLines, index)
|
|
|
let y = dragonMap[symbol].Profit
|
|
|
|
|
|
// logger.info(
|