avatar of 发明者量化-小小梦 发明者量化-小小梦
پر توجہ دیں نجی پیغام
4
پر توجہ دیں
1271
پیروکار

تجارتی حکمت عملی تیار کرنے کے تجربے کے بارے میں بات کرنا

میں تخلیق کیا: 2019-08-06 17:15:13, تازہ کاری: 2023-10-20 20:06:49
comments   4
hits   3416

تجارتی حکمت عملی تیار کرنے کے تجربے کے بارے میں بات کرنا

تجارتی حکمت عملی تیار کرنے کے تجربے کے بارے میں بات کرنا

اس مضمون کا مقصد حکمت عملی کی ترقی میں کچھ تجربات اور تجاویز کا اشتراک کرنا ہے، جو قارئین کو تجارتی حکمت عملی کی ترقی کے تجربے کو تیزی سے سمجھنے کی اجازت دے سکتے ہیں۔ حکمت عملی کے ڈیزائن میں اسی طرح کے تفصیلی مسائل کا سامنا کرتے وقت، معقول حل فوری طور پر تصور کیے جا سکتے ہیں۔ موجد مقداری تجارتی پلیٹ فارم کو وضاحت، جانچ اور مشق کے لیے ایک پلیٹ فارم کے طور پر استعمال کیا جاتا ہے۔ پالیسی پروگرامنگ زبان: جاوا اسکرپٹ ٹریڈنگ مارکیٹ: بلاکچین اثاثہ مارکیٹ (BTC، ETH، وغیرہ)

  • ## ڈیٹا کا حصول اور پروسیسنگ

