Downloading...

Pine Script® v6 มาแล้ว

Dec 10, 2024

วันนี้เรามีความยินดีที่จะประกาศการเปิดตัว Pine Script® v6! เวอร์ชันอัปเกรดของภาษาการเขียนโปรแกรมที่มุ่งเน้นสำหรับเทรดเดอร์ของเรา มีการปรับเพื่อความเหมาะสมที่หลากหลายและการปรับปรุงฟีเจอร์ที่มีการร้องขอกันมานาน เพิ่มประสิทธิภาพให้มากยิ่งขึ้น และเพิ่มอรรถประโยชน์สำหรับโปรแกรมเมอร์ Pine Script® ในการปูทางไปสู่การยกระดับภาษาขึ้นไปอีกขั้น

โพสต์นี้สรุปการอัปเกรดที่มีความโดดเด่นสุดบางส่วนใน Pine v6 ดู เอกสารเผยแพร่ ของเราเพื่อเรียนรู้เพิ่มเติมว่ามีอะไรใหม่ในเวอร์ชัน 6 และเพื่อรับทราบข้อมูลล่าสุดเกี่ยวกับการปรับปรุงในอนาคต

เครื่องมือการแปลงเป็น v6

เช่นเดียวกับการเปลี่ยนแปลงเวอร์ชันก่อนหน้า การอัปเกรดที่รวมอยู่ใน Pine v6 จะไม่ส่งผลกระทบต่อสคริปต์ส่วนตัวหรือสคริปต์ที่ถูกเผยแพร่โดยเขียนใน Pine เวอร์ชันก่อนหน้า คุณสมบัติใหม่ทั้งหมดนับจากจุดนี้เป็นต้นไปจะถูกนำไปใช้เฉพาะใน Pine เวอร์ชันล่าสุดเท่านั้น ดังนั้นเราขอแนะนำให้แปลงสคริปต์ของคุณเป็น v6 หากคุณต้องการเข้าถึงคุณสมบัติใหม่ วิธีที่ง่ายที่สุดคือการใช้เครื่องมือแปลง v6 ใหม่ของเรา ซึ่งคุณสามารถเปิดใช้งานได้โดยเลือก “แปลงโค้ดเป็น v6” จากเมนู “จัดการสคริปต์” ของ Pine Editor

โปรดทราบว่าสคริปต์บางรายการไม่สามารถแปลงเป็น v6 ได้โดยอัตโนมัติ และในบางกรณีจำเป็นต้องมีการแก้ไขด้วยตนเองเพื่อให้แน่ใจว่าสคริปต์ที่แปลงแล้วจะทำงานตามที่ตั้งใจไว้ หากคุณพบปัญหากับการแปลงอัตโนมัติหรือต้องการแปลงสคริปต์ของคุณเป็น v6 ด้วยตนเอง โปรดดู คู่มือการย้ายเวอร์ชัน ที่มีประโยชน์ของเรา

Dynamic requests

TradingView ให้การเข้าถึงสัญลักษณ์นับหมื่นสำหรับตราสารที่สามารถซื้อขายได้ ตัวชี้วัดทางการเงิน และตัวชี้วัดทางเศรษฐกิจจากทั่วโลก ฟังก์ชันตระกูล request.*() อนุญาตให้ Pine script®สามารถดึงข้อมูลสำหรับสัญลักษณ์ใด ๆ ที่มีอยู่ในไทม์เฟรมที่แตกต่างกัน โดยไม่คำนึงถึงสัญลักษณ์และไทม์เฟรมที่ถูกใช้โดยชาร์ต

ฟังก์ชันเหล่านี้เป็นเครื่องมืออรรถประโยชน์ซึ่งทรงพลังพร้อมการใช้งานในกรณีต่างๆ อย่างไรก็ตาม ก่อนหน้านี้มีข้อจำกัดที่สำคัญ: พวกเขาต้องใช้ค่า ” simple string” เพื่อระบุสัญลักษณ์และไทม์เฟรมของ request ซึ่งหมายความว่าต้องทราบบริบทบนแท่งแรกและไม่สามารถเปลี่ยนแปลงได้ในภายหลัง นอกจากนี้ การเรียก all request.*() ถูกบังคับให้ดำเนินการอย่างเคร่งครัดใน the script’s global scope กล่าวอีกนัยหนึ่ง single request.*() ในโค้ดสามารถดึงข้อมูลสำหรับสัญลักษณ์และไทม์เฟรมเดียวเท่านั้น และไม่อนุญาตให้มี request.*() การเรียกใช้ inside loops, conditional structures, หรือ exported library functions.

