s_mike@rambler.ru (Автор тем)

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

Страницы: 1 2 След.
Метки
 
В документации на Квик написано, что если указать метке цену и время, то там она и выставиться.

щас!

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

в лучшем случае метка показывается не там где надо, в худшем не показывается вообще. Зависит от смешения локального времени от Москвы.



дедушку лечить бессмысленно. Дедушку дохлый, ему на кладбище. Да и доктора, судя по чехарде фамилий, временные гастарбайтеры.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
bshl / bshr metamethods
 
> t=setmetatable({},{ __div = function(x,y) print(x,y) end})
> print (t/2)
table: 0000000000620d10 2
nil

Это работает
А это не работает. что в 5.3 что в 5.4

> t=setmetatable({},{ __bshl = function(x,y) print(x,y) end})
> print (t<<2)
stdin:1: attempt to perform bitwise operation on a table value (global 't')
stack traceback:
       stdin:1: in main chunk
       [C]: in ?
> print (t>>2)
stdin:1: attempt to perform bitwise operation on a table value (global 't')
stack traceback:
       stdin:1: in main chunk
       [C]: in ?

метод __bshl не видится почему то
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
Lua 5.4
 
Все таки есть проблемы в славном королевстве.

Есть библиотека для 5.3. Работает на ура. И в квике и в standalone

Пересобрал ее на 5.4. Работают все три десятка ее функций (и в квике и в standalone) без каких либо проблем, кроме одной. Она работает в standalone, но напрочь отказывется работать в квике.

Выкинул из нее все лишнее, оставил минимум для теста

Код
static int xx_test(lua_State *L)
{

   const char* buffer = luaL_checkstring(L, 1);

   if (luaL_loadbuffer(L, buffer, strlen(buffer), "test") == LUA_OK)
      MessageBox(0, "loadbuffer ok", "", MB_OK);
   else
   {
      MessageBox(0, "loadbuffer error", "", MB_OK);
   }
   
   if (lua_pcall(L, 0, 0, 0) == LUA_OK)
   {
      MessageBox(0, "pcall ok", "", MB_OK);
      lua_pushnil(L);
   }
   else
   {
      MessageBox(0, "pcall error", "", MB_OK);
   }



   return 1;
}
вызов из луа:
message("result=" .. tostring(xx.test("message('hello world!!',3)")))

И если в standalone мы получаем два сообщения OK, hello world и nil в качестве возврата, то в квике мы сразу получаем loadbuffer error и дальше, конечно мусор.


Может, кто то пальцем сможет указать направление в пустыне?
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
Вопрос по луа 5.4
 
решил пересобрать  библиотеку с 5.3 на 5.4
Уткнулся в проблему

Функция в dll:

static int b4s_xxx(lua_State *L)
{
const char *buffer = "message(\"hello world\")";
int result = luaL_dostring(L, buffer, strlen(buffer));

lua_pushnil(L);
return 1;
}

Вызываем из standalone lua

require "testlib"
message = print
testlib.xxx()

Выводит hello world

Вызываем из квика

require "testlib"
testlib.xxx()

ничего не выводит.


Теряюсь в догадках. Кто может подсказать?  на 5.3 проблем не наблюдалось
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
Классы
 
Еще одна блоха на теле в лучшего в мире ПО

Находим свой аккаунт в таблице trade_accounts
смотрим поле class_codes
Пробуем найти ВСЕ перечисленные классы в таблице classes

Удивляемся, что некоторых классов из class_codes нет в таблице classes

Удивляемся, удивляемся..
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
Labels
 
Скрипт на луа, выставляющий 2 метки на один график


res = AddLabel("ri",
{ --IMAGE_PATH = "E:\\GoogleDisk\\ROBOT\\__TEST\\2-0.bmp",
IMAGE_PATH = "E:\\GoogleDisk\\ROBOT\\__TEST\\2-0a.bmp",
TEXT = "",
DATE     = 20220105,
TIME = 150000,
YVALUE = 151550,
ALIGNMENT = "LEFT"
})
res1 = AddLabel("ri",
{ IMAGE_PATH = "E:\\GoogleDisk\\ROBOT\\__TEST\\2-0.bmp",
--IMAGE_PATH = "E:\\GoogleDisk\\ROBOT\\__TEST\\2-0a.bmp",
TEXT = "",
DATE     = 20220105,
TIME = 150000,
YVALUE = 151650,
ALIGNMENT = "LEFT"
})
message(tostring(res).. " " .. tostring(res1))

