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

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

Страницы: 1 2 3 4 5 След.
Ищу спеца по ЛуаКвик, для долгосрочного сотрудничества по созданию робота и его доработкам или для консультаций и наставничества.
 
Anton, спасибо за предоставленный скрипт по очистке при завершении.

Можете объяснить зачем нужны строки, которые я закомментил в вашем скрипте?
Код
function OnStop()
   assert(runStatus == 3, "Unexpected runStatus in OnStop: " .. runStatus)
   runStatus = runStatus - 1
   while runStatus == 2 do
      sleep(10)
   end
--   runStatus = runStatus - 1
end

function main()
   onMainInit()
   runStatus = 3
   while runStatus == 3 do
      onTimeStep()
      sleep(mainLoopTimeout)
   end
   do
      local s, e = pcall(onMainCleanup)
      runStatus = runStatus - 1
--      while runStatus == 1 do
--         sleep(10)
--      end
      if not s then error(e) end
   end
end
Не могу понять в чем смысл данного ожидания уже после выполнения функции очистки.
Ищу спеца по ЛуаКвик, для долгосрочного сотрудничества по созданию робота и его доработкам или для консультаций и наставничества.
 
Цитата
БорисД написал:
Не думал я что  критиков будет много  а желающих в этом деле поучаствовать не будет ( может позднее кто подтянется  ?  
Не в критике дело, а в том, что за это взялся "единственный на этом форуме, кто пишет на чистом Lua"

А значит, что подход будет примерно такой
Читаем ласт из ТТТ, строим свечки самостоятельно, суперсекретная аналитическая функция, отправка транзакции без каких-либо проверок состояния. Ну и все это в цикле.
Кому надо что-либо другое, те "лапули" не умеющие писать на "чистом LUA", следовательно идут в жопу.

Надеюсь что я ошибаюсь, но пока что посижу тут с попкорном, понаблюдаю

А так думаю тут у многих свои роботы написаны.
Только я, например, не вижу смысла делиться наработками, по крайней мере на данном этапе, когда даже сама идея разработки вызывает сомнения.
Ищу спеца по ЛуаКвик, для долгосрочного сотрудничества по созданию робота и его доработкам или для консультаций и наставничества.
 
Цитата
Владимир написал:
Здесь уже, похоже, должны появиться какие-то вопросы. Так что перекур до их получения.
Вопрос тут только в том, неужели вы правда верите в подобную затею?
А то что мне кажется что вы просто сейчас угораете  :cool:

Ну невозможно создать универсальный каркас робота до неприличия не раздув его не нужными функциями.
И тут возникает главный вопрос, что считать необходимым функционалом, а что ненужной хренью?
У каждого трейдера же свое видение не данный вопрос.

Один активно работает с графиками, другому это не надо.
Один динамически получат инструмент, другой работает по заранее готовому списку.
Один предпочитает работать с колбеками и очередями событий, другой считает это кощунством.
Кому-то надо рассчитывать в зависимости от состояния счета количество лотов, а кто-то предпочитает в ручную контролировать это
Да тут даже на простое формирование trans_id у каждого свой взгляд.

И таких примеров можно привести очень много.

Так что подобная идея в адекватном виде взлететь не может, а если раздувать всевозможным функционалом, то получится такой монстр, что ну его нахрен.
EMA, Расчет средней скользящей
 
Цитата
nikolz написал:
тогда поясните зачем это:
чтобы заполнить кэш с расчетами EMA, для дальнейшего обращения к любому из элементов
Цитата
nikolz написал:
и от чего зависит этот цикл?
исключительно от количества свечей в датасурсе, точно не от периода
EMA, Расчет средней скользящей
 
Цитата
Владимир написал:
Мне эта скользящая средняя никогда была нафиг не нужна, код я, ессно, тоже смотреть не хочу, но nikolz, похоже, прав: никаких циклов здесь не нужно.
(с) Ни читал, но осуждаю...
Прекрасная позиция, и главное очень аргументированная  :lol:

Цитата
Владимир написал:
Считаем сумму один раз, а потом к ней добавляем новое значение и убираем самое старое. Два действия - какой тут цикл?
Так это не работает, тут разговор не про SMA, а про EMA
Но даже для случая SMA, период 1000, сумму без цикла считать стали бы?
EMA, Расчет средней скользящей
 
Цитата
nikolz написал:
не используйте цикл. Это зло в прогах реального времени.
А разве возможно без цикла рассчитать EMA? Буду признателен, если продемонстрируете как это сделать.
Цитата
nikolz написал:
Если Вам надо рассчитать EMA с периодом 1000 таймов скока времени  будете считать?
Ради интереса проверил, на моем компе период 1000 просчитался за 0,00099999999656575 секунды
Цитата
nikolz написал:
При этом Вы для каждого нового значения повторно обсчитываете предыдущие 999.
Это вы откуда взяли? Для расчета каждого нового значения берется одно предыдущее из кеша.
Цитата
nikolz написал:
В правильной программе и кеш никакой не нужен
На вкус и цвет...
Цитата
nikolz написал:
и время расчета нового значения  не зависит от периода EMA
Так у меня время расчета тоже от периода не зависит
Увеличение кол-во лотов для входа в позицию в зависимости от профита
 
Код
function Q_lot()
  local default_lot=1 -- количество лотов при отсутствии прибыли
  lot=default_lot+math.max(0,math.floor(Profit/35000))
end 
EMA, Расчет средней скользящей
 
Дмитрий, ну пример для изучения вы явно не самый удачный нашли.. точнее совсем уж неудачный ибо кривой и нерабочий, в нем даже и комментировать нечего

Лови мою функцию расчета EMA Close вместе с примером использования
Код
function main()
  ema_cache={}  -- Кзш со значениями EMA Close
  period=15 -- Период EMA
  ds,error_desc=CreateDataSource("SPBFUT","SiZ1",INTERVAL_H1) -- Создаем датасурс
  n=0 -- Счетчик
  while(ds:Size()==0)and(n<100)do sleep(100) n=n+1 end -- Ждем загрузки датасурса
  if(n==100)then message("Ошибка:"..tostring(error_desc)) return false end -- Если не дождались - выход
  ema(ds,period) -- Вычисляем EMA, заполняем кзш
  message("EMA "..ema_cache[ds:Size()])   -- Пример получения EMA последней свечи
  message("EMA "..ema_cache[ds:Size()-1]) -- Пример получения EMA предпоследней свечи
end
function ema(datasource,period) -- Расчет EMA Close
  local k=2/(period+1) -- Коэффициент взвешивания
  for i=1,datasource:Size() do -- Пробегаемся по всем свечам
    if i==1 then ema_cache[i]=datasource:C(i) -- EMA Close первой свечи
            else ema_cache[i]=k*datasource:C(i)+(1-k)*ema_cache[i-1] -- EMA Close всех остальных свеч
    end
  end
end
Перевод робота с lua 5.1 на lua 5.3
 
Цитата
Олег написал:
Добрый день. Попробовал убрать math.floor.Ошибка остаётся прежней: Неправильно указан номер заявки: "1.9250430826724e+018"
Какая версия терминала используется?

Запустите следующий код
Цитата
  local N = getNumberOf("orders")                  
  for i=0,N-1 do
    local row = getItem("orders",i)
    if(bit.band(row.flags,1)>0) and (bit.band(row.flags,4)>0) then message("order_num="..row.order_num) end
  end
будет ли корректно отображаться номера активных заявок?
Перевод робота с lua 5.1 на lua 5.3
 
Цитата
Олег написал:
В чём ошибка?
Вот в этой строчке
Код
local keyNumber = math.floor(row.order_num)
Зачем тут у вас math.floor()?
Он вам и приводит число к экспоненциальной записи.
Уберите и будет все работать
Подскажите как сделать Таймер на пользовательскую функцию?
 
Ну и еще один пример
https://forum.quik.ru/messages/forum10/message57762/topic6682/#message57762
Иногда не срабатывает killorder (во время движений)
 
Цитата
Alexey написал:
Имеет ли смысл отправлять повторный приказ "KILL_ORDER", если не дождался подтверждения исполнения первого приказа ??
В таком случае надо определить, что такое "не дождался подтверждения исполнения первого приказа".
Какое время будете считать за не ответ?
Вот в вашем случае ответ на заявку был спустя 8 секунд, т.е. заявка никуда не потерялась, а просто висела в очереди на исполнение.

Лично я считаю, что смысла нет, ну по крайней мере в течении первой минуты после отправки на исполнение
Приходилось наблюдать задержки и по примерно 30 секунд, а вот потерь заявок без потери связи с сервером не наблюдал.

Цитата
Alexey написал:
Может второй приказ проскочит в другую очередь ? ))
Это вряд ли
Иногда не срабатывает killorder (во время движений)
 