ใน Pine Script® v6 เราได้ลบข้อจำกัดเหล่านี้ออกแล้ว ตอนนี้สคริปต์สามารถใช้ค่า “series string” เพื่อกำหนดบริบทของการเรียก any request.*() นอกจากนี้ ตอนนี้การเรียก request.*() อนุญาตภายใน local scopes แล้ว ด้วยการเปลี่ยนแปลงเหล่านี้ คุณสามารถคำนวณหรือแก้ไขสัญลักษณ์บนแท่งย้อนหลังใดๆ และ request their data dynamically, create collections of symbols และ fetch their data within loops, รวมทั้งทำได้อีกหลายอย่างกับฟังก์ชัน request.*() ที่ไม่เคยทำได้มาก่อน ดู Dynamic requests ได้ที่คู่มือผู้ใช้ของเราเพื่อเรียนรู้เพิ่มเติม.

สำหรับตัวอย่างสิ่งที่คุณสามารถทำได้กับ Dynamic requests โปรดดูการทำงานภายในของ built-in Performance indicator โดยแยกรายการสตริงสัญลักษณ์และไทม์เฟรมที่คั่นด้วยเครื่องหมายจุลภาคออกเป็นอาร์เรย์ จากนั้นการเรียก request.security() dynamically inside loops to fetch values จากชุดข้อมูลแต่ละชุด ในอดีตสคริปต์ลักษณะนี้จะต้องมีการเรียก input.symbol() และ input.timeframe() หลายครั้ง และการรวมกันของสัญลักษณ์-กรอบเวลาแต่ละรายการจะต้องมีการเรียก input.timeframe() แยกต่างหากใน code:

สำหรับการอ้างอิงเพิ่มเติม โปรดดูสคริปต์เหล่านี้ที่เผยแพร่โดยบัญชี TradingView ซึ่งใช้ Dynamic requests เพื่อ fetch data จาก other context

  • ฮีทแมพของฟอเร็กซ์. อินดิเคเตอร์นี้จะสร้าง ticker ID สำหรับการจับสกุลเงินตามรายการ currency code ที่ผู้ใช้ระบุ โดยจะ request ข้อมูลแบบ Dynamic สำหรับการจับคู่แต่ละคู่ภายใน loop จากนั้นจะใช้ข้อมูลเพื่อ populate ตาราง color-coded
  • Ticker Tape. อินดิเคเตอร์นี้สร้างอาร์เรย์ของ ticker ID จากรายการสัญลักษณ์ที่ผู้ใช้กำหนด โดยจะขอข้อมูลราคาและการเปลี่ยนแปลงรายวันแบบ dynamical สำหรับ Ticket ID แต่ละรายการจากอาร์เรย์ภายในลูป จากนั้นจะใช้ข้อมูลเพื่ออัปเดตการแสดงผล ” tape ” ที่หมุนได้
  • ไลบรารี COT ก่อนหน้านี้ ไลบรารีนี้มีเพียงเครื่องมือในการสร้าง ticker ID สำหรับการ request ข้อมูล CFTC Commitment of Traders (COT) เนื่องจากไลบรารีไม่สามารถส่งออกฟังก์ชันที่มีการเรียก request.*()ได้ ด้วย Dynamic request ข้อจำกัดนี้จะไม่มีผลอีกต่อไป ขณะนี้ไลบรารีส่งออกฟังก์ชัน requestCommitmentOfTraders() ที่เรียก request.security() ภายในเพื่อดึงข้อมูล COT โดยตรง ให้ความสะดวกและความคล่องตัวมากขึ้นแก่โปรแกรมเมอร์

 

