4
ध्यान केंद्रित करना
1271
समर्थक

क्रिप्टोकरेंसी सर्किल में क्वांटिटेटिव ट्रेडिंग में नए लोग, कृपया इस पर एक नज़र डालें - आपको क्रिप्टोकरेंसी सर्किल में क्वांटिटेटिव ट्रेडिंग के करीब ले जाना (VI)

में बनाया: 2021-06-04 10:08:48, को अपडेट: 2024-12-04 21:14:15
comments   6
hits   2596

क्रिप्टोकरेंसी सर्किल में क्वांटिटेटिव ट्रेडिंग में नए लोग, कृपया इस पर एक नज़र डालें - आपको क्रिप्टोकरेंसी सर्किल में क्वांटिटेटिव ट्रेडिंग के करीब ले जाना (VI)

क्रिप्टोकरेंसी सर्किल में क्वांटिटेटिव ट्रेडिंग में नए लोग, कृपया इस पर एक नज़र डालें - आपको क्रिप्टोकरेंसी सर्किल में क्वांटिटेटिव ट्रेडिंग के करीब ले जाना (VI)

पिछले लेख में, हमने एक सरल ग्रिड रणनीति बनाने के लिए मिलकर काम किया था। इस लेख में, हम इस रणनीति को मल्टी-वेरिटी स्पॉट ग्रिड रणनीति में अपग्रेड और विस्तारित करेंगे और इस रणनीति को वास्तविक युद्ध में परखेंगे। इसका उद्देश्य कोई “पवित्र प्याला” खोजना नहीं है, बल्कि रणनीति बनाते समय विभिन्न समस्याओं और समाधानों का पता लगाना है। यह लेख इस रणनीति को डिजाइन करने में मेरे कुछ अनुभवों को समझाएगा। इस लेख की सामग्री थोड़ी जटिल है और इसके लिए प्रोग्रामिंग में एक निश्चित आधार की आवश्यकता है।

रणनीतिक आवश्यकताओं पर आधारित डिजाइन सोच

यह आलेख, पिछले आलेख की तरह, अभी भी इन्वेंटर क्वांटाइजेशन (FMZ.COM) पर आधारित डिजाइन पर चर्चा करता है।

  • अनेक किस्में स्पष्ट शब्दों में कहें तो, मेरा मानना ​​है कि यह ग्रिड रणनीति न केवलBTC_USDT, भी कर सकते हैंLTC_USDT/EOS_USDT/DOGE_USDT/ETC_USDT/ETH_USDT. वैसे भी, स्पॉट ट्रेडिंग जोड़ों के लिए, आप जिन सभी उत्पादों का व्यापार करना चाहते हैं, उनका एक ही समय में ग्रिड ट्रेड किया जा सकता है।