Как видим, отличие лишь в бмп файле (yvalue изменены, чтобы видеть метки не друг на друге)

в результате выставляется всегда только вторая метка, при первая не выставляется. Терминал при исполнении этого скрипта выдает сообщение в окно сообщений: Произошла ошибка при загрузке файла чивотатам\2-0.bmp

скрипт выдает message вида 23465.0 nil

Из чего можно сделать вывод, что файл 2-0.bmp битый, а файл 2-0a.bmp нормальный.

ok. Но раньше то все было нормально!

Запускали мы сейчас  скрипт на версии 9. Запустим его на версии 8.

Упс, обе метки выставляются.


А что у нас внутри bmp?



42 4В 22 00 00 00 00 00   |   00 00 1A 00 00 00 0С 00
00 00 02 00 01 00 01 00    |  18 00 32 FF 32 32 FF 32
00 00

Смотрим в этот бмп с помощью irfanview или чем нибудь еще - нет проблем.

size 2*1 pixels
colors 16.7 million
unique colors 1
Disk size 34
compression None, OS/2
point size from DPi 0.1 * 0.0 sm   0.03 * 0.01 inches


Если надо подержать в руках обе бмпшки : https://dropmefiles.com/VH3Ks

Что изменилось в терминале?
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
getcandlebyindex и сдвиг графика
 
Вопрос

Как отличить пустую свечу графика, получаемого по getcandlebyindex  от правых фантомных свечей в случае, если график сдвинут вправо от источника его данных?

Спасибо
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
Очередное, @#$!
 
Settings={}
Settings.Name = "minimal"
getInfoParam("VERSION")
function Init()
return 1
end
function OnCalculate(index)
return 1
end

[3676] QLUA E:\Quik-Junior\LuaIndicators\1.lua:3: attempt to call a nil value (global 'getInfoParam')
Куда дели функцию getInfoParam, жители крайнего Севера?
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
8.13 vs 9.1
 
function main()

message(tostring(
AddLabel("gazp",
{HINT="zzzzz",
TEXT="тттт",
TRANSPARENCY=0,
DATE=20210730,
IMAGE_PATH="E:\\GoogleDisk\\ROBOT\\add.bmp",
TIME=170000,
YVALUE=285,
ALIGNMENT="RIGHT"}
)))
end

Вот такой чудесный скрипт, выставляющий метку.

В 8.13 боевой выставляет картинку на диаграмму, а в 9.1 демо - нет. Оба терминала на одной машине, запущены одновременно, идентификаторы идентичны, проверено, скопировано через буфер обмена.

Как такое может быть? Отчего это может зависеть? Индусов в программисты наняли?
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
Нехватка видеопамяти
 
Ув. разработчики!

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

Свободной видеопамяти еще много гигабайт. Скрипт просто переставляет метки посредством SetLabel. Написать тест из 10 строчек кода вы должны суметь сами.



Почему вываливается если видеопамяти полно? Почему расходуется видеопамять при использовании SetLabel?
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
Метки
 
Уважаемые разработчики!

Я уже много раз вам указывал на эту ошибку (и не только я). Много раз она "будет исправлена в очередной версии ПО"

function main()
message(tostring(
AddLabel("gazp",
{HINT="zzzzz",TEXT="",TRANSPARENCY=0,DATE=20210730,IMAGE_PATH="нет такого файла",TIME=40500,YVALUE=284.51,ALIGNMENT="RIGHT"}
)))
end

Эта функция возвращает успех, номер метки. А не должна. Ошибка тянется с 2013 года, но компания Арка не чешется абсолютно.

Отдельный привет Алексею Иванникову. У вас полно ошибок, которые вы не исправляете годами или не в состоянии исправить.. Открывайте ваши регистрации или куда вы все это пишете, ищите. Можете поискать по форуму.


Пообещайте еще раз, что ли....
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
2048 game
 
Каждая уважающая себя среда должна иметь кроме прочего, исполняемую в ней игрушку. Я таких для терминала quik не встречал.

Одно время была очень популярна игра 2048б мне заказывали ее написать для какого-то сайта. Вот ее вариант для quik, нарисовал под пиво:
Код
local stopped

