Дневная прибыль от золота, например, GLDRUB_TOM, вычисляется как разость G1*D1-G0*D0,
где G1,G0 — цена золота в долларах на начало и конец дня,
а D1,D0 — курс (цена) доллара в рублях на начало и конец дня.
Вариационка на ММВБ считается иначе: (G1-G0)*D1.
Если за 1-й день золото выросло на 1% от 1900 до 1919, а доллар упал на 1% от 75 до 74,25,
то прибыль золота равна (-14.25) руб, а фьючерса (+1410.75) руб.
Если на 2-й день золото осталось 1919, а доллар вырос на 1% до 74.9925,
то прибыль золота равна (+1424.858) руб, а фьючерса 0 руб.
Если играть в золото день за днём, то принцип расчёта вариационки лучше отвечает целям игры.
Ведь обычно золото и все товары в долларах растут при снижении индекса доллара. И вариационка фьючерса на золото в рублях как раз и предлагает выигрыш от движения золота, нивелируя движение доллара.
Однако, в долгосрочной, стратегической перспективе позиция в золоте предпочтительнее. Т.к. неизбежен и рост долларовой цены золота, и рост курса доллара к рублю.
Например, если на 3-й день золото вырастет на 1% с 1919 до 1938.19 и доллар вырастет на 1% с 74.9925 до 75.74243,
то прибыль золота будет 2892.603 руб, а фьючерса только 1453.497 руб.
— Складывает Value графиков GraphId1 и GraphId2
— При запуске на загрузке Quik'а работает код предыдущей загрузки
— с последними свойствами, полученными из кода или интерактивно.
— При запуске старые бары графика данных сканируются дважды,
— только если есть подключение к серверу.
— При смене тайм-фрейма старые бары сканируются только единожды.
— При загрузке Quik'а первый скан до подключения к серверу.
CandlesOK = true
Settings = { — После смены тайм-фрейма нужно интерактивное подтверждение
Name = "_Add"
,GraphId1 = «Tag-1» — Перезадать оба после первой загрузки.
,GraphId2 = «Tag-2» — Сохраняются при последующих запусках.
,Factor1 = 1 — Для GraphId1
,Factor2 = 1 — Для GraphId2
,Base1 = 0 — Для GraphId1
,Base2 = 0 — Для GraphId2
,Value = «close»
,line = { — Исчезает прогррамный доступ после 1-го интерактивного изменения
{Name = «close»
,Color = RGB(255,255,0) — Жёлтый
,Type = TYPE_HISTOGRAM — POINT, LINE, DASH, DOT, HISTOGRAM,
,Width = 2} — TRIANGLE_UP, TRIANGLE_DOWN.
}
}
function Init()
local s = «Indicator _Add:»
if 0 == getNumCandles (Settings.GraphId1) then
CandlesOK = false
s = s .."\n invalid GraphId1"
end
if 0 == getNumCandles (Settings.GraphId2) then
CandlesOK = false
s = s .."\n invalid GraphId2"
end
if not CandlesOK then message (s) end
return #Settings.line
end — Init()
function OnCalculate (index)
if index == 1 then
CandlesOK = true
if 0 == getNumCandles (Settings.GraphId1) or
0 == getNumCandles (Settings.GraphId2) then
CandlesOK = false
end
--[[message («Settings.Value »… tostring (Settings.Value)
.."\nSettings.line "… tostring (Settings.line)
.."\nCandlesOK "… tostring (CandlesOK))--]]
if Settings.Value ~= «open» and Settings.Value ~= «high» and
Settings.Value ~= «low» and Settings.Value ~= «close» then
Settings.Value = «close»
message («Indicator _Add: Value must be open/high/low/close»)
end
end
if not CandlesOK then return nil end
local candle1 = (getCandlesByIndex (Settings.GraphId1, 0, index-1, 1))[0]
local candle2 = (getCandlesByIndex (Settings.GraphId2, 0, index-1, 1))[0]
local val1 = candle1[Settings.Value]
local val2 = candle2[Settings.Value]
— Результат return res == 0 and nil or res всегда 0 при res == 0
if val1 == 0 or val2 == 0 then return nil end
return (val1 + Settings.Base1) * Settings.Factor1
+ (val2 + Settings.Base2) * Settings.Factor2
end — OnCalculate()