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

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

مصنف:نیکی, تخلیق: 2019-09-05 11:49:31, تازہ کاری: 2023-11-07 20:48:06

img

اس مضمون کا مقصد حکمت عملی کی ترقی میں کچھ تجربے کی وضاحت کرنا ہے ، نیز کچھ نکات ، جو قارئین کو تجارتی حکمت عملی کی ترقی کے اہم نکات کو تیزی سے سمجھنے کی اجازت دیں گے۔

جب آپ کو کسی حکمت عملی کے ڈیزائن میں اسی طرح کی تفصیلات کا سامنا کرنا پڑتا ہے، تو آپ فوری طور پر ایک معقول حل کے ساتھ آ سکتے ہیں.

ہم FMZ Quant پلیٹ فارم کو وضاحت، جانچ اور مشق کے لئے ایک مثال کے طور پر استعمال کرتے ہیں۔

حکمت عملی پروگرامنگ زبان ہم جاوا اسکرپٹ استعمال کریں گے

تجارتی ہدف کے لئے، ہم بلاکچین اثاثہ مارکیٹ (بی ٹی سی، ای ٹی ایچ، وغیرہ) کو اپنا مقصد بناتے ہیں

اعداد و شمار کا حصول اور پروسیسنگ

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

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

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

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

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

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

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

مثال کے طور پر ، کچھ مارکیٹ انٹرفیس غیر انجام شدہ ڈیٹا واپس کرتے ہیں:

var depth = exchange.GetDepth()

// depth.Asks[0].Price < depth.Bids[0].Price "Selling 1" price is lower than "buying 1" price, this situation cannot exist on the market.
// Because the selling price is lower than the buying price, the order must have been executed.
// depth.Bids[n].Amount = 0 Order book buying list "nth" layer, order quantity is 0
// depth.Asks[m].Price = 0 Order book selling list "mth" layer, the order price is 0

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

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

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

مثلاً:

function main () {
     while (true) {
         onTick()
         Sleep(500)
     }
}

function GetTicker () {
     while (true) {
         var ticker = exchange.GetTicker()
         if (ticker.Sell > ticker.Buy) { // Take the example of fault-tolerant processing that detects whether the "Selling 1" price is less than the "Buying 1" price.
                                               // Exclude this error, the current function returns "ticker".
             Return ticker
         }
         Sleep(500)
     }
}

function onTick () {
     var ticker = GetTicker() // Make sure the "ticker" you get doesn't exist the situation that "Selling 1" price is less than the "Buying 1" price.
     // ... specific strategy logic
}

اسی طرح کے نقطہ نظر کو دیگر قابل پیش گوئی غلطی برداشت کرنے والے عمل کے لئے استعمال کیا جا سکتا ہے.

ڈیزائن کا اصول یہ ہے کہ آپ حکمت عملی کی منطق کو چلانے کے لئے غلط منطق کا کبھی استعمال نہیں کر سکتے۔

K لائن کے اعداد و شمار کا استعمال

K لائن ڈیٹا حصول، کال:

var r = exchange.GetRecords()

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