game = {
   cell = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
   best = 0,
--   key = nil,
-- t = nil,
   colors =   {   [0]   = QTABLE_DEFAULT_COLOR,
               [2]   = RGB(248,248,255),
               [4]   = RGB(255,239,213),
               [8]   = RGB(255,222,173),
               [8]   = RGB(255,218,185),
               [16]   = RGB(205,92,92),
               [32]   = RGB(255,69,0),
               [64]   = RGB(238,238,0),
               [128]   = RGB(238,118,33),
               [256]   = RGB(255,160,122),
               [512]   = RGB(255,0,0),
               [1028]= RGB(238,18,137),
               [2048]= RGB(139,0,0)
            },
   
   create_table =
      function(self)
         self.t = AllocTable()
         for i = 1,4 do
            AddColumn(self.t, i, "", true, QTABLE_INT_TYPE, 10)
         end
         CreateWindow(self.t)
         SetWindowPos(self.t,100,100,300,130)
         for i = 1,4 do
            InsertRow(self.t,i)
         end
         SetTableNotificationCallback(self.t,       
                                      function(_t, msg, _p, key)
                                       if msg == QTABLE_VKEY then
                                          self.key = key
                                       elseif msg == QTABLE_CLOSE then
                                          stopped = true
                                       end
                                      end)
         SetWindowCaption(self.t, "2048 game by www.bot4sale.ru")
      end,
   
   draw = 
      function(self)
         local cell = self.cell
         for row=1,4 do
            for column=1,4 do
               local value = cell[(row-1)*4 + column]
               SetCell(self.t,row,column,value==0 and "" or tostring(value))
               SetColor(self.t,row,column,game.colors[value],0,game.colors[value],0)
            end
         end
     end,
  
   incr = 
      function(self)
         local t,open = self.cell,{}
         for i=1,16 do 
            if t[i]==0 then 
               open[#open+1]=i 
            end
         end
         t[open[math.random(#open)]] = math.random()<0.1 and 4 or 2
      end,
  
   pack = 
      function(self,ofr,oto,ost,ifr,ito,ist)
         local t = self.cell
         for outer=ofr,oto,ost do
            local skip = 0
            for inner=ifr,ito,ist do
               local i = outer+inner
               if t[i]==0 then 
                  skip=skip+1 
               else 
                  if skip>0 then 
                     t[i-skip*ist],t[i],self.diff = t[i],0,true 
                  end 
               end
            end
         end
      end,
  
   comb = 
      function(self,ofr,oto,ost,ifr,ito,ist)
         local t = self.cell
         for outer=ofr,oto,ost do
            for inner=ifr,ito-ist,ist do
               local i,j = outer+inner,outer+inner+ist
               if t[i]>0 and t[i]==t[j] then 
                  t[i],t[j],self.diff,self.best = t[i]*2,0,true,math.max(self.best,t[i]*2) 
               end
            end
         end
      end,
  
   move = 
      function(self,dir)
         local loopdata =   {   {0,12,4,1,4,1},
                              {0,12,4,4,1,-1},
                              {1,4,1,0,12,4},
                              {1,4,1,12,0,-4}
                           }
         local ofr,oto,ost,ifr,ito,ist = table.unpack(loopdata[dir])
         self:pack(ofr,oto,ost,ifr,ito,ist)
         self:comb(ofr,oto,ost,ifr,ito,ist)
         self:pack(ofr,oto,ost,ifr,ito,ist)
      end,
  
   full = 
      function(self)
         local t = self.cell
         for r=0,12,4 do
            for c=1,4 do
               local i,v = r+c,t[r+c]
               if (v==0) or (c>1 and t[i-1]==v) or (c<4 and t[i+1]==v) or (r>0 and t[i-4]==v) or (r<12 and t[i+4]==v) then
                  return false
               end
            end
         end
      return true
   end,
  
   play = 
      function(self)
         math.randomseed(os.time())
         self:incr()
         self:incr()
         while not stopped do
            self:draw()
            if self.best == 2048 then 
               message("Поздравляю!\n\nwww.bot4sale.ru") 
               break 
            end
            if self:full() then 
               message("Game Over!")
               break 
            end
            
            self.diff = false
            if       self.key==0x25 then       -- Left
               self:move(1)
            elseif self.key==0x27 then         -- Right
               self:move(2)
            elseif self.key==0x26 then       -- Up
               self:move(3)
            elseif self.key==0x28 then         -- Down
               self:move(4)
            end
            self.key = nil
            if self.diff then 
               self:incr() 
            end
            sleep(100)
         end
      end,
      
   rules = 
      function()
         message("Правила игры:\n\nВ каждом раунде появляется плитка номинала «2» или «4». Нажатием стрелки игрок может скинуть все плитки игрового поля в одну из 4 сторон. Если при сбрасывании две плитки одного номинала «налетают» одна на другую, то они превращаются в одну, номинал которой равен сумме соединившихся плиток. После каждого хода на свободной секции поля появляется новая плитка номиналом «2» или «4». Если при нажатии кнопки местоположение плиток или их номинал не изменится, то ход не совершается. Если в одной строчке или в одном столбце находится более двух плиток одного номинала, то при сбрасывании они начинают соединяться с той стороны, в которую были направлены.\nЛевый столбец с номерами строк участия в игре не принимает.\n\ns_mike@rambler.ru")
      end
}
local game = game

--------------------------------------------------

function main()
   game:create_table()
   game:rules()
   game:play()
end
Также можно взять здесь

Не имею возражений, если разработчики включат игрушку в список своих демонстрационных скриптов ))))
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
_dataline_data_metatablegc
 
