Perdagangan grid kontrak dua hala v1.0.2

Penulis:angin, Tarikh: 2021-06-24 15:37:17
Tag:Grid

Perdagangan grid kontrak dua hala v1.0.2

Fungsi

Perdagangan Grid Kontrak Di samping itu, mereka juga membuat perbezaannya dengan melakukan lebih banyak kerja. Oleh kerana strategi dua hala adalah sangat kecil,

  • Pembelian yang terlalu lama
  • Penggandaan
  • Pendaftaran automatik
  • Trend berbayar (dalam pembangunan, versi berbayar)
  • Pergerakan turun turun dinamik mengubah jumlah pesanan (dalam pembangunan, versi berbayar)
  • Trend penggelek emas bergabung (dalam pembangunan, versi berbayar)

Pengukuran semula data

img

img

Perdua dalam tempoh enam bulan 2000u Peningkatan adalah jelas, walaupun naik atau turun, ia boleh bertahan.

Perkhidmatan

Pengoptimuman berterusan



/*backtest
start: 2021-01-01 00:00:00
end: 2021-06-21 23:59:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":2000}]
*/

// 首次买入
let FIRST_BUY = true;
// 已存在买涨订单
let MANY_BUYING = false;
// 已存在做空订单
let SHORT_BUYING = false;
// 买涨订单创建时间
let MANY_BUY_TIME = null;
// 做空订单创建时间
let SHORT_BUY_TIME = null;
// 买涨空仓时间
let MANY_EMPTY_STEP_TIME = null;
// 做空空仓时间
let SHORT_EMPTY_STEP_TIME = null;
// 校验空仓时间
let CHECK_TIME = null;

let QUANTITY = [0.001, 0.002, 0.004, 0.008, 0.016, 0.032, 0.064];
// 下次购买价格(多仓)
let MANY_NEXT_BUY_PRICE = 0;
// 下次购买价格(空仓)
let SHORT_NEXT_BUY_PRICE = 0;
// 当前仓位(多仓)
let MANY_STEP = 0;
// 当前仓位(空仓)
let SHORT_STEP = 0;
// 止盈比率
let PROFIT_RATIO = 1;
// 补仓比率
let DOUBLE_THROW_RATIO = 1.5;
// 卖出后下次购买金额下浮比率
let BUY_PRICE_RATIO = 1;
// 交易订单列表(多仓)
let MANY_ORDER_LIST = [];
// 交易订单列表(空仓)
let SHORT_ORDER_LIST = [];

function getManyQuantity() {
    if (MANY_STEP < QUANTITY.length) {
        return QUANTITY[MANY_STEP]
    }
    return QUANTITY[0]
}

function getShortQuantity() {
    if (SHORT_STEP < QUANTITY.length) {
        return QUANTITY[SHORT_STEP]
    }
    return QUANTITY[0]
}

function firstManyBuy(ticker) {
    if (MANY_BUYING) {
        return
    }
    exchange.SetDirection("buy")
    let orderId = exchange.Buy(ticker.Last, getManyQuantity())
    if (!orderId) {
        return
    }
    MANY_BUYING = true
    while (true) {
        exchange.SetDirection("buy") 
        let order = exchange.GetOrder(orderId)
        if (null === order) {
            continue
        }
        if (1 === order.Status || 2 === order.Status) {
            MANY_NEXT_BUY_PRICE = order.Price * ((100 - DOUBLE_THROW_RATIO) / 100)
            MANY_STEP = MANY_STEP + 1
            MANY_BUYING = false
            MANY_EMPTY_STEP_TIME = null
            let sellPrice = order.Price * ((100 + PROFIT_RATIO) / 100)
            MANY_ORDER_LIST.push({
                buyPrice: order.Price,
                sellPrice: sellPrice,
                quantity: order.Amount,
                isSell: false,
            })
            break
        }
    }
}

