Zum Beispiel: A-Börse: ETH_BTC Börse B: ETH_USDT C-Börse (in Wirklichkeit ist B-Börse ein anderes Handelspärchen, das logischerweise als C angenommen wird): BTC_USDT
B, C ist eine Kombination von ETH_BTC und A ist eine Börsen-Hedge. BC ist also tatsächlich ein Börsenkonto.
// 交易对以 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) } }
BNMBNMPro: TypeError: Eigenschaft 'Sell' von null bei main (__FILE__:45) nicht lesen Pro: GetTicker: 429: {"msg":"Zu häufige Anfragen.","Code:"50011"}
BNMBNMHey, das hier ist für drei Münzen, oder für USDT.
BNMBNMWie kann man nicht laufen?
fmzeroWo ist das Unterrichtsvideo?
Kleine TräumeDie drei Münzen sind notwendig.
Kleine TräumeZu häufige Anfragen!
BNMBNMHey, das hier ist für drei Münzen, oder für USDT.
BNMBNMKann man die Transaktionsmenge auf 0.03 setzen? Was bedeutet das für 0.0007 und 1/1.02?
BNMBNMGut, ich laufe noch mal.
Kleine TräumeDie Fehlermeldung kann hier geschickt werden oder auf der offiziellen FMZ-Gruppe @dreamback.
BNMBNMWenn Sie nicht aufstehen können, können Sie Ihre WeChat-Nachrichten herunterladen?
Kleine TräumeSenden Sie Fragen oder fügen Sie die offizielle WeChat-Gruppe von FMZ bei @Dreamback.
BNMBNMIch habe eine Frage an Sie: Können Sie mir WeChat hinzufügen?
Kleine TräumeDas ist die Strategie der Hand, wenn es Probleme gibt, müssen wir konkrete Fragen stellen.