Стратегия двулинейных криптовалютных фьючерсов (обучение)

Автор:Маленькие мечты, Дата: 2021-12-03 11:25:28
Тэги:

Ссылки:https://www.fmz.com/bbs-topic/8479


/*backtest
start: 2021-09-01 00:00:00
end: 2021-12-02 00:00:00
period: 1h
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

var LONG = 1 
var SHORT = -1
var IDLE = 0

function getPosition(positions, direction) {
    var ret = {Price : 0, Amount : 0, Type : ""}
    _.each(positions, function(pos) {
        if (pos.Type == direction) {
            ret = pos
        }
    })
    return ret 
}

function cancellAll() {
    while (true) {
        var orders = _C(exchange.GetOrders)
        if (orders.length == 0) {
            break
        } else {
            for (var i = 0 ; i < orders.length ; i++) {
                exchange.CancelOrder(orders[i].Id, orders[i])
                Sleep(500)
            }
        }
        Sleep(500)
    }
}

function cover(tradeFunc, direction) {
    var mapDirection = {"closebuy": PD_LONG, "closesell": PD_SHORT}
    var positions = _C(exchange.GetPosition)
    var pos = getPosition(positions, mapDirection[direction])
    if (pos.Amount > 0) {
        cancellAll()
        exchange.SetDirection(direction)
        if (tradeFunc(-1, pos.Amount)) {
            return true 
        } else {
            return false 
        }
    }
    return true 
}

function main() {
    if (okexSimulate) {
        exchange.IO("simulate", true) // 切换到OKEX V5模拟盘测试 
        Log("切换到OKEX V5模拟盘")
    }    
    exchange.SetContractType(ct)
    var state = IDLE
    var holdPrice = 0
    var preTime = 0

    while (true) {
        var r = _C(exchange.GetRecords)
        var l = r.length
        if (l < Math.max(ema1Period, ema2Period)) {
            Sleep(1000)
            continue
        }
        var ema1 = TA.EMA(r, ema1Period)
        var ema2 = TA.EMA(r, ema2Period)
        
        // 画图
        $.PlotRecords(r, 'K线')
        if(preTime !== r[l - 1].Time){
            $.PlotLine('ema1', ema1[l - 2], r[l - 2].Time)
            $.PlotLine('ema2', ema2[l - 2], r[l - 2].Time)
            
            $.PlotLine('ema1', ema1[l - 1], r[l - 1].Time)
            $.PlotLine('ema2', ema2[l - 1], r[l - 1].Time)
            preTime = r[l - 1].Time
        } else {
            $.PlotLine('ema1', ema1[l - 1], r[l - 1].Time)
            $.PlotLine('ema2', ema2[l - 1], r[l - 1].Time)
        }
        
        var up = (ema1[l - 2] > ema1[l - 3] && ema1[l - 4] > ema1[l - 3]) && (ema2[l - 2] > ema2[l - 3] && ema2[l - 4] > ema2[l - 3])
        var down = (ema1[l - 2] < ema1[l - 3] && ema1[l - 4] < ema1[l - 3]) && (ema2[l - 2] < ema2[l - 3] && ema2[l - 4] < ema2[l - 3])
        if (up && (state == SHORT || state == IDLE)) {
            if (state == SHORT && cover(exchange.Buy, "closesell")) {
                state = IDLE
                holdPrice = 0
                $.PlotFlag(r[l - 1].Time, 'coverShort', 'CS')
            }
            exchange.SetDirection("buy")
            if (exchange.Buy(-1, amount)) {
                state = LONG
                holdPrice = r[l - 1].Close
                $.PlotFlag(r[l - 1].Time, 'openLong', 'L')
            }
        } else if (down && (state == LONG || state == IDLE)) {
            if (state == LONG && cover(exchange.Sell, "closebuy")) {
                state = IDLE
                holdPrice = 0
                $.PlotFlag(r[l - 1].Time, 'coverLong', 'CL')
            }
            exchange.SetDirection("sell")
            if (exchange.Sell(-1, amount)) {
                state = SHORT
                holdPrice = r[l - 1].Close
                $.PlotFlag(r[l - 1].Time, 'openShort', 'S')
            }
        }
        
        // 止盈
        if (state == LONG && r[l - 1].Close - holdPrice > profitTarget && cover(exchange.Sell, "closebuy")) {            
            state = IDLE
            holdPrice = 0
            $.PlotFlag(r[l - 1].Time, 'coverLong', 'CL')
        } else if (state == SHORT && holdPrice - r[l - 1].Close > profitTarget && cover(exchange.Buy, "closesell")) {            
            state = IDLE
            holdPrice = 0
            $.PlotFlag(r[l - 1].Time, 'coverShort', 'CS')
        }
        LogStatus(_D())
        Sleep(500)        
    }
}

Больше

xxs1xxs1Я сделал небольшие изменения, и результаты кажутся хорошими. Вы даете советы. Риск и оптимизация. https://www.fmz.com/m/edit-strategy/359761

Небо и земляУчительница: Сколько раз вы учитесь на этом тесте?

Небо и земляНачало диска. Никакой реакции.

Небо и земля/upload/asset/2152afd2a78355e8ce25b.png

Небо и земляBuy ((-1, 5): 400: {"code":-2019, "msg:"Margin is insufficient. "} Что это значит?

Небо и земляМаленькая мечта учительница: пожалуйста, добавьте свой WeChat, пожалуйста, поговорите со мной лично

Небо и земляМожет ли эта стратегия работать на реальном компьютере?

цикл9macd перекрестный покупает вверх и продает вниз, одновременно переворачивая заказ, не только выигрыш, но и остановка потери как написать

13826543292Слава богу, это здорово.

Маленькие мечтыХорошо, это исследование.

xxs1xxs1Может быть, вы можете придумать стратегию для разблокировки? Или идея работает. Мы слишком сильно пытаемся остановить эту стратегию. Мы хотим добавить блокировку и дождаться следующего рынка.

Маленькие мечтыХорошо, в будущем мы будем делиться большей стратегией, спасибо за поддержку FMZ.

xxs1xxs1Все, что вы можете сказать, это что вы на самом деле 666. Я просто использую преимущество прибыли. Вы можете попробовать EOS. Я собираюсь провести исследование, чтобы увидеть, может ли реальный дисконт быть не таким. В настоящее время этот реальный дисконт оценивается как недостаточный для оплаты расходов. Можно попробовать сделать контракт на BUSD в Биньане.

Маленькие мечтыВ частности, в этом случае не хватает средств на счетах.

Маленькие мечтыОбычно при повторном тестировании рычаг был в 10 раз выше.

Маленькие мечтыX. X. Я тоже говорю, что не разрешается. Но если говорить об этой оптимизированной версии 666, то насколько она высока?

Небо и земляЭто ваш контракт, не так ли?

Маленькие мечтыУ вас недостаточно денег на счету, недостаточно гарантий, недостаточно средств для оплаты.

Маленькие мечтыКод пишут в соответствии с потребностями. Примеры можно найти на площади стратегии.