ใหม่ใน ไพน์: โอเวอร์โหลด ฟังก์ชันสตริงใหม่ และอีกมากมาย!

Dec 23, 2021

ทีม ไพน์ ทำงานอย่างหนักเพื่อปรับปรุง ไพน์ อย่างต่อเนื่องตั้งแต่เปิดตัวเวอร์ชัน 5 มาดูคุณสมบัติที่รอคอยมานานที่พวกเขาได้เพิ่มเข้ามาในช่วงสองเดือนที่ผ่านมา

ฟังก์ชั่นโอเวอร์โหลด

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

ในตัวอินดิเคเตอร์ เรากำหนดโอเวอร์โหลดของฟังก์ชัน mult() ที่ยอมรับสามอาร์กิวเมนต์:

//@version=5
indicator("Function overload")

// Two parameters
mult(x1, x2) =>
    x1 * x2

// Three parameters
mult(x1, x2, x3) =>
    x1 * x2 * x3

plot(mult(7, 4))
plot(mult(7, 4, 2))

ในที่นี้ เรากำหนดโอเวอร์โหลดที่ทำงานแตกต่างกัน ขึ้นอยู่กับประเภทของอาร์กิวเมนต์ที่ใช้ เมื่อโอเวอร์โหลดมีปริมาณพารามิเตอร์เท่ากันกับฟังก์ชันดั้งเดิม พารามิเตอร์จะต้องกำหนดโดยใช้ประเภทที่แตกต่างกันอย่างชัดเจน:

//@version=5
indicator("Function overload")

// Accepts both 'int' and 'float' values because any 'int' can be automatically cast to 'float'
mult(float x1, float x2) =>
    x1 * x2

// Returns a 'bool' value instead of a number
mult(bool x1, bool x2) =>
    x1 and x2 ? true : false

mult(string x1, string x2) =>
    str.tonumber(x1) * str.tonumber(x2)

// Has three parameters, so explicit types are not required
mult(x1, x2, x3) =>
    x1 * x2 * x3

plot(mult(7, 4))
plot(mult(7.5, 4.2))
plot(mult(true, false) ? 1 : 0)
plot(mult("5", "6"))
plot(mult(7, 4, 2))

for…in

การวนซ้ำบนอาร์เรย์ด้วยโครงสร้าง for ต้องป้องกันการป้อนลูปหากอาร์เรย์ว่างเปล่าและป้องกันดัชนีอาร์เรย์ที่อยู่นอกขอบเขต

โครงสร้างใหม่ for…in ทำให้ชีวิตของคุณง่ายขึ้นโดยวนซ้ำองค์ประกอบทั้งหมดของอาร์เรย์สำหรับคุณ ไวยากรณ์เรียบง่าย: สำหรับ array_element ใน array_id จะวนซ้ำองค์ประกอบ array_id โดยเริ่มจากศูนย์ดัชนี โดยกำหนดค่าขององค์ประกอบของอาร์เรย์ให้กับตัวแปร array_element ในการวนซ้ำแต่ละครั้ง ไม่มีการวนซ้ำหรือข้อผิดพลาดจะเกิดขึ้นหากอาร์เรย์ว่างเปล่า และสามารถเพิ่มหรือลบองค์ประกอบอาร์เรย์ในการวนซ้ำแบบวนซ้ำได้

ในสคริปต์ด้านล่าง เราใช้ for…in เพื่อค้นหาจำนวนสูงสุดในอาร์เรย์ a1

//@version=5
indicator("For...in cycle")
var int[] a1 = array.from(1, 3, 6, 3, 8, 0, -9, 5)

highest(array) =>
    var int highestNum = na
    for element in array
        if na(highestNum) or element > highestNum
            highestNum := element
    highestNum

plot(highest(a1))

ฟังก์ชั่นการจัดการสตริงใหม่

ฟังก์ชันใหม่เหล่านี้มีวิธีเพิ่มเติมในการประมวลผลสตริง และแนะนำนิพจน์ทั่วไปให้กับ ไพน์ โปรดทราบว่า ตรงกันข้ามกับฟังก์ชันสตริงที่ผู้ใช้กำหนดโดยใช้อาร์เรย์ ฟังก์ชันเหล่านี้สามารถคืนค่าในรูปแบบ “simple” ซึ่งสามารถใช้สร้างอาร์กิวเมนต์สัญลักษณ์สำหรับ request.security() เป็นต้น

str.contains(source, str)

กำหนดว่า source สตริงมีสตริงย่อย str หรือไม่ ตัวอย่างเช่น เราสามารถระบุได้ว่าชาร์ตปัจจุบันเป็นชาร์ตฟิวเจอร์สต่อเนื่องโดยมองหา “!” สตริงย่อยในตัวแปรบิวท์อิน syminfo.tickerid:

