В середине 2015-го года я сделал простую, но достаточно функциональную утилиту для копирования сделок на языке программирования QPILE, потому, как новый язык программирования QLUA тогда имел много багов и недоработок. Программа оказалась популярна среди частных управляющих, как альтернатива сервисам автоследования COMON, EasyMANi и пр.
С течением времени появлялись новые пожелания по доработке существующего дубликатора. Однако, в связи с отсутствием возможности перестановки и удаления заявок на срочном рынке для языка QPILE, пришлось написать совершенно новую программу.
Почти четыре месяца назад, 18 декабря, начал разработку новой программы для копирования сделок для QUIK. Предыдущую программу на QPILE я написал менее, чем за месяц. Сначала рассчитывал сделать за пару месяцев, но проект оказался сложнее раза в два, чем предполагал. Ушло более 100 часов работы над программным кодом. Потом, часов 10 на описание. Пишу программы не каждый день и в своё удовольствие.
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.