function firstShortBuy(ticker) {
    if (SHORT_BUYING) {
        return
    }
    exchange.SetDirection("sell")
    let orderId = exchange.Sell(ticker.Last, getShortQuantity())
    if (!orderId) {
        return
    }
    SHORT_BUYING = true
    while (true) {
        let order = exchange.GetOrder(orderId)
        if (null === order) {
            continue
        }
        if (1 === order.Status || 2 === order.Status) {
            SHORT_NEXT_BUY_PRICE = order.Price * ((100 + DOUBLE_THROW_RATIO) / 100)
            SHORT_STEP = SHORT_STEP + 1
            SHORT_BUYING = false
            SHORT_EMPTY_STEP_TIME = null
            let sellPrice = order.Price * ((100 - PROFIT_RATIO) / 100)
            SHORT_ORDER_LIST.push({
                buyPrice: order.Price,
                sellPrice: sellPrice,
                quantity: order.Amount,
                isSell: false,
            })
            break
        }
    }
}

function manyBuy(ticker) {
    if (MANY_BUYING) {
        return
    }
    Log('ticker: ' + ticker.Last + ' MANY_NEXT_BUY_PRICE: ' + MANY_NEXT_BUY_PRICE)
    if (ticker.Last > MANY_NEXT_BUY_PRICE) {
        return
    }
    exchange.SetDirection("buy")
    let orderId = exchange.Buy(ticker.Last, getManyQuantity())
    if (!orderId) {
        return
    }
    MANY_BUYING = true
    MANY_BUY_TIME = Unix()
    while (true) {
        let now = Unix()
        let order = exchange.GetOrder(orderId)
        let expire = MANY_BUY_TIME + (60 * 30)
        if (null === order) {
            continue
        }
        // 买入成功处理
        if (1 === order.Status || 2 === order.Status) {
            MANY_NEXT_BUY_PRICE = order.Price * ((100 - DOUBLE_THROW_RATIO) / 100)
            MANY_STEP = MANY_STEP + 1
            MANY_BUYING = false
            MANY_EMPTY_STEP_TIME = null
            let sellPrice = order.Price * ((100 + PROFIT_RATIO) / 100)
            MANY_ORDER_LIST.push({
                buyPrice: order.Price,
                sellPrice: sellPrice,
                quantity: order.Amount,
                isSell: false,
            })
            break
        }
        // 买入超时处理
        if (now >= expire) {
            exchange.CancelOrder(orderId)
            MANY_BUYING = false
            MANY_BUY_TIME = null
            MANY_NEXT_BUY_PRICE = ticker.Last * ((100 - DOUBLE_THROW_RATIO) / 100)
            return
        }
    }
}

function shortBuy(ticker) {
    if (SHORT_BUYING) {
        return
    }
    Log('ticker: ' + ticker.Last + ' SHORT_NEXT_BUY_PRICE: ' + SHORT_NEXT_BUY_PRICE)
    if (ticker.Last < SHORT_NEXT_BUY_PRICE) {
        return
    }
    exchange.SetDirection("sell")
    let orderId = exchange.Sell(ticker.Last, getShortQuantity())
    if (!orderId) {
        return
    }
    SHORT_BUYING = true
    SHORT_BUY_TIME = Unix()
    while (true) {
        let now = Unix()
        let expire = SHORT_BUY_TIME + (60 * 30)
        let order = exchange.GetOrder(orderId)
        if (null === order) {
            continue
        }
        // 买入成功处理
        if (1 === order.Status || 2 === order.Status) {
            SHORT_NEXT_BUY_PRICE = order.Price * ((100 + DOUBLE_THROW_RATIO) / 100)
            SHORT_STEP = SHORT_STEP + 1
            SHORT_BUYING = false
            SHORT_EMPTY_STEP_TIME = null
            let sellPrice = order.Price * ((100 - PROFIT_RATIO) / 100)
            SHORT_ORDER_LIST.push({
                buyPrice: order.Price,
                sellPrice: sellPrice,
                quantity: order.Amount,
                isSell: false,
            })
            break
        }
        // 买入超时处理
        if (now >= expire) {
            exchange.CancelOrder(orderId)
            SHORT_BUYING = false
            SHORT_BUY_TIME = null
            SHORT_NEXT_BUY_PRICE = ticker.Last * ((100 + DOUBLE_THROW_RATIO) / 100)
            return
        }
    }
}


