Strategi gabungan ATR-RSI

Penulis:Satu pisau, Tarikh: 2022-02-13 17:17:17
Tag:

Indikator Atr

Julat sebenar purata (Average True Range), yang diringkaskan sebagai Indikator ATR; digunakan untuk mengukur ketegangan pasaran dan menunjukkan kadar perubahan pasaran, tetapi tidak mencerminkan hala tuju harga dan kestabilan trend. Nilai indikator ini semakin tinggi, kemungkinan perubahan trend semakin besar, dan kemungkinan perubahan trend sebaliknya lebih kecil.

Kaedah pengiraan

Julat turun naik sebenar purata, berdasarkan perhitungan turun naik sebenar dan turun naik sebenar pada hari N yang lalu. Akar turun naik sebenar hari tunggal diambil dari ((harga tertinggi hari ini - harga terendah hari ini) ;; harga tertinggi hari ini - harga penutupan semalam) ;; harga penutupan semalam - harga terendah hari ini) nilai terbesar di antara tiga kumpulan hasil, untuk mendapatkan perbezaan harga dalam julat turun naik terbesar.

Indikator Rsi

Indeks Kekuatan Relatif (RSI) adalah satu petunjuk teknikal mengenai pergerakan pasaran masa depan dengan membandingkan kekuatan beli dan jual kedua-dua belah pihak dalam jangka masa tertentu.

Kaedah pengiraan

RSI = 100 - (100/(1+RS)); RS = jumlah penutupan dan penutupan penutupan pada hari n; RSI umumnya mempunyai 50 sebagai garis tengah, lebih daripada 50 dianggap sebagai pasaran multi-head, dan kurang daripada 50 dianggap sebagai pasaran kosong; RSI lebih besar daripada 70 dianggap sebagai overbought, dengan kemungkinan penarikan semula atau pergeseran pasaran berikutnya, dan kurang daripada 30 adalah oversold, dengan kemungkinan kenaikan berikutnya.

Prinsip-prinsip strategi

ATR digunakan untuk menapis, apabila ATR>ATRMa ((ATR purata selama N hari yang lalu) menunjukkan bahawa pergerakan pasaran mula meningkat dan trend sedang meningkat. RSI digunakan untuk menghasilkan isyarat dagangan.


/*backtest
start: 2021-02-11 00:00:00
end: 2022-02-10 23:59:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Huobi","currency":"BCH_USDT"}]
args: [["rsi_period",12],["atrma_period",18]]
*/

/*
* rsi_period: 强弱指标计算周期
* atr_period: 平均真实波幅计算周期
* atrma_period: 平均真实波幅均值计算呢周期
* tick_interval: 时间间隔
* slide_price: 下单滑动值
*/

// RSI指示操作状态
var RSI_NONE = 0;
var RSI_BUY = 1;
var RSI_SELL = 2;

var last_rsi_staus;

// ATR活跃信号判断
function isAtrActive(records) {
    let atr = TA.ATR(records, atr_period);
    let atrma = atr[atr.length - 1];
    if (atr.length > atrma_period) {
        let tmp_atr = 0;
        for (let i = atr.length - atrma_period; i < atr.length; i++) {
            tmp_atr += atr[i];
        }
        atrma = tmp_atr / atr_period;
    }
    else {
        atrma = aval(atr.join("+")) / atr.length;
    }
    return atr[atr.length - 1] > atrma;
}

// 获取RSI操作状态
function getRsiStatus(records) {
    let rsi = TA.RSI(records, rsi_period)[records.length - 1];
    if (rsi < 30) {
        return RSI_BUY;
    }
    else if (rsi > 70) {
        return RSI_SELL;
    }
    else {
        return RSI_NONE;
    }
}

// 取消未成交下单
function canelPendingOrders() {
    while (true) {
        let orders = _C(exchange.GetOrders);
        if (orders.length == 0) {
            break;
        }
        for (let i = 0; i < orders.length; i++) {
            exchange.CancelOrder(orders[i].Id);
        }
    }
}

function onTick() {
    let records = _C(exchange.GetRecords, PERIOD_M15);
    let ticker = _C(exchange.GetTicker);
    if (records == null ||
        ticker == null ||
        records.length < rsi_period ||
        records.length < atr_period) {
        return;
    }

    if (isAtrActive(records)) {
        let rsi = getRsiStatus(records);
        if (rsi != RSI_NONE) {
            let account = _C(exchange.GetAccount);
            if (rsi == RSI_BUY && last_rsi_staus != RSI_BUY) {
                Log("买入信号");
                last_rsi_staus = RSI_BUY;
                canelPendingOrders();
                if(account.Balance>0){
                    let price = ticker.Last + slide_price;
                    let amount = account.Balance / price * 0.99;
                    exchange.Buy(price, amount);
                }
            } else if (rsi == RSI_SELL && last_rsi_staus != RSI_SELL) {
                Log("卖出信号");
                last_rsi_staus = RSI_SELL;
                canelPendingOrders();
                if (account.Stocks > 0) {
                    let price = ticker.Last - slide_price;
                    exchange.Sell(price, account.Stocks);
                }
            }
        }
    }
    last_records = records;
}

function main() {
    while (true) {
        onTick();
        Sleep(tick_interval * 1000);
    }
}

Lebih lanjut

AllahKesalahan semasa pelaksanaan: abort ((undefined) pada Kesalahan pada jsStackTrace, ini gila

Satu pisauAdakah ada maklumat lain yang boleh saya lihat?