Contrato de criptomonedas bot de supervisión de órdenes sencillo

El autor:No lo sé., Creado: 2022-04-11 10:47:42, Actualizado: 2022-04-11 10:53:37

Contrato de criptomonedas bot de supervisión de órdenes sencillo

En el artículo anterior, implementamos un simple bot de supervisión de pedidos al contado, y hoy vamos a implementar una versión de contrato de un bot de supervisión de pedidos simple.

Idea de diseño

Hay una gran diferencia entre el bot de supervisión de órdenes de la versión del contrato y la versión al contado. La supervisión de órdenes al contado se puede realizar principalmente mediante el monitoreo de los cambios de activos de la cuenta. La versión de futuros necesita monitorear los cambios de posición en una cuenta. Por lo tanto, la situación de la versión de futuros es más complicada, porque hay diferentes contratos para posiciones largas y cortas de futuros, que necesita tratar una serie de detalles. La idea central es monitorear los cambios de posición y desencadenar la acción de supervisión de órdenes basada en los cambios de posición. Originalmente fue diseñado para tratar posiciones largas y cortas juntas, pero encontramos que sería complicado lidiar con eso. Después de analizar el problema, se decide tratar las posiciones largas y cortas por separado.

Aplicación de la estrategia

Parámetro de estrategia:

img

Soporta backtest, y puede utilizar directamente los ajustes predeterminados para backtest para la observación.

Código de origen:

/*backtest
start: 2021-03-18 00:00:00
end: 2021-04-07 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_OKCoin","currency":"BTC_USD"},{"eid":"Futures_OKCoin","currency":"BTC_USD"},{"eid":"Futures_OKCoin","currency":"BTC_USD"}]
*/

function test() {
    // test function 
    var ts = new Date().getTime()    
    if (ts % (1000 * 60 * 60 * 6) > 1000 * 60 * 60 * 5.5) {
        Sleep(1000 * 60 * 10)
        var nowPosAmount = getPosAmount(_C(exchange.GetPosition), refCt)
        var longPosAmount = nowPosAmount.long
        var shortPosAmount = nowPosAmount.short
        var x = Math.random()
        if (x > 0.7) {
            exchange.SetDirection("buy")
            exchange.Buy(-1, _N(Math.max(1, x * 10), 0), "the reference account tests ordering#FF0000")
        } else if(x < 0.2) {
            exchange.SetDirection("sell")
            exchange.Sell(-1, _N(Math.max(1, x * 10), 0), "the reference account tests ordering#FF0000")
        } else if(x >= 0.2 && x <= 0.5 && longPosAmount > 4) {
            exchange.SetDirection("closebuy")
            exchange.Sell(-1, longPosAmount, "the reference account tests closing positions#FF0000")
        } else if(shortPosAmount > 4) {
            exchange.SetDirection("closesell")
            exchange.Buy(-1, _N(shortPosAmount / 2, 0), "he reference account tests closing position#FF0000")
        }
    }
}

function getPosAmount(pos, ct) {
    var longPosAmount = 0
    var shortPosAmount = 0
    _.each(pos, function(ele) {
        if (ele.ContractType == ct && ele.Type == PD_LONG) {
            longPosAmount = ele.Amount
        } else if (ele.ContractType == ct && ele.Type == PD_SHORT) {
            shortPosAmount = ele.Amount
        }
    })
    return {long: longPosAmount, short: shortPosAmount}
}

function trade(e, ct, type, delta) {
    var nowPosAmount = getPosAmount(_C(e.GetPosition), ct)
    var nowAmount = type == PD_LONG ? nowPosAmount.long : nowPosAmount.short
    if (delta > 0) {
        // open position
        var tradeFunc = type == PD_LONG ? e.Buy : e.Sell
        e.SetDirection(type == PD_LONG ? "buy" : "sell")
        tradeFunc(-1, delta)
    } else if (delta < 0) {
        // close position 
        var tradeFunc = type == PD_LONG ? e.Sell : e.Buy
        e.SetDirection(type == PD_LONG ? "closebuy" : "closesell")
        if (nowAmount <= 0) {
            Log("no position detected")
            return 
        }
        tradeFunc(-1, Math.min(nowAmount, Math.abs(delta)))
    } else {
        throw "error"
    }
}

