Stratégie du groupe ATR-RSI

Auteur:Un couteau, Date: le 13 février 2022 17:17:17
Les étiquettes:

Indicateur Atr

L'indicateur ATR est principalement utilisé pour mesurer l'intensité de la volatilité du marché et montre le taux de variation du marché, mais ne reflète pas la direction et la stabilité des prix.

Méthodes de calcul

La moyenne de l'échelle de fluctuation réelle est calculée à partir de la même valeur de l'échelle réelle et de l'échelle réelle de la journée. La racine de l'échelle réelle d'une journée est la plus grande valeur prise entre les trois groupes de résultats (le prix le plus élevé de la journée - le prix le plus bas de la journée), le prix le plus élevé de la journée - le prix de clôture d'hier, le prix le plus bas de la journée - le prix de clôture d'hier, et l'objectif est d'obtenir la différence de prix de l'échelle de fluctuation la plus élevée.

Indicateur Rsi

L'indicateur de force relative (RSI) est un indicateur technique de la tendance future du marché en comparant la force d'achat et la force de vente des deux côtés sur une période donnée.

Méthodes de calcul

RSI = 100 - (100/ ((1+RS)); RS = somme des taux de baisse et des taux de baisse sur n jours de clôture; En général, un RSI de 50 est considéré comme une ligne médiane, un RSI de plus de 50 est considéré comme un marché à plusieurs têtes et un RSI de moins de 50 est considéré comme un marché à tête nue. Un RSI supérieur à 70 est considéré comme un état d'achat excessif, qui peut entraîner une reprise ou une reprise du marché, et un RSI inférieur à 30 est considéré comme un état d'achat excessif, qui peut entraîner une hausse.

Les principes stratégiques

L'ATR est utilisé pour filtrer, lorsque l'ATR>ATRMa (ATR moyen des N jours précédents) indique que la volatilité du marché commence à augmenter et que la tendance s'intensifie.


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

Plus de

Je suis désolée.Récupération:Error: abort ((undefined) at Error at jsStackTrace, c'est une erreur

Un couteauVous avez d'autres informations?