রিসোর্স লোড হচ্ছে... লোডিং...

অনুগ্রহ করে বলুন, যদি একই দিকের একটি স্টক থাকে এবং নতুন অর্ডার দেওয়া বন্ধ হয়ে যায়, তাহলে সিগন্যাল গ্রহণের পদ্ধতিটি কীভাবে পরিবর্তন করা উচিত?

লেখক:জেটার, সৃষ্টিঃ ২০২৩-০১-২৬ ২০ঃ৩১ঃ০৫, আপডেটঃ

/* ব্যাকটেস্ট শুরুঃ 2022-01-15 00:00:00 শেষঃ 2023-01-21 00:00:00 সময়কালঃ ১ ঘন্টা বেসপেরিওডঃ ১৫ মিটার এক্সচেঞ্জঃ [{eid:Futures_Binance,currency:ETH_USDT}] */

// সংকেত গঠন var টেমপ্লেট = { পতাকাঃ 45M103Buy, // চিহ্ন, নির্বাচিত এক্সচেঞ্জঃ 1, // নির্দিষ্ট এক্সচেঞ্জের বিনিময় জোড়া মুদ্রাঃ ETH_USDT , // লেনদেনের জোড়া ContractType: swap ট্যাব, // চুক্তির ধরন, swap, quarter, next_quarter, অবিলম্বে পূরণ স্পট Price: -1, // খোলা বা স্থগিত মূল্য, -1 বাজার মূল্য Action: long, // লেনদেনের ধরন [ buy: অবিলম্বে কিনুন, sell: অবিলম্বে বিক্রি করুন, long: ভবিষ্যৎ বেশি করুন, short: ভবিষ্যৎ ফাঁকা করুন, closesell: ভবিষ্যৎ ক্রয় করুন ফাঁকা, closebuy: ভবিষ্যৎ বিক্রি করুন] Amount: 0, // লেনদেনের পরিমাণ }

var BaseUrl = https://www.fmz.com/api/v1 // FMZ এক্সটেনশন এপিআই ইন্টারফেস ঠিকানা var RobotId = _G() // বর্তমান ডিস্ক আইডি 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 (মিথ্যা ফেরত) } } রিটার্ন true }

ফাংশন চেক করুনSignal ((Signal) { Signal.Price = parseFloat ((সিগন্যাল.প্রাইস) Signal.Amount = parseFloat ((Signal.Amount)) যদি (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 } রিটার্ন true }

ফাংশন কমান্ডRobot ((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 টাইপ করুন, ডেটাঃ সিএমডি } 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, ট্যাগ, হেডার) Log (( ট্রেডিং ভিউ এর ওয়েবহুক অনুরোধের অনুকরণ করে, যা পরীক্ষার জন্য পাঠানো POST অনুরোধঃ, url, body:, cmd, response:, ret) }

ফাংশন 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 { return // প্রাপ্তির সময় সরাসরি ফেরত আসে না, প্রক্রিয়া না করে }

// 检测交互指令是否是测试指令,测试指令可以由当前策略交互控件发出来进行测试
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) Log ((ট্রেডিং টাইপ[ buy: অবিলম্বে কিনুন, sell: অবিলম্বে বিক্রি, long: ভবিষ্যৎ বেশি, short: ভবিষ্যৎ ফাঁকা, closesell: ভবিষ্যৎ ক্রয় ফাঁকা, closebuy: ভবিষ্যৎ বিক্রি সস্তা] 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)
    }
}

}


আরো

সাহায্যের জন্য (প্রথম ছবিতে ক্লিক করুন)exchange.GetPosition ((), বর্তমান হোল্ডিংয়ের তথ্য পায়।

উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্নএই কৌশলটি আপনার প্রয়োজন অনুসারে তৈরি করা যেতে পারে এবং প্ল্যাটফর্মের কৌশল স্কোয়ারে কিছু কৌশল সন্ধান করতে পারেন।

জেটারভাল। ধন্যবাদ। এটা কি কোড? var nowRefPosAmount = getPosAmount ((_C ((exchange.GetPosition), ct) var x = owRefPosAmount.long var y = owRefPosAmount.short এই সিটিটা চাই?

জেটারভাল। ধন্যবাদ।