संसाधन लोड हो रहा है... लोड करना...

ग्रिड ट्रेडिंग रणनीति

लेखक:अच्छाई, बनाया गयाः 2018-08-23 13:45:27, अद्यतन किया गयाः

ग्रिड ट्रेडिंग रणनीति (www.fmz.com) ग्रिड ट्रेडिंग का मूल विचार बहुत सीधा है। एक ट्रेड करने के बजाय, हम एक ग्रिड पैटर्न बनाने वाले कई ट्रेड करते हैं। आमतौर पर ये वर्तमान मूल्य स्तर के आसपास स्टॉप या लिमिट ऑर्डर के रूप में दर्ज किए जाते हैं, लेकिन हमेशा नहीं। मैं इसे नीचे अधिक विस्तार से समझाऊंगा, लेकिन यह मूल विचार है।

ग्रिड ट्रेडिंग क्या है और यह कैसे काम करती है? ग्रिड ट्रेडिंग बाजार की अस्थिरता पर एक खेल है। व्यापारियों द्वारा इसे पसंद करने के दो कारण हैं। पहला यह है कि यह आपको बाजार की दिशा पर एक निश्चित भविष्यवाणी करने की आवश्यकता नहीं है।

दूसरा यह है कि यह अस्थिर बाजारों में अच्छी तरह से काम करता है, जहां कोई स्पष्ट प्रवृत्ति नहीं है ये स्थितियां मुद्रा बाजारों में बहुत आम हैं

ग्रिड ट्रेडिंग एक प्रकार का तकनीकी विश्लेषण ट्रेडिंग है जो विशिष्ट ग्रिड पैटर्न के भीतर आंदोलन पर आधारित है। ग्रिड ट्रेडिंग विदेशी मुद्रा व्यापार में लोकप्रिय है। कुल मिलाकर, तकनीक बाजारों में सामान्य मूल्य अस्थिरता पर लाभ उठाने का प्रयास करती है, कुछ नियमित अंतराल पर एक पूर्वनिर्धारित आधार मूल्य से ऊपर और नीचे खरीद और बिक्री ऑर्डर रखकर। ऐसे खरीद और बिक्री ऑर्डर, आमतौर पर 10 या 15 इकाइयों के अंतराल पर स्थित होते हैं, एक ट्रेडिंग ग्रिड बनाते हैं।

ग्रिड दिशा को अनुकूलित कर सकता है

मूल व्यापारिक परिचालनः पहले खरीदें और फिर बेचें।

ग्रिड पहली कीमत से नीचे की कीमत पर खरीद आदेश भेजना शुरू कर देगा, जो कि पहली कीमत (दूसरी नवीनतम खरीद मूल्य, तीसरी नवीनतम खरीद मूल्य...और इसी तरह) के बाद की कीमत है। प्रत्येक खरीद आदेश को मूल्य अंतराल पैरामीटर द्वारा अलग किया जाता है। लंबित आदेशों की संख्या एकल मात्रा है, और कुल मात्रा भरने तक ऑर्डर कुल भेजेगी।

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

पहले शॉर्ट बेचना और फिर कवर करने के लिए खरीदनाः ऑपरेशन बिल्कुल विपरीत है

इस रणनीति का सबसे बड़ा जोखिम तब होता है जब बाजार का रुझान एकतरफा होता है और कीमतों में उतार-चढ़ाव ग्रिड से अधिक होता है।

निम्नलिखित कोड ने स्वचालित स्टॉप हानि और आंदोलन समारोह के साथ ग्रिड बनाया है।

टिप्पणियाँः

यह रणनीति एक आभासी लंबित आदेश डिजाइन का उपयोग करती है, जो लंबित आदेशों की संख्या को सीमित करने के लिए एक्सचेंज के लिए बहुत अधिक प्रसंस्करण प्रदान करती है, और समस्या को लचीले ढंग से हल करती है।

ग्रिड तर्क डिजाइन में लचीला और संरचना में स्मार्ट है।

लाभ और हानि की गणना, प्रत्येक संख्यात्मक सांख्यिकीय एल्गोरिथ्म का उपयोग संदर्भ के लिए किया जा सकता है, और प्रत्येक स्थिति का पता लगाने डिजाइन कठोर है।

स्रोत कोड सीखने लायक है।

अधिक जानकारी के लिए, कृपया देखेंः

https://www.fmz.com/strategy/112633

स्रोत कोडः

