मेरे अच्छे दोस्त वागो ने लंबे समय तक इस सूचक पर नजर रखी और नए साल से पहले मुझे इसकी सिफारिश की, ताकि यह चर्चा की जा सके कि क्या इसे मात्रात्मक रूप से परिवर्तित किया जा सकता है। अफ़सोस की बात है कि एक व्यक्ति ने अपने सपने को पूरा करने में देरी की है, और वास्तव में हाल ही में एल्गोरिदम के बारे में जागरूकता में तेजी आई है। एक दिन एक पाइन अनुवादक लिखने की उम्मीद है; सब कुछ पायथन में है। इस कहानी के बारे में बात करने के लिए, आइए इस कहानी के बारे में कुछ सुपर ट्रेंडिंग लाइनों के बारे में बात करें।
CMC Markets नई पीढ़ी का स्मार्ट ट्रेडिंग सिस्टम सुपर ट्रेंड लाइन (Supertrend)इस प्रणाली के बारे में एक लेख यहाँ है।
सीएमसी मार्केट्स में नई पीढ़ी के स्मार्ट ट्रेडिंग सिस्टम में, तकनीकी संकेतकों में सुपर ट्रेंड लाइन ट्यूनिंग का उपयोग किया जा सकता है। जैसा कि चित्र में दिखाया गया है, आप अपनी पसंद के अनुसार ऊपर की ओर संकेत, नीचे की ओर संकेत के रंग और मोटी बारीकियों को समायोजित कर सकते हैं। तो सुपरट्रेंड इंडिकेटर क्या है? सुपरट्रेंड इंडिकेटर फार्मूला को समझने से पहले, एटीआर को समझना आवश्यक है, क्योंकि सुपरट्रेंड एटीआर मूल्य का उपयोग करके सूचक मूल्य की गणना करता है।
मुख्य एल्गोरिदम के बारे में एक चित्र नीचे दिया गया है।
एक बड़े पैमाने पर, मुख्य रूप से HL2 ((k लाइन औसत मूल्य) × n बार ATR के माध्यम से वर्णन किया गया है। लेकिन लेख अपेक्षाकृत संक्षिप्त है; कोई विस्तृत एल्गोरिदम नहीं है; और फिर मुझे सबसे अच्छा समुदाय ट्रेडिंगव्यू के बारे में सोचा। यह आश्चर्य की बात नहीं है.
इस तरह की एक तस्वीर के साथ, यह एक बहुत अच्छा संकेत है, लेकिन दुर्भाग्य से यह केवल एक चेतावनी संकेत है।
अगर कोड बहुत लंबा नहीं है, तो हम इसे अनुवाद करने के लिए आ सकते हैं और कोशिश कर सकते हैं।पूर्ण पाइन कोड नीचे दिया गया है।
यहाँ हम FMZ पर एक नई रणनीति विकसित की है, जिसे हम सुपर ट्रेड कहते हैं।
और फिर हम दो पैरामीटर सेट करते हैं Factor, Pd.
कोड को बेहतर तरीके से संचालित करने के लिए, इसे समझने में आसान बनाने के लिए, पायथन के उन्नत डेटा एक्सटेंशन पैक का उपयोग करें।पांडा
दोपहर के भोजन के दौरान, मैंने अपने शिक्षक से पूछा कि क्या एफएमजेड इस पुस्तकालय का समर्थन करता है। यह एक बहुत अच्छा शिक्षक है।
1.我们要导入pandas库time库 2.在main函数当中设置使用季度合约(主要跑okex) 3. एक चक्र doTicker सेट करें और 15 मिनट के लिए 1 बार परीक्षण करें।कोड को 15 मिनट के चक्र में चलाएं इसके बाद हम doTicker में मुख्य रणनीति लिखते हैं।
import pandas as pd
import time
def main():
exchange.SetContractType("quarter")
preTime = 0
Log(exchange.GetAccount())
while True:
records = exchange.GetRecords(PERIOD_M15)
if records and records[-2].Time > preTime:
preTime = records[-2].Time
doTicker(records[:-1])
Sleep(1000 *60)
4. हम वापस k लाइन के OHCLV लेने के लिए चाहते हैं, इसलिए हम GetRecords का उपयोग कर सकते हैं।
5. हम वापस डेटा आयात pandas M15 = pd.DataFrame ((records)
6. हम तालिका के शीर्ष टैग को संशोधित करना चाहते हैं. M15.columns = [
def doTicker(records):
M15 = pd.DataFrame(records)
M15.columns = ['time','open','high','low','close','volume','OpenInterest']
7. डेटा सेट के लिए एक पंक्ति जोड़ें hl2 hl2= ((high+low) /2)
#HL2
M15['hl2']=(M15['high']+M15['low'])/2
8.接着我们来计算ATRक्योंकि एटीआर का गणना करने के लिए एक चर की लंबाई में आयात करने के लिए, यह पीडी मान लेता है
इसके बाद हम मैक्सिकन भाषा के मैनुअल को देखेंगे और एटीआर के वास्तविक आवृत्ति औसत के लिए एल्गोरिथ्म के चरणों को देखेंगेः TR: MAX ((MAX (((HIGH-LOW), ABS ((REF ((CLOSE, 1) -HIGH)), ABS ((REF ((CLOSE, 1) -LOW)); एटीआरः आरएमए ((TR,N)
TR का मान नीचे दिए गए तीन विचलनों में से सबसे बड़ा है 1, वर्तमान ट्रेडिंग दिन के उच्चतम मूल्य और निम्नतम मूल्य के बीच की लहर HIGH-LOW 2, पिछले ट्रेडिंग दिन के समापन मूल्य और उस ट्रेडिंग दिन के उच्चतम मूल्य के बीच की लहर REF ((CLOSE, 1) -HIGH) 3, पिछले ट्रेडिंग दिन के समापन मूल्य और उस ट्रेडिंग दिन के निम्नतम मूल्य के बीच की लहर REF ((CLOSE, 1) -LOW) तो TR: MAX (MAX (HIGH-LOW), ABS (REF (CLOSE, 1) -HIGH)), ABS (REF (CLOSE, 1) -LOW));
पायथन में
M15['prev_close']=M15['close'].shift(1)
पहले एक prev_close सेट करना है जो पिछले पंक्ति में data को close करने के लिए है, यानी कि एक नया parameter बनाने के लिए 1 को close को दाईं ओर ले जाना है
ranges= [M15['high'] - M15['low'],M15['high']-M15['prev_close'],M15['low']-M15['prev_close']]
फिर एक मध्यवर्ती चर को परिभाषित करें जो TR के 3 तुलनात्मक मानों के लिए एक सरणी दर्ज करता है।
M15['tr'] = pd.DataFrame(ranges).T.abs().max(axis=1)
हम डेटा सेट में परिभाषित एक नई कॉलम को TR नाम देते हैं, TR का मान लेने के लिए मध्यवर्ती चर के पूर्ण मान का सबसे बड़ा है, abs () और max () फ़ंक्शन का उपयोग करते हुए।
alpha = (1.0 / length) if length > 0 else 0.5
M15['atr']=M15['tr'].ewm(alpha=alpha, min_periods=length).mean()
अंत में, हम एटीआर का मान, एटीआरः आरएमए ((TR,N) का गणना करते हैं, जो कि आरएमए के एल्गोरिथ्म के अनुसार एक निश्चित-मूल्य वाले ईएमए एल्गोरिथ्म है। N हमारे द्वारा आयातित चर है, जहां ATR का डिफ़ॉल्ट पैरामीटर 14 है. यहाँ हम अल्फा = लंबाई का गुणक आयात करते हैं.
===
और फिर ईवीएम एल्गोरिथ्म का उपयोग करके ईएमए की गणना करेंपूर्ण एटीआर गणना प्रक्रिया इस प्रकार है
#ATR(PD)
length=Pd
M15['prev_close']=M15['close'].shift(1)
ranges= [M15['high'] - M15['low'],M15['high']-M15['prev_close'],M15['low']-M15['prev_close']]
M15['tr'] = pd.DataFrame(ranges).T.abs().max(axis=1)
alpha = (1.0 / length) if length > 0 else 0.5
M15['atr']=M15['tr'].ewm(alpha=alpha, min_periods=length).mean()
9 उप और डीएन की गणना करना
M15['Up']=M15['hl2']-(Factor*M15['atr'])
M15['Dn']=M15['hl2']+(Factor*M15['atr'])
Up=hl2 - ((Factor * atr) Dn = hl2 + ((Factor * atr) क्या यह इतना आसान है?
नीचे टीवी के 15 से 21 लाइनों के कोर कोड सेगमेंट दिए गए हैं
TrendUp=close[1]>TrendUp[1]? max(Up,TrendUp[1]) : Up
TrendDown=close[1]<TrendDown[1]? min(Dn,TrendDown[1]) : Dn
Trend = close > TrendDown[1] ? 1: close< TrendUp[1]? -1: nz(Trend[1],1)
Tsl = Trend==1? TrendUp: TrendDown
linecolor = Trend == 1 ? green : red
इस लेख का मुख्य उद्देश्य यह बताना है कि यदि यह पलायन के चरण में है, तो (नीचे की रेखा) TrendUp = max ((Up, TrendUp[1]) यदि नीचे की ओर है, तो (ऊपर की रेखा) TrendDown=min (Dn, TrendDown[1])इसका मतलब यह है कि एक प्रवृत्ति में, एटीआर का मूल्य हमेशा एक ऐसी तकनीक का उपयोग करता है जो लुटेरों के लिए ब्रीनिंग रणनीति के समान है। लगातार मार्ग के दूसरी तरफ संकुचित
यहाँ TrendUp और TrendDown को प्रत्येक गणना के लिए स्व-आवर्तन की आवश्यकता होती है। एक बार जब आप एक कदम आगे बढ़ते हैं, तो आप पहले कदम की गणना करते हैं। इसलिए डेटासेट को लूप करना है।
यहाँ आपको डेटा सेट पर नए फ़ील्ड ट्रेंडअप, ट्रेंडडाउन, ट्रेंड, लाइन कलर बनाना है और उन्हें एक प्रारंभिक मान देना है। फिर fillna ((0) सिंटैक्स का उपयोग करके पहले से गणना किए गए परिणामों में से रिक्त मान के साथ डेटा को 0 में भरें
M15['TrendUp']=0.0
M15['TrendDown']=0.0
M15['Trend']=1
M15['Tsl']=0.0
M15['linecolor']='Homily'
M15 = M15.fillna(0)
एक for लूप सक्षम करें पायथन के तीसरे ऑपरेशन का उपयोग करके लूप
for x in range(len(M15)):
ट्रेंडअप की गणना करेंTrendUp = MAX ((Up,TrendUp[-1]) if close [-1]>TrendUp[-1] else Up इसका मतलब यह है कि यदि पिछले close> पिछले TrendUp, सेट अप और पिछले TrendUp में से सबसे बड़ा मान, सेट अप नहीं किया जाता है और वर्तमान TrendUp को दिया जाता है
M15['TrendUp'].values[x] = max(M15['Up'].values[x],M15['TrendUp'].values[x-1]) if (M15['close'].values[x-1]>M15['TrendUp'].values[x-1]) else M15['Up'].values[x]
इसी तरह, ट्रेंडडाउन की गणना करें.TrendDown=min ((Dn,TrendDown[-1]) if close[-1]
M15['TrendDown'].values[x] = min(M15['Dn'].values[x],M15['TrendDown'].values[x-1]) if (M15['close'].values[x-1]<M15['TrendDown'].values[x-1]) else M15['Dn'].values[x]
नीचे एक फ्लैग है जो दिशा नियंत्रण की गणना करता है, और मैंने कुछ सरल नकली कोड किया है।ट्रेंड= 1 यदि (बंद > ट्रेंडडाउन[-1]) अन्यथा (x) x = -1 यदि (close
इसका मतलब यह है कि अगर बंद मूल्य > पिछले TrendDown 1 ((और अधिक देखें) नहीं बना लेता है x यदि समापन मूल्य < एक पिछले TrendUp, तो -1 ((शून्य) नहीं बनाया जाता है एक Trend (अर्थात अपरिवर्तित) पर ले लो चित्र भाषा में अनुवाद करना है कि ऊपर की ओर रुख करने के लिए ध्वज को अधिक पढ़ें, नीचे की ओर रुख करने के लिए ध्वज को देखें, बाकी समय नहीं बदलता है।
M15['Tsl'].values[x] = M15['TrendUp'].values[x] if (M15['Trend'].values[x]==1) else M15['TrendDown'].values[x]
Tsl और Linecolor की गणना करेंTsl= rendUp if (Trend==1) else ट्रेंडडाउन
Tsl का उपयोग चित्रों में सुपरट्रेंड के लिए किया जाता है. इसका अर्थ है कि अधिक देखने पर चार्ट पर नीचे की ओर और खाली देखने पर चार्ट पर ऊपर की ओर चिह्नित करना।
linecolor=
M15['Tsl'].values[x] = M15['TrendUp'].values[x] if (M15['Trend'].values[x]==1) else M15['TrendDown'].values[x]
M15['linecolor'].values[x]= 'green' if ( M15['Trend'].values[x]==1) else 'red'
इसके बाद 23-30 लाइनों का कोड मुख्य रूप से प्लॉट मैपिंग है।
और अंत में, दो लाइन कोड है कि आप खरीद और बिक्री के लिए संकेत नियंत्रण के लिए उपयोग कर सकते हैं.ट्रेडिंग व्यू में, इसका मतलब है कि फ्लैग को उलटने के बाद संकेत देना। शर्तों को पायथन में परिवर्तित करें. यदि पिछले ट्रेंड फ्लैग -1 से 1 हो जाता है, तो यह ऊपर के प्रतिरोध को तोड़ता है। यदि पिछले ट्रेंड फ्लैग 1 से -1 हो जाता है तो यह ब्रेक डाउन समर्थन का प्रतिनिधित्व करता है।
if(M15['Trend'].values[-1] == 1 and M15['Trend'].values[-2] == -1):
Log('SuperTrend V.1 Alert Long',"Create Order Buy)
if(M15['Trend'].values[-1] == -1 and M15['Trend'].values[-2] == 1):
Log('SuperTrend V.1 Alert Long',"Create Order Sell)
इस खंड का पूरा कोड इस प्रकार हैः
M15['TrendUp']=0.0
M15['TrendDown']=0.0
M15['Trend']=1
M15['Tsl']=0.0
M15['linecolor']='Homily'
M15 = M15.fillna(0)
for x in range(len(M15)):
M15['TrendUp'].values[x] = max(M15['Up'].values[x],M15['TrendUp'].values[x-1]) if (M15['close'].values[x-1]>M15['TrendUp'].values[x-1]) else M15['Up'].values[x]
M15['TrendDown'].values[x] = min(M15['Dn'].values[x],M15['TrendDown'].values[x-1]) if (M15['close'].values[x-1]<M15['TrendDown'].values[x-1]) else M15['Dn'].values[x]
M15['Trend'].values[x] = 1 if (M15['close'].values[x] > M15['TrendDown'].values[x-1]) else ( -1 if (M15['close'].values[x]< M15['TrendUp'].values[x-1])else M15['Trend'].values[x-1] )
M15['Tsl'].values[x] = M15['TrendUp'].values[x] if (M15['Trend'].values[x]==1) else M15['TrendDown'].values[x]
M15['linecolor'].values[x]= 'green' if ( M15['Trend'].values[x]==1) else 'red'
if(M15['Trend'].values[-1] == 1 and M15['Trend'].values[-2] == -1):
Log('SuperTrend V.1 Alert Long',"Create Order Buy)
Log('Tsl=',Tsl)
if(M15['Trend'].values[-1] == -1 and M15['Trend'].values[-2] == 1):
Log('SuperTrend V.1 Alert Long',"Create Order Sell)
Log('Tsl=',Tsl)
मैंने पूरे कोड संरचना को संशोधित किया है। इस तरह की एक रणनीति में अधिक काम करने से संबंधित आदेशों को शामिल किया जाएगा। नीचे पूरा कोड है।
'''backtest
start: 2019-05-01 00:00:00
end: 2020-04-21 00:00:00
period: 15m
exchanges: [{"eid":"Futures_OKCoin","currency":"BTC_USD"}]
'''
import pandas as pd
import time
def main():
exchange.SetContractType("quarter")
preTime = 0
Log(exchange.GetAccount())
while True:
records = exchange.GetRecords(PERIOD_M15)
if records and records[-2].Time > preTime:
preTime = records[-2].Time
doTicker(records[:-1])
Sleep(1000 *60)
def doTicker(records):
#Log('onTick',exchange.GetTicker())
M15 = pd.DataFrame(records)
#Factor=3
#Pd=7
M15.columns = ['time','open','high','low','close','volume','OpenInterest']
#HL2
M15['hl2']=(M15['high']+M15['low'])/2
#ATR(PD)
length=Pd
M15['prev_close']=M15['close'].shift(1)
ranges= [M15['high'] - M15['low'],M15['high']-M15['prev_close'],M15['low']-M15['prev_close']]
M15['tr'] = pd.DataFrame(ranges).T.abs().max(axis=1)
alpha = (1.0 / length) if length > 0 else 0.5
M15['atr']=M15['tr'].ewm(alpha=alpha, min_periods=length).mean()
M15['Up']=M15['hl2']-(Factor*M15['atr'])
M15['Dn']=M15['hl2']+(Factor*M15['atr'])
M15['TrendUp']=0.0
M15['TrendDown']=0.0
M15['Trend']=1
M15['Tsl']=0.0
M15['linecolor']='Homily'
M15 = M15.fillna(0)
for x in range(len(M15)):
M15['TrendUp'].values[x] = max(M15['Up'].values[x],M15['TrendUp'].values[x-1]) if (M15['close'].values[x-1]>M15['TrendUp'].values[x-1]) else M15['Up'].values[x]
M15['TrendDown'].values[x] = min(M15['Dn'].values[x],M15['TrendDown'].values[x-1]) if (M15['close'].values[x-1]<M15['TrendDown'].values[x-1]) else M15['Dn'].values[x]
M15['Trend'].values[x] = 1 if (M15['close'].values[x] > M15['TrendDown'].values[x-1]) else ( -1 if (M15['close'].values[x]< M15['TrendUp'].values[x-1])else M15['Trend'].values[x-1] )
M15['Tsl'].values[x] = M15['TrendUp'].values[x] if (M15['Trend'].values[x]==1) else M15['TrendDown'].values[x]
M15['linecolor'].values[x]= 'Long' if ( M15['Trend'].values[x]==1) else 'Short'
linecolor=M15['linecolor'].values[-2]
close=M15['close'].values[-2]
Tsl=M15['Tsl'].values[-2]
if(M15['Trend'].values[-1] == 1 and M15['Trend'].values[-2] == -1):
Log('SuperTrend V.1 Alert Long','Create Order Buy')
Log('Tsl=',Tsl)
position = exchange.GetPosition()
if len(position) > 0:
Amount=position[0]["Amount"]
exchange.SetDirection("closesell")
exchange.Buy(_C(exchange.GetTicker).Sell*1.01, Amount);
exchange.SetDirection("buy")
exchange.Buy(_C(exchange.GetTicker).Sell*1.01, vol);
if(M15['Trend'].values[-1] == -1 and M15['Trend'].values[-2] == 1):
Log('SuperTrend V.1 Alert Long','Create Order Sell')
Log('Tsl=',Tsl)
position = exchange.GetPosition()
if len(position) > 0:
Amount=position[0]["Amount"]
exchange.SetDirection("closebuy")
exchange.Sell(_C(exchange.GetTicker).Buy*0.99,Amount);
exchange.SetDirection("sell")
exchange.Sell(_C(exchange.GetTicker).Buy*0.99, vol*2);
सार्वजनिक रणनीति लिंक https://www.fmz.com/strategy/200625
हमने लगभग एक साल के आंकड़ों का चयन किया है। ओकेएक्स तिमाही अनुबंध का उपयोग करके 15 मिनट का चक्र। एक बार जब आप इसे सेट करते हैं, तो आप इसे बदल देते हैं। कारक 3 है। Pd = 45 vol=100 (एक बार में 100 ऑर्डर) इस तरह की एक रिपोर्ट में कहा गया है कि इस तरह की एक रिपोर्ट में कहा गया है, इस तरह की एक बड़ी संख्या में लोगों ने अपने देश से बाहर निकलने का फैसला किया है। 312 की गिरावट ने सिस्टम को काफी झटका दिया है। अगर 312 के बिना, तो लाभ बेहतर होना चाहिए।
SuperTrend एक बहुत अच्छा ट्रेडिंग सिस्टम है।
सुपरट्रेंड प्रणाली का मुख्य सिद्धांत एटीआर चैनल को तोड़ने की रणनीति (केंट चैनल के समान) का उपयोग करना है लेकिन यह मुख्य रूप से डोंगचियन सिद्धांतों के विपरीत है। इस तरह से, एक बार जब आप अपने व्यवसाय को बंद कर देते हैं, तो आप अपने व्यवसाय को बंद कर देते हैं। एक बार जब एक चैनल टूट जाता है, तो ऊपर और नीचे की पटरी अपने प्रारंभिक मूल्य को बहाल कर देती है।
मैंने ट्रेडिंग व्यू में up dn TrendUp TrendDn को अलग से प्लॉट किया है। यह इस रणनीति को समझने में मदद करता है।एक नज़र में
इसके अलावा github पर एक js संस्करण भी है.................................. पता हैhttps://github.com/Dodo33/gekko-supertrend-strategy/blob/master/Supertrend.js
आखिरकार, मैंने मूल संस्करण की खोज की। यह 29 मई, 2013 को प्रकाशित हुआ था। लेखक राजेंद्रन आर C++ कोड Mt4 फोरम पर प्रकाशित किया गया हैhttps://www.mql5.com/en/code/viewcode/10851/128437/Non_Repainting_SuperTrend.mq4मैं C++ के बारे में कुछ समझता हूं और एक और लिखने का मौका मिलता है।
मैं आशा करता हूं कि आप सभी इससे सीख सकते हैं। यह मुश्किल नहीं है!
zdg4484YYDS!
lglydz2010यदि आप सीधे इस रणनीति का उपयोग कर रहे हैं, तो आपको यह समझ में नहीं आता है कि एक्सचेंजों को कैसे कनेक्ट करना है।
बम्परयहाँ पर अगर 312 की लहर नहीं आई तो पैरामीटर में बहुत अधिक समायोजन की जगह होनी चाहिए, क्योंकि सुपरट्रेंड मुख्य रूप से ट्रेंड सूची को पकड़ने के लिए है। 312 को याद नहीं किया जाना चाहिए।
चांग बेहिसाबलेकिन, दुर्भाग्य से, विभिन्न चक्रों और मापदंडों के साथ, पुनः परीक्षण प्रभाव बहुत अच्छा नहीं है, और मुझे नहीं पता कि दूसरों ने कैसे अनुकूलित किया है।
वू मोटा हैठीक है, ठीक है, आपके योगदान के लिए धन्यवाद।
वू मोटा हैयदि यह काम नहीं करता है, तो यह दिखाता हैःTraceback (most recent call last): File "
जुन्फेंग91पाइन के अनुवादक, प्रतीक्षा करें
समय-समयएक बार जब हम एक बार फिर से एक बार फिर से एक बार फिर से एक बार फिर से एक बार फिर से एक बार फिर से एक बार फिर से एक बार फिर से एक बार फिर से एक बार फिर से एक बार फिर से एक बार फिर से!
फ्रैंक131419एक दिन पाइन का अनुवादक लिखना; सब कुछ पायथन में है; भैंस, अच्छे लोग इसे देखेंगे!
अर्थक्या यह open-source है, मैं इसे पुनः प्राप्त करना चाहता हूं और फिर सबसे अच्छा पैरामीटर खोजने के लिए svm का उपयोग करना चाहता हूं
डसाइडासीयह सिस्टम ऐसा लगता है कि यह भी एक बार शीर्ष 10 रिटर्न वाले वायदा रणनीतियों में से एक था। लंबे समय तक इसे बनाए रखना पैसा कमाने के लिए अच्छा है।
हल्के बादलनमस्ते, कृपया, पीडी एटीआर की लंबाई है? उदाहरण के लिए, एटीआर ((14) है, तो पीडी 14 है?
आविष्कारक मात्रा - छोटे सपनेप्रशंसा
अंडाकारउम्मीद है, पाइन वास्तव में बहुत कम पढ़ता है, और बहुत कम ट्यूटोरियल।
उपदेशइसका मतलब है कि पांडा पैक की कमी है, आपके सिस्टम को पांडा स्थापित करने के लिए पिप की आवश्यकता हो सकती है
Ant_Skyक्या आप मुझे बता सकते हैं कि यह कैसे किया गया?
उपदेशहाहा, धन्यवाद मालिक।
आविष्कारक मात्रा - छोटे सपनेएक पल के लिए, सार्वजनिक रूप से।
अकेला आदमीJS संस्करण के लिए!
उपदेश
हल्के बादलअच्छा, धन्यवाद! और mq4 भी हटा दिया गया, धन्यवाद.
उपदेशहाँ, बिल्कुल सही।
उपदेशअल्लाह की प्रशंसा हो!
आविष्कारक मात्रा - छोटे सपनेमैं एक JS संस्करण भी लिखता हूं।
उपदेशबहुत बहुत धन्यवाद, ड्रीमिन टीचर।