ডুয়াল থ্রাস্ট ওকেএক্স ফিউচার (শিক্ষা)

লেখক:ছোট্ট স্বপ্ন, তারিখ: ২০১৮-০৮-২০ ০৯ঃ৪৪ঃ৫৫
ট্যাগঃপ্রবণতাঅধ্যয়ন

মূলনীতি

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

var STATE_IDLE = 0
var STATE_LONG = 1
var STATE_SHORT = 2
var State = STATE_IDLE
var LastBarTime = 0
var UpTrack = 0
var DownTrack = 0
var InitAccount = null

function GetPosition(posType) {
    var positions = exchange.GetPosition()
    for (var i = 0; i < positions.length; i++) {
        if (positions[i].Type === posType) {
            return [positions[i].Price, positions[i].Amount];
        }
    }
    return [0, 0]
}

function CancelPendingOrders() {
    while (true) {
        var orders = exchange.GetOrders()
        for (var i = 0; i < orders.length; i++) {
            exchange.CancelOrder(orders[i].Id)
            Sleep(500)
        }
        if (orders.length === 0) {
            break
        }
    }
}

function Trade(currentState, nextState) {
    var pfn = nextState === STATE_LONG ? exchange.Buy : exchange.Sell
    if (currentState !== STATE_IDLE) {
        exchange.SetDirection(currentState === STATE_LONG ? "closebuy" : "closesell")
        while (true) {
            var amount = GetPosition(currentState === STATE_LONG ? PD_LONG : PD_SHORT)[1]
            if (amount === 0) {
                break
            }
            pfn(nextState === STATE_LONG ? _C(exchange.GetTicker).Sell * 1.001 : _C(exchange.GetTicker).Buy * 0.999, amount)
            Sleep(500)
            CancelPendingOrders()
        }
        var account = exchange.GetAccount()
        LogProfit(_N(account.Stocks - InitAccount.Stocks, 3), "收益率:", _N((account.Stocks - InitAccount.Stocks) * 100 / InitAccount.Stocks, 3) + '%')
    }
    exchange.SetDirection(nextState === STATE_LONG ? "buy" : "sell")
    while (true) {
        var pos = GetPosition(nextState === STATE_LONG ? PD_LONG : PD_SHORT)
        if (pos[1] >= AmountOP) {
            Log("持仓均价", pos[0], "数量:", pos[1])
            break
        }
        pfn(nextState === STATE_LONG ? _C(exchange.GetTicker).Sell * 1.001 : _C(exchange.GetTicker).Buy * 0.999, AmountOP-pos[1])
        Sleep(500)
        CancelPendingOrders()
    }
}

function onTick() {
    var records = exchange.GetRecords()
    if (!records || records.length <= NPeriod) {
        return
    }
    var Bar = records[records.length - 1]
    $.PlotRecords(records, 'K线')
    if (LastBarTime !== Bar.Time) {
        var HH = TA.Highest(records, NPeriod, 'High')
        var HC = TA.Highest(records, NPeriod, 'Close')
        var LL = TA.Lowest(records, NPeriod, 'Low')
        var LC = TA.Lowest(records, NPeriod, 'Close')
        var Range = Math.max(HH - LC, HC - LL)
        UpTrack = _N(Bar.Open + (Ks * Range), 3)
        DownTrack = _N(Bar.Open - (Kx * Range), 3)
        $.PlotHLine(UpTrack, 'UpTrack')
        $.PlotHLine(DownTrack, 'DownTrack')
        LastBarTime = Bar.Time
    }

    LogStatus("Price:", Bar.Close, "Up:", UpTrack, "Down:", DownTrack, "Date:", new Date())
    var msg
    if (State === STATE_IDLE || State === STATE_SHORT) {
        if (Bar.Close >= UpTrack) {
            msg  = '做多 触发价: ' + Bar.Close + ' 上轨:' + UpTrack
            Log(msg)
            Trade(State, STATE_LONG)
            State = STATE_LONG
            $.PlotFlag(Bar.Time, msg, '多', 'flag', 'red') 
        }
    }

    if (State === STATE_IDLE || State === STATE_LONG) {
        if (Bar.Close <= DownTrack) {
            msg = '做空 触发价: ' + Bar.Close + ' 下轨:' + DownTrack
            Log(msg)
            Trade(State, STATE_SHORT)
            $.PlotFlag(Bar.Time, msg, '空', 'circlepin', 'green')
            State = STATE_SHORT
        }
    }
}

function main() {
    exchange.SetContractType("quarter")
    exchange.SetMarginLevel(10)
    if (exchange.GetPosition().length > 0) {
        throw "策略启动前不能有持仓."
    }
    CancelPendingOrders()
    InitAccount = exchange.GetAccount()
    while (true) {
        onTick()
        Sleep(500)
    }
}

সম্পর্কিত

আরো

a624587332ইথেরিয়ায় দ্রুতগতিতে দৌড়ানো

ডসাইডাসিভাই একটি প্রশ্ন জিজ্ঞাসা করুন, এই কৌশলটির যৌক্তিকতা হ'ল যদি দামটি ট্র্যাকটি অতিক্রম করে তবে আরও বেশি অর্থ প্রদান করা হয়, বিশেষত বারটি শেষ না হওয়া পর্যন্ত অপেক্ষা করুন, বা প্রতি 0.5 সেকেন্ডের পরীক্ষায় বর্তমান দামটি অতিক্রম করে তা অবিলম্বে প্রবেশ করুন?

ছোট্ট স্বপ্নহ্যাঁ, কৌশলটি হ'ল onTick প্রক্রিয়া, যা দাম ট্রিগার হওয়ার সাথে সাথে অর্ডার দেয়, তবে অবশ্যই এটি অনবার প্রক্রিয়া হিসাবেও ডিজাইন করা যেতে পারে।

a624587332একটি স্পর্শের মাধ্যমে, প্রোগ্রামটি চালু হয়।