` // ग्रिड दिशा अनुकूलित कर सकते हैं मूल व्यापारिक संचालनः पहले खरीदें और फिर बेचें। // ग्रिड कीमत है कि पहले मूल्य से नीचे है कि पर खरीद आदेश भेजने के लिए शुरू हो जाएगा, जो कि कीमत का पालन // पहले मूल्य (दूसरा नवीनतम खरीद मूल्य, तीसरा नवीनतम खरीद मूल्य...और इसी तरह) द्वारा। प्रत्येक खरीद आदेश द्वारा अलग किया जाता है // मूल्य अंतराल पैरामीटर। लंबित आदेशों की संख्या एक मात्रा है, और आदेश कुल भेज देंगे जब तक // कुल मात्रा भरी हुई है. // किसी भी खरीद आदेश पूरा हो गया है के बाद, कार्यक्रम खरीद मूल्य के आधार पर होगा, मूल्य की कीमत जोड़ें // अंतर पैरामीटर बिक्री मूल्य के लिए, आदेश बेचा गया है के बाद, और फिर इस की प्रगति को फिर से शुरू // ग्रिड रणनीति (चेकिंग, जगह आदेश, यह निष्पादित होने तक प्रतीक्षा, बेच) // पहले शॉर्ट बेचना और फिर कवर करने के लिए खरीदनाः ऑपरेशन बिल्कुल विपरीत है // इस रणनीति का सबसे बड़ा जोखिम तब होता है जब बाजार का रुझान एकतरफा होता है, और कीमतों में उतार-चढ़ाव ग्रिड से अधिक होता है। // निम्नलिखित कोड स्वचालित स्टॉप हानि और आंदोलन समारोह के साथ ग्रिड बना दिया है. // टिप्पणियाँः // रणनीति एक आभासी लंबित आदेश डिजाइन का उपयोग करता है, जो संख्या को सीमित करने के लिए विनिमय के लिए प्रसंस्करण का एक बहुत प्रदान करता है // लंबित आदेशों का, और समस्या लचीलापन से हल करता है। // ग्रिड तर्क डिजाइन में लचीला है और संरचना में स्मार्ट है। // लाभ और हानि गणना, प्रत्येक संख्यात्मक सांख्यिकीय एल्गोरिथ्म संदर्भ के लिए इस्तेमाल किया जा सकता है, और प्रत्येक स्थिति का पता लगाने डिजाइन // सख्त है. (BUG की संभावना को कम करने के लिए) // स्रोत कोड सीखने के लायक है।

// स्रोत कोडः /* इंटरफ़ेस पैरामीटर (कोड में वैश्विक चर के रूप में दिखाए गए) OpType ग्रिड दिशा ड्रॉप-डाउन बॉक्स (चयनित) पहले खरीदें फिर बेचें FirstPriceAuto प्रारंभिक मूल्य स्वचालित बुलियन (सही/गलत) सच FirstPrice@!FirstPriceऑटो प्रारंभिक मूल्य संख्यात्मक (संख्या) 100 सभी संख्या कुल संख्यात्मक संख्या (संख्या) 10 मूल्यग्रिड मूल्य अंतराल संख्यात्मक (संख्या) 1 प्राइसडिफ़ स्प्रेड संख्यात्मक (संख्या) 2 राशिप्रकार आदेश आकार ड्रॉप-डाउन बॉक्स (चयनित) एक ही राशि खरीदें और बेचें AmountOnce@AmountType==0 एकल लेनदेन मात्रा संख्यात्मक (संख्या) 0.1 BAmountOnce@AmountType==1 क्रय आदेश आकार संख्यात्मक (संख्या) 0.1 SAmountOnce@AmountType==1 बिक्री आदेश आकार संख्यात्मक (संख्या) 0.1 AmountCoefficient@AmountType==0 मात्रा अंतर स्ट्रिंग (स्ट्रिंग) *1 AmountDot दशमलव बिंदु संख्यात्मक (संख्या) 3 EnableProtectDiff स्प्रेड सुरक्षा चालू करें बुलियन (सही/गलत) गलत ProtectDiff@EnableProtectDiff Entry spread मूल्य संरक्षण संख्यात्मक (संख्या) 20 CancelAllWS stop सभी लंबित ऑर्डर रद्द करता है बुलियन (सही/गलत) सच CheckInterval मतदान अंतराल संख्यात्मक (संख्या) 2000 अंतराल विफलता पुनः प्रयास अंतराल संख्यात्मक (संख्या) 1300 RestoreProfit अंतिम लाभ बूलियन (सही/गलत) गलत बहाल करता है LastProfit@RestoreProfit अंतिम लाभ संख्यात्मक (संख्या) 0 ProfitAsOrg@RestoreProfit अंतिम लाभ औसत मूल्य के रूप में गिना जाता है बुलियन (सही/गलत) गलत EnableAccountCheck संतुलन सत्यापन सक्षम करें बुलियन (सही/गलत) सच EnableStopLoss@EnableAccountCheck खोलें स्टॉप लॉस बुलियन (सही/गलत) गलत StopLoss@EnableStopLoss अधिकतम फ्लोटिंग हानि संख्यात्मक (संख्या) 100 StopLossMode@EnableStopLoss पोस्ट-स्टॉप हानि ऑपरेशन ड्रॉप-डाउन बॉक्स (चयनित) रीसायकल करें और बाहर निकलें। EnableStopWin@EnableAccountCheck ले लो लाभ चालू करें बुलियन (सही/गलत) गलत StopWin@EnableStopWin अधिकतम चलती लाभ संख्या प्रकार (संख्या) 120 StopWinMode@EnableStopWin लाभ लेने के बाद ऑपरेशन ड्रॉप-डाउन बॉक्स (चयनित) रीसायकल करें और बाहर निकलें। ऑटोमोव@एनेबलअकाउंटचेक ऑटोमोव बूलियन (सही/गलत) गलत MaxDistance@AutoMove अधिकतम दूरी संख्यात्मक (संख्या) 20 MaxIdle@AutoMove अधिकतम निष्क्रिय (सेकंड) संख्यात्मक (संख्या) 7200 EnableDynamic गतिशील लंबित आदेशों पर घूमता है बुलियन (सही/गलत) गलत DynamicMax@EnableDynamic आदेश समाप्ति दूरी संख्या (संख्या) 30 ResetData स्टार्टअप पर सभी डेटा को साफ़ करता है बुलियन (सही/गलत) सच सटीक मूल्य दशमलव लंबाई संख्यात्मक (संख्या) 5 */

function hasOrder ((ऑर्डर, orderId) { // जांचें कि क्या पैरामीटर ऑर्डर में ऑर्डर आईडी के साथ ऑर्डर है for (var i = 0; i < orders.length; i++) { // समान आईडी की जांच करने के लिए आदेशों को पार करें, यदि वहाँ है तो सही लौटाएं यदि (आदेश[i].Id == आदेशId) { true लौटाता है; } } false लौटाता है; // सभी पार किया, कोई ट्रिगर नहीं अगर अर्थ ID orderId के साथ क्रम नहीं मिला है, false लौटाता है }

function cancelPending() { // सभी लंबित आदेश कार्यों को रद्द करें var ret = false; // रिटर्न सफलता टैग चर सेट करें while (true) { // जबकि लूप यदि (ret) { // यदि ret सच है तो एक निश्चित समय के लिए नींद नींद ((अंतराल); } var orders = _C(exchange.GetOrders); // विनिमय द्वारा निष्पादित नहीं की गई आदेश जानकारी प्राप्त करने के लिए एपीआई को कॉल करें. if (orders.length == 0) { // यदि एक खाली सरणी लौटाई जाती है, तो एक्सचेंज में कोई निष्पादित आदेश नहीं हैं. ब्रेक; // जबकि लूप से बाहर कूदें }

    for (var j = 0; j < orders.length; j++) {              // Traverse the unfinished order array and use orders[j].Id one by one to cancel the order based on the index j.
        exchange.CancelOrder(orders[j].Id, orders[j]);
        ret = true;                                        // Once there is a cancel operation, ret is assigned a value of true. Used to trigger above Sleep, wait for re-exchange.GetOrders detection 
    }
}
return ret;                                                // return ret

}

फ़ंक्शन valuesToString(values, pos) { // स्ट्रिंग में परिवर्तित मान var result = ; // रिटर्न के लिए एक खाली स्ट्रिंग परिणाम घोषित करें यदि (typeof(pos) === undefined) { // यदि pos पैरामीटर पारित नहीं किया जाता है, तो pos को 0 का मान असाइन करें। pos = 0; } for (var i = pos; i < values.length; i++) { // पारित pos के अनुसार प्रक्रिया मान सरणी यदि (i > pos) { // पहले लूप के अलावा, परिणाम स्ट्रिंग के बाद एक स्थान जोड़ें परिणाम += ; } if (values[i] === null) { // यदि values (function argument list array) वर्तमान indexs तत्व null है तो result null string जोड़ता है परिणाम += null; } else if (typeof(values[i]) == undefined) { // यदि यह अपरिभाषित है, तो undefined जोड़ें परिणाम += अपरिभाषित; } else { // शेष प्रकार अलग से स्विच का पता लगाने करते हैं switch (values[i].constructor.name) { // values[i] के कंस्ट्रक्टर के नाम गुण की जाँच करें, जो कि प्रकार का नाम है मामला तारीख: मामला नंबर: केस स्ट्रिंग: केस फंक्शन : result += values[i].toString(); // यदि यह एक दिनांक प्रकार, एक संख्यात्मक प्रकार, एक स्ट्रिंग प्रकार, या एक फ़ंक्शन प्रकार है, तो इसके toString फ़ंक्शन को कॉल करें और इसे स्ट्रिंग में परिवर्तित करें, फिर जोड़ें तोड़ना; डिफ़ॉल्टः result += JSON.stringify(values[i]); // अन्य मामलों में, एक JSON स्ट्रिंग में परिवर्तित करने के लिए JSON.stringify फ़ंक्शन का उपयोग करें. परिणाम में जोड़ें तोड़ना; } } } return result; // परिणाम लौटाता है }

फंक्शन ट्रेडर ((() { // ट्रेडर फंक्शन, समापन का उपयोग करते हुए। var vId = 0; // आदेश वृद्धि आईडी var orderBooks = []; // ऑर्डर बुक var hisBooks = []; // ऐतिहासिक आदेश पुस्तिका var orderBooksLen = 0; // ऑर्डर बुक की लंबाई this.Buy = function ((मूल्य, राशि, अतिरिक्त) { // खरीद कार्य, मापदंडः मूल्य, मात्रा, विस्तारित जानकारी if (typeof(extra) === undefined) { // यदि पैरामीटर अतिरिक्त में पारित नहीं किया जाता है, यानी typeof undefined लौटाता है extra = ; // extra को एक खाली स्ट्रिंग असाइन करें } अन्य { extra = valuesToString(arguments, 2); // this.Buy फ़ंक्शन को कॉल करते समय पारित किए गए तर्क तर्क valuesToString फ़ंक्शन को पारित किए जाते हैं. } vId++; // var orderId = V + vId; // orderBooks[orderId] = { // आदेश पुस्तिका सरणी में विशेषता orderId जोड़ें और इसे निर्मित ऑब्जेक्ट के साथ आरंभ करें. प्रकारः ORDER_TYPE_BUY, // निर्मित वस्तु प्रकार गुणः प्रकार खरीदें स्थितिः ORDER_STATE_PENDING, // प्रतीक्षा में स्थिति आईडीः 0, // ऑर्डरआईडी 0 मूल्यः मूल्य, // मूल्य पैरामीटर मूल्य मात्राः मात्रा, // आदेश मात्रा पैरामीटर राशि अतिरिक्त: अतिरिक्त // विस्तारित जानकारी valuesToString द्वारा संसाधित स्ट्रिंग }; orderBooksLen++; // आदेश पुस्तिका की लंबाई 1 से बढ़ जाती है return orderId; // इस बार निर्मित आदेश का orderId लौटाता है (गैर-विनिमय आदेश आईडी, भ्रमित न करें) }; this.Sell = function ((मूल्य, राशि, अतिरिक्त) { // मूल रूप से इस तरह के समान.Buy, एक बिक्री आदेश का निर्माण. यदि (typeof(extra) === undefined) { अतिरिक्त = ; } अन्य { extra = valuesToString ((arguments, 2); } vId++; var orderId = V + vId; orderBooks[orderId] = { प्रकारः ORDER_TYPE_SELL, स्थितिः ORDER_STATE_PENDING, आईडीः 0, मूल्यः मूल्य, राशिः राशि, अतिरिक्त: अतिरिक्त }; orderBooksLen++; वापसी आदेश }; this.GetOrders = function() { // अधूरी आदेश जानकारी प्राप्त करें var आदेश = _C(exchange.GetOrders); // आदेशों को असाइन किए गए अधूरे आदेश जानकारी प्राप्त करने के लिए API GetOrders कॉल करें for (orderId in orderBooks) { // ट्रेडर ऑब्जेक्ट में orderBooks को पार करना var order = orderBooks[orderId]; // orderId के आधार पर आदेश निकालें यदि (order.Status!== ORDER_STATE_PENDING) { // यदि आदेश की स्थिति निलंबित स्थिति के बराबर नहीं है, तो इस लूप को छोड़ दें जारी रखें; } var found = false; // पाया चर (यदि पाया गया है तो चिह्नित) को true में आरंभ करें for (var i = 0; i < orders.length; i++) { // एपीआई द्वारा लौटाए गए निष्पादित आदेशों के लिए ट्रैवर्सिंग डेटा
if (orders[i].Id == order.Id) { // जब आप orderBooks में एक ही आदेश आईडी के साथ एक आदेश पाते हैं, तो find के लिए true का मान असाइन करें, जिसका अर्थ है find. पाया = सच;
ब्रेक; // वर्तमान लूप से बाहर कूदें } } यदि (!found) { // यदि नहीं मिला, तो आदेशों के लिए orderBooks[orderId] दबाएं. orders.push ((orderBooks[orderId]); // आप इस तरह धक्का क्यों करना चाहते हैं? } } वापसी आदेश; // वापसी आदेश } this.GetOrder = function ((orderId) { // आदेश प्राप्त करें यदि (typeof(orderId) === number) { // यदि पारित तर्क orderId एक संख्यात्मक प्रकार है return exchange.GetOrder(orderId); // आदेश की जानकारी प्राप्त करने के लिए API GetOrder को कॉल करें और आदेश की जानकारी प्राप्त करें। } if (typeof(hisBooks[orderId])!== undefined) { // Typeof(hisBooks[orderId]) if not equal to undefined return hisBooks[orderId]; // orderId के रूप में विशेषता के साथ hisBooks में डेटा लौटाता है } यदि (typeof(orderBooks[orderId])!== undefined) { // उपरोक्त के समान, यदि orderBooks में orderId का मान है, तो यह डेटा लौटाया जाता है. रिटर्न ऑर्डरबुक[orderId]; } null लौटाता है; // यदि उपरोक्त शर्तें पूरी नहीं होती हैं तो null लौटाता है }; this.Len = function() { // ट्रेडर के ऑर्डरBookLen चर को लौटाता है, जो ऑर्डर बुक की लंबाई लौटाता है. वापसी आदेशBooksLen; }; this.RealLen = function() { // वापस आदेश पुस्तिका में आदेश मात्रा सक्रिय करें. var n = 0; // प्रारंभिक गणना 0 है के लिए (orderId in orderBooks) { // आदेश पुस्तिका को पार करना यदि (orderBooks[orderId].Id > 0) { // यदि पारगमन में वर्तमान क्रम की आईडी 0 से अधिक है, यानी प्रारंभिक समय के अलावा 0, // यह दर्शाता है कि आदेश रखा गया है, आदेश सक्रिय किया गया है. n++; // संचयी रूप से सक्रिय आदेश } } return n; // n का मान लौटाता है, जो वास्तविक ऑर्डर बुक लंबाई लौटाता है. (सक्रिय ऑर्डर की संख्या) }; यह. पोल = समारोह ((टिकर, मूल्यDiff) { // var आदेश = _C(exchange.GetOrders); // सभी निष्पादित आदेश प्राप्त करें के लिए (orderId in orderBooks) { // आदेश पुस्तिका को पार करना var order = orderBooks[orderId]; // आदेश के लिए वर्तमान आदेश असाइन ले लो यदि (order.Id > 0) { // यदि आदेश सक्रिय है, यानी order.Id 0 नहीं है (पहले से ही रखा गया है) var found = false; // वैरिएबल found (मार्क found) false है for (var i = 0; i < orders.length; i++) { // एक्सचेंज द्वारा लौटाई गई निष्पादित ऑर्डर जानकारी में एक ही ऑर्डर नंबर खोजें if (order.Id == orders[i].Id) { // यदि पाया जाता है, तो find के लिए true का मान निर्दिष्ट करें, जिसका अर्थ है कि यह पाया गया है. पाया = सच; } } if (!found) { // If the current orderId represents an order that is not found in the order of the uncompleted order returned by the exchange. यदि (!found) { // यदि वर्तमान ऑर्डरId एक ऑर्डर का प्रतिनिधित्व करता है जो एक्सचेंज द्वारा लौटाए गए अधूरे ऑर्डर के क्रम में नहीं मिला है। order.Status = ORDER_STATE_CLOSED; // orderBooks (यानी वर्तमान क्रम चर) में orderId के अनुरूप क्रम अद्यतन करता है और अद्यतन करता है // ORDER_STATE_CLOSED (यानी बंद) के लिए स्थिति गुण hisBooks[orderId] = आदेश; // पूरा आदेश ऐतिहासिक आदेश पुस्तक में दर्ज किया जाता है, यानी hisBooks, एकीकृत, और अद्वितीय आदेश संख्या orderId delete ((orderBooks[orderId]); // orderId value नामक आदेश पुस्तिका की विशेषता को हटा दें. (पूरा आदेश इससे हटा दिया जाता है) orderBooksLen; // आदेश पुस्तिका लंबाई में कमी जारी रखें; // निम्नलिखित कोड लूप को छोड़ देता है. } } var diff = _N(order.Type == ORDER_TYPE_BUY? (टिकर.खरीदें-ऑर्डर.मूल्य) : (ऑर्डर.मूल्य-टिकर.बिक्री)); // डिफ वर्तमान ऑर्डर बुक में ऑर्डर की योजनाबद्ध शुरुआती कीमत और वर्तमान वास्तविक समय की शुरुआती कीमत के बीच का अंतर है।

        var pfn = order.Type == ORDER_TYPE_BUY ? exchange.Buy : exchange.Sell;   // Assign the corresponding API function reference to pfn according to the type of the order.
        // That is, if the order type is a buy order, pfn is a reference to the exchange.Buy function, the same as the sell order.

        if (order.Id == 0 && diff <= priceDiff) {                                // If the order order in the order book is not activated (ie Id is equal to 0) and the current price is less than or 
                                                                                 // equal to the order plan price, the priceDiff passed in the parameter.   
            var realId = pfn(order.Price, order.Amount, order.Extra + "(distance: " + diff + (order.Type == ORDER_TYPE_BUY ? (" ask price: " + ticker.Buy) : (" bid price: " + ticker.Sell))+")");
            // Execute order function, parameter passing price, quantity, order extension information + pending order distance + market data (ask price or bid price), return exchange order id

            if (typeof(realId) === 'number') {    // If the returned realId is a numeric type
                order.Id = realId;                // Assign the Id attribute of the current order order to the order book.
            }
        } else if (order.Id > 0 && diff > (priceDiff + 1)) {  // If the order is active and the current distance is greater than the distance passed in by the parameter
            var ok = true;                                    // Declare a variable for tagging       Initially set true 
            do {                                              // Execute "do" first and then judge while    
                ok = true;                                    // Ok assign true
                exchange.CancelOrder(order.Id, "unnecessary" + (order.Type == ORDER_TYPE_BUY ? "buying" : "selling"), "placed order price:", order.Price, "volume:", order.Amount, ", distance:", 
                                             diff, order.Type == ORDER_TYPE_BUY ? ("ask price: " + ticker.Buy) : ("bid price: " + ticker.Sell));
                // Cancel the pending order that is out of range. After canceling the order, print the current order information and the current distance diff.

                Sleep(200);                                   // Wait 200 milliseconds
                orders = _C(exchange.GetOrders);              // Call the API to get an uncompleted order in the exchange.
                for (var i = 0; i < orders.length; i++) {     // Traverse these unfinished orders.
                    if (orders[i].Id == order.Id) {           // If the cancelled order is found in the list of orders that have not been completed by the exchange
                        ok = false;                           // Assign ok this variable to false, that is, no cancellation is successful.
                    }
                }
            } while (!ok);                                    // If ok is false, then !ok is true and while will continue to repeat the loop, continue to cancel the order,
                                                              // and check if the cancellation is successful.
            order.Id = 0;                                     // Assigning a value of 0 to order.Id means that the current order is inactive.
        }
    }
};

}

function balanceAccount ((orgAccount, initAccount) { // Balance Account Function Parameter Initial account information when the strategy is started { // Balance Account Function Parameter Initial account information when the strategy is started } { { { { { { / i } } { { { / i } } { { / i } } { { / i } { / i } } { / i } { / i } { / i } { / i } { / i } { / i } { / i } { / i } { / i } { / i } { / i } { / i } { / i } { / i } { / i } { / i } { / i } { i } { i } { i } { i } { i } { i } { i } { i } { i } { i } { i } { i } { i } { i } { i } { i } { i } { i } { i } { i } { i } { i } { i } { i } { i } { i } { i } { i } { i } { i } { i } { i } { i } { i } cancelPending(); // Call the custom function cancelPending() to cancel all pending orders. सभी लंबित आदेशों को रद्द करने के लिए कस्टम फ़ंक्शन को कॉल करें। var nowAccount = _C ((exchange.GetAccount); // Declare a variable nowAccount to record the latest information about the account at the moment. अब खाते के बारे में नवीनतम जानकारी रिकॉर्ड करने के लिए एक चर अब खाता घोषित करें। var slidePrice = 0.2; // Set the slip price when placing the order as 0.2 ऑर्डर देने पर स्लिप प्राइस सेट करें var ok = true; // टैग चर शुरू में सच सेट while (true) { // जबकि लूप var diff = _N ((nowAccount.Stocks - initAccount.Stocks); // Calculate the difference between the current account and the initial account diff (वर्तमान खाते और प्रारंभिक खाते के बीच का अंतर गणना करें) if (Math.abs(diff) < exchange.GetMinStock()) { // If the absolute value of the currency difference is less than the minimum transaction volume of the exchange, तो हम exchange की न्यूनतम लेन-देन मात्रा से कम है। // the break jumps out of the loop and does not perform balancing operations. // ब्रेक लूप से बाहर कूदता है और संतुलन संचालन नहीं करता है. ब्रेक; } var depth = _C ((exchange.GetDepth); // Get the exchange depth information घोषित गहराई चर को असाइन करें var books = diff > 0? depth.Bids : depth.Asks; // According to the difference of the currency is greater than 0 or less than 0, extract the buy order array or // sell order array in depth (equal to 0 will not be processed, it is break when it is judged to be less than GetMinStock) 0 के बराबर की ऑर्डर को गहराई में बेचें // the difference between the coins is greater than 0 to sell the balance, so look at the buy order array, और आप देख सकते हैं कि यह कितना है // the difference between the coins is less than 0 is the opposite. // सिक्कों के बीच का अंतर 0 से कम है, इसका विपरीत है. var n = 0; // कथन n initial is 0 var price = 0; // स्टेटमेंट प्राइस initial 0 for (var i = 0; i < books.length; i++) { // क्रॉसिंग the buy or sell order array n += books[i].Amount; // Accumulate Amount (order quantity) for each order based on the index i traversed (पुस्तकों[i].आमूल; // प्रत्येक आदेश के लिए एकत्रित मात्रा (ऑर्डर मात्रा) if (n >= Math.abs(diff)) { // If the cumulative order quantity n is greater than or equal to the currency difference, then: यदि संचयी आदेश मात्रा n मुद्रा अंतर से अधिक या उसके बराबर है, तोः price = books[i].Price; // Get the price of the current indexed order, assign it to price वर्तमान अनुक्रमित आदेश की कीमत प्राप्त करें, इसे मूल्य पर असाइन करें break; // Jump out of the current for traversal cycle पार करने के लिए वर्तमान से बाहर कूदो } } var pfn = diff > 0? exchange.Sell : exchange.Buy; // Pass the sell order API (exchange.Sell) or the next buy order API (exchange.Buy) reference to the declared pfn (एक्सचेंज.बुक) के लिए एक ऑर्डर भेजें // 0 से अधिक या 0 से कम की मुद्रा अंतर पर आधारित var amount = Math.abs(diff); // The amount of the order to be balanced is diff, the difference in the currency, assigned to the declared amount variable. // ऑर्डर की राशि को संतुलित करने के लिए मुद्रा में अंतर है, जिसे घोषित राशि चर को सौंपा गया है। var price = diff > 0? (price - slidePrice) : (price + slidePrice); // The direction of buying and selling according to the difference in the currency, increase or decrease the // मूल्य के आधार पर स्लिप मूल्य (स्लिप मूल्य यह व्यापार करने के लिए आसान बनाने के लिए है), और फिर मूल्य के लिए यह असाइन Log ((start the balance, (diff > 0? sell: buy), amount, of coins); // The number of coins that the output log balances; // The number of coins that the output log balances; // The number of coins that the output log balances; // The number of coins that the output log balances; // The number of coins that the output log balances; // The number of coins that the output log balances; // The number of coins that the output log balances; // The number of coins that the output log balances; // The number of coins that the output log balances; // The number of coins that the output log balances; // The number of coins that the output log balances. if (diff > 0) { // buying and selling की दिशा के अनुसार, determine whether the account currency or the amount of coins is sufficient. amount = Math.min ((nowAccount.Stocks, amount); // सुनिश्चित करें कि ऑर्डर राशि वर्तमान खाते के उपलब्ध सिक्कों से अधिक नहीं होगी। } else { amount = Math.min ((nowAccount.Balance / price, amount); // Make sure that the amount of order placed does not exceed the amount of money available in the current account. // सुनिश्चित करें कि ऑर्डर की राशि चालू खाते में उपलब्ध धन की मात्रा से अधिक नहीं है। } if (amount < exchange.GetMinStock()) { // Check if the final order quantity is less than the minimum order quantity allowed by the exchange यदि अंतिम ऑर्डर मात्रा एक्सचेंज द्वारा अनुमति दी गई न्यूनतम ऑर्डर मात्रा से कम है तो जांचें Log ((Insufficient funds, unable to balance to the initial state); // If the order quantity is too small, the information is printed. अगर ऑर्डर मात्रा बहुत छोटी है, तो जानकारी मुद्रित की जाती है। ok = false; // टैग संतुलन विफल break; // while loop से बाहर कूदें } pfn ((price, amount); // निष्पादित आदेश एपीआई (pfn reference) Sleep ((1000); // 1 सेकंड के लिए रोकें cancelPending(); // सभी लंबित आदेश रद्द करें. nowAccount = _C ((exchange.GetAccount); // प्राप्त करें वर्तमान खाता जानकारी } if (ok) { // execute the code inside curly braces when ok is true (balance is successful) अगर (ओके) { // क्रियान्वित करें कोड अंदर curly ब्रैकेट जब ओके सही है (संतुलन सफल है) LogProfit ((_N ((nowAccount.Balance - orgAccount.Balance)); // Use the Balance property of the incoming parameter orgAccount (account information before balancing) लॉगप्रॉफ़िट (_एन ((nowAccount.Balance - orgAccount.Balance)); // इनकमिंग पैरामीटर orgAccount की बैलेंस प्रॉपर्टी का उपयोग करें // to subtract the Balance property of the current account information, that is, the difference in the amount of money. // वर्तमान खाता जानकारी की शेष संपत्ति को घटाएं, यानी, पैसे की राशि में अंतर। // That is, profit and loss (क्योंकि सिक्कों की संख्या नहीं बदलती है, वहाँ एक मामूली त्रुटि है क्योंकि कुछ छोटे // amounts cannot be balanced) मात्राओं को संतुलित नहीं किया जा सकता है लॉग (<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< } }

var STATE_WAIT_OPEN = 0; // fishTable में प्रत्येक नोड की स्थिति के लिए प्रयोग किया जाता है var STATE_WAIT_COVER = 1; //... var STATE_WAIT_CLOSE = 2; //... var ProfitCount = 0; var BuyFirst = true; // प्रारंभिक इंटरफ़ेस पैरामीटर var IsSupportGetOrder = true; // विनिमय का निर्धारण करें मुख्य फ़ंक्शन की शुरुआत निर्धारित करने के लिए उपयोग किया जाने वाला एक वैश्विक चर, GetOrder API फ़ंक्शन का समर्थन करें var LastBusy = 0; // अंतिम संसाधित समय वस्तु रिकॉर्ड करें

फ़ंक्शन setBusy() { // सेट व्यस्त समय LastBusy = new Date(); // वर्तमान समय ऑब्जेक्ट के लिए LastBusy असाइन करें }

function isTimeout() { // निर्धारित करें कि यह समय से बाहर है या नहीं यदि (MaxIdle <= 0) { // अधिकतम निष्क्रिय समय (ग्रिड के स्वचालित रूप से स्थानांतरित होने पर आधारित), // यदि अधिकतम निष्क्रिय समय MaxIdle से कम या 0 के बराबर सेट है return false; // false लौटाता है, टाइमआउट का न्याय नहीं करता है. यानी, हमेशा टाइमआउट के बिना false लौटाता है. } var now = new Date(); // वर्तमान समय वस्तु प्राप्त करें अगर (((now.getTime() - LastBusy.getTime()) / 1000) >= MaxIdle) { // वर्तमान समय ऑब्जेक्ट के getTime फ़ंक्शन का उपयोग समय के स्टैम्प और LastBusy के समय के स्टैम्प को प्राप्त करने के लिए अंतर की गणना करने के लिए, // दो समय वस्तुओं के बीच सेकंड की संख्या की गणना करने के लिए 1000 से विभाजित। // निर्धारित करें कि क्या यह अधिकतम निष्क्रिय समय MaxIdle से बड़ा है LastBusy = अब; // यदि यह से बड़ा है, वर्तमान समय वस्तु के लिए अद्यतन LastBusy अब return true; // true लौटाता है, जो एक टाइमआउट है. } false लौटाता है; // no timeout लौटाता है }

function onexit() { // कार्यक्रम के समाप्त होने पर बंद करने का कार्य। यदि (CancelAllWS) { // बंद होने पर सभी लंबित आदेशों को रद्द करने के लिए, सभी लंबित आदेशों को रद्द करने के लिए call cancelPending() कॉल करें. लॉग ((निकास, सभी लंबित आदेश रद्द करने का प्रयास करें); रद्द करनाPending(); } लॉग ((रणनीति सफलतापूर्वक रोक दी गई); Log ((_C(exchange.GetAccount)); // जब आप प्रोग्राम से बाहर निकलते हैं तो खाता स्थिति जानकारी प्रिंट करें. }

फ़ंक्शन फिशिंग ((org) खाता, मछलीकाउंट) { // कास्टिंग पैरामीटरः खाता जानकारी, कास्टिंग की संख्या setBusy(); // LastBuys को वर्तमान टाइमस्टैम्प पर सेट करें var account = _C(exchange.GetAccount); // चालू खाता जानकारी प्राप्त करने और इसे असाइन करने के लिए एक खाता चर घोषित करें. लॉग ((खाता); // मछली पकड़ने के कार्य के लिए कॉल की शुरुआत में खाता जानकारी आउटपुट करें. var InitAccount = खाता; // एक चर InitAccount घोषित करें और इसे खाते के साथ असाइन करें. यहाँ से पहले दर्ज प्रारंभिक खाता धन है // इस कास्टिंग, फ्लोटिंग लाभ और हानि की गणना के लिए इस्तेमाल किया।
var ticker = _C(exchange.GetTicker); // घोषित ticker चर को सौंपा गया उद्धरण मान प्राप्त करें var amount = _N(AmountOnce); // इंटरफेस पैरामीटर की संख्या के अनुसार, दशमलव स्थानों को संसाधित करने के लिए _N का उपयोग करें (_N डिफ़ॉल्ट रूप से 2 बिट्स में है) और उन्हें amount को असाइन करें. var amountB = [amount]; // amountB नामक एक चर घोषित करें एक सरणी है, amount के साथ एक तत्व आरंभ करें var amountS = [amount]; // amountS नामक एक चर घोषित करें... यदि (typeof(AmountType)!== undefined && AmountType == 1) { // कस्टम राशि के अनुसार, आदेश आकार प्रकार, यदि यह इंटरफ़ेस पैरामीटर अपरिभाषित नहीं है, // और AmountType इंटरफ़ेस पर एक कस्टम राशि के लिए सेट है, अर्थात्, AmountType मूल्य 1 है (ड्रॉप-डाउन बॉक्स के सूचकांक) for (var idx = 0; idx < AllNum; idx++) { // AllNum की कुल संख्या. यदि आप एक कस्टम राशि सेट करते हैं, तो चक्र मात्राB/आकारS क्रम मात्रा सरणी के अनुसार चक्रों की कुल संख्या के अनुसार। amountB[idx] = BAmountOnce; // इंटरफेस पैरामीटर का उपयोग करके खरीद आदेश सरणी के लिए मान असाइन करें amountS[idx] = SAmountOnce; //... बेचने के आदेश के लिए... } } अन्य { // अन्य for (var idx = 1; idx < AllNum; idx++) { // ग्रिड की कुल संख्या के आधार पर चक्र। switch (AmountCoefficient[0]) { // इंटरफ़ेस पैरामीटर अंतर के अनुसार, स्ट्रिंग का पहला वर्ण, AmountCoefficient[0] है +, -, , / केस +: // इंटरफेस पैरामीटर के अनुसार, एक एकल जोड़ और वृद्धि के साथ एक ग्रिड का निर्माण किया जाता है। amountB[idx] = amountB[idx - 1] + parseFloat(AmountCoefficient.substring(1)); तोड़ना; केस -: //... amountB[idx] = amountB[idx - 1] - पार्सFloat(AmountCoefficient.substring(1)); तोड़ना; मामला : amountB[idx] = amountB[idx - 1] * पार्सFloat(AmountCoefficient.substring(1)); तोड़ना; केस /: amountB[idx] = amountB[idx - 1] / parseFloat(AmountCoefficient.substring(1)); तोड़ना; } amountB[idx] = _N(amountB[idx], AmountDot); // खरीद आदेश, खरीद राशि, और डेटा दशमलव स्थानों को संसाधित करें. amountS[idx] = amountB[idx]; // असाइनमेंट } } if (FirstPriceAuto) { // यदि पहला पैरामीटर स्वचालित रूप से सही पर सेट किया जाता है यदि इंटरफ़ेस पैरामीटर सेट किया जाता है, तो यदि घुंघराले कोष्ठक के अंदर कोड निष्पादित किया जाता है. FirstPrice = BuyFirst? _N(ticker.Buy - PriceGrid, Precision) : _N(ticker.Sell + PriceGrid, Precision); // इंटरफेस पैरामीटर FirstPrice BuyFirst वैश्विक चर के अनुसार पहली कीमत सेट करता है (प्रारंभिक कथन सच है, // और मुख्य की शुरुआत में OpType के अनुसार असाइन किया गया है) । // कीमत मूल्य टिकर और मूल्य पैरामीटर PriceGrid मूल्य अंतराल द्वारा निर्धारित किया जाता है.
} // मछली तालिका आरंभ करें
var fishTable = {}; // ग्रिड ऑब्जेक्ट घोषित करें var uuidTable = {}; // पहचान कोड तालिका वस्तु var needStocks = 0; // आवश्यक सिक्के चर var needMoney = 0; // आवश्यक धन चर var actualNeedMoney = 0; // वास्तव में पैसे की जरूरत var actualNeedStocks = 0; // वास्तव में आवश्यक सिक्के var notEnough = false; // अंडरफंडिंग टैग चर, प्रारंभ में false पर सेट var canNum = 0; // उपलब्ध ग्रिड for (var idx = 0; idx < AllNum; idx++) { // ग्रिड AllNum की संख्या के अनुसार संरचना को पार किया जाता है. var price = _N((BuyFirst? FirstPrice - (idx * PriceGrid) : FirstPrice + (idx * PriceGrid)), सटीकता); // निर्माण को पार करते समय, वर्तमान सूचकांक आईडीएक्स मूल्य सेटिंग BuyFirst के अनुसार सेट की जाती है. प्रत्येक सूचकांक मूल्य के बीच की दूरी PriceGrid है. needStocks += amountS[idx]; // बेचे गए सिक्कों की संख्या चक्र के साथ धीरे-धीरे जमा हो जाती है। (बिक्री आदेश मात्रा सरणी द्वारा needStocks एक-एक करके जमा की जाती है) needMoney += मूल्य * राशिB[idx]; // खरीदने के लिए आवश्यक धन की राशि चक्र के साथ धीरे-धीरे जमा हो जाती है. (.... आदेश मात्रा सरणी एक-एक करके खरीदें...) अगर (खरीदेंपहला) { // पहले खरीदें हैंडलिंग यदि (_N(needMoney) <= _N(account.Balance)) { // यदि ग्रिड को खाते पर उपलब्ध धनराशि से कम धनराशि की आवश्यकता है actualNeedMondy = needMoney; // आवश्यक धन की वास्तविक राशि के लिए आवंटित actualNeedStocks = needStocks; // आवश्यक सिक्कों की वास्तविक संख्या को असाइन करना. क्या इसमें कुछ गलत है? canNum++; // उपलब्ध ग्रिड की संचयी संख्या } else { // _N(needMoney) <= _N(account.Balance) यदि यह शर्त पूरी नहीं होती है, तो underfunded टैग चर को true पर सेट करें notEnough = true; } } अन्य { // पहले बेचने से निपटने यदि (_N(needStocks) <= _N(account.Stocks)) { // जांचें कि क्या आवश्यक सिक्कों की संख्या खाते में उपलब्ध सिक्कों की संख्या से कम है actualNeedMondy = needMoney; // असाइनमेंट actualNeedStocks = needStocks; canNum++; // उपलब्ध ग्रिड की संचयी संख्या } अन्य { notEnough = true; // यदि वित्तपोषण की शर्तें पूरी नहीं की जाती हैं तो सच सेट करें } } fishTable[idx] = STATE_WAIT_OPEN; // वर्तमान सूचकांक idx के अनुसार, ग्रिड ऑब्जेक्ट के idx सदस्य (ग्रिड नोड) की स्थिति सेट करें, // प्रारंभ में STATE_WAIT_OPEN (स्थिति खोलने के लिए प्रतीक्षा) uuidTable[idx] = -1; // अंकित ऑब्जेक्ट वर्तमान idx के आधार पर अपने स्वयं के idx मान (fishTable के अनुरूप नोड) को -1 पर आरंभ करता है. } यदि (!EnableAccountCheck && (canNum < AllNum)) { // यदि धन जांच सक्षम नहीं है, और ग्रिड की संख्या (नोड्स की कुल संख्या) जहां नोड छोटा है // से इंटरफ़ेस पैरामीटर सेटिंग खोला जा सकता है. लॉग ((चेतावनी, चालू धन केवल किया जा सकता है, कर सकते हैं, ग्रिड की संख्या, कुल ग्रिड जरूरतों, (खरीदेंपहले? जरूरत हैमनीः जरूरत हैस्टॉक), कृपया पर्याप्त धन रखें); // लॉग आउटपुट एक चेतावनी संदेश। canNum = AllNum; // इंटरफ़ेस पैरामीटर के लिए खोलने योग्य सेटिंग्स की संख्या अद्यतन करें } यदि (BuyFirst) { // पहले खरीदें if (EnableProtectDiff && (FirstPrice - ticker.Sell) > ProtectDiff) { // स्प्रेड सुरक्षा खोलें और बाजार मूल्य घटाकर वर्तमान बोली मूल्य से अधिक दर्ज करें बाजार में प्रवेश मूल्य संरक्षण
throw पहला खरीद मूल्य बाजार बिक्री मूल्य से अधिक है + _N(FirstPrice - ticker.Sell, Precision) + डॉलर; // एक त्रुटि संदेश फेंकें. } अन्यथा यदि (EnableAccountCheck && account.Balance < _N(needMoney)) { // यदि निधियों की जांच सक्षम है और खाते के लिए उपलब्ध धनराशि से कम है // ग्रिड के लिए आवश्यक धन की राशि। अगर (fishCount == 1) { // अगर यह पहली बार ग्रिड कास्ट करने के लिए है फेंक अपर्याप्त धन, जरूरत + _N(आवश्यकतामनी) + डॉलर ; // फेंक एक त्रुटि, अपर्याप्त धन } अन्य { लॉग ((अपर्याप्त धन, आवश्यकता, _N(आवश्यकताMoney), डॉलर, कार्यक्रम केवल बनाने, कर सकते हैंNum, ग्रिड के #ff0000); // यदि यह पहली बार एक ग्रिड कास्ट करने के लिए नहीं है, एक संदेश आउटपुट. } अन्य मामलों में पूंजी निरीक्षण, मूल्य संरक्षण आदि नहीं होता है। लॉग (( धन का अनुमानित उपयोगः , _N ((needMoney), dollar); // उत्पादन धन का उपयोग करने की उम्मीद है। } } else { // पहले बेचें, निम्नलिखित buy पहले के समान है यदि (EnableProtectDiff && (ticker.Buy - FirstPrice) > ProtectDiff) { throw पहली बिक्री मूल्य बाजार खरीद मूल्य से अधिक है + _N(ticker.Buy - FirstPrice, Precision) + डॉलर; } अन्यथा यदि (एनेबल अकाउंटचेक && खाता.स्टॉक < _N(आवश्यक स्टॉक)) { यदि (fishCount == 1) { अपर्याप्त धन, जरूरत + _N(आवश्यकताStocks) + सिक्कों फेंक; } अन्य { लॉग ((अपर्याप्त धन, आवश्यकता, _N(आवश्यकताStocks), सिक्के के, कार्यक्रम केवल बनाने, कर सकते हैंNum, ग्रिड के #ff0000); } } अन्य { धन का अनुमानित उपयोगः , _N(needStocks), coins, लगभग, _N(needMoney), dollar); } }

var trader = new Trader();                                          // Constructs a Trader object, assigning it to the trader variable declared here.
var OpenFunc = BuyFirst ? exchange.Buy : exchange.Sell;             // According to whether to buy and sell first, set the open function OpenFunc to refer to exchange.Buy or exchange.Sell
var CoverFunc = BuyFirst ? exchange.Sell : exchange.Buy;            // same as above
if (EnableDynamic) {                                                // Set OpenFunc/CoverFunc again according to whether the interface parameter EnableDynamic is enabled.
    OpenFunc = BuyFirst ? trader.Buy : trader.Sell;                 // The member function Buy that references the trader object is used for dynamic pending orders (mainly because 
                                                                    // some exchanges limit the number of pending orders, so virtual dynamic pending orders are required)
    CoverFunc = BuyFirst ? trader.Sell : trader.Buy;                // same as above
}
var ts = new Date();                                                // Create a time object at this time (assigned to ts) to record the time at the moment.
var preMsg = "";                                                    // Declare a variable to record the last message, the initial set to empty string
var profitMax = 0;                                                  // Maximum return 
while (true) {                                                      // The main logic after the grid is casted
    var now = new Date();                                           // Record the time when the current cycle started
    var table = null;                                               // Declare a variable
    if (now.getTime() - ts.getTime() > 5000) {                      // Calculate whether the difference between the current time now and the recorded time ts is greater than 5000 milliseconds
        if (typeof(GetCommand) == 'function' && GetCommand() == "Receiving grid") {         // Check if the strategy interaction control command "receives the grid" is received, 
                                                                                            // stops and balances to the initial state.
            Log("Start executing commands to perform grid operations");                                          // Output information 
            balanceAccount(orgAccount, InitAccount);                              // Perform a balancing function to balance the number of coins to the initial state
            return false;                                                         // This time the grid function is fishing and return false
        }
        ts = now;                                                                 // Update ts with current time now for next comparison time
        var nowAccount = _C(exchange.GetAccount);                                 // Declare the nowAccount variable and initially been set as the current account information. 
        var ticker = _C(exchange.GetTicker);                                      // Declare the ticker variable and initially been set as the current market information.
        if (EnableDynamic) {                                                      // If you enable dynamic pending orders
            trader.Poll(ticker, DynamicMax);                                      // Call the Poll function of the trader object to detect and process all orders based on the 
                                                                                  // current ticker market and the interface parameter DynamicMax.
        }
        var amount_diff = (nowAccount.Stocks + nowAccount.FrozenStocks) - (InitAccount.Stocks + InitAccount.FrozenStocks);  // Calculate the current coin difference
        var money_diff = (nowAccount.Balance + nowAccount.FrozenBalance) - (InitAccount.Balance + InitAccount.FrozenBalance); // Calculate the current money difference
        var floatProfit = _N(money_diff + (amount_diff * ticker.Last));           // Calculate the current floating profit and loss of this time of casting grid
        var floatProfitAll = _N((nowAccount.Balance + nowAccount.FrozenBalance - orgAccount.Balance - orgAccount.FrozenBalance) + ((nowAccount.Stocks + nowAccount.FrozenStocks 
                                 - orgAccount.Stocks - orgAccount.FrozenStocks) * ticker.Last));
        // Calculate the overall floating profit and loss

        var isHold = Math.abs(amount_diff) >= exchange.GetMinStock();             // If the absolute value of the coin difference at this moment is greater than the minimum trading 
                                                                                  // volume of the exchange, it means that the position has been held.
        if (isHold) {                                                             // If you have already held a position, execute the setBusy() function, which will update the LastBusy time.
            setBusy();                                                            // That is, after opening the position, the opening of the opening mechanism is started.
        }

        profitMax = Math.max(floatProfit, profitMax);                             // Refresh the maximum floating profit and loss
        if (EnableAccountCheck && EnableStopLoss) {                               // If you initiate account detection and start a stop loss
            if ((profitMax - floatProfit) >= StopLoss) {                          // If the maximum floating profit or loss minus the current floating profit or loss is greater than or equal to 
                                                                                  // the maximum floating loss value, execute the code inside the curly braces
                Log("Current floating profit a

अधिक जानकारी