Вводный курс по языку PINE Inventor Quantitative

Создано: 2022-05-30 16:23:43, Обновлено: 2022-09-28 17:10:21
comments   0
hits   8860

[TOC]

Вводный курс по языку PINE Inventor Quantitative

В дополнение к видео: Трудно ли внедрять квантовую торговлю? использовать trading view язык Pine от маленького белого до большого Quant - язык Pine для начинающих

Платформа квантовой торговли Inventor поддерживает стратегию написания языка Pine, поддерживает обратную связь, реализацию стратегий языка Pine, совместимость с более низкими версиями языка Pine.Стратегический квадратВ ней собраны и перенесены многие стратегии (скрипты) Pine.

FMZ не только поддерживает язык Pine, но и поддерживает мощную графическую функцию языка Pine. Различные функции на платформе FMZ, богатые практические инструменты, эффективное и удобное управление, а также дополнительно улучшают практичность стратегии и сценария Pine. FMZ основан на совместимости с языком Pine, а также на языке Pine производится определенная степень расширения, оптимизации и резки.

Вот краткий обзор некоторых наиболее заметных различий:

  • 1., Политика Pine на FMZ, кодовое начало версии//@versionНачинается с кодаstrategyindicatorФМЗ пока не поддерживает введение фраз в качестве обязательного требования.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”.

    • Модели закрытия и модели реального времени В Trading View мы можем просматриватьstrategyФункцияcalc_on_every_tickПараметры, чтобы настроить стратегический скрипт, который будет выполнять логику стратегии в реальном времени при каждом изменении цены.calc_on_every_tickПараметры должны быть установлены наtrueПо умолчаниюcalc_on_every_tickПараметрыfalseЭто означает, что логика стратегии будет выполняться только тогда, когда текущая K-линия BAR будет полностью завершена. На FMZ параметры настраиваются с помощью шаблона “Pine Language Transaction Class Repository”.

    Вводный курс по языку PINE Inventor Quantitative

    • Контроль за точностью количественных значений, таких как цена при выполнении стратегии, количество заказов, требуется на FMZ В trading view, поскольку можно только провести аналогичные тесты, нет проблем с точностью заказа на реальную торговлю. На FMZ можно запустить стратегию Pine в реальном режиме. Тогда требуется стратегия, которая может гибко определять ценовую точность торгового типа и точность количества заказов. Эти точности настраиваются, то есть контролируют небольшие цифры соответствующих данных, чтобы избежать того, что данные не соответствуют требованиям к отчетности биржи, что может привести к невозможности заказа.

    • Код фьючерсного контракта На FMZ торговые сорта имеют два свойства, если они являются контрактами: “торговые пары” и “контрактный код”. В дополнение к необходимости четко установить торговые пары на диске и в ретроспективном режиме, также необходимо установить конкретный контрактный код в параметре “код сорта” в шаблоне “Pine Language Trading Library”. Например, для постоянных контрактов необходимо заполнитьswap, код контракта зависит от того, есть ли у биржи такой контракт. Например, все квартальные контракты на некоторые сделки можно заполнить здесьquarter。 Эти коды контрактов совпадают с кодами контрактов на сроки, определенными в документации API языка Javascript/python/c++ FMZ.

Другие параметры, такие как минимальная загрузка и загрузка по умолчанию, приведены в документации на языке Pine.“Классическая база знаний на языке Пайн”Введение в параметры.

  • 3、runtime.debugruntime.logruntime.errorФункция расширения FMZ, используемая для дебютирования。

На платформе FMZ добавлены 3 функции для дебютирования.

  • runtime.debug: для печати информации о переменных на консоли, как правило, не используется.

  • runtime.logФункция FMZ PINE: выводит содержимое журнала.

    runtime.log(1, 2, 3, close, high, ...),可以传多个参数。
    
  • runtime.error: при вызове, вызывает ошибку во время выполнения и сопровождается сообщением об ошибке, указанной в параметре “message”.

    runtime.error(message)
    
    1. Расширенная часть функцийoverlayпараметр

Функция рисования в языке Pine на FMZplotplotshapeplotcharДобавлено.overlayПоддержка параметров, позволяющая настраивать рисунки на матрицу или подматрицу.overlayнастраиватьtrueРисунок на главной карте, настройка наfalseРисуйте на подкартинках. Это позволяет одновременно рисовать главные и подкартинки при выполнении стратегии Pine на FMZ.

  • 5、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

  • 6 Средние цены в FMZ PINE Script включают комиссионные