Утром на открытии торгов и после вечернего клиринга часто бывают такие задержки.
И это вполне понятно, ибо очень много таких как вы желающих в первые секунды торгов совершить сделку.
Сервера брокеров и биржи просто не успевают обрабатывать заявки, отсюда и задержки.

И вариантов тут не много
1) Выстраивать стратегию чтобы такие задержки были не критичны
2) Снимать заявки за несколько минут/секунд до окончания торговой сессии
3) Разместить сервер у брокера
4) Ну или даже разместить свой сервер на площадке биржи и торговать без брокера.

Вот я выбрал первый вариант, как самый простой и понятный.
рыночные заявки становятся лимитными
 
Цитата
Незнайка написал:
Где именно?
В руководстве пользователя QUIK идущем в комплекте с терминалом:
Цитата
Раздел 5: Торговые операции клиента
5.2.2 Окно «Ввод заявки»
..........
12.*«Условие исполнения» определяет порядок обработки остатка заявки при ее частичном
исполнении:
..........
(*) Указанные параметры отсутствуют при операциях на срочном рынке
FORTS.

После вашего комментария решил все же тоже проверить.
Вы правы.
Как минимум лимитка с условием "Снять остаток" на срочном рынке выставляется и при отсутствии встречки сразу же снимается.
Получается, что в документации ошибка.
рыночные заявки становятся лимитными
 
Цитата
Незнайка написал:
Ещё заявка выставляется с условием "Снять остаток", поэтому нереализованная заявка сразу снимается.
Лично не проверял, но в документации написано что условия исполнения заявок отсутствуют на срочном рынке.
рыночные заявки становятся лимитными
 
А вы случаем не на срочном рынке торгуете?

На мосбирже рыночных заявок по срочному рынку нет как таковых.
А то что в квике называется рыночной заявкой, при торговле на срочном рынке как раз превращается в обычную лимитную.
Что делает SetEmptyCallback() ?
 
Цитата
Владимир написал:
Это была демонстрация абсолютной НЕработоспособности CreateDataSource
Неработоспособности? Может вы забыли запустить скрипт?
Кто-то не умеет работать с данной функцией, кто-то умеет.
А на вкус и цвет, как говорится, все фломастеры разные.
Цитата
Владимир написал:
на основе которой ВААПЩЕ НЕЛЬЗЯ "реализовать что-либо интересное", такой способ доступа к данным - это КРЕТИНИЗМ!
Опять я наблюдаю столь категоричные высказывания  от вас :smile:
Вы хоть как-то аргументируйте свою позицию-то, а то спорить скучно.
Цитата
Владимир написал:
Не говоря уже о том, что функция эта относится к разделу работы с графиками.
Тут согласен, но это уже вопрос терминологии, а не программирования.
Цитата
Владимир написал:
С нею невозможно работать при ЛЮБОМ коде, даже вылизанным до последней запятой.
Як так??? Да вы ради интереса хоть попробуйте поработать что ли, а то получается классическое "не читал, но осуждаю".
Цитата
Владимир написал:
Во-первых, Lua я знаю. Мало того: я здесь чуть ли не единственный, кто пишет на чистом Lua.
На чистом LUA?? Да быть такого не может!  :lol:
Вы LUA и QLUA не путаете случаем?
Цитата
Владимир написал:
Я имел в виду, что оператор этот дурацкий, я так никогда не делал, и делать не буду.
Чем это обычный логический оператор OR то провинился?
Прекрасный оператор на мой взгляд, как минимум ни чуть не хуже чем AND и NOT.
Кстати, вы знали что в LUA оказывается нет оператора XOR? Мне, например, в свое время его очень не хватало для работы с битовыми флагами.
Цитата
Владимир написал:
Во-первых, свечи у меня начинаются с 15-секундных.
А я это и упомянул, что самостоятельно считать свечи стоит только для нестандартных интервалов.
Цитата
Владимир написал:
Во-вторых, они считаются по-другому: я уже не раз говорил, что классические мат. ожидание и дисперсия в миллион равз информативнее всей этой "японской" дребедени.
Звучит логично. Поверю на слово, мне лень проверять.
Цитата
Владимир написал:
В-третьих, Вы не ответили на мой вопрос: СКОЛЬКО свечей она мне даст по каждому интервалу?
Формирует 3000 последних свечей, но может дать больше, если ранние свечи уже есть в истории терминала
Цитата
Владимир написал:
И что она будет делать при появлении очередной свечи? Будет всё время дописывать? Или даже и дописывать не будет?
Создаст свечу с новым индексом и будет обновлять ее данные, пока не появится следующая свеча.
Что делает SetEmptyCallback() ?
 
Цитата
nikolz написал:
для любого интервала надо считать close,Low, High, Volume.
Просто Выдернуть не получится .
Да ладно, всегда выдергивал и бед не знал.

Ну вот реально зачем считать самостоятельно свечи, если их можно брать готовыми?
Единственную причину вижу в нестандартных интервалах.

Цитата
nikolz написал:
На мало ликвидном рынке надо учитывать тот факт, что на интервале может не быть сделок вообще.
Если работаете на мало ликвидных рынках, то что ж мешает добавить дополнительные проверки по времени свечи и объему?
Что делает SetEmptyCallback() ?
 
Цитата
Владимир написал:
Ах ты засранец!
Более чем взаимно!  :cool:

Цитата
Владимир написал:
Нет, я не понимаю: Вы ВСЕРЬЁЗ предлагаете подобную хрень реализовать или прикалываетесь?
Побойтесь бога, зачем мне вам что-то предлагать?
Это была демонстрация работоспособности CreateDataSource, на основе которой можно уже реализовать что-либо интересное, но вы это не смогли понять.Или вы думали, что я вам тут полноценного робота со всеми вашими хотелками предоставлю?
Ну нафиг...

Цитата
Владимир написал:
что делает хреновина вида "ds[tikers[j][1]]=ds[tikers[j][1]] or {}" я не знаю, да и знать не хочу
Вы таки гордитесь тем что не знаете LUA?  :lol:
Что делает SetEmptyCallback() ?
 
Цитата
Владимир написал:
Лично я решения не вижу ВААПЩЕ
Понимаю, старость не радость, но вы там держитесь, не унывайте...  :lol:

Special for you
Код
function main()
  ds={}
  intervals={INTERVAL_M15,INTERVAL_M30,INTERVAL_H1,INTERVAL_H2,INTERVAL_H4,INTERVAL_D1}
  tikers={{"SPBFUT","SiZ1"},{"SPBFUT","SiH2"},{"SPBFUT","SiM2"},{"SPBFUT","SiU2"}}
  for i=1,#intervals do
    for j=1,#tikers do
      ds[tikers[j][1]]=ds[tikers[j][1]] or {}
      ds[tikers[j][1]][tikers[j][2]]=ds[tikers[j][1]][tikers[j][2]] or {}
      ds[tikers[j][1]][tikers[j][2]][intervals[i]]=CreateDataSource(tikers[j][1],tikers[j][2],intervals[i])
      while(ds[tikers[j][1]][tikers[j][2]][intervals[i]]:Size()==0) do sleep(1) end
    end                                                                 
  end
-- Пример получения свечи
  local need_ds=ds["SPBFUT"]["SiZ1"][INTERVAL_H1]
  local size=need_ds:Size()
  message("O="..need_ds:O(size).." H="..need_ds:H(size).." L="..need_ds:L(size).." C="..need_ds:C(size))
end
Что делает SetEmptyCallback() ?
 
Владимир, Не ожидал  :smile: Тут же даже кулинарить нечего, все и так очевидно  :cool:

Создать датасурс и выдернуть из него последнюю свечу проблем нет никаких (см. пример в первом посте).
А как в цикле пробежаться по заданным интервалам и инструментам думаю сами догадаетесь.

Вопрос то у вас в чем?
Что делает SetEmptyCallback() ?
 
Владимир, это вы просто не умеете их готовить )))
Я вот часовые свечки дергаю используя CreateDataSource, и никакого атавизма в этом не замечаю, все работает.
Что делает SetEmptyCallback() ?
 
Собственно, это как раз то, что я и описывал.
Цитата
Незнайка написал:
Sergey Gorokhov  написал:На самом деле, заказ данных  после CreateDataSource  происходит независимо от заданного коллбэка.
Хотя в своих боевых скриптах, на всякий случай оставил вызовы SetEmptyCallback(), мало ли что изменится в будущем.

Вопрос к разработчикам.
SetEmptyCallback это атавизм или все же есть ситуации когда он еще актуален?
OnTransReply возвращает order_num = nil
 
Цитата
Алексей написал:
Обрабатывать коллбэк OnOrder? Опять же таки я не нашел в документации ни слова о том при каком условии он вызывается? Только при условии что trans_reply.status = 3 или вообще при любой попытке отправить заявку, даже неудачной?
OnOrder вызывается при получении новой заявки или при изменении параметров существующей заявки и с OnTransReply никак не связан.
Ну то есть при trans_reply.status==3 по логике должен прийти OnOrder (и обычно приходит), но как бы прямой взаимосвязи нет.
Цитата
Алексей написал:
В первом случае получив и обработав OnOrder можно не запариваться с OnTransReply и его статусом по идее, разве что для информации. Во втором случае в коллбэке OnOrder обязательно нужно проверить trans_reply.status. И опять же появляется другой вопрос, в какой последовательности оба этих коллбэка идут??? Если OnOrder может прийти раньше OnTransReply, то получается полнейшая ерунда, order_num в OnTransReply я получить не могу, а OnOrder не могу обработать, т.к. понятия не имею о статусе заявки...
А тут все гораздо интереснее, и последовательность прихода этих коллбеков может быть любая, но это совершенно не проблема если мы используем очереди событий для указанных коллбеков.
Сначала ищем определенное время в очереди OnTransReply нужный ответ с order_num, либо отлуп.
После чего так же определенное время в очереди OnOrder ищем нужную нам заявку.
OnTransReply возвращает order_num = nil
 
