【掘金使用技巧7】如何从通达信等迁移到掘金
引言一些用户是从通达信等软件上切换过来的,对于掘金框架及python语言不是很了解,很难上手。对此,小编整理了一些基本要点以及一些简单的示例,希望对大家有帮助。从结构开始说起通达信这类软件在编写公式之前首先要确定一个频率,是日线级别、分钟级别还是其他级别,然后再定义公式,这个选择的过程对应掘金python语句中的订阅函数(subscribe)。如果在通达信中选择日线频率,在掘金中就订阅’1d’频率
引言
一些用户是从通达信等软件上切换过来的,对于掘金框架及python语言不是很了解,很难上手。对此,小编整理了一些基本要点以及一些简单的示例,希望对大家有帮助。
从结构开始说起
通达信这类软件在编写公式之前首先要确定一个频率,是日线级别、分钟级别还是其他级别,然后再定义公式,这个选择的过程对应掘金python语句中的订阅函数(subscribe)。如果在通达信中选择日线频率,在掘金中就订阅’1d’频率。(特别说明,掘金除了bar数据,还支持tick级别的数据,用户可以在更高频率下编写策略)。
-
def init(context): -
# 定义标的 -
context.symbol = 'SHSE.600519' -
# 订阅bar数据,获取成交量 -
subscribe(symbols=context.symbol, frequency='1d', count=2)
确定好标的和频率以后就到了策略的主体部分,在通达信就表示为各种各样的公式,在掘金中需要将这些公式翻译成对应的python语言。公式翻译完成后,将翻译后的逻辑写在on_bar或on_tick里面。
什么是on_bar?
On_bar称为数据推送事件,和订阅函数配套使用,只有订阅了才会触发on_bar。每返回一根新的bar,就会驱动一次。可以将on_bar想象成一根又一根推过来的k线,通达信中的函数是对单根k线使用的,到了掘金中就转化为在on_bar里面编写函数。
一些不同点:
不同点1:通达信和掘金都是对获取的数据进行操作,通达信将其封装成易懂的函数,掘金将其直接暴露出来,让用户对原始数据进行提取、分析等,所以部分通达信函数在python中可以直接以索引形式获得,不需要再编写函数。
这些数据都包含哪些呢?
主要包括以下几个字段:开盘价、收盘价、最高价、最低价、成交额、成交量、持仓量。
这些字段的引用方式:
先用context.data()接口将订阅的数据提取出来,取出是dataframe格式。提取对应的字段用:data[‘字段名’]的形式。
-
high = data['high'] # 最高价 -
close = data['close'] # 收盘价 -
low = data['low'] # 最低价 -
open = data['open'] # 开盘价
提取出对应字段后发现,取出的数据并非单个数据,而是一列数据,这就出现了另一个引用上的不同之处。
不同点2:
在通达信中有一个REF(N)函数,用来表示滞后N期的数据,REF(CLOSE,1)就表示滞后1期的收盘价。转化到python中,需要用索引的方式直接取出前一期数据。比如:REF(CLOSE,1)在python中表示为CLOSE.iloc[-2],意思为CLOSE的倒数第二个元素,即CLOSE的前一期元素。(因为CLOSE的最后一个元素是当前日期的数据,倒数第二个元素才是前一日的数据,所以选择倒数第二个元素)
Tips : iloc的用法
iloc表示索引引用方法,使用方式为:df.iloc[m,n],表示df第m行n列的数据。如果df是一维数据,则df.iloc[n]表示df第n个数据。
整体结构示例:
举个例子:今天成交量比昨天成交量放大了1倍,则买入1手。
思路:
先确定频率(昨天、今天字样说明频率是日频),则先订阅’1d’的数据。
然后在on_bar里面写逻辑。
首先需要今日成交量、昨日成交量两个数据,直接在data里面获取。
然后写if条件,当满足今天成交量比昨天放大1倍,则开始下单。
最后,运行策略。
完成后就如下图所示:
-
# 今天成交量比昨天成交量放大了1倍,则买入1手 -
# 通达信: VOL/REF(VOL,1)>2 -
# 掘金python -
def init(context): -
# 定义标的 -
context.symbol = 'SHSE.600519' -
# 订阅bar数据,获取成交量 -
subscribe(symbols=context.symbol, frequency='1d', count=2) -
def on_bar(context, bars): -
data = context.data(symbol=context.symbol, frequency='1d', count=2) # 获取订阅的数据 -
vol_today = data['volume'].iloc[-1] # 昨日成交量 -
vol_yesterday = data['volume'].iloc[-2] # 今日成交量 -
if vol_today/vol_yesterday > 2: -
order_volume(symbol=context.symbol, volume=100, side=OrderSide_Buy, order_type=OrderType_Market, -
position_effect=PositionEffect_Open) -
if __name__ == '__main__': -
run(strategy_id='请输入你的策略id', -
filename='main.py', -
mode=MODE_BACKTEST, -
token='请输入你的token', -
backtest_start_time='2020-12-01 08:00:00', -
backtest_end_time='2020-12-20 15:00:00', -
backtest_adjust=ADJUST_PREV, -
backtest_initial_cash=10000000, -
backtest_commission_ratio=0.0001, -
backtest_slippage_ratio=0.0001 -
)
这就是一个简单的示例。
还有一些简单的练习,使用者可以参考一下。
-
# 例1:今天5日均量比昨天的5日均量放大了1倍,则买入1手 -
# 通达信: AA:=MA(VOL,5) BB:REF(AA,1) AA/BB > 2 -
# 掘金python -
def init(context): -
# 定义标的 -
context.symbol = 'SHSE.600519' -
# 订阅bar数据,获取成交量 -
subscribe(symbols=context.symbol, frequency='1d', count=6) -
def on_bar(context, bars): -
data = context.data(symbol=context.symbol, frequency='1d', count=6) # 获取订阅的数据 -
vol_today_mean = np.mean(data['volume'].iloc[-1:-5]) # 昨日成交量 -
vol_yesterday_mean = np.mean(data['volume'].iloc[-2:-6]) # 今日成交量 -
if vol_today_mean/vol_yesterday_mean > 2: -
order_volume(symbol=context.symbol, volume=100, side=OrderSide_Buy, order_type=OrderType_Market, -
position_effect=PositionEffect_Open) -
if __name__ == '__main__': -
run(strategy_id='请输入你的策略id', -
filename='main.py', -
mode=MODE_BACKTEST, -
token='请输入你的token', -
backtest_start_time='2020-12-01 08:00:00', -
backtest_end_time='2020-12-20 15:00:00', -
backtest_adjust=ADJUST_PREV, -
backtest_initial_cash=10000000, -
backtest_commission_ratio=0.0001, -
backtest_slippage_ratio=0.0001 -
) -
# 例2:连续3天增量1倍以上,则买入1手 -
# 通达信:EVERY(V>= REF(V,1)*2,3) -
# 掘金python -
def init(context): -
# 定义标的 -
context.symbol = 'SHSE.600519' -
# 订阅bar数据,获取成交量 -
subscribe(symbols=context.symbol, frequency='1d', count=6) -
def on_bar(context, bars): -
data = context.data(symbol=context.symbol, frequency='1d', count=6) # 获取订阅的数据 -
data['vol_change'] = data['volume'] - data.volume.shift(1) # 计算增量 -
if np.all(data['vol_change'].iloc[-3:] > data.volume.shift(1).iloc[-3:])*2: # 等价于 EVERY(V>= REF(V,1)*2,3) -
order_volume(symbol=context.symbol, volume=100, side=OrderSide_Buy, order_type=OrderType_Market, -
position_effect=PositionEffect_Open) -
if __name__ == '__main__': -
run(strategy_id='请输入你的策略id', -
filename='main.py', -
mode=MODE_BACKTEST, -
token='请输入你的token', -
backtest_start_time='2020-12-01 08:00:00', -
backtest_end_time='2020-12-20 15:00:00', -
backtest_adjust=ADJUST_PREV, -
backtest_initial_cash=10000000, -
backtest_commission_ratio=0.0001, -
backtest_slippage_ratio=0.0001 -
) -
# 例3:涨幅达到7%以上,则买入1手 -
# 通达信:CLOSE/REF(CLOSE,1) > 1.07 -
# 掘金python -
def init(context): -
# 定义标的 -
context.symbol = 'SHSE.600519' -
# 订阅bar数据,获取成交量 -
subscribe(symbols=context.symbol, frequency='1d', count=2) -
def on_bar(context, bars): -
data = context.data(symbol=context.symbol, frequency='1d', count=2) # 获取订阅的数据 -
data['price_change'] = data['close'] - data['close'].shift(1) # 计算涨幅或跌幅 -
if data['price_change'].iloc[-1] > 0.07: # 等价于 CLOSE/REF(CLOSE,1) > 1.07 -
order_volume(symbol=context.symbol, volume=100, side=OrderSide_Buy, order_type=OrderType_Market, -
position_effect=PositionEffect_Open) -
if __name__ == '__main__': -
run(strategy_id='请输入你的策略id', -
filename='main.py', -
mode=MODE_BACKTEST, -
token='请输入你的token', -
backtest_start_time='2020-12-01 08:00:00', -
backtest_end_time='2020-12-20 15:00:00', -
backtest_adjust=ADJUST_PREV, -
backtest_initial_cash=10000000, -
backtest_commission_ratio=0.0001, -
backtest_slippage_ratio=0.0001 -
) -
# 例4:向上跳空,则买入1手 -
# 通达信:OPEN>REF(HIGH,1) -
# 掘金python -
def init(context): -
# 定义标的 -
context.symbol = 'SHSE.600519' -
# 订阅bar数据,获取成交量 -
subscribe(symbols=context.symbol, frequency='1d', count=2) -
def on_bar(context, bars): -
data = context.data(symbol=context.symbol, frequency='1d', count=2) # 获取订阅的数据 -
if data['open'].iloc[-1] > data['close'].iloc[-2]: # 等价于 OPEN>REF(HIGH,1) -
order_volume(symbol=context.symbol, volume=100, side=OrderSide_Buy, order_type=OrderType_Market, -
position_effect=PositionEffect_Open) -
if __name__ == '__main__': -
run(strategy_id='请输入你的策略id', -
filename='main.py', -
mode=MODE_BACKTEST, -
token='请输入你的token', -
backtest_start_time='2020-12-01 08:00:00', -
backtest_end_time='2020-12-20 15:00:00', -
backtest_adjust=ADJUST_PREV, -
backtest_initial_cash=10000000, -
backtest_commission_ratio=0.0001, -
backtest_slippage_ratio=0.0001 -
) -
# 例5:收盘价 > 1日前的25日内收盘价的最低值,则买入1手 -
# 通达信:c > ref(llv(c,25),1) -
# 掘金python -
def init(context): -
# 定义标的 -
context.symbol = 'SHSE.600519' -
# 订阅bar数据,获取成交量 -
subscribe(symbols=context.symbol, frequency='1d', count=25) -
def on_bar(context, bars): -
data = context.data(symbol=context.symbol, frequency='1d', count=25) # 获取订阅的数据 -
if data['close'].iloc[-1] <= data['close'].iloc[-2:].min(): # 等价于c > ref(llv(c,25),1) -
order_volume(symbol=context.symbol, volume=100, side=OrderSide_Buy, order_type=OrderType_Market, -
position_effect=PositionEffect_Open) -
if __name__ == '__main__': -
run(strategy_id='请输入你的策略id', -
filename='main.py', -
mode=MODE_BACKTEST, -
token='请输入你的token', -
backtest_start_time='2020-12-01 08:00:00', -
backtest_end_time='2020-12-20 15:00:00', -
backtest_adjust=ADJUST_PREV, -
backtest_initial_cash=10000000, -
backtest_commission_ratio=0.0001, -
backtest_slippage_ratio=0.0001 -
) -
# 例6:横盘整理时(10日收盘价振幅在5%以内波动)清仓 -
# 通达信:(HHV(CLOSE,10)-LLV(CLOSE,10))/CLOSE < 0.05 -
# 掘金python -
def init(context): -
# 定义标的 -
context.symbol = 'SHSE.600519' -
# 订阅bar数据,获取成交量 -
subscribe(symbols=context.symbol, frequency='1d', count=10) -
def on_bar(context, bars): -
data = context.data(symbol=context.symbol, frequency='1d', count=10) # 获取订阅的数据(最近10日) -
if (data['close'].max() - data['close'].min())/data['close'].iloc[-1] < 0.05: # (HHV(CLOSE,10)-LLV(CLOSE,10))/CLOSE < 0.05 -
order_target_volume(symbol=context.symbol, volume=0, position_side=PositionSide_Long, -
order_type=OrderType_Market) -
if __name__ == '__main__': -
run(strategy_id='请输入你的策略id', -
filename='main.py', -
mode=MODE_BACKTEST, -
token='请输入你的token', -
backtest_start_time='2020-12-01 08:00:00', -
backtest_end_time='2020-12-20 15:00:00', -
backtest_adjust=ADJUST_PREV, -
backtest_initial_cash=10000000, -
backtest_commission_ratio=0.0001, -
backtest_slippage_ratio=0.0001 -
) -
# 例7:阴转阳,买入1手 -
# 通达信公式:ref(c,1) < ref(o,1) and c > 0 -
# 掘金python: -
def init(context): -
# 定义标的 -
context.symbol = 'SHSE.600519' -
# 订阅bar数据,获取成交量 -
subscribe(symbols=context.symbol, frequency='1d', count=2) -
def on_bar(context, bars): -
data = context.data(symbol=context.symbol, frequency='1d', count=2) # 获取订阅的数据(最近10日) -
if (data['close'].iloc[-2] < data['open'].iloc[-2]) and \ -
(data['close'].iloc[-1] > data['open'].iloc[-1]): # (HHV(CLOSE,10)-LLV(CLOSE,10))/CLOSE < 0.05 -
order_volume(symbol=context.symbol, volume=100, side=OrderSide_Buy, order_type=OrderType_Market, -
position_effect=PositionEffect_Open) -
if __name__ == '__main__': -
run(strategy_id='请输入你的策略id', -
filename='main.py', -
mode=MODE_BACKTEST, -
token='请输入你的token', -
backtest_start_time='2020-12-01 08:00:00', -
backtest_end_time='2020-12-20 15:00:00', -
backtest_adjust=ADJUST_PREV, -
backtest_initial_cash=10000000, -
backtest_commission_ratio=0.0001, -
backtest_slippage_ratio=0.0001 -
) -
# 例8:当前价格上穿20日均线,买入1手 -
# 通达信公式:cross(c,ma(c,20)) -
# 掘金python: -
def init(context): -
# 定义标的 -
context.symbol = 'SHSE.600519' -
# 订阅bar数据,获取成交量 -
subscribe(symbols=context.symbol, frequency='1d', count=21) -
def on_bar(context, bars): -
data = context.data(symbol=context.symbol, frequency='1d', count=21) # 获取订阅的数据(最近21日) -
data['MA20'] = data['close'].rolling(20).mean() -
if (data['close'].iloc[-1] > data['MA20'].iloc[-1]) and (data['close'].iloc[-2] < data['MA20'].iloc[-2]): # cross(c,ma(c,20)) -
order_volume(symbol=context.symbol, volume=100, side=OrderSide_Buy, order_type=OrderType_Market, -
position_effect=PositionEffect_Open) -
if __name__ == '__main__': -
run(strategy_id='请输入你的策略id', -
filename='main.py', -
mode=MODE_BACKTEST, -
token='请输入你的token', -
backtest_start_time='2020-12-01 08:00:00', -
backtest_end_time='2020-12-20 15:00:00', -
backtest_adjust=ADJUST_PREV, -
backtest_initial_cash=10000000, -
backtest_commission_ratio=0.0001, -
backtest_slippage_ratio=0.0001 -
) -
# 例9:金叉买入:5日均线上穿20日均线,买入1手 -
# 通达信公式:cross(ma(c,5),ma(c,20)) -
# 掘金python: -
def init(context): -
# 定义标的 -
context.symbol = 'SHSE.600519' -
# 订阅bar数据,获取成交量 -
subscribe(symbols=context.symbol, frequency='1d', count=21) -
def on_bar(context, bars): -
data = context.data(symbol=context.symbol, frequency='1d', count=21) # 获取订阅的数据(最近21日) -
data['MA5'] = data['close'].rolling(5).mean() # 求5日均线 -
data['MA20'] = data['close'].rolling(20).mean() # 求20日均线 -
if (data['MA5'].iloc[-1] > data['MA20'].iloc[-1]) and (data['MA5'].iloc[-2] < data['MA20'].iloc[-2]): # 等价cross(ma(c,5),ma(c,20)) -
order_volume(symbol=context.symbol, volume=100, side=OrderSide_Buy, order_type=OrderType_Market, -
position_effect=PositionEffect_Open) -
if __name__ == '__main__': -
run(strategy_id='请输入你的策略id', -
filename='main.py', -
mode=MODE_BACKTEST, -
token='请输入你的token', -
backtest_start_time='2020-12-01 08:00:00', -
backtest_end_time='2020-12-20 15:00:00', -
backtest_adjust=ADJUST_PREV, -
backtest_initial_cash=10000000, -
backtest_commission_ratio=0.0001, -
backtest_slippage_ratio=0.0001 -
) -
# 例10:下影线长于上影线,买入1手 -
# 通达信公式:(c-l) > (h-c) -
# 掘金python: -
def init(context): -
# 定义标的 -
context.symbol = 'SHSE.600519' -
# 订阅bar数据,获取成交量 -
subscribe(symbols=context.symbol, frequency='1d', count=10) -
def on_bar(context, bars): -
data = context.data(symbol=context.symbol, frequency='1d', count=10) # 获取订阅的数据(最近21日) -
if (data['close'].iloc[-1] - data['low'].iloc[-1] > data['high'].iloc[-1] - data['close'].iloc[-1]) > 0: -
# 等价于 (c-l) > (h-c) -
order_volume(symbol=context.symbol, volume=100, side=OrderSide_Buy, order_type=OrderType_Market, -
position_effect=PositionEffect_Open) -
if __name__ == '__main__': -
run(strategy_id='请输入你的策略id', -
filename='main.py', -
mode=MODE_BACKTEST, -
token='请输入你的token', -
backtest_start_time='2020-12-01 08:00:00', -
backtest_end_time='2020-12-20 15:00:00', -
backtest_adjust=ADJUST_PREV, -
backtest_initial_cash=10000000, -
backtest_commission_ratio=0.0001, -
backtest_slippage_ratio=0.0001 -
) -
# 例11:乌云压顶则清仓 -
# 通达信公式: -
# AA:=REF(C,1) > REF(O,1) # 昨日收阳 -
# BB:=O>REF(C,1) # 高开 -
# CC:=C<(REF(C,1)-REF(O,1))/2+REF(O,1) # 盖顶低收 -
# DD:IF(AA AND BB AND CC,1,0) -
# 掘金python: -
def init(context): -
# 定义标的 -
context.symbol = 'SHSE.600519' -
# 订阅bar数据,获取成交量 -
subscribe(symbols=context.symbol, frequency='1d', count=2) -
def on_bar(context, bars): -
data = context.data(symbol=context.symbol, frequency='1d', count=2) # 获取订阅的数据(最近2日) -
if (data['close'].iloc[-2] > data['open'].iloc[-2]) and \ -
(data['open'].iloc[-1] > data['close'].iloc[-2]) and \ -
(data['close'].iloc[-1] < ((data['close'].iloc[-2] - data['open'].iloc[-2])/2 + data['open'].iloc[-2])): -
order_target_volume(symbol=context.symbol, volume=0, position_side=PositionSide_Long, -
order_type=OrderType_Market) -
if __name__ == '__main__': -
run(strategy_id='请输入你的策略id', -
filename='main.py', -
mode=MODE_BACKTEST, -
token='请输入你的token', -
backtest_start_time='2020-12-01 08:00:00', -
backtest_end_time='2020-12-20 15:00:00', -
backtest_adjust=ADJUST_PREV, -
backtest_initial_cash=10000000, -
backtest_commission_ratio=0.0001, -
backtest_slippage_ratio=0.0001 -
) -
# 例12:双均线选股 -
# 通达信公式: -
# MA1: = MA(CLOSE,5) -
# MA2: = MA(CLOSE,10) -
# XG: C > 1.005 * MA2 AND CROSS(MA1,MA2) AND MA1 > MA2 -
# 掘金python: -
def init(context): -
# 定义标的 -
context.symbol = 'SHSE.600519' -
# 订阅bar数据,获取成交量 -
subscribe(symbols=context.symbol, frequency='1d', count=20) -
def on_bar(context, bars): -
data = context.data(symbol=context.symbol, frequency='1d', count=20) # 获取订阅的数据(最近20日) -
close = data['close'] -
# 利用talib库计算长短周期均线 -
ma1 = talib.SMA(close.values.reshape(20), 5) -
ma2 = talib.SMA(close.values.reshape(20), 10) -
# 如果满足条件,则买入100股 -
if (close.iloc[-1] > 1.005 * ma2.iloc[-1]) and (ma1.iloc[-2] < ma2.iloc[-2])\ -
and (ma1.iloc[-1] > ma2.iloc[-1]): -
order_volume(symbol=context.symbol, volume=100, side=OrderSide_Buy, order_type=OrderType_Market, -
position_effect=PositionEffect_Open) -
if __name__ == '__main__': -
run(strategy_id='请输入你的策略id', -
filename='main.py', -
mode=MODE_BACKTEST, -
token='请输入你的token', -
backtest_start_time='2020-12-01 08:00:00', -
backtest_end_time='2020-12-20 15:00:00', -
backtest_adjust=ADJUST_PREV, -
backtest_initial_cash=10000000, -
backtest_commission_ratio=0.0001, -
backtest_slippage_ratio=0.0001 -
) -
#例13:黄昏之星出现,平仓 -
#通达信公式: -
# a1:=open -
# a2:=close -
# a3:=high -
# b1:=ref(open,1) -
# b2:=ref(close,1) -
# b3:=ref(high,1) -
# b4:=ref(low,1) -
# c1:=ref(open,2) -
# c2:=ref(close,2) -
# c3:=ref(high,2) -
# c4:=ref(low,2) -
# aa:=a1<b2 and a1/a2>1.04 -
# bb:=b1>c3 and b2>c3 and abs(b1-b2)/b1<0.01 and b3>b1 and # b3>b2 and b4<b1 and b4<b2 and b3=hhv(high,20) -
# cc:=c2/ref(close,3)>1.04 and c2>c1 -
# aa and bb and cc -
# 掘金python: -
def init(context): -
# 定义标的 -
context.symbol = 'SHSE.600519' -
# 订阅bar数据,获取成交量 -
subscribe(symbols=context.symbol, frequency='1d', count=3) -
def on_bar(context, bars): -
data = context.data(symbol=context.symbol, frequency='1d', count=3) # 获取订阅的数据(最近20日) -
# 提取a1,a2,a3,b1,b2,b3,b4,c1,c2,c3,c4 -
a1 = data['open'].iloc[-1] -
a2 = data['close'].iloc[-1] -
b1 = data['open'].iloc[-2] -
b2 = data['close'].iloc[-2] -
b3 = data['high'].iloc[-2] -
b4 = data['low'].iloc[-2] -
c1 = data['open'].iloc[-3] -
c2 = data['close'].iloc[-3] -
c3 = data['high'].iloc[-3] -
# 如果满足条件,则买入100股 -
if (a1 < b2) and (a1/a2 > 1.04) and \ -
(b1 > c3) and (b2 > c3) and (np.abs(b1-b2)/b1 < 0.01) and (b3 > b1) and (b4 < b1) and (b4 < b2) and (b3 == data['high'].iloc[-20:]) \ -
and (c2/data['close'].iloc[-4] > 1.04) and (c2 > c1): -
order_volume(symbol=context.symbol, volume=100, side=OrderSide_Buy, order_type=OrderType_Market, -
position_effect=PositionEffect_Open) -
if __name__ == '__main__': -
run(strategy_id='请输入你的策略id', -
filename='main.py', -
mode=MODE_BACKTEST, -
token='请输入你的token', -
backtest_start_time='2020-12-01 08:00:00', -
backtest_end_time='2020-12-20 15:00:00', -
backtest_adjust=ADJUST_PREV, -
backtest_initial_cash=10000000, -
backtest_commission_ratio=0.0001, -
backtest_slippage_ratio=0.0001 -
) -
# 例14:突破底部横盘整理创新高——买入100股 -
# 对应通达信公式 -
# V1:=MA(VOL,5); -
# V2:=VOL/REF(V1,1)>2; -
# PZ1:=MA(CLOSE,M); -
# PZ2:=HHV(HIGH,M); -
# PZ3:=LLV(LOW,M); -
# PZ4:=(PZ2-PZ1)/PZ1; -
# PZ5:=(PZ1-PZ3)/PZ1; -
# PZ:=REF(PZ4,1)<0.15 AND REF(PZ5,1)<0.15; -
# TP1:HHV(HIGH,M); -
# TP:=HIGH=TP1; -
# V2 AND PZ AND TP; -
# 掘金python: -
def init(context): -
# 定义标的 -
context.symbol = 'SHSE.600519' -
# 订阅bar数据,获取成交量 -
subscribe(symbols=context.symbol, frequency='1d', count=200) -
def on_bar(context, bars): -
data = context.data(symbol=context.symbol, frequency='1d', count=200) -
# 计算今量/昨日的5日均量 -
v2 = data['volume'].iloc[-1]/np.mean(data['volume'].iloc[-6:-1]) -
# 计算昨日150日最高价和150日均价的距离的百分比 -
pz1 = np.mean(data['close'].iloc[-151:-1]) # 昨日的150日均价 -
pz2 = np.max(data['high'].iloc[-151:-1]) # 昨日的150日最高价 -
pz3 = np.max(data['high'].iloc[-151:-1]) # 昨日的150日最低价 -
pz4 = (pz2-pz1)/pz1 -
pz5 = (pz1-pz3)/pz1 -
# 进入判断条件:V2 AND PZ AND TP -
if (v2 > 2) and (pz4 < 0.15) and (pz5 < 0.15) and (data['high'].iloc[-1] == np.max(data['high'].iloc[-151:-1])): -
order_volume(symbol=context.symbol, volume=100, side=OrderSide_Buy, order_type=OrderType_Market, -
position_effect=PositionEffect_Open) -
if __name__ == '__main__': -
run(strategy_id='请输入你的策略id', -
filename='main.py', -
mode=MODE_BACKTEST, -
token='请输入你的token', -
backtest_start_time='2020-12-01 08:00:00', -
backtest_end_time='2020-12-20 15:00:00', -
backtest_adjust=ADJUST_PREV, -
backtest_initial_cash=10000000, -
backtest_commission_ratio=0.0001, -
backtest_slippage_ratio=0.0001 -
)
更多推荐



所有评论(0)