
एक अनुकूलन ग्रिड ट्रेडिंग रणनीति एक ग्रिड ट्रेडिंग सिस्टम पर आधारित एक मात्रात्मक रणनीति है जो बाजार में बदलाव के लिए ग्रिड लाइनों की स्थिति को स्वचालित रूप से समायोजित करती है। यह रणनीति कई तकनीकी संकेतकों का उपयोग करके सर्वोत्तम ट्रेडिंग पॉइंट बिट्स की गणना करती है और गतिशील रूप से मूल्य परिवर्तन के अनुसार ग्रिड को अपडेट करती है। इसका मुख्य विचार यह है कि यह एक निर्धारित मूल्य सीमा के भीतर खरीदारी या बिक्री को निष्पादित करता है, जब कीमतें पूर्व निर्धारित ग्रिड लाइनों को छूती हैं, जिससे बाजार में उतार-चढ़ाव के कारण लाभ के अवसरों को पकड़ने में मदद मिलती है। यह रणनीति अपनी लोचदारता (लाचीलापन) और विलंब पैरामीटर (लाज) की विशेषता है, जिससे ग्रिड स्वचालित रूप से विभिन्न बाजार स्थितियों के अनुकूल होने के लिए समायोजित हो सकता है, जिससे अधिक लचीला व्यापार निष्पादन संभव हो सकता है।
यह रणनीति निम्नलिखित मुख्य घटकों और सिद्धांतों पर आधारित हैः
चिकनाई तंत्ररणनीतिः पहले कीमतों को चिकना करने के लिए, कई प्रकार के चलती औसत प्रकारों का समर्थन करता है (रेखीय प्रतिगमन, SMA, EMA, VWMA और TEMA), उपयोगकर्ता अपनी पसंद के अनुसार उपयुक्त चिकनाई विधि चुन सकते हैं।
Laziness विलंब पैरामीटरयह रणनीति का एक महत्वपूर्ण नवाचार है, जो एक विलंबता फ़ंक्शन lz (()) की शुरूआत के माध्यम से है, जो सिग्नल को केवल तभी अपडेट करता है जब मूल्य परिवर्तन एक निश्चित प्रतिशत से अधिक हो, बाजार के शोर को प्रभावी ढंग से फ़िल्टर करने के लिए।
ग्रिड निर्माण तंत्र:
सिग्नल जनरेशन तर्क:
लेन-देन नियंत्रण तंत्र:
गतिशील ग्रिड अद्यतनजब आलसी चलती औसत (एलएमए) बदलता है, तो पूरी ग्रिड संरचना को फिर से समायोजित किया जाता है ताकि रणनीति नई मूल्य सीमाओं के अनुकूल हो सके।
एक रणनीति जो एक सरणी का उपयोग करके प्रत्येक ग्रिड लाइन की कीमतों को संग्रहीत करती है, एक ग्रिड लाइन के साथ क्रॉसिंग की गणना करके एक विशिष्ट खरीद और बिक्री बिंदु निर्धारित करती है, जबकि अनावश्यक लेनदेन से बचने के लिए कई प्रतिबंधों को ध्यान में रखती है।
अनुकूलन क्षमताइस रणनीति का सबसे बड़ा लाभ यह है कि यह मानव हस्तक्षेप के बिना बाजार में परिवर्तन के अनुसार स्वचालित रूप से ग्रिड की स्थिति को समायोजित करने में सक्षम है। लचीला पैरामीटर और टारगेट समायोजन तंत्र के माध्यम से, ग्रिड मूल्य प्रवृत्ति में परिवर्तन के साथ स्थानांतरित हो सकता है और हमेशा प्रासंगिक रहता है।
शोर फ़िल्टरविलंब पैरामीटर (Laziness) का परिचय एक नवाचार है जो यह सुनिश्चित करता है कि ग्रिड को केवल तभी ट्रिगर किया जाए जब कीमत में बदलाव पर्याप्त रूप से महत्वपूर्ण हो, बाजार के शोर के प्रति प्रतिक्रिया को कम करने और रणनीति की स्थिरता को बढ़ाने के लिए प्रभावी है।
लचीला अनुकूलन: रणनीति में ग्रिड की संख्या, ग्रिड अंतराल, दिशा वरीयता, चिकनाई प्रकार आदि सहित कई पैरामीटर सेटिंग्स हैं, जिन्हें उपयोगकर्ता विभिन्न बाजार विशेषताओं और व्यक्तिगत व्यापारिक शैली के अनुसार समायोजित कर सकते हैं।
दृश्य व्यापार क्षेत्र: रणनीति वर्तमान में सक्रिय व्यापार क्षेत्र को रंग भरने के माध्यम से प्रदर्शित करती है, जिससे व्यापारियों को निर्णय लेने में मदद करने के लिए ग्रिड में वर्तमान मूल्य की स्थिति के बारे में सहज ज्ञान हो सकता है।
जोखिम नियंत्रणइस रणनीति ने प्राकृतिक जोखिम नियंत्रण तंत्र का निर्माण किया है, जो चरम बाजार स्थितियों में प्रतिकूल लेनदेन को रोकता है।
एकीकृत लॉजिक: एक ही ग्रिड लाइन को खरीद और बेचने के संकेत के रूप में उपयोग करना, लेनदेन तर्क की स्थिरता और पूर्वानुमानिता को बनाए रखना।
सीमा पार करने का खतरायह रणनीति मूल रूप से एक ब्लॉक ट्रेडिंग रणनीति है, जो मजबूत ट्रेंडिंग बाजारों में निरंतर नुकसान का सामना कर सकती है। जब कीमतें ग्रिड के निचले छोर को तोड़ती हैं और लगातार एकतरफा चलती हैं, तो रणनीति गलत दिशा में लगातार बढ़ सकती है। इसका समाधान ट्रेंड पहचानने वाले घटकों को जोड़ना है, या ट्रेंड की पुष्टि होने पर ग्रिड ट्रेडिंग को रोकना है।
पैरामीटर संवेदनशीलता: रणनीतिक प्रदर्शन अत्यधिक पैरामीटर सेटिंग पर निर्भर करता है, विशेष रूप से विलंब पैरामीटर ((Laziness) और लचीलापन पैरामीटर ((Elasticity)) । अनुचित पैरामीटर के कारण समय पर या अतिसंवेदनशील ग्रिड समायोजन हो सकता है। विभिन्न बाजार स्थितियों में इन पैरामीटरों को अनुकूलित करने के लिए अनुशंसा की जाती है।
पिरामिड जोखिम: रणनीति एक ही दिशा में कई प्रविष्टियों की अनुमति देती है ((pyramiding = 4)), जो चरम बाजार स्थितियों में अत्यधिक उत्तोलन और जोखिम एकाग्रता का कारण बन सकती है। अधिकतम स्थिति सीमा और गतिशील स्थिति प्रबंधन स्थापित करने पर विचार किया जाना चाहिए।
स्लाइड प्वाइंट और शुल्क प्रभाव: ग्रिड ट्रेडिंग रणनीतियों में अक्सर ट्रेडिंग शामिल होती है, और वास्तविक निष्पादन में स्लाइड पॉइंट और प्रसंस्करण शुल्क रणनीतियों की लाभप्रदता को काफी प्रभावित कर सकते हैं। इन कारकों को रीमेक में शामिल करने की आवश्यकता होती है, और ट्रेडिंग आवृत्ति और लागत को संतुलित करने के लिए ग्रिड के अंतराल को समायोजित करने की आवश्यकता हो सकती है।
सिग्नल संघर्ष: जब एक ही समय में एक खरीद और बिक्री संकेत होता है, तो वर्तमान रणनीति दो संकेतों को अनदेखा करने का विकल्प चुनती है, जिससे महत्वपूर्ण व्यापारिक अवसरों को याद किया जा सकता है। सिग्नल संघर्ष को अतिरिक्त बाजार संकेतकों या मूल्य पैटर्न के आधार पर हल करने पर विचार किया जा सकता है।
अनुकूलन पैरामीटर समायोजन: रणनीतियों को बाजार की अस्थिरता के आधार पर स्वचालित रूप से समायोजित करने के लिए रणनीति को और अनुकूलित किया जा सकता है। उदाहरण के लिए, उच्च अस्थिरता वाले बाजारों में ग्रिड अंतराल बढ़ाएं और कम अस्थिरता वाले बाजारों में ग्रिड अंतराल को कम करें, ताकि रणनीति विभिन्न बाजार स्थितियों के लिए बेहतर रूप से अनुकूल हो सके।
प्रवृत्ति पहचान घटक को एकीकृत करना: वर्तमान रणनीति ट्रेंडिंग मार्केट में खराब प्रदर्शन कर सकती है, ट्रेंड पहचानने वाले संकेतक (जैसे ADX, मूविंग एवरेज क्रॉसिंग, आदि) को पेश किया जा सकता है, जब एक मजबूत प्रवृत्ति की पहचान की जाती है तो स्वचालित रूप से ट्रेडिंग की दिशा को समायोजित किया जाता है या ग्रिड ट्रेडिंग को निलंबित कर दिया जाता है।
गतिशील स्थिति प्रबंधन: वर्तमान में नीति में स्थिर स्थिति आकार का उपयोग किया जाता है, जो जोखिम-आधारित गतिशील स्थिति प्रबंधन में सुधार कर सकता है, जैसे कि एटीआर (औसत वास्तविक तरंग) के आधार पर स्थिति आकार को समायोजित करना, या खाते के शुद्ध मूल्य के प्रतिशत के आधार पर धन का आवंटन करना।
बहु-समय-सीमा विश्लेषण: बहु-समय फ़्रेम विश्लेषण का परिचय, ट्रेडिंग सिग्नल को फ़िल्टर करने के लिए लंबे समय तक चलने वाले समय चक्र की प्रवृत्ति की दिशा का उपयोग करना, केवल बड़े समय फ़्रेम की प्रवृत्ति की दिशा में ग्रिड ट्रेडिंग करना।
परफेक्ट स्टॉप लॉस मैकेनिज्म: वर्तमान रणनीति में एक स्पष्ट रोकथाम तंत्र का अभाव है, समग्र बाजार की स्थिति के आधार पर वैश्विक रोकथाम को जोड़ा जा सकता है, या प्रत्येक ग्रिड स्तर के लिए एक अलग रोकथाम बिंदु सेट किया जा सकता है ताकि एक एकल व्यापार पर अधिकतम नुकसान को सीमित किया जा सके।
समय का अनुकूलन: रणनीति को यातायात या मूल्य गतिशीलता के संकेतक के साथ एकीकृत किया जा सकता है, जब ग्रिड सिग्नल ट्रिगर किया जाता है, तो अतिरिक्त फ़िल्टरिंग शर्तों के माध्यम से विशिष्ट प्रवेश और निकास समय को अनुकूलित करके सफलता की दर में सुधार किया जा सकता है।
मशीन लर्निंग एकीकरण: एक मशीन लर्निंग एल्गोरिथ्म का उपयोग करके ग्रिड स्थान और पैरामीटर चयन को अनुकूलित करने के लिए विचार किया जा सकता है, एक ऐतिहासिक डेटा प्रशिक्षण मॉडल के माध्यम से सर्वोत्तम ग्रिड सेटिंग्स की भविष्यवाणी करने के लिए, और आगे रणनीति की अनुकूलनशीलता में सुधार करने के लिए।
अनुकूलन ग्रिड ट्रेडिंग रणनीति एक अभिनव विलंब समारोह और गतिशील ग्रिड समायोजन तंत्र के माध्यम से पारंपरिक ग्रिड ट्रेडिंग रणनीति में लचीलेपन की कमी की समस्या को हल करती है। यह स्वचालित रूप से बाजार में बदलाव के लिए अनुकूलन करने में सक्षम है, विभिन्न मूल्य क्षेत्रों के भीतर व्यापार के अवसरों को पकड़ने के लिए, जबकि कई मापदंडों के माध्यम से व्यापार व्यवहार को नियंत्रित करता है। यह रणनीति अस्थिर बाजारों में उपयोग के लिए उपयुक्त है, जो उचित ग्रिड अंतराल और दिशा वरीयताओं को सेट करके स्वचालित व्यापार निष्पादन को प्राप्त कर सकती है।
बैंड-ब्रेकिंग जोखिम और पैरामीटर संवेदनशीलता जैसे संभावित मुद्दों के बावजूद, इस रणनीति में विभिन्न बाजार स्थितियों में स्थिर प्रदर्शन की क्षमता है, जिसमें रुझान पहचान और गतिशील पैरामीटर समायोजन जैसे अनुकूलन दिशाओं को शामिल किया गया है। व्यावहारिक अनुप्रयोगों में, यह अनुशंसा की जाती है कि रणनीति के प्रदर्शन को सत्यापित करने के लिए, विशेष रूप से विभिन्न बाजार स्थितियों में प्रदर्शन को सत्यापित करने के लिए, और विशिष्ट व्यापारिक किस्मों की विशेषताओं के अनुसार पैरामीटर को समायोजित करने के लिए।
//@version=5
// This source code is subject to the terms of the Mozilla Public License 2.0 https://mozilla.org/MPL/2.0/
// ©mvs1231 || xxattaxx
strategy(title='Grid Bot Auto Strategy', shorttitle='GridBot', initial_capital = 100000, overlay=true, pyramiding=4, default_qty_type = strategy.fixed, default_qty_value = 0, commission_value = 0.04, commission_type = strategy.commission.percent, margin_long = 0, margin_short = 0, process_orders_on_close = true)
//----<User Inputs>------------------------------------------------------------------------------//
iLen = input.int(7, 'Smoothing Length(7)', minval=1)
iMA = input.string('lreg', 'Smoothing Type', options=['lreg', 'sma', 'ema', 'vwma', 'tema'])
iLZ = input.float(4.0, 'Laziness(4%)', step=.25) / 100
iELSTX = input(50.0, 'Elasticity(50)')
iGI = input.float(2.0, 'Grid Interval(2%)', step=.25) / 100
iGrids = input.int(6, 'Number of Grids', options=[2, 4, 6, 8])
iCool = input.int(2, 'Cooldown(2)', minval=0)
iDir = input.string('neutral', 'Direction', options=['neutral', 'up', 'down'])
iGT = input.int(70, 'Grid Line Transparency(100 to hide)', minval=0, maxval=100)
iFT = input.int(90, 'Fill Transparency(100 to hide)', minval=0, maxval=100)
iSS = input.string('small', 'Signal Size', options=['small', 'large'])
iReset = input(true, 'Reset Buy/Sell Index When Grids Change')
iEXTR = input(true, 'Use Highs/Lows for Signals')
iMT = input(true, 'Show Min Tick')
iRFC = input(false, 'Reverse Fill Colors')
qty_ent = iGrids/2
qty_pos = strategy.initial_capital / qty_ent / 2 / open
//----<Colors>-----------------------------------------------------------------------------------//
RedGrid = color.new(color.red, iGT)
GreenGrid = color.new(color.green, iGT)
Crimson = #DC143C
LimeGreen = #32CD32
//----<Variables>--------------------------------------------------------------------------------//
NextUP = 0.0
NextDN = 0.0
LastSignal = 0
LastSignal_Index = 0
AP = 0.0
G = iGrids
Buy = false
Sell = false
UpperLimit = 0.0
LowerLimit = 0.0
SignalLine = 0.0
CurrentGrid = 0.0
BuyLine = 0.0
SellLine = 0.0
DIR = 0
MeaningOfLife = 42
//----<Calculations>-----------------------------------------------------------------------------//
//Lazy Formula
lz(x, lzf) =>
LZ = 0.0
s = math.sign(x)
LZ := x == nz(x[1], x) ? x : x > nz(LZ[1] + lzf * LZ[1] * s, x) ? x : x < nz(LZ[1] - lzf * LZ[1] * s, x) ? x : LZ[1]
LZ
//Smoothing
LR = ta.linreg(close, iLen, 0)
SMA = ta.sma(close, iLen)
EMA = ta.ema(close, iLen)
VWMA = ta.vwma(close, iLen)
TEMA = ta.ema(ta.ema(ta.ema(close, iLen), iLen), iLen)
MA = iMA == 'lreg' ? LR : iMA == 'sma' ? SMA : iMA == 'ema' ? EMA : iMA == 'vwma' ? VWMA : TEMA
//Make Lazy
LMA = lz(MA, iLZ)
//Calculate Elasticity
ELSTX = syminfo.mintick * iELSTX
//Show Mintick
if iMT and barstate.islast
table.cell(table.new(position.top_right, 1, 1), 0, 0, str.tostring(syminfo.mintick))
//Anchor Point
AP := MA > LMA ? AP[1] + ELSTX : MA < LMA ? AP[1] - ELSTX : AP[1]
AP := AP >= NextUP[1] ? NextUP[1] : AP
AP := AP <= NextDN[1] ? NextDN[1] : AP
//Reset if Next Level Reached or AP is crossed
AP := LMA != LMA[1] ? LMA : AP
//Next Gridlines
NextUP := LMA != LMA[1] ? LMA + LMA * iGI : NextUP[1]
NextDN := LMA != LMA[1] ? LMA - LMA * iGI : NextDN[1]
//Grid Interval
GI = AP * iGI
//----<Grid Array>-------------------------------------------------------------------------------//
a_grid = array.new_float(9)
for x = -4 to 4 by 1
array.set(a_grid, x + 4, AP + GI * x)
Get_Array_Values(ArrayName, index) =>
value = array.get(ArrayName, index)
value
//----<Set Static Grids>-------------------------------------------------------------------------//
G0 = Get_Array_Values(a_grid, 0) //Upper4
G1 = Get_Array_Values(a_grid, 1) //Upper3
G2 = Get_Array_Values(a_grid, 2) //Upper2
G3 = Get_Array_Values(a_grid, 3) //Upper1
G4 = Get_Array_Values(a_grid, 4) //Center
G5 = Get_Array_Values(a_grid, 5) //Lower1
G6 = Get_Array_Values(a_grid, 6) //Lower2
G7 = Get_Array_Values(a_grid, 7) //Lower3
G8 = Get_Array_Values(a_grid, 8) //Lower4
//----<Set Upper and Lower Limits>---------------------------------------------------------------//
UpperLimit := G >= 8 ? G8 : G >= 6 ? G7 : G >= 4 ? G6 : G5
LowerLimit := G >= 8 ? G0 : G >= 6 ? G1 : G >= 4 ? G2 : G3
//----<Calculate Signals>------------------------------------------------------------------------//
Get_Signal_Index() =>
Value = 0.0
Buy_Index = 0
Sell_Index = 0
start = 4 - G / 2
end = 4 + G / 2
for x = start to end by 1
Value := Get_Array_Values(a_grid, x)
if iEXTR
Sell_Index := low[1] < Value and high >= Value ? x : Sell_Index
Buy_Index := high[1] > Value and low <= Value ? x : Buy_Index
Buy_Index
else
Sell_Index := close[1] < Value and close >= Value ? x : Sell_Index
Buy_Index := close[1] > Value and close <= Value ? x : Buy_Index
Buy_Index
[Buy_Index, Sell_Index]
[BuyLine_Index, SellLine_Index] = Get_Signal_Index()
//----<Signals>----------------------------------------------------------------------------------//
Buy := BuyLine_Index > 0 ? true : Buy
Sell := SellLine_Index > 0 ? true : Sell
//No repeat trades at current level
Buy := low >= SignalLine[1] - GI ? false : Buy
Sell := high <= SignalLine[1] + GI ? false : Sell
//No trades outside of grid limits
Buy := close > UpperLimit ? false : Buy
Buy := close < LowerLimit ? false : Buy
Sell := close < LowerLimit ? false : Sell
Sell := close > UpperLimit ? false : Sell
//Direction Filter (skip one signal if against market direction)
DIR := iDir == 'up' ? 1 : iDir == 'down' ? -1 : 0
Buy := DIR == -1 and low >= SignalLine[1] - GI * 2 ? false : Buy
Sell := DIR == 1 and high <= SignalLine[1] + GI * 2 ? false : Sell
//Conflicting Signals
if Buy and Sell
Buy := false
Sell := false
LastSignal_Index := LastSignal_Index[1]
LastSignal_Index
//----<Cooldown>---------------------------------------------------------------------------------//
y = 0
for i = 1 to iCool by 1
if Buy[i] or Sell[i]
y := 0
break
y += 1
y
CoolDown = y
Buy := CoolDown < iCool ? false : Buy
Sell := CoolDown < iCool ? false : Sell
//----<Trackers>---------------------------------------------------------------------------------//
LastSignal := Buy ? 1 : Sell ? -1 : LastSignal[1]
LastSignal_Index := Buy ? BuyLine_Index : Sell ? SellLine_Index : LastSignal_Index[1]
SignalLine := Get_Array_Values(a_grid, LastSignal_Index)
//Reset to Center Grid when LMA changes
if iReset
SignalLine := LMA < LMA[1] ? UpperLimit : SignalLine
SignalLine := LMA > LMA[1] ? LowerLimit : SignalLine
SignalLine
BuyLine := Get_Array_Values(a_grid, BuyLine_Index)
SellLine := Get_Array_Values(a_grid, SellLine_Index)
//----<Plot Grids>--------------------------//
color apColor = na
apColor := MA < AP ? color.new(color.red, iGT) : MA > AP ? color.new(color.green, iGT) : apColor[1]
apColor := LMA != LMA[1] ? na : apColor
plot(G >= 8 ? G0 : na, color=GreenGrid)
plot(G >= 6 ? G1 : na, color=GreenGrid)
plot(G >= 4 ? G2 : na, color=GreenGrid)
plot(G >= 2 ? G3 : na, color=GreenGrid)
plot(G4, color=apColor, linewidth=4) // Center
plot(G >= 2 ? G5 : na, color=RedGrid)
plot(G >= 4 ? G6 : na, color=RedGrid)
plot(G >= 6 ? G7 : na, color=RedGrid)
plot(G >= 8 ? G8 : na, color=RedGrid)
//fill
LineAbove = SignalLine == UpperLimit ? SignalLine : SignalLine + GI
LineBelow = SignalLine == LowerLimit ? SignalLine : SignalLine - GI
a = plot(LineAbove, color=color.new(color.red, 100), style=plot.style_circles)
b = plot(LineBelow, color=color.new(color.green, 100), style=plot.style_circles)
boxColor = LastSignal == 1 ? color.new(color.green, iFT) : color.new(color.red, iFT)
if iRFC
boxColor := LastSignal == -1 ? color.new(color.green, iFT) : color.new(color.red, iFT)
boxColor
fill(a, b, color=boxColor)
//----<Plot Signals>-----------------------------------------------------------------------------//
plotchar(Buy and iSS == 'small', 'Buy', color=color.new(LimeGreen, 0), size=size.tiny, location=location.belowbar, char='▲')
plotchar(Sell and iSS == 'small', 'Sell', color=color.new(Crimson, 0), size=size.tiny, location=location.abovebar, char='▼')
plotchar(Buy and iSS == 'large', 'Buy', color=color.new(LimeGreen, 0), size=size.small, location=location.belowbar, char='▲')
plotchar(Sell and iSS == 'large', 'Sell', color=color.new(Crimson, 0), size=size.small, location=location.abovebar, char='▼')
//----<Alerts>-----------------------------------------------------------------------------------//
alertcondition(condition=Buy, title='buy', message='buy')
alertcondition(condition=Sell, title='sell', message='sell')
//-----------------------------------------------------------------------------------------------//
if strategy.position_size >= 0 and Buy
strategy.entry("Long", strategy.long, qty = qty_pos)
if strategy.position_size <= 0 and Sell
strategy.entry("Short", strategy.short, qty = qty_pos)
if strategy.position_size > 0 and Sell
strategy.close("Long", qty = qty_pos)
if strategy.position_size < 0 and Buy
strategy.close("Short", qty = qty_pos)