Старатель (Все сообщения пользователя)

Выбрать дату в календаре…Выбрать дату в календаре

Страницы: Пред. 1 ... 19 20 21 22 23 24 25 26 27 28 29 ... 47 След.
Временный интервал в виде кнопок, как сделать?
 
Кнопки будут занимать много места. Выпадающий список экономит место на панели.
Надо делать так, как надо. А как не надо - делать не надо.
setmetatable
 
Понял, спасибо!

Код
s = setmetatable({}, {__index = function(t, i)
  local result = i * i
  t[i] = result 
  return result 
end})
Надо делать так, как надо. А как не надо - делать не надо.
setmetatable
 
А как это использовать? У меня не кэширует:
Код
s = setmetatable({}, { __index = function(t, i)
  local result = print('Считаем...') or i * i
  t = result 
  return result 
end})
print(tostring(s[3]))
print(tostring(s[3]))

Результат:
Цитата
Считаем...
9
Считаем...
9
Надо делать так, как надо. А как не надо - делать не надо.
setmetatable
 
Цитата
s_mike@rambler.ru написал:
s = setmetatable( {},   function(t,i)
                                  local result = (считаем что-то)
                                  t[i] = result
                                  return result
                                end)
Цитата
bad argument #2 to 'setmetatable' (nil or table expected)

Но я понял, что для моей задачи (кэширование только одного элемента таблицы) первый вариант будет лучше.
Надо делать так, как надо. А как не надо - делать не надо.
setmetatable
 
Код
function func(v)
  return v * v
end

s = {
  f = function(v)
    local r = s.r
    if not r then
      r = func(v)
      s.r = r
    end
    return r
  end
}

print(tostring(s.f(3)))
print(tostring(s.f(3)))

Функция s.f() запоминает вычисленное значение и при повторном обращении возвращает раннее вычисленное значение.
Можно ли описать её через setmetatable?
PS: возвращать она должна раннее сохранённое значение, независимо от переданного аргумента при повторном вызове.
Надо делать так, как надо. А как не надо - делать не надо.
Цена сделки вне лимита, Как избавиться от данной ошибки?
 
В Квике все получаемые параметры из терминала надо проверять не только на nil, но и на ноль:

Код
local last_price = getParamEx(classcode, seccode, "LAST").param_value
if last_price == nil then
  -- Ошибка получения цены последней сделки
elseif last_price == 0 then
  -- отправляем гневное сообщение в адрес разработчиков
else
  -- работаем дальше
end

Уверен, что такая же беда при вычислении
Код
exit_price = price + stop_level_2000 + sl
Надо делать так, как надо. А как не надо - делать не надо.
AddColumn
 
Цитата
width – ширина в условных единицах.
Что это за условные единицы такие? Они привязаны к шрифту? Если да, то каким образом?
Надо делать так, как надо. А как не надо - делать не надо.
Сделки с вечерней сессии FORTS
 
Здравствуйте.

Как в коде определить, относится ли вечерняя сделка к текущей торговой сессии?
Надо делать так, как надо. А как не надо - делать не надо.
Редактирование настроек при добавлении индикатора
 
Куда пропало окно с настройками при первичном добавлении индикатора?
Надо делать так, как надо. А как не надо - делать не надо.
Проблема с функцией SetSelectedRow()
 
Цитата
Andrei2016 написал:
почему срабатывание функции  SetSelectedRow() не приводит к каким-либо визуальным изменениям в указываемой таблице?
Возможно, потому, что при нажатии на левую клавишу мыши срабатывают сразу три события: QTABLE_LBUTTONDOWN, QTABLE_SELCHANGED, QTABLE_LBUTTONUP
Т.е., событие QTABLE_SELCHANGED возвращает выделение на нажатую строку после вашей функции funcCallback.
Попробуйте так:
Код
if (msg == QTABLE_LBUTTONUP) then 
  local r = SetSelectedRow(t_id, 12) 
Надо делать так, как надо. А как не надо - делать не надо.
недокументированные события QTABLE при нажатии мышки
 
