गाइड · स्ट्रैटेजी टेस्टर
बैक-टेस्ट कंसोल: कोड से ट्रेडिंग रणनीतियाँ परखें
हर चार्ट पर रणनीति बटन है। यह एक कंसोल खोलता है जो पिछली कैंडल पर रणनीति दोहराता है और चार्ट पर हर ट्रेड, लाभ, ड्रॉडाउन, जीत दर और बाय-एंड-होल्ड के मुकाबले इक्विटी कर्व दिखाता है। बिल्ट-इन रणनीति से शुरू करें, फिर JavaScript की कुछ पंक्तियों में अपनी लिखें।
डिज़ाइन से सुरक्षित। आपकी स्क्रिप्ट केवल आपके ब्राउज़र में, बिना इंटरनेट पहुँच वाले सैंडबॉक्स में चलती है: वह दी गई कैंडल पढ़ सकती है और कुछ नहीं (न आपका खाता, न यह साइट, न दूसरी वेबसाइटें)। आप जो लिखते हैं उसमें से कुछ भी हमारे सर्वरों पर नहीं चलता।
एक मिनट में शुरू करें
- कोई भी चार्ट खोलें, जैसे EURUSD, और परखने के लिए टाइमफ़्रेम चुनें (H1, D1…)।
- चार्ट के टूलबार में रणनीति दबाएँ। कंसोल चार्ट के नीचे खुलता है।
- कोई बिल्ट-इन रणनीति चुनें, जैसे मूविंग एवरेज क्रॉसओवर। यह तुरंत चलती है: चार्ट पर तीर हर एंट्री और एग्ज़िट दिखाते हैं।
- कोई इनपुट बदलें (जैसे धीमा औसत 30 से 50): टेस्ट अपने-आप फिर चलता है।
- कुल योग के लिए सारांश, हर ट्रेड के लिए ट्रेड, समय के साथ खाते के लिए इक्विटी कर्व पढ़ें।
- उसे अपनी स्क्रिप्ट बनाने के लिए प्रति संपादित करें दबाएँ, बदलें, और टेस्ट चलाएँ दबाएँ (या Ctrl+Enter)।
कंसोल, हिस्सा-दर-हिस्सा
| हिस्सा | यह क्या करता है |
|---|---|
| रणनीति सूची | बिल्ट-इन: छह तैयार रणनीतियाँ (मूविंग एवरेज क्रॉसओवर, RSI रिवर्सल, बोलिंगर बैंड मीन रिवर्ज़न, MACD सिग्नल क्रॉस, डोंचियन ब्रेकआउट, SuperTrend)। मेरी रणनीतियाँ: जो आपने सहेजीं (साइन इन करें)। नई स्क्रिप्ट… एक ख़ाली शुरू करती है। |
| कोड देखें / प्रति संपादित करें | कोड देखें ठीक-ठीक दिखाता है कि बिल्ट-इन रणनीति क्या करती है। प्रति संपादित करें उसे आपकी अपनी स्क्रिप्ट के रूप में एडिटर में कॉपी करता है, बदलने को तैयार। |
| इनपुट | स्क्रिप्ट का हर input(…) यहाँ एक फ़ील्ड बन जाता है (संख्या या सूची)। किसी को बदलने पर टेस्ट फिर चलता है। डिफ़ॉल्ट उन्हें वापस लाता है। |
| सेटिंग्स | पूँजी, ऑर्डर साइज़, लागत, कितनी कैंडल और क्या शॉर्ट ट्रेड की अनुमति है (नीचे)। |
| एडिटर | रणनीति का JavaScript। Tab इंडेंट करता है, Ctrl/⌘+Enter चलाता है। त्रुटि अपना संदेश और पंक्ति संख्या दिखाती है। |
| संदर्भ | स्क्रिप्ट जो कुछ इस्तेमाल कर सकती है उसकी छोटी सूची, सीधे कंसोल में। यह पेज उसका विस्तृत रूप है। |
| सहेजें / इस रूप में सहेजें… | स्क्रिप्ट, उसका नाम, इनपुट और सेटिंग आपके खाते में रखता है (सहेजें • पर बिंदु का मतलब बिना सहेजे बदलाव)। आपकी रणनीतियाँ हर चार्ट पर सूचीबद्ध होती हैं। |
| नतीजों के टैब | सारांश, ट्रेड (CSV डाउनलोड करें के साथ), इक्विटी कर्व और Log। ट्रेड और बनाई गई लाइनें चार्ट पर भी दिखती हैं; किसी ट्रेड पर जाने के लिए उस पर क्लिक करें। |
सेटिंग्स
| सेटिंग | अर्थ | अच्छा शुरुआती मान |
|---|---|---|
| शुरुआती पूँजी | वह खाता जिससे टेस्ट शुरू होता है, कीमत की मुद्रा में (EURUSD के लिए: डॉलर)। | 10,000 |
| ऑर्डर साइज़ | इक्विटी का %: हर ट्रेड उस समय खाते का यह हिस्सा इस्तेमाल करता है (100% = पूरा खाता, बिना लीवरेज)। इकाइयाँ: एक तय मात्रा (फ़ॉरेक्स में बेस मुद्रा की इकाइयाँ: 100,000 = एक स्टैंडर्ड लॉट)। स्क्रिप्ट { qty } से हर ऑर्डर का अपना साइज़ तय कर सकती है। | इक्विटी का 100%, या एक तय लॉट |
| प्रति साइड कमीशन % | ट्रेड किए गए मूल्य के प्रतिशत के रूप में शुल्क, एंट्री पर और फिर एग्ज़िट पर लिया जाता है। | फ़ॉरेक्स के लिए 0.002–0.01, स्टॉक और क्रिप्टो के लिए 0.05–0.1 |
| स्लिपेज / स्प्रेड (कीमत) | हर भराव पर आपके विरुद्ध जोड़ा जाता है, कीमत की इकाइयों में। कैंडल बिड कीमतें हैं, इसलिए ख़रीद को वास्तविक बनाने के लिए यहाँ सामान्य स्प्रेड डालें। | EURUSD 0.00010 (1 पिप), सोना 0.30 |
| कैंडल | चार्ट पर: स्क्रीन पर लोड कैंडल। साइन इन होने पर उसी टाइमफ़्रेम का और इतिहास लोड करने के लिए 5,000 … 100,000 तक चुनें (यह साइट 20,000 तक की अनुमति देती है). | जितनी हो सकें: ज़्यादा कैंडल, ज़्यादा ट्रेड, ज़्यादा भरोसेमंद आँकड़े |
| शॉर्ट ट्रेड की अनुमति दें | बंद: short() केवल लॉन्ग पोज़िशन बंद करता है, कभी शॉर्ट नहीं खोलता। स्क्रिप्ट बदले बिना केवल लॉन्ग पक्ष परखने के लिए उपयोगी। | फ़ॉरेक्स के लिए चालू, केवल-लॉन्ग निवेश के लिए बंद |
नतीजे पढ़ना
| संख्या | यह आपको क्या बताता है |
|---|---|
| शुद्ध लाभ | अंतिम इक्विटी घटा शुरुआती पूँजी, कमीशन और स्लिपेज के बाद; पूँजी के % में भी। |
| खरीदें और रखें | पहली कैंडल पर सीधे ख़रीदकर आख़िरी तक रखने से कितना मिलता। जो रणनीति इसे नहीं हराती, या बहुत गहरे ड्रॉडाउन के साथ ही हराती है, वह कम जोड़ती है। |
| अधिकतम ड्रॉडाउन | शिखर से इक्विटी की सबसे बड़ी गिरावट, पैसे और % में। वह दर्द जो आपको झेलना पड़ता। कई ट्रेडर शुद्ध लाभ ÷ अधिकतम ड्रॉडाउन देखते हैं। |
| ट्रेड, % जीते | कितने ट्रेड बंद हुए और उनमें से कितने हिस्से ने पैसा कमाया। कम जीत दर ठीक है अगर जीतने वाले ट्रेड हारने वालों से बहुत बड़े हों। |
| प्रॉफ़िट फ़ैक्टर | सकल लाभ ÷ सकल हानि। 1 से ऊपर पैसा कमाता है; 1.3–2 मज़बूत रणनीतियों में आम है; कम ट्रेड पर बहुत ऊँचे मान आम तौर पर किस्मत होते हैं। |
| औसत ट्रेड, औसत लाभ, औसत हानि | प्रति ट्रेड औसत लाभ, और जीतने व हारने वाले ट्रेड का सामान्य आकार। औसत ट्रेड की तुलना अपनी लागत से करें। |
| सबसे बड़ा लाभ / हानि, लगातार हारे ट्रेड | चरम मान। पूरा नतीजा अगर एक बहुत बड़े जीतने वाले ट्रेड पर टिका हो, तो यह चेतावनी का संकेत है। |
| शार्प अनुपात | अस्थिरता की प्रति इकाई रिटर्न, कैंडल-दर-कैंडल इक्विटी बदलावों से वार्षिक। 1 से ऊपर अच्छा, 2 से ऊपर बहुत अच्छा (और दुर्लभ)। |
| बाज़ार में समय | पोज़िशन खुली रहने वाली कैंडल का हिस्सा। उसी लाभ के लिए कम समय का मतलब कम जोखिम। |
| लॉन्ग / शॉर्ट | हर पक्ष के ट्रेड, लाभ और जीत दर अलग-अलग: अक्सर एक ही पक्ष सारा काम करता है। |
ट्रेड टैब हर ट्रेड को उसकी दिशा, एंट्री और एग्ज़िट समय व कीमत, साइज़, पैसे और % में लाभ, कितनी कैंडल चला, क्यों बंद हुआ (सिग्नल, स्टॉप लॉस, टेक प्रॉफ़िट, पलटा गया, अंत में अब भी खुला) और आपकी टिप्पणी के साथ सूचीबद्ध करता है। CSV डाउनलोड करें उसे स्प्रेडशीट के लिए निर्यात करता है। इक्विटी कर्व खाते को बाय-एंड-होल्ड के मुकाबले दिखाता है। Log दिखाता है कि आपकी स्क्रिप्ट ने log() से क्या लिखा।
ऑर्डर कैसे भरे जाते हैं
- आगे झाँकना नहीं।
onBar(i)में लगाया गया ऑर्डर अगली कैंडल के ओपन (i + 1) पर भरता है। रणनीति कभी उस कीमत पर ट्रेड नहीं कर सकती जो उसे पता नहीं हो सकती थी। - कैंडल के भीतर स्टॉप। स्टॉप लॉस और टेक प्रॉफ़िट हर कैंडल के हाई और लो से जाँचे जाते हैं। अगर दोनों एक ही कैंडल में पहुँच सकते थे, तो स्टॉप गिना जाता है (सतर्क धारणा)। स्टॉप के पार गैप ओपन पर भरता है, जैसे असली बाज़ारों में।
- एक समय में एक पोज़िशन। शॉर्ट रहते
long()शॉर्ट बंद करके लॉन्ग खोलता है ("पलटा गया"); पहले से लॉन्ग रहतेlong()केवल दिए गए स्टॉप अपडेट करता है। - हर भराव पर लागत। स्लिपेज हर भराव कीमत को आपके विरुद्ध खिसकाता है; कमीशन एंट्री और एग्ज़िट दोनों पर लगता है।
- अंत। आख़िरी कैंडल के बाद भी खुला ट्रेड आख़िरी क्लोज़ पर बंद होता है और "अंत में अब भी खुला" चिह्नित होता है।
अपनी रणनीति लिखना
रणनीति दो हिस्सों वाला एक छोटा JavaScript प्रोग्राम है:
- ऊपरी हिस्सा एक बार चलता है:
input()से अपने इनपुट पढ़ें,ta.*याind()से पूरी सीरीज़ गणना करें, औरplot()से उन्हें बनाएँ। function onBar(i) { … }हर कैंडल के लिए चलता है, सबसे पुरानी पहले।iकैंडल की संख्या है (0 = सबसे पुरानी)। यहाँ तय करें:long(),short(),exit(), या कुछ नहीं।
// 1. once: inputs and series
const len = input("Average length", 50, { min: 5, max: 400 });
const avg = ta.sma(close, len); // one value per candle
plot(avg, "SMA " + len, "#2F80ED"); // drawn on the price chart
// 2. every candle
function onBar(i) {
if (avg[i] == null) return; // the first len - 1 values are null (warming up)
if (position === 0 && close[i] > avg[i]) long();
if (position > 0 && close[i] < avg[i]) exit("below the average");
}
शुरू से जानने योग्य बातें:
- सीरीज़ ऐरे हैं, हर कैंडल का एक मान, सबसे पुराना पहले:
close[i]इस कैंडल का क्लोज़ है,close[i - 1]पिछली का। गणना की गई सीरीज़ पर्याप्त कैंडल होने तकnullरहती हैं; इस्तेमाल से पहले जाँचें। onBar(i)के भीतर आप केवलiतक की कैंडल पढ़ सकते हैं।close[i + 1]टेस्ट को त्रुटि के साथ रोक देता है: यह भविष्य में झाँकना होगा।constऔरletहमेशा की तरह इस्तेमाल करें; आपके अपने वेरिएबल कैंडल के बीच अपने मान बनाए रखते हैं (ट्रेलिंग स्टॉप के लिए उपयोगी)।- कीमतें चार्ट की अपनी इकाइयों में हैं (EURUSD के लिए 1.0850, सोने के लिए 2650.40); समय UTC सेकंड में।
संदर्भ
कैंडल और वर्तमान स्थिति
| नाम | यह क्या है |
|---|---|
open, high, low, close, volume | कैंडल के मानों के ऐरे, सबसे पुराने पहले (वॉल्यूम टिक वॉल्यूम है)। |
time | हर कैंडल का खुलने का समय UTC सेकंड में। new Date(time[i] * 1000).getUTCHours() घंटा देता है। |
bars, symbol, timeframe | कैंडल की संख्या, टिकर (जैसे "EURUSD") और टाइमफ़्रेम (जैसे "H1")। |
position | onBar के भीतर: 1 लॉन्ग, -1 शॉर्ट, 0 कोई पोज़िशन नहीं। |
positionSize, entryPrice, entryBar | खुले ट्रेड का इकाइयों में साइज़, भराव कीमत और कैंडल संख्या (कोई पोज़िशन न हो तो null)। i - entryBar = रखी गई कैंडल। |
equity, cash | इस कैंडल के क्लोज़ पर खाते का मूल्य (खुले ट्रेड के साथ), और उसके बिना नकद। |
इनपुट
| कॉल | नतीजा |
|---|---|
input("Period", 14, { min: 2, max: 100, step: 1 }) | एक संख्या फ़ील्ड (min और max के बीच रखा जाता है)। टाइप किया गया मान, या 14 लौटाता है। |
input("Average", "EMA", { options: ["SMA", "EMA"] }) | एक सूची। चुना गया टेक्स्ट लौटाती है। |
30 इनपुट तक। उनके मान रणनीति के साथ सहेजे जाते हैं और किसी आइडिया में प्रकाशित करने पर उसके साथ जाते हैं।
गणनाएँ (ta.*)
| फ़ंक्शन | लौटाता है |
|---|---|
ta.sma(src, n), ta.ema(src, n), ta.wma(src, n), ta.rma(src, n) | किसी भी सीरीज़ का सिंपल, एक्सपोनेंशियल, वेटेड और वाइल्डर मूविंग एवरेज। |
ta.rsi(src, 14) | RSI (0–100). |
ta.atr(14), ta.tr() | Average True Range (साधारण औसत, जैसे चार्ट पर) और हर कैंडल की True Range। |
ta.stdev(src, n) | n कैंडल पर स्टैंडर्ड डेविएशन। |
ta.highest(src, n), ta.lowest(src, n) | पिछली n कैंडल (इसे मिलाकर) का सबसे ऊँचा / सबसे नीचा मान। ब्रेकआउट के लिए [i - 1] से तुलना करें। |
ta.change(src, n = 1), ta.roc(src, n = 1) | n कैंडल पहले से अंतर, और वही % में। |
ta.macd(src, 12, 26, 9) | { macd, signal, hist }. |
ta.bb(src, 20, 2) | बोलिंगर बैंड { upper, middle, lower }। |
ta.stoch(14, 3, 3) | स्टोकेस्टिक { k, d } (अवधि, %D स्मूदिंग, स्लोइंग)। |
ta.supertrend(10, 3) | { line, dir }: अपट्रेंड में dir 1 है, डाउनट्रेंड में -1। |
src कोई भी सीरीज़ है: close, high, कोई दूसरा नतीजा, या आपका अपना ऐरे। हर फ़ंक्शन एक नया ऐरे लौटाता है; कुछ भी कैंडल नहीं बदलता।
सिग्नल
| फ़ंक्शन | सच जब… |
|---|---|
ta.crossover(a, b, i) | a कैंडल i पर b को ऊपर की ओर पार करता है (i - 1 पर वह उसके बराबर या नीचे था)। b एक संख्या हो सकता है: ta.crossover(rsi, 30, i)। |
ta.crossunder(a, b, i) | a, b को नीचे की ओर पार करता है। |
ta.cross(a, b, i) | दोनों में से कोई भी। |
ta.rising(s, n, i), ta.falling(s, n, i) | s पिछली n कैंडल में से हर एक पर बढ़ा (घटा)। |
ऑर्डर
| कॉल | प्रभाव (अगली कैंडल के ओपन पर) |
|---|---|
long(options) (buy भी) | लॉन्ग पोज़िशन खोलता है; पहले शॉर्ट बंद करता है। |
short(options) (sell भी) | शॉर्ट पोज़िशन खोलता है; पहले लॉन्ग बंद करता है। शॉर्ट ट्रेड बंद हों तो केवल लॉन्ग बंद करता है। |
exit("reason") | खुली पोज़िशन बंद करता है। कारण ट्रेड सूची में दिखता है। |
stopLoss(price), takeProfit(price) | खुले ट्रेड का स्टॉप / टारगेट तुरंत खिसकाता है (null उसे हटाता है)। ट्रेलिंग स्टॉप के लिए इनका इस्तेमाल करें। |
| विकल्प | अर्थ |
|---|---|
{ sl: 1.0820, tp: 1.0950 } | स्टॉप लॉस और टेक प्रॉफ़िट कीमतों के रूप में। |
{ slPct: 2, tpPct: 4 } | भराव कीमत से % में स्टॉप और टारगेट। |
{ qty: 50000 } | इस ऑर्डर के लिए इकाइयों में साइज़ (ऑर्डर साइज़ सेटिंग के बजाय)। |
{ comment: "breakout" } | ट्रेड के साथ दिखाई जाने वाली टिप्पणी। |
आउटपुट
| कॉल | प्रभाव |
|---|---|
plot(series, "Name", "#2F80ED") | कीमत चार्ट पर एक लाइन बनाता है (12 तक)। |
log("text", value, …) | कैंडल के समय के साथ Log टैब में एक पंक्ति लिखता है (200 पंक्तियों तक)। |
कोड में चार्ट के सभी 71 इंडिकेटर: ind()
ind(id, inputs) चार्ट का कोई भी इंडिकेटर ठीक वैसे ही गणना करता है जैसे चार्ट करता है। यह उसकी पहली लाइन सीरीज़ के रूप में लौटाता है; सभी लाइनें .lines में और उनके नाम .names में हैं। छोड़े गए इनपुट दिखाया गया डिफ़ॉल्ट लेते हैं। method इनमें से एक है: SMA, EMA, SMMA, LWMA; price इनमें से एक: close, open, high, low, median, typical, weighted।
const st = ind("stoch", { k: 14, d: 3, slowing: 3 }); // st = %K, st.lines[1] = %D
const ich = ind("ichimoku"); // ich.names: Tenkan, Kijun, Span A, Span B, Chikou
const kijun = ich.lines[1];
| id | इंडिकेटर | इनपुट (डिफ़ॉल्ट) | रेखाएँ |
|---|---|---|---|
ma | Moving Average | period: 20, method: SMA, price: close, shift: 0 | MA |
ama | Adaptive Moving Average | period: 9, fast: 2, slow: 30, price: close | AMA |
adx | Average Directional Movement Index | period: 14 | ADX, +DI, −DI |
adxw | ADX Wilder | period: 14 | ADX, +DI, −DI |
bb | Bollinger Bands | period: 20, dev: 2, price: close, shift: 0 | Middle, Upper, Lower |
dema | Double Exponential Moving Average | period: 14, price: close | DEMA |
env | Envelopes | period: 14, method: SMA, dev: 0.1, price: close | Upper, Lower |
frama | Fractal Adaptive Moving Average | period: 14, price: close | FrAMA |
ichimoku | Ichimoku Kinko Hyo | tenkan: 9, kijun: 26, senkou: 52 | Tenkan, Kijun, Span A, Span B, Chikou |
sar | Parabolic SAR | step: 0.02, max: 0.2 | SAR |
stddev | Standard Deviation | period: 20, method: SMA, price: close | StdDev |
tema | Triple Exponential Moving Average | period: 14, price: close | TEMA |
vidya | Variable Index Dynamic Average | cmo: 9, ema: 12, price: close | VIDYA |
atr | Average True Range | period: 14 | ATR |
bears | Bears Power | period: 13 | Bears |
bulls | Bulls Power | period: 13 | Bulls |
cci | Commodity Channel Index | period: 14, price: typical | CCI |
chaikin | Chaikin Oscillator | fast: 3, slow: 10, method: EMA | CHO |
demarker | DeMarker | period: 14 | DeMarker |
force | Force Index | period: 13, method: SMA | Force |
macd | MACD | fast: 12, slow: 26, signal: 9, price: close | MACD, Signal |
momentum | Momentum | period: 14, price: close | Momentum |
osma | Moving Average of Oscillator | fast: 12, slow: 26, signal: 9, price: close | OsMA |
rsi | Relative Strength Index | period: 14, price: close | RSI |
rvi | Relative Vigor Index | period: 10 | RVI, Signal |
stoch | Stochastic Oscillator | k: 5, d: 3, slowing: 3, method: SMA | %K, %D |
trix | Triple Exponential Average | period: 14, price: close | TRIX |
wpr | Williams' Percent Range | period: 14 | %R |
ad | Accumulation/Distribution | कोई नहीं | A/D |
mfi | Money Flow Index | period: 14 | MFI |
obv | On Balance Volume | कोई नहीं | OBV |
volumes | Volumes | कोई नहीं | Volume |
ac | Accelerator Oscillator | कोई नहीं | AC |
alligator | Alligator | jaw: 13, jawShift: 8, teeth: 8, teethShift: 5, lips: 5, lipsShift: 3 | Jaw, Teeth, Lips |
ao | Awesome Oscillator | कोई नहीं | AO |
fractals | Fractals | कोई नहीं | Up, Down |
gator | Gator Oscillator | jaw: 13, teeth: 8, lips: 5 | Upper, Lower |
bwmfi | Market Facilitation Index | कोई नहीं | BW MFI |
zigzag | ZigZag | depth: 12, dev: 0.3 | ZigZag |
vwap | VWAP (volume-weighted average price) | कोई नहीं | VWAP |
supertrend | SuperTrend | period: 10, mult: 3 | Up trend, Down trend |
keltner | Keltner Channels | period: 20, atr: 10, mult: 2 | Middle, Upper, Lower |
donchian | Donchian Channels | period: 20 | Upper, Lower, Middle |
hma | Hull Moving Average | period: 20, price: close | HMA |
pivots | Pivot Points (classic) | कोई नहीं | P, R1, S1, R2, S2, R3, S3 |
stochrsi | Stochastic RSI | rsi: 14, stoch: 14, k: 3, d: 3 | %K, %D |
aroon | Aroon | period: 25 | Aroon up, Aroon down |
cmf | Chaikin Money Flow | period: 20 | CMF |
uo | Ultimate Oscillator | p1: 7, p2: 14, p3: 28 | UO |
chop | Choppiness Index | period: 14 | CHOP |
vwma | Volume-Weighted Moving Average | period: 20 | VWMA |
zlema | Zero-Lag Exponential Moving Average | period: 21, price: close | ZLEMA |
alma | Arnaud Legoux Moving Average | period: 9, offset: 0.85, sigma: 6, price: close | ALMA |
mcginley | McGinley Dynamic | period: 14 | McGinley |
lsma | Least Squares Moving Average | period: 25, price: close | LSMA |
chandelier | Chandelier Exit | period: 22, mult: 3 | Long exit, Short exit |
roc | Rate of Change | period: 12 | ROC |
cmo | Chande Momentum Oscillator | period: 9 | CMO |
tsi | True Strength Index | long: 25, short: 13, signal: 13 | TSI, Signal |
ppo | Percentage Price Oscillator | fast: 12, slow: 26, signal: 9 | Histogram, PPO, Signal |
dpo | Detrended Price Oscillator | period: 20 | DPO |
kst | Know Sure Thing | signal: 9 | KST, Signal |
vortex | Vortex Indicator | period: 14 | VI+, VI− |
eom | Ease of Movement | period: 14 | EOM |
mass | Mass Index | ema: 9, sum: 25 | Mass Index |
coppock | Coppock Curve | wma: 10, long: 14, short: 11 | Coppock |
hv | Historical Volatility | period: 20 | HV % |
fisher | Fisher Transform | period: 9 | Fisher, Trigger |
squeeze | Squeeze Momentum | bb: 20, bbk: 2, kc: 20, kck: 1.5 | Momentum, Squeeze on, Squeeze off |
crsi | Connors RSI | rsi: 3, streak: 2, rank: 100 | CRSI |
pvt | Price Volume Trend | कोई नहीं | PVT |
उदाहरण
हर उदाहरण जैसा है वैसा चलता है: कॉपी करें दबाएँ, कंसोल खोलें, नई स्क्रिप्ट… चुनें, चिपकाएँ और टेस्ट चलाएँ दबाएँ। नतीजे टिकर, टाइमफ़्रेम और अवधि पर निर्भर हैं; उदाहरण तकनीक सिखाते हैं, सिफ़ारिशें नहीं हैं।
1. Your first strategy: buy above a moving average
The smallest useful script. It is long while the close is above its 50-candle average and flat otherwise. The top of the script runs once; onBar(i) runs for every candle.
const len = input("Average length", 50, { min: 5, max: 400 });
const avg = ta.sma(close, len);
plot(avg, "SMA " + len, "#2F80ED");
function onBar(i) {
if (avg[i] == null) return; // still warming up
if (position === 0 && close[i] > avg[i]) long({ comment: "close above the average" });
if (position > 0 && close[i] < avg[i]) exit("close below the average");
}
2. Moving average crossover, long and short
Always in the market: long() while short reverses the position (and short() while long). Untick Allow short trades in the settings to make it long-only without changing the code.
const fast = ta.ema(close, input("Fast EMA", 12, { min: 2, max: 200 }));
const slow = ta.ema(close, input("Slow EMA", 26, { min: 3, max: 400 }));
plot(fast, "Fast", "#2F80ED");
plot(slow, "Slow", "#E39B2D");
function onBar(i) {
if (ta.crossover(fast, slow, i)) long();
if (ta.crossunder(fast, slow, i)) short();
}
3. Fixed stop loss and take profit in percent
slPct and tpPct are measured from the fill price. The stop and the target are checked inside every candle with its high and low; if both could have been hit in one candle, the stop counts.
const r = ta.rsi(close, 14);
const sl = input("Stop loss %", 1.5, { min: 0.1, max: 20, step: 0.1 });
const tp = input("Take profit %", 3, { min: 0.1, max: 50, step: 0.1 });
function onBar(i) {
if (position !== 0) return; // one trade at a time
if (ta.crossover(r, 30, i)) long({ slPct: sl, tpPct: tp, comment: "RSI back above 30" });
if (ta.crossunder(r, 70, i)) short({ slPct: sl, tpPct: tp, comment: "RSI back below 70" });
}
4. ATR stop and a 2:1 target in prices
sl and tp take prices. Here the stop sits 2 ATR from the close and the target twice as far (risk/reward 1:2). The fill is at the next open, so the real distance can differ slightly.
const a = ta.atr(14);
const hi = ta.highest(high, 20);
const mult = input("Stop (ATR multiple)", 2, { min: 0.5, max: 6, step: 0.5 });
function onBar(i) {
if (i < 1 || a[i] == null || hi[i - 1] == null || position !== 0) return;
if (close[i] > hi[i - 1]) { // a new 20-candle high
const stop = close[i] - mult * a[i];
const target = close[i] + 2 * mult * a[i];
long({ sl: stop, tp: target, comment: "breakout, risk " + (mult * a[i]).toFixed(5) });
}
}
5. A trailing stop that follows the price
stopLoss(price) moves the stop of the open trade. This one trails 3 ATR under the highest close since the entry and never moves down.
const a = ta.atr(14);
const fast = ta.ema(close, 20), slow = ta.ema(close, 50);
let stop = null;
function onBar(i) {
if (a[i] == null || slow[i] == null) return;
if (position === 0) {
stop = null;
if (ta.crossover(fast, slow, i)) long({ comment: "trend up" });
return;
}
const candidate = close[i] - 3 * a[i];
if (stop === null || candidate > stop) { // only ever raise it
stop = candidate;
stopLoss(stop);
}
}
6. Any chart indicator with ind(): ADX trend filter
ind(id, inputs) gives the first line of any of the chart's 71 indicators; the other lines are in .lines (their names in .names). Here: trade the MACD cross only when ADX says the market is trending.
const adx = ind("adx", { period: 14 }); // .lines[0] ADX, [1] +DI, [2] -DI
const plusDI = adx.lines[1], minusDI = adx.lines[2];
const m = ta.macd(close, 12, 26, 9);
const minAdx = input("Minimum ADX", 25, { min: 10, max: 50 });
function onBar(i) {
if (adx[i] == null || adx[i] < minAdx) return;
if (ta.crossover(m.macd, m.signal, i) && plusDI[i] > minusDI[i]) long();
if (ta.crossunder(m.macd, m.signal, i) && minusDI[i] > plusDI[i]) short();
}
7. Mean reversion with Bollinger Bands
Buys a close under the lower band, sells a close over the upper band, and exits at the middle band. A classic for ranging markets; it suffers in strong trends.
const b = ta.bb(close, input("Period", 20, { min: 5, max: 200 }), input("Width", 2, { min: 0.5, max: 4, step: 0.1 }));
plot(b.upper, "Upper", "#8E44AD");
plot(b.lower, "Lower", "#8E44AD");
function onBar(i) {
if (b.middle[i] == null) return;
if (position === 0 && close[i] < b.lower[i]) long({ comment: "below the lower band" });
else if (position === 0 && close[i] > b.upper[i]) short({ comment: "above the upper band" });
else if (position > 0 && close[i] >= b.middle[i]) exit("middle band");
else if (position < 0 && close[i] <= b.middle[i]) exit("middle band");
}
8. Trade only at certain hours (time filter)
time[i] is the candle's open in UTC seconds. This example only opens trades between 07:00 and 16:00 UTC (the London session) and closes anything still open at 20:00. Use it on an intraday timeframe.
const from = input("Start hour (UTC)", 7, { min: 0, max: 23 });
const to = input("End hour (UTC)", 16, { min: 1, max: 24 });
const fast = ta.sma(close, 10), slow = ta.sma(close, 30);
function onBar(i) {
const hour = new Date(time[i] * 1000).getUTCHours();
if (position !== 0 && hour >= 20) { exit("end of the day"); return; }
if (hour < from || hour >= to) return;
if (ta.crossover(fast, slow, i)) long();
if (ta.crossunder(fast, slow, i)) short();
}
9. Your own calculation: a volatility breakout
Series are plain arrays, so you can compute your own. This builds yesterday's range for every candle and buys a break above the open plus half of it. log() writes to the Log tab.
const k = input("Range multiple", 0.5, { min: 0.1, max: 2, step: 0.1 });
const range = high.map((h, i) => (i ? high[i - 1] - low[i - 1] : null)); // the previous candle's range
const trigger = open.map((o, i) => (range[i] == null ? null : o + k * range[i]));
plot(trigger, "Trigger", "#16A085");
function onBar(i) {
if (trigger[i] == null) return;
if (position === 0 && close[i] > trigger[i]) {
long({ slPct: 1, comment: "close above open + " + k + " x range" });
log("signal at", close[i], "trigger", trigger[i]);
} else if (position > 0 && i - entryBar >= 3) {
exit("held 3 candles");
}
}
10. Position size from risk (1% of equity per trade)
{ qty } sets the size in units for one order, overriding the Order size setting. Here the size is chosen so that hitting the stop loses about 1% of the current equity.
const a = ta.atr(14);
const riskPct = input("Risk per trade %", 1, { min: 0.1, max: 5, step: 0.1 });
const fast = ta.ema(close, 20), slow = ta.ema(close, 50);
function onBar(i) {
if (a[i] == null || slow[i] == null || position !== 0) return;
if (ta.crossover(fast, slow, i)) {
const stopDistance = 2 * a[i];
const qty = (equity * riskPct / 100) / stopDistance;
long({ qty: qty, sl: close[i] - stopDistance, tp: close[i] + 3 * stopDistance,
comment: "risk " + riskPct + "%" });
}
}
11. Two conditions in a row: pullback in an uptrend
Combines a trend filter (price above the 200 average), a pullback (RSI under 40 within the last 5 candles) and a trigger (close back above the 20 average).
const trend = ta.sma(close, 200), fast = ta.ema(close, 20), r = ta.rsi(close, 14);
function onBar(i) {
if (trend[i] == null || i < 5) return;
let dipped = false;
for (let k = 0; k < 5; k++) if (r[i - k] != null && r[i - k] < 40) dipped = true;
if (position === 0 && close[i] > trend[i] && dipped && ta.crossover(close, fast, i)) {
long({ slPct: 2, tpPct: 4, comment: "pullback bought" });
}
}
त्रुटियाँ और उन्हें कैसे ठीक करें
| संदेश | कारण और समाधान |
|---|---|
| the script needs a function onBar(i) { … } | स्क्रिप्ट में onBar नहीं है, या उसकी वर्तनी ग़लत है (onbar)। function onBar(i) { … } स्क्रिप्ट के ऊपरी स्तर पर लिखें, किसी दूसरे फ़ंक्शन के भीतर नहीं। |
| close[124] is in the future: inside onBar(123) only candles up to 123 are known | आपने बाद की कैंडल पढ़ ली। close[i] और उससे पहले की (close[i - 1]) इस्तेमाल करें। ब्रेकआउट के लिए आज के क्लोज़ की तुलना कल के सबसे ऊँचे हाई से करें: close[i] > hi[i - 1]। |
| close cannot be changed | कैंडल केवल पढ़ने के लिए हैं। इसके बजाय अपना ऐरे बनाएँ: const mid = close.map((c, i) => (c + open[i]) / 2); |
| Cannot read properties of null / नतीजों में NaN | शुरुआत में सीरीज़ अभी null होती है (वॉर्म-अप)। onBar को if (avg[i] == null) return; से शुरू करें, और [i - 1] इस्तेमाल करने से पहले i >= 1 जाँचें। |
| unknown indicator "…" | इंडिकेटर तालिका से id इस्तेमाल करें (छोटे अक्षरों में), जैसे ind("adx"), न कि ind("ADX")। |
| कोई ट्रेड नहीं: रणनीति ने कभी ऑर्डर नहीं लगाया | शर्तें कभी एक साथ सच नहीं हुईं। मान देखने के लिए log("rsi", r[i]) जोड़ें, कोई शर्त ढीली करें, या और कैंडल लोड करें। |
| रणनीति ने 15 सेकंड से ज़्यादा समय लिया (अनंत लूप?) | ऐसा लूप जो कभी ख़त्म न हो, या onBar के भीतर भारी लूप। हर कैंडल पर सभी कैंडल पर लूप चलाने के बजाय सीरीज़ एक बार ऊपर गणना करें। |
| Unexpected token / SyntaxError (पंक्ति N) | उस पंक्ति में टाइपिंग की ग़लती: छूटा हुआ ब्रैकेट, उद्धरण चिह्न या कॉमा। |
भरोसेमंद टेस्टिंग
- अपनी लागत जोड़ें। बार-बार ट्रेड करने वाली रणनीति शून्य लागत पर शानदार दिख सकती है और वास्तविक स्प्रेड पर पैसा गँवा सकती है। स्लिपेज (स्प्रेड) और कमीशन हमेशा भरें।
- पर्याप्त ट्रेड इस्तेमाल करें। लगभग 30 ट्रेड से कम पर आँकड़े ज़्यादातर संयोग होते हैं। और कैंडल लोड करें या छोटा टाइमफ़्रेम इस्तेमाल करें।
- अतीत के अनुसार न ढालें। परिणाम परफ़ेक्ट होने तक कई इनपुट आज़माने से उस अवधि का शोर मिलता है, काम करने वाला नियम नहीं। इतिहास के एक हिस्से पर ट्यून करें, फिर वही इनपुट दूसरी अवधि और कुछ और टिकरों पर जाँचें।
- बाय-एंड-होल्ड से तुलना करें और केवल लाभ नहीं, ड्रॉडाउन भी देखें।
- चरम मानों पर नज़र रखें। अगर एक या दो ट्रेड ही सारा लाभ देते हैं, तो रणनीति किस्मत पर निर्भर है।
- पैसा जोखिम में डालने से पहले अभ्यास करें। रणनीति को पेपर ट्रेडिंग या बार रीप्ले पर आगे चलाएँ, और उसके सिग्नल के लिए अलर्ट लगाएँ।
बैक-टेस्ट पिछली बिड कैंडल इस्तेमाल करते हैं और स्वैप, फ़ाइनेंसिंग और बाज़ार के साथ बदलते स्प्रेड को अनदेखा करते हैं। पिछले नतीजे भविष्य के नतीजों की गारंटी नहीं देते। यह निवेश सलाह नहीं है।
सहेजें, साझा करें, प्रकाशित करें
- सहेजें (साइन इन होने पर) 50 रणनीतियों तक उनके इनपुट और सेटिंग के साथ रखता है; वे हर चार्ट की सूची में दिखती हैं।
- चार्ट से आइडिया प्रकाशित करें और रणनीति जोड़ें: पाठक आपका चार्ट खोलकर आपके इनपुट के साथ रणनीति ख़ुद चला सकते हैं। देखें आइडिया।
- किसी क्लब में अपनी टीम के साथ अपना विश्लेषण साझा करें।
- ट्रेड टैब पर CSV डाउनलोड करें ट्रेड को स्प्रेडशीट में निर्यात करता है।
- भारी शोध के लिए वही कैंडल प्राइस API (
GET /bars) से Python, R या Excel में लें।
सीमाएँ
| प्रति टेस्ट कैंडल | आगंतुक: चार्ट पर कैंडल। साइन इन: 20,000 तक (Premium प्लान इसे बढ़ा सकते हैं; देखें Premium). |
| स्क्रिप्ट | 50,000 अक्षर, 30 इनपुट, 12 बनाई गई लाइनें, 200 लॉग पंक्तियाँ, 5,000 सूचीबद्ध ट्रेड, 15 सेकंड का चलने का समय। |
| सहेजी गई रणनीतियाँ | प्रति खाता 50। |
| पोज़िशन | हर टेस्ट में एक समय में एक पोज़िशन (लॉन्ग, शॉर्ट या कोई नहीं); हर टेस्ट में एक टिकर और एक टाइमफ़्रेम। |
प्रश्न
क्या मुझे प्रोग्रामिंग आनी चाहिए?
नहीं। बिल्ट-इन रणनीतियाँ बिना कोड के काम करती हैं; आप केवल उनके इनपुट बदलते हैं। और चाहिए तो प्रति संपादित करें आपको एक चलती स्क्रिप्ट देता है जिसे एक-एक पंक्ति बदल सकते हैं, और ऊपर के उदाहरण आम बिल्डिंग ब्लॉक कवर करते हैं।
क्या यह Pine Script जैसा है?
विचार वही है (सीरीज़, इनपुट, प्लॉट, ऑर्डर), भाषा सादी JavaScript है। ज़्यादातर सरल Pine रणनीतियाँ पंक्ति-दर-पंक्ति बदल जाती हैं: ta.sma(close, 20) ta.sma(close, 20) ही रहता है, strategy.entry("L", strategy.long) long() बन जाता है, और स्क्रिप्ट का मुख्य भाग हर सीरीज़ के बाद [i] के साथ onBar(i) में जाता है।
क्या रणनीति मेरे लिए ट्रेड कर सकती है?
नहीं। कंसोल केवल पिछली कैंडल पर परखता है। किसी रणनीति को लाइव फ़ॉलो करने के लिए पेपर ट्रेडिंग और अलर्ट इस्तेमाल करें, या अपने प्रोग्राम से प्राइस API कॉल करें।
मेरा नतीजा किसी दूसरे प्लेटफ़ॉर्म से अलग क्यों है?
अलग कैंडल (बिड बनाम मिड कीमतें, ब्रोकर के सत्र समय), क्लोज़ के बजाय अगले ओपन पर भराव, लागत और टारगेट-से-पहले-स्टॉप नियम, सब नतीजे बदलते हैं। समान चीज़ों की तुलना करें।
क्या मेरा कोड निजी है?
हाँ। यह आपके ब्राउज़र में चलता है; यह आपके खाते में तभी रखा जाता है जब आप सहेजें दबाते हैं, और दूसरे इसे तभी देखते हैं जब आप इसे किसी आइडिया में प्रकाशित करते हैं।