聽說震驚體很吸引眼球,今天我也來試一試🤪html
本系列全部文章的開頭都會用一兩句話總結一下對應文章的內容。對這個話題感興趣的話能夠繼續往下讀,不感興趣能夠直接關掉,毫不浪費讀者的時間。python
本篇文章用Python
實現了一個簡單的自動交易腳本,產生交易時會自動經過微信通知。git
涉及概念 | 概念內容 |
---|---|
Python 庫 |
Wechaty |
主要概念 | 量化交易、微信機器人 |
7
月份大A
股的好行情想必你們都印象深入,甚至有人預言A
股五六年一個週期的大牛市即將開啓。程序員
結果你們已經看到了,但且不論開啓沒開啓,反正當時大多數人的腦子都挺熱的,這固然也包括我。不過,回顧我悲慘的投資經歷,「追漲殺跌」這四個字是一個很好的總結😂。github
這就難辦了,眼睜睜看着別人賺錢翻倍,我不賺錢都至關因而虧錢。服務器
我深知我每次的交易決策都是自身情緒的反映,而每每情緒化交易的後果就是追漲殺跌虧錢。那麼問題來了,怎麼才能管得住我這雙虧錢的手?其中一個答案多是量化交易。微信
量化交易其實不是很高深的概念。markdown
一個量化交易軟件會嚴格按照已經定義好的交易策略進行買入賣出操做,這些操做完徹底全由策略觸發,不受人爲控制。框架
最簡單的交易策略有雙均值策略、網格交易策略等。async
這簡直就是爲我設計的交易方式啊,媽媽不再用擔憂個人臭手了。
網上現成的量化交易框架不少,但學習這些框架可能須要比較長的時間。反正我就是想簡單測試一下,順便熟悉一下策略的機制,因而直接徒手寫一個吧。
到底啥叫網格交易?網格交易能夠簡單地理解爲:
把價格的波動區間放到以一個設定好的網格里,資金分紅多份,價格每跌一格就買一份,每漲一格就賣一份。一份買入對應一份賣出,買賣交易之間只賺一格網格的差價。
看起來這正是我須要的。網格交易比較適用於震盪頻率較高幅度較大的標的;一次只賺一格的錢,聚沙成塔;把錢分爲若干份,雖然利用率變低了,但也下降了風險。
說幹就幹,我決定測試一下網格交易策略效果如何。
首先須要預先定義一個震盪區間和網格數,我把這些須要預先定義的參數都放置到專門的配置文件裏:
lowest = 2.5 # 網格最低價格
highest = 3.5 # 網格最高價格
parts = 20 # 網格數
start_value = 300.0 # 帳戶初始資金
timespan = 15 # 每15秒檢測一次標的價格
wechat_reminder = 1 # 是否經過微信通知(1:是,0:否)
mail_reminder = 0 # 是否經過郵件通知(1:是,0:否)
mail_list = ['mailbox1', ] # 須要通知的郵箱列表
複製代碼
初始化時,腳本會根據配置來設置當前的網格:
# 每一格的高度
price_part_value = (highest - lowest) / parts
# 每變更一格對應的持倉百分比
percent_part_value = 1 / parts
# 全部網格的標記價格
price_levels = [round(highest - index * price_part_value, 4) for index in range(parts + 1)]
price_levels[-1] = lowest
# 每一格對應的總體持倉百分比
percent_levels = [round(0 + index * percent_part_value, 4) for index in range(parts + 1)]
percent_levels[-1] = 1.0000
複製代碼
配置完成後須要根據標的當前價格建底倉:
# 若是當前價格比網格最低價格高則按照網格計算建倉層數,反之直接全倉
# order_target_percent根據target的符號及數值判斷買入仍是賣出,並下單交易
if float(close) > price_levels[0]:
pos = [close > level for level in price_levels]
i = pos.index(False) - 1
last_price_index = i
target = percent_levels[last_price_index] - last_percent
if target != 0.0:
return True, order_target_percent(float(close), depth, target, date=date)
else:
return True, order_target_percent(float(close), depth, 1.0, date=date)
複製代碼
而後每次標的價格穿越網格時執行對應的操做:
signal = False
while True:
upper = None
lower = None
if last_price_index > 0:
upper = price_levels[last_price_index - 1]
if last_price_index < len(price_levels) - 1:
lower = price_levels[last_price_index + 1]
# 還不是最輕倉,繼續漲,就再賣一檔
if upper and float(close) > upper:
last_price_index = last_price_index - 1
signal = True
continue
# 還不是最重倉,繼續跌,再買一檔
if lower and float(close) < lower:
last_price_index = last_price_index + 1
signal = True
continue
break
if signal:
target = percent_levels[last_price_index] - last_percent
if target != 0.0:
return True, order_target_percent(float(close), depth, target, date=date)
else:
return False, []
複製代碼
到這裏一個最簡單但很完整的網格交易策略就寫好了。固然了,實時價格的獲取以及交易操做的實現須要讀者本身去實現了。
【本文來自微信公衆號Titus的小宇宙
,ID
爲TitusCosmos
,轉載請註明!】
【爲了防止網上各類爬蟲一通亂爬還故意刪除原做者信息,故在文章中間加入做者信息,還望各位讀者理解】
看過我以前文章的讀者都知道,我寫的全部關於微信機器人的文章全都是用的ItChat
。這個庫只支持能登陸網頁版微信的微信號,2017
年以前沒有登錄過網頁版微信的微信號和2017
年以後申請的新微信號基本上都不能用,侷限性太大!讀者能夠打開網頁版微信官網https://wx.qq.com/
查看本身是否可使用網頁版微信。
通過我不懈的尋找,終於找到一款不限於網頁版微信的庫:Wechaty
:
Wechaty
本來是用TypeScript
開發的,但開發團隊正在進行多語言的移植,目前已經有能夠用的Python
版本,不過功能可能暫時沒有原版那麼強大。Wechaty
開發團隊勵志把它開發成一款支持全平臺微信協議的庫,目前已經支持Web
、Ipad
、Windows
以及Mac
等協議。雖然須要付費獲取token
,可是能夠申請參與開源激勵計劃來獲取免費甚至長期有效的token
。在這裏也要感謝Wechaty
團隊提供微信機器人SDK
🙏🙏🙏。
下面來實現一個最簡單的機器人:收到任意消息後回覆收到
。
import asyncio
from typing import Optional, Union
from wechaty import Wechaty, Contact
from wechaty.user import Message, Room
async def wechat():
bot = Wechaty()
# 將on_message方法綁定到bot對象的message事件上
bot.on('message', on_message)
await bot.start()
async def on_message(msg: Message):
from_contact = msg.talker()
text = msg.text()
room = msg.room()
conversation: Union[
Room, Contact] = from_contact if room is None else room
await conversation.ready()
await conversation.say('收到')
asyncio.run(wechat())
複製代碼
上面的代碼只用到了message
事件,Wechaty
還提供不少事件接口,例如scan
、login
、room-join
、room-leave
、logout
、error
等,想了解的讀者能夠聯繫交流。
上面的demo代碼很簡單,一看就懂,在本案例中的使用其實也很簡單。
當前價格觸發網格策略進行交易時,只須要在交易後總結當次交易的信息,而後利用相似上面的方法發送出來便可。實際操做中,我會把相應消息發送到我專門建的「量化動態播報」羣裏(目前在運行的有兩個網格):
async def on_message(msg: Message):
from_contact = msg.talker()
text = msg.text()
room = msg.room()
conversation: Union[
Room, Contact] = from_contact if room is None else room
if from_contact.payload.name.upper() == AdminWechatName and from_contact.contact_id.upper() == AdminWechatContactId:
# 發送#GRIDSTATUS時回覆當前網格倉位狀態等
if text.upper() == '#GRIDSTATUS':
await conversation.ready()
await conversation.say(str(grid))
# 發送#SETGRID:格式信息時動態修改網格參數
elif text.upper().startswith('#SETGRID:'):
paras = {('grid.' + item.split('=')[0]): item.split('=')[1] for item in text[9:].lower().split(';')}
cfg.set_paras(paras)
await run_grid()
async def run_grid():
flag, content = grid.run_data(data)
if flag:
if int(grid.mail_reminder):
for mail_box in grid.mail_list:
mail_helper.sendmail(mail_box, 'GRID SCRIPT NEW TRADE', content)
if int(grid.wechat_reminder):
await trade_reminder(bot, content)
async def trade_reminder(bot, mail_content, target=None):
for id in target:
room = bot.Room.load(id)
await room.ready()
conversation: Union[Room, Contact] = room
await conversation.ready()
await conversation.say(mail_content)
複製代碼
下面是實際效果:
確定會有讀者以爲上面的機器人仍是太麻煩,這裏在推薦一個小工具,同時也感謝開發者的努力與奉獻!
這個工具的名字叫Server醬
,英文名爲ServerChan
,是一款程序員和服務器之間的通訊軟件,也就是從服務器推報警和日誌到手機的工具。官網是sc.ftqq.com/3.version,讀者能夠自行了解,總之很好用就是了。
開通並使用上它,只須要一分鐘:
登入:用GitHub
帳號登入網站,就能得到一個SCKEY
。
綁定:點擊「微信推送」,掃碼關注同時便可完成綁定。
發消息:往http://sc.ftqq.com/SCKEY.send
發GET
請求,就能夠在微信裏收到消息了。
收到的消息相似於這種:
是否是很簡單方便?
因爲網格交易策略更適用於震盪市,因此目前策略是在數字貨幣上實施的,正在運行的包括一個實盤幣種和一個測試幣種,玩過數字貨幣的讀者應該對它的震盪行情有所瞭解。
有興趣的讀者也能夠聯繫我進量化動態播報羣,網格交易觸發的時候機器人會把操做動態實時發到羣裏。
無論寫什麼,但願能跟更多人溝通,有問題或者需求隨時歡迎交流。
我全部的項目源碼都會放在下面的github倉庫裏面,有須要能夠參考,有問題歡迎指正,謝謝!
https://github.com/TitusWongCN/
複製代碼
下面是個人公衆號,我有興趣能夠掃一下: