एटीआर-आरएसआई पोर्टफोलियो रणनीति

लेखक:एक चाकू, दिनांकः 2022-02-13 17:17:17
टैगः

एटीआर संकेतक

औसत सही सीमा (Average True Range), जिसे एटीआर के रूप में भी जाना जाता है, मुख्य रूप से बाजार में उतार-चढ़ाव की तीव्रता को मापने के लिए उपयोग किया जाता है, जो बाजार में बदलाव की दर को दर्शाता है, लेकिन यह मूल्य की दिशा और प्रवृत्ति की स्थिरता को दर्शाता नहीं है। यह मान अधिक होने पर प्रवृत्ति में बदलाव की संभावना अधिक होती है और इसके विपरीत प्रवृत्ति में बदलाव की संभावना कम होती है।

गणना का तरीका

औसत वास्तविक उतार-चढ़ाव सीमा, पिछले N दिनों के वास्तविक उतार-चढ़ाव और दिन के वास्तविक उतार-चढ़ाव गणना के आधार पर प्राप्त की जाती है। एकल-दिवसीय वास्तविक उतार-चढ़ाव मूल सबसे बड़ा मूल्य है जो ((दिन के उच्चतम मूल्य-दिन के निम्नतम मूल्य) ((दिन के उच्चतम मूल्य-कल के समापन मूल्य)) और ((दिन के समापन मूल्य-दिन के निम्नतम मूल्य) के परिणामों के तीन सेटों के बीच से लिया जाता है, जिसका उद्देश्य अधिकतम उतार-चढ़ाव सीमा मूल्य अंतर प्राप्त करना है।

आरएसआई संकेतक

रिलेटिव स्ट्रेंथ इंडेक्स (RSI) एक तकनीकी संकेतक है जो भविष्य के बाजार के रुझानों का आकलन करता है।

गणना का तरीका

आरएसआई = 100 - (100/(1+आरएस)); RS = n दिनों के लिए बंद होने वाले घाटे और / n दिनों के लिए बंद होने वाले घाटे का योग; आम तौर पर आरएसआई 50 को मध्य रेखा के रूप में देखता है, 50 से अधिक को मल्टीहेड बाजार माना जाता है, और 50 से कम को खाली बाजार माना जाता है; 70 से अधिक आरएसआई ओवरबॉय माना जाता है, जिसके बाद बाजार में वापसी या बदलाव हो सकता है, और 30 से कम ओवरसोल्ड माना जाता है, जिसके बाद बढ़ोतरी हो सकती है।

रणनीतिक सिद्धांत

एटीआर का उपयोग फ़िल्टर करने के लिए किया जाता है, जब एटीआर> एटीआरमा ((पिछले एन दिनों का औसत एटीआर) यह दर्शाता है कि बाजार में उतार-चढ़ाव बढ़ रहा है और रुझान बढ़ रहा है; आरएसआई का उपयोग ट्रेडिंग संकेत उत्पन्न करने के लिए किया जाता है;


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

अधिक

अलपुनः परीक्षणःRuntimeError: abort ((undefined) at Error at jsStackTrace, यह बकवास है

एक चाकूक्या कोई और जानकारी है?