var isContinuous = str.contains(syminfo.tickerid, "!")  
plot(isContinuous ? 1 : 0)

str.pos(source, str)

ส่งกลับตำแหน่งของสตริง str ใน source สตริง

str.substring(source, begin_pos, end_pos)

แยกสตริงย่อยจาก source สตริง ในตัวอย่างนี้ เราใช้ str.substring() และ str.pos() เพื่อดึงสตริงย่อย “AAPL” จากสตริงอินพุต s:

s = input.string("Time to sell some NASDAQ:AAPL") 
pos = str.pos(s, ":")  // Get the position of the ":" character
tkr = str.substring(s, pos + 1) // "AAPL"

str.replace(source, target, replacement, occurrence)

ตรงกันข้ามกับฟังก์ชัน str.replace_all() ที่มีอยู่ str.replace() อนุญาตให้เลือกแทนที่สตริงย่อยที่ตรงกันด้วยสตริงการแทนที่ ในตัวอย่างนี้ เราจะแทนที่คำนำหน้า “FTX” ด้วย “BINANCE” สำหรับสัญลักษณ์แรกในสตริงการแพร่กระจาย:

var source = "FTX:BTCUSD / FTX:BTCEUR"
// Replace the first occurrence of "FTX" with the "BINANCE" replacement string
var newSource = str.replace(source, "FTX",  "BINANCE", 0)

str.lower(source) และ str.upper(source)

แปลงตัวอักษรทั้งหมดของ source สตริงต้นทางเป็นตัวพิมพ์เล็กหรือตัวพิมพ์ใหญ่:

s = str.lower("Time to Sell Some AAPL") // time to sell some aapl!
s = str.upper("Time to Sell Some AAPL!") // TIME TO SELL SOME AAPL!

str.startswith(source, str) และ str.endswith(source, str)

กำหนดว่า source สตริงเริ่มต้นหรือลงท้ายด้วยสตริงย่อย str

str.match(source, regex)

แยกสตริงย่อยที่ตรงกับนิพจน์ทั่วไปที่ระบุ ตัวอย่างเช่น ด้วย regex [\\w]+:[\\w]+ คุณสามารถค้นหาและส่งคืนชื่อสัญลักษณ์จาก It’s time to sell some NASDAQ:AAPL!” source สตริง:

s = "It's time to sell some NASDAQ:AAPL!"
var string tickerId = str.match(s, "[\\w]+:[\\w]+") //"NASDAQ:AAPL"

การแปลงสกุลเงิน

ฟังก์ชันส่วนใหญ่ใน request.* เนมสเปซสามารถแปลงค่าที่ส่งคืนเป็นสกุลเงินอื่นได้แล้ว หากมีการระบุอาร์กิวเมนต์ currency ในการเรียกใช้ฟังก์ชัน ค่าราคาที่ส่งคืนโดยฟังก์ชันจะถูกแปลงจากสกุลเงินต้นทางเป็นสกุลเงินเป้าหมาย เพิ่มพารามิเตอร์ currency ในฟังก์ชันต่อไปนี้:

กล่องข้อความ

การวาดกล่องใน ไพน์ รองรับข้อความแล้ว! เพียงเพิ่มอาร์กิวเมนต์ข้อความลงในฟังก์ชัน box.new() ทุกครั้งที่คุณวาดกล่อง และข้อความจะแสดงอยู่ข้างใน คุณสามารถปรับลักษณะการทำงานของข้อความโดยการตั้งค่าสำหรับพารามิเตอร์ text_size, text_colortext_valign และ text_halign เมื่อคุณสร้างกล่อง หรือโดยอ้างอิงถึงกล่องที่มีฟังก์ชันใหม่อย่างใดอย่างหนึ่งต่อไปนี้

ดังตัวอย่างของคุณลักษณะนี้ ต่อไปนี้คืออินดิเคเตอร์ชาร์ตช่วงเวลาหลายช่วงเวลาในตัวที่แก้ไขเพื่อแสดงตัวเลขและจุดสูงสุด/ต่ำสุดของสัปดาห์ที่ไฮไลต์:

หากต้องการรับทราบข้อมูลคุณสมบัติใหม่ ๆ ของ ไพน์ โปรดติดตามพจนานุกรมคู่มือผู้ใช้ ไพน์ PineCoder ของเรายังออกอากาศการอัปเดตในช่อง Telegram Squawk Box, Twitter และจากการแชทสาธารณะของ ไพน์สคริปต์ บน TradingView

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

Look first Then leap

TradingView is built for you, so make sure you're getting the most of our awesome features
เปิดชาร์ต