QTABLE_NEED_REFILL тоже не документирована
Надо делать так, как надо. А как не надо - делать не надо.
Почему медленно работает код
 
Выше в коде строка в функции GetPrice
Код
Candles[SecCode][Interval] = ds[SecCode][Interval]
лишняя.

Цитата
Космонавт написал:
А торговать из колбека тоже можно? Отсылать лимитки при выполнении условий (цена, индикатор).
Конечно.

Цитата
Космонавт написал:
Цену последней сделки откуда лучше брать: из колбека в DataSourse или всё же из таблицы всех сделок?
Смотря для чего "лучше". Я обычно беру из getParamEx(class_code, sec_code, 'last') в OnParam, если нет необходимости обрабатывать все сделки.
Надо делать так, как надо. А как не надо - делать не надо.
Почему медленно работает код
 
Цитата
Николай Камынин написал:
Расчет надо делать в колбеках. либо в майн по флагу из колбека.
+
Перебор бумаг в цикле while is_run do лишний. В том же SetUpdateCallback можно сделать весь "не сложный анализ".
Надо делать так, как надо. А как не надо - делать не надо.
Почему медленно работает код
 
Цитата
Космонавт написал:
Ведь при каждом новом таймф-фрейме таблицу придётся таки обновлять и запихивать в её поля новый набор свечек. То есть раз в таймфрейм полный пересчёт делать всё же придётся.

А кто мешает сохранять свечи и индикатор в таблицу в зависимости от таймфрейма? Как-то так:
Код
  ds[SecCode][Interval] = CreateDataSource(ClassCode, SecCode, Interval)
  local function GetPrice(index)
    Candles[SecCode][Interval] = ds[SecCode][Interval]
    Indicator[SecCode][Interval][index] = func( ... )
  end
  for i = 1, ds:Size() do GetPrice(i) end
  ds:SetUpdateCallback(GetPrice)
Надо делать так, как надо. А как не надо - делать не надо.
Почему медленно работает код
 
Цитата
Космонавт написал:
3. Рационально ли составлен код?
Нет. Пересчитывать значение индикатора имеет смысл только при обновлении последней свечи. А вы пытаетесь его пересчитывать каждую мс. Какой в этом смысл, если цена не изменилась?
Расчёт индикатора лучше вставить в SetUpdateCallback() и сохранять значения в глобальной таблице.
Надо делать так, как надо. А как не надо - делать не надо.
Отладка скриптов Lua для Quik., Как произвести отладку скрипта?
 
Цитата
Egor Zaytsev написал:
2. Здесь больше подойдет функция CreateDataSource
CreateDataSource не доступна в индикаторах. Поэтому работать с другим таймфреймом можно только через getCandlesByIndex

Цитата
Виктор Столетов написал:
3. Как отслеживать появление нового бара?
При появлении нового бара в OnCalculate(index) будет увеличиваться индекс свечи

Цитата
Виктор Столетов написал:
А что если в какой-то момент самые старые бары будут обрезаны и Size() уменьшится?
Тогда OnCalculate начнётся с первого индекса.

Цитата
Виктор Столетов написал:
Вы говорите, что индекс свечи начинается c 0 и в руководстве написано то же самое. Но если в OnCalculate(index)  написать PrintDbgStr("index=" .. index), то в окне  Debugview выведет index от 1 до Size(). Вроде получается, что  самая старая свеча имеет индекс 1.
Да, там у них путаница (видимо разные люди писали куски кода): в OnCalculate в индикаторах индекс начинается с единицы, а в getCandlesByIndex - с нуля.
Надо делать так, как надо. А как не надо - делать не надо.
Почему скрипты в QUIK выполняются дольше
 
Вопрос разработчикам: верно ли, что в QUIK, как таковой, многопоточности нет? Да, есть два потока: основной и main. Но в каждый момент времени работают команды только из одного потока. Просто происходит переключение между потоками на уровне ОС. Так?
Надо делать так, как надо. А как не надо - делать не надо.
table.s*
 
