आविष्कारक की मात्रा रसायन विज्ञान के लिए अध्ययन की डायरी (1) समाप्त

लेखक:छोटे सपने, बनाया गयाः 2016-05-23 23:10:46, अद्यतन किया गयाः 2019-08-01 10:31:25

पहले बहुत कम लॉग लिखते थे, अब ऐसा लगता है कि आपको हर दिन कुछ रिकॉर्ड करने की आवश्यकता है, क्या आप चमक नहीं सकते हैं! क्या लिखना है? तो अध्ययन, काम करें! (वास्तव में लगभग सब कुछ) आज रोजमर्रा के काम के अलावा, ग्राहकों को एक मॉड्यूल लिखने में कोई समस्या नहीं है, पूरे कोड को फिर से जांचें, चार्ट पर एक अजीब सूचक रेखा के अलावा, बाकी सब कुछ सामान्य लगता है, ठीक है, उप-अनुकरण परीक्षण। सभी प्रकार के मुद्दे आते हैं।

सवाल 1:

  • 1, चार्ट K लाइन में कभी-कभी एक BAR गायब होता है, BUG ढूंढ रहा है. समस्या मिली, विश्लेषण किया, एनालॉग डिस्क के साथ परीक्षण करते समय कोई डेटा प्राप्त नहीं हुआ। जब डेटा प्राप्त होता है, तो 2 बार बीत चुके होते हैं, इसलिए नवीनतम डेटा चार्ट पर चित्रित होता है, जिसके परिणामस्वरूप एक या अधिक मध्यवर्ती अंतराल बीत जाते हैं।
  • 2, कुछ समय के लिए चलाएँ (एक मिनट के लाइन चक्र) कोई समस्या नहीं, फिर से प्रयास करें (एक 30 मिनट के लाइन चक्र) समस्या आती है, एक अजीब बात सामने आती हैः

TypeError: cannot read property length of null duk_hobject_props.c:2258 WToneAndWTtwo __FIL यह त्रुटि देता है।

नीचे देखा गया है कि यह WToneAndWTtwo फ़ंक्शन में एक त्रुटि होनी चाहिए, और मैंने null मान नाम की विशेषता को पढ़ा, जिसे length कहा जाता है, यानी एक चर जैसे कि var name = null; और फिर मैं name.length को पढ़ा गया, तो पूरे कोड में length कॉल करने के लिए जगह ढूंढ ली गई. इस त्रुटि को हल करने के लिए एक फ़ंक्शन भी लिखा गयाः

function isNullAndLog(arr,strArrName){//空数组报错
     if(!arr){
         Log("arr is:",arr,"name:",strArrName);
         return true;
      }
      return false;
}

सोचो, अरे! अब मैं इस फ़ंक्शन में length के लिए सभी चर डालता हूं, परीक्षण करें, कोई भी शून्य बग बिल्कुल नहीं बच सकता है. कोड को ठीक करें, रोबोट पर परीक्षण करें. 30 मिनट के लिए K लाइन परीक्षण, रगड़ने के बादः

TypeError: null duk_hobject_props.c:2258 WToneAndWTtwo की संपत्ति length नहीं पढ़ सकताफाइल1315 त्रुटि रिपोर्ट

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

function isNullAndLog(arr,strArrName){//空数组报错
    if(!arr){
        Log("arr is:",arr,"name:",strArrName);
        return true;
    }
    return false;
}

function main(){
   if(typeof(x) === undefined ){
       Log(typeof(x));
   }
    var aaa = null;
    Log(isNullAndLog(aaa));
    /*
    while(!aaa || aaa.length < 9){
        Log("while xunhuan");
        Sleep(5000 * 1000);
    } 
    */
    talib.EMA(aaa,5);
} 

