80行のコードで高周波戦略で 脳のない販売ボットを利用する方法

作者: リン・ハーンリディア作成日:2023年12月25日 13:12:00,更新日:2024年1月2日 21:23:26

img

機会 の 観察

取引量は非常に大きいし,取引頻度は非常に速い. 次のグラフの特定の1分間のK線は,毎分取引量が一貫していることがわかります. そして,1分間のK線は,長い下下の影線で見ることができます.

img

バイナンス1秒K線で観察してみると,私は物語の終わりを知りました.誰かがコストに関係なく,毎5-7秒に10,000-20,000STORJを販売し,K線に直接小さな穴を割って,価格が短期的に回復している間.この操作は明らかに氷山の佣金上のロボットによって引き起こされました.この販売操作は,合計約1000万ドルのレベルで,非常に長い期間続いた.多くの場合,0.1%までスリップを引き起こしました.これは,この戦略の実行者が取引だけでスリップで数千ドルを失っていたことを意味します.しかし,そのような機械的な操作と活発な取引により,市場作りのスキルピングの明確な機会がありました.

img

スポットHF戦略への簡単な変更で 数分でこのボットが手に入りました 氷山の割引の 馬鹿げた売り上げを 搾取することに特化したものです

戦略のアイデア

市場が市場価格で数秒ごとに販売しているため,私たちはただ買い注文簿に10kの深さを見つけ,その前に注文を掛ける必要があります. 氷山が売るとき,市場作りのロボットは受け取ることができる可能性が高いため,この時点で取引は非常に活発です. 一瞬間の価格低下もいくつかの買い注文を誘発しました. 同様に,掛ける販売注文はトレンドに投げ込まれ,繰り返される操作です. 取引の頻度は非常に高く,毎回収益が大きくなくても,総利益もかなり大きいです. もちろん,すべての前提は,低料金口座を持つことです. 買取手数料と販売手数料の両方が0.1%である場合,費用を支払うにはスペースが足りません.

戦略の実行

戦略は以下の通り実行されています. 最初は,利益は印刷されていなかったので,私は今午後変更し,利益を印刷しました. 狂った販売ロボットは,1度に約5000にボリュームを変更しました. したがって,アービタージのための最適な時期は過ぎました. 私はおそらく最初は1時間あたり100-200Uを作っています. 鍵はリスクフリーで低コストです. 裏側では,氷山佣金には実際に多くのスキルがあります. 戦略を書く方法を知っていれば,あなたはFMZで10分を費やして氷山佣金戦略を書くことができます. 注文のサイズと価格を決定するために購入注文の深さを観察し,待機中の注文のサイズを調整し,市場および他の特徴を把握するためにアクティブ購入注文のサイズを観察し,数千ドルの監視を簡単に節約します.

img

戦略 ソース コード

戦略コードは,非常にシンプルで,初心者向けに適した80行のみです. ここでは,プログラムに固定された注文精度などのパラメータがいくつか書かれています. パラメータは以下のように変更できます. 保存することが推奨されています. 取引ペアまたはトレーダーが制御不能になった場合,いつでも任意の利息を請求することができます.

img

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 //Subtract your own pending orders here
        }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) //Guaranteed at the market
    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
var log_account_time = 0
function main() {
    CancelPendingOrders()
    while (true) {
        OnTick()
    }
}

もっと