Сами по себе Lua-функция table.remove/table.insert тормозные, когда дело касается добавления/удаления в начале (середине) большой таблицы
Надо делать так, как надо. А как не надо - делать не надо.
Использование функции os.execute без показа окна windows cmd
 
Цитата
Sergey Denegin написал:
Подскажите, а разве при этом само ДОС окно у вас запускается минимизированным?
Нет.
Команда start помогает ДОС-окну закрыться до завершения приложения program.exe. Но ключ /MIN не помогает: ДОС-окно всё-равно мелькает на экране.
Надо делать так, как надо. А как не надо - делать не надо.
Пароль на скрипты, Запуск и остановка скриптов строго по паролю
 
Цитата
Sergey Gorokhov написал:
Да, но к сожалению это пожелание было отклонено.
Вобще-то я предложил другое: дать доступ к уже реализованной настройке с клиентского места. Т.е., это другое предложение.
Мне оно, как бы, не надо. Дарю идею sav 312, если пропихнёте.
Надо делать так, как надо. А как не надо - делать не надо.
Пароль на скрипты, Запуск и остановка скриптов строго по паролю
 
Цитата
sav 312 написал:
Сегодня разговаривал с Брокером (Сбербанк), так вот все, что Вы написали, настроить у него нельзя, полагаю, что чисто технически это сделать реально, но делать они этого не будут.
Возможно, чтобы использовать этот функционал, нужно вносить какие-нибудь правки в регламент. А возиться ради одного клиента они не хотят. Вот если бы на эту услугу был бы спрос...

Цитата
sav 312 написал:
Предлагаю вернуться к паролю на скрипты
Ну не будет у вас это работать локально, поймите. То, что вы просите - бессмысленно. Если вы сейчас не можете удержаться, чтобы не остановить скрипт. То завтра вы точно так же запустите QUIK без скриптов, и никакой пароль не поможет.

Цитата
sav 312 написал:
или встроенному риск-менеджеру (из 2 пунктов).
А вот это уже разумно. Я вижу это так: изменение настроек риск-менеджера производится локально с рабочего места QUIK самим пользователем (для этого ему надо дать права на эту операцию) и активирует уже давно реализованный на сервере функционал. Но не реалтайм, а после перезагрузки дилерской библиотеки, т.е. на следующий день.
sav 312, Sergey Gorokhov, попробуйте договориться  :wink:
Надо делать так, как надо. А как не надо - делать не надо.
Что с оператором "if"?, Он не умеет сравнивать дробные числа?
 
Цитата
Николай Камынин написал:
Я Вам про это и ответил.
Это вы не мне ответили.
Собственно, ответ уже был дан:
Цитата
Sergey Gorokhov написал:
Все дело в типе данных DOUBLE сравнивать нужно с заданной точностью.

Если хотите сравнивать строки, то используйте string.format. Но вычисляться будет в десять раз дольше, чем с числами.
Надо делать так, как надо. А как не надо - делать не надо.
Что с оператором "if"?, Он не умеет сравнивать дробные числа?
 
Цитата
Николай Камынин написал:
tostring(dp)==tostring(i)
Это не надёжный способ сравнения чисел, т.к. при математических операциях над числами с плавающей точкой появляются разряды, которые tostring не опускает.

В примере стоит изменить шаг и сравнение с tostring перестаёт работать:
Код
function ff1(dp)
  for i = -8.8, -0.8, 0.1 do
    if tostring(dp) == tostring(i) then print(dp) end
  end
end
ff1(-0.8)
Надо делать так, как надо. А как не надо - делать не надо.
Что с оператором "if"?, Он не умеет сравнивать дробные числа?
 
Цитата
Николай Камынин написал:
ff1(-8.8)
Все работает правильно.

Вопрос был в другом  :wink:

Код
function ff1(dp)
  for i = -8.8, -0.8 do
    if dp == i then print(dp) end
  end
end

for param, value in pairs({-8.8, -7.8, -6.8, -5.8, -4.8, -3.8, -2.8, -1.8, -0.8}) do
  ff1(value)
