【掘金使用技巧7】如何从通达信等迁移到掘金

本文针对从通达信软件转向掘金平台的用户,介绍了如何在掘金框架中使用Python编写交易策略。通过一系列示例,详细解释了如何将通达信中的公式转换为Python语言,包括数据订阅、数据处理、条件判断和下单操作,帮助用户快速上手掘金的Python量化交易系统。
摘要由CSDN通过智能技术生成

引言

一些用户是从通达信等软件上切换过来的,对于掘金框架及python语言不是很了解,很难上手。对此,小编整理了一些基本要点以及一些简单的示例,希望对大家有帮助。

从结构开始说起

通达信这类软件在编写公式之前首先要确定一个频率,是日线级别、分钟级别还是其他级别,然后再定义公式,这个选择的过程对应掘金python语句中的订阅函数(subscribe)。如果在通达信中选择日线频率,在掘金中就订阅’1d’频率。(特别说明,掘金除了bar数据,还支持tick级别的数据,用户可以在更高频率下编写策略)。

 
  1. def init(context):

  2. # 定义标的

  3. context.symbol = 'SHSE.600519'

  4. # 订阅bar数据,获取成交量

  5. 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[‘字段名’]的形式。

 
  1. high = data['high'] # 最高价

  2. close = data['close'] # 收盘价

  3. low = data['low'] # 最低价

  4. 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倍,则买入1手

  2. # 通达信: VOL/REF(VOL,1)>2

  3. # 掘金python

  4.  
  5. def init(context):

  6. # 定义标的

  7. context.symbol = 'SHSE.600519'

  8. # 订阅bar数据,获取成交量

  9. subscribe(symbols=context.symbol, frequency='1d', count=2)

  10.  
  11.  
  12. def on_bar(context, bars):

  13. data = context.data(symbol=context.symbol, frequency='1d', count=2) # 获取订阅的数据

  14. vol_today = data['volume'].iloc[-1] # 昨日成交量

  15. vol_yesterday = data['volume'].iloc[-2] # 今日成交量

  16.  
  17. if vol_today/vol_yesterday > 2:

  18. order_volume(symbol=context.symbol, volume=100, side=OrderSide_Buy, order_type=OrderType_Market,

  19. position_effect=PositionEffect_Open)

  20.  
  21. if __name__ == '__main__':

  22. run(strategy_id='请输入你的策略id',

  23. filename='main.py',

  24. mode=MODE_BACKTEST,

  25. token='请输入你的token',

  26. backtest_start_time='2020-12-01 08:00:00',

  27. backtest_end_time='2020-12-20 15:00:00',

  28. backtest_adjust=ADJUST_PREV,

  29. backtest_initial_cash=10000000,

  30. backtest_commission_ratio=0.0001,

  31. backtest_slippage_ratio=0.0001

  32. )

这就是一个简单的示例。