उम~~विभिन्न किस्मों के अस्थिर बाजार पर कब्ज़ा करना अच्छा लगता है। आवश्यकताएं सरल लगती हैं, लेकिन डिजाइन के दौरान समस्याएं उत्पन्न होती हैं।

    1. सबसे पहले, विभिन्न किस्मों की बाज़ार जानकारी प्राप्त करें। यह हल की जाने वाली पहली समस्या है। एक्सचेंज के एपीआई दस्तावेज़ की जांच करने के बाद, मैंने पाया कि अधिकांश एक्सचेंज एक समेकित बाजार सूचना इंटरफ़ेस प्रदान करते हैं। ठीक है, डेटा प्राप्त करने के लिए समेकित बाजार डेटा इंटरफ़ेस का उपयोग करें।
    1. दूसरी समस्या खाता परिसंपत्तियों से संबंधित है। क्योंकि हम एक बहु-विविधता रणनीति को क्रियान्वित करना चाहते हैं, इसलिए हमें प्रत्येक लेनदेन के लिए परिसंपत्तियों के अलग-अलग प्रबंधन पर विचार करना होगा। और एक ही बार में सभी परिसंपत्तियों का डेटा और रिकॉर्ड प्राप्त करना। हमें खाता परिसंपत्ति डेटा प्राप्त करने की आवश्यकता क्यों है? क्या हमें प्रत्येक लेनदेन जोड़ी के लिए अलग-अलग रिकॉर्ड रखने की आवश्यकता है? चूंकि ऑर्डर देते समय आपको उपलब्ध परिसंपत्तियों का आकलन करना होता है, तो क्या निर्णय लेने से पहले आपको उन्हें प्राप्त करना आवश्यक है? और आपको आय की गणना करने की आवश्यकता है। क्या आपको पहले प्रारंभिक खाता परिसंपत्ति डेटा रिकॉर्ड करने की भी आवश्यकता है, और फिर चालू खाता परिसंपत्ति डेटा प्राप्त करना और लाभ और हानि की गणना करने के लिए प्रारंभिक के साथ इसकी तुलना करना है? सौभाग्य से, एक्सचेंज का एसेट अकाउंट इंटरफ़ेस आमतौर पर सभी मुद्राओं का एसेट डेटा लौटाता है। हमें इसे केवल एक बार प्राप्त करने और फिर डेटा को संसाधित करने की आवश्यकता है।
    1. रणनीति पैरामीटर डिजाइन. मल्टी-वेरायटी और सिंगल-वेरायटी का पैरामीटर डिजाइन काफी अलग है, क्योंकि हालांकि मल्टी-वेरायटी की प्रत्येक वेरायटी का ट्रेडिंग लॉजिक एक ही है, लेकिन ट्रेडिंग के दौरान पैरामीटर अलग-अलग हो सकते हैं। उदाहरण के लिए, ग्रिड रणनीति में, आप BTC_USDT ट्रेडिंग जोड़े करते समय हर बार 0.01 BTC का व्यापार करना चाह सकते हैं। हालाँकि, यदि आप DOGE_USDT करते समय अभी भी इस पैरामीटर (0.01 सिक्कों का व्यापार) का उपयोग करते हैं, तो यह स्पष्ट रूप से अनुचित है। बेशक, आप कर सकते हैं इसे USDT राशि के अनुसार भी संभालें। लेकिन फिर भी समस्याएँ होंगी। क्या होगा अगर आप सिर्फ़ BTC_USDT के साथ 1000U और DOGE_USDT के साथ 10U ट्रेड करना चाहते हैं? मांग कभी पूरी नहीं हो सकती। कुछ छात्र इस प्रश्न के बारे में सोच सकते हैं और फिर कह सकते हैं: “मैं विभिन्न व्यापारिक जोड़ों के मापदंडों को अलग-अलग नियंत्रित करने के लिए मापदंडों के कई समूह निर्धारित कर सकता हूं।” यह अभी भी लचीले ढंग से जरूरतों को पूरा नहीं कर सकता है। मापदंडों के कितने समूह निर्धारित किए जाने चाहिए? तीन पैरामीटर सेट किए गए हैं। अगर मैं 4 किस्मों का व्यापार करना चाहता हूँ तो क्या होगा? क्या रणनीति को संशोधित करना और पैरामीटर जोड़ना संभव है? इसलिए, मल्टी-वैराइटी रणनीति के मापदंडों को डिजाइन करते समय, हमें विभेदित मापदंडों की मांग पर पूरी तरह से विचार करना चाहिए। एक समाधान यह है कि मापदंडों को साधारण स्ट्रिंग या JSON स्ट्रिंग के रूप में डिजाइन किया जाए। उदाहरण के लिए:
    ETHUSDT:100:0.002|LTCUSDT:20:0.1
    

    “|” प्रत्येक किस्म के डेटा को अलग करता है, जिसका अर्थ हैETHUSDT:100:0.002यह ETH_USDT ट्रेडिंग जोड़ी को नियंत्रित करता है।LTCUSDT:20:0.1यह LTC_USDT ट्रेडिंग जोड़ी को नियंत्रित करता है। बीच में स्थित “|” चिह्न विभाजक का काम करता है। ETHUSDT:100:0.002, जहां ETHUSDT उस ट्रेडिंग जोड़ी को इंगित करता है जिसे आप ट्रेड करना चाहते हैं, 100 ग्रिड स्पेसिंग है, 0.002 प्रत्येक ग्रिड में ट्रेड किए गए ETH सिक्कों की संख्या है, और “:” चिह्न का उपयोग इन आंकड़ों को अलग करने के लिए किया जाता है (बेशक, ये पैरामीटर नियम हैं रणनीति डिजाइनर द्वारा निर्धारित)। आप इसे अपनी आवश्यकताओं के अनुसार डिजाइन कर सकते हैं)। इन स्ट्रिंग्स में प्रत्येक उत्पाद की पैरामीटर जानकारी होती है जिसे आप ट्रेड करना चाहते हैं। रणनीति में इन स्ट्रिंग्स को पार्स करें और प्रत्येक उत्पाद के ट्रेडिंग लॉजिक को नियंत्रित करने के लिए रणनीति के चर को विशिष्ट मान असाइन करें। तो फिर इसका विश्लेषण कैसे करें? आइये उपरोक्त उदाहरण को पुनः प्रयोग करें।

    function main() {
        var net = []  // 记录的网格参数,具体运行到网格交易逻辑时,使用这里面的数据
        var params = "ETHUSDT:100:0.002|LTCUSDT:20:0.1"
        var arrPair = params.split("|")
        _.each(arrPair, function(pair) {
            var arr = pair.split(":")
            var symbol = arr[0]              // 交易对名称
            var diff = parseFloat(arr[1])    // 网格间距
            var amount = parseFloat(arr[2])  // 网格下单量
            net.push({symbol : symbol, diff : diff, amount : amount})
        })
        Log("网格参数数据:", net)
    }
    

    क्रिप्टोकरेंसी सर्किल में क्वांटिटेटिव ट्रेडिंग में नए लोग, कृपया इस पर एक नज़र डालें - आपको क्रिप्टोकरेंसी सर्किल में क्वांटिटेटिव ट्रेडिंग के करीब ले जाना (VI)

    आप देख सकते हैं कि पैरामीटर इस तरह से पार्स किए गए हैं। बेशक, आप सीधे JSON स्ट्रिंग का भी उपयोग कर सकते हैं, जो सरल है।

    function main() {        
        var params = '[{"symbol":"ETHUSDT","diff":100,"amount":0.002},{"symbol":"LTCUSDT","diff":20,"amount":0.1}]'
        var net = JSON.parse(params)  // 记录的网格参数,具体运行到网格交易逻辑时,使用这里面的数据        
        _.each(net, function(pair) {
            Log("交易对:", pair.symbol, pair)
        })
    }
    

    क्रिप्टोकरेंसी सर्किल में क्वांटिटेटिव ट्रेडिंग में नए लोग, कृपया इस पर एक नज़र डालें - आपको क्रिप्टोकरेंसी सर्किल में क्वांटिटेटिव ट्रेडिंग के करीब ले जाना (VI)

    1. डेटा स्थायित्व व्यावहारिक उपयोग में लाई जा सकने वाली रणनीतियों और शिक्षण रणनीतियों के बीच भी एक बड़ा अंतर है। पिछले लेख में बताई गई शिक्षण रणनीति रणनीति तर्क और डिजाइन का केवल एक प्रारंभिक परीक्षण है। वास्तविक अभ्यास में विचार करने के लिए और भी मुद्दे हैं। वास्तविक ट्रेडिंग के दौरान, आप वास्तविक ट्रेडिंग शुरू और बंद कर सकते हैं। इस समय, वास्तविक समय संचालन के दौरान का सारा डेटा नष्ट हो जाएगा। तो फिर हम वास्तविक डिस्क को कैसे रोक सकते हैं और फिर उसे पुनः चालू कर सकते हैं ताकि वह पहले वाली स्थिति में चलती रहे? यहां, वास्तविक समय संचालन के दौरान मुख्य डेटा को बनाए रखना आवश्यक है ताकि सिस्टम को पुनः आरंभ करने पर डेटा को पढ़ा और जारी रखा जा सके। इसका उपयोग इन्वेंटर क्वांटिटेटिव ट्रेडिंग प्लेटफॉर्म पर किया जा सकता है_G()फ़ंक्शन, या डेटाबेस ऑपरेशन फ़ंक्शन का उपयोग करेंDBExec()विवरण के लिए कृपया FMZ API दस्तावेज़ देखें।

    उदाहरण के लिए, हम एक स्वीप फ़ंक्शन डिज़ाइन करते हैं,_G()फ़ंक्शन, ग्रिड डेटा सहेजें.

    var net = null 
    function main() {  // 策略主函数
        // 首先读取储存的net
        net = _G("net")
    
    
        // ...
    }
    
    
    function onExit() {
        _G("net", net)
        Log("执行扫尾处理,保存数据", "#FF0000")
    }
    
    
    function onexit() {    // 平台系统定义的退出扫尾函数,在点击实盘停止时触发执行
        onExit()
    }
    
    
    function onerror() {   // 平台系统定义的异常退出函数,在程序发生异常时触发执行
        onExit()
    }
    
    1. ऑर्डर मात्रा सटीकता, ऑर्डर मूल्य सटीकता, न्यूनतम ऑर्डर मात्रा, न्यूनतम ऑर्डर राशि आदि पर प्रतिबंध।

    बैकटेस्ट सिस्टम ऑर्डर की मात्रा और ऑर्डर की सटीकता पर ऐसे सख्त प्रतिबंध नहीं लगाता है, लेकिन वास्तविक ट्रेडिंग में, प्रत्येक एक्सचेंज के पास ऑर्डर की कीमत और ऑर्डर की मात्रा के लिए सख्त मानक हो सकते हैं, और प्रत्येक ट्रेडिंग जोड़ी के लिए ये मानक भी बहुत सख्त हैं। प्रतिबंध नहीं हैं जो उसी। इसलिए, नए लोग अक्सर बैकटेस्ट सिस्टम का परीक्षण करते हैं और वास्तविक बाजार पर लेनदेन को ट्रिगर करते समय सभी प्रकार की समस्याओं को देखते हैं। फिर वे त्रुटि संदेश भी नहीं पढ़ते हैं और सभी प्रकार की पागल समस्याओं का अनुभव करते हैं [कुत्ते का सिर]।

    कई किस्मों के लिए यह आवश्यकता अधिक जटिल है। एकल-उत्पाद रणनीति के लिए, आप सटीकता जैसी जानकारी निर्दिष्ट करने के लिए एक पैरामीटर डिज़ाइन कर सकते हैं। हालाँकि, बहु-उत्पाद रणनीति डिज़ाइन करते समय, यह स्पष्ट है कि इस जानकारी को पैरामीटर में लिखने से पैरामीटर बहुत फूला हुआ दिखाई देगा।

    इस समय, आपको एक्सचेंज एपीआई दस्तावेज़ की जांच करने की आवश्यकता है, यह देखने के लिए कि क्या एक्सचेंज दस्तावेज़ में ट्रेडिंग जोड़ी से संबंधित जानकारी वाला कोई इंटरफ़ेस है। यदि ये इंटरफेस उपलब्ध हैं, तो आप सटीकता जैसी जानकारी प्राप्त करने के लिए रणनीति में एक स्वचालित एक्सेस इंटरफ़ेस डिज़ाइन कर सकते हैं, और इसे लेनदेन में शामिल ट्रेडिंग जोड़ी की जानकारी के लिए कॉन्फ़िगर कर सकते हैं (सरल शब्दों में, सटीकता स्वचालित रूप से एक्सचेंज से अनुरोध की जाती है, और फिर रणनीति मापदंडों के अनुकूल)। चर)।

    1. विभिन्न एक्सचेंजों के लिए अनुकूलन यह प्रश्न अंत में क्यों रखा गया? क्योंकि हमने ऊपर जिन समस्याओं के बारे में बात की है, उनके समाधान इस अंतिम समस्या को सामने लाएंगे, क्योंकि हमारी रणनीति एकत्रित बाजार इंटरफेस का उपयोग करने, एक्सचेंज ट्रेडिंग जोड़ी की सटीकता और अन्य डेटा अनुकूलन तक पहुंचने, खाता जानकारी तक पहुंचने और प्रत्येक ट्रेडिंग जोड़ी को अलग से संसाधित करने आदि की योजना बनाती है। ये समाधान होंगे एक्सचेंजों के बीच बहुत बड़ा अंतर है। इंटरफ़ेस कॉल में अंतर हैं और तंत्र में अंतर हैं। स्पॉट एक्सचेंजों के लिए, यदि इस ग्रिड रणनीति को वायदा संस्करण में विस्तारित किया जाए तो अंतर कम हो जाता है। विभिन्न एक्सचेंजों के तंत्र में अंतर और भी अधिक है। एक समाधान FMZ टेम्पलेट लाइब्रेरी डिज़ाइन करना है। क्लास लाइब्रेरी में इन विभेदित कार्यान्वयनों को लिखें और डिज़ाइन करें। रणनीति और एक्सचेंज के बीच युग्मन को कम करें। ऐसा करने का नुकसान यह है कि आपको एक टेम्पलेट लाइब्रेरी लिखनी होगी और उसे इस टेम्पलेट में प्रत्येक एक्सचेंज के लिए विशेष रूप से क्रियान्वित करना होगा।