end
Надо делать так, как надо. А как не надо - делать не надо.
getFuturesHolding()
 
Egor Zaytsev,
Речь по таблицу "futures_client_holding", к которой обращается функция getFuturesHolding(). Повнимательней!
Надо делать так, как надо. А как не надо - делать не надо.
getFuturesHolding()
 
Цитата
Egor Zaytsev написал:
Просьба уточнить, пожелание от Вас или просто цитата?
Это предложение.
Цитата
Egor Zaytsev написал:
Регистрируем?
На ваше усмотрение.
Это касается всех функций: когда в функцию передаются параметры, хочется знать их смысл (ну, так, чтобы программирование было более осмысленным). А попробуйте в руководстве найти описание параметров form_id, acc_id, pos_type  :what:

Цитата
Egor Zaytsev написал:
Цитата
Может ли в таблице "futures_client_holding" с одним набором  firmid, trdaccid, sec_code  быть несколько строк с разными типами лимита  type ?
Да, может.
Какой тогда тип лимита будет меняться при покупке/продаже контрактов?
Надо делать так, как надо. А как не надо - делать не надо.
getFuturesHolding()
 
Скрытый текст

Может ли в таблице "futures_client_holding" с одним набором firmid, trdaccid, sec_code быть несколько строк с разными типами лимита type?
Надо делать так, как надо. А как не надо - делать не надо.
Пароль на скрипты, Запуск и остановка скриптов строго по паролю
 
Цитата
Sergey Gorokhov написал:
Цитата
Старатель   написал:
Т.е., на стороне брокера есть настройка, автоматически блокирующая возможность торговли при достижении заданного лимита потерь?
Автоматом блокирует.
Значит такая настройка уже есть. Это настройка самого сервера или нужен дополнительный модуль?
Где можно ознакомиться с данной возможностью подробнее? Как она работает?
Надо делать так, как надо. А как не надо - делать не надо.
Пароль на скрипты, Запуск и остановка скриптов строго по паролю
 
Цитата
Sergey Gorokhov написал:
У брокера есть возможность заблокировать торговлю пользователю. Не через CoLibri. Но с помощью нее он может понять что нужно заблокировать.
Таким образом она полностью отвечает Вашему запросу.
Как он там может понять, остаётся за скобками...

Цитата
Sergey Gorokhov написал:
Нигде не говорилось что Colibri решает задачу контроля дневного лимита потерь (о чем говорит sav 312,)
Тогда не понятно, какую из запрашиваемых задач решает CoLibri, если она и не контролирует и не блокирует?

Цитата
Sergey Gorokhov написал:
Задача решается настройками на стороне брокера.
Т.е., на стороне брокера есть настройка, автоматически блокирующая возможность торговли при достижении заданного лимита потерь? Или хотя бы сигнализирующая об этом? А брокер пусть бежит и вручную блокирует клиента. А на завтра надо бы ещё не забыть разблокировать...  :lol: Тогда эта услуга должна быть очень востребованной, чтобы брокер так напрягался  :lol:

В любом случае, как само предложение автора топика, так и отмазы тех.поддержки порадовали  :lol:
Надо делать так, как надо. А как не надо - делать не надо.
Пароль на скрипты, Запуск и остановка скриптов строго по паролю
 
Цитата
sav 312 написал:
Дневной лимит потерь (запрет торговли после превышения ранее заданной просадки по счету).

Цитата
Sergey Gorokhov написал:
У брокера есть возможность заблокировать торговлю пользователю. Не через CoLibri. Но с помощью нее он может понять что нужно заблокировать.

Мне, конечно, не нужна такая настройка.
Но, справедливости ради, хочу уточнить, Colibri разве позволяет отслеживать дневной лимит потерь?
Надо делать так, как надо. А как не надо - делать не надо.
depo_limit.currentbal в лотах на демо
 
