1
worldquant Sep 3, 2023
为啥要自己造轮子呢。https://github.com/freqtrade/freqtrade
|
2
zictos Sep 3, 2023
别人的用起来感觉更复杂,自己写更简单。
就是看一下币安的 api 文档,发送下 http 请求,需要用到什么 api 就使用具体的 api 就行,尽量做到代码非常简单。获取价格和 k 线,针对 k 线进行一些计算以及一些指标的计算,循环更新 k 线,然后满足交易条件了就通过 api 开仓,满足平仓条件了就通过 api 平仓。 反正我总觉得看到别人的开源项目更复杂,压根不愿意去熟悉别人的项目,自己写的话需要什么就直接立刻上手了,每种需求的代码量都不多。 |
4
zictos Sep 3, 2023
@ccclo #3 我的代码只适合我的具体策略的需求,所以可以很简单,开源项目才需要考虑通用性。
而且我是做突破的,必须要先挂单(到达指定价格后市价触发开仓,非低买高卖的挂单),不然临时下市价单的话滑点会非常大,根本来不及。所以重点逻辑就是要处理好这种实时监控,成交后立刻设置止损并记录开仓信息,之后会每隔一段时间监控是否满足平仓条件。 |
7
ccclo OP 那你帮我写一个 u 本位合约市价的 python 代码 和平仓 代码吗 我是用 chatgpt 写出来 下单不了,我只想要这两个代码 我在这两个代码中 在更改
@zictos |
9
zictos Sep 3, 2023
@ccclo #7 把****替换成四空格,或者让 chatgpt 帮你改。
import time import requests import hmac import hashlib from urllib.parse import urljoin, urlencode def market_order(symbol, quantity, side, reduceOnly='false', loop=True): ****API_KEY = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' #替换成自己的 API_KEY ****SECRET_KEY = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' #替换成自己的 SECRET_KEY ****BASE_URL = 'https://fapi.binance.com' ****headers = {'X-MBX-APIKEY': API_KEY} ****PATH = '/fapi/v1/order' ****url = urljoin(BASE_URL, PATH) ****params = {'symbol': symbol, ************ 'quantity': quantity, ************ 'side': side, ************ 'type': 'MARKET', ************ 'reduceOnly': reduceOnly} ****while True: ********try: ************if 'signature' in params: ****************del params['signature'] ************params['timestamp'] = int(time.time()) * 1000 ************query_string = urlencode(params) ************params['signature'] = hmac.new(SECRET_KEY.encode('utf-8'), query_string.encode('utf-8'), hashlib.sha256).hexdigest() ************r = requests.post(url, headers=headers, params=params, timeout=4) ************# print(r.text) # 查看响应文本 ************if r.status_code == 200: ****************r = r.json() ****************return r['orderId'] ************if not loop: ****************return None ********except BaseException as e: ************print(e) ************if not loop: ****************return None ********time.sleep(0.1) symbol = 'BNBUSDT' # 交易对 quantity = 0.03 # 下单的数量 side = 'BUY' # 下单的方向,BUY 或者 SELL order = market_order(symbol, quantity, side) |
11
zictos Sep 3, 2023
@ccclo #10 你在币安里面是设置了单向交易吧,默认就是单向交易,只要你没改过就行。
如果你现在是有多单的持仓,你平仓只需要把方向 side 参数改为 SELL 就行了,如果数量一样的话默认就是平仓。你也可以将函数的 reduceOnly 参数设为'true',保险一点,这样就无论如何都不会增加仓位,当然你不设也可以。 币安默认平仓都是要指定数量的,不过你可以设一个更大的数量,只要将 reduceOnly 设为 true 就不会增加仓位。比如你现在有 0.03 的多单,你下一个 0.3 的市价 SELL 单,并且 reduceOnly 设为 true ,也是会直接平仓的,并且不会增加仓位。 |
13
Her0 Sep 3, 2023
|
15
zictos Sep 4, 2023
@ccclo #14 这个我也没弄过,好像是要配置什么 Webhook ,tradingview 我只是用来看行情的,tradingview 上的策略大部分也是通过各种指标计算的,python 的 pandas_ta 库基本可以计算各种指标,如果策略比较复杂的话,那你要分析 tradingview 策略的代码,然后改写成 python 。我自己基本各种复杂的策略都可以直接通过 python 实现,关键是自己要弄清楚信号原理,别人的策略要是代码太复杂的话,我也没什么功夫去研究别人的策略的代码。
使用 tradingview 通知的话,tradingview 上面有一个“警报”按钮,点击后可以选择你正在使用的策略,然后在通知里可以配置 Webhook URL ,这个要付费才行,其实应该也可以选择发送邮件,再 python 循环检测邮箱看有没有新邮件就行。不过具体我也没测试过,不知道具体有哪些坑。 |
18
zictos Sep 14, 2023 via Android
quantity = 0.03
之前的代码是上面这样的,这就是下单数量,bnb 是最低 0.03 ,也可以是 0.04 或 0.05 ,最多两位小数。btcusdt 是最少 0.001 ,最多三位小数,btc 现在价格 26500 左右,开 0.001 就大约是开仓了 26.5u 。你也可以把我所有说过的话发给 chatgpt 让它根据实际情况给出代码 |
22
zictos Sep 15, 2023 via Android
@ccclo 看你自己想开多少啊,你想买一个比特币,数量自然是填 1 。
你可以根据止损计算仓位,公式是最大亏损除以止损点数等于仓位大小。 比如现在比特币价格 26500 美金,你止损放在 26000 美金的位置,你的止损就是 500 点,假设你最大只能亏 100 美金,那就是 100 美金/500=0.2 。数量填 0.2 ,这样一旦被止损就是亏 100 美金,如果有很多小数位数,要用 round 函数保留最多 3 位小数。 具体怎么开,完全取决于你自己,你也可以每次都开固定数量。 |
23
zictos 19 days ago
9 楼的代码如果有人要参考并使用的话,建议去掉代码里的 while 循环或者调用时将参数 loop 的值指定为 False 。比如可以调用时用 market_order(symbol, quantity, side, loop=False)
因为循环重试的话可能有重复下单的风险,虽然我从没遇到过,可能只有在服务器收到请求后返回响应数据时客户端刚好短暂断网才会出现。 原代码的循环只是基于网络请求失败重试考虑,而且实际也从没遇到过重复下单的情况,但不同使用者的网络情况是不一样的,所以最好不要循环。 帖子虽然已经过去 3 年了,可能并没有人再看,而且现在有相关需求问 ai 就行,但代码要是直接拿着用的话毕竟还是相当于有一定 bug 的。所以既然我再次看到了这个帖子,那还是觉得有必要提醒一下。 |
24
zictos 17 days ago
再补充一下,9 楼的代码由于会捕获几乎所有异常并重试,所以万一在极端情况下出现重复下单的话,那原因可能不仅限于我上一条回复提到的。
总之,9 楼的代码不建议任何人再参考或使用了。实在要参考或使用的话一定要在自己了解代码的情况下去掉代码里的 while 循环或者调用时将参数 loop 的值指定为 False 关闭循环。如果真的有相关需求的话,现在问 ai 更好,完全没必要参考或使用本帖子的 9 楼的代码。 |