Добрый день

Что за тип данных такой

_dataline_data_metatablegc

у меня не получилось осознать и не смог найти в спецификации lua
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
URL in message function
 
message("www.bot4sale.ru")

В сообщении на экране www.bot4sale.ru будет оформлена как ссылка, тут все в порядке. Но при нажатии на эту ссылку открывается проводник, а не браузер. Думаю, что и с другими типами (call-to и прочими будет то же самое)

По умолчанию приложением для открытия URL назначен Хром.

Поправьте.  
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
get candle
 
Здравствуйте

возможна ли ситуация с получением данных графика, когда свеча уже имеется (учтена в  getnumcandles), но ее значение не заполнено и по getCandlesByIndex возвращаются ohlcv 0?

возникает при очень частом опросе графика, последующий запрос выдает то же количество свечей, но ohlcv уже реальные
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
Роботы всякие и прочие глупости
 
Уважаемые разработчики.


добавляя в терминал язык луа, вы наверняка подразумевали , что на нем будут писаться разные роботы и прочая торгующая ерунда.

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

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

варианты:

1. Терминал давно запущен до запуска робота
2. Терминал и робот запущены одновременно , необходимые данные в терминале доступны
3. Терминал и робот запущены одновременно , необходимые данные в терминале пока недоступны
4. Смена сессии , нужные шлюзы доступны/недоступны, когда нибудь подключатся
5. У косого брокера на букву Ф опять понос и посреди дня он медленно и печально начал перезагружать всю историю с 1812 года
6. Инструмент неликвидный, много пропущенных свечей, в том числе последних

и так далее..

в общих словах вопрос.

как робот может понять, что данные, ему даёт терминал, являются более-менее актуальными, а не прошлогодними и можно торговать? Пожалуйста, приведите какую нибудь осмысленную последовательность проверок.

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

вы же пробовали сами что то писать на луа, верно?)
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
Debug function name
 
В версии 8.8 наблюдаю странную вещь.

в одних местах скрипта debug.getinfo(1) выдает таблицу , в которой есть поле name,

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

вызов идёт из луа, си функций в последовательности вызова нет.

что может быть тому причиной?
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
source_info в индикаторе
 
Получаю source info в индикаторе:

{sec_code="GAZP",class_code="QJSIM",param="",interval=-1}



Откуда взялся interval -1?

Если это не ошибка, будьте любезны, объясните происходящее.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
CreateNetDateSource
 
Что за зверь такой неизведанный?

Зачем я вижу ошибки исполнения от него?  Какие они бывают, откель они берутся и когда?

Спасибо.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
Lua 5.4 будем встраивать? )))))
 
https://www.lua.org/work/
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
Createsource и смена сессии
 
После получения сигнала смены сессии я отписываюсь от всех инструментов и подписываюсь заново. Как понимаю, это необходимо при возможном изменении истории инструмента при смене сессии.

Подписка на инструмент сразу после смены сессии ошибок не возвращает, но и "мёд не носит" - свечи не приходят, колбек не дергается.

Как нужно делать правильно?

Спасибо.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
Веселые гистограммы
 
Строим индикатор с гистограммами (первый рисунок)

Увеличиваем ширину гистограмм - второй рисунок


Враги  съели легенду. Если сделать ширину еще больше - они сожрут и таймлайн (третий рисунок)
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
os.time Lua 5.3
 
Перекомпилировал свои скрипты, наткнулся:

Открываем https://www.lua.org/pil/22.1.html,  Видим пример

print(os.time{year=1970, month=1, day=1, hour=0})      --> 10800

Не верим, проверяем.

print(os.time{year=1970, month=1, day=1, hour=0})
Console:1: time result cannot be represented in this installation