टेम्पलेट लाइब्रेरी डिज़ाइन करें

उपरोक्त विश्लेषण के आधार पर, रणनीतियों और विनिमय तंत्रों और इंटरफेस के बीच युग्मन को कम करने के लिए एक टेम्पलेट लाइब्रेरी डिज़ाइन की गई है।

हम इस टेम्पलेट क्लास लाइब्रेरी को इस तरह डिज़ाइन कर सकते हैं (कुछ कोड छोड़े गए हैं):

function createBaseEx(e, funcConfigure) {
    var self = {}
    self.e = e 
    
    self.funcConfigure = funcConfigure
    self.name = e.GetName()
    self.type = self.name.includes("Futures_") ? "Futures" : "Spot"
    self.label = e.GetLabel()
    
    // 需要实现的接口
    self.interfaceGetTickers = null   // 创建异步获取聚合行情数据线程的函数
    self.interfaceGetAcc = null       // 创建异步获取账户数据线程的函数
    self.interfaceGetPos = null       // 获取持仓
    self.interfaceTrade = null        // 创建并发下单
    self.waitTickers = null           // 等待并发行情数据 
    self.waitAcc = null               // 等待账户并发数据
    self.waitTrade = null             // 等待下单并发数据
    self.calcAmount = null            // 根据交易对精度等数据计算下单量
    self.init = null                  // 初始化工作,获取精度等数据
    
    // 执行配置函数,给对象配置
    funcConfigure(self)

    // 检测configList约定的接口是否都实现
    _.each(configList, function(funcName) {
        if (!self[funcName]) {
            throw "接口" + funcName + "未实现"
        }
    })
    
    return self
}

