ट्रेडिंग व्यू पर ओपन सोर्स रणनीतियों की संख्या बड़ी है। यह अफ़सोस की बात है कि इतनी उत्कृष्ट रणनीतियों, विचारों और संकेतकों का उपयोग वास्तविक बॉट में नहीं किया जा सकता है। यह देखते हुए, एफएमजेड, जो कई व्यापारियों के लिए मात्रात्मक ट्रेडिंग तकनीक को लोकप्रिय बनाने के लिए प्रतिबद्ध है, स्वाभाविक रूप से इस समस्या को हल करने के लिए इस आग्रह को दबा नहीं सकता है!
यह अनुभव साझा करना निश्चित रूप से प्रस्तावित है!
तो, प्रोग्रामिंग और विकास कोड की दुनिया के माध्यम से ट्रेकिंग के बाद, 9 * 9 = 81 गड्ढों के माध्यम से जा रहा है, अनगिनत अनिद्रा रातों से बचने, और एक कोने में खाली रेड बुल डिब्बों के एक पहाड़ को ढेर करने के बाद। अंत में, एफएमजेड पाइन भाषा का समर्थन करता है और संगत है, और ट्रेडिंग व्यू के सभी प्रकार के पाइन स्क्रिप्ट का उपयोग किया जा सकता है।
जब पाइन भाषा की बात आती है, तो मैंने हाल ही में खुद को सीखा है। लेकिन ईमानदार होने के लिए, मात्रात्मक व्यापार के लिए पाइन भाषा का उपयोग करना और सीखना वास्तव में आसान है। क्या? विश्वास नहीं करते? मुझे आप के लिए एक ग्रिड रणनीति लिखने दोः
/*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="Spacing prices")
var dir = input.string("long", title="Directions", options = ["long", "short", "both"])
var amount = input.float(-1, title="Order quantity")
var numbers = input.int(-1, title="Number of grids")
var profit = input.int(-1, title="Profit spreads") / syminfo.mintick
if spacing == -1 and amount == -1 and numbers == -1 and profit == -1
runtime.error("Parameter errors")
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
// Real-time K-line stage
if not barstate.ishistory
// Retrieve grid
for i = 1 to numbers
// Going long
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)
// Going short
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)
FMZ
बेशक, यह रणनीति एक ग्रिड रणनीति है, जिसमें दोष भी हैं, और यह एक पैसा प्रिंटिंग मशीन नहीं है जो हमेशा जीतती है। कुंजी उपयोग और मापदंडों पर निर्भर करती है। हम अपने स्वयं के ट्रेडिंग तर्क को लागू करने के लिए आसानी से रणनीतियों को लिखने के तरीके पर अधिक ध्यान केंद्रित करेंगे, और रणनीतियों को लिखकर और खुद को व्यापार करके पैसा कमाते हैं। यह मदद नहीं मांगना बहुत अच्छा है!
मैं आप सभी के लिए समझा देंगे, कोड सरल और समझने में आसान है, इतना आसान सीखने और पाइन भाषा का उपयोग करने के लिए के साथ, अगर आप अभी भी एक रणनीति नहीं लिख सकते हैं, तो मैं होगा... विस्तार से बताओ!
सामग्री के साथ संलग्न/*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="Spacing prices")
var dir = input.string("long", title="Directions", options = ["long", "short", "both"])
var amount = input.float(-1, title="Order quantity")
var numbers = input.int(-1, title="Number of grids")
var profit = input.int(-1, title="Profit points") / syminfo.mintick
strategy(overlay=true)
: इसका उपयोग स्क्रिप्ट के कुछ विकल्पों को सेट करने के लिए किया जाता है, ओवरले=सच, जो पैरामीटर को सच मान असाइन करना हैoverlay
, ताकि चार्ट बनाते समय, यह मुख्य चार्ट पर खींचा जाता है (के-लाइन चार्ट मुख्य चार्ट है, इसे इतनी आसानी से समझा जा सकता है) ।varip beginPrice = 0
: एक चर startPrice कीवर्ड varip के साथ 0 के प्रारंभिक मूल्य के साथ घोषित किया जाता है, जिसका उपयोग ग्रिड के लिए प्रारंभिक मूल्य के रूप में किया जाता है।var spacing = input.float(-1, title="Spacing prices")
: एक रणनीति पैरामीटर सेट करें, पैरामीटर का नाम है var dir = input.string("long", title="Directions", options = ["long", "short", "both"])
: var amount = input.float(-1, title="Order quantity")
: प्रत्येक ग्रिड पॉइंट ट्रेड में ट्रेडों की मात्रा को नियंत्रित करने के लिए एक पैरामीटर सेट करें।var numbers = input.int(-1, title="Number of grids")
: ग्रिड बिंदुओं की संख्या, सेट 20 एक दिशा में 20 ग्रिड बिंदुओं है।var profit = input.int(-1, title="Profit spreads") / syminfo.mintick
: स्थिति को बंद करने से पहले प्रत्येक ग्रिड बिंदु स्थिति के लाभ मार्जिन को नियंत्रित करने के लिए एक पैरामीटर सेट करें।अगला, कोड को देखोः
if spacing == -1 and amount == -1 and numbers == -1 and profit == -1
runtime.error("Parameter errors")
इसका मतलब है कि यदि कोई पैरामीटर जैसे अंतर, राशि, संख्या, और लाभ सेट नहीं किया जाता है, तो डिफ़ॉल्ट -1 है, और रणनीति बंद हो जाएगी (आप पैरामीटर सेट किए बिना अंधाधुंध काम नहीं कर सकते)
आगे बढ़ो!
if not barstate.ishistory and beginPrice == 0
beginPrice := close
इसका मतलब यह है कि जब रणनीति वास्तविक समय में K-लाइन चरण में है और startPrice == 0 है, तो startPrice के मूल्य को वर्तमान नवीनतम मूल्य में बदलें। यह समझा जा सकता है कि जब रणनीति आधिकारिक तौर पर चल रही है, तो प्रारंभिक वर्तमान मूल्य ग्रिड की प्रारंभिक कीमत है। क्योंकि स्क्रिप्ट में एक ऐतिहासिक K-लाइन BAR चरण है, रणनीति ऐतिहासिक BAR चरण में एक बार तर्क को निष्पादित करेगी, और ऐतिहासिक BAR पर ग्रिड को व्यवस्थित करना निश्चित रूप से अर्थहीन है।
ऐतिहासिक बार चरण क्या है?
एक सरल उदाहरण देने के लिए, वर्तमान क्षण A में, रणनीति चलनी शुरू होती है, और रणनीति 100 K-लाइन BARs के साथ डेटा प्राप्त करती है। समय के साथ, 100 BARs 101, 102...N बन जाएंगे। जब यह क्षण A से चलना शुरू करता है, 101 वें BAR वास्तविक समय के-लाइन चरण है, और यह समय नवीनतम वास्तविक समय डेटा है। फिर 1 वें BAR से 100 वें BAR तक, ये ऐतिहासिक बाजार मूल्य हैं जो बीत चुके हैं, लेकिन रणनीति इन ऐतिहासिक बाजार मूल्य पर भी चलेगी, इसलिए यह चरण ऐतिहासिक K-लाइन चरण है।
barstate.ishistory
यह पाइन भाषा में एक निर्मित चर है,barstate.ishistory
सच है अगर वर्तमान BAR एक ऐतिहासिक BAR है, और गलत है अगर यह एक ऐतिहासिक BAR नहीं है. तो जब नहीं barstate.ishistory सच है, यह वास्तविक समय के लाइन चरण में है.
इसके बाद, एक फ़ंक्शन बनाया जाता है
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
इस फ़ंक्शन की भूमिका यह पता लगाना है कि क्या एक निश्चित आईडी उन सभी ऑर्डर में मौजूद है जिन्होंने वर्तमान में एक स्थिति खोली है। यदि कोई findTradeId फ़ंक्शन कॉल है, तो यह मौजूदा ऑर्डर की आईडी लौटाएगा (ध्यान दें कि यह आईडी एक्सचेंज की ऑर्डर आईडी नहीं है, यह रणनीति द्वारा दिए गए ऑर्डर का नाम है या लेबल के रूप में समझा जाता है), यदि यह मौजूद नहीं है, तो स्ट्रिंग
अगला चरण ग्रिड शीट शुरू करना हैः
// Real-time K-line stage
if not barstate.ishistory
// Retrieve grid
for i = 1 to numbers
// Going long
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)
// Going short
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)
for लूप का उपयोग किया जाता है, और लूप की संख्या संख्या पैरामीटर के मूल्य के अनुसार निर्धारित की जाती है, यानी संबंधित ऑर्डर की संख्या व्यवस्थित की जाती है। dir पैरामीटर के अनुसार दिशा सेट करें। यह पता लगाने के लिए findTradeId फ़ंक्शन का उपयोग करें कि वर्तमान ग्रिड स्थिति पर लेबल का आदेश खोला गया है या नहीं, और केवल योजनाबद्ध आदेश रखें यदि कोई खुली स्थिति नहीं है (यदि स्थिति खोली गई है, तो इसे दोहराया नहीं जा सकता है) । आदेश लगाने के लिए, योजनाबद्ध आदेश के रूप में सीमा पैरामीटर निर्दिष्ट करने के लिए strategy.order फ़ंक्शन का उपयोग करें। योजनाबद्ध आदेश रखते हुए संबंधित समापन आदेश रखें। समापन आदेश का उपयोग करता हैstrategy.exitकार्य, लाभ पैरामीटर निर्दिष्ट करता है, और लाभ अंक निर्दिष्ट करता है।
लाभ वक्र को देखते हुए, हम देख सकते हैं कि ग्रिड भी जोखिम भरा है। यह एक गारंटीकृत जीत नहीं है। यह सिर्फ इतना है कि बड़े पैमाने पर ग्रिड का विस्तार करने का जोखिम थोड़ा कम है।
ठीक है, अगर आप नहीं जानते कि कैसे एक रणनीति लिखने के लिए इस तरह के एक आसान सीखने के लिए और उपयोग करने के लिए आसान पाइन भाषा में, तो मैं...