गाइड · स्ट्रैटेजी टेस्टर

बैक-टेस्ट कंसोल: कोड से ट्रेडिंग रणनीतियाँ परखें

हर चार्ट पर रणनीति बटन है। यह एक कंसोल खोलता है जो पिछली कैंडल पर रणनीति दोहराता है और चार्ट पर हर ट्रेड, लाभ, ड्रॉडाउन, जीत दर और बाय-एंड-होल्ड के मुकाबले इक्विटी कर्व दिखाता है। बिल्ट-इन रणनीति से शुरू करें, फिर JavaScript की कुछ पंक्तियों में अपनी लिखें।

EURUSD पर कंसोल खोलें उदाहरणों पर जाएँ

डिज़ाइन से सुरक्षित। आपकी स्क्रिप्ट केवल आपके ब्राउज़र में, बिना इंटरनेट पहुँच वाले सैंडबॉक्स में चलती है: वह दी गई कैंडल पढ़ सकती है और कुछ नहीं (न आपका खाता, न यह साइट, न दूसरी वेबसाइटें)। आप जो लिखते हैं उसमें से कुछ भी हमारे सर्वरों पर नहीं चलता।

एक मिनट में शुरू करें

  1. कोई भी चार्ट खोलें, जैसे EURUSD, और परखने के लिए टाइमफ़्रेम चुनें (H1, D1…)।
  2. चार्ट के टूलबार में रणनीति दबाएँ। कंसोल चार्ट के नीचे खुलता है।
  3. कोई बिल्ट-इन रणनीति चुनें, जैसे मूविंग एवरेज क्रॉसओवर। यह तुरंत चलती है: चार्ट पर तीर हर एंट्री और एग्ज़िट दिखाते हैं।
  4. कोई इनपुट बदलें (जैसे धीमा औसत 30 से 50): टेस्ट अपने-आप फिर चलता है।
  5. कुल योग के लिए सारांश, हर ट्रेड के लिए ट्रेड, समय के साथ खाते के लिए इक्विटी कर्व पढ़ें।
  6. उसे अपनी स्क्रिप्ट बनाने के लिए प्रति संपादित करें दबाएँ, बदलें, और टेस्ट चलाएँ दबाएँ (या 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() केवल दिए गए स्टॉप अपडेट करता है।
  • हर भराव पर लागत। स्लिपेज हर भराव कीमत को आपके विरुद्ध खिसकाता है; कमीशन एंट्री और एग्ज़िट दोनों पर लगता है।
  • अंत। आख़िरी कैंडल के बाद भी खुला ट्रेड आख़िरी क्लोज़ पर बंद होता है और "अंत में अब भी खुला" चिह्नित होता है।
onBar(i): long() filled at this open candle i + 1

अपनी रणनीति लिखना

रणनीति दो हिस्सों वाला एक छोटा JavaScript प्रोग्राम है:

  1. ऊपरी हिस्सा एक बार चलता है: input() से अपने इनपुट पढ़ें, ta.* या ind() से पूरी सीरीज़ गणना करें, और plot() से उन्हें बनाएँ।
  2. 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")।
positiononBar के भीतर: 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इंडिकेटरइनपुट (डिफ़ॉल्ट)रेखाएँ
maMoving Averageperiod: 20, method: SMA, price: close, shift: 0MA
amaAdaptive Moving Averageperiod: 9, fast: 2, slow: 30, price: closeAMA
adxAverage Directional Movement Indexperiod: 14ADX, +DI, −DI
adxwADX Wilderperiod: 14ADX, +DI, −DI
bbBollinger Bandsperiod: 20, dev: 2, price: close, shift: 0Middle, Upper, Lower
demaDouble Exponential Moving Averageperiod: 14, price: closeDEMA
envEnvelopesperiod: 14, method: SMA, dev: 0.1, price: closeUpper, Lower
framaFractal Adaptive Moving Averageperiod: 14, price: closeFrAMA
ichimokuIchimoku Kinko Hyotenkan: 9, kijun: 26, senkou: 52Tenkan, Kijun, Span A, Span B, Chikou
sarParabolic SARstep: 0.02, max: 0.2SAR
stddevStandard Deviationperiod: 20, method: SMA, price: closeStdDev
temaTriple Exponential Moving Averageperiod: 14, price: closeTEMA
vidyaVariable Index Dynamic Averagecmo: 9, ema: 12, price: closeVIDYA
atrAverage True Rangeperiod: 14ATR
bearsBears Powerperiod: 13Bears
bullsBulls Powerperiod: 13Bulls
cciCommodity Channel Indexperiod: 14, price: typicalCCI
chaikinChaikin Oscillatorfast: 3, slow: 10, method: EMACHO
demarkerDeMarkerperiod: 14DeMarker
forceForce Indexperiod: 13, method: SMAForce
macdMACDfast: 12, slow: 26, signal: 9, price: closeMACD, Signal
momentumMomentumperiod: 14, price: closeMomentum
osmaMoving Average of Oscillatorfast: 12, slow: 26, signal: 9, price: closeOsMA
rsiRelative Strength Indexperiod: 14, price: closeRSI
rviRelative Vigor Indexperiod: 10RVI, Signal
stochStochastic Oscillatork: 5, d: 3, slowing: 3, method: SMA%K, %D
trixTriple Exponential Averageperiod: 14, price: closeTRIX
wprWilliams' Percent Rangeperiod: 14%R
adAccumulation/Distributionकोई नहींA/D
mfiMoney Flow Indexperiod: 14MFI
obvOn Balance Volumeकोई नहींOBV
volumesVolumesकोई नहींVolume
acAccelerator Oscillatorकोई नहींAC
alligatorAlligatorjaw: 13, jawShift: 8, teeth: 8, teethShift: 5, lips: 5, lipsShift: 3Jaw, Teeth, Lips
aoAwesome Oscillatorकोई नहींAO
fractalsFractalsकोई नहींUp, Down
gatorGator Oscillatorjaw: 13, teeth: 8, lips: 5Upper, Lower
bwmfiMarket Facilitation Indexकोई नहींBW MFI
zigzagZigZagdepth: 12, dev: 0.3ZigZag
vwapVWAP (volume-weighted average price)कोई नहींVWAP
supertrendSuperTrendperiod: 10, mult: 3Up trend, Down trend
keltnerKeltner Channelsperiod: 20, atr: 10, mult: 2Middle, Upper, Lower
donchianDonchian Channelsperiod: 20Upper, Lower, Middle
hmaHull Moving Averageperiod: 20, price: closeHMA
pivotsPivot Points (classic)कोई नहींP, R1, S1, R2, S2, R3, S3
stochrsiStochastic RSIrsi: 14, stoch: 14, k: 3, d: 3%K, %D
aroonAroonperiod: 25Aroon up, Aroon down
cmfChaikin Money Flowperiod: 20CMF
uoUltimate Oscillatorp1: 7, p2: 14, p3: 28UO
chopChoppiness Indexperiod: 14CHOP
vwmaVolume-Weighted Moving Averageperiod: 20VWMA
zlemaZero-Lag Exponential Moving Averageperiod: 21, price: closeZLEMA
almaArnaud Legoux Moving Averageperiod: 9, offset: 0.85, sigma: 6, price: closeALMA
mcginleyMcGinley Dynamicperiod: 14McGinley
lsmaLeast Squares Moving Averageperiod: 25, price: closeLSMA
chandelierChandelier Exitperiod: 22, mult: 3Long exit, Short exit
rocRate of Changeperiod: 12ROC
cmoChande Momentum Oscillatorperiod: 9CMO
tsiTrue Strength Indexlong: 25, short: 13, signal: 13TSI, Signal
ppoPercentage Price Oscillatorfast: 12, slow: 26, signal: 9Histogram, PPO, Signal
dpoDetrended Price Oscillatorperiod: 20DPO
kstKnow Sure Thingsignal: 9KST, Signal
vortexVortex Indicatorperiod: 14VI+, VI−
eomEase of Movementperiod: 14EOM
massMass Indexema: 9, sum: 25Mass Index
coppockCoppock Curvewma: 10, long: 14, short: 11Coppock
hvHistorical Volatilityperiod: 20HV %
fisherFisher Transformperiod: 9Fisher, Trigger
squeezeSqueeze Momentumbb: 20, bbk: 2, kc: 20, kck: 1.5Momentum, Squeeze on, Squeeze off
crsiConnors RSIrsi: 3, streak: 2, rank: 100CRSI
pvtPrice 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 कॉल करें।

मेरा नतीजा किसी दूसरे प्लेटफ़ॉर्म से अलग क्यों है?

अलग कैंडल (बिड बनाम मिड कीमतें, ब्रोकर के सत्र समय), क्लोज़ के बजाय अगले ओपन पर भराव, लागत और टारगेट-से-पहले-स्टॉप नियम, सब नतीजे बदलते हैं। समान चीज़ों की तुलना करें।

क्या मेरा कोड निजी है?

हाँ। यह आपके ब्राउज़र में चलता है; यह आपके खाते में तभी रखा जाता है जब आप सहेजें दबाते हैं, और दूसरे इसे तभी देखते हैं जब आप इसे किसी आइडिया में प्रकाशित करते हैं।