انحراف کی تجارتی حکمت عملی

مصنف:نیکی, تخلیق: 2018-08-30 17:45:11, تازہ کاری: 2019-12-03 17:32:58

انحراف کی تجارتی حکمت عملیwww.fmz.com

  1. کیتھ فٹسن نے 1986 میں ایبرریشن ٹریڈنگ سسٹم ایجاد کیا۔ 1993 میں ، کیتھ فٹسن نے فیوچر ٹروتھ میگزین میں اس سسٹم کو تجارتی بنایا۔ اس کی رہائی کے بعد سے ، یہ سسٹم مسلسل 1997 ، 2001 اور 2005 میں بہترین میں سے ایک رہا ہے۔ یہ سسٹم شائع شدہ تجارتی نظام کی کارکردگی کی درجہ بندی میں پہلے دس میں شامل ہے۔ یہ تجارتی نظام آٹھ مختلف اقسام پر بیک وقت تجارت کرنے کی خصوصیت رکھتا ہے ، جن میں اناج ، گوشت ، دھاتیں ، توانائی ، غیر ملکی کرنسی ، مالیات اور اسٹاک انڈیکس فیوچر شامل ہیں۔ ایبرریشن ٹریڈنگ سسٹم اکثر سال میں 3-4 بار تجارت کرتا ہے ، اور 60٪ وقت کی پوزیشن رکھتا ہے ، جس میں اوسطا 60 دن فی ٹرانزیکشن ہوتا ہے۔ یہ رجحانات کو پکڑنے کے لئے طویل مدتی تجارت کے ذریعے بہت زیادہ منافع حاصل کرتا ہے۔

  2. یہ کس طرح نقصان کی تلافی کرتا ہے؟ کیونکہ یہ ایک ہی وقت میں متعدد غیر منسلک مارکیٹوں میں تجارت کرتا ہے ، جب ایک پرجاتی ہار جاتی ہے تو ، دوسرا منافع حاصل کرسکتا ہے۔ ایک سال میں ، ہمیشہ ایک یا ایک سے زیادہ اقسام ہوتی ہیں جو بہت زیادہ منافع کما سکتی ہیں۔ یہ بڑے منافع ان مارکیٹوں میں چھوٹے نقصانات کی تلافی کرتے ہیں جن میں کوئی رجحان نہیں ہوتا ہے۔ aberration ٹریڈنگ سسٹم فنڈز کو مل کر سنبھالتا ہے ، لہذا یہ نسبتا large بڑی رقم قبول کرسکتا ہے۔

  3. آپٹیکل لائن فرق بھی بولنگر لائن ٹریڈنگ سسٹم پر مبنی ہے، لیکن ٹریڈنگ کا ہدف بولنگر ڈاکو سسٹم سے زیادہ لمبا ہے، کیونکہ یہ معیاری انحراف چینل کا دوگنا استعمال کرسکتا ہے، اور کوئی سٹاپ نقصان استعمال نہیں کیا جاتا ہے، اور چینل اشارے خود کو روکنے کے لئے استعمال کیا جاتا ہے.

مندرجہ ذیل کوڈ صرف مندرجہ بالا خیالات کا ایک فریم ورک ہے ، آپ کو اپنے تجارتی انتخاب کے ل the تفصیلات کو ایڈجسٹ کرنے کی ضرورت ہے۔ نیز ، براہ کرم ایکسچینج ہاؤس کمیشن فیس اور دیگر پابندیوں کی پالیسی سے محتاط رہیں۔

کوڈنگ فریم ورک واضح اور دوبارہ قابل استعمال ہے. ریئل ٹائم ڈیبگنگ جب انٹرایکٹو فنکشن کے ذریعے چل رہا ہے. مستحکم آپریشن، کامل تفصیلات ڈیزائن. ایک ہی وقت میں متعدد تجارتی اقسام کی حمایت، الگ الگ ٹریڈنگ پوزیشن کی رقم کو کنٹرول کر سکتے ہیں. دوبارہ شروع کرنے پر پوزیشن کی بنیاد پر خود کار طریقے سے پیش رفت کو دوبارہ شروع کرتا ہے. خطرے کے کنٹرول ماڈیول کے ساتھ، حقیقی وقت میں خطرے کی صورت حال، سٹاپ نقصان کی حالت ظاہر.