Например: цена заказа - 8000, продажа направлена, количество - 1 рука ((один, лист), средняя цена после сделки - не 8000, меньше 8000 ((в стоимость включена комиссионная плата)).

Основы языка Pine

Когда мы начинаем изучать основы языка Pine, мы, возможно, не знакомы с инструкциями и кодовым грамматикой некоторых примеров. Неважно, что мы не понимаем, мы можем сначала ознакомиться с концепцией, понять цель теста, или мы можем обратиться к документации языка Pine в FMZ, чтобы ознакомиться с инструкциями. Затем следуйте пошаговым шагам в руководстве, чтобы постепенно ознакомиться с различными грамматиками, инструкциями, функциями и встроенными переменными.

Исполнение модели

В начале изучения языка Pine очень важно понимать, что языковые стратегии языка Pine основаны на графике, который можно понять как серию вычислений и операций, выполняемых на графике в хронологическом порядке, начиная с самых ранних данных, уже загруженных на графике. Количество данных, первоначально загруженных на график, ограничено.bar_indexСсылается на индексную величину K-линии Bar при исполнении скрипта Pine.

plot(bar_index, "bar_index")

Вводный курс по языку PINE Inventor Quantitative

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. Если политика была установлена как “модель реального опциона”, то расчеты на реальном барсе и историческом барсе были бы совершенно разными. Каждое изменение событий на реальном барсе выполнялось бы одним кодом политики. Например, встроенные переменные.highlowcloseВ историческом Бар определены, в реальном Бар эти значения могут меняться каждый раз, когда ситуация меняется. Поэтому данные, такие как показатели, рассчитанные на основе этих значений, также изменяются в реальном времени.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")

Вводный курс по языку PINE Inventor Quantitative

Вводный курс по языку PINE Inventor Quantitative

Мы рассматриваем только сцены, выполненные в режиме реального времени в 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")

Скриншот момента А Вводный курс по языку PINE Inventor Quantitative

Скриншот момента B Вводный курс по языку PINE Inventor Quantitative

Мы изменили только одно предложение: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)

Скриншот отслеживания

Вводный курс по языку PINE Inventor Quantitative

Тест-код довольно прост, и в основном используется для изучения данных, которые ссылаются на два способа: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]

Вводный курс по языку PINE Inventor Quantitative

Причина в том, что индексация через K-линию Bar, то есть встроенные переменныеbar_indexВычислить, будут ли нарисованы знаки “A” и “B”. Знаки “A” и “B” не будут нарисованы на каждой K-линии.f(a) => a[1]Значение, которое будет цитироваться таким образом, будет связано с функцией, если функция не будет вызвана на каждом Bar.f2() => close[1]При этом используются различные значения ссылок (((, даже если[1] такой же индекс)

  • Некоторые встроенные функции должны быть рассчитаны на каждом Bar, чтобы правильно рассчитать их результаты

Вот простой пример:

  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-линии.

Как показано на рисунке:

Вводный курс по языку PINE Inventor Quantitative

Таким образом, когда мы рисуем график, мы рисуем только те данные, которые имеют значение переменной 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)

Вводный курс по языку PINE Inventor Quantitative

Временная последовательность

Концепция временной последовательности очень важна в языке Пайн, и это концепция, которую мы должны понять, когда учимся языку Пайн. Временная последовательность не является типом, а основной структурой для хранения последовательных значений переменных во времени. Мы знаем, что сценарий Пайна основан на диаграммах.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. Для измерения скорости мы используем “модель закрытия цен” для обратной проверки.

Вводный курс по языку PINE Inventor Quantitative

Мы можем вычислить, что 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Это действительно совпадение

Вводный курс по языку PINE Inventor Quantitative

Так же я могу использовать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 Inventor Quantitative

Структура сценария

Общая структура

В начале урока мы рассказали о некоторых отличиях между использованием языка Pine в FMZ и в Trading View.indicator()strategy()И, временно не поддерживаю.library()Конечно, для совместимости с более ранними версиями сценария Pine, при составлении стратегии входили такие вещи, как://@version=5indicator()strategy()Некоторые параметры политики также доступны вstrategy()Настройка передаточных параметров в функции.

<version>
<declaration_statement>
<code>

<version>Информация о контроле версий может быть пропущена.

Примечание

Язык Пайн//Как однострочные комментарии, FMZ расширяет комментарии, поскольку в языке Pine нет многострочных комментариев/**/Для многострочных комментариев.

Код

Сценарий, не содержащий комментарии или инструкции компилятора, является предложением, реализующим алгоритм сценария. Сценарий может быть одним из этих элементов.

  • Заявление переменной
  • Переоценка переменной
  • Заявление функции
  • Встроенные функции, пользовательские функции
  • ifforwhileили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")

Идентификаторы и операторы

Идентификатор

Прежде чем понять переменную, мы должны сначала понять понятие колонки идентификатора колонки.функцияиПеременныеНазвание {используется для обозначения переменных, функций) }}.функцияВ следующих уроках мы узнаем, что сначала мы должны выучить кодовый знак .

  • 1. Идентификатор должен быть заглавным(A-Z)Или маленьким шрифтом.(a-z)Буквы или подчеркивание(_)Начало, как первый символ идентификатора.
  • 2, следующий за первым символом идентификатора может бытьБуквыПодчеркнутьилиЦифры
  • 3. Имена обозначений написаны в больших и малых буквах для разграничения.

Например, следующие обозначения:

fmzVar
_fmzVar
fmz666Var
funcName
MAX_LEN
max_len
maxLen
3barsDown  // 错误的命名!使用了数字字符作为标识符的开头字符

Как и в большинстве языков программирования, в языке Pine есть рекомендации по написанию. Обычно рекомендуется при наименовании идентификатора:

  • 1, все буквы заглавными используются для обозначения констант.
  • 2. ИспользованиеПравило о верховьяхНаименование для других идентификаторов.
// 命名变量、常量
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