还有一些简单的练习,使用者可以参考一下。

 
  1. # 例1:今天5日均量比昨天的5日均量放大了1倍,则买入1手

  2. # 通达信: AA:=MA(VOL,5) BB:REF(AA,1) AA/BB > 2

  3. # 掘金python

  4. def init(context):

  5. # 定义标的

  6. context.symbol = 'SHSE.600519'

  7. # 订阅bar数据,获取成交量

  8. subscribe(symbols=context.symbol, frequency='1d', count=6)

  9.  
  10.  
  11. def on_bar(context, bars):

  12. data = context.data(symbol=context.symbol, frequency='1d', count=6) # 获取订阅的数据

  13. vol_today_mean = np.mean(data['volume'].iloc[-1:-5]) # 昨日成交量

  14. vol_yesterday_mean = np.mean(data['volume'].iloc[-2:-6]) # 今日成交量

  15.  
  16. if vol_today_mean/vol_yesterday_mean > 2:

  17. order_volume(symbol=context.symbol, volume=100, side=OrderSide_Buy, order_type=OrderType_Market,

  18. position_effect=PositionEffect_Open)

  19.  
  20. if __name__ == '__main__':

  21. run(strategy_id='请输入你的策略id',

  22. filename='main.py',

  23. mode=MODE_BACKTEST,

  24. token='请输入你的token',

  25. backtest_start_time='2020-12-01 08:00:00',

  26. backtest_end_time='2020-12-20 15:00:00',

  27. backtest_adjust=ADJUST_PREV,

  28. backtest_initial_cash=10000000,

  29. backtest_commission_ratio=0.0001,

  30. backtest_slippage_ratio=0.0001

  31. )

  32.  
  33. # 例2:连续3天增量1倍以上,则买入1手

  34. # 通达信:EVERY(V>= REF(V,1)*2,3)

  35. # 掘金python

  36. def init(context):

  37. # 定义标的

  38. context.symbol = 'SHSE.600519'

  39. # 订阅bar数据,获取成交量

  40. subscribe(symbols=context.symbol, frequency='1d', count=6)

  41.  
  42.  
  43. def on_bar(context, bars):

  44. data = context.data(symbol=context.symbol, frequency='1d', count=6) # 获取订阅的数据

  45. data['vol_change'] = data['volume'] - data.volume.shift(1) # 计算增量

  46.  
  47. if np.all(data['vol_change'].iloc[-3:] > data.volume.shift(1).iloc[-3:])*2: # 等价于 EVERY(V>= REF(V,1)*2,3)

  48. order_volume(symbol=context.symbol, volume=100, side=OrderSide_Buy, order_type=OrderType_Market,

  49. position_effect=PositionEffect_Open)

  50.  
  51. if __name__ == '__main__':

  52. run(strategy_id='请输入你的策略id',

  53. filename='main.py',

  54. mode=MODE_BACKTEST,

  55. token='请输入你的token',

  56. backtest_start_time='2020-12-01 08:00:00',

  57. backtest_end_time='2020-12-20 15:00:00',

  58. backtest_adjust=ADJUST_PREV,

  59. backtest_initial_cash=10000000,

  60. backtest_commission_ratio=0.0001,

  61. backtest_slippage_ratio=0.0001

  62. )

  63.  
  64.  
  65. # 例3:涨幅达到7%以上,则买入1手

  66. # 通达信:CLOSE/REF(CLOSE,1) > 1.07

  67. # 掘金python

  68. def init(context):

  69. # 定义标的

  70. context.symbol = 'SHSE.600519'

  71. # 订阅bar数据,获取成交量

  72. subscribe(symbols=context.symbol, frequency='1d', count=2)

  73.  
  74.  
  75. def on_bar(context, bars):

  76. data = context.data(symbol=context.symbol, frequency='1d', count=2) # 获取订阅的数据

  77. data['price_change'] = data['close'] - data['close'].shift(1) # 计算涨幅或跌幅

  78.  
  79. if data['price_change'].iloc[-1] > 0.07: # 等价于 CLOSE/REF(CLOSE,1) > 1.07

  80. order_volume(symbol=context.symbol, volume=100, side=OrderSide_Buy, order_type=OrderType_Market,

  81. position_effect=PositionEffect_Open)

  82.  
  83. if __name__ == '__main__':

  84. run(strategy_id='请输入你的策略id',

  85. filename='main.py',

  86. mode=MODE_BACKTEST,

  87. token='请输入你的token',

  88. backtest_start_time='2020-12-01 08:00:00',

  89. backtest_end_time='2020-12-20 15:00:00',

  90. backtest_adjust=ADJUST_PREV,

  91. backtest_initial_cash=10000000,

  92. backtest_commission_ratio=0.0001,

  93. backtest_slippage_ratio=0.0001

  94. )

  95.  
  96. # 例4:向上跳空,则买入1手

  97. # 通达信:OPEN>REF(HIGH,1)

  98. # 掘金python

  99. def init(context):

  100. # 定义标的

  101. context.symbol = 'SHSE.600519'

  102. # 订阅bar数据,获取成交量

  103. subscribe(symbols=context.symbol, frequency='1d', count=2)

  104.  
  105.  
  106. def on_bar(context, bars):

  107. data = context.data(symbol=context.symbol, frequency='1d', count=2) # 获取订阅的数据

  108.  
  109. if data['open'].iloc[-1] > data['close'].iloc[-2]: # 等价于 OPEN>REF(HIGH,1)

  110. order_volume(symbol=context.symbol, volume=100, side=OrderSide_Buy, order_type=OrderType_Market,

  111. position_effect=PositionEffect_Open)

  112.  
  113. if __name__ == '__main__':

  114. run(strategy_id='请输入你的策略id',

  115. filename='main.py',

  116. mode=MODE_BACKTEST,

  117. token='请输入你的token',

  118. backtest_start_time='2020-12-01 08:00:00',

  119. backtest_end_time='2020-12-20 15:00:00',

  120. backtest_adjust=ADJUST_PREV,

  121. backtest_initial_cash=10000000,

  122. backtest_commission_ratio=0.0001,

  123. backtest_slippage_ratio=0.0001

  124. )

  125.  
  126. # 例5:收盘价 > 1日前的25日内收盘价的最低值,则买入1手

  127. # 通达信:c > ref(llv(c,25),1)

  128. # 掘金python

  129. def init(context):

  130. # 定义标的

  131. context.symbol = 'SHSE.600519'

  132. # 订阅bar数据,获取成交量

  133. subscribe(symbols=context.symbol, frequency='1d', count=25)

  134.  
  135.  
  136. def on_bar(context, bars):

  137. data = context.data(symbol=context.symbol, frequency='1d', count=25) # 获取订阅的数据

  138.  
  139. if data['close'].iloc[-1] <= data['close'].iloc[-2:].min(): # 等价于c > ref(llv(c,25),1)

  140. order_volume(symbol=context.symbol, volume=100, side=OrderSide_Buy, order_type=OrderType_Market,

  141. position_effect=PositionEffect_Open)

  142.  
  143. if __name__ == '__main__':

  144. run(strategy_id='请输入你的策略id',

  145. filename='main.py',

  146. mode=MODE_BACKTEST,

  147. token='请输入你的token',

  148. backtest_start_time='2020-12-01 08:00:00',

  149. backtest_end_time='2020-12-20 15:00:00',

  150. backtest_adjust=ADJUST_PREV,

  151. backtest_initial_cash=10000000,

  152. backtest_commission_ratio=0.0001,

  153. backtest_slippage_ratio=0.0001

  154. )

  155.  
  156. # 例6:横盘整理时(10日收盘价振幅在5%以内波动)清仓

  157. # 通达信:(HHV(CLOSE,10)-LLV(CLOSE,10))/CLOSE < 0.05

  158. # 掘金python

  159. def init(context):

  160. # 定义标的

  161. context.symbol = 'SHSE.600519'

  162. # 订阅bar数据,获取成交量

  163. subscribe(symbols=context.symbol, frequency='1d', count=10)

  164.  
  165.  
  166. def on_bar(context, bars):

  167. data = context.data(symbol=context.symbol, frequency='1d', count=10) # 获取订阅的数据(最近10日)

  168.  
  169. if (data['close'].max() - data['close'].min())/data['close'].iloc[-1] < 0.05: # (HHV(CLOSE,10)-LLV(CLOSE,10))/CLOSE < 0.05

  170. order_target_volume(symbol=context.symbol, volume=0, position_side=PositionSide_Long,

  171. order_type=OrderType_Market)

  172.  
  173. if __name__ == '__main__':

  174. run(strategy_id='请输入你的策略id',

  175. filename='main.py',

  176. mode=MODE_BACKTEST,

  177. token='请输入你的token',

  178. backtest_start_time='2020-12-01 08:00:00',

  179. backtest_end_time='2020-12-20 15:00:00',

  180. backtest_adjust=ADJUST_PREV,

  181. backtest_initial_cash=10000000,

  182. backtest_commission_ratio=0.0001,

  183. backtest_slippage_ratio=0.0001

  184. )

  185.  
  186.  
  187. # 例7:阴转阳,买入1手

  188. # 通达信公式:ref(c,1) < ref(o,1) and c > 0

  189. # 掘金python:

  190. def init(context):

  191. # 定义标的

  192. context.symbol = 'SHSE.600519'

  193. # 订阅bar数据,获取成交量

  194. subscribe(symbols=context.symbol, frequency='1d', count=2)

  195.  
  196.  
  197. def on_bar(context, bars):

  198. data = context.data(symbol=context.symbol, frequency='1d', count=2) # 获取订阅的数据(最近10日)

  199.  
  200. if (data['close'].iloc[-2] < data['open'].iloc[-2]) and \

  201. (data['close'].iloc[-1] > data['open'].iloc[-1]): # (HHV(CLOSE,10)-LLV(CLOSE,10))/CLOSE < 0.05

  202. order_volume(symbol=context.symbol, volume=100, side=OrderSide_Buy, order_type=OrderType_Market,

  203. position_effect=PositionEffect_Open)

  204.  
  205. if __name__ == '__main__':

  206. run(strategy_id='请输入你的策略id',

  207. filename='main.py',

  208. mode=MODE_BACKTEST,

  209. token='请输入你的token',

  210. backtest_start_time='2020-12-01 08:00:00',

  211. backtest_end_time='2020-12-20 15:00:00',

  212. backtest_adjust=ADJUST_PREV,

  213. backtest_initial_cash=10000000,

  214. backtest_commission_ratio=0.0001,

  215. backtest_slippage_ratio=0.0001

  216. )

  217.  
  218. # 例8:当前价格上穿20日均线,买入1手

  219. # 通达信公式:cross(c,ma(c,20))

  220. # 掘金python:

  221. def init(context):

  222. # 定义标的

  223. context.symbol = 'SHSE.600519'

  224. # 订阅bar数据,获取成交量

  225. subscribe(symbols=context.symbol, frequency='1d', count=21)

  226.  
  227.  
  228. def on_bar(context, bars):

  229. data = context.data(symbol=context.symbol, frequency='1d', count=21) # 获取订阅的数据(最近21日)

  230. data['MA20'] = data['close'].rolling(20).mean()

  231. if (data['close'].iloc[-1] > data['MA20'].iloc[-1]) and (data['close'].iloc[-2] < data['MA20'].iloc[-2]): # cross(c,ma(c,20))

  232. order_volume(symbol=context.symbol, volume=100, side=OrderSide_Buy, order_type=OrderType_Market,

  233. position_effect=PositionEffect_Open)

  234.  
  235. if __name__ == '__main__':

  236. run(strategy_id='请输入你的策略id',

  237. filename='main.py',

  238. mode=MODE_BACKTEST,

  239. token='请输入你的token',

  240. backtest_start_time='2020-12-01 08:00:00',

  241. backtest_end_time='2020-12-20 15:00:00',

  242. backtest_adjust=ADJUST_PREV,

  243. backtest_initial_cash=10000000,

  244. backtest_commission_ratio=0.0001,

  245. backtest_slippage_ratio=0.0001

  246. )

  247.  
  248. # 例9:金叉买入:5日均线上穿20日均线,买入1手

  249. # 通达信公式:cross(ma(c,5),ma(c,20))

  250. # 掘金python:

  251. def init(context):

  252. # 定义标的

  253. context.symbol = 'SHSE.600519'

  254. # 订阅bar数据,获取成交量

  255. subscribe(symbols=context.symbol, frequency='1d', count=21)

  256.  
  257.  
  258. def on_bar(context, bars):

  259. data = context.data(symbol=context.symbol, frequency='1d', count=21) # 获取订阅的数据(最近21日)

  260. data['MA5'] = data['close'].rolling(5).mean() # 求5日均线

  261. data['MA20'] = data['close'].rolling(20).mean() # 求20日均线

  262. 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))

  263. order_volume(symbol=context.symbol, volume=100, side=OrderSide_Buy, order_type=OrderType_Market,

  264. position_effect=PositionEffect_Open)

  265.  
  266. if __name__ == '__main__':

  267. run(strategy_id='请输入你的策略id',

  268. filename='main.py',

  269. mode=MODE_BACKTEST,

  270. token='请输入你的token',

  271. backtest_start_time='2020-12-01 08:00:00',

  272. backtest_end_time='2020-12-20 15:00:00',

  273. backtest_adjust=ADJUST_PREV,

  274. backtest_initial_cash=10000000,

  275. backtest_commission_ratio=0.0001,

  276. backtest_slippage_ratio=0.0001

  277. )

  278.  
  279. # 例10:下影线长于上影线,买入1手

  280. # 通达信公式:(c-l) > (h-c)

  281. # 掘金python:

  282. def init(context):

  283. # 定义标的

  284. context.symbol = 'SHSE.600519'

  285. # 订阅bar数据,获取成交量

  286. subscribe(symbols=context.symbol, frequency='1d', count=10)

  287.  
  288.  
  289. def on_bar(context, bars):

  290. data = context.data(symbol=context.symbol, frequency='1d', count=10) # 获取订阅的数据(最近21日)

  291. if (data['close'].iloc[-1] - data['low'].iloc[-1] > data['high'].iloc[-1] - data['close'].iloc[-1]) > 0:

  292. # 等价于 (c-l) > (h-c)

  293. order_volume(symbol=context.symbol, volume=100, side=OrderSide_Buy, order_type=OrderType_Market,

  294. position_effect=PositionEffect_Open)

  295.  
  296. if __name__ == '__main__':

  297. run(strategy_id='请输入你的策略id',

  298. filename='main.py',

  299. mode=MODE_BACKTEST,

  300. token='请输入你的token',

  301. backtest_start_time='2020-12-01 08:00:00',

  302. backtest_end_time='2020-12-20 15:00:00',

  303. backtest_adjust=ADJUST_PREV,

  304. backtest_initial_cash=10000000,

  305. backtest_commission_ratio=0.0001,

  306. backtest_slippage_ratio=0.0001

  307. )

  308.  
  309.  
  310. # 例11:乌云压顶则清仓

  311. # 通达信公式:

  312. # AA:=REF(C,1) > REF(O,1) # 昨日收阳

  313. # BB:=O>REF(C,1) # 高开

  314. # CC:=C<(REF(C,1)-REF(O,1))/2+REF(O,1) # 盖顶低收

  315. # DD:IF(AA AND BB AND CC,1,0)

  316. # 掘金python:

  317. def init(context):

  318. # 定义标的

  319. context.symbol = 'SHSE.600519'

  320. # 订阅bar数据,获取成交量

  321. subscribe(symbols=context.symbol, frequency='1d', count=2)

  322.  
  323.  
  324. def on_bar(context, bars):

  325. data = context.data(symbol=context.symbol, frequency='1d', count=2) # 获取订阅的数据(最近2日)

  326. if (data['close'].iloc[-2] > data['open'].iloc[-2]) and \

  327. (data['open'].iloc[-1] > data['close'].iloc[-2]) and \

  328. (data['close'].iloc[-1] < ((data['close'].iloc[-2] - data['open'].iloc[-2])/2 + data['open'].iloc[-2])):

  329. order_target_volume(symbol=context.symbol, volume=0, position_side=PositionSide_Long,

  330. order_type=OrderType_Market)

  331.  
  332.  
  333. if __name__ == '__main__':

  334. run(strategy_id='请输入你的策略id',

  335. filename='main.py',

  336. mode=MODE_BACKTEST,

  337. token='请输入你的token',

  338. backtest_start_time='2020-12-01 08:00:00',

  339. backtest_end_time='2020-12-20 15:00:00',

  340. backtest_adjust=ADJUST_PREV,

  341. backtest_initial_cash=10000000,

  342. backtest_commission_ratio=0.0001,

  343. backtest_slippage_ratio=0.0001

  344. )

  345.  
  346.  
  347. # 例12:双均线选股

  348. # 通达信公式:

  349. # MA1: = MA(CLOSE,5)

  350. # MA2: = MA(CLOSE,10)

  351. # XG: C > 1.005 * MA2 AND CROSS(MA1,MA2) AND MA1 > MA2

  352. # 掘金python:

  353. def init(context):

  354. # 定义标的

  355. context.symbol = 'SHSE.600519'

  356. # 订阅bar数据,获取成交量

  357. subscribe(symbols=context.symbol, frequency='1d', count=20)

  358.  
  359.  
  360. def on_bar(context, bars):

  361. data = context.data(symbol=context.symbol, frequency='1d', count=20) # 获取订阅的数据(最近20日)

  362. close = data['close']

  363. # 利用talib库计算长短周期均线

  364. ma1 = talib.SMA(close.values.reshape(20), 5)

  365. ma2 = talib.SMA(close.values.reshape(20), 10)

  366. # 如果满足条件,则买入100股

  367. if (close.iloc[-1] > 1.005 * ma2.iloc[-1]) and (ma1.iloc[-2] < ma2.iloc[-2])\

  368. and (ma1.iloc[-1] > ma2.iloc[-1]):

  369. order_volume(symbol=context.symbol, volume=100, side=OrderSide_Buy, order_type=OrderType_Market,

  370. position_effect=PositionEffect_Open)

  371.  
  372.  
  373. if __name__ == '__main__':

  374. run(strategy_id='请输入你的策略id',

  375. filename='main.py',

  376. mode=MODE_BACKTEST,

  377. token='请输入你的token',

  378. backtest_start_time='2020-12-01 08:00:00',

  379. backtest_end_time='2020-12-20 15:00:00',

  380. backtest_adjust=ADJUST_PREV,

  381. backtest_initial_cash=10000000,

  382. backtest_commission_ratio=0.0001,

  383. backtest_slippage_ratio=0.0001

  384. )

  385.  
  386.  
  387. #例13:黄昏之星出现,平仓

  388. #通达信公式:

  389. # a1:=open

  390. # a2:=close

  391. # a3:=high

  392. # b1:=ref(open,1)

  393. # b2:=ref(close,1)

  394. # b3:=ref(high,1)

  395. # b4:=ref(low,1)

  396. # c1:=ref(open,2)

  397. # c2:=ref(close,2)

  398. # c3:=ref(high,2)

  399. # c4:=ref(low,2)

  400. # aa:=a1<b2 and a1/a2>1.04

  401. # 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)

  402. # cc:=c2/ref(close,3)>1.04 and c2>c1

  403. # aa and bb and cc

  404. # 掘金python:

  405. def init(context):

  406. # 定义标的

  407. context.symbol = 'SHSE.600519'

  408. # 订阅bar数据,获取成交量

  409. subscribe(symbols=context.symbol, frequency='1d', count=3)

  410.  
  411.  
  412. def on_bar(context, bars):

  413. data = context.data(symbol=context.symbol, frequency='1d', count=3) # 获取订阅的数据(最近20日)

  414. # 提取a1,a2,a3,b1,b2,b3,b4,c1,c2,c3,c4

  415. a1 = data['open'].iloc[-1]

  416. a2 = data['close'].iloc[-1]

  417. b1 = data['open'].iloc[-2]

  418. b2 = data['close'].iloc[-2]

  419. b3 = data['high'].iloc[-2]

  420. b4 = data['low'].iloc[-2]

  421. c1 = data['open'].iloc[-3]

  422. c2 = data['close'].iloc[-3]

  423. c3 = data['high'].iloc[-3]

  424.  
  425. # 如果满足条件,则买入100股

  426. if (a1 < b2) and (a1/a2 > 1.04) and \

  427. (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:]) \

  428. and (c2/data['close'].iloc[-4] > 1.04) and (c2 > c1):

  429. order_volume(symbol=context.symbol, volume=100, side=OrderSide_Buy, order_type=OrderType_Market,

  430. position_effect=PositionEffect_Open)

  431.  
  432.  
  433. if __name__ == '__main__':

  434. run(strategy_id='请输入你的策略id',

  435. filename='main.py',

  436. mode=MODE_BACKTEST,

  437. token='请输入你的token',

  438. backtest_start_time='2020-12-01 08:00:00',

  439. backtest_end_time='2020-12-20 15:00:00',

  440. backtest_adjust=ADJUST_PREV,

  441. backtest_initial_cash=10000000,

  442. backtest_commission_ratio=0.0001,

  443. backtest_slippage_ratio=0.0001

  444. )

  445.  
  446. # 例14:突破底部横盘整理创新高——买入100股

  447. # 对应通达信公式

  448. # V1:=MA(VOL,5);

  449. # V2:=VOL/REF(V1,1)>2;

  450. # PZ1:=MA(CLOSE,M);

  451. # PZ2:=HHV(HIGH,M);

  452. # PZ3:=LLV(LOW,M);

  453. # PZ4:=(PZ2-PZ1)/PZ1;

  454. # PZ5:=(PZ1-PZ3)/PZ1;

  455. # PZ:=REF(PZ4,1)<0.15 AND REF(PZ5,1)<0.15;

  456. # TP1:HHV(HIGH,M);

  457. # TP:=HIGH=TP1;

  458. # V2 AND PZ AND TP;

  459. # 掘金python:

  460. def init(context):

  461. # 定义标的

  462. context.symbol = 'SHSE.600519'

  463. # 订阅bar数据,获取成交量

  464. subscribe(symbols=context.symbol, frequency='1d', count=200)

  465.  
  466.  
  467. def on_bar(context, bars):

  468. data = context.data(symbol=context.symbol, frequency='1d', count=200)

  469. # 计算今量/昨日的5日均量

  470. v2 = data['volume'].iloc[-1]/np.mean(data['volume'].iloc[-6:-1])

  471. # 计算昨日150日最高价和150日均价的距离的百分比

  472. pz1 = np.mean(data['close'].iloc[-151:-1]) # 昨日的150日均价

  473. pz2 = np.max(data['high'].iloc[-151:-1]) # 昨日的150日最高价

  474. pz3 = np.max(data['high'].iloc[-151:-1]) # 昨日的150日最低价

  475. pz4 = (pz2-pz1)/pz1

  476. pz5 = (pz1-pz3)/pz1

  477.  
  478. # 进入判断条件:V2 AND PZ AND TP

  479. if (v2 > 2) and (pz4 < 0.15) and (pz5 < 0.15) and (data['high'].iloc[-1] == np.max(data['high'].iloc[-151:-1])):

  480. order_volume(symbol=context.symbol, volume=100, side=OrderSide_Buy, order_type=OrderType_Market,

  481. position_effect=PositionEffect_Open)

  482.  
  483.  
  484. if __name__ == '__main__':

  485. run(strategy_id='请输入你的策略id',

  486. filename='main.py',

  487. mode=MODE_BACKTEST,

  488. token='请输入你的token',

  489. backtest_start_time='2020-12-01 08:00:00',

  490. backtest_end_time='2020-12-20 15:00:00',

  491. backtest_adjust=ADJUST_PREV,

  492. backtest_initial_cash=10000000,

  493. backtest_commission_ratio=0.0001,

  494. backtest_slippage_ratio=0.0001

  495. )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值