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

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

Страницы: 1 2 3 4 5 6 7 8 След.
Кракозябры на Windows Server 2022
 
Отлично, всё заработало, спасибо!
Кракозябры на Windows Server 2022
 
Добрый день!
Скачал с сайта Открытие дистрибутив по этой ссылке
https://s3.open-broker.ru/dists/mdX4xRKtErUpAL042cEm9jhbioQ6VOs5xUJaYAxY/open_broke­r_quik_wk.exe

Пытаюсь установить на виртуальную машину от RuVDS
Операционная система Windows Server 2022, IP - Швейцария

На всех этапах установки и использования кириллица превратилась в кракозябры
см скриншот

https://disk.yandex.ru/i/HvkFnDtPCGEQpQ

Ранее КВИК стоял на виртуалке другого сервиса - UltraVDS, там такой проблемы не было. Это был Windows Server 2016, IP - Москва.

Где это настраивается?
Спасибо
Получить значение линии на графике
 
Я нарисовал линии на графике. Можно ли получить с помощью Луа их значения?


Например, значение линии на такую-то дату и время было 108500?
Индикатор RSI из INDICATORS.ZIP вылетает с ошибкой
 
Индикатор RSI из INDICATORS.ZIP вылетает с ошибкой


эта строка выглядит так
Код
local val_Up = RSI_MA_U(it.l, {Period=P, Metod = M, VType=ANY}, {[it.l] = Up})

Вот код индикатора, уж не знаю какая это редакция, может не свежая.
https://disk.yandex.ru/d/jW-6QI-KglPbjw

Вызывается следующим блоком:
Код
func = RSI() ; 
local rsi_count={}                     
nk=ds[real]:Size()

for i=1,nk do rsi_count[i]=func(i, {Period=rsi_period, VType="Typical"}, ds[real]) end
   
 if rsi_count[nk]~=nil then      
  rsi0=rsi_count[nk]
  rsi1=rsi_count[nk-1]
  rsi2=rsi_count[nk-2]
  rsi3=rsi_count[nk-3]
  rsi4=rsi_count[nk-4]
  max_rsi=math.max(rsi0,rsi1,rsi2,rsi3,rsi4)
  in_rsi=math.min(rsi0,rsi1,rsi2,rsi3,rsi4)
 else
  mm (real.." "..nk.." rsi_count[num_candles]=nil") ; sleep (100)
 end

Подскажите пожалуйста, в чём может быть дело.
Все индикаторы на Lua
 
P.S. скрипт работает и всё считает нормально, но в какой-то момент вылетает с этой ошибкой.
Все индикаторы на Lua
 
Индикатор RSI вылетает с ошибкой


эта строка выглядит так
Код
local val_Up = RSI_MA_U(it.l, {Period=P, Metod = M, VType=ANY}, {[it.l] = Up})

Вот код индикатора, уж не знаю какая это редакция, может не свежая.
https://disk.yandex.ru/d/jW-6QI-KglPbjw

Вызывается следующим блоком:
Код
func = RSI() ; 
local rsi_count={}                     
nk=ds[real]:Size()

for i=1,nk do rsi_count[i]=func(i, {Period=rsi_period, VType="Typical"}, ds[real]) end
   
 if rsi_count[nk]~=nil then      
  rsi0=rsi_count[nk]
  rsi1=rsi_count[nk-1]
  rsi2=rsi_count[nk-2]
  rsi3=rsi_count[nk-3]
  rsi4=rsi_count[nk-4]
  max_rsi=math.max(rsi0,rsi1,rsi2,rsi3,rsi4)
  in_rsi=math.min(rsi0,rsi1,rsi2,rsi3,rsi4)
 else
  mm (real.." "..nk.." rsi_count[num_candles]=nil") ; sleep (100)
 end

Подскажите пожалуйста, в чём может быть дело.
Ошибка без указания строки в коде
 