Цитата
Алексей написал:
Но остается открытым вопрос, что же делать то? Но из вашего пояснения получается, что OnTransReply может вызываться на каждую заявку неоднократно? Если это так, достаточно ли фильтровать те, что пришли с order_num = nil и тупо ждать коллбэк с заполненным этим полем, он обязательно появится?
У себя проверял, при trans_reply.status==3 trans_reply.order_num всегда заполнен и равен номеру заявки (при выставлении - новой, при снятии - снимаемой)

Но если я правильно понимаю, то OnTransReply формируется сервером брокера, а не биржей, так что думаю от настроек брокера может зависеть заполненность полей и количество ответов.

Вам стоит проверить сколько и каких ответов придет для конкретно вашего случая
Код
function OnTransReply(trans_reply) -- Функция вызывается терминалом QUIK при получении ответа на транзакцию пользователя
  local str="OnTransReply:"
  for k,v in pairs(trans_reply) do
    str=str.."\n"..tostring(k).."="..tostring(v)
  end
  message(str)
end
И уже в зависимости от результата искать решение.
Пропали ценовые колонки в таблице текущих торгов, Пропали ценовые колонки в таблице текущих торгов. В доступных параметрах их тоже нет - добавить нельзя. Брокер виноват?
 
Версия терминала какая?
В QUIK версии 9.2.0 ТТТ поломали, в 9.2.1 починили
Как получить значение из файла txt
 
Цитата
Rusyan написал:
Помогите)
Код
f=io.open(getScriptPath().."\\bot.txt","r")
line1=tostring(f:read("*l"))
line2=tostring(f:read("*l"))
f:close()
v1,v2,v3,v4=string.match(line2,"(%d*);(%d*);(%d*);(%d*)")
message("find: "..v4)
info.log
 
Цитата
QApplication написал:
У кого какие есть советы?
Лично я запускаю квик с ключом запуска "-clear" (можно прописать его, например, в ярлыке quik)

Цитата из документации
Цитата
-clear – очистить служебные файлы, которые содержат торговые данные (info.log (или curr_data.log в зависимости от настроек терминала), acnt.dat, alert.ik, alltrade.dat, trades.dat, orders.dat). Это позволяет ускорить загрузку программы.
Данные за последнюю сессию автоматом подтянутся при подключении к серверу.
Переустановка терминала QUICK в случае поломки компьютера, сохранение старых настроек при повторной установке QUICK
 
Цитата
Инесса написал:
Подскажите, как правильно делать бекап Квика?
Ну самое простое, это периодически куда-нибудь копировать всю папку квика + свои скрипты и индикаторы.
Это просто, но не оптимально.

Если более грамотно подходить, вот, для примера, мой список для бекапа
Код
C:\Scripts\Autologin\quik_autologin.lua    // Автологин QUIK
C:\Scripts\Starters\starter_base.lua       // Стартовый скрипт, торговля на основном счете
C:\Scripts\Modules\mod_trading.lua         // Основной торговый модуль
C:\Scripts\Testers\tester_15_25.lua        // Тестер стратегий 15 25 H1
C:\Scripts\Indicators\ind_15_25.lua        // Индикатор 15 25 H1
C:\Open_Broker_QUIK\LuaIndicators\load.lua // Стартовый скрипт запуска индикатора
C:\Open_Broker_QUIK\Keys\pubring.txk       // Публичный ключ
C:\Open_Broker_QUIK\Keys\secring.txk       // Секретный ключ
C:\Open_Broker_QUIK\info.ini               // Настройки QUIK
C:\Open_Broker_QUIK\info.wnd               // Настройки окон QUIK
C:\Open_Broker_QUIK\ip.cfg                 // Настройки серверов подключения
C:\Open_Broker_QUIK\qcrypto.ini            // Настройки криптопровайдера
C:\Open_Broker_QUIK\qrypto.cfg             // Настройки ключей
C:\Open_Broker_QUIK\KeyGen\qrypto.cfg      // Настройки генератора ключей
Короче, составляем список нужных файлов, и скармливаем их в винрар, он умеет архивировать заранее заданный список файлов и скидывать архив куда требуется.
Архив должен сохраняться по сети на другой комп/сервер.
Автоматизируем эту процедуру на запуск каждую ночь.
Переустановка терминала QUICK в случае поломки компьютера, сохранение старых настроек при повторной установке QUICK
 
Так как в квике все настройки расположены в файлах, а жесткий диск поменяли, то настройки вам придется вручную все восстанавливать.

