وسائل لوڈ ہو رہے ہیں... لوڈنگ...

گرڈ ٹریڈنگ کی حکمت عملی

مصنف:نیکی, تخلیق: 2018-08-23 13:45:27, تازہ کاری:

گرڈ ٹریڈنگ کی حکمت عملی (www.fmz.com) گرڈ ٹریڈنگ کا بنیادی خیال بہت سیدھا ہے۔ ایک تجارت کرنے کے بجائے ، ہم ایک گرڈ پیٹرن بنانے والی متعدد تجارت کرتے ہیں۔ عام طور پر یہ موجودہ قیمت کی سطح کے ارد گرد اسٹاپ یا حد آرڈرز کے طور پر داخل ہوتے ہیں لیکن ہمیشہ نہیں ہوتے ہیں۔ میں ذیل میں اس کی تفصیل سے وضاحت کروں گا ، لیکن یہ بنیادی خیال ہے۔

گرڈ ٹریڈنگ کیا ہے اور یہ کیسے کام کرتی ہے؟ گرڈ ٹریڈنگ مارکیٹ کی اتار چڑھاؤ پر کھیل ہے۔ دو وجوہات ہیں کہ کیوں یہ تاجروں کے ذریعہ پسند کیا جاتا ہے۔ پہلا یہ ہے کہ اس سے آپ کو مارکیٹ کی سمت کی حتمی پیش گوئی کرنے کی ضرورت نہیں ہے۔

دوسرا یہ کہ یہ غیر مستحکم منڈیوں میں اچھی طرح کام کرتا ہے، جہاں کوئی واضح رجحان نہیں ہے یہ حالات کرنسی کی منڈیوں میں بہت عام ہیں

گرڈ ٹریڈنگ ایک قسم کا تکنیکی تجزیہ ٹریڈنگ ہے جو مخصوص گرڈ پیٹرن کے اندر نقل و حرکت پر مبنی ہے۔ گرڈ ٹریڈنگ غیر ملکی کرنسی کی تجارت میں مقبول ہے۔ مجموعی طور پر اس تکنیک کا مقصد مارکیٹوں میں عام قیمت کی اتار چڑھاؤ پر سرمایہ لگانا ہے جس میں پہلے سے طے شدہ بیس قیمت سے اوپر اور نیچے کے مخصوص باقاعدہ وقفوں پر خرید و فروخت کے آرڈر دیئے جاتے ہیں۔ ایسے خرید و فروخت کے آرڈر ، عام طور پر 10 یا 15 یونٹ کے وقفوں پر پھیلے ہوئے ، تجارتی گرڈ بناتے ہیں۔

گرڈ سمت اپنی مرضی کے مطابق کر سکتے ہیں

بنیادی تجارتی آپریشن: پہلے خریدیں اور پھر فروخت کریں۔

گرڈ پہلی قیمت سے نیچے کی قیمت پر خریداری کا آرڈر بھیجنا شروع کردے گا ، جو پہلی قیمت (دوسری تازہ ترین خریداری کی قیمت ، تیسری تازہ ترین خریداری کی قیمت... وغیرہ) کے بعد کی قیمت ہے۔ ہر خریداری کا آرڈر قیمت کے وقفے پیرامیٹر سے الگ ہوتا ہے۔ زیر التواء آرڈرز کی تعداد واحد مقدار ہے ، اور کل مقدار بھرنے تک آرڈر کل بھیجے گی۔

کسی بھی خریداری کے حکم مکمل کیا جاتا ہے کے بعد، پروگرام خرید قیمت کی بنیاد پر ہو جائے گا، فروخت کی قیمت پر قیمت فرق پیرامیٹر کی قیمت شامل کریں، حکم فروخت کیا گیا ہے کے بعد، اور پھر اس گرڈ کی حکمت عملی کی ترقی دوبارہ شروع کریں (چیکنگ، جگہ کے حکم، اس پر عملدرآمد تک انتظار کریں، فروخت)

پہلے مختصر فروخت اور پھر احاطہ کرنے کے لئے خریدنا: آپریشن بالکل مخالف ہے