function main() {
    LogReset(1)
    if (exchanges.length < 2) {
        throw "no platform with order supervision"
    }
    var exName = exchange.GetName()
    // detect the platform for reference 
    if (!exName.includes("Futures_")) {
        throw "only support futures order supervising"
    }
    Log("start monitoring", exName, "platform", "#FF0000")
    
    // detect the order supervising platform 
    for (var i = 1 ; i < exchanges.length ; i++) {
        if (exchanges[i].GetName() != exName) {
            throw "The order supervising platform is different from the reference platform!"
        }
    }
    
    // set trading pair and contract 
    _.each(exchanges, function(e) {
        if (!IsVirtual()) {
            e.SetCurrency(refCurrency)
            if (isSimulate) {
                if (e.GetName() == "Futures_OKCoin") {
                    e.IO("simulate", true)
                }
            }
        }
        e.SetContractType(refCt)
    })

    var initRefPosAmount = getPosAmount(_C(exchange.GetPosition), refCt)
    while(true) {
        if (IsVirtual()) {    // only simulate during backtest 
            test()            // test function, which simulates a reference account to trade automatically, to trigger the order supervising of the account        
        }
        Sleep(5000)
        var nowRefPosAmount = getPosAmount(_C(exchange.GetPosition), refCt)
        var tbl = {
            type : "table", 
            title : "position",
            cols : ["name", "label", "long", "short", "account asset (Stocks)", "account assest (Balance)"],
            rows : []
        }
        _.each(exchanges, function(e) {
            var pos = getPosAmount(_C(e.GetPosition), refCt)
            var acc = _C(e.GetAccount)
            tbl.rows.push([e.GetName(), e.GetLabel(), pos.long, pos.short, acc.Stocks, acc.Balance])
        })
        LogStatus(_D(), "\n`" + JSON.stringify(tbl) + "`")
        
        // calculate the position amount of change 
        var longPosDelta = nowRefPosAmount.long - initRefPosAmount.long
        var shortPosDelta = nowRefPosAmount.short - initRefPosAmount.short

        // detect the change 
        if (longPosDelta == 0 && shortPosDelta == 0) {
            continue
        } else {
            // detect the position change 
            for (var i = 1 ; i < exchanges.length ; i++) {
                // execute the action of long
                if (longPosDelta != 0) {
                    Log(exchanges[i].GetName(), exchanges[i].GetLabel(), "Execute long order supervising, amount of change:", longPosDelta)
                    trade(exchanges[i], refCt, PD_LONG, longPosDelta)
                }
                // execute the action of short
                if (shortPosDelta != 0) {
                    Log(exchanges[i].GetName(), exchanges[i].GetLabel(), "Execute short order supervising, amount of change:", shortPosDelta)
                    trade(exchanges[i], refCt, PD_SHORT, shortPosDelta)
                }
            }
        }

        // after the operation of order supervising, update
        initRefPosAmount = nowRefPosAmount
    }
}

Prueba

Teniendo en cuenta el hecho de que después de que OKEX actualizó la interfaz V5, y el bot simulado OKEX se puede utilizar, usé API KAYs de dos bots simulados OKEX para probar, muy convenientemente.

El primer objeto de intercambio que se añade es la plataforma de referencia, y la plataforma de supervisión de órdenes sigue la cuenta de la plataforma de referencia para operar. En la página del bot simulado de OKEX, la cuenta de la plataforma de referencia coloca manualmente 3 contratos trimestrales de criptomonedas con margen de ETH.

img

Se puede ver que el bot detectó los cambios de posición, y las siguientes operaciones.

img

Intentemos cerrar las 2 posiciones de contrato que acabamos de abrir.

img

El robot siguió para operar y cerró 2 contratos.

img

La estrategia está diseñada de una manera sencilla y fácil de entender sin optimización. La parte mejorada también necesita lidiar con detalles como la detección de activos al supervisar órdenes. Para simplificar el diseño, se utilizan órdenes de mercado para supervisar órdenes. La estrategia solo proporciona ideas de aprendizaje, y el bot se puede optimizar de acuerdo con sus necesidades.

Dirección estratégica:https://www.fmz.com/strategy/270012

Bienvenidos a dejar sus comentarios.


Más.