4
ध्यान केंद्रित करना
1271
समर्थक

यदि आप अभी भी सीखने में आसान और उपयोग में आसान पाइन भाषा का उपयोग करके रणनीति नहीं लिख सकते हैं, तो मैं...

में बनाया: 2022-06-01 17:37:55, को अपडेट: 2023-09-18 20:19:45
comments   6
hits   2992

यदि आप अभी भी सीखने में आसान और उपयोग में आसान पाइन भाषा का उपयोग करके रणनीति नहीं लिख सकते हैं, तो मैं…

यदि आप अभी भी सीखने में आसान और उपयोग में आसान पाइन भाषा का उपयोग करके रणनीति नहीं लिख सकते हैं, तो मैं…

TradingView पर ओपन सोर्स रणनीतियों की एक बड़ी संख्या है। यह अफ़सोस की बात है कि इतनी सारी बेहतरीन रणनीतियों, विचारों और संकेतकों को व्यवहार में नहीं लाया जा सकता है। यह देखकर, 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 का मान निर्दिष्ट करें (K-लाइन चार्ट मुख्य चित्र है, इसे ऐसे ही सरलता से समझा जा सकता है)।
  • varip beginPrice = 0: एक चर beginPrice को varip कीवर्ड का उपयोग करके घोषित किया जाता है और आरंभ में इसे 0 का मान दिया जाता है, जिसका उपयोग ग्रिड के प्रारंभिक मूल्य के रूप में किया जाता है।
  • var spacing = input.float(-1, title="间距价格"): रणनीति पैरामीटर सेट करें। पैरामीटर का नाम “अंतराल मूल्य” है, जो प्रत्येक ग्रिड बिंदु के बीच का अंतराल है। यदि इसे 100 पर सेट किया जाता है, तो इसका मतलब है कि हर बार जब कीमत 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 

इसका अर्थ यह है कि जब रणनीति वास्तविक समय के-लाइन चरण में हो और beginPrice == 0 हो, तो beginPrice के मान को वर्तमान नवीनतम मूल्य में संशोधित करें। यह समझा जा सकता है कि जब रणनीति आधिकारिक रूप से चल रही होती है, तो प्रारंभिक वर्तमान मूल्य ग्रिड का प्रारंभिक मूल्य होता है। क्योंकि स्क्रिप्ट में ऐतिहासिक K-लाइन BAR चरण है, इसलिए रणनीति ऐतिहासिक BAR चरण में तर्क को निष्पादित करेगी। ऐतिहासिक BAR पर ग्रिड की व्यवस्था करना निश्चित रूप से अर्थहीन है।

ऐतिहासिक BAR चरण क्या है?

एक सरल उदाहरण देने के लिए, वर्तमान क्षण A पर, रणनीति चलना शुरू होती है, और रणनीति 100 K-लाइन BARs के साथ डेटा प्राप्त करती है। जैसे-जैसे समय बीतता है, 100 BARs निश्चित रूप से 101, 102… N बन जाएंगे। समय A से चलने पर, 101वां BAR वास्तविक समय K-लाइन चरण होता है, जो नवीनतम वास्तविक समय डेटा होता है। तो पहली BAR से लेकर 100वीं BAR तक, ये सभी ऐतिहासिक बाजार स्थितियां हैं जो बीत चुकी हैं, लेकिन रणनीति भी इन ऐतिहासिक बाजार स्थितियों पर ही चलाई जाएगी, इसलिए यह चरण ऐतिहासिक K-लाइन चरण है।

barstate.ishistoryयह पाइन भाषा का एक अंतर्निहित चर है। यदि वर्तमान BAR एक ऐतिहासिक BAR है,barstate.ishistoryयदि यह ऐतिहासिक BAR नहीं है, तो यह गलत है। इसलिए, जब not barstate.ishistory सत्य है, तो यह वास्तविक समय K-लाइन चरण में है।

इसके बाद, हमने एक फ़ंक्शन बनाया

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 फ़ंक्शन कॉल किए जाने पर मौजूदा ऑर्डर की आईडी लौटाएगा (ध्यान दें कि यह आईडी ऑर्डर की आईडी नहीं है एक्सचेंज, लेकिन रणनीति द्वारा ऑर्डर को सौंपी गई आईडी)। , या लेबल के रूप में व्याख्या की गई), यदि यह मौजूद नहीं है, तो “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)

फॉर लूप का उपयोग numbers पैरामीटर के मान के आधार पर लूप की संख्या निर्धारित करने के लिए किया जाता है, अर्थात, ऑर्डर की संगत संख्या को व्यवस्थित करने के लिए। dir पैरामीटर के अनुसार दिशा निर्धारित करें. यह पता लगाने के लिए कि वर्तमान ग्रिड स्थिति पर लेबल का ऑर्डर खोला गया है या नहीं, findTradeId फ़ंक्शन का उपयोग करें। नियोजित ऑर्डर तभी रखें जब वह खोला न गया हो (यदि वह खोला गया है, तो आप डुप्लिकेट ऑर्डर नहीं रख सकते हैं)। ऑर्डर देते समय, प्लान ऑर्डर करने के लिए सीमा पैरामीटर निर्दिष्ट करने हेतु strategies.order फ़ंक्शन का उपयोग करें। नियोजित ऑर्डर देते समय ही संबंधित समापन ऑर्डर भी दें। किसी स्थिति को बंद करने के लिए, strategies.exit फ़ंक्शन का उपयोग करें, लाभ पैरामीटर निर्दिष्ट करें, और लाभ बिंदु निर्दिष्ट करें।

यदि आप अभी भी सीखने में आसान और उपयोग में आसान पाइन भाषा का उपयोग करके रणनीति नहीं लिख सकते हैं, तो मैं…

यदि आप अभी भी सीखने में आसान और उपयोग में आसान पाइन भाषा का उपयोग करके रणनीति नहीं लिख सकते हैं, तो मैं…

यदि आप अभी भी सीखने में आसान और उपयोग में आसान पाइन भाषा का उपयोग करके रणनीति नहीं लिख सकते हैं, तो मैं…

यदि आप अभी भी सीखने में आसान और उपयोग में आसान पाइन भाषा का उपयोग करके रणनीति नहीं लिख सकते हैं, तो मैं…

यील्ड कर्व को देखकर आप समझ सकते हैं कि ग्रिड में जोखिम भी है और इसमें जीत की गारंटी नहीं है। बस इतना है कि जब ग्रिड को बड़े पैमाने पर बढ़ाया जाता है तो जोखिम अपेक्षाकृत कम होता है।

खैर, यदि आप अभी भी सीखने में आसान और उपयोग में आसान पाइन भाषा का उपयोग करके रणनीति नहीं लिख सकते हैं, तो मैं…