$.createBaseEx = createBaseEx
$.getConfigureFunc = function(exName) {
    dicRegister = {
        "Futures_OKCoin" : funcConfigure_Futures_OKCoin,    // OK期货的实现
        "Huobi" : funcConfigure_Huobi,
        "Futures_Binance" : funcConfigure_Futures_Binance,
        "Binance" : funcConfigure_Binance,
        "WexApp" : funcConfigure_WexApp,                    // wexApp的实现
    }
    return dicRegister
}

टेम्पलेट में, इसे विशिष्ट एक्सचेंज कार्यान्वयन के लिए लिखें, उदाहरण के लिए, FMZ की सिमुलेशन डिस्क WexApp को उदाहरण के रूप में लें:

function funcConfigure_WexApp(self) {
    var formatSymbol = function(originalSymbol) {
        // BTC_USDT
        var arr = originalSymbol.split("_")
        var baseCurrency = arr[0]
        var quoteCurrency = arr[1]
        return [originalSymbol, baseCurrency, quoteCurrency]
    }

    self.interfaceGetTickers = function interfaceGetTickers() {
        self.routineGetTicker = HttpQuery_Go("https://api.wex.app/api/v1/public/tickers")
    }

    self.waitTickers = function waitTickers() {
        var ret = []
        var arr = JSON.parse(self.routineGetTicker.wait()).data
        _.each(arr, function(ele) {
            ret.push({
                bid1: parseFloat(ele.buy), 
                bid1Vol: parseFloat(-1),
                ask1: parseFloat(ele.sell), 
                ask1Vol: parseFloat(-1),
                symbol: formatSymbol(ele.market)[0],
                type: "Spot", 
                originalSymbol: ele.market
            })
        })
        return ret 
    }

    self.interfaceGetAcc = function interfaceGetAcc(symbol, updateTS) {
        if (self.updateAccsTS != updateTS) {
            self.routineGetAcc = self.e.Go("GetAccount")
        }
    }

    self.waitAcc = function waitAcc(symbol, updateTS) {
        var arr = formatSymbol(symbol)
        var ret = null 
        if (self.updateAccsTS != updateTS) {
            ret = self.routineGetAcc.wait().Info
            self.bufferGetAccRet = ret 
        } else {
            ret = self.bufferGetAccRet
        }
        if (!ret) {
            return null 
        }        
        var acc = {symbol: symbol, Stocks: 0, FrozenStocks: 0, Balance: 0, FrozenBalance: 0, originalInfo: ret}
        _.each(ret.exchange, function(ele) {
            if (ele.currency == arr[1]) {
                // baseCurrency
                acc.Stocks = parseFloat(ele.free)
                acc.FrozenStocks = parseFloat(ele.frozen)
            } else if (ele.currency == arr[2]) {
                // quoteCurrency
                acc.Balance = parseFloat(ele.free)
                acc.FrozenBalance = parseFloat(ele.frozen)
            }
        })
        return acc
    }

    self.interfaceGetPos = function interfaceGetPos(symbol, price, initSpAcc, nowSpAcc) {
        var symbolInfo = self.getSymbolInfo(symbol)
        var sumInitStocks = initSpAcc.Stocks + initSpAcc.FrozenStocks
        var sumNowStocks = nowSpAcc.Stocks + nowSpAcc.FrozenStocks
        var diffStocks = _N(sumNowStocks - sumInitStocks, symbolInfo.amountPrecision)
        if (Math.abs(diffStocks) < symbolInfo.min / price) {
            return []
        }
        return [{symbol: symbol, amount: diffStocks, price: null, originalInfo: {}}]
    }

    self.interfaceTrade = function interfaceTrade(symbol, type, price, amount) {
        var tradeType = ""
        if (type == self.OPEN_LONG || type == self.COVER_SHORT) {
            tradeType = "bid"
        } else {
            tradeType = "ask"
        }
        var params = {
            "market": symbol,
            "side": tradeType,
            "amount": String(amount),
            "price" : String(-1),
            "type" : "market"
        }
        self.routineTrade = self.e.Go("IO", "api", "POST", "/api/v1/private/order", self.encodeParams(params))
    }

    self.waitTrade = function waitTrade() {
        return self.routineTrade.wait()
    }

    self.calcAmount = function calcAmount(symbol, type, price, amount) {
        // 获取交易对信息
        var symbolInfo = self.getSymbolInfo(symbol)
        if (!symbol) {
            throw symbol + ",交易对信息查询不到"
        }
        var tradeAmount = null 
        var equalAmount = null  // 记录币数
        if (type == self.OPEN_LONG || type == self.COVER_SHORT) {
            tradeAmount = _N(amount * price, parseFloat(symbolInfo.pricePrecision))
            // 检查最小交易量
            if (tradeAmount < symbolInfo.min) {
                Log(self.name, " tradeAmount:", tradeAmount, "小于", symbolInfo.min)
                return false 
            }
            equalAmount = tradeAmount / price
        } else {
            tradeAmount = _N(amount, parseFloat(symbolInfo.amountPrecision))
            // 检查最小交易量
            if (tradeAmount < symbolInfo.min / price) {
                Log(self.name, " tradeAmount:", tradeAmount, "小于", symbolInfo.min / price)
                return false 
            }
            equalAmount = tradeAmount
        }
        return [tradeAmount, equalAmount]
    }

    self.init = function init() {   // 自动处理精度等条件的函数
        var ret = JSON.parse(HttpQuery("https://api.wex.app/api/v1/public/markets"))
        _.each(ret.data, function(symbolInfo) {
            self.symbolsInfo.push({
                symbol: symbolInfo.pair,
                amountPrecision: parseFloat(symbolInfo.basePrecision),
                pricePrecision: parseFloat(symbolInfo.quotePrecision),
                multiplier: 1,
                min: parseFloat(symbolInfo.minQty),
                originalInfo: symbolInfo
            })
        })        
    }
}