اگر آپ سرور کرایہ پر نہیں لینا چاہتے ہیں تو آپ اپنا کمپیوٹر یا رسبری پائی استعمال کر سکتے ہیں جو کوئی بھی مشین ونڈوز، لینکس یا میک سسٹم چلاتی ہے۔

function Aberration(q, e, symbol, period, upRatio, downRatio, opAmount) {
    var self = {}
    self.q = q
    self.e = e
    self.symbol = symbol
    self.upTrack = 0
    self.middleTrack = 0
    self.downTrack = 0
    self.nPeriod = period
    self.upRatio = upRatio
    self.downRatio = downRatio
    self.opAmount = opAmount
    self.marketPosition = 0

    self.lastErrMsg = ''
    self.lastErrTime = ''
    self.lastBar = {
        Time: 0,
        Open: 0,
        High: 0,
        Low: 0,
        Close: 0,
        Volume: 0
    }
    self.symbolDetail = null
    self.lastBarTime = 0
    self.tradeCount = 0
    self.isBusy = false

    self.setLastError = function(errMsg) {
        self.lastErrMsg = errMsg
        self.lastErrTime = errMsg.length > 0 ? _D() : ''
    }

    self.getStatus = function() {
        return [self.symbol, self.opAmount, self.upTrack, self.downTrack, self.middleTrack, _N(self.lastBar.Close), (self.marketPosition == 0 ? "--" : (self.marketPosition > 0 ?
                   "Long#ff0000" : "short#0000ff")), self.tradeCount, self.lastErrMsg, self.lastErrTime]
    }
    self.getMarket = function() {
        return [self.symbol, _D(self.lastBarTime), _N(self.lastBar.Open), _N(self.lastBar.High), _N(self.lastBar.Low), _N(self.lastBar.Close), self.lastBar.Volume]
    }

    self.restore = function(positions) {
        for (var i = 0; i < positions.length; i++) {
            if (positions[i].ContractType == self.symbol) {
                self.marketPosition += positions[i].Amount * ((positions[i].Type == PD_LONG || positions[i].Type == PD_LONG_YD) ? 1 : -1)
            }
        }
        if (self.marketPosition !== 0) {
            self.tradeCount++
                Log("restore", self.symbol, "Current position is", self.marketPosition)
        }
    }

    self.poll = function() {
        if (self.isBusy) {
            return false
        }

        if (!$.IsTrading(self.symbol)) {
            self.setLastError("Not in trading hours")
            return false
        }

        if (!self.e.IO("status")) {
            self.setLastError("Unconnected exchange")
            return false
        }

        var detail = self.e.SetContractType(self.symbol)
        if (!detail) {
            self.setLastError("Switching contract failed")
            return false
        }
        if (!self.symbolDetail) {
            self.symbolDetail = detail
            Log("contract", detail.InstrumentName.replace(/\s+/g, ""), ", Strategy first time to open a position:", self.opAmount, "hand, one hand", detail.VolumeMultiple, "unit, Maximum order quantity",
                detail.MaxLimitOrderVolume, "Margin rate:", detail.LongMarginRatio.toFixed(4), detail.ShortMarginRatio.toFixed(4), "Delivery date", detail.StartDelivDate);
        }
        var records = self.e.GetRecords()
        if (!records || records.length == 0) {
            self.setLastError("Failed to get the bar line")
            return false
        }

        var bar = records[records.length - 1]
        self.lastBar = bar

        if (records.length <= self.nPeriod) {
            self.setLastError("The length of the bar line is not enough")
            return false
        }

        if (self.lastBarTime < bar.Time) {
            var sum = 0
            var pos = records.length - self.nPeriod - 1
            for (var i = pos; i < records.length - 1; i++) {
                sum += records[i].Close
            }
            var avg = sum / self.nPeriod
            var std = 0
            for (i = pos; i < records.length - 1; i++) {
                std += Math.pow(records[i].Close - avg, 2)
            }
            std = Math.sqrt(std / self.nPeriod)

            self.upTrack = _N(avg + (self.upRatio * std))
            self.downTrack = _N(avg - (self.downRatio * std))
            self.middleTrack = _N(avg)
            self.lastBarTime = bar.Time
        }
        var msg
        var act = ""
        if (self.marketPosition == 0) {
            if (bar.Close > self.upTrack) {
                msg = 'Buying Long trigger price: ' + bar.Close + ' Upper rail:' + self.upTrack;
                act = "buy"
            } else if (bar.Close < self.downTrack) {
                msg = 'Selling short trigger price: ' + bar.Close + ' lower rail:' + self.downTrack;
                act = "sell"
            }
        } else {
            if (self.marketPosition < 0 && bar.Close > self.middleTrack) {
                msg = 'close the short position trigger price: ' + bar.Close + ' close position line:' + self.middleTrack;
                act = "closesell"
            } else if (self.marketPosition > 0 && bar.Close < self.middleTrack) {
                msg = 'close the long position trigger price: ' + bar.Close + ' close position line:' + self.middleTrack;
                act = "closebuy"
            }
        }

        if (act == "") {
            return true
        }

        Log(self.symbol + ', ' + msg + (NotifyWX ? '@' : ''))

        self.isBusy = true
        self.tradeCount += 1
        if (self.lastErrMsg != '') {
            self.setLastError('')
        }
        self.q.pushTask(self.e, self.symbol, act, self.opAmount, function(task, ret) {
            self.isBusy = false
            if (!ret) {
                return
            }
            if (task.action == "buy") {
                self.marketPosition = 1
            } else if (task.action == "sell") {
                self.marketPosition = -1
            } else {
                self.marketPosition = 0
            }
        })
    }
    return self
}