Обычно диски одномоментно не помирают, так что возможно со старого диска еще можно вытащить инфу?
Достаточно найти на старом диск папку в которой был расположен квик, и скопировать его на новый диск.

Ну и напоследок.
Люди делятся на два типа: те кто делают бекапы и те, кто пока еще их не делают. Первым гораздо спокойнее живется.
Отменить цикличность появления сообщения
 
Цитата
Олег написал:
Вопрос: как прописать код, чтобы сообщение появлялось либо раз в N минут (но тогда именно сразу после открытия новой свечи)
Примерно так можно выдавать сообщение не чаще чем раз в N секунд
Код
delta=5 -- время задержки в секундах
is_run=true
function main()
  while is_run do
    if(os.time()>=(last or 0)+delta)then last=os.time() message("Чпок раз в "..delta.." секунд") end
    sleep(100)
  end
end
function OnStop()
  is_run=false
end
условие появления  новой свечи, сами добавите, мне писать лень


Цитата
Олег написал:
либо просто появлялось всего один раз на каждое условие, а не зацикливалось по кругу?
А в таком случае надо сохранять предыдущие условия и добавить проверку на из изменение этих условий
QUIK не отправляет заявку, в которой цена представлена переменной
 
Цитата
вадим написал:
Можно и проще, зачем такие сложности. Можно округлить до целого и убрать точку с нулём через math.ceil().
Если вы присмотритесь, то увидите, что смысл приведенной функции не в округлении до целого, а в обрезании концевых нулей.
Отладка QUIK 8.13
 
Предлагаю разработчикам добавить в Информационное окно, ну и соответственно в функцию getInfoParam возможность получения информации о версии сервера.
Отладка QUIK 8.13
 
Цитата
Павел Bosco написал:
у меня Открытие Брокер, не знаю точно какая у них сейчас версия на сервере, программа этой информации не выдает
Не знаю какая у них версия сервера, но клиент 9.1.3.11 с Открытие Брокер работает.
Еще один вопрос про потоки
 
Я имею ввиду именно свечи стандартных таймфреймов, а не те, которые кроме как самостоятельно не рассчитать.
Еще один вопрос про потоки
 
Владимир, а можно ссылку на то кто вам "популярно объяснил" про расчет свечей на клиенте?
Просто звучит как что-то неразумное.
Всегда считал, что свечи с сервера получаем.
Робот как источник пассивного дохода?
 
Цитата
Pavel написал:
Наводит, собственно потому и прошу вашего мнения относительно реальности моих фантазий
"Нахер акции, гоняй сишку интрадей" (с) Уоррен Баффет
Робот как источник пассивного дохода?
 
Цитата
Pavel написал:
Уточню вопрос - рабочая ли идея и способна ли она в таких параметрах на спокойном рынке давать 100 тыс руб ежемесячно в плюс?
С такими вопросами и сразу во фьючи лезете, ну удачи чо..

На фьючерсах 20% в месяц это мелочи.
Можно  +200% сделать, а можно и потерять все за пару дней.

Так что пробуйте, деньги же ваши.
Робот как источник пассивного дохода?
 
Цитата
Владимир написал:
А какие у Вас основания "так не считать"?
Ну так совершенно не честно, ибо это вопрос из разряда, "докажи что бога нет".
Бремя доказательства всегда лежит на утверждающем наличие чего-либо, а не наоборот.

Цитата
Владимир написал:
У человека просто нет шансов против компьютера!
А это тут причем?
Компьютер, по сути счетная машинка, только охрененно быстрая.

Вот когда кто-нибудь сможет написать программу умнее его самого, вот тогда будет изобретен искусственный интеллект.
А до того знаменательного момента, мы имеем лишь программы работающие по заранее заданному алгоритму, пускай и очень сложному, но сути то это не меняет.

PS: Вы бы уж тогда ссылку на свою книгу кинули, кому интересно - почитает.
А пытаться приводить доказательства цитатами из своей же книги, на мой скромный взгляд, слишком уж оригинально.
getDataSource
 
Роман, это нормально.
Дело в том, что при открытом графике данные уже находятся у вас в терминале, поэтому CreateDataSource отдает данные практически моментально, ну или с минимальной задержкой.
Если же график закрыт, то данные сначала должны загрузиться с сервера на терминал, а на это нужно некоторое время.

Добавьте в код ожидание загрузки данных, должно помочь.
Код
  ds,error_desc=CreateDataSource(class_code,sec_code,interval)
  local n=0
  while(ds:Size()==0)and(n<100)do sleep(100) n=n+1 end -- Ждем загрузки данных не более 10 секунд
  if(ds:Size()>0)then message("Данные графика получены") else message("Ошибка получения данных") end
Робот как источник пассивного дохода?
 
