Bagaimana cara mengubah sistem penerimaan sinyal ini jika Anda memiliki saham di arah yang sama dan tidak lagi melakukan pesanan baru?

Penulis:Jetter, Dibuat: 2023-01-26 20:31:05, Diperbarui:

/* backtest Dimulai: 2022-01-15 00:00:00 akhir: 2023-01-21 00:00:00 Periode: 1 jam dasarPeriode: 15m Bursa: [{eid:Futures_Binance,currency:ETH_USDT}] */

Struktur sinyal Tanda-tanda yang menunjukkan bahwa Flag: 45M103Buy , // logo, dapat ditentukan Exchange: 1, // Pasangan transaksi yang ditentukan Currency: ETH_USDT, // pasangan transaksi ContractType: swap, // tipe kontrak, swap, quarter, next_quarter, spot pengisian langsung Price: -1, // harga bukaan atau penghentian, -1 adalah harga pasar Action: long, // Jenis transaksi [ buy: beli langsung, sell: jual langsung, long: berjangka lebih banyak, short: berjangka kosong, closesell: berjangka membeli kosong, closebuy: berjangka dijual lebih murah] Amount: 0, // volume transaksi Aku tidak tahu.

var BaseUrl = https://www.fmz.com/api/v1Alamat antarmuka API ekstensi FMZ var RobotId = _G() // ID disk saat ini var Success = #5cb85c // warna sukses var Danger = warna merah var Warning = #f0ad4e // Warning warna var buffSignal = []

// Format pesan sinyal pemeriksaan Diff functionObject ((object1, object2) { const keys1 = Object.keys ((object1) const keys2 = Object.keys ((object2)) if (keys1.length!== keys2.length) { kembali false Aku tidak tahu. for (biarkan i = 0; i < keys1.length; i++) { if (keys1[i]!== keys2[i]) { kembali false Aku tidak tahu. Aku tidak tahu. kembali benar Aku tidak tahu.

