TAMath ops
SUM - 求和
TA.SUM() - 指定周期内的累加和
语法
python
result = TA.SUM(records, period)参数
| 参数 | 类型 | 说明 |
|---|---|---|
| records | array | K线数据数组 |
| period | int | 周期长度 |
返回值
返回一个数组,每个元素是对应周期内的收盘价之和。
计算方法
plaintext
SUM[i] = Σ(Close[i-period+1] to Close[i])对指定周期内的所有值求和。
使用场景
- 成交量统计:计算一段时间的总成交量
- 累计涨跌:计算总涨跌幅
- 移动平均辅助:MA = SUM / period
基础示例
python
def onTick():
exchange.SetContractType("swap")
records = exchange.GetRecords()
if len(records) < 30:
return
# 计算20日收盘价总和
sum_20 = TA.SUM(records, 20)
# 手动计算均线
ma_20 = sum_20[-1] / 20
Log("20日收盘价总和:", sum_20[-1])
Log("20日均价:", ma_20)高级应用
1. 累计成交量
python
def onTick():
records = exchange.GetRecords()
# 构造成交量数组
volume_records = [{'Close': r.Volume} for r in records]
# 20日累计成交量
volume_sum = TA.SUM(volume_records, 20)
current_volume = records[-1].Volume
# 当前成交量占比
volume_ratio = current_volume / volume_sum[-1]
Log(f"当前成交量占20日总量: {volume_ratio*100:.2f}%")
if volume_ratio > 0.1: # 单日成交量超过20日总量的10%
Log("异常放量!")2. 累计涨跌幅
python
def onTick():
records = exchange.GetRecords()
# 计算每日涨跌幅
returns = []
for i in range(1, len(records)):
ret = (records[i].Close - records[i-1].Close) / records[i-1].Close
returns.append(ret)
# 构造涨跌幅数组
return_records = [{'Close': r} for r in returns]
# 20日累计涨跌幅
if len(return_records) >= 20:
cumulative_return = TA.SUM(return_records, 20)
Log(f"20日累计涨跌: {cumulative_return[-1]*100:.2f}%")
# 累计跌幅过大,超跌反弹
if cumulative_return[-1] < -0.2: # 跌超20%
Log("超跌,寻找反弹机会")
rsi = TA.RSI(records, 14)
if rsi[-1] < 30:
exchange.SetDirection("buy")
exchange.Buy(-1, 1)3. 资金流向
python
def onTick():
records = exchange.GetRecords()
# 计算资金流向(简化版OBV)
money_flow = []
for i in range(1, len(records)):
if records[i].Close > records[i-1].Close:
# 上涨日,资金流入
money_flow.append(records[i].Volume)
else:
# 下跌日,资金流出
money_flow.append(-records[i].Volume)
mf_records = [{'Close': mf} for mf in money_flow]
# 20日累计资金流
if len(mf_records) >= 20:
net_flow = TA.SUM(mf_records, 20)
Log("20日净资金流:", net_flow[-1])
if net_flow[-1] > 0:
Log("资金持续流入")
else:
Log("资金持续流出")4. 波动率累计
python
def onTick():
records = exchange.GetRecords()
# 计算每日波动幅度
volatility = []
for r in records:
daily_range = (r.High - r.Low) / r.Close
volatility.append(daily_range)
vol_records = [{'Close': v} for v in volatility]
# 20日累计波动
if len(vol_records) >= 20:
total_volatility = TA.SUM(vol_records, 20)
avg_volatility = total_volatility[-1] / 20
Log(f"20日平均波动: {avg_volatility*100:.2f}%")
current_vol = volatility[-1]
if current_vol > avg_volatility * 2:
Log("今日波动异常放大")5. 均线斜率
python
def onTick():
records = exchange.GetRecords()
ma20 = TA.MA(records, 20)
# 计算均线变化
ma_changes = []
for i in range(1, len(ma20)):
change = ma20[i] - ma20[i-1]
ma_changes.append(change)
ma_change_records = [{'Close': c} for c in ma_changes]
# 10日均线变化总和(斜率)
if len(ma_change_records) >= 10:
ma_slope = TA.SUM(ma_change_records, 10)
if ma_slope[-1] > 0:
Log("均线持续上行,趋势向上")
else:
Log("均线持续下行,趋势向下")注意事项
- 前期数据:前period-1个数据点无法计算完整周期
- 数据类型:确保records格式正确
- 大数累加:注意数值溢出问题