Цитата
Stanislav Tvorogov написал:
Настройка устанавливается на торговую фирму. Она может как совпадать так и различаться на каждой из фирм.
Речь по trade_accounts.firmid?
Надо делать так, как надо. А как не надо - делать не надо.
depo_limit.currentbal в лотах на демо
 
Как эта настройка вообще устанавливается?
Своя для каждой секции или как?
Надо делать так, как надо. А как не надо - делать не надо.
Рассчитать среднюю стоимость позиции
 
Как быть?
Надо делать так, как надо. А как не надо - делать не надо.
depo_limit.currentbal в лотах на демо
 
Цитата
Stanislav Tvorogov написал:
Зависит от настроек конкретного брокера.
На валютной секции учет также может вестись как в лотах, так и в штуках?
Надо делать так, как надо. А как не надо - делать не надо.
Рассчитать среднюю стоимость позиции
 
Если рассчитывать среднюю стоимость позиции по прошедшим сделкам, возникает вопрос:
Может ли колбэк по сделке прийти позже колбэка OnDepoLimit или OnFuturesClientHolding?
Надо делать так, как надо. А как не надо - делать не надо.
проблема со стаканом
 
Stanislav Tvorogov, ничего никуда отправлять не нужно. Эффект вполне воспроизводится на любом рабочем месте при подключении как к боевому, так и демо серверу с дефолтными настройками (удалены все dat, log, ini файлы).
А проблема заключается в том, что активация кнопок завязана на обновление таблицы котировок после того как отобразится своя заявка в стакане. На следующее обновление таблицы, карл.
Поэкспериментируйте на неликвидной бумаге, и вы увидите, что кнопки "Снять выделенную заявку" и "Заменить выделенную заявку" никогда не активируются в стакане. Только если второй раз кликнуть по своей заявке. Более того, после снятия заявки той же кнопкой "Снять выделенную заявку" кнопки не перестают быть активными.
Специально для вас: поиграйте с "Химпром ап" на демке. Если же вы будете настаивать, что у вас де не воспроизводится, выложите сюда видео, как вы воспроизводили. Я не верю, что вы что-то делали вообще.

Stanislav Tvorogov, я сделал за вас всю работу! Вам осталось только отправить моё сообщение программистам, чтобы они поправили в коде: сделали активацию/деактивацию кнопок одновременно с отображением/снятием своей заявки в стакане.
Надо делать так, как надо. А как не надо - делать не надо.
проблема со стаканом
 


Цитата
Stanislav Tvorogov написал:
Просьба проверить, что в QUIK выставлены оптимальные настройки получения данных:
https://forum.quik.ru/messages/forum1/message14044/topic1539/#message14044
Какие из настроек влияют на эффект активации кнопок при том, что заявка отобразилась в таблице котировок?
Надо делать так, как надо. А как не надо - делать не надо.
Отступ от правого края, Нет нормально отступа от края
 
Надо делать так, как надо. А как не надо - делать не надо.
проблема со стаканом
 
В v.7.5 при выставлении заявки из стакана кнопки "Снять выделенную заявку" и "Заменить выделенную заявку" на панели активируются с большим временным лагом.
Надо делать так, как надо. А как не надо - делать не надо.
Накопленный купонный доход, Возможности системы QUIK для анализа и учета
 
Можно написать на Lua скрипт, который будет каждый день пересчитывать ваш НКД.
Надо делать так, как надо. А как не надо - делать не надо.
depo_limit.currentbal в лотах на демо
 
Как отображаются неполные лоты в портфелях у брокеров с настройкой отображения лимитов в лотах?
Надо делать так, как надо. А как не надо - делать не надо.
Пароль на скрипты, Запуск и остановка скриптов строго по паролю
 
Цитата
sav 312 написал:
В моем случае, пароль от скрипта после всех настроек, будет находиться не у меня. Тоже самое будет сделано и с учетной записью на винде (квик снести не смогу).
:lol: Вам рассказать как запустить QUIK без скриптов и без переустановки квика?
Тут правильно написали: в вашем случае поможет только риск-менеджер на сервере. А все эти локальные защиты/блокировки при желании обходятся/отключаются.
Надо делать так, как надо. А как не надо - делать не надо.
Не могу получить данные с графика, не могу получить данные с графика
 
