3
フォロー
1444
フォロワー

80 行のコードで高頻度戦略による無知な販売ロボットを利用する方法

作成日:: 2023-12-24 21:37:45, 更新日:: 2023-12-26 15:40:23
comments   7
hits   5239

80 行のコードで高頻度戦略による無知な販売ロボットを利用する方法

機会観察

最近、偶然、BinanceのコインであるSTORJの市場が非常に奇妙であることを発見しました。取引量が非常に大きく、取引頻度が非常に速いです。具体的な1分間のKラインは次のとおりです。 1分あたりの取引量は非常に安定しており、1分足では長い下ヒゲが見られます。 80 行のコードで高頻度戦略による無知な販売ロボットを利用する方法 Binanceの1秒Kラインを観察することで、手がかりを見つけました。誰かがコストに関係なく5〜7秒ごとに10,000〜20,000 STORJを売却し、Kラインの小さな穴を直接ヒットします。その中で回復します。この作戦は明らかにアイスバーグが依頼したロボットによって行われた。この売り操作は非常に長く続き、総額は数千万ドルと推定されています。多くの場合、発生したスリッページは1/1000に達し、この戦略の実行者は数万ドルの損失を被ったことになります。取引のずれによるものです。ドル。しかし、このような機械的な操作や活発な取引は、マーケットメイクやスキャルピングの明らかな機会を生み出します。 80 行のコードで高頻度戦略による無知な販売ロボットを利用する方法

オリジナルのスポット高頻度戦略を単純に変更するだけで、アイスバーグ注文の無意識の売りを特に利用するこのロボットを構築するのに数分しかかかりませんでした。

戦略的思考

数秒ごとに市場での売りが発生するため、買い注文書で 10,000 の深さを見つけて、その前に注文を出すだけで済みます。このように、この氷山が売られると、マーケットメイキングロボットがそれを受け取ることができる可能性が高くなります。このとき、取引は非常に活発で、瞬間的な価格下落もいくつかの買い注文を引き起こします。売り注文を出し、それに応じて売却する場合も同じ原則が適用されます。操作を繰り返します。取引頻度が非常に高く、1回あたりの収益率は大きくないとしても、総利益は相当な額になります。もちろん、すべての前提は取引手数料が低い口座を持つことです。売買の取引手数料が0.1%であれば、このスペースでは取引手数料を支払うのに十分ではありません。

戦略パフォーマンス

戦略パフォーマンスは次のとおりです。 最初は利益が印刷されませんでした。 今日の午後に変更して利益を印刷しました。 クレイジーセリングロボットは、数量を毎回約5,000に変更したため、最高の裁定期間が過ぎました。最初は1時間あたり100~200U程度稼げます。リスクがなく、低コストなのがポイントです。逆に見てみると、氷山注文には実は多くのテクニックがあります。戦略の書き方を知っていれば、FMZで10分ほどで戦略を書くことができます。買い注文の深さを観察して注文サイズを決定し、価格を監視し、アクティブな買い注文のサイズを観察して保留中の注文のサイズを調整します。そして、市場を占有するなどの特徴を持つ氷山委託戦略は、簡単に数万ドルを節約できます。

80 行のコードで高頻度戦略による無知な販売ロボットを利用する方法

戦略ソースコード

戦略コードは非常にシンプルで、わずか 80 行です。初心者に適しています。単精度などの一部のパラメータはプログラムにハードコードされています。自分で変更できます。必要なパラメータは下の図のとおりです。交換取引ペアが将来必要になった場合に備えて保存することをお勧めします。もう一つのクレイジーな取引があります。いつでも利息を請求できます。 80 行のコードで高頻度戦略による無知な販売ロボットを利用する方法

function CancelPendingOrders() {
    var orders = _C(exchange.GetOrders)
    for (var j = 0; j < orders.length; j++) {
        exchange.CancelOrder(orders[j].Id, orders[j])
    }
}

function onexit(){
    CancelPendingOrders()
}

function GetPrice(Type, Depth) {
    var sumAmount = 0
    var checkAmount = Type == "Buy" ? CheckBuyAmount : CheckSellAmount
    var deep = Type == "Buy" ? Depth.Bids : Depth.Asks
    for(var i = 0; i < Math.min(20, deep.length); i++) {
        if(Type == "Buy"  && deep[i].Price == lastBuyPrice && buyId){
            sumAmount += deep[i].Amount - amountBuy //这里要减去自己的挂单
        }else if(Type == "Sell"  && deep[i].Price == lastSellPrice && sellId){
            sumAmount += deep[i].Amount - amountSell
        }else{
            sumAmount += deep[i].Amount
        }
        if(sumAmount >= checkAmount){
            return deep[i].Price
        }
    }
    return deep[19].Price
}

function OnTick() {
    var depth = _C(exchange.GetDepth)
    var buyPrice = _N(Math.min(GetPrice("Buy", depth) + 0.0001, depth.Asks[0].Price-0.0001) , 4) //保证在盘口
    var sellPrice = _N(Math.max(GetPrice("Sell", depth) - 0.0001, depth.Bids[0].Price+0.0001), 4)
    LogStatus('buy_price:'+buyPrice, '  sell price: '+sellPrice)
    if ((sellPrice - buyPrice) < DiffPrice) {
        buyPrice = 0
    }
    if(sellPrice != lastSellPrice && sellId){
        exchange.CancelOrder(sellId);
        sellId = 0
        lastSellPrice = 0
    }
    if(buyPrice != lastBuyPrice && buyId){
        exchange.CancelOrder(buyId);
        buyId = 0
        lastBuyPrice = 0
    }   
    var acc = _C(exchange.GetAccount)
    if(account.Stocks+account.FrozenStocks != acc.Stocks+acc.FrozenStocks){
        LogProfit((acc.Stocks+acc.FrozenStocks)*depth.Bids[0].Price+acc.Balance+acc.FrozenBalance - 2000)
        Log('free '+acc.Stocks, ' lock: '+ acc.FrozenStocks, ' total: ' , (acc.Stocks+acc.FrozenStocks)*depth.Bids[0].Price+acc.Balance+acc.FrozenBalance)
    }
    account = acc
    amountBuy = _N(Math.min(account.Balance / buyPrice - 0.1, Amount), 0)
    amountSell = _N(account.Stocks, 0)
    if (sellPrice > 0 && amountSell > 40 && sellId == 0) {
        sellId = exchange.Sell(_N(sellPrice,4), amountSell)
        lastSellPrice = sellPrice
    }
    if (buyPrice>0 && amountBuy > 40 && buyId == 0) {
        buyId = exchange.Buy(_N(buyPrice,4), amountBuy)
        lastBuyPrice = buyPrice
    }
    Sleep(Interval)
}
var account = {Stocks:0, FrozenStocks:0, Balance:0, FrozenBalance:0}
var buyId = 0
var sellId = 0
var lastBuyPrice = 0
var lastSellPrice = 0
var amountSell = 0
var amountBuy = 0
function main() {
    CancelPendingOrders()
    while (true) {
        OnTick()
    }
}