80줄의 코드의 고주파 전략으로 뇌 없는 로봇을 파는 방법

저자:초목, 창작: 2023-12-24 21:37:45, 업데이트: 2023-12-26 15:40:23

img

관측 기회

최근 두 일 동안 시장을 보면서 비엔안이 비엔인 STORJ 시장을 가지고 있다는 것을 우연히 발견했습니다. 거래량이 많고 거래 빈도가 매우 빠르다는 것은 매우 이상합니다. 특정 1 분 K 라인의 아래 그래프에서 매 분 거래량이 일치하는 것을 볼 수 있습니다.img바이안의 1초 차원 K 라인을 이용한 관측을 통해, 갱이들이 발견되었다. 어떤 사람들은 5-7초 간격으로 1~2만 STORJ를 시가로 매각하고, 비용을 고려하지 않고, 직접 K 라인에 작은 구멍을 뚫고, 가격이 단기간에 회복된다. 이 작업은 분명히 빙산이 위탁한 로봇에 의해 만들어졌다. 이 판매된 작업의 지속 시간은 매우 길었고, 총액은 1천만 달러 수준으로 추정되며, 종종 1000분의 1에 달하는 슬라이프점이 발생했다. 이는 거래의 슬라이프점만을 의미하며, 이 전략의 실행자는 수십만 달러를 잃었다. 그러나 기계적 조작과 활성 거래의 존재는 분명히 시장을 탈취 할 수있는 기회를 제공했다.img

이 로봇은 이 얼음 덩어리를 팔기 위해 뇌가 없는 사람을 착취하는 데 특화된 로봇을 몇 분 만에 만들었습니다.

전략적 아이디어

시가격이 몇 초마다 팔리기 때문에, 우리는 단지 매매책에서 10,000의 깊이를 찾아서 앞쪽에 단자를 걸어 놓아야 한다. 그래서 이 빙산이 팔릴 때, 시장 로봇이 바로 받을 가능성이 높고, 이 때 거래는 매우 활발하다. 순간적인 가격 하락은 또한 몇 가지 매매를 유발한다. 같은 논리는 매매 단위를 순차적으로 던지더라도 반복적으로 작동한다. 거래의 빈도는 매우 높고, 매번의 수익률이 크지 않더라도 전체 수익은 상당히 상당하다. 물론 모든 조건은 낮은 처리 수수료가있는 계좌이며, 매매 처리 수수료가 천분의 1 인 경우,이 공간이 처리 수수료를 지불하기에 충분하지 않습니다.

전략적 성과

전략은 다음과 같습니다. 처음에 수익은 인쇄되지 않았습니다. 오늘 오후에 변경되어 수익을 인쇄했습니다. 미친 판매 로봇은 매번의 양을 약 5000으로 변경했습니다. 그래서 최적의 수익 기간이 지나갔습니다. 처음 시작하면 아마도 한 시간당 100-200U를 구울 수 있습니다. 핵심은 위험과 저렴한 비용입니다. 여기서 반대로 볼 때, 빙산 위탁은 실제로 많은 기술을 가지고 있습니다. 전략을 작성하면 10 분 동안 FMZ에서 지불 명령을 작성 할 수 있습니다.

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 //这里要减去自己的挂单
        }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()
    }
}

더 많은

체크포인트, 이 전략은 얼마나 들까요?

yc123h이 전략이 유효한 경우, 매 라운드의 시작에서 취소 전 두 개의 주문이 실패한 메시지를 자주 볼 수 있는지 (즉, 매매 주문이 모두 유효하다는 것을 보여줍니다) 이 전략이 유효한 경우입니다.

초목이 값은 0입니다

yc123h감사합니다, 또 다른 것은 파라미터에 대한 질문입니다. 이러한 높은 주파수 전략과 같은 파라미터를 최적화하는 방법. 예를 들어, 2014 년 전략에 대해 공유 한 것을 보겠습니다. 기본 회전 간격은 3500ms에 도달합니다. 높은 주파수라면 회전 간격이 조금 짧아야하는 것이 좋습니다. 그러나 너무 짧으면 거래도 어렵습니다. 너무 길다면 시장 변동의 영향을 많이 받습니다.

초목파기 실패는 거래가 되고 돈을 벌면 효과가 있다는 것을 보여줍니다.