Владимир, я вас услышал.
Причину разногласий понял так, что вы считаете, что алгоритм может быть умнее его разработчика, я же так не считаю.

Я рад за вас, что ваш робот так хорошо прогнозирует ситуацию, которую вы, как утверждаете, даже оценить не можете.
Мой тоже молодец, но все его действия я отлично понимаю, и знаю когда и почему он что-либо делает.

У нас просто принципиально разный взгляд на зависимость возможностей  написанных разработчиком алгоритмов от его умственных способностей.

Спор думаю стоит закончить.
Робот как источник пассивного дохода?
 
Владимир, не надо путать теплое с мягким.

Робот торгует по алгоритму заложенному в него разработчиком.
И если в алгоритм заложено, что при определенных обстоятельствах робот должен совершать определенные сделки, это значит, что разработчик считает, что именно так он бы и поступил.
И если брать конкретно ваш пример с покупкой, то когда вы закладывали в алгоритм робота данную покупку при повышении, неужели не считали, что именно так и надо поступать при сложившихся обстоятельствах?
Ну не поверю я, что алгоритм написан против своей же логики, типа хрен с ним, сам бы никогда не купил, а робот пускай покупает.

А то что вы пишите, мол не смогли бы сотворить такого руками, это уже конкретно ваш психологический момент, от которого, кстати, легко избавиться при желании.
Но к программированию это совершенно не относится, тут другие специалисты нужны.

PS: про шахматы даже комментировать не буду, пример не корректен.
Робот как источник пассивного дохода?
 
Робот это всего лишь автоматизация, его цель делать то же самое, что бы делал трейдер, только быстрее.

Так что ответы очевидны.
1) Робот будет зарабатывать (ну или терять) столько же, сколько зарабатываете вы руками.
2) Стоит, если вы руками умеете зарабатывать, но надоело постоянно торчать за терминалом.
3) Когда робот отлажен, то времени на него уже не тратится. Другой вопрос, что пока пишите, замучаетесь ловить и обходить косяки квика.
Поиск инструмента по названию
 
Цитата
Виталий написал:
Необходимо каждый день находить код обновляемого инструмента. Из данных имеется только лишь его префикс от короткого имени. Обычно делается следующим кодом:
Код
   function   findSecurity ()
     local  mdt  =   0 
     local  now  =   os.time ()
     local  foundcode  =   "" 
     for  i  =   0 , getNumberOf ( "SECURITIES" )  -   1   do 
         local  row  =   getItem ( "SECURITIES" , i)
         if (row.class_code  =  =   "PSAU" )  and  ( autolib.CheckAssetName (row.short_name)  =  =   true )  then 
             --message(row.short_name) 
             local  info  =   getSecurityInfo (row.class_code, row.code)
             if  info ~ =   nil   then 
                 local  expdt  =  strDateToEpoch(info.mat_date)
                 --message(tostring(info) .. " " .. tostring(expdt) .. " " .. tostring(now)) 
                 if  expdt  >  mdt  and  expdt  >  now  then  
                    mdt  =  info.mat_date
                    foundcode  =  row.code
                     --message(tostring(info.mat_date) ) 
                 end 
             end 
         end 
     end 
     if  foundcode ~ =   ""   then 
         autobuyerlib.LogU8 ( string.format ( "Найден инструмент %s" , foundcode))
     end 
 end    
  
Проблема в том, что часто (процентов 20% случаев) запуск кода дает ошибку ACCESS VIOLATION. Есть ли иной способ решить задачу?

Проще надо быть, зачем такой огород городить то?
Код
    local sec_list=getClassSecurities(class_code)
    for test_sec_code in string.gmatch(sec_list,"("..pref.."[^,]+)") do
      -- в test_sec_code инструмент с нужным префиксом, далее ищите по mat_date нужный вам, мне лень писать
    end
Код класса для получения котировок с СПБ - биржи
 
Цитата
Роман написал:
Цитата
Daniil Pozdnyakov написал:
Добрый день,
Могли бы вы уточнить, что вы имеете в виду под "market"
у class TQBR возвращает micex. У SPBXM - nil. У class CETS возвращает nil.
Вот и думаю, может, вручную задать этот параметр.

class="CETS"
market=get_market(class)
Да не нужны никакие маркеты для торговли.
Достаточно class_code и sec_code. Все.

Вам со своим роботом разобраться надо, что за market он там у вас возвращает и главный вопрос нахрена он вашему роботу нужен.
Короче смотрите код своего робота и начните с функции get_market
Тестирование стратегий, Возможность тестирования
 
