রিসোর্স লোড হচ্ছে... লোডিং...

মাল্টি-এক্সচেঞ্জ স্পট স্প্রেড আর্বিট্রেজ স্ট্র্যাটেজি লজিক শেয়ারিং

লেখক:উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্ন, তৈরিঃ 2022-07-12 17:20:06, আপডেটঃ 2024-12-02 21:43:21

img

কৌশলগত নীতি

তরলতার কারণে, যখন বাজারে প্রচুর পরিমাণে ধাক্কা এবং টান হয়, তখন অনিবার্যভাবে বড় দামের ওঠানামা হবে, এবং এক্সচেঞ্জগুলির মধ্যে তাত্ক্ষণিক মূল্য পার্থক্য গঠিত হবে, এবং কৌশলটি হ'ল এই মুহুর্তগুলি ক্যাপচার করা যেখানে দ্রুত ব্যবসায়গুলি কম কেনার এবং উচ্চ বিক্রয় করার প্রক্রিয়াটি সম্পূর্ণ করার জন্য কার্যকর করা হয়। কিছু ক্লায়েন্ট আমাকে জিজ্ঞেস করেছিল কেন আমাকে এত এক্সচেঞ্জ পেতে হয়। এটা অনিবার্য। আমরা যা অর্জন করি তা হল এক্সচেঞ্জের মধ্যে তাত্ক্ষণিক মূল্য পার্থক্য। যত বেশি এক্সচেঞ্জ, ক্রসওভারের পরে তৈরি দামের পার্থক্যের জন্য তত বেশি সুযোগ।

কৌশলটির মূল যুক্তি
  1. একযোগে একাধিক এক্সচেঞ্জের বাজার তথ্য পেতে, এটি একযোগে প্রাপ্ত বাজার বিলম্ব হ্রাস করতে একযোগে প্রাপ্ত করা উচিত।মাল্টি-এক্সচেঞ্জ সিম্পলিন প্লাগ-ইন
  2. একত্রিত অর্ডার তথ্য পেতে সমস্ত এক্সচেঞ্জ অর্ডারের জিজ্ঞাসা এবং বিড একত্রিত করুন, যেখানে RealPrice হ'ল হ্যান্ডলিং ফি ছাড়ার পরে মূল্য,
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;
    });
}
  1. সংযুক্ত বাজার তথ্য থেকে সর্বোত্তম সালিশ স্প্রেড গণনা করুন। যেহেতু আমরা অর্ডার গ্রহণ করছি, অর্থাৎ, সর্বনিম্ন মূল্য জিজ্ঞাসা থেকে কিনতে এবং সর্বোচ্চ মূল্য বিড থেকে বিক্রি, যতক্ষণ না bid.RealPrice > ask.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],
        });
    }
    //Sort by best spread
    ret.sort((a, b) => {
        return (b.Bid.RealPrice - b.Ask.RealPrice) - (a.Bid.RealPrice - a.Ask.RealPrice);
    });
    return ret;
}
  1. এই পর্যায়ে, আমরা বাজারে আর্বিট্রেজ স্প্রেড সম্পর্কে তথ্য পেয়েছি, তাই একটি ট্রেড কার্যকর করা হবে কিনা এবং কতটা ট্রেড করা হবে তা বেছে নেওয়ার বিষয়ে বেশ কয়েকটি বিচারের পয়েন্ট রয়েছেঃ
  • বর্তমান অবশিষ্ট সম্পদ
  • স্প্রেডের আকার (যদি স্প্রেডটি খুব ছোট হয় তবে কেবলমাত্র মুদ্রার পরিমাণ ভারসাম্যপূর্ণ হবে এবং যদি স্প্রেডটি যথেষ্ট বড় হয় তবে ব্যবসায়ের সংখ্যা সর্বাধিক হবে)
  • অপেক্ষমান অর্ডারের সংখ্যা
    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("Start exchange balancing!");
                }
            }
        } 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("Initiate currency migration:", exchanges[bidOrder.Index].GetName(), "-->", exchanges[askOrder.Index].GetName());
                }
            }
        }
    }
  1. স্থাপন করা অর্ডার সংখ্যা গণনা করার পর, লেনদেন সম্পাদন করা যেতে পারে। কৌশল সরাসরি যোগ slippage এবং একই সময়ে আদেশ গ্রহণ পদ্ধতি গ্রহণ করে
            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()
  1. এখন শুধু রিটার্ন গণনা, ব্যর্থ অর্ডারে স্টপ লস পরিচালনা ইত্যাদির লজিক বাকি আছে।
কৌশলটির প্রকৃত মুনাফা

img img img

বর্তমান বাস্তব বট প্রদর্শন, কোর লজিক অপরিবর্তিত থাকে, একাধিক মুদ্রা সমর্থন করার জন্য অপ্টিমাইজ করা

https://www.fmz.com/robot/464965

অবশেষে, লাওকিউ পরিমাণগত বিনিময় যোগাযোগে যোগদানের জন্য স্বাগতমঃhttps://t.me/laoqiu_arbitrage


সম্পর্কিত

আরো