Giao dịch lưới hợp đồng hai chiều v1.0.2

Tác giả:gió, Ngày: 2021-06-24 15:37:17
Tags:Mạng lưới

Giao dịch lưới hợp đồng hai chiều v1.0.2

Chức năng

Giao dịch lưới hợp đồng Trong khi đó, việc làm nhiều hơn là để tạo ra lợi nhuận chênh lệch. Do đó, các chiến lược hai chiều có rất ít khả năng xảy ra.

  • Đánh giá mua quá muộn
  • Tăng gấp đôi
  • Đặt hàng tự động
  • Xu hướng mở (đang phát triển, phiên bản trả phí)
  • Tốc độ tăng/giảm thay đổi động số lượng đơn đăng ký (đang phát triển, phiên bản trả phí)
  • Xu hướng đúc kim ngô gia nhập (đang được phát triển, phiên bản trả phí)

Dữ liệu kiểm tra lại

img

img

tăng gấp đôi trong nửa năm 2000 Những lợi ích rất rõ ràng, dù tăng hay giảm đều có thể được giữ vững.

Bảo trì

Tiếp tục tối ưu hóa



/*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)
    }
}


Có liên quan

Thêm nữa

Hexie8Có thể có nhiều đồng tiền không?

Rich_rorycheck có nghĩa là gì.... check tăng / giảm thường xuyên.

artronTại sao nó không có cài đặt tham số chiến lược?

Exodus [Tiêu dịch chiến lược]Ngoài ra, trong thử nghiệm 2021-1-1 đến 201-6-21, ETH sẽ dừng lại ở số 1-2, không biết đó là vấn đề của fmz hay vấn đề của robot. Tác giả có thể tự kiểm tra.

EvanKhông phải là một cái gì đó thực sự, như một cái lưới hợp đồng.

Exodus [Tiêu dịch chiến lược]Tác giả của bài viết không trả lời, chỉ có thể đến đây và nói một vài câu, chạy 7 ngày, 200 dao và 70 dao vàng. 1. việc mở đơn hai chiều có bình thường không? xem các chiến lược nói rằng mở đơn hai chiều, tỷ lệ bùng nổ rất nhỏ, nhưng trong bảy ngày ngoài robot chỉ khởi động mở đơn hai chiều, hầu như không mở đơn hai chiều, sau nghiên cứu của tôi thấy rằng 10 phút cập nhật một vị trí mở đơn, điều này dẫn đến thay đổi chậm hơn không có ý nghĩa, cũng không mở đơn hai chiều, ví dụ như ngày hôm nay BTC giảm 5% ngày hôm nay không mở đơn. 2. bùng về tiền dự trữ mặc định, không muốn bùng cần phải đảm bảo 1000 dao đến 2000 dao hơn tài chính, tôi hai trăm dao hôm nay nếu không có bất kỳ sự bất ngờ thức dậy tôi đã bùng, tạm thời thêm tiền bảo hiểm. Nếu không đủ tiền, bạn cũng có thể tự điều chỉnh số lượng dự trữ, hãy nhắc nhở, để không nhìn vào code của bùng. 3. Xin hỏi, bởi vì không bao giờ dừng lỗ, vì vậy nếu có đủ vốn, liệu bạn sẽ không bao giờ bùng nổ, nhưng tại sao lại có tổn thất trong việc xem lại? Theo lý thuyết, tổn thất là bùng nổ, hoặc vốn trở thành không đúng không? Tôi thích chiến lược này, bạn có thể kiếm được lợi nhuận bất kể hướng đi, điều chỉnh số tiền đặt cược và vốn không có rủi ro lớn, cảm giác điều chỉnh giá mở và quá nhiều có thể được tối ưu hóa, tùy thuộc vào vốn thêm tự điều chỉnh số tiền đặt cược vv

VângAnh trai tôi nhắn tin

Exodus [Tiêu dịch chiến lược]Đánh giá về Bitcoin:

Exodus [Tiêu dịch chiến lược]Xem lại cảm giác tốt, nhưng có vẻ như không thể sử dụng trên ổ đĩa thực? Tôi mã thông báo bch mở sẽ báo lỗi, 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].

wbsyKhông có đĩa thật?

Exodus [Tiêu dịch chiến lược]Đây là một đường nét lợi nhuận khủng khiếp, mất hơn 120%.

Đánh đèn để nhìn kiếm trong lúc sayCười chết tôi.

Exodus [Tiêu dịch chiến lược]Thật không may, ngày hôm nay chúng tôi đã phá sản, tôi rất mong đợi 2.0, hãy hỏi tôi làm thế nào để trải nghiệm chiến lược mới?

gióNhững vấn đề này đã được phát hiện trong phiên bản phát triển 2.0. Lý do mà chúng ta không thể mua được là vì tỷ lệ mở hàng là cố định, tức là tăng một phần trăm, giảm một phần trăm, mua một phần trăm. Vì giá giảm đều là một phần trăm và tỷ lệ mua giảm là đồng nhất, từ 1.000 tấn đến 1.500, một phần trăm 1.000 và một phần trăm 1.500 là khác nhau, nên việc làm trống khó mua hơn và thay đổi giá quá thường xuyên khiến việc làm trống có thể không mua được Các vấn đề dừng lỗ, trong phiên bản 2.0, đã thực hiện một số xử lý, rất đơn giản một xử lý dừng lỗ, nhưng từ dữ liệu kiểm tra lại hiệu quả vẫn có thể, khi bạn mua tiền hoặc làm trống vị trí đạt đến một số ngưỡng nhất định, 1.0 không xử lý vì vậy sẽ có một số đơn đặt hàng không bao giờ có thể được thực hiện, ví dụ như trên BTC 65000 số lượng người mua 0.001, thì BTC giảm đơn hàng này không bao giờ có thể đi ra /upload/asset/2034c4ec56c423120b9c6.png /upload/asset/203032c94e60a3915cc9f.png /upload/asset/2030b880b030476977f4b.png

gióTôi dùng Binance để kiểm tra ổ đĩa thực đang chạy, các nền tảng khác có thể báo cáo một số lỗi

gióĐĩa thực vẫn đang hoạt động, cần thời gian

gióNhìn vào đường cong mới nhất, một lỗi đã được viết trước đó.