Ví dụ: A: Sàn giao dịch: ETH_BTC Sàn giao dịch B: ETH_USDT Sàn giao dịch C (thực ra là sàn giao dịch B, một cặp giao dịch khác, được cho là C;;): BTC_USDT
Các giao dịch trên sàn giao dịch B, C được tạo thành từ sự kết hợp của ETH_BTC và A.
// 交易对以 ETH_BTC , ETH_USDT , BTC_USDT 为例 // 教学策略,还有很大优化空间,例如:币平衡模块,根据手续费率控制对冲差价,硬搬砖等等。 function main () { if (exchanges[0].GetQuoteCurrency() != exchanges[2].GetCurrency().split("_")[0] || exchanges[0].GetCurrency().split("_")[0] != exchanges[1].GetCurrency().split("_")[0]) { throw "交易所 交易对 配置错误。" } var marketSlideRate = 1 // 1.02 var hedgeDiff = 0.0007 var hedgeAmount = 0.1 var isFirst = true var concurrenter = function (funcName, isWait, tasks, amounts) { for (var i = 0 ; i < exchanges.length; i++) { if (isFirst) { exchanges[i].acc = _C(exchanges[i].GetAccount) exchanges[i].initAcc = exchanges[i].acc } if (isWait) { var a = funcName == "GetTicker" ? exchanges[i].ticker = exchanges[i].tiR.wait() : exchanges[i].id = exchanges[i].trR.wait() if (funcName == "trade") { exchanges[i].acc = _C(exchanges[i].GetAccount) } } else { var b = funcName == "GetTicker" ? exchanges[i].tiR = exchanges[i].Go(funcName) : exchanges[i].trR = exchanges[i].Go(tasks[i], -1, amounts[i], exchanges[i].GetCurrency()) } } if (funcName == "trade" && isWait) { Log("BTC:", exchange.BTC = exchanges[0].acc.Balance + exchanges[2].acc.Stocks, "ETH:", exchange.ETH = exchanges[0].acc.Stocks + exchanges[1].acc.Stocks, "USDT:", exchange.USDT = exchanges[1].acc.Balance + exchanges[2].acc.Balance, "#FF0000") LogProfit(exchange.USDT - (exchanges[1].initAcc.Balance + exchanges[2].initAcc.Balance) - (exchanges[0].initAcc.Balance + exchanges[2].initAcc.Stocks - exchange.BTC) * exchanges[2].ticker.Last - (exchanges[0].initAcc.Stocks + exchanges[1].initAcc.Stocks - exchange.ETH) * exchanges[1].ticker.Last) } isFirst = false } while (1) { concurrenter("GetTicker", false) concurrenter("GetTicker", true) var tickerA = exchanges[0].ticker var tickerB = exchanges[1].ticker var tickerC = exchanges[2].ticker var tickerBC = { Buy : tickerB.Buy / tickerC.Sell, Sell : tickerB.Sell / tickerC.Buy, } if (tickerA.Buy - tickerBC.Sell > hedgeDiff && exchanges[0].acc.Stocks > 0.2 && exchanges[1].acc.Balance > 500 && exchanges[2].acc.Stocks > 0.03) { // Sell A , Buy BC (Buy B Sell C) concurrenter("trade", false, ["Sell", "Buy", "Sell"], [hedgeAmount, marketSlideRate * tickerB.Sell * hedgeAmount, tickerB.Sell * hedgeAmount / tickerC.Buy]) concurrenter("trade", true) } if (tickerBC.Buy - tickerA.Sell > hedgeDiff && exchanges[0].acc.Balance > 0.03 && exchanges[1].acc.Stocks > 0.2 && exchanges[2].acc.Balance > 500) { // Buy A , Sell BC (...) concurrenter("trade", false, ["Buy", "Sell", "Buy"], [marketSlideRate * hedgeAmount * tickerA.Sell, hedgeAmount, marketSlideRate * hedgeAmount * tickerA.Sell * tickerC.Sell]) concurrenter("trade", true) } Sleep(500) } }
BNMBNMƯu: TypeError: không thể đọc thuộc tính 'Sell' của null tại main (__FILE__:45) Ưu: GetTicker: 429: {"msg":"Yêu cầu quá thường xuyên."," mã":"50011"}
BNMBNMĐây là cách để chạy nếu bạn có 3 đồng tiền, hoặc nếu bạn có USDT, bạn có thể chạy.
BNMBNMKhông thể chạy được.
fmzeroỞ đâu có video dạy?
Những nhà phát minh định lượng - những giấc mơ nhỏCó 3 đồng tiền cần.
Những nhà phát minh định lượng - những giấc mơ nhỏCầu hỏi quá thường xuyên!
BNMBNMĐây là cách để chạy nếu bạn có 3 đồng tiền, hoặc nếu bạn có USDT, bạn có thể chạy.
BNMBNMBạn có thể đặt số lượng giao dịch là 0.03 không?
BNMBNMĐược rồi, tôi sẽ chạy lại.
Những nhà phát minh định lượng - những giấc mơ nhỏThông tin về lỗi này có thể được gửi tại đây, hoặc thêm vào nhóm chính thức của FMZ là @dreamgo back.
BNMBNMBạn có thể thêm vào thông điệp của mình không?
Những nhà phát minh định lượng - những giấc mơ nhỏHãy gửi câu hỏi cụ thể hoặc thêm vào nhóm tin nhắn chính thức của FMZ @mymay
BNMBNMBạn có thể thêm WeChat vào không?
Những nhà phát minh định lượng - những giấc mơ nhỏĐây là một chiến lược trực tiếp, nếu có vấn đề, bạn cần gửi câu hỏi cụ thể.