통계적 수익률
BotVS의 수익 통계는 하나의 곡선만을 기록한다. 기술 분석을 수행할 수 없다. 이 템플릿은 최근 1일, 지난 1일, 최근 7일, 지난 7일, 최근 30일, 지난 30일 및 모든 시간의 수익, 수익률, 월간 수익률, 연간 수익률 및 최대 회수율을 자동으로 통계화할 수 있다.
사용 방법: 이 템플릿에 로그프로프트 함수를 $.LogProfit로 교체하고 로그국가상태의 위치에서 $.ProfitSummary (초시자금) 의 반환 문자열을 추가합니다.
예를 들어: function main (() { while (true) { while (true) } var t = exchange.GetTicker (); $LogProfit ((t.Last); $LogProfit (t.Last)); $LogProfit (t.Last)); $LogProfit (t.Last) 로그Status (($.ProfitSummary ((10000)); [Sleep ((3600000) ]; ♪ ♪ ♪ ♪
이 사진의 결과는
1일: 징수-78.44원 ((-0.537%), 월화-16.781%, 연화-204.169%, 철수 1.106% 지난 1일: 176.08원 ((1.221%), 월화 38.226%, 연화 465.087%, 철수 1.236% 7일: 771.74원 ((5,599%) 을 징수, 월화 24,141%, 연화 293,719%, 철수 1,517% 지난 7일: 223.15원 (1.64%), 월화 7.071%, 연화 86.039%, 철수 0.9% 30일: 1570.31원 ((12.094%), 월화 12.111%, 연화 147.352%, 철회 3.251% 지난 30일: 200.12원 ((1.565%)), 월화 1.567%, 연화 19.076%, 철회 1.521% 총: 4554.11원 ((45.541%), 최대 철수 3.251%, 통계에 따르면 74일 23시간
$.LogProfit = function(profit) { var args = Array.prototype.slice.call(arguments); if (SYS_LOGPROFIT) { LogProfit.apply(this, args); } else { args.unshift('收益'); Log.apply(this,args); } var _history = $.GetAllProfit(); _history.push([ Math.floor(new Date().getTime()/1000), profit]); _G('profit_history', JSON.stringify(_history)); }; $.GetAllProfit = function() { var old = _G('profit_history') || '[]'; try { var _history = JSON.parse(old); return _history; } catch(e) { _G('profit_history', null); return []; } }; function filterProfit(from, to) { var arr = $.GetAllProfit(); if (!arr || arr.length === 0) return; var re, maxdrawback=0, lastProfit=0, maxProfit=false, maxdrawbackProfit=0; var earlest, latest; for(var i=0;i<arr.length;i++) { if (!arr[i]) continue; if (arr[i][0] > from && arr[i][0] <= to) { var profit = arr[i][1]; if (!earlest) earlest = arr[i]; latest = arr[i]; if (!lastProfit) lastProfit = profit; if (maxProfit === false || maxProfit < profit) maxProfit = profit; var drawback = maxProfit - profit; if (drawback > maxdrawback) { maxdrawback = drawback; maxdrawbackProfit = maxProfit; } } } if (!earlest || !latest) return; return [earlest, latest, maxdrawback, maxdrawbackProfit]; } function daysProfit(offset, days) { var from = getDaySecond( -offset+days); var to = getDaySecond(-offset); var arr = filterProfit( from, to ); if (!arr || !arr[0] || !arr[1]) return; var profitTime = arr[1][0] - arr[0][0]; if (!profitTime) return; var periodTime = to - from; var profit = arr[1][1] - arr[0][1]; var realPercent = profitTime*100 / periodTime; var expectedProfit = profit * 100 / realPercent; return { profit:profit, expectedProfit:expectedProfit, profitTime:profitTime, periodTime:periodTime, open: arr[0][1], close: arr[1][1], drawback: arr[2], drawbackProfit: arr[3] }; } function getDaySecond(days) { var d = new Date(); var now = d.getTime(); now -= days*86400000; d.setTime(now); return Math.floor(d.getTime() / 1000); } $.DaysProfit = function(days) { return filterProfit(days)[2]; }; $.ProfitSummary = function(initialBalance) { if (!initialBalance) return '没有传入初始资金'; var day = daysProfit(0, 1); var lastDay = daysProfit(-1, 1); var week = daysProfit(0,7); var lastWeek = daysProfit(-7,7); var month = daysProfit(0,30); var lastMonth = daysProfit(-30,30); var all = daysProfit(0, 10000); if (!all) return ''; var _days = Math.floor(all.profitTime / 86400); var text = []; var t = profitSummary(day, initialBalance); if (t) text.push('1日: '+t); t = profitSummary(lastDay, initialBalance); if (t) text.push('上1日: '+t); t = profitSummary(week, initialBalance); if (t && _days >= 7) text.push('7日: '+t); t = profitSummary(lastWeek, initialBalance); if (t) text.push('上7日: '+t); t = profitSummary(month, initialBalance); if (t && _days>=30) text.push('30日: '+t); t = profitSummary(lastMonth, initialBalance); if (t) text.push('上30日: '+t); if (all) { var _days = Math.floor(all.profitTime / 86400); all.profitTime %= 86400; var _hours = Math.floor(all.profitTime / 3600); var drawback = _N( all.drawback*100/(all.drawbackProfit+initialBalance), 3 )+'%'; text.push('总: 收'+_N(all.close,2)+'元('+_N(all.close*100/initialBalance,3)+'%),最大回撤'+drawback+',统计时间'+_days+'天'+_hours+'小时'); } return text.join('\n'); }; function profitSummary(p, base) { if (!p) return ''; var text = []; text.push('收'+_N(p.profit,2)+'元('+_N(p.profit*100/(base+p.open), 3)+'%)'); var month = expectProfit(p, 30, base); if (month) { text.push('月化'+month.percent+'%'); } var year = expectProfit(p, 365, base); if (year) { text.push('年化'+year.percent+'%'); } text.push('回撤'+ _N( p.drawback*100/(p.drawbackProfit+base), 3 )+'%' ); return text.join(','); } function expectProfit(p, days, base) { var expectSeconds = days*86400; if (expectSeconds < p.profitTime) return; return { profit: _N(p.profit * expectSeconds / p.profitTime, 2), percent: _N(p.profit * expectSeconds *100 / (p.profitTime * (base+p.open)),3) }; } function main() { while(true) { var t = exchange.GetTicker(); $.LogProfit(t.Last); LogStatus($.ProfitSummary(10000)); Sleep(3600000); } }
nxtplayer감사합니다.
로가또는 연락처를 요청할 수 없습니다.
ywx감사합니다, 바로 필요한 것 같습니다.
모박스지원