Fungsi CheckSignal ((Signal) { Signal.Price = parseFloat ((Signal.Price) Signal.Amount = parseFloat ((Signal.Amount) jika (Signal.ExchangeJumlah adalah bulat.Signal.ExchangeTidak ada. Log (minimal nomor bursa adalah 1, dan untuk angka bulat adalah log, Danger) return Aku tidak tahu. if (Signal.Amount <= 0 の の typeof ((Signal.Amount)!= number ) { Log (tidak boleh lebih kecil dari 0 dan memiliki tipe angka log, typeof (Signal.Amount, Danger) return Aku tidak tahu. if (typeof ((Signal.Price)!= number) { Log ((Harga aluminium harus menjadi nilai aluminium, Danger)) return Aku tidak tahu. if (Signal.ContractType == spot && Signal.Action!= buy && Signal.Action!= sell) { Log (menunjukkan perintah untuk mengoperasikan item, Action error, Action: log, Signal.Action, Danger) return Aku tidak tahu. if (Signal.ContractType!= spot && Signal.Action!= long && Signal.Action!= short && Signal.Action!= closesell && Signal.Action!= closebuy) { Log (Instruksi log untuk mengoperasikan futures, Action error, Action: log, Signal.Action, Danger) return Aku tidak tahu. kembali benar Aku tidak tahu.

perintah fungsiRobot ((url, aksesKey, rahasiaKey, robotId, cmd) { - Apa?https://www.fmz.com/api/v1?access_key=xxx&secret_key=xxx&method=CommandRobot&args=[xxx+""] url = url + ?access_key= + accessKey + &secret_key= + secretKey + &method=CommandRobot&args=[ + robotId + +,""] var postData = { Metode: Klik tombol POST. data:cmd Aku tidak tahu. var headers = User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36 \nContent-Type: application/json var ret = HttpQuery ((url, postData, tag, header) Log (meniru permintaan webhook TradingView, mengirim permintaan POST untuk pengujian: , url, body: , cmd, response: , ret) Aku tidak tahu.

fungsi createManager() { var sendiri = {} self.tasks = []

self.process = function() {
    var processed = 0
    if (self.tasks.length > 0) {
        _.each(self.tasks, function(task) {
            if (!task.finished) {
                processed++
                self.pollTask(task)
            }
        })
        if (processed == 0) {
            self.tasks = []
        }
    }
}

self.newTask = function(signal) {
    // {"Flag":"45M103Buy","Exchange":1,"Currency":"BTC_USDT","ContractType":"swap","Price":"10000","Action":"buy","Amount":"0"}
    var task = {}
    task.Flag = signal["Flag"]
    task.Exchange = signal["Exchange"]
    task.Currency = signal["Currency"]
    task.ContractType = signal["ContractType"]
    task.Price = signal["Price"]
    task.Action = signal["Action"]
    task.Amount = signal["Amount"]
    task.exchangeIdx = signal["Exchange"] - 1
    task.pricePrecision = null
    task.amountPrecision = null 
    task.error = null 
    task.exchangeLabel = exchanges[task.exchangeIdx].GetLabel()
    task.finished = false 
    
    Log("创建任务:", task)
    self.tasks.push(task)
}

self.getPrecision = function(n) {
    var precision = null 
    var arr = n.toString().split(".")
    if (arr.length == 1) {
        precision = 0
    } else if (arr.length == 2) {
        precision = arr[1].length
    } 
    return precision
}

self.pollTask = function(task) {
    var e = exchanges[task.exchangeIdx]
    var name = e.GetName()
    var isFutures = true
    e.SetCurrency(task.Currency)
    if (task.ContractType != "spot" && name.indexOf("Futures_") != -1) {
        // 非现货,则设置合约
        e.SetContractType(task.ContractType)
    } else if (task.ContractType == "spot" && name.indexOf("Futures_") == -1) {
        isFutures = false 
    } else {
        task.error = "指令中的ContractType与配置的交易所对象类型不匹配"
        return 
    }
    
    var depth = e.GetDepth()
    if (!depth || !depth.Bids || !depth.Asks) {
        task.error = "订单薄数据异常"
        return 
    }
    
    if (depth.Bids.length == 0 && depth.Asks.length == 0) {
        task.error = "盘口无订单"
        return 
    }
    
    _.each([depth.Bids, depth.Asks], function(arr) {
        _.each(arr, function(order) {
            var pricePrecision = self.getPrecision(order.Price)
            var amountPrecision = self.getPrecision(order.Amount)
            if (Number.isInteger(pricePrecision) && !Number.isInteger(self.pricePrecision)) {
                self.pricePrecision = pricePrecision
            } else if (Number.isInteger(self.pricePrecision) && Number.isInteger(pricePrecision) && pricePrecision > self.pricePrecision) {
                self.pricePrecision = pricePrecision
            }
            if (Number.isInteger(amountPrecision) && !Number.isInteger(self.amountPrecision)) {
                self.amountPrecision = amountPrecision
            } else if (Number.isInteger(self.amountPrecision) && Number.isInteger(amountPrecision) && amountPrecision > self.amountPrecision) {
                self.amountPrecision = amountPrecision
            }
        })
    })

    if (!Number.isInteger(self.pricePrecision) || !Number.isInteger(self.amountPrecision)) {
        task.err = "获取精度失败"
        return 
    }
    
    e.SetPrecision(self.pricePrecision, self.amountPrecision)
    
    // buy:现货买入 , sell:现货卖出 , long:期货做多 , short:期货做空 , closesell:期货买入平空 , closebuy:期货卖出平多
    var direction = null 
    var tradeFunc = null 
    if (isFutures) {
        switch (task.Action) {
            case "long": 
                direction = "buy"
                tradeFunc = e.Buy 
                break
            case "short": 
                direction = "sell"
                tradeFunc = e.Sell
                break
            case "closesell": 
                direction = "closesell"
                tradeFunc = e.Buy 
                break
            case "closebuy": 
                direction = "closebuy"
                tradeFunc = e.Sell
                break
        }
        if (!direction || !tradeFunc) {
            task.error = "交易方向错误:" + task.Action
            return 
        }
        e.SetDirection(direction)
    } else {
        if (task.Action == "buy") {
            tradeFunc = e.Buy 
        } else if (task.Action == "sell") {
            tradeFunc = e.Sell 
        } else {
            task.error = "交易方向错误:" + task.Action
            return 
        }
    }
    var id = tradeFunc(task.Price, task.Amount)
    if (!id) {
        task.error = "下单失败"
    }
    
    task.finished = true
}

return self

}

var manager = createManager (dalam bahasa Inggris) fungsi HandleCommand ((signal) { // Mengamati apakah perintah interaksi diterima Jika (sinyal) { Log (( menerima instruksi interaksi:, signal) // menerima instruksi interaksi, cetak instruksi interaksi } lainnya { return // tidak menerima kembali langsung, tidak memproses Aku tidak tahu.

// 检测交互指令是否是测试指令,测试指令可以由当前策略交互控件发出来进行测试
if (signal.indexOf("TestSignal") != -1) {
    signal = signal.replace("TestSignal:", "")
    // 调用FMZ扩展API接口,模拟Trading View的webhook,交互按钮TestSignal发送的消息:{"Flag":"45M103Buy","Exchange":1,"Currency":"BTC_USDT","ContractType":"swap","Price":"10000","Action":"buy","Amount":"0"}
    commandRobot(BaseUrl, FMZ_AccessKey, FMZ_SecretKey, RobotId, signal)
} else if (signal.indexOf("evalCode") != -1) {
    var js = signal.split(':', 2)[1]
    Log("执行调试代码:", js)
    eval(js)
} else {
    // 处理信号指令
    objSignal = JSON.parse(signal)
    if (DiffObject(Template, objSignal)) {
        Log("接收到交易信号指令:", objSignal)
        buffSignal.push(objSignal)
        
        // 检查交易量、交易所编号
        if (!CheckSignal(objSignal)) {
            return
        }
        
        // 创建任务
        manager.newTask(objSignal)
    } else {
        Log("指令无法识别", signal)
    }
}

}

fungsi main (() { Log (http://www.webhook.com/)https://www.fmz.com/api/v1?access_key= + FMZ_AccessKey + &secret_key= + FMZ_SecretKey + &method=CommandRobot&args=[ + RobotId + +,""], Danger) Log (() Jenis transaksi: [ buy: pembelian segera, sell: penjualan segera, long: berjangka lebih, short: berjangka kosong, closesell: berjangka membeli kosong, closebuy: berjangka menjual lebih murah ] Log (http://www.log.com/) adalah template yang digunakan untuk membuat template.

while (true) {
    try {
        // 处理交互
        HandleCommand(GetCommand())
        
        // 处理任务
        manager.process()
        
        if (buffSignal.length > maxBuffSignalRowDisplay) {
            buffSignal.shift()
        }
        var buffSignalTbl = {
            "type" : "table",
            "title" : "信号记录",
            "cols" : ["Flag", "Exchange", "Currency", "ContractType", "Price", "Action", "Amount"],
            "rows" : []
        }
        for (var i = buffSignal.length - 1 ; i >= 0 ; i--) {
            buffSignalTbl.rows.push([buffSignal[i].Flag, buffSignal[i].Exchange, buffSignal[i].Currency, buffSignal[i].ContractType, buffSignal[i].Price, buffSignal[i].Action, buffSignal[i].Amount])
        }
        LogStatus(_D(), "\n", "`" + JSON.stringify(buffSignalTbl) + "`")
        Sleep(1000 *SleePinterval )
    } catch (error) {
        Log("e.name:", error.name, "e.stack:", error.stack, "e.message:", error.message)
        Sleep(1000 * 5)
    }
}

}


Lebih banyak

Bantuan (klik gambar untuk kontak)exchange.GetPosition ((), mendapatkan informasi tentang posisi saat ini. Jika posisi lebih besar dari 0, maka tidak dipesan.

Mimpi kecilDesain strategi ini hanya dapat ditulis sesuai dengan kebutuhan Anda sendiri, dan Anda dapat menemukan beberapa strategi untuk referensi di Platform Strategi Square.

JetterBagus. Terima kasih! Apakah itu kode? var nowRefPosAmount = getPosAmount ((_C ((exchange.GetPosition), ct) var x = owRefPosAmount.long var y = owRefPosAmount.short Apa yang kau inginkan?

JetterBagus. Terima kasih!