И правильно не верим, как выясняется. И в терминале и в стандалоне одинаково.

а вот

print(os.time{year=1970, month=1, day=1, hour=0})


Оказывается.

Теперь lua смотрит часовой пояс. У меня часовой пояс +1, и
print(os.time{year=1970, month=1, day=1, hour=1}) работает и дает 0

Смотрел в документацию на луа - ничего не нашел. На 5.1 в часовой пояс луа не смотрела.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
QTABLE_INT_TYPE QTABLE_INT64_TYPE
 
Я правильно понимаю, что колонки пользовательских таблиц этих типов по прежнему уверенным домкратом выводят float циферки? )
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
Перенос индикаторов между диаграммами
 
В последней версии терминала 8 5 2 11  наблюдаю падения приложения при переносе мышкой (drag&drop) пользовательских индикаторов между диаграммами. При переносе встроенных индикаторов проблемы нет.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
Остановить скрипт при закрытии терминала
 
То ли лыжи не едут....

Как остановить скрипт при закрытии терминала, чтобы при последующем запуске терминала он вы в состоянии "не запущен"?

Метод автогена с провокацией ошибки исполнения считаю недостойным для Программного Комплекса  QUIK )))
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
Торгуемые классы
 
Здравствуйте.

Каким образом из всего множества доступных в терминале классов НАДЕЖНО найти их подмножество, по которым идут торги\сделки?

Вариант с заказом истории по инструментам класса не подходит.


Например, SPBFUT - торгуемый, а cross_rate - не торгуемый
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
Valtoday
 
Добрый.

Что означают значения O,H, L, C на графике оборота в деньгах?

Не могу придумать смысл для первых трех значений.

Попутно -  в какой валюте идет подсчет?
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
LuaSQL
 
Что-то я сильно устал, пробуя пересобрать из исходников sqlite3.dll из пакета lua sql для работы с 8 квиком. Может, кто покажет указующим перстом, где это счастье можно взять в готовом виде?
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
Идентификация экземпляра индикатора
 
Здравствуйте

В индикаторе необходимо сохранять определённые данные между запусками терминала

соответственно:

1. как отличить ручное удаление индикатора (или закрытие окна/диаграммы) от закрытия терминала?
2. как идентифицировать данный экземпляр индикатора, чтобы сохранить данные для него?

ну и попутно.

Третий параметр setvalue() может быть nil.  Всегда и всюду в lua правые параметры nil при вызове функций можно опускать, но не в случае этой функции. Я уже раз пятый наезжаю на эту граблю... Может, стоит привести в норму?
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
Отложенная стоп-заявка
 
Если из lua выставить стоп заявку такую, что она не проходит проверку сервера, то

1. Она висит в таблице стоп-заявок
2. сделать с ней ничего нельзя.


Так и должно быть?
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
Фьючерсы/акции/опционы
 
Здравствуйте

Существует ли способ однозначно определить тип актива Фьючерсы/акции/опционы без использования таблицы текущих торгов? ТТТ может быть не открыта и получить оттуда нужные поля далеко не всегда возможно.

По коду класса тоже ненадежно, классов много разных на разных площадках

По наличию в полном наименовании слова "Фьючерсы" или "Опционы" как то видится ненадежным.

Есть какие-то более стандартные варианты?

Спасибо.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
Выгрузка библиотек
 
Здравствуйте.

Как выгрузить библиотеку при завершении скрипта?

Вот пример




function main()

assert (package.loadlib(getScriptPath() .. "\\sqlite3.dll", "luaopen_luasql_sqlite3")) ()
env = luasql.sqlite3()

local db = env:connect('db.sqlite')

db:execute[[
 CRE ATE   TABLE generic(
   key varchar(50),
   value varchar(150)
 )
]]

db:execute[[
 INS ERT INTO generic VALUES('11111', '2222')
]]
db:execute[[
 INS ERT IN TO generic VALUES('33333', '4444')
]]

local results = db:execute[[
 SEL ECT * FR OM generic
]]

local key,value = results:fetch()
while key do
 message(key ..': '.. val ue)
 key,value = results:fetch()
end

results:close()
db:close()
env:close()

end

не выгружается.

перенос текста в поток терминала эффекта тоже нее дает.


спасибо
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
Стоп заявка "по исполнению"
 
здравствуйте

Эту стоп-заявку я могу выставить из луа (как)? в документации информации нет, в карман транзакций добавить ее не могу
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
Опять про метки
 
Здравствуйте.