फिर रणनीति में इस टेम्पलेट का उपयोग करना सरल है:

function main() {
    var fuExName = exchange.GetName()
    var fuConfigureFunc = $.getConfigureFunc()[fuExName]
    var ex = $.createBaseEx(exchange, fuConfigureFunc)

    var arrTestSymbol = ["LTC_USDT", "ETH_USDT", "EOS_USDT"]
    var ts = new Date().getTime()
    
    // 测试获取行情
    ex.goGetTickers()
    var tickers = ex.getTickers()
    Log("tickers:", tickers)
    
    // 测试获取账户信息
    ex.goGetAcc(symbol, ts)
    
    _.each(arrTestSymbol, function(symbol) {        
        _.each(tickers, function(ticker) {
            if (symbol == ticker.originalSymbol) {
                // 打印行情数据
                Log(symbol, ticker)
            }
        })

        // 打印资产数据
        var acc = ex.getAcc(symbol, ts)
        Log("acc:", acc.symbol, acc)
    })
}

रणनीति वास्तविक बाजार

उपरोक्त टेम्पलेट के आधार पर रणनीति बनाना और लिखना बहुत सरल है। पूरी रणनीति लगभग 300+ लाइनों की है, जो डिजिटल मुद्रा स्पॉट मल्टी-वैराइटी ग्रिड रणनीति को लागू करती है।

