რას აკეთებს request.security და როდის არის ის საჭირო?
მთავარი
ფუნქცია თქვენს გამოსახულებას სხვა სიმბოლოს ან სხვა ტაიმფრეიმის კონტექსტში უშვებს და შედეგს მიმდინარე ბარზე აბრუნებს. ის საჭიროა, როცა სკრიპტმა საკუთარი გრაფიკის ფარგლებს მიღმაც უნდა გაიხედოს: დღიური ტრენდის ფილტრი, ინდექსთან შედარება, უმცროსი მასშტაბის მოცულობა. საკუთარ გრაფიკში შესასრულებელი გამოთვლებისთვის ის ზედმეტია.
ნაგულისხმევად სკრიპტი სანთლების ზუსტად ერთ ნაკრებს ხედავს — იმას, რომელიც ეკრანზეა გახსნილი. როგორ გადის ის მათ და რატომ ითვლის მნიშვნელობებს ბარიდან ბარამდე, განხილულია მასალაში იმის შესახებ, როგორ ითვლის Pine Script მნიშვნელობებს ბარების მიხედვით. იქვე გულწრფელად იყო აღნიშნული გამოტოვებაც: მინიმალური მაგალითი განზრახ არაფერს ითხოვდა გარედან. ახლა სწორედ ამ გამოტოვებას შევავსებთ.
request.security-ის მეშვეობით მოთხოვნა სრულიად კონკრეტულ ამოცანებს წყვეტს. თხუთმეტწუთიან გრაფიკზე მუშაობისას შესვლის გაფილტვრა დღიური ტრენდის მიმართულებით. ალტკოინის გრაფიკზე ბიტკოინის ქცევის დატანა. ინდიკატორის ერთდროულად ოთხ ინსტრუმენტზე გამოთვლა და გასაშუალოება. ყველა ამ შემთხვევაში გამოთვლა სწორედ იქ, სხვა კონტექსტში უნდა შესრულდეს, თქვენამდე კი უკვე მზა რიცხვი უნდა მოვიდეს.
ცალკე უნდა დაიმახსოვროთ შემთხვევებიც, როდესაც მონაცემების მოთხოვნა საჭირო არ არის. თუ გამოსახულება თქვენი გრაფიკის სანთლების მიხედვით ითვლება, არავითარი მოთხოვნა არ გჭირდებათ: დაწერეთ ჩვეულებრივი ფორმულა. TradingView-ის ოფიციალურ FAQ-ში პირდაპირ წერია, რომ საკუთარი სიმბოლოსა და საკუთარი ტაიმფრეიმის მოთხოვნას, როგორც წესი, აზრი არ აქვს: უფრო მარტივია, საკუთარი გრაფიკის მნიშვნელობებს მიმართოთ.
გამოგადგებათ, თუ
- უფროსი ტაიმფრეიმის ტრენდის ფილტრი: ვაჭრობთ 15m-ზე, ნებართვას კი 1D-დან ვიღებთ
- თქვენი ინსტრუმენტის შედარება ინდექსთან, დოლარის ინდექსთან ან სხვა წყვილთან
- საკუთარი ინდექსისთვის ერთი ინდიკატორის ერთდროულად სიმბოლოების სიაზე შეგროვება
- გრაფიკის სანთლის შიგნით მოცულობის ან ინტრაბარების რაოდენობის დათვლა
არ გამოგადგებათ, თუ
- მიმდინარე გრაფიკის სანთლებზე რაიმე ფორმულას ითვლით: გამოთვალეთ პირდაპირ, მოთხოვნის გარეშე
- ცდილობთ უფროსი ბარის დახურვა გამოძახების შიგნით ბარის მდგომარეობით დაიჭიროთ
- რისკის მართვის ჩანაცვლება გსურთ: სხვა მონაცემები წესს უფრო უსაფრთხოს არ ხდის
- სკრიპტის აჩქარება გსურთ: თითოეული უნიკალური მოთხოვნა დროსა და ლიმიტში ადგილს იკავებს
როგორ არის მოწყობილი სამი არგუმენტი: symbol, timeframe და expression?
მთავარი
გამოძახება მკაცრი თანმიმდევრობით განლაგებული სამი სავალდებულო ნაწილისგან შედგება. ჯერ სიმბოლო, შემდეგ ტაიმფრეიმის სტრიქონი, შემდეგ კი გამოსახულება. დანარჩენი არგუმენტები არასავალდებულოა და სახელით გადაეცემა. პოზიციური ჩანაწერისას პირველი სამის თანმიმდევრობის შეცვლა არ შეიძლება და სწორედ აქ უშვებენ შეცდომას, როდესაც ფორუმიდან სხვის კოდს გაურკვევლად აკოპირებენ. ეს თანმიმდევრობა სკრიპტის პირველივე გაშვებამდე უნდა გადაამოწმოთ.
ოფიციალურ დოკუმენტაციაში სრული სიგნატურა ასეა ჩაწერილი:
request.security(symbol, timeframe, expression, gaps, lookahead, ignore_invalid_symbol, currency, calc_bars_count)პირველი სამი ნაწილი სამუშაო მინიმუმია. სიმბოლო ტიკერის შემცველი სტრიქონია, სასურველია სავაჭრო პლატფორმასთან ერთად: დოკუმენტაცია ბირჟის პრეფიქსის მითითებას გვირჩევს, რადგან სხვაგვარად სისტემა მას თავად შეარჩევს და შედეგი შესაძლოა მოსალოდნელისგან განსხვავდებოდეს. მიმდინარე ინსტრუმენტისთვის არსებობს მზა ცვლადი syminfo.tickerid; ორაზროვნების თავიდან ასაცილებლად სწორედ მის გამოყენებას გვირჩევენ.
- 1
symbol — საიდან ვიღებთ
ტიკერი ბირჟის პრეფიქსით ან საკუთარი გრაფიკის syminfo.tickerid
- 2
timeframe — რომელ მასშტაბში
1D, 60, 15 ტიპის სტრიქონი. ცარიელი მნიშვნელობა გრაფიკის ტაიმფრეიმს ნიშნავს
- 3
expression — რა გამოვთვალოთ
სხვა კონტექსტში ითვლება და მზა სახით არ გადაიტანება
ტაიმფრეიმის სტრიქონს უკავშირდება შეცდომა, რომელსაც თითქმის ყველა აწყდება. ფორმატი შედგება მამრავლისა და ერთეულის ასოსგან, თუმცა წუთებს ასო საერთოდ არ აქვს: "15" თხუთმეტი წუთია, "1D" — დღე, "1W" — კვირა. ამ ნაკრებში საათი უბრალოდ არ არსებობს. დოკუმენტაცია ცალსახად ამბობს: "1H" არავალიდურია, საათის სწორი ჩანაწერია "60".
მესამე ნაწილი — გამოსახულება — ყველაზე მეტად დაუფასებელია. ის გამოთვლილი სახით არ გადაიტანება; ხელახლა გამოითვლება იქ, მოთხოვნილი სიმბოლოს კონტექსტში. თუ დაწერთ ta.sma(close, 20), საშუალო სხვა სიმბოლოს დახურვის ფასების მიხედვით გამოითვლება და არა თქვენის მიხედვით. სწორედ ეს არის საჭირო და სწორედ ეს უკვირს ადამიანს, რომელიც მზა მნიშვნელობის გადატანას ელოდა.
როგორ მოვითხოვოთ სხვა სიმბოლოს მონაცემები?
მთავარი
საკუთარი სიმბოლოს ნაცვლად უთითებთ ტიკერს, ტოვებთ გრაფიკის ტაიმფრეიმს და თქვენს თითოეულ ბარზე სხვა ინსტრუმენტის მნიშვნელობას იღებთ. იმავე ტაიმფრეიმზე სხვა სიმბოლოს მოთხოვნა გადახატვას არ იწვევს. ერთადერთი ხაფანგი დროის ღერძია: სხვა ინსტრუმენტის მონაცემები მხოლოდ მაშინ განახლდება, როდესაც თქვენი გრაფიკი განახლდება.
მინიმალური სამუშაო მაგალითი ფაქტობრივად ერთ ხაზში ეტევა. შემდეგ ის შეიძლება გრაფიკზე გამოიტანოთ ან საკუთარ ფასს შეადაროთ:
//@version=6
indicator("სხვა სიმბოლო საკუთარ ტაიმფრეიმზე")
float otherClose = request.security("NASDAQ:AAPL", timeframe.period, close)
plot(otherClose)სად უნდა ჩასვათ ეს კოდი და როგორ შეინახოთ, ახსნილია ცალკე ინსტრუქციაში იმის შესახებ, როგორ გავხსნათ Pine Editor და შევინახოთ სკრიპტი. აქ ღილაკებზე უფრო მნიშვნელოვანი ქცევაა.
ოფიციალური FAQ დამწყების მთავარ შიშს აქარწყლებს: გრაფიკის ტაიმფრეიმზე სხვა სიმბოლოს მონაცემების მოთხოვნა გადახატვას არ იწვევს. ამ შემთხვევაში მნიშვნელობის გადაადგილება და არასავალდებულო არგუმენტების შეცვლა საჭირო არ არის.
თუმცა დროის ღერძი კვლავ თქვენია. დოკუმენტაციაში მოყვანილია თვალსაჩინო მაგალითი: SPY-ის გრაფიკზე BTCUSD-ის მონაცემები ახალ მნიშვნელობას მხოლოდ მაშინ აჩვენებს, როცა ახალი ბარი თავად SPY-ზე გაჩნდება. უქმეებიანი ინსტრუმენტის გრაფიკზე სადღეღამისო ინსტრუმენტი მთელი შაბათის განმავლობაში ერთ ადგილზე დარჩება. ეს შეფერხება კი არა, მონაცემთა ორი მწკრივის დაკავშირების თვისებაა.
როგორ მივიღოთ უფროსი ტაიმფრეიმის მონაცემები request.security-ის მეშვეობით?
მთავარი
გრაფიკის ტაიმფრეიმის ნაცვლად უთითებთ უფროსი მასშტაბის, მაგალითად დღიურ სტრიქონს. აუცილებლად დაამატეთ დაცვა საპირისპირო შემთხვევისთვის: თუ მომხმარებელი გრაფიკზე დაბალ მასშტაბს აირჩევს, სკრიპტი გასაგები შეცდომით უნდა შეჩერდეს. Pine Script-ის ოფიციალური მაგალითები ასეთ შემოწმებას პირდაპირ შაბლონში რთავს. მის გარეშე სკრიპტი უხმოდ გამოთვლის სრულიად სხვა რამეს, ვიდრე ელოდით.
კლასიკური ამოცანა ასე ჟღერს: ვვაჭრობ თხუთმეტწუთიან გრაფიკზე, შესვლას კი მხოლოდ დღიური ტრენდის მიმართულებით ვუშვებ. თავად ფილტრი შეიძლება ნებისმიერი იყოს; ტრენდის ინდიკატორის მორგების გარეშე არჩევა ცალკე სამუშაოა. მოთხოვნის მექანიკა კი ყოველთვის ერთნაირია.
ასეთი სკრიპტი ეტაპობრივად ასე ეწყობა:
- ტაიმფრეიმისთვის შემავალი პარამეტრი შექმენით, რათა მასშტაბი კოდში სამუდამოდ არ ჩაიკეროს.
- დაამატეთ შემოწმება: თუ არჩეული მასშტაბი გრაფიკის მასშტაბზე დაბალია, გამოიძახეთ
runtime.error()ადამიანისთვის გასაგები ტექსტით. - დაწერეთ თავად მოთხოვნა უფროსი ტაიმფრეიმის სტრიქონით.
- შედეგი გრაფიკზე გამოიტანეთ, რათა საფეხურები თვალით დაინახოთ.
//@version=6
indicator("დღიური საშუალო უმცროს გრაფიკზე", overlay = true)
string htf = input.timeframe("1D", "უფროსი ტაიმფრეიმი")
if timeframe.in_seconds() > timeframe.in_seconds(htf)
runtime.error("არჩეული ტაიმფრეიმი გრაფიკის ტაიმფრეიმზე დაბალია. აირჩიეთ უფროსი.")
float htfMa = request.security(syminfo.tickerid, htf, ta.sma(close, 20))
plot(htfMa)ხაზი საფეხუროვანი გამოვა და ეს ნორმალურია: მნიშვნელობა თითო დღიურ ბარზე ერთხელ ახლდება და არა ყოველ თხუთმეტ წუთში. კითხვა „როგორ გავასწოროთ საფეხურები“ ფორუმებზე წლებია მეორდება, მაგრამ აქ გასასწორებელი არაფერია — უმცროს მასშტაბზე განახლებებს შორის დღიური მნიშვნელობა უბრალოდ არ არსებობს.
რატომ იცვლება უფროსი ტაიმფრეიმის მნიშვნელობა დაუხურავ ბარზე?
მთავარი
იმიტომ, რომ დღიური ბარი ჯერ არ დახურულა და მისი დახურვის ფასი მიმდინარე ფასთან ერთად იცვლება. ისტორიულ მონაცემებზე ფუნქცია მხოლოდ დადასტურებულ მნიშვნელობებს აბრუნებს, რეალურ დროში კი — ცოცხალ მნიშვნელობებს. გვერდის გადატვირთვის შემდეგ გუშინდელი ცოცხალი მნიშვნელობები დადასტურებულად გადაიქცევა და სურათი შეიცვლება. ეს request.security-ის ჩვეულებრივი ქცევაა. შესაძლოა თქვენს კოდში საერთოდ არ იყოს შეცდომა.
ამ ქცევას თავისი სახელი აქვს — გადახატვა. TradingView მას ფართოდ განსაზღვრავს: სკრიპტის ქცევა, როდესაც ისტორიულ მონაცემებსა და რეალურ დროში გამოთვლები განსხვავებულად მუშაობს. იქვე პანიკას შეფასებითაც აქარწყლებენ: მათი ვარაუდით, არსებული ინდიკატორების ოთხმოცდათხუთმეტ პროცენტზე მეტი ამა თუ იმ ფორმით გადაიხატება, მათ შორის MACD და RSI დაუხურავ სანთელზე.
დოკუმენტაცია მექანიკას პირდაპირ აღწერს. ისტორიულ ბარებზე ფუნქცია მოთხოვნილი კონტექსტიდან მხოლოდ დადასტურებულ მნიშვნელობებს აბრუნებს, რეალური დროის ბარებზე კი შეიძლება დაუდასტურებელი მნიშვნელობებიც დააბრუნოს. როდესაც სკრიპტი ხელახლა იშვება, გუშინდელი რეალური ბარები ისტორიული ხდება და მათზე მნიშვნელობები დადასტურებულით იცვლება.
00:00
დღიური ბარი გაიხსნა
მოთხოვნა დღის მიმდინარე დახურვის ფასს დააბრუნებს, რომელიც მიმდინარე ფასის ტოლია
დღის განმავლობაში
მნიშვნელობა ცოცხალია და იცვლება
ყოველი ახალი ფასი დაუხურავი დღიური ბარის დახურვის ფასს ცვლის
სიგნალი გრაფიკზე
მარკერი გამოჩნდა და ადგილზეა
პირობა შესრულებულია მიმდინარე, ჯერ კიდევ დაუდასტურებელი მნიშვნელობის მიხედვით
23:59
დღიური ბარი დაიხურა
მნიშვნელობა დაფიქსირდა და აღარ შეიცვლება
გადატვირთვის შემდეგ
ისტორია გადაიწერა
სკრიპტი მხოლოდ დადასტურებულ მნიშვნელობას ხედავს და მარკერების ნაწილი ქრება
პრაქტიკული დასკვნა უსიამოვნო, მაგრამ გულწრფელია. სანამ ცოცხალ გრაფიკს უყურებთ, ხედავთ არა იმას, რასაც ხვალ სკრიპტი იმავე ისტორიულ მონაკვეთზე დაინახავს. სწორედ აქედან წარმოიშობა სხვაობა ლამაზ სურათსა და სავაჭრო ალგორითმის შემოწმების შედეგს შორის.
გაარჩიეთ ინსტრუმენტი პრაქტიკაში Midas-თან ერთად
Midas-ის ეკოსისტემაში არის ნაბიჯ-ნაბიჯ ინსტრუქციები, ტექნიკური ანალიზის სწავლება და საზოგადოების მხარდაჭერა — პირველი გაშვებიდან საკუთარი სავაჭრო ლოგიკის განხილვამდე.
- პროდუქტის ნაბიჯ-ნაბიჯ ინსტრუქციები
- ტექნიკური ანალიზის სტრუქტურირებული სწავლება
- ჩატი გუნდთან და კლუბის წევრებთან
როგორ მივიღოთ უფროსი ტაიმფრეიმის დადასტურებული მნიშვნელობა მომავალში გახედვის გარეშე?
მთავარი
ოფიციალური მეთოდი ერთდროულად ორი ნაწილისგან შედგება. გამოსახულება ერთი ბარით უკან გადაადგილდება და იმავდროულად lookahead არგუმენტი on მდგომარეობაში ირთვება. ცალ-ცალკე ეს ორი ნაწილი არ მუშაობს: გადაადგილება lookahead-ის გარეშე აგვიანებს, lookahead გადაადგილების გარეშე კი მომავალ მონაცემებს მოაქვს. Pine Script-ის დოკუმენტაცია ამ ორ ნაწილს ურთიერთდამოკიდებულს უწოდებს.
დოკუმენტაციაში ფორმულირება ასეთია: გადახატვის არმქონე შედეგის მისაღებად ყველაზე საიმედო გზა არის მხოლოდ წარსულ ბარებზე მიმთითებელი გამოსახულების გადაცემა და ამავე დროს lookahead = barmerge.lookahead_on-ის დაყენება. იქვე ამ კავშირზე მკაცრადაა ნათქვამი: გადაადგილება და lookahead ურთიერთდამოკიდებულია და ერთ-ერთის ამოღება მეორისთვის ზიანის მიუყენებლად შეუძლებელია.
//@version=6
indicator("დადასტურებული დღიური დახურვის ფასი", overlay = true)
float dailyClose = request.security(syminfo.tickerid, "1D", close[1], lookahead = barmerge.lookahead_on)
plot(dailyClose)ლოგიკა ისეთი რთული არ არის, როგორიც ჩანს. on მდგომარეობაში ჩართული lookahead არგუმენტი ფუნქციას საშუალებას აძლევს, მნიშვნელობა იმ უფროსი ბარიდან აიღოს, რომელიც თქვენი ბარის მომენტისთვის ჯერ არ დასრულებულა. ერთი ბარით გადაადგილება მოთხოვნას ზუსტად იმდენად სწევს, რომ ის უკვე დახურულ უფროს ბარში მოხვდეს. მომავალი აღარ რჩება — რჩება დადასტურებული წარსული.
იგივე lookahead გადაადგილების გარეშე საკუთარი თავის წინააღმდეგ მიმართულ იარაღად იქცევა. დოკუმენტაციაში მოყვანილია ანტიმაგალითი კომენტარით „FUTURE LEAK, არ გამოიყენოთ“ და ცალკეა გაფრთხილება: სკრიპტები, რომლებიც lookahead-ის მეშვეობით მომავალს წარსულში გადაიტანენ, გამოსაქვეყნებლად არ დაიშვება. ბექტესტზე ასეთი კოდი ფანტასტიკურ სტატისტიკას აჩვენებს. რეალურ ანგარიშზე კი არაფერს აჩვენებს.
მხოლოდ დადასტურებული უფროსი ბარი
მონაცემები, რომლებიც იმ ბარზე ჯერ არ არსებობდა
- 1.გადაადგილება და ჩართული lookahead
- 2.ნაგულისხმევი პარამეტრები, ცოცხალი ბარი
- 3.lookahead ჩართულია გადაადგილების გარეშე
სკალის შუა ნიშნული ნაგულისხმევი მდგომარეობაა და ის მოტყუება არ არის: ფუნქცია ზუსტად აბრუნებს იმას, რაც უფროს კონტექსტში ამ მომენტში არსებობს. მარჯვენა ნიშნული კი უკვე გაყალბებაა, რადგან ისტორიულ ბარზე სკრიპტში მომავლის მონაცემები ხვდება.
ცალკე ხაფანგი ელოდება მათ, ვინც უფროსი ბარის დახურვის უშუალოდ დაფიქსირებას ცდილობს. მოთხოვნის შიგნით ბარის მდგომარეობა არ მუშაობს: დოკუმენტაციაში ეს ერთ ხაზადაა დაფიქსირებული — barstate.isconfirmed გამოძახებაში request.security() არ მუშაობს. საზოგადოების ნაწილი ამას საკუთარი გარსებით უვლის გვერდს და გადაადგილებას გამოძახების გარეთ, ბარის მდგომარეობის მიხედვით ცვლის. ორივე მიდგომა დადასტურებულ მნიშვნელობას იძლევა, მაგრამ გრაფიკზე მისი გამოჩენის მომენტი განსხვავებულია: ოფიციალური მეთოდი დახურულ უფროს ბარს ახალი უფროსი პერიოდის დაწყებისთანავე აბრუნებს, საზოგადოების გარსების ქცევა კი დოკუმენტაციაში აღწერილი არ არის და ის საკუთარ გრაფიკზე თვალით უნდა შეამოწმოთ. იმის გარჩევა, თუ როგორ განვასხვაოთ სანდო სიგნალი მოგვიანებით გადაადგილებულისგან, განხილულია მასალაში ინდიკატორები გადახატვის გარეშე.
რით განსხვავდება barmerge.gaps_on barmerge.gaps_off-ისგან?
მთავარი
gaps არგუმენტი განსაზღვრავს, რა გამოჩნდეს იმ ბარებზე, სადაც უფროს კონტექსტს ახალი დადასტურებული მნიშვნელობა ჯერ არ აქვს. off მდგომარეობაში ფუნქცია ბოლო ცნობილ მნიშვნელობას იმეორებს, on მდგომარეობაში კი ცარიელ მნიშვნელობას აბრუნებს. ნაგულისხმევად დაყენებულია off, ამიტომ უფროსი ტაიმფრეიმის ხაზი საფეხუროვნად გამოიყურება. ამ არგუმენტის შეცვლა იშვიათად და ყოველთვის გააზრებულადაა საჭირო.
განსხვავება ერთ ცხრილში ჩანს:
| რას ვადარებთ | barmerge.gaps_off | barmerge.gaps_on |
|---|---|---|
| ნაგულისხმევი მნიშვნელობაა | დიახ | არა |
| ბარი ახალი მნიშვნელობის გარეშე | იმეორებს ბოლო დადასტურებულ მნიშვნელობას, ცოცხალ ბარზე კი — მიმდინარე, ჯერ ჩამოყალიბებად მნიშვნელობას | აბრუნებს ცარიელ მნიშვნელობას |
| როგორ გამოიყურება გრაფიკზე | უწყვეტი საფეხუროვანი ხაზი | წერტილები მხოლოდ განახლების მომენტებში |
| როდის არის მოსახერხებელი | ფილტრები, შედარებები, ნებისმიერი „ზემოთ ან ქვემოთ“ ტიპის ლოგიკა | უფროსი ბარის განახლების ფაქტის მონიშვნა |
| რას არღვევს | მალავს განახლების მომენტს | ცარიელ მნიშვნელობებთან არითმეტიკა შემოწმებას მოითხოვს |
//@version=6
indicator("gaps თვალით", overlay = true)
float noGaps = request.security(syminfo.tickerid, "60", close, gaps = barmerge.gaps_off)
float withGaps = request.security(syminfo.tickerid, "60", close, gaps = barmerge.gaps_on)
plot(noGaps, "წყვეტების გარეშე", color.blue, 2, plot.style_linebr)
plot(withGaps, "წყვეტებით", color.purple, 6, plot.style_linebr)არჩევანი მარტივია. „ფასი დღიურ საშუალოზე მაღლაა“ ტიპის პირობებისთვის გამოიყენეთ ნაგულისხმევი მდგომარეობა: მნიშვნელობა თითოეულ ბარზე გჭირდებათ. ცარიელი მნიშვნელობები მაშინ დაგჭირდებათ, როდესაც მნიშვნელოვანია ახალი მონაცემების მოსვლის თავად მომენტი, მაგალითად ახალი უფროსი პერიოდის დაწყებისას მარკერის დასასმელად.
რატომ არის request.security მოუხერხებელი უმცროსი ტაიმფრეიმისთვის?
მთავარი
უმცროსი მასშტაბიდან ფუნქცია თქვენს თითოეულ ბარზე მხოლოდ ერთ ინტრაბარს დააბრუნებს; კონკრეტულად რომელს — პირველს თუ უკანასკნელს — lookahead არგუმენტი განსაზღვრავს. ყველა ინტრაბართან სამუშაოდ Pine Script-ში არსებობს ცალკე ფუნქცია, რომელიც მნიშვნელობების მასივს აბრუნებს. მისი სახელი request.security-ისგან მხოლოდ დაბოლოებით განსხვავდება, ამიტომ მათი არევა ადვილია.
დოკუმენტაციაში ეს ქცევა შელამაზების გარეშეა აღწერილი. უმცროს მასშტაბზე მიმართვისას ფუნქცია გამოსახულებას უმცროს კონტექსტში ითვლის, მაგრამ გრაფიკის თითოეულ ბარზე მხოლოდ ერთი ინტრაბარის შედეგს აბრუნებს. on მდგომარეობაში ჩართული lookahead-ის შემთხვევაში ეს პირველი ხელმისაწვდომი ინტრაბარია, off მდგომარეობაში კი — ბოლო. რეალური დროის ბარებზე უკანასკნელი ხელმისაწვდომი მნიშვნელობა არგუმენტისგან დამოუკიდებლად ბრუნდება.
ბარისშიდა მონაცემებთან სრულფასოვანი მუშაობისთვის არსებობს request.security_lower_tf(). მისი სიგნატურა განსხვავებულია: gaps და lookahead არგუმენტები არ აქვს, სამაგიეროდ აქვს ignore_invalid_timeframe, რომელიც ნაგულისხმევად გამორთულია. ფუნქცია ინტრაბარების დროის მიხედვით დალაგებულ მნიშვნელობათა მასივს აბრუნებს.
//@version=6
indicator("რამდენი ერთწუთიანი ბარია ერთ ბარში")
array<float> closes = request.security_lower_tf(syminfo.tickerid, "1", close)
int qty = array.size(closes)
plot(qty, style = plot.style_histogram)ელემენტებზე მიმართვამდე მასივის ზომა უნდა შეამოწმოთ — ეს ფორუმებზე ხშირი შეცდომაა: ადამიანი მაშინვე პირველ ელემენტს იღებს და სკრიპტი შეცდომით ჩერდება, რადგან მასივი ცარიელი აღმოჩნდა. კიდევ ერთი გულწრფელი შენიშვნა თავად TradingView-ისგან: მონაცემთა მომწოდებლებს შორის განსხვავებების გამო ზოგიერთ შემთხვევაში ამ ფუნქციასაც შეუძლია მცირედ გადაიხატოს.
როგორ შევამოწმოთ კოდი გადატვირთვის შემდეგ ისტორიულ მონაცემებსა და რეალურ დროში?
მთავარი
რიტუალი ხუთი ნაბიჯისგან შედგება და რამდენიმე წუთს იკავებს. ინიშნავთ, სად დგას მარკერები ცოცხალ გრაფიკზე, ტვირთავთ გვერდს ხელახლა და ადარებთ მიღებულ შედეგს. დაემთხვა — ამ მონაკვეთზე კოდი სანდოა. არ დაემთხვა — გადახატვა გაქვთ და ნებისმიერი დასკვნის გაკეთებამდე ის უნდა გამოასწოროთ.
შემოწმება სწორედ იმიტომ არის საჭირო, რომ განსხვავებას თვალით ვერ დაიჭერთ: ცოცხალი გრაფიკიც და გადატვირთვის შემდეგ იგივე გრაფიკიც თანაბრად დამაჯერებლად გამოიყურება. მსგავსი read-back რიტუალი აღწერილია გადატვირთვის შემდეგ სიგნალის შემოწმების განხილვაშიც; აქ ის სხვა მონაცემებისთვისაა ადაპტირებული.
- 1
მნიშვნელობების ლოგის ჩართვა
log.info() მოთხოვნილ მნიშვნელობასა და ბარის დროს გამოიტანს
- 2
ცოცხალი გრაფიკის სურათის გადაღება
ბოლო სამი მარკერის დროისა და ლოგის მნიშვნელობების ჩაწერა
- 3
გვერდის გადატვირთვა
რეალური დროის ბარები ისტორიული ხდება და სკრიპტი თავიდან ითვლის
- 4
მარკერებისა და მნიშვნელობების შედარება
იმავე სამი მარკერისა და ლოგის იმავე მნიშვნელობების გადამოწმება
- 5
უქმეების მონაცემებზე გამეორება
იმ მონაკვეთის ცალკე შემოწმება, სადაც სხვა სიმბოლოს მონაცემებში გამოტოვებები იყო
წინასწარ უნდა შეთანხმდეთ, რა ჩაითვლება ჩავარდნად. მარკერის ერთი ბარით გადაადგილება გადახატვაა და არა წვრილმანი. გამქრალი მარკერიც გადახატვაა. თუ მარკერები დაემთხვა, მაგრამ ლოგის მნიშვნელობები განსხვავდება, ესეც სიგნალია: პირობა ჯერ მხოლოდ შემთხვევით ნარჩუნდება.
ცალკე შეამოწმეთ ქცევა სავაჭრო სესიების საზღვარზე და უქმეებზე. სწორედ იქ სცილდება ერთმანეთს ორი ინსტრუმენტის დროის ღერძები და სწორედ იქ ირღვევა ლოგიკა, რომელიც თანაბარ ისტორიულ მონაკვეთზე მუშაობდა. როგორ ჩავრთოთ ასეთი შემოწმება სრულ წესებში, განხილულია მასალაში სტრატეგიაში შესვლისა და გამოსვლის წესები.
რისკები და შეზღუდვები
პასუხისმგებლობის შეზღუდვა. მასალა საგანმანათლებლო ხასიათისაა და არ წარმოადგენს ინდივიდუალურ საინვესტიციო რეკომენდაციას. გარიგებებთან დაკავშირებულ გადაწყვეტილებებს დამოუკიდებლად იღებთ; ფინანსურ ბაზრებზე ვაჭრობა ჩადებული სახსრების დაკარგვის რისკთანაა დაკავშირებული.
სწორად დაწერილი მოთხოვნა წარსულს აღარ გააყალბებს, მაგრამ ამის გამო სიგნალი უფრო ზუსტი არ ხდება. სკრიპტი, რომელიც გადატვირთვის შემდეგ იმავეს აჩვენებს, სანდოა — თუმცა სანდოობა და მომგებიანობა სხვადასხვა თვისებაა და პირველი მეორეს არ უზრუნველყოფს.
მონაცემები მომწოდებლისგან მოდის და სკრიპტში არ იქმნება. TradingView პირდაპირ აღნიშნავს, რომ მონაცემებს თავად არ გენერირებს და საკუთარ მომწოდებლებს ეყრდნობა. დღიური და დღისშიდა მონაცემთა ნაკადები შეიძლება მოცულობით განსხვავდებოდეს, ხოლო გაფართოებული სესია დღიურ ნაკადში არ ხვდება. აქციებზე ეს შესამჩნევია, სადღეღამისო ინსტრუმენტებზე კი თითქმის არა.
მოთხოვნების რაოდენობა შეზღუდულია და ლიმიტი ტარიფზეა დამოკიდებული. ერთნაირი გამოძახებები, როგორც წესი, ერთ მოთხოვნად ითვლება, მაგრამ იმპორტირებული ბიბლიოთეკების შიგნით არსებული გამოძახებები ცალკე ითვლება. სკრიპტი, რომელიც ათი სიმბოლოს მონაცემებს ითხოვს, ზღვარს იმაზე სწრაფად მიაღწევს, ვიდრე იდეის ეტაპზე ჩანს.
on მდგომარეობაში ჩართული lookahead არგუმენტი გამოსახულების გადაადგილების გარეშე საკუთარი თავის პირდაპირ მოტყუებაა. ასეთი სკრიპტის TradingView-ის ბიბლიოთეკაში გამოქვეყნება აკრძალულია, ხოლო მისი ისტორიული შემოწმების შედეგები არაფერს ნიშნავს.
ისტორიულ მონაცემებზე შემოწმების შედეგები მომავალზე არ ვრცელდება. ამ სტატიის რიტუალი დეფექტების მხოლოდ ერთ კლასს აფიქსირებს — ისტორიულ მონაცემებსა და რეალურ დროს შორის შეუსაბამობას. ის არაფერს ამბობს იმაზე, იმუშავებს თუ არა წესი მომავალშიც, და ვერ ჩაანაცვლებს ვერც სტოპ-ლოსის ორდერს და ვერც შესვლამდე განსაზღვრულ პოზიციის ზომას.
წყაროები
- სხვა ტაიმფრეიმები და მონაცემები, Pine Script v6-ის მომხმარებლის სახელმძღვანელო, tradingview.com
- გადახატვა, Pine Script v6-ის მომხმარებლის სახელმძღვანელო, tradingview.com
- ტაიმფრეიმები, Pine Script v6-ის მომხმარებლის სახელმძღვანელო, tradingview.com
- შეზღუდვები, Pine Script v6-ის მომხმარებლის სახელმძღვანელო, tradingview.com
- ბარის მდგომარეობები, Pine Script v6-ის მომხმარებლის სახელმძღვანელო, tradingview.com
- Pine Script-ის მე-6 ვერსიაზე გადასვლა, მიგრაციის სახელმძღვანელო, tradingview.com
- PineCoders-ის FAQ და კოდი, pinecoders.com
- PineCoders FAQ-ის საწყისი კოდი, github.com
- Barmerge lookahead on თუ off, განხილვა, stackoverflow.com
- როგორ მივიღოთ უფროსი ტაიმფრეიმის ბარის დადასტურება, განხილვა, stackoverflow.com
- request.security-ის გამოყენებისას Pine Script-ის წარმადობის ოპტიმიზაცია, განხილვა, stackoverflow.com
- Pine Script-ის გადახატვა, CrossTrade, crosstrade.io
- Pine Script v6-ის დინამიკური მოთხოვნები, Tom Hartman, blog.traderspost.io
- Palomar D. P. რაოდენობრივი ინვესტირების შვიდი ცოდვა, პორტფელის ოპტიმიზაცია, portfoliooptimizationbook.com
- ბექტესტირების პრობლემები, CFA Level 2-ის კონსპექტი, analystprep.com
ხშირად დასმული კითხვები
რატომ იცვლება მოთხოვნილი დღიური მნიშვნელობა დღის განმავლობაში?
იმიტომ, რომ დღიური ბარი ჯერ არ დახურულა. სანამ ის ცოცხალია, მისი დახურვის ფასი მიმდინარე ფასის ტოლია და მასთან ერთად იცვლება. ფუნქცია ზუსტად აბრუნებს იმას, რაც მოთხოვნილ კონტექსტში ამ მომენტში არსებობს. როგორც კი ბარი დაიხურება, მნიშვნელობა დაფიქსირდება. თუ მხოლოდ დადასტურებული რიცხვი გჭირდებათ, გამოსახულება ერთი ბარით უკან გადაანაცვლეთ და იმავდროულად lookahead არგუმენტი on მდგომარეობაში ჩართეთ — ცალ-ცალკე ეს ორი მეთოდი არ მუშაობს.
რა უნდა ჩაიწეროს საათობრივი ტაიმფრეიმის სტრიქონში?
სტრიქონი "60". Pine Script-ის ფორმატში საათის ერთეული საერთოდ არ არსებობს და ჩანაწერი "1H" არავალიდურია. ფორმატი შედგება მამრავლისა და ერთეულის ასოსგან, თუმცა წუთებს ასო არ აქვს: "15" ნიშნავს თხუთმეტ წუთს, "1D" — დღეს, "1W" — კვირას, "1M" — თვეს. თუ მამრავლი არ წერია, იგულისხმება ერთი: "D" უდრის "1D"-ს. ცალკე მდგომი "1" იკითხება, როგორც ერთი წუთი.
შეიძლება უფროსი ბარის დახურვის მომენტის დაფიქსირება?
უშუალოდ გამოძახების შიგნით — არა. დოკუმენტაცია ამას ცალკე ხაზად აფიქსირებს: ბარის მდგომარეობა barstate.isconfirmed გამოძახებაში request.security() არ მუშაობს. შემოვლითი გზები არსებობს და ისინი განსხვავებულია. ოფიციალური მეთოდია გადაადგილებული გამოსახულების გამოყენება lookahead-თან ერთად on მდგომარეობაში; ამ შემთხვევაში დადასტურებული მნიშვნელობა ახალი უფროსი პერიოდის დასაწყისში მოდის. საზოგადოების მიერ შექმნილი გარსები გადაადგილებას გამოძახების გარეთ, ბარის მდგომარეობის მიხედვით ცვლიან; დოკუმენტაციაში აღწერილი არ არის, ზუსტად როდის მოდის მათთან მნიშვნელობა, ამიტომ ეს საკუთარ გრაფიკზე უნდა შეამოწმოთ.
რით სჯობს request.security_lower_tf უმცროსი მასშტაბის ჩვეულებრივ მოთხოვნას?
ის ყველა ინტრაბარს აბრუნებს, ჩვეულებრივი მოთხოვნა კი გრაფიკის თითოეულ ბარზე მხოლოდ ერთს იძლევა. მისი სიგნატურა განსხვავებულია: gaps და lookahead არგუმენტები არ აქვს, სამაგიეროდ აქვს ignore_invalid_timeframe, რომელიც ნაგულისხმევად გამორთულია. შედეგი მოდის ინტრაბარების დროის მიხედვით დალაგებული მასივის სახით და ელემენტებზე მიმართვამდე ამ მასივის ზომა უნდა შემოწმდეს, თორემ ცარიელი მასივის გამო სკრიპტი შეცდომით შეჩერდება.
გადაიხატება თუ არა სხვა სიმბოლოს მონაცემების მოთხოვნა?
გრაფიკის ტაიმფრეიმზე — არა. TradingView-ის ოფიციალურ FAQ-ში პირდაპირ წერია: სხვა სიმბოლოს მონაცემების მოთხოვნა გრაფიკის მასშტაბზე გადახატვას არ იწვევს, ამიტომ მნიშვნელობის გადაადგილება და lookahead არგუმენტის შეცვლა საჭირო არ არის. გადახატვას უფროსი მასშტაბი იწვევს და არა სხვა ტიკერი. სხვა სიმბოლოს გამოყენებისას გასათვალისწინებელია მხოლოდ სავაჭრო სესიების შეუსაბამობა.
რა შეიცვალა მონაცემთა მოთხოვნებში Pine Script-ის მეექვსე ვერსიაში?
მთავარი ცვლილება ნაგულისხმევად ჩართული დინამიკური მოთხოვნებია. მეექვსე ვერსიაში გამოძახება შეიძლება დაიწეროს ციკლის ან პირობის შიგნით, ტიკერები მასივში შეინახოთ და მოთხოვნის კონტექსტი ბარიდან ბარამდე ცვალოთ. მეხუთე ვერსიაში ამისთვის სკრიპტის დეკლარაციაში დინამიკური მოთხოვნების ცალკე ჩართვა იყო საჭირო. არსებობს პრაქტიკული შენიშვნაც: TradingView-ის მხარდაჭერის თანახმად, მოთხოვნა მაინც თითოეულ ბარზე სრულდება, მაშინაც კი, თუ გამოძახება პირობის შიგნით დგას.




კომენტარები
საწყისი მასალის კომენტარები არ ითარგმნება.