
ٹریڈنگ ویو پر اوپن سورس حکمت عملیوں کی ایک بہت بڑی تعداد ہے یہ افسوس کی بات ہے کہ بہت ساری بہترین حکمت عملیوں، نظریات اور اشارے کو عملی جامہ پہنایا نہیں جا سکتا۔ یہ دیکھ کر، FMZ، جو کہ بہت سے تاجروں میں مقداری تجارتی ٹیکنالوجی کو مقبول بنانے کے لیے پرعزم ہے، قدرتی طور پر اس مطالبے کو حل کرنے کی خواہش کو دبا نہیں سکتا!
یہ مطالبہ بالکل ناقابل برداشت ہے!
لہذا، پروگرامنگ کوڈ کی دنیا میں، میں نے پہاڑوں اور دریاؤں کے ذریعے سفر کیا، اور 9 کا تجربہ کیا۔*9=81 گڑھا، لاتعداد راتوں کی نیندیں برداشت کرنے کے بعد، کونے میں ریڈ بل کے خالی ڈبوں کا ایک پہاڑ ڈھیر ہوگیا۔ آخر میں، FMZ پائن لینگویج کے ساتھ مطابقت رکھتا ہے، اور ٹریڈنگ ویو کے تمام قسم کے پائن اسکرپٹ استعمال کیے جا سکتے ہیں۔
دیودار کی زبان کی بات کرتے ہوئے، میں نے حال ہی میں اسے خود سے سیکھا ہے۔ لیکن سچ پوچھیں تو مقداری تجارت کے لیے دیودار کی زبان واقعی آسان، استعمال میں آسان اور سیکھنے میں آسان ہے۔ کیا؟ یقین نہیں آتا؟ مجھے آپ کے لیے گرڈ حکمت عملی لکھتے ہوئے دیکھیں~
/*backtest
start: 2021-06-01 00:00:00
end: 2022-05-23 00:00:00
period: 1h
basePeriod: 1m
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
args: [["v_input_float_1",500],["v_input_string_1",2],["v_input_float_2",0.01],["v_input_int_1",20],["v_input_int_2",500],["RunMode",1,358374],["MinStock",0.001,358374]]
*/
strategy(overlay=true)
varip beginPrice = 0
var spacing = input.float(-1, title="间距价格")
var dir = input.string("long", title="方向", options = ["long", "short", "both"])
var amount = input.float(-1, title="下单量")
var numbers = input.int(-1, title="网格数量")
var profit = input.int(-1, title="盈利价差") / syminfo.mintick
if spacing == -1 and amount == -1 and numbers == -1 and profit == -1
runtime.error("参数错误")
if not barstate.ishistory and beginPrice == 0
beginPrice := close
findTradeId(id) =>
ret = "notFound"
for i = 0 to strategy.opentrades - 1
if strategy.opentrades.entry_id(i) == id
ret := strategy.opentrades.entry_id(i)
ret
// 实时K线阶段
if not barstate.ishistory
// 检索网格
for i = 1 to numbers
// 做多
direction = dir == "both" ? "long" : dir
plot(beginPrice-i*spacing, direction+str.tostring(i), color.green)
if direction == "long" and beginPrice-i*spacing > 0 and beginPrice-i*spacing < close and findTradeId(direction+str.tostring(i)) == "notFound"
strategy.order(direction+str.tostring(i), strategy.long, qty=amount, limit=beginPrice-i*spacing)
strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)
// 做空
direction := dir == "both" ? "short" : dir
plot(beginPrice+i*spacing, direction+str.tostring(i), color.red)
if direction == "short" and beginPrice+i*spacing > close and findTradeId(direction+str.tostring(i)) == "notFound"
strategy.order(direction+str.tostring(i), strategy.short, qty=amount, limit=beginPrice+i*spacing)
strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)
ایف ایم زیڈ کی ریئل ٹائم ٹریڈنگ، بیک ٹیسٹنگ ٹولز، متعدد فنکشنز، اور پائن لینگویج کے استعمال میں آسانی ایک شیر کے پروں کو جوڑنے کے مترادف ہے! پیرامیٹر کی ترتیبات اور بیک ٹیسٹ کنفیگریشن کوڈز سمیت، کوڈز کی کل تعداد 50 لائنوں سے زیادہ نہیں ہے۔ ابتدائیوں کو اب گرڈ لکھنے کے بارے میں فکر کرنے کی ضرورت نہیں ہے۔ . .
بلاشبہ، یہ حکمت عملی گرڈ کی حکمت عملیوں میں بھی خامیاں ہیں، اور یہ ایک ضمانت شدہ رقم پرنٹ کرنے والی مشین نہیں ہے جو اس کے استعمال اور پیرامیٹرز میں ہے۔ میں اس بات کی وضاحت نہیں کروں گا کہ کس طرح آسانی سے حکمت عملی لکھیں، اپنی ٹریڈنگ کی منطق کو لاگو کریں، اور اپنی حکمت عملی لکھ کر پیسہ کمائیں، یہ کسی سے مدد طلب کیے بغیر بہت اچھا لگتا ہے۔ !
میں آپ کو سمجھاتا ہوں، کوڈ آسان اور سمجھنے میں آسان ہے اگر آپ اب بھی سیکھنے میں آسان اور استعمال میں آسان پائن زبان کا استعمال کرتے ہوئے حکمت عملی نہیں لکھ سکتے ہیں، تو میں…….. …………………………………..میں آپ کو تفصیل سے بتاتا ہوں!
شروع میں/*backtestاور*/لپٹا ہوا مواد FMZ بیکٹیسٹ کنفیگریشن کوڈ ہے، جو FMZ کا فنکشن ہے، پائن لینگویج کا مواد نہیں۔ بلاشبہ، آپ بیک ٹیسٹنگ کرتے وقت اس حصے کو نہ لکھنے کا انتخاب کر سکتے ہیں، آپ کو بیک ٹیسٹ کنفیگریشن اور پیرامیٹرز کو سیٹ کرنے کے لیے پیرامیٹر کنٹرولز پر دستی طور پر کلک کرنے کی ضرورت ہوگی۔
/*backtest
start: 2021-06-01 00:00:00
end: 2022-05-23 00:00:00
period: 1h
basePeriod: 1m
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
args: [["v_input_float_1",500],["v_input_string_1",2],["v_input_float_2",0.01],["v_input_int_1",20],["v_input_int_2",500],["RunMode",1,358374],["MinStock",0.001,358374]]
*/
درج ذیل کوڈ:
strategy(overlay=true)
varip beginPrice = 0
var spacing = input.float(-1, title="间距价格")
var dir = input.string("long", title="方向", options = ["long", "short", "both"])
var amount = input.float(-1, title="下单量")
var numbers = input.int(-1, title="网格数量")
var profit = input.int(-1, title="盈利点数") / syminfo.mintick
strategy(overlay=true): اسکرپٹ کے کچھ اختیارات سیٹ کرنے کے لیے استعمال کیا جاتا ہے، overlay=true، جو کہ پیرامیٹرز دینا ہے۔overlayچارٹ کی مرکزی تصویر پر تصویر کھینچنے کے لیے سچ کی قدر تفویض کریں (کے لائن چارٹ مرکزی تصویر ہے، اسے اتنا ہی آسان سمجھا جا سکتا ہے)۔varip beginPrice = 0: ایک متغیر beginPrice کلیدی لفظ varip کا استعمال کرتے ہوئے اعلان کیا جاتا ہے اور اسے ابتدائی طور پر 0 کی قدر تفویض کی جاتی ہے، جسے گرڈ کی ابتدائی قیمت کے طور پر استعمال کیا جاتا ہے۔var spacing = input.float(-1, title="间距价格"): ایک حکمت عملی پیرامیٹر کا نام “وقفہ قیمت” ہے، جو کہ ہر گرڈ پوائنٹ کے درمیان وقفہ ہے، اس کا مطلب ہے کہ ہر بار قیمت 100 سے تجاوز کر جائے گی۔var dir = input.string("long", title="方向", options = ["long", "short", "both"]): ایک حکمت عملی کا پیرامیٹر سیٹ کیا گیا ہے، جس کا نام “ڈائریکشن” ہے۔ وہ بالترتیب اشارہ کرتے ہیں کہ گرڈ صرف لمبی تجارت کرتا ہے، صرف مختصر تجارت کرتا ہے، یا طویل اور مختصر دونوں تجارت کرتا ہے۔var amount = input.float(-1, title="下单量"): ہر گرڈ پوائنٹ ٹرانزیکشن پر ٹرانزیکشن والیوم کو کنٹرول کرنے کے لیے ایک پیرامیٹر سیٹ کریں۔var numbers = input.int(-1, title="网格数量"): گرڈ پوائنٹس کی تعداد کو 20 پر سیٹ کرنے کا مطلب ہے کہ ایک سمت میں 20 گرڈ پوائنٹس ہیں۔var profit = input.int(-1, title="盈利价差") / syminfo.mintick: قیمت کے فرق کو کنٹرول کرنے کے لیے ایک پیرامیٹر سیٹ کریں جس پر ہر گرڈ پوائنٹ پر پوزیشن بند ہو جائے گی۔اگلا، کوڈ کو دیکھیں:
if spacing == -1 and amount == -1 and numbers == -1 and profit == -1
runtime.error("参数错误")
اس کا مطلب یہ ہے کہ اگر کوئی بھی پیرامیٹرز جیسے کہ وقفہ کاری، رقم، نمبرز، اور منافع سیٹ نہیں کیے گئے ہیں، تو ڈیفالٹ ویلیو -1 ہے، جس کا مطلب ہے کہ حکمت عملی رک جائے گی (آپ پیرامیٹرز ترتیب دیے بغیر نہیں چل سکتے ~ ہاہاہا!)
Go on !
if not barstate.ishistory and beginPrice == 0
beginPrice := close
اس کا مطلب یہ ہے کہ جب حکمت عملی ریئل ٹائم K-line مرحلے میں ہو اور beginPrice == 0 ہو، تو beginPrice کی قدر کو موجودہ تازہ ترین قیمت میں تبدیل کریں۔ یہ سمجھا جا سکتا ہے کہ جب حکمت عملی سرکاری طور پر چل رہی ہے، ابتدائی موجودہ قیمت گرڈ کی ابتدائی قیمت ہے. کیونکہ اسکرپٹ میں ایک تاریخی K-line BAR اسٹیج ہے، اس لیے حکمت عملی تاریخی BAR اسٹیج میں منطق کو عملی جامہ پہنائے گی، یہ یقینی طور پر تاریخی BAR پر گرڈ کو ترتیب دینا بے معنی ہے۔
تاریخی بار کا مرحلہ کیا ہے؟
ایک سادہ مثال دینے کے لیے، موجودہ لمحے A میں، حکمت عملی چلنا شروع ہو جاتی ہے، اور حکمت عملی 100 K-line BARs کے ساتھ ڈیٹا حاصل کرتی ہے، جیسے جیسے وقت گزرتا جائے گا، 100 BARs یقینی طور پر 101، 102… N بن جائیں گے۔ وقت A سے چلنے پر، 101st BAR ریئل ٹائم K-line اسٹیج ہے، جو کہ ریئل ٹائم کا تازہ ترین ڈیٹا ہے۔ تو 1st BAR سے 100th BAR تک، یہ تمام تاریخی مارکیٹ کے حالات ہیں جو گزر چکے ہیں، لیکن حکمت عملی بھی ان تاریخی مارکیٹ کے حالات پر چلائی جائے گی، لہذا یہ مرحلہ تاریخی K-line مرحلہ ہے۔
barstate.ishistoryیہ پائن زبان کا ایک بلٹ ان متغیر ہے اگر موجودہ بار ایک تاریخی بار ہے،barstate.ishistoryاگر یہ تاریخی بار نہیں ہے تو یہ غلط ہے۔ لہذا، جب barstate.ishistory درست نہیں ہے، تو یہ ریئل ٹائم K-line مرحلے میں ہے۔
اگلا، ہم نے ایک فنکشن بنایا
findTradeId(id) =>
ret = "notFound"
for i = 0 to strategy.opentrades - 1
if strategy.opentrades.entry_id(i) == id
ret := strategy.opentrades.entry_id(i)
ret
اس فنکشن کا کام یہ معلوم کرنا ہے کہ آیا تمام کھولے گئے آرڈرز میں کوئی مخصوص ID موجود ہے، اگر یہ موجود ہے تو FindTradeId فنکشن موجودہ آرڈر کی ID واپس کر دے گا جب اسے کال کیا جائے گا (نوٹ کریں کہ یہ ID آرڈر ID نہیں ہے۔ ایکسچینج، لیکن حکمت عملی کے ذریعہ آرڈر کو تفویض کردہ ID)، یا ایک لیبل کے طور پر تشریح کی گئی ہے)، اگر یہ موجود نہیں ہے، تو سٹرنگ “notFound” لوٹاتا ہے۔
اگلا، ہم میش شیٹ شروع کرتے ہیں:
// 实时K线阶段
if not barstate.ishistory
// 检索网格
for i = 1 to numbers
// 做多
direction = dir == "both" ? "long" : dir
plot(beginPrice-i*spacing, direction+str.tostring(i), color.green)
if direction == "long" and beginPrice-i*spacing > 0 and beginPrice-i*spacing < close and findTradeId(direction+str.tostring(i)) == "notFound"
strategy.order(direction+str.tostring(i), strategy.long, qty=amount, limit=beginPrice-i*spacing)
strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)
// 做空
direction := dir == "both" ? "short" : dir
plot(beginPrice+i*spacing, direction+str.tostring(i), color.red)
if direction == "short" and beginPrice+i*spacing > close and findTradeId(direction+str.tostring(i)) == "notFound"
strategy.order(direction+str.tostring(i), strategy.short, qty=amount, limit=beginPrice+i*spacing)
strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)
A for loop نمبرز پیرامیٹر کی قدر کی بنیاد پر لوپس کی تعداد کا تعین کرنے کے لیے استعمال کیا جاتا ہے، یعنی آرڈرز کی متعلقہ تعداد کو ترتیب دینے کے لیے۔ ڈائر پیرامیٹر کے مطابق سمت سیٹ کریں۔ یہ معلوم کرنے کے لیے findTradeId فنکشن استعمال کریں کہ کیا موجودہ گرڈ پوزیشن پر لیبل کا آرڈر کھولا گیا ہے صرف اس صورت میں ایک منصوبہ بند آرڈر دیں جب اسے کھولا نہیں گیا ہے (اگر اسے کھولا گیا ہے تو اسے بار بار نہیں لگایا جا سکتا)۔ آرڈر دیتے وقت، منصوبہ بند آرڈر کرنے کے لیے حد پیرامیٹر کی وضاحت کرنے کے لیے strategy.order فنکشن کا استعمال کریں۔ منصوبہ بند آرڈر دینے کے ساتھ ہی متعلقہ بند کرنے کا آرڈر دیں۔ کسی پوزیشن کو بند کرنے کے لیے، strategy.exit فنکشن استعمال کریں، منافع کے پیرامیٹر کی وضاحت کریں، اور منافع کے پوائنٹس کی وضاحت کریں۔




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