นอกจากนี้ CFTC report code ทั้งหมดเคยถูกเก็บไว้ภายใน switch statement เพื่อส่งคืนค่า ” simple ” ซึ่งจำกัด ticker ที่พร้อมสำหรับการ request ด้วย Dynamic request ไม่จำเป็นต้องใช้, “simple string” ticker ID อีกต่อไป ช่วยให้ไลบรารีสามารถจัดเก็บ report code ใน map และให้การสนับสนุนสัญลักษณ์เพิ่มขึ้น

Boolean optimization

การปรับปรุงที่สำคัญที่สุดอย่างหนึ่งใน Pine Script® v6 อาจไม่ปรากฏให้เห็นภายนอก แต่คุณอาจสังเกตเห็นความแตกต่างในประสิทธิภาพของโค้ด เราได้ปรับปรุงการใช้งานภายในของค่า “bool” ใน Pine และเราได้แนะนำ short-circuit (or “lazy”) evaluation ซึ่งช่วยให้ and และ or operation หยุดการประเมินนิพจน์เพิ่มเติมเมื่อไม่จำเป็นต้องกำหนดผลลัพธ์.

การเปลี่ยนแปลงเหล่านี้ปรับปรุงประสิทธิภาพของสคริปต์ส่วนใหญ่บน TradingView ความแตกต่างด้านประสิทธิภาพจะเห็นได้ชัดเจนเป็นพิเศษกับสคริปต์ที่ค่อนข้างใหญ่ที่ต้องอาศัยเงื่อนไขอย่างมากและใช้ค่า “bool” จำนวนมาก ตามที่เรายืนยันในการทดสอบกับสคริปต์ชุมชนแบบ open-source ที่ได้รับความนิยมมากที่สุดบางสคริปต์

นอกจากนี้ lazy “bool” evaluation มักจะช่วยให้โค้ดสะอาดและกระชับยิ่งขึ้น ตัวอย่างเช่น หากคุณมีเงื่อนไขที่ต้องอาศัยรายการจากอาร์เรย์ คุณอาจต้องตรวจสอบขนาดของอาร์เรย์เพื่อให้แน่ใจว่ามีดัชนีของรายการอยู่ เนื่องจากสคริปต์จะหยุดและทำให้เกิดข้อผิดพลาดหากดัชนีอยู่นอกขอบเขต Pine v6 ซึ่งมี lazy evaluation ช่วยให้คุณสามารถสร้างนิพจน์แบบมีเงื่อนไขเดียวที่จะตรวจสอบอาร์เรย์ก่อนที่จะพยายามเข้าถึงองค์ประกอบ ซึ่งไม่สามารถทำได้ในเวอร์ชัน 5.

//@version=6
indicator("Lazy evaluation demo")

//@variable A "bool" array without a fixed size.
array<bool> myArray = array.new<bool>()

// Push a new value into `myArray` when the `close` is above the `open`.
if close > open
   myArray.push(true)

// Line 13 causes an error in v5 because `myArray.first()` always executes, even if the first expression is `false`.
// It works in v6 though because `myArray.first()` executes only if the first expression evaluates to `true`.
if myArray.size() != 0 and myArray.first()
   label.new(bar_index, high, "Test")

ขนาดข้อความและรูปแบบ

ประเภทการวาดทั้งหมดที่แสดงข้อความ (กล่อง, ป้าย, และ ตาราง) สามารถใช้ขนาดข้อความที่ระบุใน typographic pointได้แล้ว ซึ่งเป็นจุดเดียวกับที่ใช้ในโปรแกรมแก้ไขข้อความมาตรฐาน ก่อนหน้านี้ คุณจะต้องเลือกระหว่าง arbitrary size.* constant เช่น size.large (24) และ size.huge (36) ขณะนี้ ด้วยข้อกำหนด typographic point ใหม่ คุณสามารถมั่นใจได้ว่าขนาดข้อความตรงกับที่คุณต้องการ คุณยังสามารถสร้างขนาดตัวอักษรขนาดใหญ่ซึ่งไม่สามารถทำได้ใน Pine เวอร์ชันก่อนหน้านี้

นอกจากนี้ เราขอแนะนำพารามิเตอร์ text_formatting ใหม่สำหรับประเภทการวาดเหล่านี้ ซึ่งคุณสามารถใช้เพื่อทำให้ข้อความเป็นตัวเอียง ตัวหนา หรือทั้งสองอย่าง