[
    {"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}
]

آپ دیکھ سکتے ہیں کہ ہر curly brace {} وقت، افتتاحی قیمت، سب سے زیادہ قیمت، سب سے کم قیمت، بندش کی قیمت، اور حجم پر مشتمل ہے.

یہ ایک K لائن بار ہے۔ عام K لائن کے اعداد و شمار کا استعمال اشارے جیسے حرکت پذیر اوسط ، MACD وغیرہ کا حساب کرنے کے لئے کیا جاتا ہے۔

K لائن کے اعداد و شمار کو ایک پیرامیٹر (خام مال کے اعداد و شمار) کے طور پر منتقل کیا جاتا ہے، اور پھر اشارے کے پیرامیٹرز کو اشارے کے اعداد و شمار کے فنکشن کا حساب کرنے کے لئے مقرر کیا جاتا ہے، جسے ہم اشارے کے فنکشن کہتے ہیں.

FMZ Quant مقداری تجارتی پلیٹ فارم پر بہت سے اشارے کے افعال ہیں.

مثال کے طور پر، ہم چلتی اوسط اشارے کا حساب لگاتے ہیں۔ منظور شدہ K لائن کے اعداد و شمار کے سائیکل کے مطابق، ہم اسی سائیکل کے چلتے اوسط کا حساب لگاتے ہیں۔

مثال کے طور پر ، گزرنے والی K لائن ڈیٹا (ایک K لائن بار ایک دن کی نمائندگی کرتا ہے) ، روزانہ اوسط لائن کا حساب لگاتا ہے ، ایک ہی چیز ، اگر گزرنے والی اوسط اشارے فنکشن کے K لائن ڈیٹا 1 گھنٹے کا سائیکل ہے تو ، حساب کتاب کا اشارے 1 گھنٹے کا اوسط اوسط ہے۔

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

var r = exchange.GetRecords(PERIOD_D1) // Pass parameters to the "GetRecords" function "PERIOD_D1" specifies the day K line to be acquired.
                                       // Specific function using method can be seen at: https://www.fmz.com/api#GetRecords

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

var ma = TA.MA(r, 5) // "TA.MA()" is the indicator function used to calculate the moving average indicator. The first parameter sets the daily K-line data r just obtained.
                             // The second parameter is set to 5. The calculated 5-day moving average is the same as the other indicators.

ہم نے ایک ممکنہ مسئلہ کو نظر انداز کر دیا ہے۔ اگر K لائن کے اعداد و شمار میں K لائن بار کی تعداد 5 سے کم ہے تو ، ہم 5 دن کی قابل حرکت اوسط کا حساب کتاب کرنے کے لئے کیا کر سکتے ہیں؟

جواب یہ ہے کہ آپ کچھ نہیں کر سکتے ہیں.

کیونکہ حرکت پذیر اوسط اشارے ایک مخصوص تعداد میں K لائن بار کی بندش کی قیمتوں کا اوسط ہے.

img

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

لہذا 5 دن کے چلتے ہوئے اوسط کا حساب لگانے سے پہلے، آپ کو پہلے اس کی جانچ پڑتال کرنی ہوگی۔ مکمل کوڈ مندرجہ ذیل ہے:

function CalcMA () {
     var r = _C(exchange.GetRecords, PERIOD_D1) // _C() is a fault-tolerant function, the purpose is to avoid r being null, you can get more information at: https://www.fmz.com/api#_C
     if (r.length > 5) {
         Return TA.MA(r, 5) // Calculate the moving average data with the moving average indicator function "TA.MA", return it as a function return value.
     }

     Return false
}

function main () {
     var ma = CalcMA()
     Log(ma)
}

img

بیک ٹسٹ ڈسپلے:

[null,null,null,null,4228.7,4402.9400000000005, ... ]

آپ کو حساب لگایا گیا 5 دن کا اوسط اشارے نظر آتا ہے۔ پہلے چار صفر ہیں، کیونکہ K لائن بار کی تعداد 5 سے کم ہے، اور اوسط کا حساب نہیں لگایا جا سکتا۔ جب آپ 5 ویں K لائن بار تک پہنچ جاتے ہیں، تو آپ اس کا حساب لگاسکتے ہیں۔

K-line اپ ڈیٹس کا جائزہ لینے کے لئے تجاویز

جب ہم حکمت عملی لکھنے، اکثر اس طرح کے ایک منظر نامے، جیسے حکمت عملی کی ضرورت ہے جب ہر K لائن سائیکل مکمل ہو جاتا ہے کچھ کارروائیوں کی پروسیسنگ، یا کچھ نوشتہ جات پرنٹ.

ہم اس طرح کے افعال کو کیسے لاگو کرتے ہیں؟ beginners کے لئے جو کوئی پروگرامنگ کا تجربہ نہیں ہے، یہ ایک پریشان کن مسئلہ ہو سکتا ہے. یہاں ہم آپ کو حل دیتے ہیں.

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

تو ہمیں ایک متغیر کی ضرورت ہے کہ K لائن ڈیٹا کے آخری K لائن بار کا وقت ریکارڈ کیا جائے۔

var r = exchange.GetRecords()
var lastTime = r[r.length - 1].Time // "lastTime" used to record the last K-line bar time.

عملی طور پر، یہ عام طور پر معاملہ ہے:

function main () {
     var lastTime = 0
     while (true) {
         var r = _C(exchange.GetRecords)
         if (r[r.length - 1].Time != lastTime) {
             Log ("New K-line bar generated")
             lastTime = r[r.length - 1].Time // Be sure to update "lastTime", this is crucial.

             // ... other processing logic
             // ...
         }

         Sleep(500)
     }
}

img

آپ کو دیکھ سکتے ہیں کہ backtest میں، K لائن سائیکل روزانہ پر مقرر کیا جاتا ہے (پیرامیٹر جب مخصوص نہیں ہےexchange.GetRecordsفنکشن کو بلایا جاتا ہے ، اور بیک ٹیسٹ کے مطابق سیٹ کردہ K لائن سائیکل ڈیفالٹ پیرامیٹر ہے۔ جب بھی نیا K لائن بار ظاہر ہوتا ہے ، یہ ایک لاگ پرنٹ کرتا ہے۔

عددی قدر کے حسابات

  • تبادلے کے انٹرفیس تک رسائی حاصل کرنے میں خرچ وقت کا حساب لگائیں

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

function main () {
     while (true) {
         var beginTime = new Date().getTime()
         var ticker = exchange.GetTicker()
         var endTime = new Date().getTime()

         LogStatus(_D(), "GetTicker() function time-consuming:", endTime - beginTime, "millisecond")
         Sleep(1000)
     }
}

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

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

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

ہم اسے اس طرح کنٹرول کرتے ہیں:

مثال کے طور پر، ہم 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 function.

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

کے_N()تقریب ایک مخصوص قدر کے لئے اعشاریہ نقطہ ٹرنکنگ (درستگی کنٹرول) انجام دینے کے لئے ہے.

مثلاً:

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

پائی کی قدر اعشاریہ کے مقام کے ساتھ کاٹ دی جاتی ہے، اور 2 اعشاریہ کے مقامات کو محفوظ کیا جاتا ہے، جو ہے: 3.14

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

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

  • ٹائمنگ، وقت کی ایک مخصوص مدت کے لئے کچھ کارروائیوں کو انجام

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

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

var lastActTime = 0
var waitTime = 1000 * 60 * 60 * 12 // number of milliseconds a day
function main () {
     while (true) {
         var nowTime = new Date().getTime()
         if (nowTime - lastActTime > waitTime) {
             Log ("Execution Fixed")
             // ... specific fixed investment operation, buying operation.


             lastActTime = nowTime
         }

         Sleep(500)
     }
}

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

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

FMZ کوانٹ کا استعمال کرتے ہوئے_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("restore hold:", hold)
     }

     var count = 1
     while (true) {
         // ... strategy logic
         // ... In the strategy operation, it is possible that when opening a position, then assign the position price of the open position to "hold.price", and the amount of open positions is assigned to "hold.amount" to record the position information.

         hold.price = count++ // simulate some values
         hold.amount = count/10 // Simulate some values

         Sleep(500)
     }
}

function onexit () { // Click the stop button on the robot to trigger the execution of this function. After the execution, the robot stops.
     _G("hold", hold)
     Log("save hold:", JSON.stringify(hold))
}

img

یہ دیکھا جا سکتا ہے کہ ڈیٹا میںholdاعتراض روبوٹ کو روک دیا جاتا ہے ہر بار محفوظ کیا جاتا ہے. اور جب ہر بار ڈیٹا دوبارہ شروع کیا جاتا ہے, ڈیٹا پڑھا جاتا ہے اور قدر کیholdسٹاپ سے پہلے کی حالت میں بحال کیا جاتا ہے.

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

مزید برآں، آپ کو بھی بحال کرنے کے لئے کچھ دیگر شرائط مقرر کر سکتے ہیں.

یہ تجارتی حکمت عملی تیار کرنے کے لئے کچھ تجاویز ہیں، اور مجھے امید ہے کہ یہ beginners کی مدد کر سکتے ہیں!

ہاتھ پر پریکٹس ٹریننگ خود کو بہتر بنانے کا تیز ترین طریقہ ہے۔ میں آپ سب کو خوش قسمتی کی خواہش کرتا ہوں۔


متعلقہ

مزید