1. Как я понимаю, за прошедшие несколько лет (5?   8?  10?) ошибка терминала, проявляющаяся в НЕРИСОВАНИИ на диаграмме маленьких меток, так и не решена? Тестовый пример, иллюстрирующий проблему, я приводил на форуме очень давно и "будет исправлена в очередной версии"

2. Другая проблема. Индикатор рисует метки на диаграмме. В момент запуска терминала с установленным индикатором все прекрасно, за исключением одного - метки не выводятся. Логирование результатов AddLabel свидетельствует об успешности операций, функция возвращает номера меток в инкрементальном порядке. Но на экране их нет.  
Перезапуск индикатора - и все рисуется прекрасно.
При обычном добавлении индикатора при уже запущенном терминале тоже все хорошо.

В чем причина?
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
Label callback
 
Здравствуйте

Было бы очень неплохо иметь возможность получать в скрипте lua колбек при нажатии пользователем метки на графике по аналогии с SetTableNotificationCallback

спасибо
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
Особенности функции Size
 
Здравствуйте.

Задача.

Индикатор. Необходимо выполнять определенные действия в oncalculate только на самой правой, текущей свече, игнорируя все предыдущие.

Очевидная попытка решения

function OnCalculate(i)
  if i == Size() then do_it() end
end

к успеху не приводит, если на графике построен какой-либо индикатор, сдвинутый вправо.

При этом Size() показывает увеличенное на величину сдвига число свечей.

Узнать величину этого сдвига возможности нет.

Вопрос. Как решить поставленную задачу?

Спасибо.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
kill inactive stop order
 
Возможно я чего то не замечаю, но вижу следующее.

При попытке исполнить транзакцию kill_stop_order для неактивной стоп-заявки не приходит ответ ontransaction.

Мне это не кажется и так должно быть?
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
На заметку роботописателям
 
Сегодня установил новую версию терминала и оооо-паньки...Новый индикатор.
Цитата
Добавлен новый индикатор «Глубина рынка», отражающий объемы заявок в виде гистограммы. Подробное описание см. в п. 4.2.15 Раздела 4 «Работа с графиками» Руководства пользователя QUIK.




Что-то он мне  напоминает... Даже помню что. Написано в 2015 году было.


 

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

Плагиат расцениваю как комплимент )


Всем, кто пытается писать какие-то вкусности для творений арка - на заметку - даже спасибы от этой компании не дождетесь, не то что бутылку пива.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
Таблица обезличенных сделок и SearchItems
 
Снова возвращаюсь к вопросу. о котором разработчики позабыли, как видится.


Вот эта функция крутится в цикле опроса:

Код
   -- Собирает из ТОС новые обезличенные сделки
   rescan =
      function()
         if database.need_rescan == false then
            return
         end
         database.need_rescan = false

         local num_trades = getNumberOf("all_trades") - 1
         local items = SearchItems("all_trades",
                                    database.tos + 1,
                                    num_trades,
                                    database.search_function,
                                    "class_code,sec_code,datetime.day,datetime.month,datetime.year"
                                  ) or {}
         database.tos = num_trades
         log.write("Получено ",`#'items," сделок")

         for _,n in ipairs(items) do         -- Всегда по возрастанию
            database.process_trade(getItem("all_trades",n))
         end

         database.save()
      end,

   ---------------------------------------------------------------
   -- Обработка одной сделки
   process_trade =
      function(trade)

         -- Костыль для фильтрации кривых обезличенных сделок, которые шлёт терминал
         if not trade or trade.datetime.year == 1601 then
            log.error("BS: Ошибка терминала. Недопустимая таблица обезличенной сделки ",trade)
            return
         end




20:09:22.057   Получено 151892 сделок
20:09:23.197   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.197   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.197   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.198   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.198   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.198   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.221   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.222   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.222   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.222   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.223   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.223   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.223   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.224   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.224   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.225   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.225   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.225   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.226   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil
20:09:23.226   BS: Ошибка терминала. Недопустимая таблица обезличенной сделки nil

Подписка на тиковые данные происходит по двум колбекам.
Код
oncleanup.subscribe(function()
                     repository.init()
                    end
                   )
onconnected.subscribe(function(flag)
                        if flag then
                           repository.init()
                        end
                      end
                   )

repository.init в частности исполняет следующее


Код
         local security = getSecurityInfo(_class,_code)
         if not security then
            log.write("Инструмент ",instrument_dir," не обнаружен")
            screen.add(_class,_code,INSTRUMENT_NOT_FOUND)
            return
         end

         local ds,err = CreateDataSource(_class,_code,INTERVAL_TICK)
         if not ds then
            log.write("Невозможно получить обезличенные сделки по инструменту ",instrument_dir)
            screen.add(_class,_code,INSTRUMENT_NOT_FOUND)
            return
         end
         table.insert(database.ds,ds)
         log.write("Подписка на инструмент ",instrument_dir," успешна")


Указанный эффект всегда происходит при первом включений терминала в пределах дня. Последующие включения такой эффект не несут.

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

Спасибо.
 
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
Ondstroy и режим связанных окон
 
Здравствуйте.


я уже дважды поднимал вопрос об отсутствии вызова omdestroy в индикаторах в режиме связанных окон.

при смене инструмента в этом режиме функция ondrstroy не вызывается.

оба раза я получал ответ в виде " абажите, щаса напишем скрипт для проверки и саапчим".

Но не саапчили.

Что имеем то по вопросу?
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
Идентификация индикаторов
 
Здравствуйте.

Вопрос скорее к разработчикам.



Есть индикатор, одновременно запущенный на несколшьких разных инструментах (или одинаковых), с разными или одинаковыми настройкками, на произвольных таймфреймах и т.п.

Необходимо:

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

Допустимы любые быстрые способы - средства терминала, winapi и так далее. У меня не хватает фантазии пока.

Спасибо.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
SetLabelParams
 
Здравствуйте.

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

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

Каков должен быть алгоритм работы по перестановке метки из скрипта посредством setlabelparams? чтобы он работал в режиме связанных окон?


Напоминаю также о ошибке, заключающейся в отсутствии вызова ondestroy индикатора в том же режиме связанных окон. Это серьезная проблема - невозможно исполнить финализацию (закрыть процессы, удалить файлы, отвязаться от апишных дел и прочего)
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
CreateDataSource return code
 
Здравствуйте.

Что обусловлено отсутствие колбеков от Createdate source при условии, что последний вернул код успеха? Эффект проявляется при запуске терминала с работающим скриптом.

Эффект никогда не проявляется при запуске  скрипта при уже работающем терминале.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
OnChangeSettings
 
Недавно был добавлен колбен OnChangeSettings

Посмотрел.

Или я чего-то не понял, или вы добавили его так, что он бесполезен

Во первых, он не вызывается при старте индикатора. Но это обойти еще можно

Главное - он не вызывается при смене таймфрейма, что приводит его полной бесполезности .

Или я неправ?
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
Стоп заявки сервера
 
Добрый день.

манипуляции со стоп заявками из луа подразумевают неявное "сделать стоп заявку своей" или нужно выписывать это явно?

спасибо.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
Cteatedatasource
 
У меня ещё несколько вопросов по этой функции.

1. Что происходит, если в момент обращения к функции нет соединения с сервером?

2. Будут ли запрашиваться данные с сервера после установления связи в пункте 1?

3. Что происходит с подпиской после смены сессии?

4. Что происходит с подпиской после выключения и включения терминала с работающим скриптом?
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
Size()
 
Обращаюсь к разработчикам.

Как узнать в индикаторе (OnCalculate), что обрабатывается самая правая свеча?

Хотелось бы получить ответ, который работает всегда )))

Спасибо.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
id метки
 
Здравствуйте

id метки уникален в пределах окна (панели), диаграммы или терминала?

Спасибо.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
Очередные подарки
 
Кусочек текста скрипта,занимающегося обработкой таблицы обезличенных сделок:
Код
-- Собирает из ТОС новые обезличенные сделки
   rescan =
      function()
         if not database.need_tos_rescan then
            return
         end

         local num_trades = getNumberOf("all_trades") - 1
         local items = SearchItems("all_trades",
                    database.tos + 1,
                    num_trades,
                    database.search_function,
                    "class_code,sec_code,datetime.day,datetime.month,datetime.year"
                   ) or {}
         database.tos = num_trades

         for _,n in ipairs(items) do
            database.process_trade(getItem("all_trades",n))
         end

         database.save()
      end,

   ---------------------------------------------------------------
   -- Обработка одной сделки
   process_trade =
      function(trade)
         log.write(trade)
         local trade_datetime = datetime(trade.datetime)

что мы тут имеем?

rescan() получает новые сделки из ТОС и для каждой вызывает обработчик process_trade
первое действие в process_trade есть вывод в лог самой сделки
следующее действие - превращение времени сделки в некий объект.

Время от времени (закономерность неясна) последнее действие приводит к развалу скрипта по причине недопустимых данных в datetime сделки.

Смотрим конец логфайла:
Код
8:44:57.500 {repoterm=0,price=111620,trade_num=1899010832,yield=0,value=128723.53,qty=1,reporate=0,class_code=SPBFUT,repovalue=0,exchange_code=,accruedint=0,tradenum=1899010832,flags=1025,datetime={week_day=4,hour=10,ms=384,mcs=384000,day=26,month=10,sec=2,year=2017,min=27},sec_code=RIZ7,seccode=RIZ7,settlecode=,period=1,repo2value=0,open_interest=440244}
18:44:57.562 {repoterm=0,price=111620,trade_num=1899010833,yield=0,value=128723.53,qty=1,reporate=0,class_code=SPBFUT,repovalue=0,exchange_code=,accruedint=0,tradenum=1899010833,flags=1025,datetime={week_day=4,hour=10,ms=384,mcs=384000,day=26,month=10,sec=2,year=2017,min=27},sec_code=RIZ7,seccode=RIZ7,settlecode=,period=1,repo2value=0,open_interest=440242}
18:44:57.703 {repoterm=0,price=111620,trade_num=1899010834,yield=0,value=128723.53,qty=1,reporate=0,class_code=SPBFUT,repovalue=0,exchange_code=,accruedint=0,tradenum=1899010834,flags=1025,datetime={week_day=4,hour=10,ms=384,mcs=384000,day=26,month=10,sec=2,year=2017,min=27},sec_code=RIZ7,seccode=RIZ7,settlecode=,period=1,repo2value=0,open_interest=440240}
18:44:57.796 {repoterm=0,price=111610,trade_num=1899010835,yield=0,value=772272,qty=6,reporate=0,class_code=SPBFUT,repovalue=0,exchange_code=,accruedint=0,tradenum=1899010835,flags=1025,datetime={week_day=4,hour=10,ms=384,mcs=384000,day=26,month=10,sec=2,year=2017,min=27},sec_code=RIZ7,seccode=RIZ7,settlecode=,period=1,repo2value=0,open_interest=440240}
18:44:57.875 {repoterm=0,price=111620,trade_num=1899010836,yield=0,value=128723.53,qty=1,reporate=0,class_code=SPBFUT,repovalue=0,exchange_code=,accruedint=0,tradenum=1899010836,flags=1025,datetime={week_day=4,hour=10,ms=405,mcs=405000,day=26,month=10,sec=2,year=2017,min=27},sec_code=RIZ7,seccode=RIZ7,settlecode=,period=1,repo2value=0,open_interest=440240}
18:44:58.093 {repoterm=0,price=0,trade_num=0,yield=0,value=0,qty=0,reporate=0,class_code=TQBR,repovalue=0,exchange_code=,accruedint=0,tradenum=0,flags=0,datetime={week_day=1,hour=0,ms=0,mcs=0,day=1,month=1,sec=0,year=1601,min=0},sec_code=ABRD,seccode=ABRD,settlecode=,period=0,repo2value=0,open_interest=0}
Все строчки абсолютно нормальные, а последняя выведенная очень интересна. Все поля нулевые, в том числе и datetime.
Соответственно, обработка datetime приводит к краху:
Код
E:\quik\LuaIndicators\BS.lua:1085: Assert failed: /GoogleDisk/ROBOT/_LUA/datetime.lua : 106
Невозможно рассчитать Unix time: {week_day=1,hour=0,ms=0,mcs=0,year=1601,month=1,day=1,sec=0,min=0,isdst=false}
stack traceback:
   E:\quik\LuaIndicators\BS.lua:1085: in function <E:\quik\LuaIndicators\BS.lua:1074>
   (tail call): ?
   E:\quik\LuaIndicators\BS.lua:1446: in function 'floor'
   E:\quik\LuaIndicators\BS.lua:2563: in function 'process_trade'
   E:\quik\LuaIndicators\BS.lua:2545: in function 'rescan'
   E:\quik\LuaIndicators\BS.lua:2828: in function 'iterate'
   E:\quik\LuaIndicators\BS.lua:1839: in function <E:\quik\LuaIndicators\BS.lua:1802>

Ситуация регулярно появляется как на моем компьютере, так и на множестве других компьютеров, что установлен этот скрипт.

И собственно вопросы:
  1. Что это было?
  2. За что такое счастье?
  3. Как этого счастья избежать?
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
Страницы: 1 2 След.
Наверх