function manySell(ticker) {
    // 遍历卖出订单
    for (let item of MANY_ORDER_LIST) {
        if (item.isSell) {
            continue
        }
        if (ticker.Last >= item.sellPrice) {
            item.isSell = true;
            exchange.SetDirection("closebuy")
            let orderId = exchange.Sell(ticker.Last, item.quantity)
            if (!orderId) {
                return
            }
            while (true) {
                let order = exchange.GetOrder(orderId)
                if (null === order) {
                    continue
                }
                if (1 === order.Status || 2 === order.Status) {
                    MANY_NEXT_BUY_PRICE = ticker.Last * ((100 - BUY_PRICE_RATIO) / 100)
                    MANY_STEP = MANY_STEP - 1
                    if (0 === MANY_STEP) {
                        MANY_EMPTY_STEP_TIME = Unix()
                    }
                    break
                }
            }
        }
    }
}

function shortSell(ticker) {
    // 遍历卖出订单
    for (let item of SHORT_ORDER_LIST) {
        if (item.isSell) {
            continue
        }
        if (ticker.Last <= item.sellPrice) {
            item.isSell = true;
            exchange.SetDirection("closesell")
            let orderId = exchange.Buy(ticker.Last, item.quantity)
            if (!orderId) {
                return
            }
            while (true) {
                let order = exchange.GetOrder(orderId)
                if (null === order) {
                    continue
                }
                if (1 === order.Status || 2 === order.Status) {
                    SHORT_NEXT_BUY_PRICE = ticker.Last * ((100 + BUY_PRICE_RATIO) / 100)
                    SHORT_STEP = SHORT_STEP - 1
                    if (0 === SHORT_STEP) {
                        SHORT_EMPTY_STEP_TIME = Unix()
                    }
                    break
                }
            }
        }
    }
}

function check(ticker) {
    let now = Unix()
    if (null !== CHECK_TIME) {
        let expire = CHECK_TIME + (60 * 10)
        if (now < expire) {
            return
        }
    }
    CHECK_TIME = now

    if (null !== MANY_EMPTY_STEP_TIME) {
        let expire = MANY_EMPTY_STEP_TIME + (60 * 30)
        if (now >= expire) {
            MANY_NEXT_BUY_PRICE = ticker.Last * ((100 - DOUBLE_THROW_RATIO) / 100)
            Log('没有买涨持仓, 调整买入价: ' + MANY_NEXT_BUY_PRICE)
        }
    }
    
    if (null !== SHORT_EMPTY_STEP_TIME) {
        let expire = SHORT_EMPTY_STEP_TIME + (60 * 30)
        if (now >= expire) {
            SHORT_NEXT_BUY_PRICE = ticker.Last * ((100 + DOUBLE_THROW_RATIO) / 100)
            Log('没有做空持仓, 调整买入价: ' + SHORT_NEXT_BUY_PRICE)
        }
    }
}

function onTick() {
    // 在这里写策略逻辑,将会不断调用,例如打印行情信息
    let ticker = exchange.GetTicker()
    if (!ticker) {
        return
    }
    if (FIRST_BUY) {
        // 首次做多购买
        firstManyBuy(ticker)
        // 首次做空购买
        firstShortBuy(ticker)
        FIRST_BUY = false
        return
    }
    
    // 做多买入
    manyBuy(ticker)
    // 做空买入
    shortBuy(ticker)
    // 做多卖出
    manySell(ticker)
    // 做空卖出
    shortSell(ticker)
    // 空仓检测
    check(ticker)
}

function main() {
    // 开合约
    exchange.SetContractType("swap")

    while(true){
        onTick()
        // Sleep函数主要用于数字货币策略的轮询频率控制,防止访问交易所API接口过于频繁
        Sleep(60000)
    }
}


Berkaitan

Lebih lanjut

Hexie8Bolehkah kita mempunyai banyak mata wang?

Rich_rorycheck Apakah maksudnya?.......

artronKenapa ini tidak mempunyai parameter strategi?

Exodus [Sunting]Ia juga mendapati masalah, pada masa ujian 2020-1-1 hingga 2020-6 bulan, pada masa ujian 3-30 seluruh bot berhenti, selain itu, ketika ujian ETH pada masa ujian 2021-1-1 hingga 201-6-21 ia akan berhenti pada masa ujian 1-2, tidak tahu apakah masalah FMZ atau masalah bot. Penulis boleh menguji sendiri.

EvanTidak boleh dianggap sebagai perlindungan yang sebenar.

