В процессе загрузки ресурсов... загрузка...

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

Автор:Изобретатели количественного измерения - мечты, Дата: 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, то насколько она высока?

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

Изобретатели количественного измерения - мечтыУ вас недостаточно денег на счету, недостаточно гарантий, недостаточно средств для оплаты.

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