گرڈ ٹریڈنگ کی حکمت عملی
(www.fmz.com)
گرڈ ٹریڈنگ کا بنیادی خیال بہت سیدھا ہے۔ ایک تجارت کرنے کے بجائے ، ہم ایک گرڈ پیٹرن بنانے والی متعدد تجارت کرتے ہیں۔ عام طور پر یہ موجودہ قیمت کی سطح کے ارد گرد
گرڈ ٹریڈنگ کیا ہے اور یہ کیسے کام کرتی ہے؟ گرڈ ٹریڈنگ مارکیٹ کی اتار چڑھاؤ پر کھیل ہے۔ دو وجوہات ہیں کہ کیوں یہ تاجروں کے ذریعہ پسند کیا جاتا ہے۔ پہلا یہ ہے کہ اس سے آپ کو مارکیٹ کی سمت کی حتمی پیش گوئی کرنے کی ضرورت نہیں ہے۔
دوسرا یہ کہ یہ غیر مستحکم منڈیوں میں اچھی طرح کام کرتا ہے، جہاں کوئی واضح رجحان نہیں ہے
گرڈ ٹریڈنگ ایک قسم کا تکنیکی تجزیہ ٹریڈنگ ہے جو مخصوص گرڈ پیٹرن کے اندر نقل و حرکت پر مبنی ہے۔ گرڈ ٹریڈنگ غیر ملکی کرنسی کی تجارت میں مقبول ہے۔ مجموعی طور پر اس تکنیک کا مقصد مارکیٹوں میں عام قیمت کی اتار چڑھاؤ پر سرمایہ لگانا ہے جس میں پہلے سے طے شدہ بیس قیمت سے اوپر اور نیچے کے مخصوص باقاعدہ وقفوں پر خرید و فروخت کے آرڈر دیئے جاتے ہیں۔ ایسے خرید و فروخت کے آرڈر ، عام طور پر 10 یا 15 یونٹ کے وقفوں پر پھیلے ہوئے ، تجارتی گرڈ بناتے ہیں۔
گرڈ سمت اپنی مرضی کے مطابق کر سکتے ہیں
بنیادی تجارتی آپریشن: پہلے خریدیں اور پھر فروخت کریں۔
گرڈ پہلی قیمت سے نیچے کی قیمت پر خریداری کا آرڈر بھیجنا شروع کردے گا ، جو پہلی قیمت (دوسری تازہ ترین خریداری کی قیمت ، تیسری تازہ ترین خریداری کی قیمت... وغیرہ) کے بعد کی قیمت ہے۔ ہر خریداری کا آرڈر
کسی بھی خریداری کے حکم مکمل کیا جاتا ہے کے بعد، پروگرام خرید قیمت کی بنیاد پر ہو جائے گا، فروخت کی قیمت پر
پہلے مختصر فروخت اور پھر احاطہ کرنے کے لئے خریدنا: آپریشن بالکل مخالف ہے
اس حکمت عملی کا سب سے بڑا خطرہ اس وقت ہوتا ہے جب مارکیٹ کا رجحان یکطرفہ ہوتا ہے ، اور قیمتوں میں اتار چڑھاؤ گرڈ سے زیادہ ہوتا ہے۔
مندرجہ ذیل کوڈ نے خود کار طریقے سے سٹاپ نقصان اور تحریک تقریب کے ساتھ گرڈ بنا دیا ہے.
تبصرے:
یہ حکمت عملی ایک ورچوئل زیر التواء آرڈر ڈیزائن کا استعمال کرتی ہے ، جو زیر التواء آرڈرز کی تعداد کو محدود کرنے کے لئے تبادلہ کے لئے بہت زیادہ پروسیسنگ فراہم کرتی ہے ، اور اس مسئلے کو لچکدار طریقے سے حل کرتی ہے۔
گرڈ منطق ڈیزائن میں لچکدار ہے اور ساخت میں ہوشیار ہے.
منافع اور نقصان کا حساب کتاب ، ہر عددی شماریاتی الگورتھم کو حوالہ کے لئے استعمال کیا جاسکتا ہے ، اور ہر حالت کا پتہ لگانے کا ڈیزائن سخت ہے۔ (BUG کے امکان کو کم سے کم کرنے کے لئے)
ماخذ کوڈ سیکھنے کے قابل ہے۔
مزید معلومات کے لیے ملاحظہ کریں:
https://www.fmz.com/strategy/112633
ماخذ کوڈ:
// ماخذ کوڈ: /* انٹرفیس پیرامیٹرز (کوڈ میں عالمی متغیر کے طور پر دکھایا گیا) OpType Grid Direction ڈراپ ڈاؤن باکس (منتخب) پہلے خریدیں پھر فروخت کریں۔ پہلی قیمتآٹو ابتدائی قیمت خودکار بولین (سچ / غلط) سچ پہلی قیمت@!پہلی قیمتآٹو ابتدائی قیمت عددی (نمبر) 100 AllNum مجموعی تعداد عددی (نمبر) 10 قیمت گرڈ قیمت کے وقفے عددی (نمبر) 1 PriceDiff پھیلاؤ عددی (نمبر) 2 رقمٹائپ آرڈر سائز ڈراپ ڈاؤن باکس (منتخب) ایک ہی رقم خریدیں اور فروخت کریں ♪ اپنی مرضی کے مطابق رقم رقمOnce@AmountType==0 ایک ہی لین دین کی مقدار عددی (نمبر) 0.1 BAmountOnce@AmountType==1 خرید آرڈر سائز عددی (نمبر) 0.1 SAmountOnce@AmountType==1 سیلز آرڈر سائز عددی (نمبر) 0.1 مقدارCoefficient@AmountType==0 مقدار کا فرق سٹرنگ *1 رقم ڈاٹ اعشاریہ نمبر (نمبر) 3 EnableProtectDiff پھیلاؤ تحفظ کو چالو کریں بولین (سچ / غلط) غلط ProtectDiff@EnableProtectDiff انٹری اسپریڈ قیمت تحفظ عددی (نمبر) 20 CancelAllWS stop تمام زیر التوا احکامات منسوخ کرتا ہے Boolean (true/false) true CheckInterval پولنگ انٹراول نمبر عددی (نمبر) 2000 وقفہ ناکامی دوبارہ کوشش کے وقفے عددی (نمبر) 1300 RestoreProfit آخری منافع کو بحال کرتا ہے Boolean (سچ / غلط) غلط LastProfit@RestoreProfit آخری منافع عددی (نمبر) 0 ProfitAsOrg@RestoreProfit آخری منافع اوسط قیمت کے طور پر شمار کیا گیا بولین (سچ / غلط) غلط EnableAccountCheck بیلنس کی تصدیق کو فعال کریں بولین (سچ / غلط) سچ EnableStopLoss@EnableAccountچیک کھولیں سٹاپ نقصان بولین (سچ / غلط) غلط اسٹاپ لیس @ EnableStopLoss زیادہ سے زیادہ فلوٹنگ نقصان عددی (نمبر) 100 StopLossMode@EnableStopLoss پوسٹ اسٹاپ نقصان آپریشن ڈراپ ڈاؤن باکس (منتخب) ری سائیکل اور باہر نکلیں۔ ری سائیکل اور دوبارہ کاسٹ EnableStopWin@EnableAccountCheck Turn on Take Profit بولین (سچ / غلط) غلط اسٹاپ ون@اینیبل اسٹاپ ون زیادہ سے زیادہ فلوٹنگ منافع نمبر کی قسم (نمبر) 120 StopWinMode@EnableStopWin منافع حاصل کرنے کے بعد آپریشن ڈراپ ڈاؤن باکس (منتخب) ری سائیکل اور باہر نکلیں۔ AutoMove@EnableAccountCheck آٹو منتقل کریں بولین (سچ / غلط) غلط MaxDistance@AutoMove زیادہ سے زیادہ فاصلہ عددی (نمبر) 20 MaxIdle@AutoMove زیادہ سے زیادہ بیکار (سیکنڈ) عددی (نمبر) 7200 EnableDynamic متحرک زیر التوا احکامات پر بدلتا ہے بولین (سچ / غلط) غلط DynamicMax@EnableDynamic آرڈر ختم ہونے کا فاصلہ نمبر (نمبر) 30 ری سیٹ ڈیٹا شروع میں تمام اعداد و شمار کو صاف کرتا ہے بولین (سچ / غلط) سچ درست قیمت اعشاریہ لمبائی عددی (نمبر) 5 */
function hasOrder ((آرڈر، orderId) { // چیک کریں کہ آیا پیرامیٹر آرڈرز میں آرڈر ID کے ساتھ آرڈر موجود ہے کے لئے (var i = 0؛ i < احکامات.length؛ i++) { // ایک ہی شناخت ہیں تو چیک کرنے کے لئے احکامات کو عبور کریں، اگر ایسا ہے تو پھر واپس سچ اگر (آرڈر[i].Id == آرڈرId) { true لوٹاتا ہے۔ } } واپس غلط؛ // تمام گزر گیا، کوئی ٹرگر نہیں اگر مطلب ہے کہ آرڈر ID کے ساتھ آرڈر نہیں ملا ہے، غلط واپس }
فنکشن منسوخPending() { // تمام زیر التوا آرڈر افعال منسوخ کریں var ret = false؛ // سیٹ واپسی کامیابی ٹیگ متغیر جبکہ (سچ) { // جبکہ لوپ if (ret) { // اگر ret سچ ہے تو ایک مخصوص وقت کے لئے سوتے ہیں نیند (انٹراول) } var احکامات = _C(exchange.GetOrders) ؛ // تبادلہ عملدرآمد نہیں کیا ہے کہ حکم کی معلومات حاصل کرنے کے لئے API کو کال کریں. 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 =
فنکشن ٹریڈر ((() { // ٹریڈر فنکشن، بندش کا استعمال کرتے ہوئے.
var vId = 0؛ // آرڈر اضافہ ID
var orderBooks = []; // آرڈر بک
var hisBooks = []; // تاریخی آرڈر بک
var orderBooksLen = 0؛ // آرڈر بک کی لمبائی
this.Buy = function ((قیمت، رقم، اضافی) { // خریدنے کی تقریب، پیرامیٹرز: قیمت، مقدار، توسیع کی معلومات
if (typeof(extra) ===
if (orders[i].Id == order.Id) { // جب آپ آرڈر بکس میں ایک ہی آرڈر آئی ڈی کے ساتھ آرڈر تلاش کرتے ہیں تو ، تلاش کرنے کے لئے سچ کی قدر تفویض کریں ، جس کا مطلب ہے تلاش کریں۔
پایا = سچ؛
توڑ؛ // موجودہ لوپ سے باہر کود
}
}
if (!found) { // اگر نہیں ملا تو، ordersBooks[orderId] کو orders پر دبائیں۔
orders.push ((orderBooks[orderId]); // آپ کو اس طرح دبائیں کرنا چاہتے ہیں کیوں؟
}
}
واپسی کے احکامات؛
}
this.GetOrder = function ((orderId) { // آرڈر حاصل کریں
if (typeof(orderId) ===
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 } جب حکمت عملی شروع کی جاتی ہے تو ابتدائی اکاؤنٹ کی معلومات
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 آپ کے آرڈر کو 0.2 کے طور پر ترتیب دیتے وقت سلائڈ کی قیمت مقرر کریں
var ok = true؛ // ٹیگ متغیر initially set 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، اگر کرنسی کے فرق کی مطلق قیمت ایکسچینج کے کم سے کم ٹرانزیکشن حجم سے کم ہے تو ،
// the break jumps out of the loop and does not perform balancing operations. // the break loop سے باہر کودتا ہے اور توازن کے آپریشنز نہیں کرتا ہے۔
break؛
}
var depth = _C ((exchange.GetDepth) ؛ // Get the exchange depth information Assign to the declared depth variable
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. // the difference between the coins is less than 0 is the opposite. // the difference between the coins is less than 0 is the opposite.
var n = 0؛ // Statement n initial is 0
var price = 0؛ // بیان قیمت ابتدائی 0
for (var i = 0; i < books.length; i++) { // Traversing the buy or sell order array
n += books[i].Amount; // Accumulate Amount (order quantity) for each order based on the index i traversed ایکسپورٹ کرنے کے لئے ایکسپورٹ کرنے کے لئے ایکسپورٹ کریں
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. // order to be balanced کی رقم مختلف ہے، کرنسی میں فرق، 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 ((
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 تفویض کریں }
تقریب isTimeout() { // اس بات کا تعین کریں کہ آیا یہ وقت ختم ہو گیا ہے if (MaxIdle <= 0) { // زیادہ سے زیادہ idle وقت (بنیاد پر ہے کہ آیا گرڈ خود کار طریقے سے منتقل کیا جاتا ہے) ، // اگر زیادہ سے زیادہ بیکار وقت MaxIdle سے کم یا 0 کے برابر مقرر کیا جاتا ہے false لوٹاتا ہے۔ // false لوٹاتا ہے ، ٹائم آؤٹ کا فیصلہ نہیں کرتا ہے۔ یعنی ، ہمیشہ ٹائم آؤٹ کے بغیر false لوٹاتا ہے۔ } var now = new Date ((); // موجودہ وقت آبجیکٹ حاصل کریں if (((now.getTime() - LastBusy.getTime()) / 1000) >= MaxIdle) { // فرق کا حساب کرنے کے لئے ٹائم اسٹیمپ اور LastBusy کے ٹائم اسٹیمپ حاصل کرنے کے لئے موجودہ وقت آبجیکٹ کے getTime فنکشن کا استعمال کریں ، // دو وقت اشیاء کے درمیان سیکنڈ کی تعداد کا حساب کرنے کے لئے 1000 کی طرف سے تقسیم. // یہ زیادہ سے زیادہ بیکار وقت MaxIdle سے بڑا ہے تو کا تعین کریں LastBusy = اب؛ // اگر یہ سے بڑا ہے تو، موجودہ وقت آبجیکٹ اب LastBusy اپ ڈیٹ واپس سچ؛ // واپس سچ، جو ایک ٹائم آؤٹ ہے. } واپس غلط؛ // واپس غلط کوئی وقت ختم }
تقریب onexit (() { // پروگرام سے باہر نکلنے پر بند کرنے کی تقریب.
if (CancelAllWS) { // تمام زیر التوا احکامات کو منسوخ کرنے کے لئے جب روکنے، کال cancelPending() تمام زیر التوا احکامات کو منسوخ کرنے کے لئے.
لاگ ((
فنکشن ماہی گیری ((orgاحساب، مچھلی شمار) { // کاسٹنگ پیرامیٹرز: اکاؤنٹ کی معلومات، کاسٹنگ کی تعداد
setBusy(); // LastBuys کو موجودہ ٹائم اسٹیمپ پر سیٹ کریں
var اکاؤنٹ = _C(exchange.GetAccount) ؛ // موجودہ اکاؤنٹ کی معلومات حاصل کرنے اور اس کو تفویض کرنے کے لئے ایک اکاؤنٹ متغیر کا اعلان.
لاگ ((اکاؤنٹ) ؛ // ماہی گیری کی تقریب کو کال کے آغاز میں اکاؤنٹ کی معلومات آؤٹ پٹ.
var InitAccount = اکاؤنٹ؛ // ایک متغیر InitAccount کا اعلان کریں اور اکاؤنٹ کے ساتھ تفویض کریں.
// اس کاسٹنگ، فلوٹنگ منافع اور نقصان کا حساب کرنے کے لئے استعمال کیا.
var ticker = _C(exchange.GetTicker) ؛ // اعلان شدہ ٹکر متغیر کو تفویض کی قیمت حاصل کریں
var amount = _N(AmountOnce) ؛ // انٹرفیس پیرامیٹرز کی تعداد کے مطابق، اعشاریہ مقامات (_N ڈیفالٹ 2 بٹس) پر عملدرآمد کرنے کے لئے _N کا استعمال کریں اور رقم کو تفویض کریں.
var amountB = [مقدار]؛ // ایک متغیر رقم بلایا اعلان amountB ایک صف ہے، رقم کے ساتھ ایک عنصر شروع
var amountS = [مقدار]؛ // amountS نامی متغیر کا اعلان کریں...
if (typeof(AmountType)!==
}
// مچھلی ٹیبل شروع کریں
var fishTable = {}؛ // ایک گرڈ آبجیکٹ کا اعلان کریں
var uuidTable = {}؛ // شناختی کوڈ ٹیبل آبجیکٹ
var needStocks = 0؛ // مطلوبہ سککوں متغیر
var needMoney = 0؛ // مطلوبہ رقم متغیر
var actualNeedMoney = 0؛ // اصل میں پیسے کی ضرورت
var actualNeedStocks = 0؛ // اصل میں درکار سکے
var notEnough = false؛ // underfunded ٹیگ متغیر، ابتدائی طور پر false پر مقرر
var canNum = 0؛ // دستیاب گرڈ
for (var idx = 0; idx < AllNum; idx++) { // اس ڈھانچے کو گرڈ AllNum کی تعداد کے مطابق عبور کیا جاتا ہے۔
var price = _N((BuyFirst ؟ FirstPrice - (idx * PriceGrid) : FirstPrice + (idx * PriceGrid) ، درستگی) ؛
// جب تعمیر کو عبور کرتے ہیں تو ، موجودہ انڈیکس آئی ڈی ایکس قیمت کی ترتیب خریدنے کے مطابق مقرر کی جاتی ہے۔ ہر انڈیکس قیمت کے درمیان فاصلہ پرائس گرڈ ہے۔
needStocks += amountS[idx]؛ // فروخت شدہ سککوں کی تعداد آہستہ آہستہ سائیکل کے ساتھ جمع ہوتی ہے۔ (فروخت کے آرڈر کی مقدار کی صف کے ذریعہ ایک ایک کرکے needStocks تک جمع ہوتی ہے)
needMoney += قیمت * رقمB[idx]؛ // خریدنے کے لئے درکار رقم کی رقم آہستہ آہستہ سائیکل کے ساتھ جمع ہوتی ہے۔ (.... آرڈر کی مقدار کی صف کو ایک ایک کرکے خریدیں...)
if (BuyFirst) { // ہینڈلنگ پہلے خریدیں
if (_N(needMoney) <= _N(account.Balance)) { // اگر گرڈ کو اکاؤنٹ پر دستیاب رقم سے کم رقم کی ضرورت ہوتی ہے
actualNeedMondy = needMoney؛ // مطلوبہ رقم کی اصل رقم کو تفویض کیا گیا
actualNeedStocks = needStocks؛ // مطلوبہ سککوں کی اصل تعداد کو تفویض کرنا۔ کیا اس میں کچھ غلط ہے؟
canNum++؛ // دستیاب گرڈ کی مجموعی تعداد
} else { // _N(needMoney) <= _N(account.Balance) اگر یہ شرط پوری نہیں ہوتی ہے تو ، کم فنڈ والے ٹیگ متغیر کو true پر سیٹ کریں
notEnough = سچ؛
}
} else { // ہینڈلنگ پہلے فروخت
if (_N(needStocks) <= _N(account.Stocks)) { // چیک کریں کہ آیا سکے کی مطلوبہ تعداد اکاؤنٹ میں دستیاب سکے کی تعداد سے کم ہے
actualNeedMondy = needMoney؛ // تفویض
actualNeedStocks = needStocks؛
canNum++؛ // دستیاب گرڈ کی مجموعی تعداد
} دیگر {
notEnough = true؛ // اگر فنڈنگ کی شرائط پوری نہیں ہوئیں تو true مقرر کریں
}
}
fishTable[idx] = STATE_WAIT_OPEN؛ // موجودہ انڈیکس idx کے مطابق، گرڈ آبجیکٹ کے idx رکن (گرڈ نوڈ) کی حالت مقرر کریں،
// ابتدائی طور پر STATE_WAIT_OPEN (پوزیشن کھولنے کے لئے انتظار کر رہے ہیں)
uuidTable[idx] = -1; // نمبر والی شے موجودہ idx کی بنیاد پر اپنی اپنی idx قدر (فش ٹیبل سے متعلق نوڈ) کو -1 پر بھی شروع کرتی ہے۔
}
if (!EnableAccountCheck && (canNum < AllNum)) { // اگر فنڈز کی جانچ پڑتال فعال نہیں ہے، اور گرڈ کی تعداد (نوڈس کی کل تعداد) جہاں نوڈ چھوٹا ہے
// انٹرفیس پیرامیٹر کی ترتیب کھولی جا سکتی ہے.
لاگ ((
پھینک
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