Dual Thrust OKEX فیوچر (تعلیم)

مصنف:چھوٹا سا خواب، تاریخ: 2018-08-20 09:44:55
ٹیگز:رجحانمطالعہ

بنیادی اصول

  • اس دن کے اختتام پر ، دو اقدار کا حساب لگایا جاتا ہے: سب سے زیادہ قیمت - اختتامی قیمت ، اور اختتامی قیمت - سب سے کم قیمت۔ پھر ان دونوں اقدار میں سے جس کی زیادہ مقدار ہے اسے ضرب دیا جاتا ہے ، جس کا نتیجہ ٹرگر ویلیو کہا جاتا ہے۔
  • اگلے دن کھولنے کے بعد ، کھولنے کی قیمت کو ریکارڈ کریں ، اور پھر فوری طور پر خریدیں جب قیمت زیادہ ہو (بلاک + ٹرگر ویلیو) ، یا فوری طور پر فروخت کریں جب قیمت کم ہو (بلاک - ٹرگر ویلیو) ۔
  • یہ نظام ریورس سسٹم ہے اور اس میں کوئی علیحدہ اسٹاپ نقصان نہیں ہے۔ یعنی ریورس سگنل بھی ایک ہی وقت میں ایک ہی سگنل ہے۔

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 سیکنڈ کے ٹیسٹ میں موجودہ قیمت کو توڑتے ہوئے فوری طور پر داخل ہوجائیں؟

چھوٹا سا خوابہاں ، حکمت عملی آن ٹِک میکانزم ہے ، جو ایک بار جب قیمت ٹرگر ہوجاتی ہے تو آرڈر کردیتا ہے ، اور یقینا on آن بار میکانزم بھی بنایا جاسکتا ہے۔

a624587332ایک تھپتھپانے سے پروگرام کھل جاتا ہے۔