Цитата
Игорь Б написал:
Попробуйте обернуть в status_main, msg_main = pcall(function() end).
Второй параметр дасть номер строки с ошибкой.
Ого, спасибо! Дельный совет.
Ошибка без указания строки в коде
 
Код большой - 700 строчек. Я не знаю какую часть вам показать, не весь же.
Ошибка без указания строки в коде
 
Цитата
s_mike@rambler.ru написал:
У вас, наверное, код скомпилирован с удалением отладочной информации?
обычный код
я ничего необычного с ним не делал
Ошибка без указания строки в коде
 
Добрый день
Скрипт выдаёт ошибку без указания строки в коде. Как понять, где эта ошибка произошла?
Индикаторы для QUIK старше 8.3.2.4
 
Добрый день.
Давно пользуюсь этой библиотекой. Спустя два года запустил старый скрипт. Цель - получить последнюю свечу на графике.

В таком виде перестало работать.
Код
func1 = MA()
local num_candles=ds[instr]:Size()
last=func1(num_candles, {Period=mov_period, Metod = "SMA", VType="Typical"}, ds[instr])
А в таком почему-то работает. Главное отличие второго варианта: в нём рассчитываются все значения мувинга слева направо и потом берётся нужный. А в первом варианте я сразу обращался к нужной мне свече.
Код
func1 = MA()
local ma_count={}
local num_candles=ds[instr]:Size()
for i=1, num_candles do
    ma_count[i]=func1(i, {Period=mov_period, Metod = "SMA", VType="Typical"}, ds[instr])
end