Цитата
тот самый написал:
Со своей же стороны - приму к сведению проверять абсолютно ВСЕ данные приходящие с биржи на валидность (к слову..и до этого проверял)
"Абсолютно ВСЕ" данные проверить в QUIK невозможно. Так, в нельзя проверить на наличие пропусков в ТВС или на графиках. Если только сверять с ещё одним источником данных.
Надо делать так, как надо. А как не надо - делать не надо.
Не могу получить данные с графика, не могу получить данные с графика
 
Цитата
Sergey Gorokhov написал:
Узнать время закрытия можно только по таблице обезличенных сделок.
Это как?
Надо делать так, как надо. А как не надо - делать не надо.
Почему скрипты в QUIK выполняются дольше
 
Цитата
swerg написал:
Двухпоточность рабатает отлично. Поток main() не мешает основному потоку
А время - понятные накладные расходы.
Разве что не мешает... Пока не задействуешь потокобезопасные функции QLua.
Но в моём понимании "отличная работа" многопоточного приложения - это когда на многоядерном ЦП несколько параллельно работающих задач выполняются быстрее, чем те же несколько задач, выполняемых последовательно.
А по факту в QUIK накладные расходы слишком высоки.
Надо делать так, как надо. А как не надо - делать не надо.
Почему скрипты в QUIK выполняются дольше
 
Мда... Двухпоточность в QLua работает действительно неэффективно:
Вот сейчас запустил одновременно три скрипта в QUIK. Общее время работы составило 12.9 сек, что больше, чем при последовательном их запуске через консоль (3.5+3.5+3.6=10.6 сек).
Таким образом, выигрыша в производительности от многопоточной схемы работы в QUIK, действительно, не наблюдается. Единственный плюс - то, что интерфейс не зависает при работе длительных циклов в main.
Надо делать так, как надо. А как не надо - делать не надо.
Почему скрипты в QUIK выполняются дольше
 
В среде QUIK скрипты выполняются в несколько раз дольше, чем в командной строке.
Вот такой скрипт
Код
function main()
  print = message or print
  local abs = math.abs
  local t = os.clock()
  for i = 1, 100000000 do abs(-1234.56789) end
  t = os.clock() - t
  print(string.format('%0.1f', t))
end

if not message then main() end
в командной строке выполняется 3.5 сек, в QUIK - 8.8 сек.
В 2.5 раза дольше! Почему так?

PS: ЦП: 2 ядра, 4 логических процессора.
Надо делать так, как надо. А как не надо - делать не надо.
Стоп лимит
 
Цитата
Эл Саф написал:
Заявка отклонена ТС.
Цитата
Zoya Skvorcova написал:
Не было встречного предложения-заявка отверглась.  Такая ситуация могла произойти не только, при выставлнии рыночной по исполнению стопа, но и просто с обычной заявкой с признаком рыночная на Срочном рынке.

Zoya Skvorcova, вы не правы. При отсутствии встречного предложения/спроса заявка просто снимается, а не отклоняется ТС.
Надо делать так, как надо. А как не надо - делать не надо.
depo_limit.currentbal в лотах на демо
 
Есть бумага. Она не принадлежит к конкретному классу TQBR или SMAL: это одна и та же бумага.
Поэтому получать количество в depo_limits нужно в штуках. А при необходимости пересчитывать в лоты в зависимости от лотности нужного вам класса.
Надо делать так, как надо. А как не надо - делать не надо.
Еще пожелания
 
Цитата
Alexandr Finansov написал:
что-то пошло не так?
Именно. Если и внедрять автомасштабирование, то не принудительно, а в виде опции. Причём для каждой вкладки отдельно.
Надо делать так, как надо. А как не надо - делать не надо.
Страницы: Пред. 1 ... 19 20 21 22 23 24 25 26 27 28 29 ... 47 След.
Наверх