Strategie der ATR-RSI-Kombination

Schriftsteller:Ein Messer, Datum: 2022-02-13 17:17:17
Tags:

Atr-Indikator

Der "Average True Range", kurz ATR, wird hauptsächlich verwendet, um die Schwankungsintensität des Marktes zu messen und zeigt die Veränderungsrate des Marktes an, spiegelt jedoch nicht die Kursentwicklung und die Stabilität des Trends wider. Je höher der Wert dieses Indikators ist, desto größer ist die Wahrscheinlichkeit einer Trendänderung und desto geringer ist die Wahrscheinlichkeit einer Trendänderung.

Berechnungsverfahren

Der durchschnittliche reale Schwankungsbereich wird anhand der tatsächlichen Schwankungen der vergangenen N Tage und der tatsächlichen Schwankungsberechnung des Tages ermittelt. Die eintägige tatsächliche Schwankungswurzel wird durch die größte Differenz zwischen den Ergebnisgruppen aus den Ergebnissen der folgenden drei Gruppen gewählt: ((Höchstpreis des Tages - Mindestpreis des Tages) ;; ((Höchstpreis des Tages - Gesterns Schlusspreis) ;; ((Gesterns Schlusspreis - Gesterns Minimumpreis) ;;

Rsi-Indikator

Der Relative Strength Index, kurz RSI, ist ein technischer Indikator, der die zukünftige Marktentwicklung beurteilt, indem er die Kauf- und Verkaufskraft von mehreren Seiten über einen bestimmten Zeitraum vergleicht.

Berechnungsverfahren

RSI = 100 - (100/(1+RS)); RS = Summe der N-Tage-Schließungs- und/oder -Abschließungszahlen; Im Allgemeinen gilt der RSI mit 50 als Mittelgrenze, größer als 50 als Multipurpose-Markt und kleiner als 50 als Kaffee-Markt. Ein RSI von über 70 gilt als Überkauf, bei dem es zu einer Rückholung oder Umschwung im Markt kommen kann. Ein RSI von unter 30 gilt als Überkauf, bei dem es zu einem Anstieg kommen kann.

Die Strategie

ATR wird als Filter verwendet, wenn ATR>ATRMa ((durchschnittliche ATR für die vergangenen N Tage) bedeutet, dass die Marktfluktuation zunimmt und der Trend zunimmt. RSI wird verwendet, um Handelssignale zu erzeugen.


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

Mehr

Ich weiß.RuntimeError: abort ((undefined) at Error at jsStackTrace, das ist eine Scheiße.

Ein MesserGibt es noch mehr Informationen?