有这样的经纪人-Tinkoff银行。 而且,这个经纪人目前还没有止盈/止损订单,这是一个问题。 因此,如果您想更积极地进行交易,那么您就需要寻求某种临时解决方案,而在Tinkoff的深度开发中,程序员正在开发一种杀手级功能,即获利/止损,而削减开支就是其中之一。
更新: 03/22/2019,经纪人在Google Play上推出了主要版本3.0.0,其中仍然出现止盈/止损。
我为什么决定在这里写这篇文章? 在我看来,Tinkoff Bank及其产品在IT人士中颇为流行,也许有人也有同样的需求,但是没有时间或欲望骑自行车。 因此,我分享我的。
首先-关于经纪人本身提供的替代机会。
首先,Tinkoff的限价订单出现在2019年2月(它们等待了两年,没有玩笑!),但它们在一天之内就能工作,而且更糟的是,资金间隔很小,给动荡的市场带来了不便。 根本不可能设置的值小于(大于)根据当前报价计算出的某个阈值。 嗯,要问一个以上的限价单可能是不可能的(当我尝试保存第一个限价单时,移动应用程序始终会崩溃,但该网站没有此功能)。
其次,在其移动应用程序中,您可以通过设置绝对阈值或百分比变化(增加或减少)的阈值来订阅价格更改,但是您可以为每个资产设置一个且仅一个阈值。
我的自行车的逻辑很简单:
1)我们对安全性(资产)有阈值(以下称为阈值),我们必须对其进行手动止盈/止损操作。 阈值是根据资产的购买价格独立计算的;
2)我们需要从某处解析资产当前价格的数据;
3)如果已达到阈值之一,请给自己发送通知。
尽管描述简单明了,但在实现过程中还是有细微差别的。
1)虽然我的投资组合由一项资产组成,但我直接在脚本主体中设置了阈值,并且纸张搜索甚至不是一个变量,而只是一个魔术线。 不好的决定,但足以验证这个想法。 随着投资组合的多样化,我制作了一个文件,从中加载证券,进行交易的交易所以及阈值。
2)由于我的资产是在圣彼得堡交易所交易的外国证券,因此我首先决定从以下页面解析圣彼得堡交易网站的数据:
spbexchange.ru/ru/market-data/Default.aspx根据交易量在圣彼得堡证券交易所进行分类,而我的安全总是在第一页上。 效果很好,但是在3月8日,一切都破裂了。 由于某种原因,TSLA已经在第25页上了,其分页器通过JS动态加载数据。 这个问题可以“正面”解决:解析所有页面,直到找到我们的资产。 但是,如果考虑脚本循环的执行时间,这种方法不是很有效。 相反,我决定添加来自tradingview.com的解析。 无需在更多页面上增加长长的列表。 在那里,每个资产都有类似此链接的内容:
www.tradingview.com/symbols/NASDAQ-TSLA在我看来,一切都应该快速而简单地开始,但是有一个问题-我感兴趣的数据是通过JS加载的,而通常的Requests无法解决它。
这个问题有三个我知道的解决方案:
PyQT,Selenium(网络驱动程序)和Requests-HTML扩展。 由于我在项目中已经有Requests,因此决定使用它自己的扩展名。
不幸的是,该解决方案的运行不是很稳定,我不得不寻找解决方案。
session = HTMLSession() r = session.get(url) my = r.html.render(timeout=30) selector = 'span.tv-symbol-header-quote__value.tv-symbol-header-quote__value--large.js-symbol-last' price = r.html.find(selector)[0].text r.close() session.close()
注意超时,以及对close()方法的调用。 并非在所有示例中都可以找到它们,但是使用它们比不使用它们更好。
3)我们注册了可以发送SMS(sms.ru),使用其API并创建密钥的服务。 每天最多5条短信-免费。 对我来说足够了。
密钥如下所示:
24A41EA5-EEEE-Priv-5555-094143C2EDDD
在第一个版本中发送短信的方式是这样实现的:
def send_message(mymessage): sms_url = 'https://sms.ru/sms/send?api_id=key&to=number&msg=message&json=1' sms_url = sms_url.replace('key', mykey) sms_url = sms_url.replace('number', mynumber) sms_url = sms_url.replace('message', mymessage) sms_response = requests.get(sms_url)
在开发过程中,出现了以下问题:如果我们已经向用户发送了有关超过阈值的SMS,该怎么办? 没有检查时,它再次发送了SMS。 每次。 很快就“吃了”免费限额,并开始思考如何处理。 我必须添加一个已发送SMS的计数器(sms_counter),在调用send_message之前我们会对其进行检查。
global sms_counter sms_counter = sms_counter + 1
将会追问另一个问题:很好,在交易时段中,我们处理与某个资产的一个门槛交叉点,这很适合我们。 下一个交易时段该做什么? 已决定重设已发送短信的计数器。 共有三个选项:将数据存储在数据库中(但是我目前有一个无状态应用程序),解析时间/日期或重新启动脚本。 到目前为止,我正在选择第三个选项,但是将来我将继续选择第二个或第一个选项。
现在该解决方案已经可以使用,可以从
Github下载
对于不了解Python是什么以及如何配置它的用户,我建议尝试启动
Windows的打包
解决方案进一步发展计划:
1)解析日期/时间,以重置SMS计数器(而不是重新启动脚本);
2)现在它是一个无状态的应用程序,但是我打算破坏数据库;
3)在第2项之后,我想添加相对于前一天收盘价的价格上涨/下跌的急剧跳跃的跟踪;
4)扩展“通信”机会:更多路径(电报,Viber,语音呼叫,其他选项)和提供者(我打算添加smsc.ru,因为sms.ru有时会失去响应能力,尽管它会发送SMS,但脚本不会执行直到我们得到sms_response)。