اس مضمون کا مقصد حکمت عملی کی ترقی میں کچھ تجربے کی وضاحت کرنا ہے ، نیز کچھ نکات ، جو قارئین کو تجارتی حکمت عملی کی ترقی کے اہم نکات کو تیزی سے سمجھنے کی اجازت دیں گے۔
جب آپ کو کسی حکمت عملی کے ڈیزائن میں اسی طرح کی تفصیلات کا سامنا کرنا پڑتا ہے، تو آپ فوری طور پر ایک معقول حل کے ساتھ آ سکتے ہیں.
ہم 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 لائن ڈیٹا حصول، کال:
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 لائن بار کی بندش کی قیمتوں کا اوسط ہے.
لہذا، 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)
}
بیک ٹسٹ ڈسپلے:
[null,null,null,null,4228.7,4402.9400000000005, ... ]
آپ کو حساب لگایا گیا 5 دن کا اوسط اشارے نظر آتا ہے۔ پہلے چار صفر ہیں، کیونکہ K لائن بار کی تعداد 5 سے کم ہے، اور اوسط کا حساب نہیں لگایا جا سکتا۔ جب آپ 5 ویں K لائن بار تک پہنچ جاتے ہیں، تو آپ اس کا حساب لگاسکتے ہیں۔
جب ہم حکمت عملی لکھنے، اکثر اس طرح کے ایک منظر نامے، جیسے حکمت عملی کی ضرورت ہے جب ہر 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)
}
}
آپ کو دیکھ سکتے ہیں کہ backtest میں، 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() function time-consuming:", endTime - beginTime, "millisecond")
Sleep(1000)
}
}
سادہ الفاظ میں، ٹائم اسٹیمپ کال کرنے کے بعد ریکارڈ کیاGetTicker
فنکشن کال سے پہلے ٹائم اسٹیمپ سے گھٹایا جاتا ہے، اور تجربہ ملی سیکنڈ کی تعداد کا حساب لگایا جاتا ہے، یعنی وقت کی طرف سے لیا جاتا ہےGetTicker
کارکردگی سے عملدرآمد کرنے کے لئے واپس.
مثال کے طور پر، فروخت آرڈر دینے کے عمل میں، فروخت آرڈر کی رقم اکاؤنٹ میں سککوں کی تعداد سے زیادہ نہیں ہونی چاہئے۔ کیونکہ اگر یہ اکاؤنٹ میں دستیاب سککوں کی تعداد سے زیادہ ہے تو، آرڈر غلطیوں کا سبب بنے گا۔
ہم اسے اس طرح کنٹرول کرتے ہیں:
مثال کے طور پر، ہم 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))
}
یہ دیکھا جا سکتا ہے کہ ڈیٹا میںhold
اعتراض روبوٹ کو روک دیا جاتا ہے ہر بار محفوظ کیا جاتا ہے. اور جب ہر بار ڈیٹا دوبارہ شروع کیا جاتا ہے, ڈیٹا پڑھا جاتا ہے اور قدر کیhold
سٹاپ سے پہلے کی حالت میں بحال کیا جاتا ہے.
ظاہر ہے ، مذکورہ بالا ایک سادہ مثال ہے۔ اگر یہ اصل تجارتی حکمت عملی میں استعمال ہوتا ہے تو ، اسے کلیدی اعداد و شمار کے مطابق ڈیزائن کیا جانا چاہئے جو حکمت عملی میں بحال ہونے کی ضرورت ہے (عام طور پر اکاؤنٹ کی معلومات ، پوزیشن ، منافع کی قیمت ، تجارتی سمت وغیرہ) ۔
مزید برآں، آپ کو بھی بحال کرنے کے لئے کچھ دیگر شرائط مقرر کر سکتے ہیں.
یہ تجارتی حکمت عملی تیار کرنے کے لئے کچھ تجاویز ہیں، اور مجھے امید ہے کہ یہ beginners کی مدد کر سکتے ہیں!
ہاتھ پر پریکٹس ٹریننگ خود کو بہتر بنانے کا تیز ترین طریقہ ہے۔ میں آپ سب کو خوش قسمتی کی خواہش کرتا ہوں۔