function cnd(x)
-- taylor series coefficients
local a1, a2, a3, a4, a5 = 0.31938153, -0.356563782, 1.781477937,-1.821255978, 1.330274429
local l = math.abs(x)
local k = 1.0 / (1.0 + 0.2316419 * l)
local w = 1.0 - 1.0 / math.sqrt(2 * math.pi) * math.exp(-l * l / 2) * (a1 * k + a2 * k * k + a3 * (k^3) + a4 * (k^4) + a5 * (k^5))
if x < 0 then w = 1.0 - w end
return w
end
-- The Black-Scholes option valuation function
-- is_call: true for call, false for put
-- s: current price
-- x: strike price
-- t: time
-- r: interest rate
-- v: volatility
function black_scholes(is_call, s, x, t, r, v)
local d1 = (math.log(s / x) + (r + v * v / 2.0) * t) / (v * math.sqrt(t))
local d2 = d1 - v * math.sqrt(t)
if is_call then
return s * cnd(d1) - x * math.exp(-r * t) * cnd(d2)
else
return x * math.exp(-r * t) * cnd(-d2) - s * cnd(-d1)
end
end
Проверено вчера на путах сишки. Расчет совпал с табличными значениями «теор цена» на июньских, сентярьских, декабрьских досках опционов.Сегодня представляю вам свой Lua-индикатор для торговой платформы QUIK, который поможет вам визуализировать ключевые уровни сопротивления и поддержки на графиках.

Этот инструмент очень полезен, но правда в том, что уровни сопротивления и поддержки у каждого трейдера могут быть разными. Это значит, что алгоритм, который использует индикатор, — это лишь моя субъективная интерпретация!
Вы также можете адаптировать скрипт под свои требования — он открыт для редактирования!
Проверьте сами! Откройте любой график на любом таймфрейме, закройте глаза и нарисуйте «горизонтальную линию». Удивитесь, насколько точно вы определили уровень, когда откроете историю графика!
Лично я не трейдер в классическом смысле, а больше инвестор. Использую уровни только на недельном таймфрейме для ребалансировки своего портфеля.
Цветовая кодировка уровней:
— Зелёная линия — уровень поддержки.
— Красная линия — уровень сопротивления.
— Серая линия — предыдущий уровень, от которого идёт тренд.
-- График должен быть открыт в Quik'е
Class = "SPBFUT" -- "CETS_MTL" "CETS"
SecId="BRK4" -- "NGJ4" "GLDRUB_TOM" "USD000UTSTOM" "SiZ3"
Intrvl = INTERVAL_H1 -- D1 -- M5
Header = "<TICKER>;<PER>;<DATE>;<TIME>;"..
"<OPEN>;<HIGH>;<LOW>;<CLOSE>;<VOL>"
Period = "60" -- Дневки - 0, W1, MN1, H4, H2 - недопустимо
function Log (i)
local t = DS:T(i)
local ymd = string.format ("%04d%02d%02d", t.year, t.month, t.day)
local hms = string.format ("%02d%02d%02d", t.hour, t.min, t.sec);
if not (IniDt <= ymd and ymd <= FinDt) or
not (IniTm <= hms and hms <= FinTm) then return end
local str = string.format ("%s;%s;%s;%s;%.4f;%.4f;%.4f;%.4f;%.0f\n"
,SecId, Period, ymd, hms
,DS:O(i), DS:H(i), DS:L(i), DS:C(i), DS:V(i))
F:write (str)
end -- Log()
function OnInit (scriptPath)
qu = require ("QuikUtil(qu)") -- lu,qc,tu
ScriptDir, ScriptName = lu.

-- Настройки
SEC_CODE = "SBER" -- Код инструмента
CLASS_CODE = "TQBR" -- Код класса инструмента
SHORT_MA_PERIOD = 10 -- Период короткой скользящей средней
LONG_MA_PERIOD = 50 -- Период длинной скользящей средней
QTY = 1 -- Количество лотов
-- Переменные
short_ma = {}
long_ma = {}
prices = {}
position = 0 -- Текущая позиция: 0 - нет позиции, 1 - лонг, -1 - шорт
-- Функция для расчета скользящей средней
function calculate_ma(prices, period)
local sum = 0
for i = #prices-period+1, #prices do
sum = sum + prices[i]
end
return sum / period
end
-- Функция для обработки новых тиков
function OnAllTrade(alltrade)
if alltrade.sec_code == SEC_CODE and alltrade.class_code == CLASS_CODE then
table.insert(prices, alltrade.price)
if #prices >= LONG_MA_PERIOD then
table.