اس حکمت عملی کا سب سے بڑا خطرہ اس وقت ہوتا ہے جب مارکیٹ کا رجحان یکطرفہ ہوتا ہے ، اور قیمتوں میں اتار چڑھاؤ گرڈ سے زیادہ ہوتا ہے۔

مندرجہ ذیل کوڈ نے خود کار طریقے سے سٹاپ نقصان اور تحریک تقریب کے ساتھ گرڈ بنا دیا ہے.

تبصرے:

یہ حکمت عملی ایک ورچوئل زیر التواء آرڈر ڈیزائن کا استعمال کرتی ہے ، جو زیر التواء آرڈرز کی تعداد کو محدود کرنے کے لئے تبادلہ کے لئے بہت زیادہ پروسیسنگ فراہم کرتی ہے ، اور اس مسئلے کو لچکدار طریقے سے حل کرتی ہے۔

گرڈ منطق ڈیزائن میں لچکدار ہے اور ساخت میں ہوشیار ہے.

منافع اور نقصان کا حساب کتاب ، ہر عددی شماریاتی الگورتھم کو حوالہ کے لئے استعمال کیا جاسکتا ہے ، اور ہر حالت کا پتہ لگانے کا ڈیزائن سخت ہے۔ (BUG کے امکان کو کم سے کم کرنے کے لئے)

ماخذ کوڈ سیکھنے کے قابل ہے۔

مزید معلومات کے لیے ملاحظہ کریں:

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

ماخذ کوڈ:

` // گرڈ سمت اپنی مرضی کے مطابق کر سکتے ہیں // بنیادی تجارتی آپریشن: پہلے خریدیں اور پھر فروخت کریں. // گرڈ پہلی قیمت سے نیچے ہے کہ قیمت پر خرید آرڈر بھیجنے کے لئے شروع ہو جائے گا، جس کی قیمت مندرجہ ذیل ہے // پہلی قیمت (دوسری تازہ ترین خریداری کی قیمت، تیسری تازہ ترین خریداری کی قیمت...اور اسی طرح) کی طرف سے. // قیمت کے وقفے پیرامیٹر. زیر التواء احکامات کی تعداد ایک مقدار ہے، اور تک آرڈر کل بھیجیں گے // کل مقدار بھرا ہوا ہے. // کسی بھی خریداری کے حکم مکمل کیا جاتا ہے کے بعد، پروگرام کی خریداری کی قیمت کی بنیاد پر ہو جائے گا، قیمت کی قیمت شامل کریں // فرق پیرامیٹر فروخت کی قیمت، حکم فروخت کیا گیا ہے کے بعد، اور پھر اس کی ترقی کو دوبارہ شروع // گرڈ کی حکمت عملی (چیکنگ، جگہ کے حکم، جب تک یہ عملدرآمد انتظار، فروخت) // سب سے پہلے مختصر فروخت اور پھر احاطہ کرنے کے لئے خریدنے: آپریشن صرف اس کے برعکس ہے // اس حکمت عملی کا سب سے بڑا خطرہ ہے جب مارکیٹ کے رجحان کو ایک طرفہ منتقل ہے، اور قیمت کے اتار چڑھاؤ گرڈ سے تجاوز کر رہے ہیں. // مندرجہ ذیل کوڈ خود کار طریقے سے سٹاپ نقصان اور تحریک تقریب کے ساتھ گرڈ بنا دیا ہے. // تبصرے: // حکمت عملی ایک مجازی زیر التواء آرڈر ڈیزائن کا استعمال کرتا ہے، جس کی تعداد کو محدود کرنے کے تبادلے کے لئے پروسیسنگ کی ایک بڑی رقم فراہم کرتا ہے // زیر التواء احکامات کی، اور لچکدار مسئلہ کو حل. // گرڈ منطق ڈیزائن میں لچکدار اور ساخت میں ہوشیار ہے. // منافع اور نقصان کا حساب، ہر عددی شماریاتی الگورتھم حوالہ کے لئے استعمال کیا جا سکتا ہے، اور ہر حالت کا پتہ لگانے کے ڈیزائن // سخت ہے. (BUG کے امکان کو کم سے کم کرنے کے لئے) // ماخذ کوڈ سیکھنے کے قابل ہے.

// ماخذ کوڈ: /* انٹرفیس پیرامیٹرز (کوڈ میں عالمی متغیر کے طور پر دکھایا گیا) 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 = ؛ // واپسی کے لئے ایک خالی تار نتیجہ کا اعلان کریں if (typeof(pos) === undefined) { // اگر pos پیرامیٹر پاس نہیں کیا جاتا ہے تو ، pos کو 0 کی قدر تفویض کریں۔ pos = 0؛ } کے لئے (var i = pos؛ i < values.length؛ i++) { // منظور pos کے مطابق عمل اقدار صف if (i > pos) { // پہلی لوپ کے علاوہ، نتیجہ سٹرنگ کے بعد ایک خلا شامل کریں نتیجہ += ؛ } if (values[i] === null) { // If values (function argument list array) the current indexs element is null then result adds null string اگر اقدار (فنکشن دلیل فہرست صف) موجودہ انڈیکسs عنصر null ہے تو نتیجہ null سٹرنگ شامل کرتا ہے نتیجہ += null؛ } else if (typeof(values[i]) == undefined) { // اگر یہ غیر متعین ہے، تو undefined شامل کریں نتیجہ += غیر متعین؛ } else { // باقی قسم سوئچ کا پتہ لگانے الگ الگ کرتے ہیں switch (values[i].constructor.name) { // values[i] کے کنسٹرکٹر کی نام پراپرٹی چیک کریں، جو قسم کا نام ہے کیس تاریخ : کیس نمبر : کیس سٹرنگ: کیس فنکشن : نتیجہ += اقدار[i].toString(); // اگر یہ ایک تاریخ کی قسم، ایک عددی قسم، ایک تار کی قسم، یا ایک تقریب کی قسم ہے، اس toString تقریب کو فون کریں اور اسے ایک تار میں تبدیل کریں، پھر شامل کریں وقفہ؛ ڈیفالٹ: result += JSON.stringify(values[i]); // دیگر صورتوں میں، JSON.stringify فنکشن کو JSON سٹرنگ میں تبدیل کرنے کے لئے استعمال کریں. نتیجہ میں شامل کریں وقفہ؛ } } } نتیجہ واپس؛ // نتیجہ واپس }

فنکشن ٹریڈر ((() { // ٹریڈر فنکشن، بندش کا استعمال کرتے ہوئے. var vId = 0؛ // آرڈر اضافہ ID var orderBooks = []; // آرڈر بک var hisBooks = []; // تاریخی آرڈر بک var orderBooksLen = 0؛ // آرڈر بک کی لمبائی this.Buy = function ((قیمت، رقم، اضافی) { // خریدنے کی تقریب، پیرامیٹرز: قیمت، مقدار، توسیع کی معلومات if (typeof(extra) === undefined) { // اگر پیرامیٹر اضافی میں منتقل نہیں کیا جاتا ہے، یعنی typeof undefined لوٹاتا ہے اضافی = ؛ // اضافی کرنے کے لئے ایک خالی تار تفویض } دیگر { extra = valuesToString(arguments، 2)؛ // اس کو بلاتے وقت پاس کردہ دلیل کے حربے.خریداری فنکشن کو valuesToString فنکشن میں منتقل کیا جاتا ہے. } vId++؛ // var orderId = V + vId؛ // orderBooks[orderId] = { // آرڈر بک صف میں صف orderId شامل کریں اور اسے تعمیر شدہ آبجیکٹ کے ساتھ شروع کریں۔ قسم: ORDER_TYPE_BUY، // تعمیر شدہ آبجیکٹ کی قسم پراپرٹی: قسم خریدیں حالت: ORDER_STATE_PENDING، // انتظار میں حالت ID: 0 // آرڈر ID 0 قیمت: قیمت، // قیمت پیرامیٹر قیمت رقم: رقم، // آرڈر کی مقدار پیرامیٹر رقم اضافی: اضافی // توسیع کی معلومات valuesToString کی طرف سے عملدرآمد ایک تار }؛ orderBooksLen++؛ // آرڈر بک کی لمبائی میں 1 کا اضافہ کیا جاتا ہے واپس آرڈر ID؛ // اس بار تعمیر حکم کی آرڈر ID لوٹاتا ہے (غیر تبادلے کے حکم ID، الجھن نہیں.) }؛ this.Sell = function ((قیمت، رقم، اضافی) { // بنیادی طور پر اس کی طرح.Buy، ایک فروخت کے حکم کی تعمیر. if (typeof(extra) === undefined) { اضافی = ؛ } دیگر { اضافی = اقدارToString(ادالوگ، 2) ؛ } vId++؛ var orderId = V + vId؛ orderBooks[orderId] = { قسم: ORDER_TYPE_SELL، حالت: ORDER_STATE_PENDING، ID: 0، قیمت: رقم: رقم اضافی: اضافی }؛ orderBooksLen++؛ واپسی کا حکم }؛ this.GetOrders = function() { // نامکمل آرڈر کی معلومات حاصل کریں var احکامات = _C ((exchange.GetOrders) ؛ // کال API GetOrders نامکمل احکامات کی معلومات حاصل کرنے کے لئے احکامات کو تفویض for (orderId in orderBooks) { // ٹریڈر آبجیکٹ میں orderBooks کو عبور کرنا var order = orderBooks[orderId]؛ // orderId کی بنیاد پر آرڈر نکالیں if (order.Status!== ORDER_STATE_PENDING) { // اگر آرڈر کی حالت معطل حالت کے برابر نہیں ہے تو ، اس لوپ کو چھوڑ دیں جاری رکھیں؛ } var found = false؛ // found variable (اگر پایا جاتا ہے تو نشان لگا دیا گیا) کو true پر شروع کریں کے لئے (var i = 0؛ i < احکامات.length؛ i++) { // API کی طرف سے واپس کئے گئے غیر عملدرآمد کے احکامات کے لئے کراسنگ ڈیٹا
if (orders[i].Id == order.Id) { // جب آپ آرڈر بکس میں ایک ہی آرڈر آئی ڈی کے ساتھ آرڈر تلاش کرتے ہیں تو ، تلاش کرنے کے لئے سچ کی قدر تفویض کریں ، جس کا مطلب ہے تلاش کریں۔ پایا = سچ؛
توڑ؛ // موجودہ لوپ سے باہر کود } } if (!found) { // اگر نہیں ملا تو، ordersBooks[orderId] کو orders پر دبائیں۔ orders.push ((orderBooks[orderId]); // آپ کو اس طرح دبائیں کرنا چاہتے ہیں کیوں؟ } } واپسی کے احکامات؛ } this.GetOrder = function ((orderId) { // آرڈر حاصل کریں if (typeof(orderId) === number) { // اگر منظور شدہ دلیل orderId ایک عددی قسم ہے واپسی تبادلہ.GetOrder(orderId) ؛ // آرڈر ID اور واپسی کی بنیاد پر آرڈر کی معلومات حاصل کرنے کے لئے API GetOrder کال کریں. } if (typeof(hisBooks[orderId])!== undefined) { // Typeof(hisBooks[orderId]) if not equal to undefined return hisBooks[orderId]؛ // hisBooks میں اعداد و شمار کو آرڈر کے طور پر وصف کے ساتھ واپس کریں } if (typeof(orderBooks[orderId])!== undefined) { // جیسا کہ اوپر، اگر orderBooks میں orderId کی قدر ہے تو، یہ ڈیٹا واپس کیا جاتا ہے۔ واپسی کا حکم کتابیں[orderId]؛ } null لوٹائیں؛ // null لوٹائیں اگر مندرجہ بالا شرائط پوری نہیں ہوئیں }؛ this.Len = function() { // واپسی تاجر کی آرڈرBookLen متغیر، جس کی واپسی کے حکم کتاب کی لمبائی. واپس آرڈرBooksLen؛ }؛ this.RealLen = function() { // واپس آرڈر کی کتاب میں آرڈر کی مقدار کو چالو کریں. var n = 0؛ // ابتدائی گنتی 0 ہے کے لئے (orderId in orderBooks) { // آرڈر بک کے ذریعے سفر if (orderBooks[orderId].Id > 0) { // اگر ٹرانسفر میں موجودہ آرڈر کا Id 0 سے بڑا ہے ، یعنی ابتدائی وقت کے علاوہ 0 ، // حکم دیا گیا ہے کہ اشارہ کرتا ہے، حکم چالو کیا گیا ہے. n++؛ // مجموعی طور پر فعال آرڈر } } واپسی n؛ // n کی قدر لوٹاتا ہے، جو حقیقی آرڈر بک کی لمبائی لوٹاتا ہے۔ (کارروائی کے احکامات کی تعداد) }؛ یہ.پول = تقریب ((ٹکر، قیمتDiff) { // var احکامات = _C ((exchange.GetOrders) ؛ // تمام غیر انجام شدہ احکامات حاصل کریں کے لئے (orderId in orderBooks) { // آرڈر بک کے ذریعے سفر var order = orderBooks[orderId]؛ // موجودہ آرڈر کو آرڈر میں تفویض کریں if (order.Id > 0) { // اگر آرڈر فعال ہے، یعنی order.Id 0 نہیں ہے (پہلے ہی رکھا گیا ہے) var found = false؛ // متغیر ملا (مارک ملا) غلط ہے کے لئے (var i = 0؛ i < احکامات.length؛ i++) { // ایکسچینج کی طرف سے واپس عملدرآمد حکم کی معلومات میں ایک ہی حکم نمبر تلاش کریں if (order.Id == orders[i].Id) { // اگر پایا جاتا ہے تو، تلاش کرنے کے لئے سچ کا قدر تفویض کریں، جس کا مطلب یہ ہے کہ یہ پایا گیا ہے. پایا = سچ؛ } } if (!found) { // If the current orderId represents an order that is not found in the order of the uncompleted order returned by the exchange اگر موجودہ آرڈر آئی ڈی ایک آرڈر کی نمائندگی کرتا ہے جو تبادلے کے ذریعہ واپس آنے والے نامکمل آرڈر کے آرڈر میں نہیں ملتا ہے۔ 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? (ticker.Buy - order.Price) : (order.Price - ticker.Sell) ؛ // فرق موجودہ آرڈر بک میں آرڈر کی منصوبہ بندی کی افتتاحی قیمت اور موجودہ حقیقی وقت کی افتتاحی قیمت کے درمیان فرق ہے.

        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 ((start the balance, (diff > 0? sell: buy), amount, of coins); // The number of coins that the output log balances. لاگ ان کریں اور لاگ ان کریں. if (diff > 0) { // According to the direction of the buying and selling, determine whether the account currency or the amount of coins is sufficient. اگر (diff > 0) { // خرید و فروخت کی سمت کے مطابق ، اس بات کا تعین کریں کہ اکاؤنٹ کی کرنسی یا سککوں کی مقدار کافی ہے۔ amount = Math.min ((nowAccount.Stocks, amount); // Make sure that the order amount will not exceed the available coins of the current account. رقم = Math.min ((nowAccount.Stocks, amount) ؛ // Make sure that the order amount will not exceed the available coins of the current account. رقم = 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. رقم = ریاضی.min ((nowAccount.Balance / قیمت، رقم) ؛ // 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); // اگر آرڈر کی مقدار بہت چھوٹی ہے تو ، معلومات پرنٹ کی جاتی ہے۔ ok = false؛ // ٹیگ بیلنس ناکام ہوگیا break؛ // Jump out of the while loop - جب کہ لوپ سے باہر نکلیں } pfn ((price, amount) ؛ // Execute order API (pfn reference) Sleep ((1000); // Pause for 1 second (ایک سیکنڈ کے لئے توقف کریں) cancelPending(); // تمام زیر التوا احکامات کو منسوخ کریں۔ nowAccount = _C ((exchange.GetAccount) ؛ // موجودہ اکاؤنٹ کی معلومات حاصل کریں } if (ok) { // execute the code inside curly braces when ok is true (balance is successful) if (ok) { // curly braces کے اندر کوڈ کو چلائیں جب ok سچ ہے (توازن کامیاب ہے) LogProfit ((_N ((nowAccount.Balance - orgAccount.Balance)); // use the Balance property of the incoming parameter orgAccount (account information before balancing) لاگ ان پیرا میٹر کا استعمال کریں // to subtract the Balance property of the current account information, that is, the difference in the amount of money. // موجودہ اکاؤنٹ کی معلومات کی بیلنس پراپرٹی کو گھٹانا، یعنی پیسے کی مقدار میں فرق۔ // That is, profit and loss (because the number of coins does not change, there is a slight error because some small (کیونکہ سککوں کی تعداد میں تبدیلی نہیں ہوتی، وہاں ایک معمولی غلطی ہے کیونکہ کچھ چھوٹے // amounts cannot be balanced) مقدار کو متوازن نہیں کیا جا سکتا لاگ (بالیسنگ ختم ہو چکی ہے، اب اکاؤنٹ) ؛ // The output log is 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 تفویض کریں }

تقریب 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() تمام زیر التوا احکامات کو منسوخ کرنے کے لئے. لاگ ((خرید، تمام زیر التواء احکامات کو منسوخ کرنے کی کوشش کریں) ؛ منسوخ کرناپینڈنٹ ((() ؛ } لاگ ((اسٹریٹیجی کامیابی سے روکا گیا) ؛ لاگ ان کریں ((_C(exchange.GetAccount)); // پروگرام سے باہر نکلنے پر اکاؤنٹ کی پوزیشن کی معلومات پرنٹ کریں. }

فنکشن ماہی گیری ((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)!== undefined && AmountType == 1) { // اپنی مرضی کے مطابق رقم کے مطابق ، آرڈر سائز کی قسم ، اگر یہ انٹرفیس پیرامیٹر غیر متعین نہیں ہے ، // اور AmountType انٹرفیس پر ایک اپنی مرضی کے مطابق رقم پر مقرر کیا جاتا ہے، یعنی، AmountType قدر 1 ہے (ڈراپ ڈاؤن باکس کے انڈیکس) for (var idx = 0; idx < AllNum; idx++) { // AllNum کی کل تعداد۔ اگر آپ اپنی مرضی کے مطابق رقم مقرر کرتے ہیں تو ، سائکل کی کل تعداد کے مطابق آرڈر کی مقدار کی صف میں مقدارB / مقدارS کو سائیکل کریں۔ amountB[idx] = BAmountOnce؛ // انٹرفیس پیرامیٹرز کا استعمال کرتے ہوئے خرید آرڈر صف کو قدر تفویض کریں amountS[idx] = SAmountOnce؛ //... فروخت کے حکم پر... } { else { // دیگر for (var idx = 1; idx < AllNum; idx++) { // مجموعی طور پر گرڈ کی تعداد کی بنیاد پر سائیکل. switch (AmountCoefficient[0]) { // انٹرفیس پیرامیٹر فرق کے مطابق، سٹرنگ کا پہلا کردار، AmountCoefficient[0] ہے +، -، ، / کیس +: // انٹرفیس پیرامیٹرز کے مطابق، ایک واحد اضافہ اور اضافہ کے ساتھ ایک گرڈ تعمیر کیا جاتا ہے. amountB[idx] = amountB[idx - 1] + پارسFloat(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) ؛ وقفہ؛ } رقمB[idx] = _N(مقدارB[idx]، رقم ڈاٹ) ؛ // خرید آرڈر، خرید رقم، اور اعداد و شمار اعشاریہ مقامات پر عملدرآمد. رقمS[idx] = رقمB[idx]؛ // تفویض } } if (FirstPriceAuto) { // اگر پہلا پیرامیٹر خود بخود درست پر مقرر کیا جاتا ہے اگر انٹرفیس پیرامیٹر مقرر کیا جاتا ہے تو ، اگر curly قوسین کے اندر کوڈ عمل میں لایا جاتا ہے۔ پہلی قیمت = پہلی خریدیں؟ _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؛ // 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)) { // اگر فنڈز کی جانچ پڑتال فعال نہیں ہے، اور گرڈ کی تعداد (نوڈس کی کل تعداد) جہاں نوڈ چھوٹا ہے // انٹرفیس پیرامیٹر کی ترتیب کھولی جا سکتی ہے. لاگ (( انتباہ، صرف موجودہ فنڈز بنایا جا سکتا ہے، کر سکتے ہیں نمبر، گرڈ کی، کل گرڈ کی ضروریات، (خریداری سب سے پہلے؟ ضرورت رقم: ضرورت اسٹاک) ، براہ مہربانی کافی فنڈز رکھیں) ؛ // لاگ آؤٹ پٹ ایک انتباہ پیغام. canNum = AllNum؛ // انٹرفیس پیرامیٹرز کے لئے کھولنے کی ترتیبات کی تعداد کو اپ ڈیٹ کریں } if (BuyFirst) { // پہلے خریدیں if (EnableProtectDiff && (FirstPrice - ticker.Sell) > ProtectDiff) { // اسپریڈ تحفظ کھولیں اور موجودہ بولی کی قیمت سے کم مارکیٹ کی قیمت درج کریں مارکیٹ میں داخل ہونے کی قیمت کا تحفظ
پھینک پہلی خرید قیمت مارکیٹ کی فروخت کی قیمت سے زیادہ ہے + _N(پہلی قیمت - ٹکر.فروخت، صحت سے متعلق) + ڈالر ؛ // ایک غلطی کا پیغام پھینک. } else if (EnableAccountCheck && account.Balance < _N(needMoney)) { // اگر فنڈز چیک فعال ہے اور اکاؤنٹ کے لئے دستیاب رقم کم ہے // گرڈ کے لئے ضروری رقم کی رقم. if (fishCount == 1) { // اگر یہ پہلی بار گرڈ کاسٹ کرنے کے لئے ہے پھینک ناکافی فنڈز، ضرورت + _N(ضرورت پیسے) + ڈالر ؛ // ایک غلطی پھینک، ناکافی فنڈز } دیگر { لاگ (( ناکافی فنڈز، ضرورت، _N(ضرورتMoney) ، ڈالر، پروگرام صرف بنانے، کر سکتے ہیںنمبر، گرڈ #ff0000) ؛ // اگر یہ پہلی بار ایک گرڈ کاسٹ کرنے کے لئے نہیں ہے، ایک پیغام آؤٹ پٹ. } } else { // دیگر معاملات میں، کوئی سرمایہ معائنہ، قیمت تحفظ، وغیرہ نہیں ہے. لاگ (( فنڈز کا تخمینہ استعمال: , _N ((needMoney), dollar); // پیداوار فنڈز کا استعمال کرنے کی توقع ہے. } } else { // سب سے پہلے فروخت، مندرجہ ذیل خریدنے پہلے کے لئے اسی طرح کی ہے if (EnableProtectDiff && (ticker.Buy - FirstPrice) > ProtectDiff) { پھینک پہلی فروخت کی قیمت مارکیٹ کی خریداری کی قیمت سے زیادہ ہے + _N(ticker.Buy - FirstPrice, Precision) + ڈالر؛ } دوسری صورت میں اگر (EnableAccountCheck && account.Stocks < _N(needStocks)) { if (fishCount == 1) { پھینک ناکافی فنڈز، ضرورت + _N(ضرورت اسٹاک) + سکے ؛ } دیگر { لاگ (( ناکافی فنڈز، ضرورت، _N(ضرورتStocks) ، سککوں کی، پروگرام صرف بنانے، کر سکتے ہیںنمبر، گرڈ #ff0000) ؛ } } دیگر { لاگ (( فنڈز کا تخمینہ استعمال: , _N(needStocks), coins, approx, _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

مزید معلومات