function main() {
    if (exchange.GetName() !== 'Futures_CTP') {
        throw "Only support traditional commodity futures(CTP)"
    }
    
    SetErrorFilter("login|ready|initialization")

    LogStatus("Ready...")
    if (Reset) {
        LogProfitReset()
        LogReset()
    }
    
    // Ref: https://www.fmz.com/bbs-topic/362
    if (typeof(exchange.IO("mode", 0)) == 'number') {
        Log("Switching the market mode successfully")
    }

    LogStatus("Waiting to connect with the futures dealer server..")
    while (!exchange.IO("status")) {
        Sleep(500)
    }
    LogStatus("Get asset information")
    var tblRuntime = {
        type: 'table',
        title: 'Trading Information',
        cols: ['Variety', 'Each open position volume', 'upper rail', 'lower rail', 'middle rail', 'last transaction price', 'position', 'transaction count', 'last error', 'error time'],
        rows: []
    };
    var tblMarket = {
        type: 'table',
        title: 'Quote information',
        cols: ['Variety', 'current cycle', 'opening', 'highest', 'lowest', 'last transaction price', 'volume'],
        rows: []
    };
    var tblPosition = {
        type: 'table',
        title: 'Position information',
        cols: ['Variety', 'leverage', 'direction', 'average price', 'quantity', 'holding profit and loss'],
        rows: []
    };
    var positions = _C(exchange.GetPosition)
    if (positions.length > 0 && !AutoRestore) {
        throw "There can be no positions when the program starts, but you can check the automatic recovery for automatic identification!"
    }
    var initAccount = _C(exchange.GetAccount)
    var detail = JSON.parse(exchange.GetRawJSON())
    if (positions.length > 0) {
        initAccount.Balance += detail['CurrMargin']
    }
    var initNetAsset = detail['CurrMargin'] + detail['Available']
    var initAccountTbl = $.AccountToTable(exchange.GetRawJSON(), "Initial funding")

    if (initAccountTbl.rows.length == 0) {
        initAccountTbl.rows = [
            ['Balance', 'Available margin', initAccount.Balance],
            ['FrozenBalance', 'Frozen funds', initAccount.FrozenBalance]
        ]
    }

    var nowAcccount = initAccount
    var nowAcccountTbl = initAccountTbl

    var symbols = Symbols.replace(/\s+/g, "").split(',')
    var pollers = []
    var prePosUpdate = 0
    var suffix = ""
    var needUpdate = false
    var holdProfit = 0

    function updateAccount(acc) {
        nowAcccount = acc
        nowAcccountTbl = $.AccountToTable(exchange.GetRawJSON(), "Current funds")
        if (nowAcccountTbl.rows.length == 0) {
            nowAcccountTbl.rows = [
                ['Balance', 'Available margin', nowAcccount.Balance],
                ['FrozenBalance', 'Frozen funds', nowAcccount.FrozenBalance]
            ]
        }
    }

    var q = $.NewTaskQueue(function(task, ret) {
        needUpdate = true
        Log(task.desc, ret ? "success" : "fail")
        var account = task.e.GetAccount()
        if (account) {
            updateAccount(account)
        }
    })

    _.each(symbols, function(symbol) {
        var pair = symbol.split(':')
        pollers.push(Aberration(q, exchange, pair[0], NPeriod, Ks, Kx, (pair.length == 1 ? AmountOP : parseInt(pair[1]))))
    })

    if (positions.length > 0 && AutoRestore) {
        _.each(pollers, function(poll) {
            poll.restore(positions)
        })
    }
    var isFirst = true
    while (true) {
        var cmd = GetCommand()
        if (cmd) {
            var js = cmd.split(':', 2)[1]
            Log("Execution debug code:", js)
            try {
                eval(js)
            } catch (e) {
                Log("Exception", e)
            }
        }
        tblRuntime.rows = []
        tblMarket.rows = []
        var marketAlive = false
        _.each(pollers, function(poll) {
            if (poll.poll()) {
                marketAlive = true
            }
            tblRuntime.rows.push(poll.getStatus())
            tblMarket.rows.push(poll.getMarket())
        })
        q.poll()
        Sleep(LoopInterval * 1000)
        if ((!exchange.IO("status")) || (!marketAlive)) {
            if (isFirst) {
                LogStatus("Waiting for the market open...", _D())
            }
            continue
        }
        isFirst = false
        var now = new Date().getTime()
        if (marketAlive && (now - prePosUpdate > 30000 || needUpdate)) {
            var pos = exchange.GetPosition()
            if (pos) {
                holdProfit = 0
                prePosUpdate = now
                tblPosition.rows = []
                for (var i = 0; i < pos.length; i++) {
                    tblPosition.rows.push([pos[i].ContractType, pos[i].MarginLevel, ((pos[i].Type == PD_LONG || pos[i].Type == PD_LONG_YD) ? 'long#ff0000' : 'short#0000ff'),
                     pos[i].Price, pos[i].Amount, _N(pos[i].Profit)])
                    holdProfit += pos[i].Profit
                }
                if (pos.length == 0 && needUpdate) {
                    LogProfit(_N(nowAcccount.Balance - initAccount.Balance, 4), nowAcccount)
                }
            }
            needUpdate = false
            if (RCMode) {
                var account = exchange.GetAccount()
                if (account) {
                    updateAccount(account)
                    var detail = JSON.parse(exchange.GetRawJSON())
                    var netAsset = detail['PositionProfit'] + detail['CurrMargin'] + detail['Available']
                    var risk = detail['CurrMargin'] / (detail['CurrMargin'] + detail['Available'] + detail['PositionProfit'])
                    suffix = ", Initial net worth of the account: " + _N(initNetAsset, 2) + " , risk control minimum net value requirement" + MinNetAsset + " , Current account equity: " + _N(netAsset, 2) + 
                             ", Profit and loss: " + _N(netAsset - initNetAsset, 3) + " yuan, risk: " + ((risk * 100).toFixed(3)) + "% #ff0000"
                    if (netAsset < MinNetAsset) {
                        Log("The risk control module triggers, stops running and closes all positions, the current net value is ", netAsset, ", Require less than the minimum net value:", MinNetAsset)
                        if (RCCoverAll) {
                            Log("Start to close all positions")
                            $.NewPositionManager().CoverAll()
                        }
                        throw "Stop running"
                    }
                }
            }
        }
        LogStatus('`' + JSON.stringify([tblRuntime, tblPosition, tblMarket, initAccountTbl, nowAcccountTbl]) + '`\nLast price update: ' + _D() + 
                    ', Last update of position: ' + _D(prePosUpdate) + '\nCurrent holding position total profit and loss: ' + _N(holdProfit, 3) + suffix)
    }
}

مزید

چھوٹا سا خواباچھا کام.