عام طور پر، حکمت عملی کی منطق پر منحصر ہے، مارکیٹ کے اعداد و شمار حاصل کرنے کے لیے درج ذیل مختلف انٹرفیسز کا استعمال ممکن ہے، کیونکہ حکمت عملی کی تجارتی منطق عام طور پر مارکیٹ کے اعداد و شمار سے چلتی ہے (یقیناً، کچھ حکمت عملی ایسی ہوتی ہے جو مارکیٹ کو نہیں دیکھتے۔ ، جیسے سرمایہ کاری کی مقررہ حکمت عملی)۔

  • GetTicker: ریئل ٹائم ٹک معلومات حاصل کریں۔ یہ عام طور پر موجودہ تازہ ترین قیمت کو فوری طور پر حاصل کرنے، قیمت خریدنے اور قیمت فروخت کرنے کے لیے استعمال ہوتا ہے۔

  • GetDepth: آرڈر بک ڈیپتھ کوٹس حاصل کریں۔ یہ عام طور پر ہر سطح کی قیمت اور آرڈر کے سائز کو حاصل کرنے کے لیے استعمال ہوتا ہے۔ ہیجنگ کی حکمت عملیوں، مارکیٹ بنانے کی حکمت عملیوں وغیرہ کے لیے استعمال کیا جاتا ہے۔

  • GetTrade: مارکیٹ میں لین دین کے تازہ ترین ریکارڈ حاصل کریں۔ یہ عام طور پر ایک مختصر مدت میں مارکیٹ کے رویے کا تجزیہ کرنے اور مارکیٹ کی مائیکرو تبدیلیوں کا تجزیہ کرنے کے لیے استعمال ہوتا ہے۔ عام طور پر اعلی تعدد کی حکمت عملیوں اور الگورتھمک حکمت عملیوں میں استعمال ہوتا ہے۔

  • GetRecords: مارکیٹ K-line ڈیٹا حاصل کریں۔ اکثر رجحان کی پیروی کی حکمت عملیوں میں استعمال ہوتا ہے۔ اشارے کا حساب لگانے کے لیے استعمال کیا جاتا ہے۔

  • غلطی کی رواداری

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

    var depth = exchange.GetDepth()
    
    
    // depth.Asks[0].Price < depth.Bids[0].Price      卖一价格低于了买一价格,这种情况不可能存在于盘面上,
    //                                                因为卖出的价格低于买入的价格,必定已经成交了。
    // depth.Bids[n].Amount = 0                       订单薄买入列表第n档,订单量为0
    // depth.Asks[m].Price = 0                        订单薄卖出列表第m档,订单价格为0
    

    یا exchange.GetDepth() براہ راست ایک null قدر لوٹاتا ہے۔

    ایسے بہت سے عجیب و غریب حالات ہیں۔ لہٰذا، ان ممکنہ مسائل کے لیے متعلقہ پروسیسنگ کی جانی چاہیے، اور اس قسم کے پروسیسنگ حل کو فالٹ ٹولرنٹ پروسیسنگ کہا جاتا ہے۔

    عام طور پر غلطی برداشت کرنے کا طریقہ ڈیٹا کو ضائع کرنا اور اسے دوبارہ حاصل کرنا ہے۔

    مثال کے طور پر:

    function main () {
        while (true) {
            onTick()
            Sleep(500)
        }
    }
    
    
    function GetTicker () {
        while (true) {
            var ticker = exchange.GetTicker()
            if (ticker.Sell > ticker.Buy) {       // 以 检测卖一价格是不是小于买一价这个错误的容错处理为例,
                                                  // 排除这个错误,当前函数返回 ticker 。
                return ticker
            }
            Sleep(500)
        }
    }
    
    
    function onTick () {
        var ticker = GetTicker()                  // 确保获取到的 ticker 不会存在 卖一价格小于买一价格这种数据错误的情况。
        // ...  具体的策略逻辑
    }
    

    دیگر ممکنہ غلطی برداشت کرنے والے عمل کو بھی اسی طرح سنبھالا جا سکتا ہے۔ ڈیزائن کا اصول یہ ہے کہ حکمت عملی کی منطق کو چلانے کے لیے کبھی بھی غلط ڈیٹا کا استعمال نہیں کرنا چاہیے۔

  • کے لائن ڈیٹا کا استعمال

    کے لائن ڈیٹا کا حصول، کال کریں:

    var r = exchange.GetRecords()
    

    حاصل کردہ K-line ڈیٹا ایک صف ہے، جیسا کہ:

    [
        {"Time":1562068800000,"Open":10000.7,"High":10208.9,"Low":9942.4,"Close":10058.8,"Volume":6281.887000000001},
        {"Time":1562072400000,"Open":10058.6,"High":10154.4,"Low":9914.5,"Close":9990.7,"Volume":4322.099},
        ...
        {"Time":1562079600000,"Open":10535.1,"High":10654.6,"Low":10383.6,"Close":10630.7,"Volume":5163.484000000004}
    ]
    

    آپ دیکھ سکتے ہیں کہ ہر ایک گھوبگھرالی بریکٹ{}اس میں وقت، افتتاحی قیمت (کھلی)، سب سے زیادہ قیمت (زیادہ)، سب سے کم قیمت (کم)، اختتامی قیمت (قریب)، اور تجارتی حجم (حجم) شامل ہیں۔ یہ ایک شمع ہے۔ عام طور پر، K-line ڈیٹا کا استعمال اشارے کا حساب لگانے کے لیے کیا جاتا ہے، جیسے MA حرکت پذیری اوسط، MACD، وغیرہ۔ K-line ڈیٹا کو پیرامیٹر (خام مال کا ڈیٹا) کے طور پر داخل کریں، پھر اشارے کے پیرامیٹرز کو سیٹ کریں اور انڈیکیٹر ڈیٹا کے فنکشن کا حساب لگائیں، جسے ہم انڈیکیٹر فنکشن کہتے ہیں۔ موجد مقداری تجارتی پلیٹ فارم پر اشارے کے بہت سے افعال ہیں۔

    مثال کے طور پر، جب ہم K-line ڈیٹا کے مختلف ادوار کی بنیاد پر حرکت پذیر اوسط اشارے کا حساب لگاتے ہیں، تو ہم اسی مدت کی متحرک اوسط کا حساب لگاتے ہیں۔ مثال کے طور پر، اگر یومیہ K-لائن ڈیٹا کو اس میں پاس کیا جاتا ہے (ایک K-لائن بار ایک دن کی نمائندگی کرتا ہے)، حساب شدہ اشارے یومیہ حرکت پذیر اوسط ہے، اسی طرح، اگر K-line ڈیٹا کو حرکت پذیر اوسط اشارے کے فنکشن میں منتقل کیا جاتا ہے۔ 1 گھنٹے کی مدت، پھر حسابی اشارے 1 گھنٹے کی حرکت اوسط ہے۔

    عام طور پر جب ہم انڈیکیٹرز کا حساب لگاتے ہیں، تو ہم اکثر ایک مسئلہ کو نظر انداز کر دیتے ہیں اگر میں 5 دن کے موونگ ایوریج انڈیکیٹر کا حساب لگانا چاہتا ہوں، تو ہم پہلے روزانہ K-line ڈیٹا تیار کرتے ہیں:

    var r = exchange.GetRecords(PERIOD_D1)  // 给GetRecords 函数传入参数 PERIOD_D1就是指定获取日K线,
                                            // 具体函数使用可以参看:https://www.fmz.com/api#GetRecords
    

    روزانہ کے لائن ڈیٹا کے ساتھ، ہم حرکت پذیر اوسط اشارے کا حساب لگا سکتے ہیں اگر ہم 5 دن کی حرکت پذیری اوسط کا حساب لگانا چاہتے ہیں، تو ہمیں اشارے کے فنکشن کے اشارے کے پیرامیٹر کو 5 پر سیٹ کرنا ہوگا۔

    var ma = TA.MA(r, 5)        // TA.MA() 就是指标函数,用来计算均线指标,第一个参数设置刚才获取的日K线数据r,
                                // 第二个参数设置5,计算出来的就是5日均线,其它指标函数同理。
    

    ہم نے ایک ممکنہ مسئلہ کو نظر انداز کر دیا ہے اگر r-day K-line ڈیٹا میں K-line بارز کی تعداد 5 سے کم ہے تو کیا ہم 5 دن کے موونگ ایوریج کا حساب لگا سکتے ہیں؟ جواب یقینا نفی میں ہے۔ کیونکہ موونگ ایوریج انڈیکیٹر K-line بارز کی ایک مخصوص تعداد کی بند ہونے والی قیمتوں کا اوسط معلوم کرنا ہے۔

    تجارتی حکمت عملی تیار کرنے کے تجربے کے بارے میں بات کرنا

    اس لیے، اشارے کے اعداد و شمار کا حساب لگانے کے لیے K-line ڈیٹا اور اشارے کے افعال استعمال کرنے سے پہلے، یہ تعین کرنا ضروری ہے کہ K-line ڈیٹا میں K-line کالموں کی تعداد اشارے کے حساب کتاب کی شرائط کو پورا کرتی ہے یا نہیں (انڈیکیٹر پیرامیٹرز)

    لہذا، 5 دن کی حرکت پذیری اوسط کا حساب لگانے سے پہلے، یہ فیصلہ کرنا ضروری ہے کہ مکمل کوڈ درج ذیل ہے:

    function CalcMA () {
        var r = _C(exchange.GetRecords, PERIOD_D1)     // _C() 是容错函数,目的就是避免 r 为 null , 具体可以查询文档:https://www.fmz.com/api#_C
        if (r.length > 5) {
            return TA.MA(r, 5)                         // 用均线指标函数 TA.MA 计算出均线数据,做为函数返回值,返回。
        }
    
    
        return false 
    }
    
    
    function main () {
        var ma = CalcMA()
        Log(ma)
    }
    

    تجارتی حکمت عملی تیار کرنے کے تجربے کے بارے میں بات کرنا

    بیک ٹیسٹنگ شوز: [null,null,null,null,4228.7,4402.9400000000005, … ]

    یہ دیکھا جا سکتا ہے کہ حساب کیے گئے 5 دن کے موونگ ایوریج انڈیکیٹرز میں سے پہلے چار صفر ہیں، کیونکہ K-line کالموں کی تعداد 5 سے کم ہے اور اوسط کا حساب نہیں لگایا جا سکتا۔ 5th candlestick تک، اس کا حساب لگایا جا سکتا ہے۔

  • K-لائن اپ ڈیٹس کو جانچنے کے لیے نکات

    جب ہم کچھ حکمت عملی لکھتے ہیں تو اکثر ایسا منظر نامہ ہوتا ہے کہ جب ہر K-لائن سائیکل مکمل ہو جاتا ہے تو ہمیں کچھ آپریشنز پر کارروائی کرنے یا کچھ لاگ پرنٹ کرنے کی ضرورت ہوتی ہے۔ ہم اس فعالیت کو کیسے حاصل کرتے ہیں؟ ابتدائی طور پر جن کے پاس پروگرامنگ کا کوئی تجربہ نہیں ہے، وہ یہ سوچ نہیں سکتے کہ اس سے نمٹنے کے لیے کون سا طریقہ کار استعمال کرنا ہے۔

    ہم یہ فیصلہ کر سکتے ہیں کہ K- لائن کالم سائیکل K-line ڈیٹا میں وقت کی خصوصیت کے ساتھ شروع ہو کر مکمل ہو جاتا ہے، جب بھی ہم K-line ڈیٹا حاصل کرتے ہیں، ہم آخری K-line کالم کے ڈیٹا میں وقت کی خصوصیت کا اندازہ لگاتے ہیں۔ اس K-line ڈیٹا کا کہ آیا یہ انتساب قدر بدل گیا ہے، اس کا مطلب ہے کہ ایک نیا K-line کالم تیار ہوا ہے (یہ ثابت کرنا کہ K-line کالم کا پچھلا دور ہے۔ اگر یہ تبدیل نہیں ہوا ہے، تو اس کا مطلب ہے کہ کوئی نئی کینڈل سٹک تیار نہیں ہوئی ہے (موجودہ کینڈل سٹک سائیکل ابھی تک مکمل نہیں ہوا ہے)۔

    لہذا ہمیں کینڈل سٹک ڈیٹا کے آخری کینڈل سٹک کالم کا وقت ریکارڈ کرنے کے لیے ایک متغیر کی ضرورت ہے۔

    var r = exchange.GetRecords()
    var lastTime = r[r.length - 1].Time       // lastTime 用来记录最后一根K线柱的时间。
    

    عملی ایپلی کیشنز میں، ساخت عام طور پر اس طرح ہے:

    function main () {
        var lastTime = 0
        while (true) {
            var r = _C(exchange.GetRecords)
            if (r[r.length - 1].Time != lastTime) {
                Log("新K线柱产生")
                lastTime = r[r.length - 1].Time      // 一定要更新 lastTime ,这个至关重要。
    
    
                // ... 其它处理逻辑
                // ...
            }
    
    
            Sleep(500)
        }
    }
    

    تجارتی حکمت عملی تیار کرنے کے تجربے کے بارے میں بات کرنا

    یہ دیکھا جا سکتا ہے کہ بیک ٹیسٹ میں، K-لائن کا دورانیہ دن پر سیٹ کیا جاتا ہے (exchange.GetRecords فنکشن کو پیرامیٹرز کی وضاحت کیے بغیر کہا جاتا ہے، اور بیک ٹیسٹ کے مطابق K-لائن کا دورانیہ طے شدہ پیرامیٹر ہوتا ہے) نیا K لائن کالم ظاہر ہوتا ہے، یہ ایک لاگ پرنٹ کیا جاتا ہے.

  • عددی حساب

    • ### ایکسچینج انٹرفیس تک رسائی میں لگنے والے وقت کا حساب لگائیں۔

    اگر آپ ایکسچینج کے انٹرفیس تک رسائی کے لیے حکمت عملی کے لیے لگنے والے وقت کو ظاہر یا کنٹرول کرنا چاہتے ہیں، تو آپ درج ذیل کوڈ کا استعمال کر سکتے ہیں:

    function main () {
        while (true) {
            var beginTime = new Date().getTime()
            var ticker = exchange.GetTicker()
            var endTime = new Date().getTime()
    
    
            LogStatus(_D(), "GetTicker() 函数耗时:", endTime - beginTime, "毫秒")
            Sleep(1000)
        } 
    }
    

    سیدھے الفاظ میں، GetTicker فنکشن کو کال کرنے کے بعد ریکارڈ کردہ ٹائم اسٹیمپ کو کال سے پہلے ٹائم اسٹیمپ سے گھٹا دیا جاتا ہے تاکہ گزرے ہوئے ملی سیکنڈز کی تعداد کا حساب لگایا جا سکے، یعنی GetTicker فنکشن کو انجام دینے اور نتیجہ واپس کرنے میں جو وقت لگتا ہے۔

    • ### اقدار پر اوپری اور نچلی حدیں قائم کرنے کے لیے Math.min / Math.max کا استعمال کریں۔

    اگر آپ عددی اوپری حد چاہتے ہیں، تو آپ عام طور پر محدود کرنے کے لیے Math.min استعمال کرتے ہیں۔

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

    عام طور پر اس طرح کنٹرول کیا جاتا ہے: مثال کے طور پر، آپ 0.2 سککوں کے لیے سیل آرڈر دینے کا ارادہ رکھتے ہیں۔

    var planAmount = 0.2
    var account = _C(exchange.GetAccount)
    var amount = Math.min(account.Stocks, planAmount)
    

    یہ یقینی بناتا ہے کہ رقم، آرڈر کی رقم، اکاؤنٹ میں دستیاب سکوں کی تعداد سے زیادہ نہیں ہے۔

    اسی طرح، Math.max کا استعمال کسی قدر کے لیے کم حد کو یقینی بنانے کے لیے کیا جاتا ہے۔ یہ عام طور پر کس قسم کے منظرناموں پر لاگو ہوتا ہے؟ عام طور پر، ایکسچینج میں کچھ تجارتی جوڑوں کے لیے کم از کم آرڈر کی مقدار ہوتی ہے اگر آرڈر کی مقدار اس کم از کم آرڈر کی مقدار سے کم ہے، تو آرڈر کو مسترد کر دیا جائے گا۔ اس طرح آرڈر ناکام ہو جائے گا۔ فرض کریں کہ بی ٹی سی کے لیے کم از کم آرڈر کی مقدار عام طور پر 0.01 ہے۔ بعض اوقات تجارتی حکمت عملی یہ حساب لگا سکتی ہے کہ آرڈر کی مقدار 0.01 سے کم ہے، لہذا ہم کم از کم آرڈر کی مقدار کو یقینی بنانے کے لیے Math.max کا استعمال کر سکتے ہیں۔

    • ### آرڈر کی مقدار اور قیمت کی درستگی کا کنٹرول

    استعمال کیا جا سکتا ہے۔_N() فنکشن یا SetPrecision فنکشن درستگی کو کنٹرول کرنے کے لیے۔

    SetPrecision() فنکشن کو صرف ایک بار سیٹ کرنے کی ضرورت ہے، اور سسٹم خود بخود آرڈر کی مقدار اور قیمت کی قدروں میں اضافی اعشاریہ جگہوں کو چھوٹا کر دے گا۔

    _N() فنکشن کا استعمال کسی قدر کو اعشاریہ کی ایک مخصوص تعداد (صحت سے متعلق کنٹرول) تک کم کرنے کے لیے کیا جاتا ہے۔

    مثال کے طور پر:

    var pi = _N(3.141592653, 2)
    Log(pi)
    

    pi کی قدر کو 2 اعشاریہ 2 مقامات پر چھوٹا کیا جاتا ہے، جو ہے: 3.14

    تفصیلات کے لیے API دستاویزات دیکھیں۔

  • کچھ منطقی ترتیبات

    • ### ٹائمنگ: ایک مخصوص مدت میں کچھ آپریشنز انجام دیں۔

    آپ اس طریقہ کار کو استعمال کرتے ہوئے ٹائم اسٹیمپ کا پتہ لگانے کے طریقہ کار کو استعمال کر سکتے ہیں تاکہ آخری وقت کے طے شدہ کام کے ٹائم اسٹیمپ کو کم کیا جا سکے، اور جب گزرا ہوا وقت ایک مقررہ وقت سے زیادہ ہو جائے تو حقیقی وقت میں اس کا حساب لگائیں۔ ، نئے آپریشن کو انجام دیا گیا ہے۔

    مثال کے طور پر، یہ مقررہ سرمایہ کاری کی حکمت عملیوں میں استعمال کیا جا سکتا ہے۔

    var lastActTime = 0
    var waitTime = 1000 * 60 * 60 * 12   // 一天的毫秒数
    function main () {
        while (true) {
            var nowTime = new Date().getTime()
            if (nowTime - lastActTime > waitTime) {
                Log("执行定投")
                // ... 具体的定投操作,买入操作。
    
    
                lastActTime = nowTime
            }
    
    
            Sleep(500)
        }
    }
    

    یہ ایک سادہ سی مثال ہے۔

    • ### حکمت عملیوں کے لیے خودکار ریکوری میکانزم کو ڈیزائن کرنا

    موجد کے کوانٹائزڈ _G() فنکشن اور ایگزٹ سیو فنکشن کا استعمال کرتے ہوئے، باہر نکلنے اور پیشرفت کو بچانے کے لیے حکمت عملی وضع کرنا اور اسٹیٹس کو خود بخود بحال کرنے کے لیے دوبارہ شروع کرنا بہت آسان ہے۔

    var hold = {
        price : 0, 
        amount : 0,
    }
    
    
    function main () {
        if (_G("hold")) {
            var ret = _G("hold")
            hold.price = ret.price
            hold.amount = ret.amount
            Log("恢复 hold:", hold)
        }
    
    
        var count = 1
        while (true) {
            // ... 策略逻辑
            // ... 策略运行中,可能开仓,交易,把开仓的持仓价格赋值给 hold.price ,开仓的数量赋值给 hold.amount,用以记录持仓信息。
    
    
            hold.price = count++     // 模拟一些数值
            hold.amount = count/10   // 模拟一些数值
    
    
            Sleep(500)
        }
    }
    
    
    function onexit () {    // 点击机器人上的停止按钮,会触发执行这个函数,执行完毕机器人停止。
        _G("hold", hold)
        Log("保存 hold:", JSON.stringify(hold))
    }
    

    تجارتی حکمت عملی تیار کرنے کے تجربے کے بارے میں بات کرنا

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

مندرجہ بالا حکمت عملی تیار کرنے کے لیے کچھ نکات ہیں مجھے امید ہے کہ وہ ابتدائی اور حکمت عملی تیار کرنے والوں کے لیے مددگار ثابت ہوں گے۔ بہتر کرنے کا تیز ترین طریقہ مشق کرنا ہے! میری خواہش ہے کہ آپ سب کا منافع جاری رہے۔