0
پر توجہ دیں
0
پیروکار

براہ کرم مشورہ دیں، اگر اسی سمت میں کوئی پوزیشن ہے، تو کوئی نیا آرڈر نہیں دیا جائے گا کہ اس سگنل وصول کرنے والے پروگرام میں کیسے ترمیم کی جائے؟

میں تخلیق کیا: 2023-01-26 20:31:05, تازہ کاری:
comments   4
hits   951

/*backtest start: 2022-01-15 00:00:00 end: 2023-01-21 00:00:00 period: 1h basePeriod: 15m exchanges: [{“eid”:“Futures_Binance”,“currency”:“ETH_USDT”}] */

// سگنل کی ساخت var Template = { پرچم: “45M103Buy” ، // نشان ، اپنی مرضی کے مطابق ایکسچینج: 1 ، // ایکسچینج ٹریڈنگ جوڑے کی وضاحت کریں کرنسی: “ETHUSDT” ، // تجارت جوڑی ContractType: “swap”, // معاہدہ کی قسم, تبادلہ, سہ ماہی, اگلے سہ ماہی, فوری طور پر بھرنے کا مقام قیمت: “-1”، // پوزیشن کھولنے یا پوزیشن بند کرنے کی قیمت، -1 مارکیٹ کی قیمت ہے Action: “long” ، // ٹرانزیکشن کی قسم[buy: نقد خریدنا ، sell: نقد فروخت کرنا ، long: فاریکس زیادہ کرنا ، short: فاریکس کم کرنا ، closesell: فاریکس خالی خریدنا ، closebuy: فاریکس زیادہ بیچنا] رقم: “0” ، // ٹرانزیکشن کی رقم }

var BaseUrl = “https://www.fmz.com/api/v1” // FMZ توسیع API انٹرفیس ایڈریس var RobotId = _G() // موجودہ فلیڈ ڈسک ID var Success = “#5cb85c” // کامیابی کا رنگ var Danger = “#ff0000” // خطرناک رنگ var Warning = “#f0ad4e” // انتباہی رنگ var buffSignal = []

// سگنل پیغام کی شکل کی جانچ پڑتال function DiffObject(object1, object2) { const keys1 = Object.keys(object1) const keys2 = Object.keys(object2) if (keys1.length !== keys2.length) { return false } for (let i = 0; i < keys1.length; i++) { if (keys1[i] !== keys2[i]) { return false } } return true }

function CheckSignal(Signal) { Signal.Price = parseFloat(Signal.Price) Signal.Amount = parseFloat(Signal.Amount) if (Signal.Exchange <= 0 || !Number.isInteger(Signal.Exchange)) { Log ((” ایکسچینج کا سب سے چھوٹا نمبر 1 ہے ، اور یہ ایک پورا نمبر ہے ،” Danger) return } if (Signal.Amount <= 0 || typeof(Signal.Amount) != “number”) { Log (((“ٹرانزیکشن کا حجم 0 سے کم نہیں ہوسکتا ہے ، اور یہ عددی قسم ہے” ، typeof (((Signal.Amount) ، Danger) return } if (typeof(Signal.Price) != “number”) { Log ((“قیمت ایک قدر ہونی چاہیے”، Danger) return } if (Signal.ContractType == “spot” && Signal.Action != “buy” && Signal.Action != “sell”) { Log ((” ہدایات آپریشن کیش ، ایکشن غلطی ، ایکشن: ،” سگنل. ایکشن ، خطرہ) return } if (Signal.ContractType != “spot” && Signal.Action != “long” && Signal.Action != “short” && Signal.Action != “closesell” && Signal.Action != “closebuy”) { Log ((” ہدایات آپریشن فیوچر ، ایکشن غلطی ، ایکشن: ،” سگنل. ایکشن ، خطرہ) return } return true }

function commandRobot(url, accessKey, secretKey, robotId, cmd) { // 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 = { method:‘POST’, data:cmd } 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, “”, headers) Log (((” ٹریڈنگ ویو کی ویبہوک کی درخواستوں کی نقالی ، ٹیسٹنگ کے لئے POST درخواستیں بھیجیں:“, url ، “body:”, cmd ، “جواب:”, ret) }

function createManager() { var self = {} 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() function HandleCommand(signal) { // انٹرایکٹو ہدایات کی جانچ پڑتال if (signal) { Log ((“مشترکہ ہدایات موصول ہوئی:“، signal) // متضاد ہدایات موصول ہوئی، متضاد ہدایات پرنٹ } else { واپسی // براہ راست واپسی جب موصول نہیں ہوا ، کوئی کارروائی نہیں کی }

// 检测交互指令是否是测试指令,测试指令可以由当前策略交互控件发出来进行测试
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)
    }
}

}

function main() { Log ((“WebHook ایڈریس:”, “https://www.fmz.com/api/v1?access_key=” + FMZ_AccessKey + “&secret_key=” + FMZ_SecretKey + “&method=CommandRobot&args=[” + RobotId + ‘,+“”]’, Danger) لاگ ان ٹرانزیکشن کی قسم[buy: نقد خریدنا ، sell: نقد فروخت کرنا ، long: فاریکس زیادہ کرنا ، short: فاریکس کم کرنا ، closesell: فاریکس خریدنا خالی ، closebuy: فاریکس بیچنا زیادہ “، Danger) Log ((“منتظم سانچہ:”, JSON.stringify ((Template), Danger)

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)
    }
}

}