এটিআর-আরএসআই পোর্টফোলিও কৌশল

লেখক:একটি ছুরি, তারিখঃ ২০২২-০২-১৩ ১৭ঃ১৭ঃ১৭
ট্যাগঃ

Atr সূচক

গড় সত্য পরিসীমা (ইংরেজিঃ Average True Range), যা ATR সূচক হিসেবে পরিচিত। এটি মূলত বাজারের অস্থিরতার পরিমাপ করে এবং বাজারের পরিবর্তনের হার দেখায়, কিন্তু দামের গতি এবং প্রবণতার স্থায়িত্বকে প্রতিফলিত করে না। এটির মান যত বেশি হবে, প্রবণতা পরিবর্তনের সম্ভাবনা তত বেশি হবে এবং বিপরীত প্রবণতা পরিবর্তনের সম্ভাবনা তত কম হবে।

গণনা পদ্ধতি

গড় প্রকৃত ওঠানামা পরিসীমা, যা গত N দিনের প্রকৃত ওঠানামা এবং দিনের প্রকৃত ওঠানামা গণনার ভিত্তিতে পাওয়া যায়। এক দিনের প্রকৃত ওঠানামা রুটটি ((দিনের সর্বোচ্চ মূল্য - দিনের সর্বনিম্ন মূল্য) ;; ((দিনের সর্বোচ্চ মূল্য - গতকালের বন্ধের মূল্য) ;; ((গতকালের বন্ধের মূল্য - দিনের সর্বনিম্ন মূল্য)) ফলাফলের তিনটি গোষ্ঠীর মধ্য থেকে সর্বাধিক মূল্যের পার্থক্য গ্রহণ করার উদ্দেশ্যে।

Rsi সূচক

আপেক্ষিক শক্তি সূচক (Relative Strength Index), সংক্ষেপে আরএসআই সূচক; একটি প্রযুক্তিগত সূচক যা ভবিষ্যতের বাজারের গতিবিধি নির্ধারণ করে।

গণনা পদ্ধতি

RSI = 100 - (100/(1+RS)); RS = n দিনের বন্ধের হার এবং / n দিনের বন্ধের হ্রাসের পরিমাণ; সাধারণ আরএসআই 50 এর মধ্যম রেখা হিসাবে, 50 এর চেয়ে বড় একটি মাল্টি-হেড বাজার হিসাবে বিবেচিত হয় এবং 50 এর চেয়ে কম একটি খালি-হেড বাজার হিসাবে বিবেচিত হয়; আরএসআই ৭০ এর চেয়ে বড় একটি ওভার-বোর্ডিং হিসাবে বিবেচিত হয়, যার ফলে পরবর্তী বাজারে পুনরুদ্ধার বা পরিবর্তন হতে পারে, এবং ৩০ এর চেয়ে কম একটি ওভার-সেলিং হিসাবে বিবেচিত হয়, যার ফলে পরবর্তী উত্থান হতে পারে।

কৌশলগত নীতি

ATR ফিল্টারিংয়ের জন্য ব্যবহৃত হয়, যখন ATR>ATRMa ((গত N দিনের গড় ATR), যা বাজার ওঠানামা বাড়তে শুরু করেছে এবং প্রবণতা বাড়ছে বলে। RSI ট্রেডিং সংকেত তৈরি করতে ব্যবহৃত হয়।


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

আরো

আলিরানটাইম ত্রুটিঃ abort ((undefined) at Error at jsStackTrace, এটা মজার

একটি ছুরিঅন্য কোন তথ্য আছে কি?