ट्रेडिंग व्यू पर खुले स्रोत की रणनीतियों की एक विस्फोटक संख्या है, और इतने सारे महान रणनीतियों, विचारों और संकेतकों को लागू नहीं किया जा सकता है। यह देखना बहुत दुख की बात है कि एफएमजेड, जो कि क्वांटिफाइड ट्रेडिंग तकनीक को कई व्यापारियों तक पहुंचाने के लिए प्रतिबद्ध है, स्वाभाविक रूप से इस समाधान की आवश्यकता को रोकने के लिए प्रेरित नहीं है!
इस मांग को बर्दाश्त नहीं किया जा सकता है!
इसलिए, प्रोग्रामिंग विकास कोड की दुनिया में, पहाड़ पर चढ़ना, हजारों पहाड़ों पर चलना, 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="间距价格")
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)
FMZ की वास्तविक डिस्क, पुनः परीक्षण उपकरण, कई कार्यक्षमताओं के साथ-साथ पाइन भाषा का उपयोग करने में आसान है, जो कि एक बाघ की तरह है! पैरामीटर सेटिंग्स, पुनः परीक्षण कॉन्फ़िगरेशन कोड, कुल 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
मान को सच असाइन करें, ताकि चित्र बनाते समय, चित्र चार्ट के मुख्य चित्र पर चित्रित हो ((K रेखाचित्र मुख्य चित्र है, इसे समझने में आसान है) ।)varip beginPrice = 0
: कीवर्ड varip के साथ एक चर को घोषित करेंbeginPrice का प्रारंभिक मूल्य 0 है, जो कि ग्रिड के लिए प्रारंभिक मूल्य है।var spacing = input.float(-1, title="间距价格")
: एक नीति पैरामीटर सेट करें, पैरामीटर का नाम घन अंतराल मूल्य घन है, जो प्रत्येक ग्रिड बिंदु के लिए अंतराल है, 100 सेट करें, जो कि मूल्य 100 से अधिक है, एक बार लेनदेन है।var dir = input.string("long", title="方向", options = ["long", "short", "both"])
: एक नीति पैरामीटर सेट करें, जिसका नाम हेड डायरेक्शन हेड है, यह पैरामीटर एक ड्रॉ-डाउन विकल्प है, जिसे आप long, short, or 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("参数错误")
इसका मतलब यह है कि यदि कोई भी पैरामीटर spacing, amount, numbers, profit सेट नहीं किया गया है, तो डिफ़ॉल्ट रूप से -1 है, तो नीति को रोक दें ((पैरामीटर सेट नहीं किया जा सकता है - हाहा!
आगे बढ़ो!
if not barstate.ishistory and beginPrice == 0
beginPrice := close
इसका मतलब यह है कि जब नीति वास्तविक समय में K-लाइन चरण में है और startPrice == 0 है, तो startPrice को वर्तमान नवीनतम मूल्य में बदलने के लिए एक संशोधित मान दें। यह समझ में आता है कि जब नीति आधिकारिक रूप से चल रही है, तो प्रारंभिक वर्तमान मूल्य ग्रिड का प्रारंभिक मूल्य है। चूंकि स्क्रिप्ट एक ऐतिहासिक K-लाइन BAR चरण है, इसलिए रणनीति ऐतिहासिक BAR चरण में एक बार फिर से लॉजिक को निष्पादित करती है, इसलिए ग्रिड को ऐतिहासिक बार पर रखना निश्चित रूप से कोई मतलब नहीं है।
ऐतिहासिक बार क्या है?
एक सरल उदाहरण के रूप में, जैसे कि वर्तमान समय A में, नीति चलाने के लिए शुरू होता है, नीति 100 K लाइन BARs के साथ एक डेटा प्राप्त करती है, जो निश्चित रूप से 100 BARs से 101 हो जाती है, 102... N। जब यह A से शुरू होता है, 101 बार वास्तविक समय में K लाइन चरण है, जो नवीनतम वास्तविक समय डेटा है। तो 1 बार से 100 बार तक, ये सभी पिछले ऐतिहासिक घटनाएं हैं, लेकिन रणनीति इन ऐतिहासिक घटनाओं पर भी चलती है, इसलिए यह चरण ऐतिहासिक K लाइन चरण है।
接下来,我们创建了一个函数
```pine
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 कॉल पर मौजूद सिंगल का आईडी लौटाता है (ध्यान दें कि यह आईडी एक्सचेंज का ऑर्डर आईडी नहीं है, यह ऑर्डर का नाम या टैग है), यदि यह मौजूद नहीं है तो स्ट्रिंग
यह एक बहुत ही दिलचस्प लेख है, लेकिन यह एक बहुत ही दिलचस्प लेख है।
// 实时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)
for लूप का उपयोग किया जाता है, संख्याओं के पैरामीटर के संख्यात्मक मान के आधार पर लूप की संख्या निर्धारित करने के लिए, यानी संबंधित संख्या के आदेशों को व्यवस्थित करना; dir पैरामीटर के आधार पर, दिशा सेट करना; findTradeId फ़ंक्शन का उपयोग वर्तमान ग्रिड स्थान के लेबल वाले ऑर्डर को खोजने के लिए किया जाता है, केवल जब कोई ट्रेड नहीं खोला जाता है, तो योजना सूची से नीचे जाना (यदि कोई ट्रेड खोला गया है तो निश्चित रूप से दोहराया नहीं जा सकता है) । नीचे की सूची में रणनीति.order फ़ंक्शन का उपयोग करके योजना सूची के लिए सीमा पैरामीटर निर्दिष्ट करें; नीचे की योजना के साथ-साथ संबंधित समतल सूची का उपयोग करें; समतल सूची में रणनीति.exit फ़ंक्शन का उपयोग करें, लाभ पैरामीटर निर्दिष्ट करें, लाभ बिंदु निर्दिष्ट करें ।
लाभ वक्र को देखते हुए, आप देख सकते हैं कि ग्रिड में जोखिम भी है, कोई जीत-जीत नहीं है, लेकिन बड़े पैमाने पर ग्रिड को खींचने का जोखिम थोड़ा कम है।
तो, पाइन भाषा के साथ, जो सीखना आसान है, अगर मैंने अभी तक रणनीति नहीं लिखी है, तो मैं...
स्टॉकरइस तरह के बच्चे के शिक्षण के स्तर के ट्यूटोरियल में से कई हो सकते हैं, बेहतर है कि विशेष रूप से एक पाइन ट्यूटोरियल ((ज्ञान भुगतान)hhh ◎ सपने कुल v587
आर्ट्रोनधन्यवाद.
बीबीडब्ल्यूड2009सपने का कुल V5
आविष्कारक मात्रा - छोटे सपनेहाँ, बी स्टेशन पर पाइन ट्यूटोरियल की एक श्रृंखला की गई हैः https://www.bilibili.com/video/BV1sU4y1B71i/
आविष्कारक मात्रा - छोटे सपनेअजनबी, एफएमजेड का समर्थन करने के लिए धन्यवाद।
आविष्कारक मात्रा - छोटे सपनेB स्टेशन पर PINE भाषा का परिचय वीडियो भी उपलब्ध है।