talib.EMA ((aaa,5); कुंजी यह है कि aaa null है, मैंने इसे जानबूझकर सेट किया है, और यह देखने के लिए कि क्या प्रभाव पड़ता है। TypeError: Cannot read property length of null ~~OK. शायद यही समस्या है, कोड को संशोधित करने के लिए जारी रखें.

सवाल 2:

एक और समस्या यह है कि पहले के विचार अब कोड रिकॉर्ड करते हैंः

function DeleteNullEle(initArr){
    var dealArr = [];
    var initArrLen = initArr.length;
    for(var i = 0,j = 0 ; i < initArrLen ; i++,j++){
    //Log("initArr-",i,":",initArr[i]);//ceshi
    if(initArr[i] === null || isNaN(initArr[i]) ){
        j--;
        //Log("i:",i);//ceshi
        continue;
    }
        dealArr[j] = initArr[i];
    }
    //Log("dealArr:",dealArr);//ceshi
return dealArr;
}

इस फ़ंक्शन को जोड़ने का कारण यह है कि कुछ सरणी इस तरह हैं [NaN, NaN, NaN, NaN, 22,3,56,78,4,23] लेकिन जब आविष्कारक ने लॉग फ़ंक्शन का उपयोग करके क्वांटिफ़िकेशन परीक्षण किया तो यह शून्य था, यह शून्य था। मुझे लंबे समय तक भ्रमित कर दिया, गड्ढे, याद रखना, आप शून्य या नाइन देखते हैं, इसलिए शून्य का न्याय करना असंभव है।
और एक और बात, यह while ((!aaa gbla aaa.length < 10) {...} है, अगर aaa === null, तो यह गलत क्यों नहीं है, क्योंकि इस ऑपरेटर के लिए एक अभिव्यक्ति है में!aaa सच है अभिव्यक्ति हमेशा सच है, इसलिए बाद में aaa.length शायद निष्पादित नहीं किया गया है ((यह HTML, CSS, DOM सीखने के दौरान देखा गया है, ब्राउज़र का न्याय करना। कुछ एपीआई का इस्तेमाल किया गया है।

सवाल 3:

एक अन्य मित्र के अनुरोध पर, एक अंतर की निगरानी को संशोधित करने में मदद करें, वास्तव में एक परीक्षण अंतर रेंज जोड़ना है, और वीक्सिम को धक्का देना, बहुत सरल है।

 if (diff != __lastDiff) {
//--------------------------------------------------------------------------------------------
        if(openWeixin){
            if( (diff <= price1 || diff >= price2 ) && off_on === true ){
                Log("差价:"+diff+"微信推送@");
                off_on = false;
                Sleep(1000);
            }else{
                off_on = true;
                Sleep(1000);
                }
        }
//---------------------------------------------------------------------------------------------
        // add添加数据到series, 参数格式为[series序号, 数据];
        __chart.add([0, [new Date().getTime(), diff]]);
        __lastDiff = diff;
    }

img

कोड की रिक्त रेखाओं के बीच जोड़ा गया कोड बहुत सरल है और शायद अभी तक सही नहीं है।

प्रश्न 4 (वास्तव में कोई समस्या नहीं है, एक छोटा सा अध्ययन रिकॉर्ड)

इन दिनों फ्यूचर्स सीखने की रणनीति लिखने में, यह नकदी की तुलना में अधिक जटिल है, (शुभभाग्य से Z बड़े फ्यूचर्स ट्रेडिंग टेम्पलेट के लिए, अन्यथा ट्रेडिंग विवरण लिखने के लिए एक गिलास पीने के लिए पर्याप्त है >____

  • exchange.GetPosition() // को भंडारण जानकारी प्राप्त करने के लिए उपयोग किया जाता है, ध्यान दें कि यह फ़ंक्शन एक स्थिति संरचना का एक सरणी देता है जिसमें सभी भंडारण के लिए विशिष्ट जानकारी होती है।
  • exchange.SetMarginLevel ((MarginLevel) // यह फ़ंक्शन है लीवरेज सेट करना. विशिष्ट पैरामीटर MarginLevel विकल्प ((5 गुना? 10 गुना?
  • exchange.SetDirection ((Direction) // यह एक बहुत ही महत्वपूर्ण एपीआई है, जिसे नीचे दिए गए आदेश से पहले बुलाया जाता है, क्योंकि चार ऑपरेशनों को अभी पेश किया गया है ((बिक्री और बिक्री...), यह फ़ंक्शन इन ऑपरेशनों को सेट करता है ((हालांकि कुछ अतिरिक्त सामग्री है), और सीटीपी का दूसरा पैरामीटर अभी तक अध्ययन नहीं किया गया है।
  • exchange.SetContractType ((ContractType) // व्यापार खोलने या समतल करने से पहले एक स्पष्ट व्यापार की दिशा है ((बहुत? खाली? समतल?), और दूसरा स्पष्ट व्यापार का अनुबंध है ((सफेद चीनी? कपास?), इसलिए इस फ़ंक्शन का उपयोग कर अनुबंध प्रकार सेट करें. पैरामीटर विभिन्न एक्सचेंजों में विशिष्ट हैं। मूल रूप से इन कार्यों का उपयोग करें. शेष कार्य समान हैं.
  • exchange.Buy() // खरीदें
  • exchange.Sell() // बेचें नीचे मेरे प्रयोग के कोड को देखें, केवल एक अनुभाग को चुनें (मुख्य फ़ंक्शन में कॉपी करने के लिए) और पुनः परीक्षण करें।img
 if (!manager) {//Z大写的商品期货模板类库,用来管理交易的对象(manager 初始时null)。不明白的可以去看源代码,QQ群共享有注释版。
        if (_C(exchange.GetPosition).length > 0) {
            throw "策略启动前不能有持仓.";
        }
        Log('交易平台:', exchange.GetName(), _C(exchange.GetAccount));  //输出当前交易所 信息
        var insDetail = _C(exchange.SetContractType, ContractTypeName);  // 用容错函数 _C ,容错调用 SetContractType函数  首先明确 设置交易的合约类型。
        Log("合约", insDetail.InstrumentName, "一手", insDetail.VolumeMultiple, "份, 最大下单量", insDetail.MaxLimitOrderVolume, "保证金率:", insDetail.LongMarginRatio.toFixed(4), insDetail.ShortMarginRatio.toFixed(4), "交割日期", insDetail.StartDelivDate);
        // 上面这个Log 显示出合约的一些信息,注意 在回测的时候,与实际运行的结果不一样,可以看图杠杆都是null,保证金率都是0,可以试试看。
        manager = $.NewPositionManager();  // 这个生成管理者 对象
    }
    exchange.SetMarginLevel(10); //不支持       在这里我试着设置了一下杠杆试试,发现  显示 错误:Not support     ,CTP商品期货 应该不能自己调整杠杆
    var positions = exchange.GetPosition();     在所有的操作前 ,我试着调用了一下 GetPosition 函数  获取一下持仓信息,显示的null
    Log(positions[0]);
    exchange.SetDirection("buy"); // 在所有的操作前需要设置  操作方向  ,这里设置 买开仓(做多)。
    var id = exchange.Buy(1911,1); // 执行买入操作  下了一个  限价单,  有兴趣的同学 可以试试 市价单。(嘿嘿!自己动手记得牢)
    positions = _C(exchange.GetPosition); //再获取下 持仓信息 看看
    Log(positions);  //有持仓信息了,  在上面 Buy的时候  有兴趣的同学 试试 用低价格 买入。  Buy(1000,1) 看看。

प्रश्न 5: आज एक दोस्त ने कोड का एक टुकड़ा लिखा है, Sleep () फ़ंक्शन में बड़ी त्रुटि है, जो उच्च आवृत्ति नीति को प्रभावित करती है।

function main(){
    for(var i = 0 ; i < 10 ; i++){
        var b1 = 0;
        var b2 = 0;
        var b3 = 15;
        while(b1 < 200){
            var t2s1 = (new Date()).getTime();
            b1++;
            Sleep(b3);
            var t2s6 = (new Date()).getTime();
            b2 += (t2s6 - t2s1);
        }
        Log("Sleep()",b3,"MS",b1,"平均次数",b2/b1);
    }
    throw 2;
}

मैंने परीक्षण किया और पाया कि स्लीप फ़ंक्शन परीक्षण में 1 सेकंड चलाया गया था (पूर्व और बाद का समय 1000 से भिन्न है), फिर इस परीक्षण कोड का समय त्रुटि बहुत बड़ी थी, लेकिन एनालॉग ड्राइव के साथ, मूल रूप से त्रुटि 1 मिलीसेकंड के भीतर थी। यह संभव है कि रीड्यूसिंग सिस्टम सैंडबॉक्स मॉडल का था, जिसमें समय चलाने वाले एल्गोरिदम के कारण त्रुटि थी। सिमुलेशन में त्रुटि बहुत कम थी। लेकिन दोस्त ने कहा कि हालांकि एनालॉग त्रुटि थी, लेकिन यह मेरे साथ नहीं था। मुझे लगता है कि होस्टिंग समस्या है (जैसा कि हम परीक्षण कर रहे थे), मेरा होस्टिंग मूल मशीन पर चल रहा था, उसका VPS पर था।

प्रश्न 6: आज सुबह एक मित्र ने मुझे बताया कि मध्यरात्रि में मेजबान दुर्घटनाग्रस्त हो गया था और मुझे सिस्टम लॉग भेजा। मैंने Z को बताया। मैंने समस्या का पता लगाया और इसे यहां दर्ज किया।

- यह एक लॉग है।

runtime/cgo: pthread_create failed: Resource temporarily unavailable
SIGABRT: abort
PC=0x7f332c591cc9 m=2

goroutine 0 [idle]:

goroutine 1 [select, 207 minutes]:

पहली पंक्ति से देखा गया था कि थ्रेड जनरेशन विफल रहा, संसाधन अस्थायी रूप से अनुपलब्ध थे। यह शायद स्मृति की कमी के कारण हुआ हो सकता है। समाधानः 1, चल रहे रोबोट नीति कोड की जांच करें, क्या उपयोग किए गए संसाधनों को जारी नहीं किया गया है, क्या बहु-थ्रेड वाले एपीआई का उपयोग किया गया है; 2, ulimit का उपयोग करना आदेश व्यवस्थापक के सिस्टम की सीमाओं की जांच करने के लिए ((Linux)) । यह ब्लॉग देख सकते हैंः (ब्लॉग पता)http://smilejay.com/2012/04/fork_resource/] 3. सिस्टम मेमोरी के उपयोग पर ध्यान दें।

ulimit -a का उपयोग करके दिखाएँःimg

ulimit कमांड के लिए पैरामीटरः -H हार्ड संसाधन सीमा सेट करता है। -S सॉफ्टवेयर संसाधन सीमाएँ सेट करता है। -a वर्तमान में सभी संसाधन सीमाओं को दर्शाता है. -c size: कोर फ़ाइल का अधिकतम मान सेट करें. इकाई: blocks -d size: सेट किए गए डेटा खंड का अधिकतम मान. इकाईः kbytes -f size: फ़ाइल बनाने के लिए अधिकतम मान सेट करें। इकाईः blocks -l size: मेमोरी में लॉक किए जाने वाले प्रक्रिया के लिए अधिकतम मान सेट करें। इकाईः kbytes -m size: सेट करने के लिए उपयोग किए जाने वाले अधिकतम स्थायी मेमोरी का मान। इकाईः kbytes -n size: एक साथ खोले जा सकने वाले फ़ाइल वर्णक का अधिकतम मान सेट करें। इकाईः n -p size: पाइपलाइन बफ़र क्षेत्र का अधिकतम मान सेट करें। इकाईः kbytes -s size: स्टैक का अधिकतम मान सेट करें. इकाईः kbytes -t size: सीपीयू उपयोग समय की अधिकतम सीमा सेट करें। इकाईः सेकंड -v size: वर्चुअल मेमोरी का अधिकतम मान सेट करें। इकाईः kbytes -u <प्रोग्राम संख्या> अधिकतम संख्या में प्रोग्राम जो उपयोगकर्ता द्वारा खोले जा सकते हैं

इस समस्या का सामना करने वाले मित्रों ने पाया कि त्रुटिपूर्ण फ़िल्टर फ़ंक्शन शायद समस्या का कारण है, जो होस्टिंग (मेमोरी की लगातार वृद्धि) के टूटने का कारण है। SetErrorFilter (( 502: 503: tcp character unexpected network timeout WSARecv Connect GetAddr no such reset httppreceived EOF reused ); फ़ंक्शन का दुरुपयोग, फ़ंक्शन को केवल एक बार कॉल करने की आवश्यकता होती है और इसे लूप संरचना में नहीं लिखा जा सकता है।

प्रश्न 7: सरल सारांश _C ((() फ़ंक्शन, _N ((() फ़ंक्शन, _G ((() फ़ंक्शन का उपयोग करना।

  • _C() फ़ंक्शन

स्पष्टीकरणः यह फ़ंक्शन मुख्य रूप से एपीआई त्रुटि अनुपालन के लिए उपयोग किया जाता है, जैसे कि एक्सचेंज.गेटएकाउंट () फ़ंक्शन, जिसे इस प्रकार कहा जाता हैः _C ((exchange.GetAccount)); ध्यान दें कि फ़ंक्शन नाम कोष्ठक के बिना है, यदि त्रुटि अनुपालन फ़ंक्शन को पैरामीटर जोड़ने की आवश्यकता है, तो यह फ़ंक्शन के दूसरे पैरामीटर में लिखा जाता है _C (() फ़ंक्शन, क्रमशः पीछे की ओर। उदाहरणों का उपयोग करना।

function main(){
    var account = null;
    var amount = 1;
    var price = 2000;
    account = exchange.GetAccount();
    Log("_C 函数使用前  account :",account);
    //exchange = null; 
    _C(exchange.Buy,price,amount);
    //exchange.Buy(price,1);
    account = exchange.GetAccount();
    Log("_C 函数使用后  account :",account);
}

यह अनुमान लगाया जा सकता है कि _C फ़ंक्शन इस तरह दिखता हैः

 function ___C(functionName,p1){
    functionName("执行需要容错的函数,传入的测试参数为:",p1);
    Log("__C 容错函数启动,容错完毕");
}
function main(){
    pstr = "测试参数--hello";
    ___C(Log,pstr);
}

कार्यान्वयन के परिणामःimg

  • _N() फ़ंक्शन स्पष्टीकरणः यह फ़ंक्शन बहुत अधिक संख्याओं को संभालता है, कुछ संख्याओं को बचाता है। उदाहरण के लिएः
function main(){
    var pi = 3.1415926535897;
    Log("使用_N函数 前pi:",pi);
    var piOfDeal = _N(pi,2);
    Log("使用_N函数后 pi:",piOfDeal);
}

कार्यान्वयन के परिणामःimg

  • _G() फ़ंक्शन स्पष्टीकरणः यह एक वैश्विक शब्दकोश सूची है, जिसे एपीआई दस्तावेज़ में प्रस्तुत किया गया है और इसे सहेजा जा सकता है। KV तालिका, स्थायी रूप से स्थानीय फ़ाइलों को बनाए रखने के लिए, प्रत्येक बॉट के लिए एक अलग डेटाबेस, फिर से शुरू या प्रशासक के बाहर निकलने के बाद भी मौजूद है K को संख्या या स्ट्रिंग के रूप में लिखा जाना चाहिए, चाहे वह बड़े या छोटे हो, और V किसी भी चीज़ के लिए लिखा जा सकता है जिसे JSON में क्रमबद्ध किया जा सकता है _G ((num, 1); // एक वैश्विक चर संख्या सेट करें, जिसका मान 1 है _G ((num, ok); // एक वैश्विक चर number को स्ट्रिंग ok में बदल दिया _G ((num, null); // वैश्विक चर num को हटाता है _G ((num); // वैश्विक चर num का मान लौटाता है _G(); // वर्तमान बॉट का आईडी लौटाता है _G(null); // सभी वैश्विक चर हटाएँ
function main(){
    Log("totalYLMoney 初始赋值 0");
    var totalYLMoney = 0;
    Log("totalYLMoney 已赋,  = ",totalYLMoney);
    if(typeof(_G("totalYLMoney_save")) !== "object"){
        totalYLMoney = _G("totalYLMoney_save"); 
        Log("读取 totalYLMoney 本地数据库 名称为totalYLMoney_save 的值 赋给 totalYLMoney ");
    }else{
        totalYLMoney = 100.12546328765458;
        _G("totalYLMoney_save",totalYLMoney.toString());
        Log("记录 totalYLMoney 保存到本地数据库");
    }
    Log("totalYLMoney",totalYLMoney);
    Log("typeof\(_G(\"totalYLMoney_save\"))",typeof(_G("totalYLMoney_save")));
}

उपरोक्त _G() फ़ंक्शन परीक्षण कोड को रोबोट पर परीक्षण करने की आवश्यकता है, पुनः परीक्षण समर्थित नहीं है. परीक्षण विधि, रोबोट पर प्रोग्राम को तैनात करें, पहली बार रोबोट को लॉन्च करें, रोबोट 100.12546328765458 रिकॉर्ड करेगा; यह मान वैश्विक शब्दकोश "totalYLMoney_save" के नाम पर है, फिर से रोबोट चलाएं, आपको पता चलेगा कि var totalYLMoney = 0, यह चर totalYLMoney को आरंभ करने के बाद भी शब्दकोश से पढ़ा जाता है, जो कि रणनीति के पहले रन पर संग्रहीत है।

प्रश्न 8: रणनीति के बारे में एक विचार, लाभ और हानि का गणनाः

कई बार जब हम समूह में नए छात्रों को देखते हैं, तो हम उनसे पूछते हैं कि क्या वे रणनीति बनाने के लिए एल्गोरिदम का उपयोग करते हैं। सामान्य तौर पर, समाधान के लिए कई तरीके हैं, यहां एक सरल है, और विचार समूह के महादेव द्वारा प्रदान किए गए हैं, यहां मैं इसे स्पष्ट करने का जिम्मेदार हूं।

  • फ्लोटिंग मुनाफाः

फ्लोटिंग मुनाफा यह है कि (वर्तमान मुद्रा - प्रारंभिक मुद्रा) x वर्तमान मूल्य + (वर्तमान मुद्रा - प्रारंभिक मुद्रा)

उदाहरण के लिएः उदाहरण के लिए, मेरे खाते में $ 10 / सिक्का है, और मेरे खाते में $ 5 / सिक्का है, और $ 100 / सिक्का है। एक निश्चित अवधि के दौरान, मैंने $ 15 / सिक्का की औसत कीमत पर $ 3 / सिक्का खरीदा है। इस अवधि के अंत में, सिक्का $ 20 / सिक्का है। इस समय मेरे खाते में $ 55 / सिक्का है। तो हम ऊपर की विधि के अनुसार इस अवधि के दौरान व्यापार के लाभ और हानि की गणना करते हैं। Profit = (8 - 5) * 20 + (55 - 100) = 60 + (-45) = 15 इस गणना विधि का लाभ 15 युआन है. (ध्यान देंः इस समय आपकी कमाई अस्थिर है, क्योंकि यदि इस समय मुद्रा की कीमत में भारी गिरावट आती है, तो आप न केवल लाभ नहीं कमा सकते हैं, बल्कि नुकसान भी कर सकते हैं, बेशक नुकसान भी अस्थिर है, क्योंकि आपकी कमाई इस समय मुद्रा की कीमत के बाद चलती है, कारण है कि आप बहुत अधिक बेड़े में हैं, बैग गिरते हैं) इसके अतिरिक्त, यदि सिक्के की कीमत 20 युआन/एक है, तो समतल, यानी 20 युआन के लिए बेचने के लिए 15 युआन के लिए 3 सिक्के, इस समय खाता हैः 5 सिक्के, 115 युआन; या फिर ऊपर एल्गोरिथ्मः Profit = (5 - 5) * 20 + (115 - 100) = 15, लाभ अभी भी 15 युआन है, अंतर यह है कि यदि प्रारंभिक मुद्रा धारक मूल्यह्रास को ध्यान में नहीं रखा जाता है, तो लाभ मूल्य परिवर्तन के साथ नहीं बदलता है।

  • खाता लाभः

खाता लाभः (अब सिक्का x अब कीमत + अब पैसा) - (शुरुआती सिक्का x शुरुआती कीमत + शुरुआती पैसा)

ऊपर दिए गए उदाहरण का भी उपयोग करें: उदाहरण के लिए, 10 डॉलर प्रति सिक्का की शुरुआती कीमत, खाते में शुरू में 5 सिक्के थे, 100 डॉलर। एक निश्चित अवधि के दौरान, मैंने 15 डॉलर प्रति सिक्का की औसत कीमत पर 3 सिक्के खरीदे। इस अवधि के अंत में, सिक्का 20 डॉलर प्रति सिक्का तक बढ़ गया। इस समय मेरा खाता हैः 8 सिक्के, 55 डॉलर। Profit = (8 * 20 + 55) - (5 * 10 + 100) = 215 - 150 = 65 इस गणना के लिए लाभ 65 युआन है. इसी तरह मैं 20 युआन के लिए एक समतल मूल्य पर खरीदे गए 3 सिक्के बेच रहा हूँ. लाभ = (5 * 20 + 115) - (5 * 10 + 100) = 215 - 150 = 65 उसी तरह।

उपरोक्त दो तरीकों की तुलना करना, एक लाभ 15 और एक लाभ 65 है, वास्तव में यह देखना मुश्किल नहीं है। पहला तरीका प्रारंभिक मुद्रा धारक के मूल्य में वृद्धि के कारण होने वाले लाभ और हानि को नजरअंदाज करता है। दूसरा एल्गोरिथ्म लाभ और हानि की गणना करने के लिए प्रारंभिक मुद्रा धारक के मूल्य में वृद्धि के कारण होने वाले लाभ और हानि को शामिल करता है। इस तरह के लाभों की गणना के लिए भुगतान किया जाता है। फ्लोटिंग प्रॉफिट एक अवधि के दौरान लेनदेन से उत्पन्न होने वाले लाभ और हानि के लिए लागू होता है। ये कुछ अनुभव हैं, जैसे कि गलतियाँ, कृपया भगवान को सही इंगित करें, अग्रिम धन्यवाद ^-^

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

पहले प्लेटफॉर्म के एपीआई की व्याख्या देखेंः

LogStatus(Msg); //	此信息不保存到日志列表里, 只更新当前机器人的状态信息, 在日志上方显示, 可多次调用, 更新状态
LogStatus('这是一个普通的状态提示');
LogStatus('这是一个红色字体的状态提示 #ff0000');
LogStatus('这是一个多行的状态信息\n我是第二行');
var table = {type: 'table', title: '持仓信息', cols: ['列1', '列2'], rows: [ ['abc', 'def'], ['ABC', 'support color #ff0000']]};
LogStatus('`' + JSON.stringify(table)+'`'); // JSON序列化后两边加上`字符, 视为一个复杂消息格式(当前支持表格)
LogStatus('第一行消息\n`' + JSON.stringify(table)+'`\n第三行消息'); // 表格信息也可以在多行中出现
LogStatus('`' + JSON.stringify([table, table])+'`'); // 支持多个表格同时显示, 将以TAB显示到一组里

परीक्षण कोडः

function main(){
    var value1 = 99;
    var value2 ="ceshi 01";
    var table1 = { type : "table", title : "ceshi1", cols : ["列1","列2","列3"] , rows : [ ["abc","def","ghi"] , ["1","2","3"] ] };
    var table2 = { type : "table", title : "ceshi2", cols : ["列1","列2","列3"] , rows : [ ["abc",value1,"ghi"] , [value2,"2","3"] ] };
    LogStatus("测试文本1\n`" + JSON.stringify([table1,table2]) + "`");
}

imgपहले चित्र में देखा जा सकता है कि हम इस ceshi1 तालिका में पेजिंग कर रहे हैं, तालिका का डेटा प्रारूप var table1 और var table2 है. ये दोनों घोषित चर हैं. बेशक table1 तालिका में सभी सामग्री स्थिर स्ट्रिंग हैं. ध्यान दें कि JSON.stringify (([table1,table2]) फ़ंक्शन के आगे और बाद में ` जोड़ना आवश्यक है; अन्यथा तालिका दिखाई नहीं देगी। बेशक, हम तालिकाओं के साथ कुछ डेटा को गतिशील रूप से प्रदर्शित करना चाहते हैं, लेकिन यह हमेशा एक निश्चित पाठ सामग्री नहीं हो सकती है। table2 इस विभाजन में दो परीक्षण डेटा हैं, value1 और value2, दोनों डेटा।imgनए छात्र कोड को कॉपी कर सकते हैं, खुद को परीक्षण कर सकते हैं, इसे बदल सकते हैं। यह याद रखने के लिए अधिक मजबूत है।

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

सीधे परीक्षण करने के लिए, मैं एक यादृच्छिक संख्या का उपयोग करता हूं जो गतिशील परिवर्तनों के लिए उपज दर का अनुकरण करता है, ताकि उपज दर की अवस्था को चार्ट पर दिखाया जा सके; ऊपर कोडः

var ChartObj = {//画图
    tooltip: {xDateFormat: '%Y-%m-%d %H:%M:%S, %A',enabled:true,valueDecimals:2,valueSuffix:'%'}, //提示框  就是鼠标在线上时 显示的一个 框框 里面有一些内容,这里是设置提示框的格式
    chart: { zoomType:'x',panning:true },//图表缩放  
    title: { text: '收益率 %'}, //标题
    rangeSelector: { //范围 区域 选择 
            buttons:  [{type: 'hour',count: 1, text: '1h'}, {type: 'hour',count: 3, text: '3h'}, {type: 'hour', count: 8, text: '8h'}, {type: 'all',text: 'All'}],
            selected: 0,
            inputEnabled: false
        },
    subtitle: {text: " 显示瞬时收益率 % "},//副标题
    xAxis:{type: 'datetime'}, //设置 X轴  的数值为时间类型
    yAxis: [{
            title: {text: '收益率 %'},//标题
            style: {color: '#4572A7'},//样式 
            //opposite: false  //生成右边Y轴
        }
    ],
    series: [//系列
        {name:'收益率',dataLables:{enabled:true,format:'{y} %'},type:'spline',yAxis:0,data:[]} //该图标只用到一条曲线  ,所以 只用设置一个数据序列
        ]                  
};
var chart = Chart(ChartObj);  //初始化

function main(){ //测试用的主函数
    chart.update(ChartObj); //更新
    chart.reset(); //清空图表
    var i = 0; //初始一个 i 值 , 后面循环用,   用来限制循环次数
    var randomNum = 0; //声明一个  随机数 初始化 0
    while(i < 5000){ //限制循环次数
        randomNum = Math.random() * 10;  // 生产随机数 0  -  9.9999
        //chart.add([0,[(new Date()),randomNum]]);
        chart.add(0,[(new Date()).getTime(),randomNum + 5]);  //把生成的随机数  按照时间(X 坐标)     把随机数 画在图表上(Y坐标)     
        Sleep(1000*60); // 程序 每次循环暂停60秒
        //chart.update(ChartObj);
        //chart.reset(500);
    }
    Log("over");
}
  • यहाँ एक समस्या है कि मुझे आधा दिन के लिए उलझन में डाल दिया है, और यह भी दर्ज किया गया है. बस समय लिखते समय यह मिलीसेकंड की संख्या होना चाहिए, इस तरह लिखः नई तारीख (().getTime (()) यह मिलीसेकंड की संख्या है, अगर ऐसा new तारीख (()) तो वहाँ एक छोटे से समस्या है, जैसे कि समय का प्रदर्शन, और एक्स-अक्ष स्केल का उपयोग नहीं कर सकते हैं। एक अन्य टूलटिपः {xDateFormat: %Y-%m-%d %H:%M:%S, %A,enabled:true,valueDecimals:2,valueSuffix:%}, यह सेटिंग जानकारी देखने के लिए है. valueDecimals:2 Y-अक्ष के मान को प्रदर्शित करने के लिए प्रतिबंधित करता है, दो अंकों का एक छोटा सा हिस्सा रखता है, valueSuffix:%' संकेत बॉक्स के अंत में प्रदर्शित होता है और इस % चिह्न को जोड़ता है.

अधिक

ल्यूक्सिंगहुईछोटे छोटे सपने शिक्षक, कृपया मुझे बताएं कि आदेश देने के बाद अधूरे आदेशों को कैसे रद्द किया जाए?

लुईयह एक प्रशंसा की जरूरत है!

भारी बारिशअच्छी बात है... बहुत सी बातें एपीआई दस्तावेज में नहीं कहा जाता है...

पत्ते गिरते हैंशेनम ने जो कुछ भी किया वह अच्छा था।

शॉर्ट लाइन वांग वॉन ने उच्च मूल्य रणनीति बेचीअच्छा है!

छोटे सपनेबहुत अच्छा है https://dn-filebox.qbox.me/bf52888dc68aba5326c403f2280994e81fbce2ee.png ट्यूटोरियल लिंकः https://www.botvs.com/bbs-topic/475

छोटे सपनेयह सब सीखने के लिए आसान है!