last = ma_count[#ma_count]
Что происходит утром?
 
BlaZed, перечитайте мои два сообщения ещё раз.
Egor Zaytsev ответил на мой вопрос, хотя я почему-то и правда был уверен, что main каждое утро в обязательно порядке САМ перезапускается. А в его начале у меня стоит функция чтения файла, который лежит на ноутбуке.  
Что происходит утром?
 
Цитата
BlaZed написал:
Цитата
Уточните пожалуйста что происходит утром в плане:
-работы main
-существования переменных и таблиц скрипта.
Что запрограммировано, то и происходит.
Ничем принципиальным утро от другого времени не отличается.

Не видя кода только можно гадать, что у вас там запрограммировано.

Смотрите почему у вас main повторно запускается, и как скрипт обрабатывает потерю связи, короче код смотрите.
Вы не в курсе дела. Или я не в курсе дела, что что-то изменилось. Каждое утро main перезапускается при смене сессии.
Что происходит утром?
 
Уточню
Я запустил скрипт, скрипт считал данные. Я надеюсь, что они лежат в памяти "вечно".
Но по утрам всё обнуляется из-за повторного запуска main?
КВИК на виртуалке не имеет постоянного доступа к ноутбуку. Я вышел с виртуалки, и связь с ноутбуком пропала. Но я рассчитываю, что считанные данные останутся в памяти.
Что происходит утром?
 
Квик стоит на виртуалке. Скрипт лежит на моём ноутбуке. Скрипт читает файлик с сигналами, который тоже лежит на ноутбуке.
Вид файла с сигналами:
01.02.2021 at 11:00 open_long SBER

Эта строка парсится и записывается в Луа-таблицу. Я надеюсь, что она вечно хранится в памяти. Но выходит что нет?
Каждое утро Квик по новой запускает main и обнуляет все переменные?
Уточните пожалуйста что происходит утром в плане:
-работы main
-существования переменных и таблиц скрипта.
Робот читает интернет-страницу
 
Этот код уже очень давно не работает, потому что на смарт-лабе изменился интерфейс этой страницы. Она теперь совсем другая и не подходит под этот код.
Не является приложением Win32
 
Цитата
Игорь написал:
Для х64 можно эти использовать  https://github.com/finsight/QUIKSharp/tree/master/src/QuikSharp/lua
не понятно как это мне поможет
Не является приложением Win32
 
Начал запускать свой старый скрипт. Он был 100% рабочим. Теперь на версии КВИКа 8.8.4.3 вылазит ошибка:

смысл понятен - мне надо 32 битную, а тут 62. Но как с этим бороться, - не понимаю.
Скрипт пытается сделать
Код
require"socket"
а потом
Код
local RANDOM_SEED=socket.gettime()*10000

Установлена библиотека LuaForWindows и сама Луа.
Плановые чистые позиции
 
Как рассчитывается поле "Плановые чистые позиции"?
Учитывает ли оно вар.маржу и накопленный доход?
Перестала работать getQuoteLevel2
 
внезапно заработало само
Перестала работать getQuoteLevel2
 
Да
Код
Subscribe_Level_II_Quotes("SPBFUT", inst)

и потом
Код
sleep (500)
Перестала работать getQuoteLevel2
 
После обновления квика до 8.6.0.97 перестала работать функция
getQuoteLevel2
строка
Код
qt = getQuoteLevel2 ('SPBFUT','SRU0')

на вечерней сессии возвращает


С другим запросом
Код
qt = getQuoteLevel2 ('TQBR','GAZP')

та же картина.
Сейчас идёт вечорка, про другие сессии не знаю пока.
getCandlesByIndex - разница в свечах
 
Почему такая разница в выводимых значениях:
Код
--save IMOEX quotes
t,n,_ = getCandlesByIndex("IMOEX",0,0,getNumCandles ('IMOEX'))
mm (#t) =>3008
mm (getNumCandles ('IMOEX')) =>3009
mm (n) =>3009
Большие иконки
 
Я удалил все .dat файлы. В итоге сильно изменился внешний вид иконок. Они стали очень большими.
Как регулировать их размер?
Версия квика 8.3.2.4
Обращение к элементу большой таблицы
 
У меня огромная таблица big_base с миллионом свечей.
в течение итерации происходит обращение к отдельным её элементам:
Код
перебор candle, начало итерации:
big_base[candle][1]
потом снова
big_base[candle][1]
потом
big_base[candle][2]
является ли это обращение долгим?
Возможно, лучше написать:
Код
перебор candle, начало итерации:
current_candle = big_base[candle]
а потом писать
current_candle[1]
current_candle[1]
current_candle[2]
Ускорит ли это работу скрипта, или Луа настолько хорош, что обращение к индексу многомиллионной таблицы идёт быстро?
Получить путь к python.exe
 
Спасибо, Антон.
Код
os.execute("python.exe C:\\script.py")
работает и без указания полного пути к Питону. Я не знал, что так можно!
Это решает мою проблему, я задал этот вопрос, так как думал, что нужен полный путь к python.exe
Получить путь к python.exe
 
Цитата
Anton написал:
Кстати говоря, переменная называется PYTHONPATH без андерскора, может в этом дело?
Антон, спасибо за вашу помощь, вот дополнительная информация
Строчка
Код
message (os.getenv('PATH'),1)
выдаёт


То есть среди этих путей есть нужный!
Но строка
Код
message (os.getenv('PYTHONPATH') or 'type_nil',1)

по прежнему выдаёт нил.
Получить путь к python.exe
 
Цитата
Anton написал:
Сразу в пути использовать переменную? Типа
Код
   os.execute ( "%WINDIR%\\notepad.exe" )
  
Надо чтобы работало у любого желающего, кто захочет это запустить. Не только у меня. Надо универсальный метод.
Получить путь к python.exe
 
Пытаюсь получить путь к файлу python.exe
Строка на Луа
Код
os.getenv("PYTHON_PATH") 
выдаёт nil
Питон свежей версии установлен в необычную папку: C:\InstallPython\python.exe
Подскажите, как средствами Луа получить путь к python.exe
не является приложением Win32
 
Я в этом плохо соображаю. Надо просто перекомпилировать в Visual Studio?
не является приложением Win32
 
Робот на Луа использует dll на С++
В версии КВИКа 7 всё работает как надо, в версии квика 8 выдаёт ошибку:

error loading module 'socket.core' from file 'C:\Program Files (x86)\Lua\5.1\clibs\socket\core.dll': не является приложением Win32.

Как с этим бороться?
Заполнение пропусков на графике
 
Но мне нужен именно мелкий таймфрейм. Эти искажения влияют на работу луа-индикатора.
Я сразу понял, что брокер не прав, говоря, что это проблема у меня в КВИКе.
Значит, это они транслируют эти уродливые графики.
Как это исправить?
Заполнение пропусков на графике
 
Да код класса FEN. Это касается всех инструментов из него.
Как видно на графике, эта проблема была всегда, а не только после указанной вам даты.
Я уже неоднократно перезаказывал архив графиков, чистил .dat файлы, в которых они хранятся. Эти пустые свечки не пропадают с графика. Брокер ведёт себя так, словно это проблема у меня на КВИКе, но мой знакомый заходил под моей учёткой в новый скачанный квик на другом конце земного шара, и это проблема выглядела так же. Это брокер транслирует в КВИК эту ерунду, но почему-то ведёт себя странно и не признаёт этого.
Заполнение пропусков на графике
 
Добрый день.
Подписан у брокера Открытие на трансляцию мировых рынков.
График по иностранным инструментам выглядит так:

Искусственно заполняются неторговые часы.
Брокер говорит, что эта проблема есть только у меня. По просьбе брокера я удалил все .dat файлы отовсюду, даже на всякий случай удалил info.wnd.
Проблема осталась. Более того, она также воспроизводится на других экземплярах КВИКА. А у брокера (со слов менеджера) её нет. Верится с трудом.
Теперь брокер просит выслать им архив КВИКа. Я не против, но прошу всё же ответа от компетентного специалиста-разработчика.
Для сравнения, то же самое на других акциях - NVIDIA (ранее я их НЕ скачивал, этот график прилетел ко мне в терминал впервые)
Вопрос про OnAllTrade
 
А как это лучше сделать? Ведь при первом запуске скрипта в, скажем 13 часов, КВИК сначала загружает историю сегодняшних сделок, и они выглядят как свежие, хотя они старые
Вопрос про OnAllTrade
 
Я подписываюсь на новые сделки через INTERVAL_TICK и обрабатываю их в OnAllTrade
Хочу анализировать только новые сделки. Старые сделки, уже прошедшие за сегодня, обрабатывать не хочу.
Есть ли риски, что в OnAllTrade прилетит старая сделка из сегодняшних?
Ну например при первом старте КВИКа в 13 часов в КВИК начнут сыпаться ранее прошедшие сделки. Они мне не нужны. И только потом начнут поступать новые.  
Имитировать continue
 
В последующих версиях Lua есть функция continue, но КВИК работает на древней версии Луа, где такой опции нет.
можно ли как то силами Lua написать свою функцию continue и легко вставлять её в нужные куски кода, например:
Код
function continue ()
--бла-бла-бла

end

for i=1, 10 do

   if i==5 then continue() end
--бла-бла

end
Отправка транзакций из OnParam
 
Вот рабочий вариант, внедрённый в робота. Увы, приходится объявлять переменную paper как глобальную, потому что sec внутри fn не видна.
Код
function fn(t)

    if stop_search then return nil end --stop_search - это флаг. Изначально равен nil

    if t.sec_code == paper and t.client_code==client_code and t.limit_kind==2 then
      stop_search=true      
        return true
    else
        return false
    end

end

function get_position (sec)
   paper=sec
   stop_search=nil --убиваем флаг, выставленный на прежних запусках функции.
   tbl_indxs=SearchItems('depo_limits', 0, getNumberOf("depo_limits")-1, fn)   
   if tbl_indxs then
      limit = getItem("depo_limits", tbl_indxs[1]) --найден 1 индекс, его и берём.
      local lot=lot[sec]--lot[sec] ранее определена
      return limit.currentbal/lot,limit.locked_buy/lot, limit.locked_sell/lot, limit.awg_position_price
   else
      return 0,0,0,0
   end
end
Отправка транзакций из OnParam
 
Nikolay Pavlov,
посмотрите пожалуйста, это оно?
Код
function fn(t)
   if stop_search then return nil end --stop_search - это флаг. Изначально равен nil
    if t.sec_code == sec and t.client_code==client_code and t.limit_kind==2 then
      stop_search=true
        return true
    else
        return false
    end
end


function get_position (sec)
   stop_search=nil --убиваем флаг, выставленный на прежних запусках функции.
   tbl_indxs=SearchItems('depo_limits', 0, getNumberOf("depo_limits")-1, fn)
   limit = getItem("depo_limits", tbl_indxs[1]) --найден 1 индекс, его и берём.
   local lot=lot[sec]--lot[sec] ранее определена
   return limit.currentbal/lot,limit.locked_buy/lot, limit.locked_sell/lot, limit.awg_position_price
end
Отправка транзакций из OnParam
 
Nikolay Pavlov,
спрошу про другой случай.
Я знаю, что в нужной мне таблице только один элемент с нужным параметром. Например, я ищу в depo_limits текущий остаток по SBER. Как мне в SearchItems оборвать поиск сразу после того как SBER был найден?

Я делаю что-то в таком духе:
Код
function fn(t)
    if t.sec_code == sec and t.client_code==client_code and t.limit_kind==2 then 
        return true
    else
        return false
    end
end

tbl_indxs=SearchItems('depo_limits', 0, getNumberOf("depo_limits")-1, fn)

и второй вопрос, как мне в функцию fn передать переменную sec?
Отправка транзакций из OnParam
 
Nikolay Pavlov,
спасибо за совет!
вопрос по SearchItems. Никогда с ней не работал.

Хочу получить мои сделки за сегодня по BANEP
Код
function fn (t)
   if t.sec_code=='BANEP' then
      return true
   end
end

tbl=SearchItems('trades', 0, getNumberOf("trades")-1, fn, "qty,class_code, sec_code")
в результате таблица tbl выглядит так:
Цитата
1=0;2=1;3=2;4=3;5=4;6=5;7=6;8=7;9=8;10=9;11=10;12=11;13=12;14=13;15=14;16=15;17=16;18=17;19=18;20=19;21=20;22=21;23=22;24=23;25=24;26=25;27=26;28=27;29=28;30=29;31=30;32=31;33=32;34=33;35=34;36=35;37=36;38=37;39=38;40=39;41=40;42=41;43=42;44=43;45=44;46=45;47=46;48=47;49=48;50=49;51=50;52=51;53=52;54=53;55=54;56=55;57=56;58=57;59=58;60=59;61=60;62=61;63=62;64=63;65=64;66=65;67=66;68=67;69=68;70=69;71=70;72=71;73=72;74=73;75=74;76=75;77=76;78=77;79=78;80=79;81=80;82=81;83=82;84=83;85=84;86=85;87=86;88=87;89=88;90=89;
у меня за день и правда 90 сделок, но не понятно в чём толк этой функции?
----------------

Если написать чуть-чуть иначе:
Код
function fn (t)
   if t.sec_code=='BANEP' then
      return t
   end
end

tbl=SearchItems('trades', 0, getNumberOf("trades")-1, fn)

то он пишет такое:
Цитата
1=18;2=20;3=21;
19,21,22 - это номера моих сделок с Башнефтью. С учётом сдвига всё верно. Но как получить все поля по этим сделкам?
Отправка транзакций из OnParam
 
Nikolay Pavlov,
переменная ticker_list из моего примера:
Код
1=SBER;2=GAZP;3=GMKN;4=LKOH;................
Ключ - число, значение - тикер.
Ваш совет:
Код
function tableContains(table, key)    
return table[key] ~= nil
end
не подойдёт в чистом виде.
Разве что переделать тикер лист в
Код
'SBER'=1; 'GAZP' = 2; 'GMKN' = 3;
тогда ваша функция сработает. Но и в этом случае она где-то там невидимо для меня будет перебирать всю таблицу в поисках ключа.
Спасибо за помощь!
Отправка транзакций из OnParam
 
Nikolay Pavlov,
посмотрел описание функции SearchItems. Почему вы её рекламируете по сравнению с
Код
for i=0,getNumberOf("orders")-1,1 do
В ней тоже задаётся список строчек  с какой по какую искать. Если у меня за день 10 000 заявок, скрипт будет пробегать по всем. Разве не так?
Отправка транзакций из OnParam
 
функция для снятия всех заявок.
в неё передаётся таблица с тикерами.
Код
function CleanActive (ticker_list) --переписать её, чтобы искать с конца.
   local row={}
   for i=0,getNumberOf("orders")-1,1 do
      row=getItem("orders",i)   
      local sec=row.sec_code
      if table_contains(ticker_list, sec) and orderflags2table(row.flags).active then
         res,ms=killOrder(tostring(row.order_num),sec,row.class_code)
      end
   end
end
Код
function table_contains(table, element)   
   for _, value in pairs(table) do
      if value == element then return true end
   end
   return nil
end   
Я запускаю CleanActive из OnStop и из самого начала функции main. Это очень часто вешает квик, приходится его убивать через окно с процессами.
Отправка транзакций из OnParam
 
Заметил, что отправка транзакций - выставление и снятие заявок - трудоёмкая операция.
Торгую 50-ю акциями. Если у меня висит 50 заявок, то при их массовом одновременном снятии квик подвисает на несколько секунд. При быстром выставлении такого же числа заявок он тоже зависает.
Поэтому вопросы.
1. Наблюдения верны? Отправка транзакций - ресурсоёмкая процедура?
2. Хочу отправлять транзакции из OnParam. Это плохая идея? С точки зрения логики работы программы это было бы очень удобно. Сейчас у меня отправка заявок идёт в функции main, там в бесконечном цикле перебираются одна за другой 50 акций на соблюдение условия выставления/снятия. Хочу перенести этот блок в OnParam.
Заявок ставится много, они всё время перевыставляются. В день отправляется до 10 тысяч заявок, то есть с учётом снятия это 20 000 транзакций.  
Критерий исполнения заявки OnTrade
 
Вопрос, связанные с троекратным приходом сделки.
Если у меня заключается много сделок, в том числе почти одновременно, возможно ли, что три колбека перемежаются колбеками от соседних сделок.
Ну например прилетает первый колбек по Сберу, потом один по Газпрому, а потом долетают ещё по два колбека от Газпрома и Сбера?
Или они приходят строго очередями? Сначала три по одной бумаге, потом три по другой?
---
Ну и раз вам эта проблема знакома, то какой лучший способ с нею бороться?
Критерий исполнения заявки OnTrade
 
И ещё вопрос. Можно ли факт заключения сделки отслеживать через OnTransReply или он только для отправки ордеров?
Критерий исполнения заявки OnTrade
 
Мне мерещится, или колбек OnTrade срабатывает три раза на каждую сделку?
Один за другим приходят три отчёта о совершении одной сделки.
Выставить кодировку
 
Пишу код в Notepad++
Стоит эта кодировка:


Строка
Код
send_msg ("Снята: "..k)
, где k - тикер, в  квике выглядит так:


Как с этим бороться?
Локальность переменной
 
Я не знаю быстрый или не быстрый. Просто читал что локальные переменные работают быстро.
Ваше сообщение означает, что скорости не прибавится?
Страницы: 1 2 3 4 5 6 7 8 След.
Наверх