Биржевой сбор можно взять из таблицы своих сделок:
Если вы скальпер, то делите его на 2.
Текст по центру
Пользователь
Сообщений: Регистрация: 29.03.2017
19.02.2018 08:48:50
Цитата
Sergey Gorokhov написал: Let_it_go , Здравствуйте, К сожалению такой возможности не предусмотренно.
Добавьте пожалуйста в список желаний.
Средний спред
Пользователь
Сообщений: Регистрация: 29.03.2017
18.02.2018 22:43:37
Добрый день. Уже много лет я пользуюсь кодом для расчёта среднего спреда по акции:
Код
--Внутри колбека OnParam
--Считаем средний спред
local tablebid = getParamEx(class_code, fff, "bid") --получаем таблицу "bid"
local bid=tablebid.param_value --из таблицы берём значение
local tableoffer = getParamEx(class_code, fff, "offer") --получаем таблицу "offer"
local offer=tableoffer.param_value --из таблицы берём значение
local p_spread = (offer - bid) / bid * 100 --считаем текущий спред по бумаге
local elem = average_spreads[fff] --создаём таблицу для хранения расчётных данных
if elem == nil then
average_spreads[fff] = { Count = 1, Spread = p_spread, Avr = p_spread}
elem = average_spreads[fff]
else
elem.Spread = p_spread
elem.Avr = (elem.Avr * elem.Count + p_spread) / (elem.Count + 1)
elem.Count = elem.Count + 1
spread[fff]=elem.Avr
end
Его написал один добрый человек на каком-то трейдерском форуме по Луа. Уже не помню где и кто. Этот код считает средний спред безостановочно по всем значениям, даже если их будет миллион. Подскажите пожалуйста как видоизменить код, чтобы он считал спред за последние 1000 значений? Мне приходит на ум только создание таблицы с 1000 полями, которые будут обновляться, а старые (ненужные) удаляться. Может быть есть более красивый вариант? Благодарю за советы
Текст по центру
Пользователь
Сообщений: Регистрация: 29.03.2017
18.02.2018 17:40:17
Добрый день Как отцентрировать текст в ячейке? Чтобы было по центру, а не прижималось к краю. Спасибо.
два робота, два колбека
Пользователь
Сообщений: Регистрация: 29.03.2017
14.02.2018 18:40:06
Добрый день. Прошу дать совет. У меня два робота. У каждого своя стратегия, но каждому из них нужен минутный график фьючерса РТС. Оба робота подписываются на него с помощью колбека.
Код
function DataSource(class,sec,interval)
ds[sec] = CreateDataSource(class,sec,interval)
ds[sec]:SetUpdateCallback(function(...) mycallbackforallstocks(class,sec,...) end)
return ds[sec]
end
Индикаторы у них разные, поэтому расчёт индикаторов не дублируется. Тем не менее вопрос: не происходит ли двойной работы по получению графика? Если да, то как этого избежать? И стоит ли этого избегать (может быть это маленькая нагрузка, которую можно игнорировать). Спасибо
Вызов функции ATR
Пользователь
Сообщений: Регистрация: 29.03.2017
12.02.2018 12:43:23
Сергей, спасибо за ответы. Я нашёл ошибку. Вот: long_v[i]=func2(candles, {Period=252}, ds_v) а надо long_v[i]=func2(i, {Period=252}, ds_v)
теперь всё считает.
Вызов функции ATR
Пользователь
Сообщений: Регистрация: 29.03.2017
12.02.2018 12:30:11
Все инструменты ликвидные. Например SBER (TQBR) Нилом являются ВСЕ значения внутри цикла for i=1,candles do (я специально это проверил). То есть функция не выдаёт ни одного значения. ---Вот код. Может быть он какой-то устаревший по сравнению с версией терминала.
Код
Settings = {
Name = "*ATR (Average True Range)",
Period = 14,
line = {{
Name = "Horizontal line",
Type = TYPE_LINE,
Color = RGB(140, 140, 140)
},
{
Width = 3,
Name = "ATR_Up",
Type = TYPE_HISTOGRAM,
Color = RGB(0, 206, 0)
},
{
Width = 3,
Name = "ATR_Down",
Type = TYPE_HISTOGRAM,
Color = RGB(221, 44, 44)
}
},
Round = "off",
Multiply = 1,
Horizontal_line="0"
}
local prev=0
function Init()
func = ATR()
return #Settings.line
end
function OnCalculate(Index)
local Out = ConvertValue(Settings, func(Index, Settings))
local HL = tonumber(Settings.Horizontal_line)
if Index == 1 then prev=0 end
if Out then
if Out > prev then
prev = Out
return HL,Out,nil
else
prev = Out
return HL,nil,Out
end
else
return HL,nil,nil
end
end
function ATR() --Average True Range ("ATR")
local f_TR = TR()
local tmp = {pp=nil, p=nil}
local it = {p=0, l=0}
return function (I, Fsettings, ds)
local Fsettings=(Fsettings or {})
local P = (Fsettings.Period or 14)
if (P > 0) then
if I == 1 then
tmp = {pp=nil, p=nil}
it = {p=0, l=0}
end
local tr = f_TR(I,ds)
if CandleExist(I,ds) then
if I~=it.p then
it = {p=I, l=it.l+1}
tmp.pp = tmp.p
end
if it.l < P then
tmp.p = (tmp.pp or 0) + tr
elseif it.l == P then
tmp.p = ((tmp.pp or 0) + tr) / P
return tmp.p
elseif it.l > P then
tmp.p = ((tmp.pp or 0) * (P-1) + tr) / P
return tmp.p
end
end
end
return nil
end
end
function TR() --True Range ("TR")
local it = {pp=0, p=0, l=0}
return function (I, ds)
if I == 1 then
it = {pp=0, p=0, l=0}
end
if CandleExist(I,ds) then
if I~=it.p then it={pp=it.p, p=I, l=it.l+1} end
if it.l == 1 then
return math.abs(GetValueEX(it.p,DIFFERENCE, ds))
else
return math.max(math.abs(GetValueEX(it.p,DIFFERENCE, ds)),
math.abs(GetValueEX(it.p,HIGH,ds) - GetValueEX(it.pp,CLOSE,ds)),
math.abs(GetValueEX(it.pp,CLOSE,ds)-GetValueEX(it.p,LOW,ds)))
end
end
return nil
end
end
SMA,MMA,EMA,WMA,SMMA,VMA = "SMA","MMA","EMA","WMA","SMMA","VMA"
OPEN,HIGH,LOW,CLOSE,VOLUME,MEDIAN,TYPICAL,WEIGHTED,DIFFERENCE,ANY = "O","H","L","C","V","M","T","W","D","A"
function CandleExist(I,ds)
return (type(C)=="function" and C(I)~=nil) or
(type(ds)=="table" and (ds[I]~=nil or (type(ds.Size)=="function" and (I>0) and (I<=ds:Size()))))
end
function Squeeze(I,P)
return math.fmod(I-1,P+1)
end
function ConvertValue(T,...)
local function r(V, R)
if R and string.upper(R)== "ON" then R=0 end
if V and tonumber(R) then
if V >= 0 then return math.floor(V * 10^R + 0.5) / 10^R
else return math.ceil(V * 10^R - 0.5) / 10^R end
else return V end
end
if arg.n > 0 then
for i = 1, arg.n do
arg[i]=arg[i] and r(arg[i] * ((T and T.Multiply) or 1), (T and T.Round) or "off")
end
return unpack(arg)
else return nil end
end
function GetValueEX(I,VT,ds)
VT=(VT and string.upper(string.sub(VT,1,1))) or ANY
if VT == OPEN then --Open
return (O and O(I)) or (ds and ds:O(I))
elseif VT == HIGH then --High
return (H and H(I)) or (ds and ds:H(I))
elseif VT == LOW then --Low
return (L and L(I)) or (ds and ds:L(I))
elseif VT == CLOSE then --Close
return (C and C(I)) or (ds and ds:C(I))
elseif VT == VOLUME then --Volume
return (V and V(I)) or (ds and ds:V(I))
elseif VT == MEDIAN then --Median
return ((GetValueEX(I,HIGH,ds) + GetValueEX(I,LOW,ds)) / 2)
elseif VT == TYPICAL then --Typical
return ((GetValueEX(I,MEDIAN,ds) * 2 + GetValueEX(I,CLOSE,ds))/3)
elseif VT == WEIGHTED then --Weighted
return ((GetValueEX(I,TYPICAL,ds) * 3 + GetValueEX(I,OPEN,ds))/4)
elseif VT == DIFFERENCE then --Difference
return (GetValueEX(I,HIGH,ds) - GetValueEX(I,LOW,ds))
else --Any
return (ds and ds[I])
end
return nil
end
Вызов функции ATR
Пользователь
Сообщений: Регистрация: 29.03.2017
12.02.2018 12:19:48
Прошу помочь с вызовом функции ATR
Код
dofile ("C:\\Program Files\\Lua\\5.1\\lua\\ATR.lua")--ATR
ds_v = CreateDataSource(instr[k].v_class,instr[k].v_sec,INTERVAL_D1)
ds_v:SetEmptyCallback()
sleep(1000)
func2 = ATR()
candles=ds_v:Size() --до этого места доходит и выдаёт количество свечей
long_v={}
short_v={}
for i=1,candles do
long_v[i]=func2(candles, {Period=252}, ds_v)
short_v[i]=func2(candles, {Period=5}, ds_v)
end
но итоговые значения long_v[i] short_v[i]
равны нил. Благодарю за помощь.
QUIK для HFT
Пользователь
Сообщений: Регистрация: 29.03.2017
12.02.2018 11:01:19
Ренат, я сюда пришёл о другом поговорить. Если нечего сказать по теме - покиньте пожалуйста ветку.
Получать график один раз в день
Пользователь
Сообщений: Регистрация: 29.03.2017
12.02.2018 09:28:10
Сергей, спасибо за ответ. К примеру, речь идёт про акции Сбербанка. Мне постоянно нужны минутки, робот с ними работает весь день. А дневки нужны единожды в день. Минутки заказываются так:
Код
function mycallbackforallstocks(class,sec,index)
end
function DataSource(class,sec,interval)
ds[sec] = CreateDataSource(class,sec,interval)
ds[sec]:SetUpdateCallback(function(...) mycallbackforallstocks(class,sec,...) end)
return ds[sec]
end
Два вопроса: 1. Если я воспользуюсь ds[sec]:Close(), чтобы отписаться от дневок, он случайно не отпишет меня от минуток? 2. По графику, где мне нужны раз в день дневки, я заказываю минутки на постоянной основе. Будет ли КВИК делать лишнюю работу, если я буду всё время обновлять дневки (не отпишусь от них), или в данном случае этой лишней работой можно пренебречь?
QUIK для HFT
Пользователь
Сообщений: Регистрация: 29.03.2017
12.02.2018 09:18:19
У меня сейчас заявка на ММВБ долетает до биржи за 70-150 миллисекунд. Надо это время существенно сократить. То же самое для фортс.
Получать график один раз в день
Пользователь
Сообщений: Регистрация: 29.03.2017
11.02.2018 23:58:50
первый вопрос про OnCleanUp() снимается, больше не актуален. прошу подсказать только по вопросу №2.
Получать график один раз в день
Пользователь
Сообщений: Регистрация: 29.03.2017
11.02.2018 23:45:30
Добрый день. Для расчёта одного параметра мне нужно раз в сутки заказать дневной график и посчитать по нему новое значение индикатора. В дальнейшем в течение дня график уже не нужен. Раз в день и всё. Два вопроса. 1. Как это сделать с помощью OnCleanUp()? Этот колбек для меня самый подходящий в данной ситуации. Но в момент его срабатывания графики ещё не транслируются, слишком рано. Может быть есть другой кол-бек, который сработает 1 раз в день? Мне не важно когда получать, утром, днём или вечером. Это погоды не делает. 2. Какие функции работы с графиками следует использовать, чтобы не подписываться на обновления, а 1 раз в день получить новые данные? Достаточно ли будет одного CreateDataSource(class,sec,interval)? Или всё же нужно использовать что-то ещё: SetEmptyCallback например? Я (увы) не сильно понимаю механику этих функций. Дайте пожалуйста подсказки. Заранее спасибо.
QUIK для HFT
Пользователь
Сообщений: Регистрация: 29.03.2017
11.02.2018 23:35:53
Ринат, спасибо за ответ. Уточните пожалуйста вашу мысль: существует способ получить прямой доступ на биржу, используя КВИК?
QUIK для HFT
Пользователь
Сообщений: Регистрация: 29.03.2017
10.02.2018 21:26:09
Прошу подсказать. У меня с программированием дела плохи. Еле-еле освоил Луа. Учить другие языки нет сил. Скорости КВИКа для отправки заявок мне уже не хватает. Нужен полноценный HFT. Возможно ли реализовать прямой доступ на биржу так чтобы у меня визуально всё осталось по старому: КВИК и Луа? Спасибо за ответ.
Unknown error
Пользователь
Сообщений: Регистрация: 29.03.2017
26.01.2018 19:35:41
Добрый день. Из-за чего может быть такая ошибка? Unknown error. Possible unhandles exeption.
Даже не знаю какие сообщить подробности. Роботы уже давно работают и проверены на баги. Ничего необычного не происходило. Чик - и выбило скрипт с этим мессиджем.
Какой вариант экономнее?
Пользователь
Сообщений: Регистрация: 29.03.2017
22.12.2017 20:21:32
Господа, прошу подсказать какой вариант экономнее 1 вариант
Код
func = RSI()
local rsi_count={}
for i=1,ds[бумага]:Size() do
rsi_count[i]=func(i, {Period=rsi_period, VType="Typical"}, ds[бумага])
end
rsi0=rsi_count[ds[бумага]:Size()]
rsi1=rsi_count[ds[бумага]:Size()-1]
rsi2=rsi_count[ds[бумага]:Size()-2]
или тоже самое, но с переменной num_candles
Код
func = RSI()
local rsi_count={}
num_candles=ds[бумага]:Size()
for i=1,num_candles do
rsi_count[i]=func(i, {Period=rsi_period, VType="Typical"}, ds[бумага])
end
rsi0=rsi_count[num_candles]
rsi1=rsi_count[num_candles-1]
rsi2=rsi_count[num_candles-2]
по сути, вопрос такой: тяжело ли компьютеру несколько раз получать значение ds[бумага]:Size()? введение переменной ускорит ли процесс?
Как запустить колбек не сразу?
Пользователь
Сообщений: Регистрация: 29.03.2017
15.12.2017 23:16:45
В начале я инициализирую переменные. Это не быстрый процесс, потому что некоторые из них рассчитываются. В колбеке ОнПарам используется часть этих переменных. Если на момент срабатывания ОнПарам какая-то из переменных ещё равна нил, то скрипт выдаст ошибку. Скрипт от этого не выбивается. В дальнейшем, когда переменные досчитаются, эта ошибка появляться уже не будет. Как запустить ОнПарам не сразу, а (допустим) через секунду после запуска скрипта? Или запустить его после того как будут заданы все переменные? Спасибо.
Удаление элементов таблицы
Пользователь
Сообщений: Регистрация: 29.03.2017
16.11.2017 00:10:53
Господа, мне нужно удалить элементы таблицы. Дайте пожалуйста совет как это лучше сделать. Вот код:
Код
s={}
for i=1,10 do
table.insert(s,random_max()) --в будущем вместо рандомных чисел будут номера активных заявок.
end
toLog(log, s)
for i=1,#s do
if i>0 then -- Сейчас я написал условие наугад. В будущем будет условие "удалить номер заявки из таблицы s если эта заявка снята или исполнена"
table.remove(s,i)
end
end
toLog(log, s)
фунция random_max() выдаёт случайные числа. Данные лога: таблица s ДО цикла с удалением: 1=941155680;2=1786453605;3=956870528;4=1765415360;5=1701888568;6=1306467983;7=1934583353;8=1639998291;9=498667592;10=1625028150;
таблица s ПОСЛЕ цикла с удалением: 1=1786453605;2=1765415360;3=1306467983;4=1639998291;5=1625028150;
Кхе-кхе. Я ждал, что она полностью удалится, но этого не произошло. Более того, элементы сдвинулись. Объясните пожалуйста почему так происходит и как мне удалять из таблицы нужные мне элементы.
Работает и с DataSourse Однако выдаёт только верхние фракталы. Вот как я вызываю эту функцию:
Код
func = FRACTALS()
for i=1,ds[sec]:Size() do
local f=func(i, {Period=fractal_period, VType=ANY}, ds[sec])
table.insert(table_bar,f)
end
Как сделать так, чтобы нижние фракталы тоже обнаруживались?
Индикатор на индикатор
Пользователь
Сообщений: Регистрация: 29.03.2017
09.11.2017 23:14:11
Спасибо. То что хотел сделать, получилось. --- Подскажите пожалуйста, ваш индикатор Фракталы ( с учётом обновления) по прежнему не работает с CreateDataSourse? только с графиком?
Индикатор на индикатор
Пользователь
Сообщений: Регистрация: 29.03.2017
05.11.2017 18:08:04
Цитата
Sergey Gorokhov написал: Let_it_go , 1) В QUIK нельзя накладывать индикаторы на индикаторы. 2) только если формулы обоих индикаторов уместить в одном скрипте. Или делать через привязку к идентификатору (см функцию getCandlesByIndex)
Сергей, спасибо за ответ. Не сердитесь пожалуйста за то что спрашиваю элементарные вещи. Вот график в КВИКе. Это индикатор
Он строится через добавление на график данных из такой таблицы:
function OnCalculate (index)
year=T(index).year
month=T(index).month
if month<10 then month="0"..month end
day=T(index).day
if day<10 then day="0"..day end
YYYYMMDD=tonumber(year..month..day.."")
v={}
v.value1=(new_table[YYYYMMDD]+Settings.aspect1)*Settings.multiplier
if v.value1<0 then v.value1=(new_table[YYYYMMDD]+Settings.aspect1)*Settings.multiplier end
return v.value1
end
Я хочу воспользоваться вашим индикатором FRACTALS и наложить на этот график верхние и нижние фракталы. Подскажите пожалуйста с чего начать. Что будет источником ds в функции GetValue(I,VT,ds). Заранее спасибо за ответ, и вообще спасибо за ваш труд!
Зачем нужен PrintDbgStr
Пользователь
Сообщений: Регистрация: 29.03.2017
03.11.2017 17:52:42
Господа, прошу рассказать про функцию PrintDbgStr Вот я установил программу DebugView. Смотрю на экран. Если взять пример из мануала, то всё работает как задумано:
Код
PrintDbgStr("dbg from " ..getScriptPath())
Но теперь я осознанно допущу ошибку:
Код
a=step*1
PrintDbgStr("dbg from " ..a)
step=getParamEx("SPBFUT","MXZ7","SEC_PRICE_STEP").param_value
пользуюсь переменной step до того как ей присвоено значение (частая ошибка у кодеров-самоучек, а я самоучка) Жду от этой функции что она мне что то покажет, но она молчит. Прошу помощи и реальных примеров того как эта функция может быть полезной
Активные-снятые заявки
Пользователь
Сообщений: Регистрация: 29.03.2017
02.11.2017 13:55:01
Спасибо. Разобрался. Надеюсь, это сложно потому что так надо, а не потому что не смогли сделать проще.
В какой момент Вы хотите проверять состояние заявки? В момент ее получения (т.е. при вызове onOrder()) или просто когда Вы ее достаете из хранилища функцией getItem()?
getItem() из таблицы заявок
Активные-снятые заявки
Пользователь
Сообщений: Регистрация: 29.03.2017
02.11.2017 13:10:31
что делает цифра 30? Это номер заявки из таблицы "orders"?
Активные-снятые заявки
Пользователь
Сообщений: Регистрация: 29.03.2017
02.11.2017 13:00:48
Господа, если можно проще. Есть заявка с номером 28342011321 Как мне узнать, она активная, снятая или исполненная?
Активные-снятые заявки
Пользователь
Сообщений: Регистрация: 29.03.2017
02.11.2017 12:45:47
Николай, расскажите о вашей функции подробнее. Как ею пользоваться.
Активные-снятые заявки
Пользователь
Сообщений: Регистрация: 29.03.2017
02.11.2017 12:44:50
чтобы избежать ошибок при проверке в полночь можно брать год year=1601 такое бывает только у неснятых заявок
Активные-снятые заявки
Пользователь
Сообщений: Регистрация: 29.03.2017
02.11.2017 12:43:22
Сергей, а какие проблемы могут возникнуть при такой проверке:
Код
if t.flags==30 then
считать заявку снятой
end
Активные-снятые заявки
Пользователь
Сообщений: Регистрация: 29.03.2017
02.11.2017 12:16:05
Добрый день. Снятая заявка имеет параметр flags=30 Исполненная заявка имеет параметр flags=28
Как узнать флаги других состояний заявки? Например частично снятая? Из мануала ничего не понятно.
Второй вопрос. У снятой заявки запись такая withdraw_datetime={week_day=4;hour=11;ms=507;mcs=507000;day=2;month=11;sec=8;year=2017;min=58;} У заявки, которая не снималась, эта запись такая: withdraw_datetime={week_day=1;hour=0;ms=0;mcs=0;day=1;month=1;sec=0;year=1601;min=0;}
является ли это исчерпывающей характеристикой снятости-неснятости? ну например если hour==0, то заявка НЕ снятая, а если hour>0, то она снята? Спасибо.
Помогите с математикой
Пользователь
Сообщений: Регистрация: 29.03.2017
28.10.2017 19:18:46
Я знаю. Но это всё равно происходит за 1 квант времени. То есть очень быстро. Нет смысла такое оптимизировать.
Помогите с математикой
Пользователь
Сообщений: Регистрация: 29.03.2017
28.10.2017 18:45:14
Цитата
Constantin написал: Надо конструкцию else освоить.
Зачем? Код в моей версии понятный, элегантный и не громоздкий (всего 3 строчки). Если использовать else, он был бы намного объёмнее.
INDICATORS.ZIP
Пользователь
Сообщений: Регистрация: 29.03.2017
28.10.2017 18:25:40
Добрый день. Я уже давно пользуюсь этими индикаторами, но у меня старая редакция. После выхода новой редакции я пытался их применить, у меня пошли ошибки, я бросил это дело и вернулся на старую редакцию INDICATORS.ZIP --- Сейчас сижу разбираюсь с новой версией. Ошибка выскакивает даже на том примере, который приведён в файле readme
Код
dofile(getScriptPath().."\\MA.lua")
function main()
func = MA()
t_id = AllocTable()
AddColumn(t_id,1,"Price",true,QTABLE_INT_TYPE,10)
AddColumn(t_id,2,"MA",true,QTABLE_INT_TYPE,10)
CreateWindow(t_id)
SetWindowCaption(t_id,"MA")
ds = CreateDataSource("TQBR", "LKOH", INTERVAL_M5)
sleep(1000)
message (""..ds:Size(),1)
for i=1,ds:Size() do
ma_out=func(i, {Period=3, Metod = EMA, VType=ANY}, ds)
tmp=InsertRow(t_id,-1)
SetCell(t_id,tmp,1,tostring(ds:C(i)),ds:C(i))
SetCell(t_id,tmp,2,tostring(ma_out),ma_out)
end
end
выскакивает message 3106 (количество свечек), а потом ошибка:
if sd[sec]>0 then otklonenie=3 end if sd[sec]>50 then otklonenie=4 end if sd[sec]>200 then otklonenie=5 end
Помогите с математикой
Пользователь
Сообщений: Регистрация: 29.03.2017
27.10.2017 20:38:21
Господа, прошу прощения за тупенький вопрос. Я не силён в математике, функциях и других простых вещах школьной программы. Я хочу задать такую зависимость: чем выше стандартное отклонение, тем шире будут полосы Боллинджера. Сейчас у меня запрограммировано так:
if sd[sec]>200 then otklonenie=5 end if sd[sec]>50 then otklonenie=4 end if sd[sec]>0 then otklonenie=3 end
То есть если рынок волатильный, то в Боллинджер будет заряжено больше стандартных отклонение (его ширина будет выше), а если рынок дохлый, то полосы будут более узкими. Я хочу, чтобы у меня были промежуточные значения. Ну например при sd[sec]==70 у меня ширина полос боллинджера будет 4,35 стандартных отклонений. Помогите это выразить через функцию. otklonenie= .......sd[sec]......... Я понимаю, что ответ может быть разным. Линия может иметь разную кривизну, но мне нужна хоть какая то стартовая подсказка, чтобы понять как это выразить математически. Спасибо заранее за помощь.
Ошибка SetValue
Пользователь
Сообщений: Регистрация: 29.03.2017
27.10.2017 10:48:45
Речь идёт про строчку 11-ю сверху
Ошибка SetValue
Пользователь
Сообщений: Регистрация: 29.03.2017
27.10.2017 10:47:21
Вот функция для установки значения в ячейке.
Код
function QTable:SetValue(row, col_name, data, formatted)
-- Установить значение в ячейке
local col_ind = self.columns[col_name].id or nil
if col_ind == nil then
return false
end
local col_type = self.columns[col_name].c_type
if row==nil or col_name==nil or data==nil or col_ind==nil then
message ((row or "nil").." | "..(col_name or "nil").." | "..(data or "nil").." | "..(col_ind or "nil")),1)
end
if self.data[row][col_ind]==data then return true end
self.data[row][col_ind]=data
local col_type = self.columns[col_name].c_type
-- если для числового столбца дано НЕчисловое значение, то применяем к нему tonumber
if type(data) ~= "number" and (col_type==QTABLE_INT_TYPE or col_type==QTABLE_DOUBLE_TYPE or col_type==QTABLE_INT64_TYPE) then
data = tonumber(data) or 0
end
-- если для НЕстрокового значения уже дан отформатированный вариант, то сначала используется он
if formatted and col_type~=QTABLE_STRING_TYPE and col_type~=QTABLE_CACHED_STRING_TYPE then
return SetCell(self.t_id, row, col_ind, formatted, data)
end
-- если для столбца задана функция форматирования, то она используется
local ff = self.columns[col_name].format_function
if type(ff) == "function" then
-- в качестве строкового представления используется
-- результат выполнения функции форматирования
if col_type==QTABLE_STRING_TYPE or col_type==QTABLE_CACHED_STRING_TYPE then
return SetCell(self.t_id, row, col_ind, ff(data))
else
return SetCell(self.t_id, row, col_ind, ff(data), data)
end
else
if col_type==QTABLE_STRING_TYPE or col_type==QTABLE_CACHED_STRING_TYPE then
return SetCell(self.t_id, row, col_ind, tostring(data))
else
return SetCell(self.t_id, row, col_ind, tostring(data), data)
end
end
end
Она служит мне верой и правдой. Но иногда она выдает такую ошибку: Это он ругается на строчку if self.data[row][col_ind]==data then return true end Внутри колбека это не приводит к выбиванию скрипта, поэтому я продолжаю работать с ней. Важно: эта ошибка приходит в первую секунду после запуска, когда какое то значение ещё не определено. Потом всё работает хорошо. Вы можете видеть, что я пытаюсь отловить эту ошибку через message, но он спокойно проходит эту проверку. Подскажите где искать иэтот "нил"
Индикатор на индикатор
Пользователь
Сообщений: Регистрация: 29.03.2017
27.10.2017 08:35:20
Добрый день. Помогите пожалуйста с такой задачей.
Верхний график делится математически на средний график. В итоге получается красный индикатор (внизу). Теперь я хочу работать с нижним красным графиком и наложить на него другой индикатор, ну (для примера) Боллинджер. 1. Можно ли это сделать средствами КВИКа. Взять и "бросить" на этот график стандартный индикатор из списка? 2. Если нет, то как на этот график наложить индикаторы Сергея Горохова из файла INDICATORS.zip? Спасибо за подсказки.
Сбор за транзакции
Пользователь
Сообщений: Регистрация: 29.03.2017
24.10.2017 12:05:06
Согласен. Теперь в таком виде
Код
function Sbor()
local order_line
count=0
for t=getNumberOf("orders"),1,-1 do
order_line=getItem("orders",t-1)
if order_line.class_code=="SPBFUT" then
count=count+1
end
end
orders=count
local deal_line
count=0
comiss=0
for t=getNumberOf("trades"),1,-1 do
trade_line=getItem("trades",t-1)
if trade_line.class_code=="SPBFUT" then
comiss=comiss+(trade_line.exchange_comission*0.5)
count=count+1
end
end
trades=count
sbor=0.1*(orders*2-comiss*40)
tbl:SetValue(1,'sbor', orders.." | "..trades.." | "..comiss.." | "..sbor)
return orders,trades,comiss
end
Сбор за транзакции
Пользователь
Сообщений: Регистрация: 29.03.2017
24.10.2017 11:42:36
Цитата
и Вы не ответили на второй вопрос. Зачем идет умножение количества сделок на сумму комиссий?
k – балл для транзакции, определенный в соответствии с таблицей 1; f – сбор, уплаченный за заключение сделки; l – балл для сделки, определенный в соответствии с таблицей 1.
параметр f я беру из таблицы моих сделок (столбец комиссия) и умножаю его на величину l l=количество сделок умноженное на балл. В моём случае балл равен 40.
Сбор за транзакции
Пользователь
Сообщений: Регистрация: 29.03.2017
24.10.2017 11:35:57
Я нашёл ещё одну ошибку. Я беру комиссию из ленты моих сделок.
Так как мои сделки скальперские, то эту цифру надо поделить на два.
Сбор за транзакции
Пользователь
Сообщений: Регистрация: 29.03.2017
24.10.2017 11:33:51
Цитата
Sergey Gorokhov написал: Let_it_go , Тогда ищите ошибку в формуле. почему у Вас идет умножение на два? И почему Вы умножаете комиссию на количество сделок? в формуле на которую Вы указали этого нет.
умножение на два потому что транзакцией считается выставление-снятие. Поэтому я количество заявок умножаю на два.
Сбор за транзакции
Пользователь
Сообщений: Регистрация: 29.03.2017
24.10.2017 11:19:05
Да. Формула не то показала. Я написал этот пост с просьбой сравнить мою формулу и биржевую.
Сбор за транзакции
Пользователь
Сообщений: Регистрация: 29.03.2017
24.10.2017 10:35:52
Согласно расчётам приведённого скрипта у меня всё было в порядке. Вопрос не философский, а математический.
Сбор за транзакции
Пользователь
Сообщений: Регистрация: 29.03.2017
24.10.2017 08:33:27
Господа, добрый день. Я запустил робота с большим количеством транзакций на срочном рынке. Я думал, что верно интерпретировал формулу подсчёта сбора за транзакции. Полагал, что у меня достаточное количество сделок, чтобы не попадать на этот штраф. Но всё же биржа мне начислила этот штраф: 2300 рублей. Прошу подсказать где ошибка в моём коде. По сути формула изложена в самом конце кода: sbor=0.1*(orders*2*1-(trades*comiss*40)) Вот так она выглядит на сайте биржи Спасибо за помощь.
Код
function Sbor()
local order_line
count=0
for t=getNumberOf("orders"),1,-1 do
order_line=getItem("orders",t-1)
if order_line.class_code=="SPBFUT" then
count=count+1
end
end
orders=count
local deal_line
count=0
comiss=0
for t=getNumberOf("trades"),1,-1 do
trade_line=getItem("trades",t-1)
if trade_line.class_code=="SPBFUT" then
comiss=comiss+trade_line.exchange_comission
count=count+1
end
end
trades=count
sbor=0.1*(orders*2*1-(trades*comiss*40))
tbl:SetValue(1,'sbor', orders.." | "..trades.." | "..comiss.." | "..sbor)
return orders,trades,comiss
end
Помогите с логикой
Пользователь
Сообщений: Регистрация: 29.03.2017
23.10.2017 20:45:50
Добрый день. Прошу помочь с реализацией простого замысла.
1. Выставляется лимитная заявка. 2. Эта лимитная заявка снимается. 3. Выставить новую лимитную заявку как только приедет кол-бек OnOrder о снятии предыдущей заявки.
Параллельно торгуют другие роботы, они выставляют много заявок. Задача работать именно с нужной мне заявкой. Я не могу понять как её "пометить" в момент отправки, чтобы ждать колбека именно по ней. Спасибо.
Перебор валютных тикеров
Пользователь
Сообщений: Регистрация: 29.03.2017
16.10.2017 23:20:50
Добрый день. Прошу подсказать как сделать перебор валютных тикеров. Для перебора акций я делаю так:
Код
ticker_list="SVAV,TGKO,TRCN,UWGN,VSMO"
for sec in string.gmatch(ticker_list,"%a+") do
---
end
Для перебора фьючерсов так:
Код
f_ticker_list="GMZ7,GZZ7,HYZ7,EuZ7,LKZ7,MMZ7,MXZ7,RNZ7,SiZ7,SPZ7,SRZ7,VBZ7"
for sec in string.gmatch(f_ticker_list,"%w+") do
---
end
А как перебрать валюты? ticker_list="USD000UTS_TOM,CNYRUB_TOM,EUR_RUB_TOM" (доллар, юань, евро). Вся проблема в нижнем пробеле Заранее спасибо за подсказки.