Sumber daya yang dimuat... Pemuatan...

FMZ PINE Script Doc

Penulis:Penemu Kuantitas - Mimpi Kecil, Dibuat: 2022-04-28 16:05:05, Diperbarui: 2024-10-12 17:25:27

Mengubah nilai bidang

type order
    float price
    float amount
    string symbol

if strategy.position_size == 0 and open > close
    strategy.entry("long", strategy.long, 1)
    
order1 = order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)

if strategy.position_size != 0
    runtime.log(order1)
    order1.price := 999
    order1.amount := 100
    runtime.log(order1)
    runtime.error("stop")

Nilai bidang objek dapat diubah dengan menggunakan:=operator penugasan ulang.

Koleksi objek

Contoh menyatakan array kosong yang akan menyimpan objek dari tipe urutan yang didefinisikan pengguna:

type order
    float price
    float amount
    string symbol

arrOrder = array.new<order>()

order1 = order.new(99, 1, "BTC_USDT")
order2 = order.new(100, 2, "ETH_USDT")

array.push(arrOrder, order1)
array.push(arrOrder, order2)

runtime.log(arrOrder)
runtime.error("stop")

atau

type order
    float price
    float amount
    string symbol

var array<order> arrOrder = na
arrOrder := array.new<order>()

order1 = order.new(99, 1, "BTC_USDT")
order2 = order.new(100, 2, "ETH_USDT")

array.push(arrOrder, order1)
array.push(arrOrder, order2)

runtime.log(arrOrder)
runtime.error("stop")

Menyalin objek

Pada Pine, objek ditugaskan dengan referensi. Ketika objek yang ada ditugaskan ke variabel baru, keduanya merujuk pada objek yang sama.

//@version=5
indicator("")
type pivotPoint
    int x
    float y
pivot1 = pivotPoint.new()
pivot1.x := 1000
pivot2 = pivot1
pivot2.x := 2000
// Both plot the value 2000.
plot(pivot1.x)
plot(pivot2.x)

Dalam contoh berikut, kita membuat objek pivot1 dan mengatur bidang x-nya menjadi 1000. Kemudian kita menyatakan variabel pivot2 yang berisi referensi ke objek pivot1, sehingga keduanya menunjuk ke contoh yang sama. Oleh karena itu, mengubah pivot2.x juga mengubah pivot1.x, karena keduanya merujuk ke bidang x dari objek yang sama.

