
Karena alasan likuiditas, ketika ada sejumlah besar penjualan atau penarikan di pasar, pasti akan ada fluktuasi harga yang besar, dan akan ada perbedaan harga sesaat antara bursa. Strateginya adalah untuk menangkap momen-momen ini dan melakukan transaksi cepat untuk menyelesaikan proses membeli saat harga rendah dan menjual saat harga tinggi. Beberapa klien bertanya kepada saya mengapa saya memiliki begitu banyak bursa. Ini tidak dapat dihindari. Yang menghasilkan uang bagi kami adalah perbedaan harga instan antara bursa. Semakin banyak bursa, semakin banyak peluang perbedaan harga setelah crossover.
function createOrders(depths, askOrders, bidOrders) {
let asksIndex = 0;
let bidIndex = 0;
for (let i = 0; i < depths.length; i++) {
let exchangeTariff = getExchangeTariff(i);
let asks = depths[i].Asks;
let bids = depths[i].Bids;
for (let j = 0; j < Math.min(asks.length, bids.length, 20); j++) {
if (asks[j].Amount >= minTakerAmount) {
askOrders[asksIndex] = {
"Price": asks[j].Price,
"Amount": asks[j].Amount,
"Fee": asks[j].Price * exchangeTariff,
"RealPrice": asks[j].Price * (1 + exchangeTariff),
"Index": i,
};
asksIndex++;
}
if (bids[j].Amount >= minTakerAmount) {
bidOrders[bidIndex] = {
"Price": bids[j].Price,
"Amount": bids[j].Amount,
"Fee": bids[j].Price * exchangeTariff,
"RealPrice": bids[j].Price * (1 - exchangeTariff),
"Index": i,
};
bidIndex++;
}
}
}
askOrders.sort(function (a, b) {
return a.RealPrice - b.RealPrice;
});
bidOrders.sort(function (a, b) {
return b.RealPrice - a.RealPrice;
});
}
function getArbitrageOrders(askOrders, bidOrders) {
let ret = [];
for (let i = 0; i < askOrders.length; i++) {
for (let j = 0; j < bidOrders.length; j++) {
let bidOrder = bidOrders[j];
let askOrder = askOrders[i];
if (bidOrder.Index === askOrder.Index) {
continue
}
let minMigrateDiffPrice = ((askOrder.Price + bidOrder.Price) / 2 * minMigrateDiffPricePercent / 100);
if (bidOrder.RealPrice - askOrder.RealPrice > minMigrateDiffPrice) {
ret.push({
"Ask": askOrder,
"Bid": bidOrder,
})
}
}
}
if (ret.length === 0) {
ret.push({
"Ask": askOrders[0],
"Bid": bidOrders[0],
});
}
//按最优价差排序
ret.sort((a, b) => {
return (b.Bid.RealPrice - b.Ask.RealPrice) - (a.Bid.RealPrice - a.Ask.RealPrice);
});
return ret;
}
var askOrder = arbitrageOrder.Ask;
var bidOrder = arbitrageOrder.Bid;
var perAmountFee = arbitrageOrder.Ask.Fee + arbitrageOrder.Bid.Fee;
var minRealDiffPrice = (askOrder.Price + bidOrder.Price) / 2 * minDiffPricePercent / 100;
var minMigrateDiffPrice = ((askOrder.Price + bidOrder.Price) / 2 * minMigrateDiffPricePercent / 100);
var curRealDiffPrice = arbitrageOrder.Bid.RealPrice - arbitrageOrder.Ask.RealPrice;
var buyExchange = exchanges[arbitrageOrder.Ask.Index];
var sellExchange = exchanges[arbitrageOrder.Bid.Index];
var buySellAmount = 0;
if (curRealDiffPrice > minRealDiffPrice) {
buySellAmount = math.min(
bidOrder.Amount,
askOrder.Amount,
maxTakerAmount,
runningInfo.Accounts[bidOrder.Index].CurStocks,
runningInfo.Accounts[askOrder.Index].CurBalance / askOrder.Price
);
} else if (bidOrder.Index !== askOrder.Index) {
if (migrateCoinEx == -1) {
if (curRealDiffPrice > minMigrateDiffPrice && runningInfo.Accounts[bidOrder.Index].CurStocks - runningInfo.Accounts[askOrder.Index].CurStocks > maxAmountDeviation) {
buySellAmount = math.min(
bidOrder.Amount,
askOrder.Amount,
maxTakerAmount,
runningInfo.Accounts[bidOrder.Index].CurStocks,
runningInfo.Accounts[askOrder.Index].CurBalance / askOrder.Price,
runningInfo.Accounts[bidOrder.Index].CurStocks - ((runningInfo.Accounts[bidOrder.Index].CurStocks + runningInfo.Accounts[askOrder.Index].CurStocks) / 2)
);
if (buySellAmount >= minTakerAmount) {
Log("启动交易所平衡!");
}
}
} else if (migrateCoinEx == askOrder.Index) {
if (curRealDiffPrice > minMigrateDiffPrice && runningInfo.Accounts[bidOrder.Index].CurStocks > 0) {
buySellAmount = math.min(
bidOrder.Amount,
askOrder.Amount,
maxTakerAmount,
runningInfo.Accounts[bidOrder.Index].CurStocks,
runningInfo.Accounts[askOrder.Index].CurBalance / askOrder.Price
);
if (buySellAmount >= minTakerAmount) {
Log("启动货币迁移:", exchanges[bidOrder.Index].GetName(), "-->", exchanges[askOrder.Index].GetName());
}
}
}
}
var buyWait = buyExchange.Go("Buy", _N(askOrder.Price * (1.01), pricePrecision), buySellAmount);
var sellWait = sellExchange.Go("Sell", _N(bidOrder.Price * (0.99), pricePrecision), buySellAmount);
var startWaitTime = new Date().getTime()
Sleep(3000);
var buyOrder = buyWait.wait()
var sellOrder = sellWait.wait()

https://www.fmz.com/robot/464965
Akhirnya, selamat datang untuk bergabung dengan Laoqiu Quantitative Exchange: https://t.me/laoqiu_arbitrage