쌍방향 계약 격자 거래 v1.0.2

저자:바람, 날짜: 2021-06-24 15:37:17
태그:격자

쌍방향 계약 격자 거래 v1.0.2

기능

계약 격자 거래 그리고 더 많은 시간을 할애하여 다른 가격에 할당합니다. 이중 전략으로 인해 폭발 가능성이 매우 낮습니다.

  • 구매 후 시간 판단
  • 두 배로
  • 자동 계산
  • 트렌드 오픈 (개발 중, 유료 버전)
  • 하락 속도 동적 개정 오픈 횟수 (개발 중, 유료 버전)
  • 금포크 사형포크 트렌드 가입 (개발 중, 유료 버전)

데이터 재검토

img

img

2000년 6월에 두 배로 증가했습니다. 이윤은 분명합니다. 상승과 하락을 막는 것입니다.

유지보수

지속적인 최적화



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


관련

더 많은

엑시8자금의 다양성?

리치 로리체크란 무엇을 의미합니까?

아트론왜 정책 파라미터 설정이 없나요?

에콰도르또한 2020-1-1에서 2020-6월까지의 리테스트 시점에서는 3-30까지 전체 로봇이 멈췄으며, 또한 2021-1-1에서 201-6-21까지의 테스트 시점에서는 ETH 테스트 시점에서는 1-2로 멈췄습니다.

에반이건 진짜 다공간 헤지킹이 아니죠.

에콰도르이 글의 저자는 위크스컴에 대한 답변이 없었고, 7일 동안 200개의 칼을 사용했고, 70개의 칼을 사용했습니다. 1. 쌍방향 오픈 단일 기능이 정상인가? 전략에 따르면 쌍방향 유독, 폭발 확률은 매우 작지만, 7일 동안 로봇이 시작했을 때 두방향 유독을 열었지만 거의 두방향이 열리지 않았습니다. 내 연구에 따르면 10분 동안 열기 위치를 업데이트 한 것이 무의미했습니다. 2. 기본 모금금에 대한 폭동, 1000개에서 2000개 이상의 모금금을 보장해야 할 폭동이 필요하다고 생각하면, 나는 200개 칼을 가지고 있습니다. 오늘 갑자기 깨어나지 않으면 나는 일시적으로 추가 보증금으로 폭동했습니다. 3.손실은 결코 멈추지 않기 때문에 자본이 충분하다면 절대 폭동하지 않을까요? 하지만 재검토에서 왜 손실이 발생합니까? 이론적으로 손실은 폭동, 즉 자본은 0으로 돌아갑니다. 이 전략은 내가 좋아하는 것, 방향에 상관없이 수익을 얻을 수 있습니다, 부채와 자본의 부채를 조정하면 부채의 위험이 크지 않습니다, 오픈 및 부채의 가격을 조정하면 최적화 될 수 있다는 느낌, 자본에 따라 부채의 부가가치를 조정합니다.

예X형은 微信

에콰도르이 문제를 해결하고, 비엔인을 교환하면 됩니다.

에콰도르다시 확인하는 것은 좋은 느낌이지만 실제 디스크에서 사용할 수 없는 것 같습니까? bch를 토큰으로 열면 오류가 발생합니다. 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];; 계약 뒤에 장수가 아닌데, 왜 소수일까요?

wbsy실제 음반이 없나요?

에콰도르이 수익곡선은 정말 끔찍합니다. 120%가 넘는 손실이 있습니다.

술에 취해서 불을 꺼서 검을 봤다웃어 죽었어요.

에콰도르아쉽게도, 오늘 손실이 컸고, 2.0을 기대하고 있습니다.

바람이 문제는 개발 2.0에서 발견되었습니다. 비공개 구매가 불가능한 이유는 상환 비율이 고정되어 있기 때문입니다. 즉, 1퍼센트 상승, 비공개, 1퍼센트 하락, 인수입니다. 하락률은 1퍼센트이고 하락률은 구매율에 일치하기 때문에 1000톤에서 1500톤까지, 1000퍼센트와 1500퍼센트의 비율은 다르기 때문에 하락값은 구매하기 어렵고, 가격 변경이 너무 빈번하기 때문에 하락값은 구매되지 않을 수 있습니다. 손익분기 문제, 2.0 버전에서는 어떤 처리, 아주 간단한 손익분기 처리, 하지만 재검토 데이터에서 볼 때 효과도 있습니다, 당신이 구매 또는 빈 포지션을 특정 문턱에 도달 할 때 전체 주식을 판매하기 시작, 1.0 처리하지 않습니다 그래서 일부 주문이 결코 거래 될 수 없습니다 발생, 예를 들어 BTC 65000 구매자 수 0.001, BTC 떨어지면이 단위는 결코 나올 수 없습니다 /upload/asset/2034c4ec56c423120b9c6.png /upload/asset/203032c94e60a3915cc9f.png /upload/asset/2030b880b030476977f4b.png /upload/asset/2030d89e9fd59f528be4c.png

바람저는 Binance를 사용하여 실행되는 디스크를 테스트했습니다. 다른 플랫폼에서 오류가 발생할 수 있습니다.

바람실제 디스크는 아직 작동 중이며 시간이 필요합니다.

바람이 곡선에서 가장 최근의 곡선을 보세요.