|
|
@@ -13,7 +13,7 @@ async function readData() {
|
|
|
/* 概率学说 */
|
|
|
// 统计过去N日累计涨幅,【有一定关系】
|
|
|
function statisticA(kLines, index) {
|
|
|
- let startK = kLines[index - 10]
|
|
|
+ let startK = kLines[index - 12]
|
|
|
let endK = kLines[index - 1]
|
|
|
|
|
|
if (!startK || !endK) {
|
|
|
@@ -23,10 +23,10 @@ function statisticA(kLines, index) {
|
|
|
return parseInt(100 * (endK.Close - startK.Open) / startK.Open) + 100
|
|
|
}
|
|
|
|
|
|
-// 返回过去一共N天涨幅超过M%【这个有关的】
|
|
|
+// 返回过去一共NK涨幅超过M%【这个有关的】
|
|
|
function statisticB(kLines, index) {
|
|
|
let count = 0
|
|
|
- for (let i = index - 1; i >= index - 3; i--) {
|
|
|
+ for (let i = index - 1; i >= index - 2; i--) {
|
|
|
let kLine = kLines[i]
|
|
|
|
|
|
if (!kLines[i - 1]) break
|
|
|
@@ -74,12 +74,12 @@ function statisticD(_kLines, _index) {
|
|
|
function filter(kLines, index) {
|
|
|
// 过去N根K的累计涨幅
|
|
|
let upRateN = statisticA(kLines, index)
|
|
|
- if (upRateN <= 75 || upRateN >= 95) {
|
|
|
+ if (upRateN <= 75 || upRateN >= 90) {
|
|
|
return false
|
|
|
}
|
|
|
|
|
|
- // 一共N天涨幅超过M%
|
|
|
- if (statisticB(kLines, index) > 1) {
|
|
|
+ // 一共NK涨幅超过M%
|
|
|
+ if (statisticB(kLines, index) > 0) {
|
|
|
return false
|
|
|
}
|
|
|
|
|
|
@@ -96,7 +96,7 @@ function getRealDragonMap(kLinesMap, dayCount, BUY_LIMIT_RATE) {
|
|
|
let kLine = kLines[index]
|
|
|
let prevKline = kLines[index - 1]
|
|
|
|
|
|
- // 开盘第一天不计算
|
|
|
+ // 开盘第一K不计算
|
|
|
if (!kLine || !prevKline) continue
|
|
|
|
|
|
// 指标过滤
|
|
|
@@ -134,7 +134,7 @@ function getFakeDragonMap(kLinesMap, dayCount, BUY_LIMIT_RATE) {
|
|
|
let kLine = kLines[index]
|
|
|
let prevKline = kLines[index - 1]
|
|
|
|
|
|
- // 开盘第一天不计算
|
|
|
+ // 开盘第一K不计算
|
|
|
if (!kLine || (!prevKline)) continue
|
|
|
|
|
|
// 指标过滤
|
|
|
@@ -163,7 +163,7 @@ let dataLeft = []
|
|
|
let dataRight = []
|
|
|
let tempLeft = []
|
|
|
let tempRight = []
|
|
|
-let dataY = [...Array(10).keys()]
|
|
|
+let dataY = [...Array(200).keys()]
|
|
|
function dragonAnalysis(btcKLines, kLinesMap, dragonMap, dayCount) {
|
|
|
for (let symbol in dragonMap) {
|
|
|
let kLines = kLinesMap[symbol]
|
|
|
@@ -172,13 +172,6 @@ function dragonAnalysis(btcKLines, kLinesMap, dragonMap, dayCount) {
|
|
|
let x = statisticB(kLines, index)
|
|
|
let y = dragonMap[symbol].Profit
|
|
|
|
|
|
- // logger.info(
|
|
|
- // `${symbol}的分析(${y}%)`
|
|
|
- // // + `前7日累计涨幅${statisticA(kLines, index)}%。`
|
|
|
- // // + `前30日平均振幅${statisticB(kLines, index)}%。`
|
|
|
- // + `前30日平均(High - Close)${x}%。`
|
|
|
- // )
|
|
|
-
|
|
|
// 打印实际的量
|
|
|
// if (y > 0) {
|
|
|
// if (dataRight[x]) {
|
|
|
@@ -218,10 +211,10 @@ async function main() {
|
|
|
let kLinesMap = await readData()
|
|
|
|
|
|
const BUY_LIMIT_RATE = 0 // 从什么比例入场
|
|
|
- const FIRST_FEW_DAYS = 1 // 第几天的数据,0表示今天,1表示昨天,2表示前天,以此类推
|
|
|
- const BAKE_TEST_DAYS = 60 // 一共回测多少天
|
|
|
- // const FIRST_FEW_DAYS = 710 // 第几天的数据,0表示今天,1表示昨天,2表示前天,以此类推
|
|
|
- // const BAKE_TEST_DAYS = 1 // 一共回测多少天
|
|
|
+ const FIRST_FEW_DAYS = 1 // 第几K的数据,0表示今K,1表示昨K,2表示前K,以此类推
|
|
|
+ const BAKE_TEST_DAYS = 980 // 一共回测多少K
|
|
|
+ // const FIRST_FEW_DAYS = 710 // 第几K的数据,0表示今K,1表示昨K,2表示前K,以此类推
|
|
|
+ // const BAKE_TEST_DAYS = 1 // 一共回测多少K
|
|
|
|
|
|
|
|
|
let btcKLines = kLinesMap['BTC_USDT']
|
|
|
@@ -261,14 +254,19 @@ async function main() {
|
|
|
let synProfit = NumKit.getSubFloat(expFakeProfit + expRealProfit, 2)
|
|
|
let avgProfit = NumKit.getSubFloat(synProfit / (realLength + fakeLength), 2)
|
|
|
let isStopLoss = false
|
|
|
- if (avgProfit < -0.8 || btcKlineDownRate > 0.8) {
|
|
|
- avgProfit = -1
|
|
|
- isStopLoss = true
|
|
|
+ if ((Object.keys(fakeDragonMap).length !== 0 || Object.keys(realDragonMap).length !== 0)) {
|
|
|
+ if (avgProfit < -0.8 || btcKlineDownRate > 0.8) {
|
|
|
+ avgProfit = -1
|
|
|
+ isStopLoss = true
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ avgProfit = 0
|
|
|
}
|
|
|
|
|
|
+
|
|
|
let index = kLinesMap['BTC_USDT'].length - (day_count + 1)
|
|
|
let btcK = kLinesMap['BTC_USDT'][index]
|
|
|
- let dateStr = TimeKit.getDateByMillisecond(btcK.Time)
|
|
|
+ let dateStr = TimeKit.getTimeByMillisecond(btcK.Time)
|
|
|
let btcUpRate = NumKit.getSubFloat(100 * (btcK.Close - btcK.Open) / btcK.Open, 2)
|
|
|
|
|
|
logger.info(`${day_count}日(${dateStr}, ${realLength + fakeLength}只),赚钱榜(${realLength}只)利润${realDragonProfit}%`
|