[TOC]
В дополнение к видео: Трудно ли внедрять квантовую торговлю? использовать trading view язык Pine от маленького белого до большого Quant - язык Pine для начинающих
Платформа квантовой торговли Inventor поддерживает стратегию написания языка Pine, поддерживает обратную связь, реализацию стратегий языка Pine, совместимость с более низкими версиями языка Pine.Стратегический квадратВ ней собраны и перенесены многие стратегии (скрипты) Pine.
FMZ не только поддерживает язык Pine, но и поддерживает мощную графическую функцию языка Pine. Различные функции на платформе FMZ, богатые практические инструменты, эффективное и удобное управление, а также дополнительно улучшают практичность стратегии и сценария Pine. FMZ основан на совместимости с языком Pine, а также на языке Pine производится определенная степень расширения, оптимизации и резки.
Вот краткий обзор некоторых наиболее заметных различий:
//@version
Начинается с кодаstrategy
、indicator
ФМЗ пока не поддерживает введение фраз в качестве обязательного требования.import
Импортlibrary
функция.В некоторых из них можно увидеть тактику, которая выглядит так:
//@version=5
indicator("My Script", overlay = true)
src = close
a = ta.sma(src, 5)
b = ta.sma(src, 50)
c = ta.cross(a, b)
plot(a, color = color.blue)
plot(b, color = color.black)
plotshape(c, color = color.red)
Или вот как:
//@version=5
strategy("My Strategy", overlay=true)
longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
if (longCondition)
strategy.entry("My Long Entry Id", strategy.long)
shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
if (shortCondition)
strategy.entry("My Short Entry Id", strategy.short)
На FMZ это можно сократить до:
src = close
a = ta.sma(src, 5)
b = ta.sma(src, 50)
c = ta.cross(a, b)
plot(a, color = color.blue, overlay=true)
plot(b, color = color.black, overlay=true)
plotshape(c, color = color.red, overlay=true)
Или:
longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
if (longCondition)
strategy.entry("My Long Entry Id", strategy.long)
shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
if (shortCondition)
strategy.entry("My Short Entry Id", strategy.short)
2 , Политика (сценарий) Некоторые параметры, связанные с транзакциями, устанавливаются в интерфейсе стратегии FMZ параметром “Pine Language Transaction Class Library”.
strategy
Функцияcalc_on_every_tick
Параметры, чтобы настроить стратегический скрипт, который будет выполнять логику стратегии в реальном времени при каждом изменении цены.calc_on_every_tick
Параметры должны быть установлены наtrue
По умолчаниюcalc_on_every_tick
Параметрыfalse
Это означает, что логика стратегии будет выполняться только тогда, когда текущая K-линия BAR будет полностью завершена.
На FMZ параметры настраиваются с помощью шаблона “Pine Language Transaction Class Repository”.Контроль за точностью количественных значений, таких как цена при выполнении стратегии, количество заказов, требуется на FMZ В trading view, поскольку можно только провести аналогичные тесты, нет проблем с точностью заказа на реальную торговлю. На FMZ можно запустить стратегию Pine в реальном режиме. Тогда требуется стратегия, которая может гибко определять ценовую точность торгового типа и точность количества заказов. Эти точности настраиваются, то есть контролируют небольшие цифры соответствующих данных, чтобы избежать того, что данные не соответствуют требованиям к отчетности биржи, что может привести к невозможности заказа.
Код фьючерсного контракта
На FMZ торговые сорта имеют два свойства, если они являются контрактами: “торговые пары” и “контрактный код”. В дополнение к необходимости четко установить торговые пары на диске и в ретроспективном режиме, также необходимо установить конкретный контрактный код в параметре “код сорта” в шаблоне “Pine Language Trading Library”. Например, для постоянных контрактов необходимо заполнитьswap
, код контракта зависит от того, есть ли у биржи такой контракт. Например, все квартальные контракты на некоторые сделки можно заполнить здесьquarter
。 Эти коды контрактов совпадают с кодами контрактов на сроки, определенными в документации API языка Javascript/python/c++ FMZ.
Другие параметры, такие как минимальная загрузка и загрузка по умолчанию, приведены в документации на языке Pine.“Классическая база знаний на языке Пайн”Введение в параметры.
runtime.debug
、runtime.log
、runtime.error
Функция расширения FMZ, используемая для дебютирования。На платформе FMZ добавлены 3 функции для дебютирования.
runtime.debug
: для печати информации о переменных на консоли, как правило, не используется.
runtime.log
Функция FMZ PINE: выводит содержимое журнала.
runtime.log(1, 2, 3, close, high, ...),可以传多个参数。
runtime.error
: при вызове, вызывает ошибку во время выполнения и сопровождается сообщением об ошибке, указанной в параметре “message”.
runtime.error(message)
overlay
параметрФункция рисования в языке Pine на FMZplot
、plotshape
、plotchar
Добавлено.overlay
Поддержка параметров, позволяющая настраивать рисунки на матрицу или подматрицу.overlay
настраиватьtrue
Рисунок на главной карте, настройка наfalse
Рисуйте на подкартинках. Это позволяет одновременно рисовать главные и подкартинки при выполнении стратегии Pine на FMZ.
syminfo.mintick
Встроенные переменныеsyminfo.mintick
Встроенная переменная определяется как минимальное измерение текущей разновидности.Твердое предложение/БэктестингВ интерфейсе “Pine Language Transaction Class Library” шаблонный параметр “Pricing Currency Precision” позволяет контролировать это значение. Настройка “Pricing Currency Precision 2” означает, что цена в момент сделки точна до второго знака дроби, при этом минимальная единица изменения цены составляет 0.01.syminfo.mintick
Значение 0.01 ≠ 0.01 ≠ 0.01
Например: цена заказа - 8000, продажа направлена, количество - 1 рука ((один, лист), средняя цена после сделки - не 8000, меньше 8000 ((в стоимость включена комиссионная плата)).
Когда мы начинаем изучать основы языка Pine, мы, возможно, не знакомы с инструкциями и кодовым грамматикой некоторых примеров. Неважно, что мы не понимаем, мы можем сначала ознакомиться с концепцией, понять цель теста, или мы можем обратиться к документации языка Pine в FMZ, чтобы ознакомиться с инструкциями. Затем следуйте пошаговым шагам в руководстве, чтобы постепенно ознакомиться с различными грамматиками, инструкциями, функциями и встроенными переменными.
В начале изучения языка Pine очень важно понимать, что языковые стратегии языка Pine основаны на графике, который можно понять как серию вычислений и операций, выполняемых на графике в хронологическом порядке, начиная с самых ранних данных, уже загруженных на графике. Количество данных, первоначально загруженных на график, ограничено.bar_index
Ссылается на индексную величину K-линии Bar при исполнении скрипта Pine.
plot(bar_index, "bar_index")
plot
Функции - это одна из тех функций, которые мы будем использовать в будущем.bar_index
, линия называетсяbar_index
。 можно увидеть, что в первом Bar значение строки, названной bar_index, равняется 0, а с увеличением Bar вправо увеличивается в последовательности 1。
В зависимости от настроек стратегии, модель стратегии выполняется по-разному.收盘价模型
и实时价模型
│ │ │ │ │ │ │ │ │ │ │ │
При выполнении кода стратегии, текущий K-линейный Бар полностью выполняет цикл, а когда K-линия закрывается, то есть K-линейный цикл закончен. В этот момент выполняется логика стратегии Pine, и вызванный торговый сигнал будет выполнен в начале следующего K-линейного Бар.
При выполнении кода стратегии, текущая K-линия Bar, независимо от того, закрыта она или нет, выполняет логику стратегии Pine каждый раз при изменении ситуации, и вызванный торговый сигнал выполняется немедленно.
Когда стратегия языка Pine выполняется слева направо на графике, K-линия Bar на графике делится на历史Bar
и实时Bar
Ответ:
При запуске стратегии, настроенной на “реальную модель цены”, все K-строки на графике, за исключением одной K-строки на правой стороне, будут представлены как历史Bar
◦ Стратегическая логика в каждой корень历史Bar
Выполните это только один раз.
При запуске стратегии, настроенной на модель закрытия цены, все bars на графике будут历史Bar
◦ Стратегическая логика в каждой корень历史Bar
Выполните это только один раз.
Расчеты на основе исторической панели: Код стратегии выполняется один раз в закрытом состоянии Исторической панели, а затем он продолжает выполняться в следующей Исторической панели, пока все Исторические панели не будут выполнены один раз.
Когда стратегия выполняется на крайнем правом конце K-линии Bar, эта Bar является реальной Bar. После того, как реальная Bar закрывается, эта Bar превращается в прошедшую реальную Bar (в историческую Bar).
Когда стратегия настроена на “реальную ценовую модель”, она начинает выполняться с логикой стратегии для каждого изменения курса в реальном времени. При запуске стратегии, настроенной на “закрывающую модель цены”, на графике не отображается реальный Bar.
По расчетам Bar в реальном времени:
Если стратегия настроена на график “Модель закрытия цены” и не отображает Bar в реальном времени, код стратегии будет выполнен только один раз при закрытии текущего Bar.
Если политика была установлена как “модель реального опциона”, то расчеты на реальном барсе и историческом барсе были бы совершенно разными. Каждое изменение событий на реальном барсе выполнялось бы одним кодом политики. Например, встроенные переменные.high
、low
、close
В историческом Бар определены, в реальном Бар эти значения могут меняться каждый раз, когда ситуация меняется. Поэтому данные, такие как показатели, рассчитанные на основе этих значений, также изменяются в реальном времени.close
Это означает, что они должны быть всегда актуальными, чтобы соответствовать текущим ценам.high
иlow
Всегда представляет собой самые высокие и самые низкие значения, достигнутые с начала текущего реального бар. Эти встроенные переменные представляют собой конечные значения, достигнутые в момент последнего обновления реального бар.
Механизм обратного отката при выполнении стратегии в режиме реального времени Bar (модель цены в режиме реального времени): При выполнении Bar в реальном времени, каждый новый выпуск стратегии выполняет перезагрузку пользовательских определенных переменных, которые называются rewinds. Чтобы понять механизм rewinds, давайте рассмотрим пример, как тестировать код.
Уведомление:
/*backtest
...
..
.
*/
Пакет содержит конфигурацию отслеживания, сохраненную в коде на платформе FMZ.
/*backtest
start: 2022-06-03 09:00:00
end: 2022-06-08 15:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
*/
var n = 0
if not barstate.ishistory
runtime.log("n + 1之前, n:", n, " 当前bar_index:", bar_index)
n := n + 1
runtime.log("n + 1之后, n:", n, " 当前bar_index:", bar_index)
plot(n, title="n")
Мы рассматриваем только сцены, выполненные в режиме реального времени в Bar, поэтому используемnot barstate.ishistory
Ограничение выражения применяется только в режиме реального времени при агрегации n переменных в Bar и до и после выполнения агрегации.runtime.log
Функция выводит информацию в журнале стратегий.plot
Вычерченная кривая n может быть показана, когда стратегия находится в истории Бар, n всегда было 0. Когда она выполняется в реальном времени Бар, запускается операция n + 1, и в реальном времени Бар выполняется каждый раз, когда выполняется стратегия. Из информации о журнале можно увидеть, что каждый раз, когда выполняется стратегия, код n перенастраивается на значение, которое было в конечном итоге представлено предыдущей стратегией Bar.
Подводя итог: 1 , Код стратегии будет выполняться при каждом обновлении ситуации, когда стратегия начинает выполняться в реальном времени. 2. При выполнении в реальном времени Bar, переменная будет перевернута перед каждым исполнением кода политики. 3. При выполнении в реальном времени Bar, переменная представляется один раз при обновлении закрытия.
Поскольку данные переворачиваются, то такие операции, как изображение кривых на графике, также могут вызывать перерисовку, например, мы изменили только что тестируемый код, тестирование на реальном диске:
var n = 0
if not barstate.ishistory
runtime.log("n + 1之前, n:", n, " 当前bar_index:", bar_index)
n := open > close ? n + 1 : n
runtime.log("n + 1之后, n:", n, " 当前bar_index:", bar_index)
plot(n, title="n")
Скриншот момента А
Скриншот момента B
Мы изменили только одно предложение:n := open > close ? n + 1 : n
, в настоящее время в реальном времени Bar является отрицательной ценой (то есть цена открытия выше, чем цена закрытия). можно увидеть, что в первом графике (в момент A), так как цена открытия была выше, чем цена закрытия (то есть отрицательная цена), поэтому n накопилось 1, графическая кривая n показала значение 5 . затем, как показано во втором графике (в момент B), изменилась ситуация, цена была обновлена.
Давайте вместе рассмотрим переменные в языковых функциях Pine. Согласно описаниям в некоторых учебниках Pine, переменные в функциях отличаются от переменных вне функций следующим образом:
История серийных переменных, используемых в функции Pine, создается при каждом последовательном вызове функции. Если функция не будет вызвана в каждом столбце, выполняемом в сценарии, это приведет к различию между историческими значениями внутри локального блока функции и внешних серий. Таким образом, если функция не будет вызвана в каждом столбце, то серии, использующие одинаковые индексированные значения, ссылающиеся внутри и снаружи функции, не будут ссылаться на одинаковые исторические точки.
Это не имеет значения, мы решили задать этот вопрос с помощью тестового кода, запущенного на FMZ:
/*backtest
start: 2022-06-03 09:00:00
end: 2022-06-08 15:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
*/
f(a) => a[1]
f2() => close[1]
oneBarInTwo = bar_index % 2 == 0
plotchar(oneBarInTwo ? f(close) : na, title = "f(close)", color = color.red, location = location.absolute, style = shape.xcross, overlay = true, char = "A")
plotchar(oneBarInTwo ? f2() : na, title = "f2()", color = color.green, location = location.absolute, style = shape.circle, overlay = true, char = "B")
plot(close[2], title = "close[2]", color = color.red, overlay = true)
plot(close[1], title = "close[1]", color = color.green, overlay = true)
Скриншот отслеживания
Тест-код довольно прост, и в основном используется для изучения данных, которые ссылаются на два способа:f(a) => a[1]
иf2() => close[1]
。
f(a) => a[1]
Функция возвращается в конце:a[1]
。
f2() => close[1]
Использование встроенных переменных:close
Функция возвращается в конце .close[1]
。
[]
Символ, используемый для операций с историческими значениями переменных серии данных, close[1] это цитирование данных о цене закрытия на предыдущем барке от текущей цены закрытия. В нашем тестовом коде на графике изображены 4 вида данных:
plotchar(oneBarInTwo ? f(close) : na, title = "f(close)", color = color.red, location = location.absolute, style = shape.xcross, overlay = true, char = "A")
Нарисуйте один символ A, цвет красный, только когда oneBarInTwo является истинным, и вычеркните его место (на оси Y) как:f(close)
Вернутое значение:
plotchar(oneBarInTwo ? f2() : na, title = "f2()", color = color.green, location = location.absolute, style = shape.circle, overlay = true, char = "B")
Нарисуйте символы B и B, цвет зеленый, только если oneBarInTwo является истинным, и вычеркните их место (на оси Y) как:f2()
Вернутое значение:
plot(close[2], title = "close[2]", color = color.red, overlay = true)
Линия, окрашенная в красный цвет, расположена на оси Y следующим образом:close[2]
То есть закрытие цены на текущем Бар (на 2й корень впереди) (на 2й корень слева).
plot(close[1], title = "close[1]", color = color.green, overlay = true)
Линия, окрашенная в зеленый цвет, расположена на оси Y следующим образом:close[1]
То есть закрытие цены на текущем Бар на 1-м номере впереди ((1-м номере слева) Бар.
Скриншоты с помощью стратегии отслеживания запуска можно увидеть, хотя рисунок A маркирует функции, используемыеf(a) => a[1]
Функции, используемые для обозначенияf2() => close[1]
Использование[1] для ссылки на исторические данные по серии данных, но расположение знаков “A” и “B” на графике совершенно разное.plot(close[2], title = "close[2]", color = color.red, overlay = true)
Нарисуйте линию, используя данные из этой линии.close[2]
。
Причина в том, что индексация через K-линию Bar, то есть встроенные переменныеbar_index
Вычислить, будут ли нарисованы знаки “A” и “B”. Знаки “A” и “B” не будут нарисованы на каждой K-линии.f(a) => a[1]
Значение, которое будет цитироваться таким образом, будет связано с функцией, если функция не будет вызвана на каждом Bar.f2() => close[1]
При этом используются различные значения ссылок (((, даже если[1] такой же индекс)
Вот простой пример:
res = close > close[1] ? ta.barssince(close < close[1]) : -1
plot(res, style = plot.style_histogram, color=res >= 0 ? color.red : color.blue)
Мы вызываем функцию в коде.ta.barssince(close < close[1])
Напишите в треугольном оператореcondition ? value1 : value2
Это привело к тому, что только вclose > close[1]
Функция ta.barssince.ta.barssince
Функция рассчитывается с последнегоclose < close[1]
Количество строк K, созданных при вызове функции ta.barssince close > close[1], то есть текущая цена закрытия больше, чем цена закрытия предыдущего Bar, когда функция ta.barssince была вызвана, ее условие close < close[1] не было создано, и поэтому не было создано последнее место.
ta.barssince: при вызове, функция возвращает na。, если условие никогда не было выполнено до текущей K-линии.
Как показано на рисунке:
Таким образом, когда мы рисуем график, мы рисуем только те данные, которые имеют значение переменной res ((-1) ∈ R).
Чтобы избежать этой проблемы, мы просто используемta.barssince(close < close[1])
Функциональные вызовы берутся из треугольного оператора и записываются на любой возможный внешний условный ответвление. Это позволяет выполнять вычисления на каждом K-строке Bar.
a = ta.barssince(close < close[1])
res = close > close[1] ? a : -1
plot(res, style = plot.style_histogram, color=res >= 0 ? color.red : color.blue)
Концепция временной последовательности очень важна в языке Пайн, и это концепция, которую мы должны понять, когда учимся языку Пайн. Временная последовательность не является типом, а основной структурой для хранения последовательных значений переменных во времени. Мы знаем, что сценарий Пайна основан на диаграммах.open
Это встроенная переменная в языке Pine, структура которой состоит в том, чтобы хранить временные последовательности для каждой K-линейной Bar.open
Эта хронологическая структура представляет собой открытую цену всех K-линейных баров, когда текущая K-линейная карта начинается с первой Bar и заканчивается с Bar, выполненной в текущем сценарии. Если текущая K-линейная карта имеет 5-минутный цикл, то мы ссылаемся в коде стратегии Pine на ((или используем)open
Это цена открытия K-линии Bar при текущем исполнении кода стратегии.[]
Оператор . . Используется, когда стратегия Pine выполняется на Bar линии Kopen[1]
Указать ссылкуopen
Начальная цена предыдущего K-линейного бара, выполненного текущим сценарием в временной последовательности ((то есть начальная цена предыдущего K-линейного цикла)).
ta.cum
Примеры: ta.cum
Cumulative (total) sum of `source`. In other words it's a sum of all elements of `source`.
ta.cum(source) → series float
RETURNS
Total sum series.
ARGUMENTS
source (series int/float)
SEE ALSO
math.sum
Тестовый код:
v1 = 1
v2 = ta.cum(v1)
plot(v1, title="v1")
plot(v2, title="v2")
plot(bar_index+1, title="bar_index")
Есть много аналоговta.cum
Такие встроенные функции могут непосредственно обрабатывать данные по временным рядам, напримерta.cum
Это означает, что входящие переменные на каждой K-линии Bar должны быть суммированы, а затем мы используем график, чтобы понять.
Процесс выполнения стратегии встроенной переменной bar_index | - | - | - | - | Стратегия работает на первой K-линии Стратегия работает на второй K-линии. Стратегия работает на третьем корне K-линии Bar ≠ 2 ≠ 1 ≠ 3 ≠ |…|…|…|…| Стратегия работает на N+1 корневой K-линии
Видно, что v1, v2 и даже bar_index являются структурами временной последовательности, и на каждом Bar имеются соответствующие данные. Этот тест-код не отличается от “модели реального времени” или “модели закрытия цен” только тем, что на графике отображается реальный Bar. Для измерения скорости мы используем “модель закрытия цен” для обратной проверки.
Мы можем вычислить, что v1 будет равен 1, потому что v1 будет равен 1 на каждом столбце.ta.cum(v1)
Функция выполняется на первой K-линии Bar, и, поскольку есть только первая Bar, вычисляется 1, присваивая значение переменной v2 ◦.
Когдаta.cum(v1)
При выполнении на второй K-линии Bar, уже имеется 2 K-линии Bar ((первая соответствующая встроенная переменная bar_index = 0, вторая соответствующая встроенная переменная bar_index = 1), поэтому вычисление получает результат 2, присваивая значение переменной v2, и так далее. Фактически можно наблюдать, что v2 - это количество K-линий Bar в графике, поскольку индекс K-линийbar_index
Это будет расти с нуля.bar_index + 1
Это фактически количество K-линий. Вы также можете увидеть линии на диаграмме наблюдения.v2
иbar_index
Это действительно совпадение
Так же я могу использоватьta.cum
Встроенная функция вычисляет сумму цен на закрытие всех бар на текущем графике и может быть записана следующим образом:ta.cum(close)
, когда стратегия запускается в правую панель реального времениta.cum(close)
Результатом является сумма цен на закрытие всех бар на графике (без работы в правую сторону, только прибавление к текущему бар).
Переменные в временной последовательности также могут быть рассчитаны с помощью оператора, например, код:ta.sma(high - low, 14)
Встроенные переменныеhigh
(K Line Bar максимальная цена) минусlow
(K-Line Bar минимальные цены), последнее использованиеta.sma
Функция искала среднее значение.
v1 = ta.highest(high, 10)[1]
v2 = ta.highest(high[1], 10)
plot(v1, title="v1", overlay=true)
plot(v2, title="v2", overlay=true)
Этот тест-код работает во время обратного измерения, и можно наблюдатьv1
иv2
Значения, выделенные на графике, полностью совпадают. Результаты вычислений, вызванные функцией, оставляют следы значений в временной последовательности, например, кодta.highest(high, 10)[1]
В том числеta.highest(high, 10)
Результаты, полученные при вызове функции, также могут быть использованы[1] ссылаясь на исторические значения.ta.highest(high, 10)
И вот что получилось.ta.highest(high[1], 10)
Так что…ta.highest(high[1], 10)
иta.highest(high, 10)[1]
Совершенно равные цены.
Проверка вывода информации с помощью другой функции рисунка:
a = ta.highest(close, 10)[1]
b = ta.highest(close[1], 10)
plotchar(true, title="a", char=str.tostring(a), location=location.abovebar, color=color.red, overlay=true)
plotchar(true, title="b", char=str.tostring(b), location=location.belowbar, color=color.green, overlay=true)
Можно увидеть, что значения переменных a и b в временной последовательности отображаются в верхней и нижней части соответствующих баров. В процессе обучения можно сохранить этот графический код, поскольку во время тестирования и экспериментов часто может потребоваться выход информации на графике для наблюдения.
В начале урока мы рассказали о некоторых отличиях между использованием языка Pine в FMZ и в Trading View.indicator()
、strategy()
И, временно не поддерживаю.library()
Конечно, для совместимости с более ранними версиями сценария Pine, при составлении стратегии входили такие вещи, как://@version=5
,indicator()
,strategy()
Некоторые параметры политики также доступны вstrategy()
Настройка передаточных параметров в функции.
<version>
<declaration_statement>
<code>
<version>
Информация о контроле версий может быть пропущена.
Язык Пайн//
Как однострочные комментарии, FMZ расширяет комментарии, поскольку в языке Pine нет многострочных комментариев/**/
Для многострочных комментариев.
Сценарий, не содержащий комментарии или инструкции компилятора, является предложением, реализующим алгоритм сценария. Сценарий может быть одним из этих элементов.
if
,for
,while
илиswitch
Структура и т.д.Предложения можно составить разными способами.
空格
или制表符
(таб-клавиши) начинаются. Их первый символ также должен быть первым символом строки. Строки, начинающиеся с первой строки строки, по определению являются частью глобального масштаба сценария.local block
。 Локальный блок должен быть сжат в один значок или четыре пробела (в противном случае он будет расшифрован как последовательность кода предыдущей строки, то есть будет рассматриваться как последовательность кода предыдущей строки), и каждый локальный блок определяет другой локальный диапазон。Например, включает в себя три локальных блока, один в заявлениях с функциями на заказ, два в заявлениях с переменными с использованием if-структуры, следующим образом:
indicator("", "", true) // 声明语句(全局范围),可以省略不写
barIsUp() => // 函数声明(全局范围)
close > open // 本地块(本地范围)
plotColor = if barIsUp() // 变量声明 (全局范围)
color.green // 本地块 (本地范围)
else
color.red // 本地块 (本地范围)
runtime.log("color", color = plotColor) // 调用一个内置函数输出日志 (全局范围)
Длинные строки могут быть разделены на несколько строк, или “упакованы”. Упакованные строки должны быть сжаты в любое количество пробелов, если только они не являются кратными числами 4 (эти границы используются для сжатия локальных блоков).
a = open + high + low + close
может быть упакован в (заметьте, что количество пробелов в каждой строке не является кратным количеству 4):
a = open +
high +
low +
close
Длинный вызов plot ((() может быть упакован в。
close1 = request.security(syminfo.tickerid, "D", close) // syminfo.tickerid 当前交易对的日线级别收盘价数据系列
close2 = request.security(syminfo.tickerid, "240", close) // syminfo.tickerid 当前交易对的240分钟级别收盘价数据系列
plot(ta.correlation(close, open, 100), // 一行长的plot()调用可以被包装
color = color.new(color.purple, 40),
style = plot.style_area,
trackprice = true)
Однако, поскольку локальный блок грамматически должен начинаться со сжатия (((4 пробела или 1 значок), при разделе его на следующую строку, продолжение части предложения должно начинаться с более чем одного сжатия (((не равняется кратному количеству 4 пробелов)). Например:
test(c, o) =>
ret = c > o ?
(c > o+5000 ?
1 :
0):
(c < o-5000 ?
-1 :
0)
a = test(close, open)
plot(a, title="a")
Прежде чем понять переменную, мы должны сначала понять понятие колонки идентификатора колонки.функцияиПеременныеНазвание {используется для обозначения переменных, функций) }}.функцияВ следующих уроках мы узнаем, что сначала мы должны выучить кодовый знак .
(A-Z)
Или маленьким шрифтом.(a-z)
Буквы или подчеркивание(_)
Начало, как первый символ идентификатора.Например, следующие обозначения:
fmzVar
_fmzVar
fmz666Var
funcName
MAX_LEN
max_len
maxLen
3barsDown // 错误的命名!使用了数字字符作为标识符的开头字符
Как и в большинстве языков программирования, в языке Pine есть рекомендации по написанию. Обычно рекомендуется при наименовании идентификатора:
// 命名变量、常量
GREEN_COLOR = #4CAF50
MAX_LOOKBACK = 100
int fastLength = 7
// 命名函数
zeroOne(boolValue) => boolValue ? 1 : 0
Операторы - это операционные символы в языке программирования, которые используются для построения выражений, а выражения - это правила вычислений, разработанные для определенных целей при написании стратегий. Операторы в языке Pine подразделяются по функциям:
Операторы присвоения, операторы вычислений, операторы сравнения, логические операторы,? :
Трехмерные операторы[]
Оператор исторической ссылки
Оператор счисления*
Например, в отличие от типа вопросов, вызванных возвратом результатов оператора языка Pine в Trading View, существует следующий тест-код:
”`pine //@version=5 indicator(“”) lenInput = input.int(14, “Length”) factor = year > 2020 ? 3 : 1 adjustedLength = lenInput * factor ma = ta.ema(close, adjustedLength) // Compilatio