Untuk membuat salinan yang independen dari objek asli, dalam hal ini kita dapat menggunakan metode copy ((() built-in. Dalam contoh ini, kita mendeklarasikan variabel pivot2 untuk merujuk pada contoh yang disalin dari objek pivot1. Sekarang, mengubah pivot2.x tidak akan mengubah pivot1.x, karena mengacu pada bidang x dari objek terpisah:

//@version=5
indicator("")
type pivotPoint
    int x
    float y
pivot1 = pivotPoint.new()
pivot1.x := 1000
pivot2 = pivotPoint.copy(pivot1)
pivot2.x := 2000
// Plots 1000 and 2000.
plot(pivot1.x)
plot(pivot2.x)

Perlu dicatat bahwa metode copy TradingView adalah salinan dangkal. Jika sebuah objek memiliki jenis khusus bidang (array, dll), bidang-bidang ini dalam salinan dangkal objek akan menunjuk ke contoh yang sama dengan objek. Platform FMZ secara langsung mengimplementasikan deep copying, dan tidak memerlukan pemrosesan tambahan.

Salinan yang mendalam

//@version=5

indicator("test deepCopy")

type orderInfo
    float price
    float amount

type labelInfo
    orderInfo order
    string labelMsg

labelInfo1 = labelInfo.new(orderInfo.new(100, 0.1), "test labelInfo1")
labelInfo2 = labelInfo.copy(labelInfo1)

labelInfo1.labelMsg := "labelInfo1->2"    // Modify the base type field of labelInfo1 to see if it affects labelInfo2
labelInfo1.order.price := 999             // Modify the composite type field of labelInfo1 to see if it affects labelInfo2

runtime.log(labelInfo1)
runtime.log(labelInfo2)
runtime.error("stop")

Hasil tes menunjukkan bahwa labelInfo.copy ((labelInfo1) adalah salinan mendalam ketika dijalankan dan memodifikasi bidang labelInfo1 tidak akan mempengaruhi labelInfo2.

Metode

Metode dalam bahasa Pine adalah fungsi khusus yang terkait dengan contoh tertentu dari jenis built-in atau user-defined. Dalam kebanyakan hal, mereka pada dasarnya sama dengan fungsi biasa, tetapi menyediakan sintaks yang lebih pendek dan lebih nyaman. Pengguna dapat mengakses metode secara langsung pada variabel menggunakan notasi titik, sama seperti mengakses bidang objek Pine. Pine mencakup metode built-in untuk semua jenis khusus, termasuk array, matriks, peta, garis, baris isi, dan banyak lagi. Metode ini memberikan pengguna cara yang lebih ringkas untuk memanggil program khusus dari jenis ini dalam skrip.

Metode terintegrasi

Misalnya, kode skrip seperti ini:

//@version=5
indicator("Custom Sample BB", overlay = true)

float sourceInput  = input.source(close, "Source")
int   samplesInput = input.int(20, "Samples")
int   n            = input.int(10, "Bars")
float multiplier   = input.float(2.0, "StdDev")

var array<float> sourceArray = array.new<float>(samplesInput)
var float        sampleMean  = na
var float        sampleDev   = na

// Identify if `n` bars have passed.
if bar_index % n == 0
    // Update the queue.
    array.push(sourceArray, sourceInput)
    array.shift(sourceArray)
    // Update the mean and standard deviaiton values.
    sampleMean := array.avg(sourceArray)
    sampleDev  := array.stdev(sourceArray) * multiplier

// Calculate bands.
float highBand = sampleMean + sampleDev
float lowBand  = sampleMean - sampleDev

plot(sampleMean, "Basis", color.orange)
plot(highBand, "Upper", color.lime)
plot(lowBand, "Lower", color.red)

Dapat ditulis kembali setara sebagai:

//@version=5
indicator("Custom Sample BB", overlay = true)

float sourceInput  = input.source(close, "Source")
int   samplesInput = input.int(20, "Samples")
int   n            = input.int(10, "Bars")
float multiplier   = input.float(2.0, "StdDev")

var array<float> sourceArray = array.new<float>(samplesInput)
var float        sampleMean  = na
var float        sampleDev   = na

// Identify if `n` bars have passed.
if bar_index % n == 0
    // Update the queue.
    sourceArray.push(sourceInput)
    sourceArray.shift()
    // Update the mean and standard deviaiton values.
    sampleMean := sourceArray.avg()
    sampleDev  := sourceArray.stdev() * multiplier

// Calculate band values.
float highBand = sampleMean + sampleDev
float lowBand  = sampleMean - sampleDev

plot(sampleMean, "Basis", color.orange)
plot(highBand, "Upper", color.lime)
plot(lowBand, "Lower", color.red)

Anda dapat melihat bahwa setelah PINE mendukungMethods, kodearray.avg(sourceArray)dapat ditulis dalam bentuk metode:sourceArray.avg()Aku tidak tahu. Perhatikan bahwa FMZ tidak mendukung panggilan sepertiarray.avg currently.

Metode yang ditentukan pengguna

Pine memungkinkan pengguna untuk mendefinisikan metode kustom yang bekerja dengan objek dari jenis built-in atau user-defined.

  1. Kata kunci metode harus dimasukkan sebelum nama fungsi.
  2. Jenis parameter pertama metode harus dinyatakan secara eksplisit karena mewakili jenis objek yang akan dikaitkan dengan metode.

Misalnya, dalam kode berikut, kode untuk perhitungan indikator Bollinger disimpulkan sebagai metode yang didefinisikan pengguna:

//@version=5
indicator("Custom Sample BB", overlay = true)

float sourceInput  = input.source(close, "Source")
int   samplesInput = input.int(20, "Samples")
int   n            = input.int(10, "Bars")
float multiplier   = input.float(2.0, "StdDev")

var array<float> sourceArray = array.new<float>(samplesInput)
var float        sampleMean  = na
var float        sampleDev   = na

// Identify if `n` bars have passed.
if bar_index % n == 0
    // Update the queue.
    sourceArray.push(sourceInput)
    sourceArray.shift()
    // Update the mean and standard deviaiton values.
    sampleMean := sourceArray.avg()
    sampleDev  := sourceArray.stdev() * multiplier

// Calculate band values.
float highBand = sampleMean + sampleDev
float lowBand  = sampleMean - sampleDev

plot(sampleMean, "Basis", color.orange)
plot(highBand, "Upper", color.lime)
plot(lowBand, "Lower", color.red)

Dimodifikasi menjadi:

//@version=5
indicator("Custom Sample BB", overlay = true)

float sourceInput  = input.source(close, "Source")
int   samplesInput = input.int(20, "Samples")
int   n            = input.int(10, "Bars")
float multiplier   = input.float(2.0, "StdDev")

var array<float> sourceArray = array.new<float>(samplesInput)
method maintainQueue(array<float> srcArray, float value, bool takeSample = true) =>
    if takeSample
        srcArray.push(value)
        srcArray.shift()
    srcArray

method calcBB(array<float> srcArray, float mult, bool calculate = true) =>
    var float mean = na
    var float dev  = na
    if calculate
        mean := srcArray.avg()
        dev  := srcArray.stdev() * mult
    [mean, mean + dev, mean - dev]

bool newSample = bar_index % n == 0

[sampleMean, highBand, lowBand] = sourceArray.maintainQueue(sourceInput, newSample).calcBB(multiplier, newSample)

plot(sampleMean, "Basis", color.orange)
plot(highBand, "Upper", color.lime)
plot(lowBand, "Lower", color.red)

Anda dapat melihat bahwa parameter pertama dalam daftar parameter dari metode yang didefinisikan pengguna yang dinyatakan dengan metode kata kunci: maintainQueue dan calcBB adalah jenisarray<float>, yang berarti bahwa metode adalah metode dari variabel jenisarray<float>, jadi Anda dapat melihat bahwa kode berikut dipanggil untuk menghitung indikator Bollinger.

[sampleMean, highBand, lowBand] = sourceArray.maintainQueue(sourceInput, newSample).calcBB(multiplier, newSample)

Metode overloading

Metode yang didefinisikan pengguna dapat mengganti dan membebani metode bawaan dan metode yang didefinisikan pengguna yang ada dengan pengidentifikasi yang sama. Fitur ini memungkinkan pengguna untuk mendefinisikan beberapa rutinitas yang terkait dengan tanda tangan argumen yang berbeda di bawah nama metode yang sama. Sebagai contoh sederhana, misalkan kita ingin mendefinisikan metode untuk mengidentifikasi jenis variabel. Karena kita harus secara eksplisit menentukan jenis objek yang terkait dengan metode yang didefinisikan pengguna, kita perlu mendefinisikan overload untuk setiap jenis yang ingin kita kenal. Selanjutnya kita mendefinisikan metode getType (()) yang mengembalikan representasi string dari tipe variabels dan memiliki overload untuk lima jenis dasar:

//@version=5
indicator("Type Inspection")

// @function   Identifies an object's type.
// @param this Object to inspect.
// @returns    (string) A string representation of the type.
method getType(int this) =>
    na(this) ? "int(na)" : "int"

method getType(float this) =>
    na(this) ? "float(na)" : "float"

method getType(bool this) =>
    na(this) ? "bool(na)" : "bool"

method getType(color this) =>
    na(this) ? "color(na)" : "color"

method getType(string this) =>
    na(this) ? "string(na)" : "string"

a = 1             // a.getType(): float
b = 1.0           // b.getType(): float
c = true          // c.getType(): bool
d = color.white   // d.getType(): string(na)
e = "1"           // e.getType(): string

runtime.log("a.getType():", a.getType())
runtime.log("b.getType():", b.getType())
runtime.log("c.getType():", c.getType())
runtime.log("d.getType():", d.getType())
runtime.log("e.getType():", e.getType())
runtime.error("stop")

Tipe dasar dari setiap variabel menentukan kelebihangetType()Pada platform FMZ, karena implementasi yang mendasari skrip PINE adalah Javascript, tipe numerik akan dinilai sebagai data floating point (float).

Fungsi internal

Ketika memanggil fungsi, Anda dapat melewati argumen. Anda dapat menetapkan nama argumen untuk menetapkan nilai. Anda dapat langsung melewati variabel di posisi argumen yang sesuai. penggunaan campuran juga didukung. Misalnya:

plot(close, title="test plot")     // Pass the argument close directly; specify the argument title and assign the string "test plot"

Setelah menentukan penugasan nama argumen, Anda tidak lagi dapat langsung melewati variabel sebagai argumen, dan argumen berikutnya harus ditulis dalam bentuk penugasan nama argumen.

// plot(close, title="test", color.red)    // Although the third argument of plot is the color value, but this will report an error
plot(close, title="test", color=color.red) // Correct writing
plot(close, "test", color.red)             // Correct writing

jangka waktu

waktu.dalam_detik

Mengkonversi periode waktu yang berlalu ketimeframeargumen ke detik.

timeframe.in_seconds(timeframe)

Contoh

// Get chart timeframe:
i_tf = input.timeframe("1D")

// Convert timeframe to the int value (number of seconds in 1 Day):
tf = timeframe.in_seconds(i_tf)

plot(tf)

PengembalianSebuah representasi int dari jumlah detik dalam satu bar daritimeframe.

Argumen

  • timeframe(string sederhana) timeframe. opsional. default adalah timeframe.period.

PengamatanUntuktimeframeFungsi >= 1M menghitung jumlah detik berdasarkan 30.4167 (365/12) hari dalam sebulan.

Lihat juga input.timeframe timeframe.period

Tick

ticker.heikinashi

Membuat pengidentifikasi ticker untuk meminta rata-rata rata-rata int representasi nilai.

ticker.heikinashi(symbol)

Contoh

heikinashi_close = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, close)

heikinashi_aapl_60_close = request.security(ticker.heikinashi(syminfo.tickerid), "60", close)
plot(heikinashi_close)
plot(heikinashi_aapl_60_close)

PengembalianNilai string dari kode saham yang dapat diberikan ke fungsi request.security.

Argumen

  • symbol(string sederhana) pengidentifikasi kode produk.

Lihat juga syminfo.tickerid syminfo.ticker request.security

permintaan

request.data

Minta data eksternal.

request.data(url, attribute)

Contoh

/*backtest
start: 2024-09-01 16:00:00
end: 2024-10-10 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
args: [["RunMode",1,358374],["ZPrecision",0,358374]]
*/

var chart_data = "https://www.datadata.com/api/v1/query/ebe46218-c5c6-4366-8c72-413694417976/data"
spotPrice = request.data(chart_data, "$.spot_close_price")
futuresPrice = request.data(chart_data, "$.future_close_price")
diff = futuresPrice - spotPrice

plot(diff, "perpetual-spot difference")
plot(futuresPrice, "futures prices", overlay=true)
plot(spotPrice, "spot prices", overlay=true)

if diff > 80 and strategy.position_size >= 0
    runtime.log("diff > 80")
    strategy.entry("Enter Short", strategy.short)
if diff < 60 and strategy.position_size <= 0
    runtime.log("diff < 60")
    strategy.entry("Enter Short", strategy.long)

Nilai kembaliArgumen atribut menentukan deret data.

Argumen

  • url(string sederhana) URL sumber data yang diminta dan format data dari tanggapan sumber data harus memenuhi persyaratan (termasuk setidaknya waktu dan atribut data):{"data": [], "schema": ["time", "data"]}Anda dapat merujuk pada format data dalam contoh:

    {
        "data": [
            [1720051200000, "{\"spot_close_price\" : 57050.01, \"future_close_price\" : 57045.9}"],
            [1720137600000, "{\"spot_close_price\" : 56628.79, \"future_close_price\" : 56604.9}"],
            // ...
        ],
        "schema": ["time", "data"]
    }
    
  • attribute(simple string) menentukan nama atribut dan mengembalikan data yang diperlukan."$.spot_close_price", gunakan$.sebagai awalan, dan nama atribut konsisten dengan atribut di bidang data dalam data dalam tanggapan ketika meminta sumber data

Jika muncul kesalahan, Anda perlu memeriksa apakah rentang waktu yang diminta olehrequest.datakonsisten dengan rentang waktu yang ditetapkan untuk backtest. Jika tidak ada data yang dapat ditanyakan dalam seri waktu backtest, kesalahan akan dilaporkan.

Pernyataan SQL data-data data query dalam contoh ini adalah:

WITH latest_data AS (
    SELECT 
        klines.spot_1d.Time AS time,
        CONCAT('{\"spot_close_price\" : ', klines.spot_1d.Close, ', \"future_close_price\" : ', klines.future_1d.Close, '}') AS data
    FROM 
        klines.spot_1d
    JOIN 
        klines.future_1d
    ON 
        klines.spot_1d.Time = klines.future_1d.Time
    WHERE
        klines.spot_1d.Symbol = 'btc_usdt'
    AND 
        klines.future_1d.Symbol = 'btc_usdt.swap'
    AND 
        klines.spot_1d.Exchange = 'Binance'
    AND 
        klines.future_1d.Exchange = 'Binance'
    ORDER BY 
        klines.spot_1d.Time DESC
    LIMIT 100
)
SELECT * FROM latest_data
ORDER BY time ASC;

Anda dapat menanyakan dan membuat link data diEksplorasi Datahalaman platform FMZ, yang merupakanhttps://www.datadata.com/api/v1/query/ebe46218-c5c6-4366-8c72-413694417976/datadigunakan dalam contoh.

request.security

Minta variasi/resolusi lain.

request.security(symbol, timeframe, expression, gaps, lookahead, ignore_invalid_symbol, currency) 

Contoh

s = request.security(syminfo.tickerid, "D", close) // 1 Day
plot(s)

expr = ta.sma(close, 10)
s1 = request.security(syminfo.tickerid, "240", expr) // 240 Minutes
plot(s1)

// To avoid difference in calculation on history/realtime you can request not latest values and use merge strategy flags as follows:
s2 = request.security(syminfo.tickerid, "D", close[1], barmerge.gaps_off, barmerge.lookahead_on)
plot(s2)
f() => [open, high]
[o, h] = request.security(syminfo.tickerid, "D", f())
[l, c] = request.security(syminfo.tickerid, "D", [low, close])
plot((o + h + l + c) / 4)

PengembalianSeri yang diminta

Argumen

  • symbolSimbol.
  • timeframe(string sederhana) Periode waktu. string kosong ditafsirkan sebagai resolusi saat ini dari grafik.
  • expression(series int/float/bool/color) Sebuah ekspresi dapat dihitung dan dikembalikan dari panggilan request.security.
  • gaps(barmerge_gaps) Merge strategi untuk data yang diminta (data yang diminta secara otomatis bergabung dengan data OHLC seri utama). Nilai yang mungkin: barmerge.gaps_on, barmerge.gaps_off. barmerge.gaps_on - data yang diminta digabungkan dengan kemungkinan kesenjangan (tidak ada nilai). barmerge.gaps_off - data yang diminta digabungkan terus-menerus tanpa kesenjangan, semua kesenjangan diisi dengan nilai terdekat sebelumnya. Nilai default adalah barmerge.gaps_off.
  • lookahead(barmerge_lookahead) Merge strategi untuk posisi data yang diminta. Nilai yang mungkin: barmerge.lookahead_on, barmerge.lookahead_off. Nilai default adalah barmerge.lookahead_off mulai dari versi 3. Perhatikan bahwa perilaku adalah sama pada real-time, dan hanya berbeda pada riwayat.
  • ignore_invalid_symbol(const bool) Argumen opsional. Menentukan perilaku fungsi jika simbol yang ditentukan tidak ditemukan: jika false, skrip akan berhenti dan mengembalikan kesalahan runtime; jika true, fungsi akan mengembalikan na dan eksekusi akan dilanjutkan. Nilai default adalah false.
  • currency(string sederhana) Mata uang ke dalam simbol nilai terkait mata uang (misalnya OHLC) yang akan dikonversi.expressionnilai yang digunakan adalah berdasarkan nilai yang dikonversi. Nilai konversi yang digunakan adalah berdasarkan nilai harian pasangan FX_IDC hari sebelumnya (berkaitan dengan bar di mana perhitungan dilakukan). Opsional. Standar adalah syminfo.currency. Nilai yang mungkin: string tiga huruf dengan kode mata uang dalam format ISO 4217 (misalnya USD) atau salah satu konstanta dalam ruang nama mata uang.*, misalnya currency.USD.

PengamatanKode PineScript yang menggunakan fungsi ini bisa menghitung secara berbeda pada data riwayat dan real-time. Jika Anda ingin menentukan argumen tambahan untuk simbol yang diminta, misalnya sesi atau jenis penyesuaian, Anda dapat menggunakanticker.new() fungsi. Tidak mungkin untuk melewati penyebaran ke fungsi ini menggunakan ticker variabel. Anda dapat menggunakan ticker.new variabel atau representasi string ticker, misalnya AAPL+MSFT*TSLA. Saat ini, hingga 40 panggilan request.security dapat hadir dalam sebuah skrip. Harap dicatat bahwa menggunakan variabel/fungsi ini dapat menyebabkan pencelupan ulang indikator.

Nilai yang diizinkan untuk argumen resolusi adalah: 1S, 5S, 15S, 30S - untuk interval detik (resolusi grafik harus kurang dari atau sama dengan resolusi yang diminta) dari 1 sampai 1440 untuk menit dari 1D sampai 365D untuk hari dari 1W sampai 52W selama berminggu-minggu dari 1M sampai 12M selama berbulan-bulan

Lihat juga syminfo.ticker syminfo.tickerid timeframe.period ta.correlation barmerge.lookahead_off barmerge.lookahead_on

str

str.contains

Mengembalikan true jikasourcestring berisistrSubstring, palsu sebaliknya.

str.contains(source, str)

Contoh

// If the current chart is a continuous futures chart, e.g "BTC1!", then the function will return true, false otherwise.
var isFutures = str.contains(syminfo.tickerid, "!")
plot(isFutures ? 1 : 0)

PengembalianBenar jikastrditemukan disourcestring, palsu sebaliknya.

Argumen

  • source(Seri string) string sumber.
  • str(Seri string) Substring untuk mencari.

Lihat juga str.pos str.match

str.endswith

Mengembalikan true jikasourcestring berakhir dengan substring yang ditentukan dalamstr, palsu sebaliknya.

str.endswith(source, str)

PengembalianBenar jikasourcestring berakhir dengan substring yang ditentukan dalamstr, palsu sebaliknya.

Argumen

  • source(Seri string) string sumber.
  • str(Seri string) Substring untuk mencari.

Lihat juga str.startswith

str.startswith

Mengembalikan true jikasourcestring dimulai dengan substring yang ditentukan dalamstr, palsu sebaliknya.

str.startswith(source, str)

PengembalianBenar jikasourcestring dimulai dengan substring yang ditentukan dalamstr, palsu sebaliknya.

Argumen

  • source(Seri string) string sumber.
  • str(Seri string) Substring untuk mencari.

Lihat juga str.endswith

str.substring

Mengembalikan string baru yang merupakan substring darisourceSubstring dimulai dengan karakter pada indeks yang ditentukan olehbegin_posdan meluas ke end_pos - 1 darisource string.

str.substring(source, begin_pos)
str.substring(source, begin_pos, end_pos)

Contoh

sym= "EXCHANGE_NAME:SYMBOL_NAME"
pos = str.pos(sym, ":")        // Get position of ":" character
tkr= str.substring(sym, pos+1) // "SYMBOL_NAME"
if barstate.islastconfirmedhistory
    runtime.log(tkr)

PengembalianSubstring yang diekstrak dari string sumber.

Argumen

  • source(seri string) sumber string dari mana untuk mengekstrak substring.
  • begin_pos(series int) Posisi awal dari substring yang diekstraksi.
  • end_pos(series int) Posisi akhir. Ini eksklusif (string yang diekstraksi TIDAK termasuk karakter posisi itu). Opsional.source string.

PengamatanIndeks string dimulai dari 0. Jikabegin_possama denganend_pos, fungsi mengembalikan string kosong.

Lihat juga str.contains str.pos str.match

str.tonumber

str.tonumber(string)

PengembalianVersi float dari string jika berisi nomor yang valid, atau sebaliknya.

Argumen

  • string(seri string) Representasi string dari int atau float.

str.format

Mengkonversi string format dan value ((s) ke dalam string yang diformat. String format dapat berisi teks literal dan satu placeholder dalam kurung iket {} untuk setiap nilai yang akan diformat. Setiap placeholder terdiri dari indeks dari argumen yang diperlukan (mulai dari 0) yang akan menggantinya, dan spesifikasi format opsional. Indeks mewakili posisi argumen itu dalam daftar argumen str.format.

str.format(formatString, arg0, arg1, ...)

Contoh

// The format specifier inside the curly braces accepts certain modifiers:
// - Specify the number of decimals to display:
s1 = str.format("{0,number,#.#}", 1.34) // returns: 1.3
runtime.log(s1)

// - Round a float value to an integer:
s2 = str.format("{0,number,integer}", 1.34) // returns: 1
runtime.log(s2)

// - Display a number in currency:
s3 = str.format("{0,number,currency}", 1.34) // returns: $1.34
runtime.log(s3)

// - Display a number as a percentage:
s4 = str.format("{0,number,percent}", 0.5) // returns: 50%
runtime.log(s4)

// EXAMPLES WITH SEVERAL ARGUMENTS
// returns: Number 1 is not equal to 4
s5 = str.format("Number {0} is not {1} to {2}", 1, "equal", 4)
runtime.log(s5)

// returns: 1.34 != 1.3
s6 = str.format("{0} != {0, number, #.#}", 1.34)
runtime.log(s6)

// returns: 1 is equal to 1, but 2 is equal to 2
s7 = str.format("{0, number, integer} is equal to 1, but {1, number, integer} is equal to 2", 1.34, 1.52)
runtime.log(s7)

// returns: The cash turnover amounted to $1,340,000.00
s8 = str.format("The cash turnover amounted to {0, number, currency}", 1340000)
runtime.log(s8)

// returns: Expected return is 10% - 20%
s9 = str.format("Expected return is {0, number, percent} - {1, number, percent}", 0.1, 0.2)
runtime.log(s9)

PengembalianString yang diformat.

Argumen

  • formatString(Seri string) Format string.
  • arg0, arg1, ...(seri int/float/bool/string/na/int[]/float[]/bool[]/string[]) Nilai untuk diformat.

PengamatanSetiap kurung keriting dalam pola yang tidak dikutip harus seimbang. Misalnya, ab {0} de dan ab } de adalah pola yang valid, tetapi ab {0} de, ab } de dan { tidak.

str.length

Mengembalikan bilangan bulat yang sesuai dengan jumlah karakter dalam string itu.

str.length(string)

PengembalianJumlah karakter dalam string sumber.

Argumen

  • string(Seri string) string sumber.

str.lower

Mengembalikan string baru dengan semua huruf dikonversi ke huruf kecil.

str.lower(source)

PengembalianSebuah string baru dengan semua huruf dikonversi ke huruf kecil.

Argumen

  • source(Seri string) String untuk dikonversi.

Lihat juga str.upper

str.upper

Mengembalikan string baru dengan semua huruf dikonversi ke huruf besar.

str.upper(source)

PengembalianSebuah string baru dengan semua huruf dikonversi ke huruf besar.

Argumen

  • source(Seri string) String untuk dikonversi.

Lihat juga str.lower

str.match

Mengembalikan substring baru darisourcestring jika itu cocok aregexekspresi reguler, na sebaliknya.

str.match(source, regex) 

Contoh

s = input.string("It's time to sell some EXCHANGE_NAME:SYMBOL_NAME!")

// finding first substring that matches regular expression "[\w]+:[\w]+"
var string tickerid = str.match(s, "[\\w]+:[\\w]+")

if barstate.islastconfirmedhistory
    runtime.log(tickerid) // "EXCHANGE_NAME:SYMBOL_NAME"

PengembalianSubstring baru darisourcestring jika itu cocok aregexekspresi reguler, na sebaliknya.

Argumen

  • source(Seri string) string sumber.
  • regex(serangkaian string) Ekspresi reguler yang string ini akan dicocokkan.

PengamatanFungsi mengembalikan kejadian pertama dari ekspresi reguler dalamsourcetali. Simbol backslash diregexstring perlu dihindari dengan backslash tambahan, misalnya \d berarti ekspresi reguler \d.

Lihat juga str.contains str.substring

str.pos

Mengembalikan posisi dari kejadian pertama daristrstring disourcestring, na sebaliknya.

str.pos(source, str)

PengembalianPosisi daristrstring disource string.

Argumen

  • source(Seri string) string sumber.
  • str(Seri string) Substring untuk mencari.

PengamatanIndeks string dimulai dari 0.

Lihat juga str.contains str.match str.substring

str.replace

Mengembalikan string baru dengan kejadian N + 1 daritargetstring dan kejadian sebelumnya daritargetstring diganti denganreplacementstring, di mana N ditentukan dalamoccurrence. N adalah indeks pencocokan string target yang akan diganti dalam string sumber.

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

Contoh

var source = "EXCHANGE1:SYMBOL1 / EXCHANGE1:SYMBOL2"

// Replace first occurrence of "EXCHANGE1" with "EXCHANGE2" replacement string
var newSource = str.replace(source, "EXCHANGE1",  "EXCHANGE2", 0)

if barstate.islastconfirmedhistory
    // Display "EXCHANGE1:SYMBOL1 / EXCHANGE1:SYMBOL2"
    runtime.log(newSource)

PengembalianBenang yang diproses.

Argumen

  • source(Seri string) string sumber.
  • target(Seri string) String untuk diganti.
  • replacement(Seri string) string untuk dimasukkan sebagai gantinya string target.
  • occurrence(series int) Indeks pencocokan dari terjadinya string target yang akan diganti dalam string sumber Indexing dimulai dari 0 untuk pencocokan pertama. Opsional. Nilai default adalah 0.

Lihat juga str.replace_all str.match

str.replace_all

Mengganti setiap kejadian string target dalam string sumber dengan string pengganti.

str.replace_all(source, target, replacement)

PengembalianBenang yang diproses.

Argumen

  • source(Seri string) string sumber.
  • target(Seri string) String untuk diganti.
  • replacement(seri string) string yang akan diganti untuk setiap kejadian string target.

str.split

Membagi string ke dalam array substring dan mengembalikan ID arraynya.

str.split(string, separator)

PengembalianID dari array string.

Argumen

  • string(Seri string) string sumber.
  • separatorString yang memisahkan setiap substring.

str.tostring

str.tostring(value)
str.tostring(value, format)
str.tostring(value[])
str.tostring(value[], format)

PengembalianPerwakilan string darivaluePerdebatan. Jikavalueargumen adalah string, itu dikembalikan seperti itu. Ketikavalueadalah na, fungsi mengembalikan string NaN.

Argumen

  • value(seri int/float/bool/string/int[]/float[]/bool[]/string[]) Nilai atau ID array yang elemennya dikonversi menjadi string.
  • format(seri string) Format string. Menerima format ini.* konstanta: format.mintick, format.persen, format.volume. Opsional. Nilai default adalah #.##########

PengamatanPemformatan nilai float juga akan melingkarkan nilai-nilai tersebut bila diperlukan, misalnya str.tostring ((3.99, #) akan mengembalikan 4. Untuk menampilkan nol terakhir, gunakan 0 bukan #. Misalnya, #.000. Ketika menggunakan format.mintick, nilai akan dibulatkan ke angka terdekat yang dapat dibagi dengan syminfo.mintick tanpa sisanya. Jika argumen x adalah string, nilai string yang sama akan dikembalikan. Argumen tipe Bool mengembalikan true atau false. Ketika x adalah na, fungsi mengembalikan NaN.

warna

color.new

Warna fungsi menerapkan transparansi yang ditentukan pada warna yang diberikan.

color.new(color, transp)

Contoh

plot(close, color=color.new(color.red, 50))

PengembalianWarna dengan transparansi tertentu.

Argumen

  • color(warna seri)
  • transp(seri int/float) Nilai yang mungkin adalah dari 0 (tidak transparan) hingga 100 (tidak terlihat).

PengamatanMenggunakan argumen yang bukan konstanta (misalnya, simple, input atau series) akan berdampak pada warna yang ditampilkan di tab Settings/Style skrip. Lihat Manual Pengguna untuk informasi lebih lanjut.

color.rgb

Membuat warna baru dengan transparansi menggunakan model warna RGB.

color.rgb(red, green, blue, transp)

Contoh

plot(close, color=color.rgb(255, 0, 0, 50))

PengembalianWarna dengan transparansi tertentu.

Argumen

  • red(seri int/float) Komponen warna merah.
  • green(seri int/float) Komponen warna hijau.
  • blue(seri int/float) Komponen warna biru.
  • transp(seri int/float) Opsional. Transparansi warna. Nilai yang mungkin adalah dari 0 (merah) hingga 100 (tidak terlihat). Nilai default adalah 0.

PengamatanMenggunakan argumen yang bukan konstanta (misalnya, simple, input atau series) akan berdampak pada warna yang ditampilkan di tab Settings/Style skrip. Lihat Manual Pengguna untuk informasi lebih lanjut.

waktu berjalan

runtime.debug

Cetak informasi variabel ke konsol.

Fungsi khusus bahasa FMZ PINE,runtime.debug(value), dengan hanya argumen.

runtime.log

Isi output di log.

Fungsi khusus bahasa FMZ PINE,runtime.log(1, 2, 3, close, high, ...), Anda dapat melewati beberapa argumen.

runtime.error

Ketika dipanggil, menyebabkan kesalahan runtime dengan pesan kesalahan yang ditentukan dalammessage argument.

runtime.error(message)

Argumenpesan (serangkaian string) pesan kesalahan.

input

input

Menambahkan input ke tab Input dari Pengaturan skrip Anda, yang memungkinkan Anda untuk menyediakan opsi konfigurasi untuk pengguna skrip. Fungsi ini secara otomatis mendeteksi jenis argument yang digunakan untuk defval dan menggunakan widget input yang sesuai.

input(defval, title, tooltip, inline, group)
input(defval, title, inline, group, tooltip)

Contoh

i_switch = input(true, "On/Off")     // Set true, the default is checked.
plot(i_switch ? open : na)

i_len = input(7, "Length")
i_src = input(close, "Source")       // Drop-down box, select close by default.
plot(ta.sma(i_src, i_len))

i_col = input(color.red, "Plot Color")
plot(close, color=i_col)

i_text = input("Hello!", "Message")
runtime.log(i_text)

PengembalianNilai variabel input.

Argumen

  • defval(const int/float/bool/string/color or source-type built-in) Menentukan nilai default dari variabel input yang diusulkan dalam tab Settings/Inputs script, dari mana pengguna script dapat mengubahnya.close, hlc3, dll.
  • title(const string) Judul input. Jika tidak ditentukan, nama variabel digunakan sebagai judul inputs. Jika judul ditentukan, tetapi kosong, namanya akan menjadi string kosong.
  • tooltip(const string) string yang akan ditampilkan kepada pengguna saat menggeser ikon tooltip.
  • inline(const string) Menggabungkan semua panggilan input menggunakan argumen yang sama dalam satu baris. string yang digunakan sebagai argumen tidak ditampilkan.
  • group(const string) Membuat header di atas semua input menggunakan string argumen grup yang sama.

PengamatanHasil dari fungsi input selalu harus ditugaskan ke variabel, lihat contoh di atas.

Lihat juga input.bool input.color input.int input.float input.string input.timeframe input.source

input.source

Menambahkan input ke tab Input dari Pengaturan skrip Anda, yang memungkinkan Anda untuk menyediakan opsi konfigurasi untuk pengguna skrip. Fungsi ini menambahkan dropdown yang memungkinkan pengguna untuk memilih sumber untuk perhitungan, misalnya close, hl2, dll. Jika skrip hanya mencakup satu input.source() panggilan, pengguna juga dapat memilih output dari indikator lain pada grafik mereka sebagai sumber.

input.source(defval, title, tooltip, inline, group)

Contoh

i_src = input.source(close, "Source")
plot(i_src)

PengembalianNilai variabel input.

Argumen

  • defval(series int/float) Menentukan nilai default dari variabel input yang diusulkan dalam tab Settings/Inputs skrip, dari mana pengguna dapat mengubahnya.
  • title(const string) Judul input. Jika tidak ditentukan, nama variabel digunakan sebagai judul inputs. Jika judul ditentukan, tetapi kosong, namanya akan menjadi string kosong.
  • tooltip(const string) string yang akan ditampilkan kepada pengguna saat menggeser ikon tooltip.
  • inline(const string) Menggabungkan semua panggilan input menggunakan argumen yang sama dalam satu baris. string yang digunakan sebagai argumen tidak ditampilkan.
  • group(const string) Membuat header di atas semua input menggunakan string argumen grup yang sama.

PengamatanHasil dari fungsi input.source selalu harus ditugaskan ke variabel, lihat contoh di atas.

Lihat juga input.bool input.int input.float input.string input.timeframe input.color input

input.string

Menambahkan input ke tab Input dari Pengaturan skrip Anda, yang memungkinkan Anda untuk menyediakan opsi konfigurasi untuk pengguna skrip. Fungsi ini menambahkan bidang untuk input string ke input skrip.

input.string(defval, title, options, tooltip, inline, group, confirm)

Contoh

i_text = input.string("Hello!", "Message")
runtime.log(i_text)

PengembalianNilai variabel input.

Argumen

  • defval(const string) Menentukan nilai default dari variabel input yang diusulkan dalam tab Settings/Inputs script, dari mana pengguna dapat mengubahnya.optionsArgumen, nilai harus salah satunya.
  • title(const string) Judul input. Jika tidak ditentukan, nama variabel digunakan sebagai judul inputs. Jika judul ditentukan, tetapi kosong, namanya akan menjadi string kosong.
  • options(Daftar konstanta: [...]) Daftar pilihan untuk dipilih.
  • tooltip(const string) string yang akan ditampilkan kepada pengguna saat menggeser ikon tooltip.
  • inline(const string) Menggabungkan semua panggilan input menggunakan argumen yang sama dalam satu baris. string yang digunakan sebagai argumen tidak ditampilkan.
  • group(const string) Membuat header di atas semua input menggunakan string argumen grup yang sama.
  • confirm(const bool) Jika true, maka pengguna akan diminta untuk mengkonfirmasi nilai input sebelum indikator ditambahkan ke grafik. Nilai default adalah false.

PengamatanHasil dari fungsi input.string selalu harus ditugaskan ke variabel, lihat contoh di atas.

Lihat juga input.bool input.int input.float input.timeframe input.source input.color input

input.bool

Menambahkan input ke tab Input dari Pengaturan skrip Anda, yang memungkinkan Anda untuk menyediakan opsi konfigurasi untuk pengguna skrip. Fungsi ini menambahkan tanda centang ke input skrip.

input.bool(defval, title, tooltip, inline, group, confirm)

Contoh

i_switch = input.bool(true, "On/Off")
plot(i_switch ? open : na)

PengembalianNilai variabel input.

Argumen

  • defval(const bool) Menentukan nilai default dari variabel input yang diusulkan di tab Settings/Inputs skrip, dari mana pengguna dapat mengubahnya.
  • title(const string) Judul input. Jika tidak ditentukan, nama variabel digunakan sebagai judul inputs. Jika judul ditentukan, tetapi kosong, namanya akan menjadi string kosong.
  • tooltip(const string) string yang akan ditampilkan kepada pengguna saat menggeser ikon tooltip.
  • inline(const string) Menggabungkan semua panggilan input menggunakan argumen yang sama dalam satu baris. string yang digunakan sebagai argumen tidak ditampilkan.
  • group(const string) Membuat header di atas semua input menggunakan string argumen grup yang sama.
  • confirm(const bool) Jika true, maka pengguna akan diminta untuk mengkonfirmasi nilai input sebelum indikator ditambahkan ke grafik. Nilai default adalah false.

PengamatanHasil dari fungsi input.bool selalu harus ditugaskan ke variabel, lihat contoh di atas.

Lihat juga input.int input.float input.string input.timeframe input.source input.color input

input.int

Menambahkan input ke tab Input dari Pengaturan skrip Anda, yang memungkinkan Anda untuk menyediakan opsi konfigurasi untuk pengguna skrip. Fungsi ini menambahkan bidang untuk input bilangan bulat ke input skrip.

input.int(defval, title, minval, maxval, step, tooltip, inline, group, confirm) 
input.int(defval, title, options, tooltip, inline, group, confirm)

Contoh

i_len1 = input.int(10, "Length 1", minval=5, maxval=21, step=1)
plot(ta.sma(close, i_len1))

i_len2 = input.int(10, "Length 2", options=[5, 10, 21])
plot(ta.sma(close, i_len2))

PengembalianNilai variabel input.

Argumen

  • defval(const int) Menentukan nilai default dari variabel input yang diusulkan di tab Settings/Inputs script, dari mana pengguna script dapat mengubahnya.optionsArgumen, nilai harus salah satunya.
  • title(const string) Judul input. Jika tidak ditentukan, nama variabel digunakan sebagai judul inputs. Jika judul ditentukan, tetapi kosong, namanya akan menjadi string kosong.
  • minval(const int) Nilai minimal dari variabel input.
  • maxval(const int) Nilai maksimum variabel input. Opsional.
  • step(const int) Nilai langkah yang digunakan untuk meningkatkan / mengurangi input. Opsional. default adalah 1.
  • options(tuple of const int values: [val1, val2,...]) Daftar opsi untuk dipilih dari menu dropdown, dipisahkan oleh koma dan disertakan dalam tanda kurung persegi: [val1, val2,...].minval, maxvaldanstepargument tidak dapat digunakan.
  • tooltip(const string) string yang akan ditampilkan kepada pengguna saat menggeser ikon tooltip.
  • inline(const string) Menggabungkan semua panggilan input menggunakan argumen yang sama dalam satu baris. string yang digunakan sebagai argumen tidak ditampilkan.
  • group(const string) Membuat header di atas semua input menggunakan string argumen grup yang sama.
  • confirm(const bool) Jika true, maka pengguna akan diminta untuk mengkonfirmasi nilai input sebelum indikator ditambahkan ke grafik. Nilai default adalah false.

PengamatanHasil dariinput.intfungsi harus selalu ditugaskan untuk variabel, lihat contoh di atas.

Lihat juga input.bool input.float input.string input.timeframe input.source input.color input

input.float

Menambahkan input ke tab Input dari Pengaturan skrip Anda, yang memungkinkan Anda untuk menyediakan opsi konfigurasi untuk pengguna skrip. Fungsi ini menambahkan bidang untuk input float ke input skrip.

input.float(defval, title, minval, maxval, step, tooltip, inline, group, confirm)
input.float(defval, title, options, tooltip, inline, group, confirm)

Contoh

i_angle1 = input.float(0.5, "Sin Angle", minval=-3.14, maxval=3.14, step=0.02)
plot(math.sin(i_angle1) > 0 ? close : open, "sin", color=color.green)

i_angle2 = input.float(0, "Cos Angle", options=[-3.14, -1.57, 0, 1.57, 3.14])
plot(math.cos(i_angle2) > 0 ? close : open, "cos", color=color.red)

PengembalianNilai variabel input.

Argumen

  • defval(const int/float) Menentukan nilai default dari variabel input yang diusulkan dalam tab Settings/Inputs skrip, dari mana pengguna skrip dapat mengubahnya.optionsArgumen, nilai harus salah satunya.
  • title(const string) Judul input. Jika tidak ditentukan, nama variabel digunakan sebagai judul inputs. Jika judul ditentukan, tetapi kosong, namanya akan menjadi string kosong.
  • minval(const int/float) Nilai minimum variabel input. Opsional.
  • maxval(const int/float) Nilai maksimum variabel input. Opsional.
  • step(const int/float) Nilai langkah yang digunakan untuk meningkatkan/mengurangi input. Opsional. default adalah 1.
  • options(tuple of const int/float values: [val1, val2,...]) Daftar opsi untuk dipilih dari menu dropdown, dipisahkan oleh koma dan disertakan dalam tanda kurung persegi: [val1, val2,...].minval, maxvaldanstepargument tidak dapat digunakan.
  • tooltip(const string) string yang akan ditampilkan kepada pengguna saat menggeser ikon tooltip.
  • inline(const string) Menggabungkan semua panggilan input menggunakan argumen yang sama dalam satu baris. string yang digunakan sebagai argumen tidak ditampilkan.
  • group(const string) Membuat header di atas semua input menggunakan string argumen grup yang sama.
  • confirm(const bool) Jika true, maka pengguna akan diminta untuk mengkonfirmasi nilai input sebelum indikator ditambahkan ke grafik. Nilai default adalah false.

PengamatanHasil dari fungsi input.float harus selalu ditugaskan ke variabel, lihat contoh di atas.

Lihat juga input.bool input.int input.string input.timeframe input.source input.color input

input.color

Menambahkan input ke tab Input dari Pengaturan skrip Anda, yang memungkinkan Anda untuk menyediakan opsi konfigurasi untuk pengguna skrip. Fungsi ini menambahkan pemilih warna yang memungkinkan pengguna untuk memilih warna dan transparansi, baik dari palet atau nilai hex.

input.color(defval, title, tooltip, inline, group, confirm) 

Contoh

i_col = input.color(color.red, "Plot Color")
plot(close, color=i_col)

PengembalianNilai variabel input.

Argumen

  • defval(const color) Menentukan nilai default dari variabel input yang diusulkan di tab Settings/Inputs skrip, dari mana pengguna dapat mengubahnya.
  • title(const string) Judul input. Jika tidak ditentukan, nama variabel digunakan sebagai judul inputs. Jika judul ditentukan, tetapi kosong, namanya akan menjadi string kosong.
  • tooltip(const string) string yang akan ditampilkan kepada pengguna saat menggeser ikon tooltip.
  • inline(const string) Menggabungkan semua panggilan input menggunakan argumen yang sama dalam satu baris. string yang digunakan sebagai argumen tidak ditampilkan.
  • group(const string) Membuat header di atas semua input menggunakan string argumen grup yang sama.
  • confirm(const bool) Jika true, maka pengguna akan diminta untuk mengkonfirmasi nilai input sebelum indikator ditambahkan ke grafik. Nilai default adalah false.

PengamatanHasil dari fungsi input.color selalu harus ditugaskan ke variabel, lihat contoh di atas.

Lihat juga input.bool input.int input.float input.string input.timeframe input.source input

input.price

Menambahkan input harga ke tab Settings/Inputs dari script.confirm = truemengaktifkan mode input interaktif di mana harga dipilih dengan mengklik grafik.

input.price(defval, title, tooltip, inline, group, confirm) 

Contoh

price1 = input.price(title="Date", defval=42)
plot(price1)

price2 = input.price(54, title="Date")
plot(price2)

PengembalianNilai variabel input.

Argumen

  • defval(const int/float) Menentukan nilai default dari variabel input yang diusulkan dalam tab Settings/Inputs skrip, dari mana pengguna dapat mengubahnya.
  • title(const string) Judul input. Jika tidak ditentukan, nama variabel digunakan sebagai judul inputs. Jika judul ditentukan, tetapi kosong, namanya akan menjadi string kosong.
  • tooltip(const string) string yang akan ditampilkan kepada pengguna saat menggeser ikon tooltip.
  • inline(const string) Menggabungkan semua panggilan input menggunakan argumen yang sama dalam satu baris. string yang digunakan sebagai argumen tidak ditampilkan.
  • group(const string) Membuat header di atas semua input menggunakan string argumen grup yang sama.
  • confirm(const bool) Jika benar, mode input interaktif diaktifkan dan seleksi dilakukan dengan mengklik grafik ketika indikator ditambahkan ke grafik, atau dengan memilih indikator dan memindahkan seleksi setelah itu. Opsional.

PengamatanKetika menggunakan mode interaktif, input waktu dapat dikombinasikan dengan input harga jika kedua panggilan fungsi menggunakan argumen yang sama untukinline argument.

Lihat juga input.bool input.int input.float input.string input.resolution input.source input.color input

input.timeframe

Menambahkan input ke tab Input dari Pengaturan skrip Anda, yang memungkinkan Anda untuk memberikan opsi konfigurasi kepada pengguna skrip. Fungsi ini menambahkan dropdown yang memungkinkan pengguna untuk memilih timeframe tertentu melalui timeframe selector dan mengembalikannya sebagai string. Selector termasuk timeframe kustom yang mungkin telah ditambahkan pengguna menggunakan grafik Timeframe dropdown.

input.timeframe(defval, title, options, tooltip, inline, group, confirm)

Contoh

i_res = input.timeframe('D', "Resolution", options=['D', 'W', 'M'])
s = request.security("syminfo.tickerid", i_res, close)
plot(s)

PengembalianNilai variabel input.

Argumen

  • defval(const string) Menentukan nilai default dari variabel input yang diusulkan dalam tab Settings/Inputs script, dari mana pengguna dapat mengubahnya.optionsArgumen, nilai harus salah satunya.
  • title(const string) Judul input. Jika tidak ditentukan, nama variabel digunakan sebagai judul inputs. Jika judul ditentukan, tetapi kosong, namanya akan menjadi string kosong.
  • options(Tup

Lebih banyak

PengemisMengapa Strategi Square Duplikat Strategi Pine Tidak Bisa Terwujud

Penemu Kuantitas - Mimpi KecilBaiklah, mari kita periksa.

PengemisOptimized Trend Tracker dari Zhang Jianhui

Penemu Kuantitas - Mimpi KecilHalo, apakah Anda ingin tahu strategi apa yang sebenarnya?