//@version=6
indicator("Text size showcase", overlay = true)

var t = table.new(position.bottom_center, 1, 2, bgcolor = color.yellow, frame_color = color.black, frame_width = 1)

if barstate.islastconfirmedhistory
    t.cell(0, 0, "text_size = size.huge", text_size = size.huge)
    t.cell(0, 1, "text_size = 60, bold & italicized", text_size = 60, text_formatting = text.format_bold + text.format_italic)

ตัดออร์เดอร์ที่เก่าที่สุดออกในกลยุทธ์

ผู้ใช้สคริปต์ กลยุทธ์ ที่ใช้งานอยู่อาจรู้ว่าใน Pine v5 สามารถจำลองกลยุทธ์ได้มากถึง 9000 เทรดก่อนที่จะหยุดการคำนวณและทำให้เกิดข้อผิดพลาด เว้นแต่ว่าคุณกำลังใช้โหมด Deep Backtesting ซึ่งข้อจำกัดนี้ไม่สะดวกเป็นอย่างมากสำหรับกลยุทธ์ที่จำลองการซื้อขายบ่อยครั้งและสร้างทริกเกอร์การแจ้งเตือน

ใน Pine Script® v6 กลยุทธ์จะไม่หยุดการคำนวณหรือทำให้เกิดข้อผิดพลาดอีกต่อไปเมื่อถึงขีดจำกัด 9000 เทรด แต่กลยุทธ์จะตัดออร์เดอร์ที่เก่าที่สุดออกเพื่อให้มีพื้นที่สำหรับออร์เดอร์ใหม่ ออร์เดอร์ที่ถูกตัดออกจะไม่ปรากฏใน เครื่องมือทดสอบกลยุทธ์ แต่กลยุทธ์จะคำนวณต่อไปได้โดยไม่มีปัญหา หากต้องการตรวจสอบดัชนีการเทรดของออร์เดอร์เก่าแก่ที่สุดที่ไม่ถูกตัดออก คุณสามารถใช้ตัวแปร strategy.closedtrades.first_index ใหม่ได้ ดัชนีสามารถใช้เป็นอาร์กิวเมนต์ trade_num ในการเรียกใช้ฟังก์ชัน strategy.closedtrades.*()

Negative array indices

ใน Pine v6 ฟังก์ชัน array.get(), array.set(), array.insert(), และ array.remove() สามารถรับ negative index argument เพื่ออ้างอิงรายการต่างๆ ที่เริ่มต้นจากจุดสิ้นสุดของอาร์เรย์ ซึ่งให้ประโยชน์มากขึ้น วิธีที่กระชับและสะดวกในการอ้างอิงองค์ประกอบอาร์เรย์ในลำดับย้อนกลับ ตัวอย่างเช่น the call array.get(myArray, -2) retrieves the second to last element in myArray, which is equivalent to array.get(myArray, array.size(myArray) – 2).

หากต้องการติดตามการปรับปรุงล่าสุดใน Pine Script® experience ให้จับตาดู เอกสารเผยแพร่ ของคู่มือผู้ใช้ — ในส่วนของ v6 ยังมีการเปลี่ยนแปลงเพิ่มเติมบางอย่างที่ไม่ได้รวมอยู่ในโพสต์บนบล็อกนี้ด้วย

เราหวังว่าคุณจะพบว่าคุณสมบัติเหล่านี้มีประโยชน์เท่าที่เราคิดว่าจะเป็นไปได้ และอย่าลืมส่งความคิดเห็นและข้อเสนอแนะของคุณมาหาเรา เพื่อที่เราจะได้ทำให้แพลตฟอร์มดีที่สุดเท่าที่จะเป็นไปได้ เราสร้าง TradingView สำหรับคุณ และเรายินดีรับฟังความคิดเห็นของคุณเสมอ

— ทีมงาน TradingView

Look first Then leap

TradingView สร้างสรรมาเพื่อคุณ ดังนั้นคุณไม่ควรพลาดประโยชน์จากฟีเจอร์อันเยี่ยมยอดของเรา