Strategi Kombinasi ATR-RSI

Penulis:Sebuah pisau, Tanggal: 2022-02-13 17:17:17
Tag:

Indikator Atr

Rata-rata True Range (ATR) adalah indikator yang digunakan untuk mengukur intensitas volatilitas pasar dan menunjukkan tingkat perubahan pasar, tetapi tidak mencerminkan arah harga dan stabilitas tren. Nilai indikator ini semakin tinggi, semakin besar kemungkinan perubahan tren, dan semakin kecil kemungkinan perubahan tren.

Metode perhitungan

Rata-rata rentang fluktuasi real, berdasarkan nilai fluktuasi real dan fluktuasi real pada hari N yang lalu. Akar fluktuasi real pada hari tunggal diambil dari ((Highest price of the day - lowest price of the day), ((Highest price of the day - closing price of yesterday)), ((Highest price of the day - closing price of yesterday - closing price of the day)), dan mengambil nilai terbesar dari antara tiga set hasil, dengan tujuan untuk mendapatkan perbedaan harga dari rentang fluktuasi terbesar.

Indikator Rsi

Relative Strength Index (RSI) adalah indikator teknis untuk menentukan tren pasar masa depan dengan membandingkan kekuatan jual beli dari kedua belah pihak dalam jangka waktu tertentu.

Metode perhitungan

RSI = 100 - (100/(1+RS)); RS = jumlah penutupan hari n dan jumlah penutupan hari/n; RSI umum adalah 50 sebagai garis tengah, lebih dari 50 dianggap sebagai pasar multi-head, dan kurang dari 50 dianggap sebagai pasar blank; RSI yang lebih besar dari 70 dianggap sebagai overbought, dan pasar berikutnya mungkin mengalami pembalikan atau pergeseran, dan yang lebih kecil dari 30 dianggap sebagai oversold, dan kemudian mungkin mengalami kenaikan.

Prinsip Strategi

ATR digunakan untuk menyaring, ketika ATR>ATRMa (ATR rata-rata selama N hari terakhir) menunjukkan bahwa tingkat volatilitas pasar mulai meningkat dan tren sedang meningkat. RSI digunakan untuk menghasilkan sinyal perdagangan.


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

AllahRepeat:RuntimeError: abort ((undefined) at Error at jsStackTrace, ini yang aneh

Sebuah pisauApakah ada informasi lain yang ingin saya lihat?