Transaksi jaringan kontrak dua arah v1.0.2

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

Transaksi jaringan kontrak dua arah v1.0.2

Fungsi

Perdagangan Jaringan Kontrak Di sisi lain, ada juga yang mengatakan bahwa mereka tidak bisa bekerja lebih lama. Karena strategi dua arah sangat kecil kemungkinan untuk terjadi.

  • Membeli barang terlalu lama
  • Penggandaan
  • Pendaftaran otomatis
  • Tren terbuka (dalam pengembangan, versi berbayar)
  • Tingkat turun naik perubahan dinamis jumlah pesanan (dalam pengembangan, versi berbayar)
  • Tanda-tanda bahwa Anda tidak akan dapat mengakses situs web ini

Pengukuran data

img

img

Dua kali lipat dalam enam bulan 2000 Hasilnya jelas, baik naik atau turun, kita bisa bertahan.

Pemeliharaan

Optimisasi berkelanjutan



/*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 banyak

Hexie8Dapatkah Anda memiliki banyak mata uang?

Rich_rorycheck berarti apa?...............................................................................................................................

ArtronMengapa tidak ada pengaturan parameter strategi?

[Sunting]Selain itu, ketika menguji ETH pada tes 2021-1-1 hingga 201-6-21, apakah akan berhenti pada tes 1-2, tidak tahu apakah itu masalah fmz atau masalah robot. Penulis dapat menguji sendiri.

EvanTidak bisa dianggap sebagai real multi-space hedging, seperti kontrak grid.

[Sunting]WeChat tidak menanggapi, hanya bisa datang ke sini dan mengatakan beberapa kalimat, berjalan selama 7 hari, 200 pisau dan 70 pisau emas. 1. apakah fungsi buka dua arah adalah normal? lihat kebijakan mengatakan buka dua arah, peluang burst sangat kecil, tetapi dalam tujuh hari kecuali robot baru saja memulai membuka dua arah, hampir tidak ada buka dua arah, setelah penelitian saya menemukan bahwa 10 menit untuk memperbarui posisi buka, yang menyebabkan perubahan yang lebih lambat tidak ada gunanya, juga tidak buka dua arah, misalnya hari ini BTC turun 5% hari ini tidak membuka satu arah? apakah perlu dioptimalkan? misalnya, perlu diperpanjang interval deteksi? selain itu, asalkan di pasar besar buka dua arah, jika satu arah juga paling rendah, tidak terlalu memahami. 2. Bledak tentang dana penambahan default, tidak ingin ledak perlu memastikan dana 1.000 pisau hingga 2.000 pisau lebih, saya dua ratus pisau hari ini jika tidak ada yang aneh bangun saya telah ledak, sementara ditambah uang jaminan. Jika dana tidak cukup Anda juga dapat menyesuaikan jumlah penambahan Anda sendiri secara manual, ingatkan di sini, jangan melihat kode ledak. 3. tolong tanyakan, karena tidak pernah berhenti kehilangan, jadi jika modal cukup, apakah tidak akan pernah meledak, tetapi mengapa kerugian terjadi dalam tinjauan kembali? Secara logis, kerugian adalah ledakan, atau uang kembali ke nol saja kan, di mana saya salah paham, minta petunjuk. Strategi ini yang saya sukai, Anda bisa mendapatkan keuntungan terlepas dari arah, penyesuaian kenaikan harga dan modal tidak berisiko tinggi, perasaan penyesuaian harga terbuka dan berlebihan dapat dioptimalkan, sesuai dengan modal yang ditambahkan penyesuaian kenaikan harga dll.

YaXSaudara laki-laki Telegram

[Sunting]"Sudah selesai, dan Bitcoin sudah berjalan.

[Sunting]Lihat kembali terasa bagus, tapi sepertinya tidak bisa digunakan di real disk? Saya membuka token 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 yang nyata?

[Sunting]Ini adalah kurva keuntungan yang mengerikan, lebih dari 120% kerugian.

Menyalakan lampu dan melihat pedangMenertawakan saya.

[Sunting]Saya sangat menyesal, hari ini saya mengalami kerugian besar, dan saya sangat berharap untuk 2.0 dan saya ingin tahu bagaimana saya bisa mengalami strategi baru.

anginMasalah ini ditemukan dalam pengembangan versi 2.0. Alasan untuk tidak membeli adalah karena persentase pembelian tetap, yaitu naik satu persen, naik satu persen, turun satu persen, naik satu persen, naik satu persen. Karena penurunan harga adalah persentase, penurunan harga adalah persentase pembelian yang konsisten, dari 1000 ton hingga 1500, dan persentase 1000 dan 1500 berbeda, maka kosong lebih sulit dibeli, dan harga yang berubah terlalu sering menyebabkan kosong mungkin tidak dibeli. Masalah stop loss, dalam versi 2.0 dilakukan pengolahan tertentu, sangat sederhana pengolahan stop loss, tetapi dari data retesting efeknya masih bisa, ketika Anda membeli atau melakukan posisi kosong mencapai ambang batas tertentu, 1.0 tidak diproses sehingga akan muncul beberapa pesanan yang tidak akan pernah dapat ditransfer, seperti pada BTC 65000 jumlah pembeli 0.001, maka BTC jatuh ini tidak akan pernah keluar /upload/asset/2034c4ec56c423120b9c6.png /upload/asset/203032c94e60a3915cc9f.png /upload/asset/2030b880b030476977f4b.png /upload/asset/2030d89e9fd59f528be4c.png

anginSaya menggunakan Binance untuk mengevaluasi apakah hard drive yang berjalan di platform lain mungkin akan memberikan kesalahan.

anginDisk nyata masih berjalan, butuh waktu

anginLihatlah kurva terbaru, ada bug yang baru saja ditulis sebelumnya.