Exodus [Sunting]Tambahnya, WeChat tidak bertindak balas, hanya boleh datang ke sini untuk mengatakan beberapa ayat, berjalan selama 7 hari, 200 pisau dan 70 pisau emas. 1. Adakah fungsi bukaan dua arah adalah normal? Lihat strategi mengatakan bahawa bukaan dua arah, peluang berlakunya adalah sangat kecil, tetapi dalam tujuh hari kecuali robot yang baru sahaja dimulakan membuka dua arah, hampir tidak ada bukaan dua arah, setelah penyelidikan saya mendapati bahawa 10 minit mengemas kini satu kedudukan bukaan, yang menyebabkan perubahan yang lebih perlahan tidak ada gunanya, juga bukaan dua arah tidak ada gunanya, contohnya BTC jatuh 5% hari ini tidak dibuka. Adakah perlu dioptimumkan di sini? 2. untuk membesarkan dana simpanan lalai, tidak mahu membesarkan dana perlu memastikan dana 1000 pisau hingga 2000 pisau lebih, saya mempunyai dua ratus pisau hari ini jika tidak ada sebab yang tidak diketahui saya telah membesarkan dana simpanan, sementara ditambah jaminan. Jika dana tidak mencukupi, anda juga boleh menyesuaikan jumlah simpanan secara manual, ingatkan di sini, supaya tidak melihat kod pembesar dana simpanan. 3. Sila tanya, kerana tidak pernah berhenti kerugian, jadi jika modal yang mencukupi tidak akan pernah pecah, tetapi mengapa kerugian berlaku dalam kajian semula? Secara logiknya kerugian adalah pecah, atau dana kepada sifar sahaja betul, di mana saya salah faham, minta petunjuk. Strategi yang saya sukai, anda boleh membuat keuntungan tanpa mengira arah, penyesuaian kenaikan harga dan modal tidak berisiko tinggi, rasa penyesuaian harga terbuka dan berlebihan boleh dioptimumkan, mengikut modal yang ditambah dengan penyesuaian kenaikan harga dan sebagainya

YaXTeman lelaki

Exodus [Sunting]Sudah selesai, tukar dengan Binance.

Exodus [Sunting]Lihat semula rasa yang baik, tetapi seolah-olah tidak boleh digunakan di cakera sebenar? Saya token membuka bch akan memberikan kesalahan, Sell ((490.14, 0.001): map[err_code:1067 err_msg:The volume field is illegal. Please re-enter. status:error ts:1.625132342294e+12].

WbsyTidak ada rak?

Exodus [Sunting]Ini adalah kurva keuntungan yang dahsyat, lebih 120 peratus.

Meminum, menyalakan lampu dan melihat pedangMenertawakan saya

Exodus [Sunting]Saya sangat teruja untuk melihat 2.0 dan saya sangat teruja untuk melihat bagaimana saya boleh mengalami strategi baru ini.

anginMasalah ini telah ditemui dalam versi 2.0 pembangunan. Sebab tidak boleh beli adalah kerana peratusan pembelian tetap, iaitu naik satu peratus, naik satu peratus, turun satu peratus, beli satu peratus Oleh kerana kenaikan harga adalah satu peratus, kenaikan harga adalah satu peratusan pembelian, dari 1000 tan hingga 1500, dan peratusan 1000 dan peratusan 1500 adalah berbeza, sehingga kosong lebih sukar untuk dibeli, dan perubahan harga terlalu kerap menyebabkan kosong mungkin tidak dapat dibeli. Masalah Stop Loss, dalam versi 2.0 dilakukan beberapa pengendalian, sangat mudah pengendalian stop loss, tetapi dari data pengukuran semula, kesan masih boleh, apabila anda membeli atau membuat kedudukan kosong mencapai ambang tertentu, 1.0 tidak diproses sehingga akan muncul beberapa pesanan yang tidak pernah dapat ditangani, seperti pada BTC 65000 jumlah pembeli 0.001, maka BTC jatuh satu ini tidak pernah keluar /upload/asset/2034c4ec56c423120b9c6.png /upload/asset/203032c94e60a3915cc9f.png /upload/asset/2030b880b030476977f4b.png /upload/asset/2030d89e9fd59f528be4c.png

anginSaya menggunakan Bitcoin untuk mengesan bahawa cakera sebenar yang sedang berjalan mungkin melaporkan beberapa kesilapan di platform lain.

anginRekod sebenar masih berjalan, memerlukan masa

anginLihatlah kurva terbaru, yang baru sahaja ditulis adalah bug.