Цитата
Egor Zaytsev написал:
Дело в том,что описание инструментов засылает биржа, после экспирации старый контракт шлюз с биржи уже не получает и транслировать на сервер нечего.
Егор, вы толи прикалываетесь, толи не читали мое сообщение
Еще раз прочтите пожалуйста https://forum.quik.ru/messages/forum1/message57397/topic4454/#message57397
То что вы выше пишете и так очевидно, но вопрос то был же совершенно не об этом.

Цитата
Egor Zaytsev написал:
Но брокер может решить Вашу задачу, на стороне сервера QUIK есть решение, которое поможет Вам получать с сервера описание экспирированных фьючерсов
Вы предлагаете запрашивать вручную у брокера данные по инструментам которые и так уже имеются у пользователя и меняться не будут никогда?
Если я вас правильно понял, то решение, думаю, рабочее, но ведь не логичное.

Давайте еще раз и медленно
1) В терминале имеются исторические данные по инструментам
2) Обратиться к ним нет возможности
3) Прошу дать возможность работать с этими данными
4) Я даже предложил способ как это сделать
Тестирование стратегий, Возможность тестирования
 
Цитата
nikolz написал:
Вариант 1:
Вариант 2:
Вариант 3:
Вариант 4:
На счет ваших вариантов, вот к чему вы их мне писали?
Я же не спрашивал как можно протестировать стратегию, это я и так умею и делаю.

Цитата
nikolz написал:
Это лучше и быстрее, чем канючить халяву на этом форуме.
Вы считаете что делать предложение по улучшению функционала ПО это "канючить халяву"?

Но я хочу теститировать в квике на исторических данных, раз уж приходится в нем работать.
Тестирование стратегий, Возможность тестирования
 
Цитата
Egor Zaytsev написал:
Добрый день.

Если делать склейки инструментов при экспирации? Данные будут склеиваться, правда имя инструмента будет новое, но исторические данные получить сможете.
Или такой вариант не удобен?
Такой вариант очень неудобен.

Может все же рассмотрите озвученное мной предложение?

Каждый при желании может написать свой тестер стратегий.
Но на данный момент нет возможности получить доступ к историческим данным, однако исторические данные у многих имеются в папке archives терминала.
Разве не логично бы было дать способ доступа к ним?
Ошибки в Qlua - двойной прогон всех индексов через функцию OnCalculate(), При добавлении индикатора на график происходит двойной прогон всех индексов через функцию OnCalculate()
 
Цитата
vladindre написал:
У меня из-за этой фичи пишутся в файл две одинаковые записи , что приводит к дальнейшему слому моего алгоритма чтения/записи.
Приходится выкорячиваться и обходить эту фичу всякими нецензурными методами. Зато программерское мастерство сильно хорошо
оттачивается.
Как уже сказали, этому косяку уже много лет, и фиксить его разрабы почему-то не желают.

У себя я решил проблему примерно так (упростил и вырезал стратегию)
Код
function OnCalculate(i)
  if(sec_code~=getDataSourceInfo().sec_code)or(class_code~=getDataSourceInfo().class_code)or(interval~=getDataSourceInfo().interval)then
    lines={} -- Массив со кешем рабочих линий
    interval=getDataSourceInfo().interval
    sec_code=getDataSourceInfo().sec_code
    class_code=getDataSourceInfo().class_code
  end
  if CandleExist(i) and lines[i]==nil then
    -- тут мои вычисления
    lines[i]={}
    lines[i]["S"]=sell
    lines[i]["B"]=buy
  end
  return lines[i]["S"],lines[i]["B"]
end
В результате индикатор рассчитывается для каждой свечи только один раз, и полностью пересчитывается при смене инструмента или интервала
Тестирование стратегий, Возможность тестирования
 
Примите еще одно пожелание по тестированию стратегий.
Сам тестер стратегий у меня давно написан, но остался вопрос в исторических данных для него.

Так вот хотелось бы иметь возможность работать и историческими данными инструментов утративших актуальность.
Поясню.
Работаю с фьючерсами, на данный момент актуален SiU1.
А мне хочется протестировать мою стратегию на более старых инструментах, например SiH1 и SiM1
Как я понимаю исторические данные по инструментам лежат в терминале в папке archive.
У меня например имеются файлы SPBFUT_SiH1_60.dat и SPBFUT_SiM1_60.dat ну и некоторые другие

На данный момент, если я пытаюсь обратиться через CreateDataSource к SiH1, то получаю ошибку "SiH1 - unknown sec code."
Так вот хотелось бы иметь возможность обращаться из скрипта к вышедшим из оборота инструментам.
Все данные то имеются у меня имеются.

Решение вижу в добавлении необязательного параметра в функцию CreateDataSource,
при установке которого данные будут напрямую браться из архивного файла с историческими данными игнорируя запрос инструмента у сервера и не проверяя его актуальность.
Страницы: 1 2 3 4 5 След.
Наверх