क्रिप्टोकरेंसी सर्किल में क्वांटिटेटिव ट्रेडिंग में नए लोग, कृपया इस पर एक नज़र डालें - आपको क्रिप्टोकरेंसी सर्किल में क्वांटिटेटिव ट्रेडिंग के करीब ले जाना (VI)

क्रिप्टोकरेंसी सर्किल में क्वांटिटेटिव ट्रेडिंग में नए लोग, कृपया इस पर एक नज़र डालें - आपको क्रिप्टोकरेंसी सर्किल में क्वांटिटेटिव ट्रेडिंग के करीब ले जाना (VI)

वर्तमान में धन हानि हो रही हैT_Tफिलहाल, स्रोत कोड जारी नहीं किया जाएगा।

यहाँ कुछ पंजीकरण कोड दिए गए हैं। यदि आप रुचि रखते हैं, तो आप इसे wexApp पर आज़मा सकते हैं:

购买地址: https://www.fmz.com/m/s/284507
注册码: 
adc7a2e0a2cfde542e3ace405d216731
f5db29d05f57266165ce92dc18fd0a30
1735dca92794943ddaf277828ee04c27
0281ea107935015491cda2b372a0997d
1d0d8ef1ea0ea1415eeee40404ed09cc

इसमें अमेरिका की संख्या 200 से अधिक थी और जब यह चलनी शुरू हुई तो इसे एकतरफा बड़े बाजार का सामना करना पड़ा और धीरे-धीरे इसमें सुधार हुआ। स्पॉट ग्रिड का सबसे बड़ा लाभ यह है: “आप अच्छी नींद ले सकते हैं!” स्थिरता ठीक है। मैंने 27 मई के बाद से इसे नहीं छुआ है। मैं फिलहाल फ्यूचर्स ग्रिड को आजमाने की हिम्मत नहीं कर पा रहा हूँ।