Юрий написал: Действительно, с помощью фунции Lua AddLabel можно добавить прозрачность для текстовой метки. Однако после любого ручного изменения метки RB ---> Редактировать.... появляется черный фон под текстом? Возможность восстанавливать прозрачность фона галочкой вручную была бы очень полезной!
Добрый день,
Описанная в данном инциденте ошибка будет исправлена в одной из очередных версий программы. Приносим извинения за причиненные неудобства.
dwell dwell написал: Саппорт сделал предположение насчет того, что проблема Quik связана с Punto Switcher. Я выгрузил пунто, пару дней не было зависаний. Потом запустил, зависание появилось. Так что считаю, что можно приступить к более детальному анализу, как решить этот вопрос... Или вы по понятным причинам теперь занимаетесь только массовыми проблемами?
Добрый день,
Предполагаем, что описанная в данном инциденте проблема вызвана некорректным поведением программы Punto Switcher и рекомендуем в качестве решения проблемы попробовать установить самую свежую версию данного ПО.
В процессе просмотра списка изменений по версиям данного ПО нам встретились следующие пункты: - Оптимизировано поведение программы punto switcher после выхода компьютера из режима сна. - Устранены ситуации, в которых могло происходить зависание программ во время автоматического и ручного переключения.
mikr написал: Застарелая проблема, которую наблюдаю на протяжении многих версий (возможно, обсуждалась, но, извините, не нашёл). При склейке графика происходит: 1) сброс фильтров потока всех сделок - все галки с классов оказываются снятыми, поток, естественно, полностью прекращается, приходится проставлять галки заново; 2) смена кода клиента в табл. Купить/Продать на более ранний в списке. Поясню. Если есть два кода по одному рынку (обычный счёт и ИИС) и установлен второй по порядку код (ИИС), то, после склейки, таблица К/П оказывается привязанной к первому коду (обычный счёт). Поэтому стоит альтернатива: или не пользоваться склейкой, или каждый раз мучаться с восстановлением настроек Квик.
Добрый день,
Описанная в данном инциденте ошибка будет исправлена в одной из очередных версий ПО.
Sergey написал: Есть сдвиги и изменения в этом вопросе на текущий момент 07.12.2020?
API к WebQUIK нет и не планируется. Есть имеющиеся средства такие как FIX приборы (платно), Trans2Quik, lua скрипты (бесплатно). Если этих средств Вам недостаточно, Вы всегда можете озвучить свои пожелания по доработкам в соответствующей ветке форума. Очевидно что Вы хотите бесплатное, прямое API к серверу. Выпуск такого API не планируется, потому что уже есть FIX приборы.
Уточните в связи с чем Вы проводите такие исследования? если вопрос чисто из любопытства то не видим оснований исследовать этот вопрос т.к. он тербует более детального анализа логов со стороны брокера. Иными словами стоит ли игра свеч? Если Вы столкнулись с какой-то реальной проблемой, опишите в чем её суть.
s_mike@rambler.ru написал: Нет, не подтвердилось. Инструмент на графике один
Инструмент или источник данных? Ведь у одного инструмента могут быть графики от разных источников, таблица текущих торгов или обезличенные сделки. Если говорить про индикаторы, то они само собой рассчитываются чуть позже появления графика-источника.
Старатель, да такая ситуация возможна. но как правило, она возникает когда в одном окне несколько графиков с разными источниками. Один из графиков обновился и получил данные для построения свечи, а второй еще нет. Оба покажут size+1, но на одном будут нулевые значения, а на втором нет.
Владимир написал: Sergey Gorokhov , Какие ещё "матерные и нецензурные слова"?!
Вы прекрасно понимаете о чем речь, если нет перечитайте свои посты еще раз. Еще одно предупреждение и Вас заблокируют. Не используйте ненормативную лексику при написании сообщений.
Цитата
Владимир написал: Sergey Gorokhov, Мне нужно, чтобы я ЗНАЛ, какого типа мои переменные и был уверен, что она не поменяет свой тип через миллисекунду. Повторяю: я ВСЕ свои данные заношу как строки (впрочем, Вы это могли увидеть по коду). А вот как интерпретатор их ВОСПРИНИМАЕТ - этого я уже не знаю.
Проблема не в интерпретаторе, а в Вашем понимании что строка НЕ равно число. У Вас в Вашем же коде, индексы SP заданы как числа, а Вы пытаетесь обратиться к ним как к строкам. О чем Вам уже три человека сказали. Вы говорите что Вам нужны индексы строки, тогда почему Вы где-то используете числа а где-то строки?? проще и надежней везде использовать однотипный способ получения данных.
Вы сами запутались уже в своем же коде.
Вот это a[i][1][1] - должно быть числом а не строкой, о чем и было сказано выше #67
Вы в начале задаете индексы как числа, а потом обращаетесь к ним как к строке С нашей стороны было сделано предположение что Вам нужны индексы - числа, а не строки. Если нужны строки то используйте их везде
Код
function r()local i,j,k;c=c+1;if c==10 then c=0;R();end;for i=0,N-1 do if a[i][9]~=-1 then j=a[i][2];a[i][2]=getParamEx(a[i][1][0],a[i][0],"LAST").param_value;k=0xFFFFFF;if j~=a[i][2]then if tonumber(j)>tonumber(a[i][2]) then k=0xFFCCCC;end;if tonumber(j)<tonumber(a[i][2]) then k=0xCCCCFF;end;end;j=CL[a[i][1][1]];if tonumber(a[i][1][5])==0 then j=0x666666;end;if f then SetColor(T,a[i][9],QTABLE_NO_INDEX,k,j,-1,-1);end;if tonumber(a[i][2])==0 then if f then SetColor(T,a[i][9],1,0,0xFFFFFF,-1,-1);end;end;if f then SetCell(T,a[i][9],1,a[i][0]);end;if f then SetCell(T,a[i][9],2,d0(a[i][1][5]));end;if f then SetCell(T,a[i][9],3,d0(a[i][2]));end;if f then SetCell(T,a[i][9],4,string.format("%1.2f",a[i][2]*a[i][1][3]*a[i][1][5]));end;if f then SetCell(T,a[i][9],5,string.format("%1.2f",a[i][1][6]));end;if f then SetCell(T,a[i][9],6,d0(string.format("%1.3f",a[i][1][7])));end;if f then SetCell(T,a[i][9],7,string.format("%1.2f",a[i][2]/a[i][1][7]*100-100));end;j=a[i][5][a[i][1][4]-1];if f then SetCell(T,a[i][9],8,d0(j));end;j=a[i][2]/j*100-100;if j>5 then if f then SetColor(T,a[i][9],9,0xCCCCFF,0,-1,-1);end;end;if j<-5 then if f then SetColor(T,a[i][9],9,0xFFCCCC,0,-1,-1);end;end;if f then SetCell(T,a[i][9],9,string.format("%1.2f",j));end;end;end;SetWindowCaption(T,"R="..SP[0].."+"..M[0].."="..SV[0].."/"..SR[0].." D="..SP[1].."+"..M[1].."="..SV[1].."/"..SR[1].." E="..SP[2].."+"..M[2].."="..SV[2].."/"..SR[2]);end
function R()local i,j,k,l;l=0;SP["0"]=0;SP["1"]=0;SP["2"]=0;SV["0"]=0;SV["1"]=0;SV["2"]=0;SR["0"]=0;SR["1"]=0;SR["2"]=0;for i=0,N-1 do a[i][2]=getParamEx(a[i][1][0],a[i][0],"LAST").param_value;SP[a[i][1][1]]=tonumber(SP[a[i][1][1]])+a[i][1][6];j=a[i][2]/a[i][1][7]*100-100;if j > 1 then SR[a[i][1][1]]=SR[a[i][1][1]]+a[i][1][6];end;SV[a[i][1][1]]=SV[a[i][1][1]]+(a[i][2]-a[i][1][7])*a[i][1][5]*a[i][1][3];j=a[i][2]/a[i][1][7]*100-100;k=0;j=a[i][2]/a[i][1][7]*100-100;if j<-5 and a[i][2]~=0 then k=1;end;if a[i][1][5]>0 then j=a[i][2]/a[i][5][a[i][1][4]-1]*100-100;if j>3 or j<-3 then k=1;end;end;if k==0 and a[i][9]~=-1 then l=1;a[i][9]=-1;end;if k~=0 and a[i][9]==-1 then if f then a[i][2]=0;a[i][9]=InsertRow(T,-1);end;end;end;if l~=0 then if f then Clear(T);end;i=0;for i=0,N-1 do if a[i][9]~=-1 then a[i][2]=0;if f then a[i][9]=InsertRow(T,-1);end;end;end;end;C=C+1;end
function OnStop() f=false;end
function b(n) local i=0;a[n][1][5]=0;a[n][1][6]=0;while i<a[n][1][4] do a[n][1][5]=a[n][1][5]+a[n][5][i];a[n][1][6]=a[n][1][6]+a[n][5][i]*a[n][5][i+1]*a[n][1][3];i=i+2;end;if a[n][1][5]~=0 then a[n][1][7]=a[n][1][6]/a[n][1][5]/a[n][1][3];else a[n][1][7]=a[n][5][a[n][1][4]-1];end;end
function d0(s) s=tonumber(s);if s==math.floor(s) then s=math.floor(s) end return tostring(s);end
function e() f=false;message("Файл бракованный!");sleep(5000);end
function main() local i,j,s;CL={0,0x9900,0x99};f=true;c=0;C=0;N=0;T=0;a={};M={};M[0]=0;M[1]=0;M[2]=0;SP={};SV={};SR={};F=io.open(getScriptPath().."//T","r");if F==nil then e();return;end;for l in F:lines() do s=l:sub(1,1);if s=="_" then loadstring(l:sub(2))();end;if s~="-" and s~="_" then i=l:find("\1");if i==nil then e();return;end;a[N]={};a[N][1]={};a[N][1][0]=l:sub(1,i-1);l=l:sub(i+1);i=l:find("\2");if i==nil then e();return;end;a[N][0]=l:sub(1,i-1);if l:sub(i+2,i+2)~="\3" or l:sub(i+4,i+4)~="\t" then e();return;end;a[N][1][1]=l:sub(i+1,i+1);a[N][1][2]=l:sub(i+3,i+3);l=l:sub(i+5);a[N][1][3]=getParamEx(a[N][1][0],a[N][0],"LOTSIZE").param_value;i=l:find("\t");if i==nil then e();return;end;a[N][2]=0;l=l:sub(i+1);a[N][3]=0;a[N][4]=0;a[N][5]={};j=0;while l:sub(1,1)~="#" do i=l:find("\t");if i==nil then e();return;end;s=l:sub(1,i-1);l=l:sub(i+1);i=s:find(":");if i==nil then e();return;end;a[N][5][j]=s:sub(1,i-1);a[N][5][j+1]=s:sub(i+1);j=j+2;end;a[N][1][4]=j;a[N][6]={};a[N][7]={};a[N][8]={};j=0;while j<12 do a[N][6][j]=0;a[N][7][j]=0;a[N][8][j]=0;j=j+1;end;l=l:sub(i+1);j=0;while j<12 do i=l:find("\4");if i==nil then break;end;i=l:find(":");if i==nil then e();return;end;a[N][6][j]=l:sub(2,i-1);l=l:sub(i+1);i=l:find(":");if i==nil then e();return;end;a[N][7][j]=l:sub(2,i-1);l=l:sub(i+1);i=l:find("\4");if i==nil then e();return;end;a[N][8][j]=l:sub(2,i-1);l=l:sub(i+1);j=j+1;end;a[N][9]=-1;b(N);N=N+1;end;end;F:close();T=AllocTable();AddColumn(T,1,"Тикер",true,QTABLE_STRING_TYPE,8);AddColumn(T,2,"Кол",true,QTABLE_STRING_TYPE,6);AddColumn(T,3,"Цена",true,QTABLE_STRING_TYPE,12);AddColumn(T,4,"Сумма",true,QTABLE_STRING_TYPE,12);AddColumn(T,5,"Затраты",true,QTABLE_STRING_TYPE,12);AddColumn(T,6,"Med",true,QTABLE_STRING_TYPE,12);AddColumn(T,7,"%",true,QTABLE_STRING_TYPE,12);AddColumn(T,8,"Last",true,QTABLE_STRING_TYPE,12);AddColumn(T,9,"%",true,QTABLE_STRING_TYPE,12);CreateWindow(T);SetWindowPos(T,0,0,900,560);R();F=io.open(getScriptPath().."//LOG","w");if F==nil then e();return;end;message("Скрипт запущен, акций: "..N);while f do sleep(1500);r();end;F:close();F=io.open(getScriptPath().."//TTT","w");if F==nil then e();return;end;i=0;while i<N do F:write(a[i][1][0].."\1"..a[i][0].."\2"..a[i][1][1].."\3"..a[i][1][2].."\t"..d0(a[i][2]).."\t");j=0;while j<a[i][1][4] do F:write(a[i][5][j]..":"..d0(a[i][5][j+1]).."\t");j=j+2;end;F:write("#");j=0;while j<12 do F:write(d0(a[i][6][j])..":"..d0(a[i][7][j])..":"..d0(a[i][8][j]).."\4");j=j+1;end;F:write("\n");i=i+1;end;F:close();message("Скрипт остановлен!");end
Владимир, как и ожидалось у Вас в a[N][1][1] попадает строка, а не число. надо чтобы было число. Потому что SP[2] и SP["2"] - это разные вещи Исправьте например так:
Код
function r()local i,j,k;c=c+1;if c==10 then c=0;R();end;for i=0,N-1 do if a[i][9]~=-1 then j=a[i][2];a[i][2]=getParamEx(a[i][1][0],a[i][0],"LAST").param_value;k=0xFFFFFF;if j~=a[i][2]then if tonumber(j)>tonumber(a[i][2]) then k=0xFFCCCC;end;if tonumber(j)<tonumber(a[i][2]) then k=0xCCCCFF;end;end;j=CL[a[i][1][1]];if tonumber(a[i][1][5])==0 then j=0x666666;end;if f then SetColor(T,a[i][9],QTABLE_NO_INDEX,k,j,-1,-1);end;if tonumber(a[i][2])==0 then if f then SetColor(T,a[i][9],1,0,0xFFFFFF,-1,-1);end;end;if f then SetCell(T,a[i][9],1,a[i][0]);end;if f then SetCell(T,a[i][9],2,d0(a[i][1][5]));end;if f then SetCell(T,a[i][9],3,d0(a[i][2]));end;if f then SetCell(T,a[i][9],4,string.format("%1.2f",a[i][2]*a[i][1][3]*a[i][1][5]));end;if f then SetCell(T,a[i][9],5,string.format("%1.2f",a[i][1][6]));end;if f then SetCell(T,a[i][9],6,d0(string.format("%1.3f",a[i][1][7])));end;if f then SetCell(T,a[i][9],7,string.format("%1.2f",a[i][2]/a[i][1][7]*100-100));end;j=a[i][5][a[i][1][4]-1];if f then SetCell(T,a[i][9],8,d0(j));end;j=a[i][2]/j*100-100;if j>5 then if f then SetColor(T,a[i][9],9,0xCCCCFF,0,-1,-1);end;end;if j<-5 then if f then SetColor(T,a[i][9],9,0xFFCCCC,0,-1,-1);end;end;if f then SetCell(T,a[i][9],9,string.format("%1.2f",j));end;end;end;SetWindowCaption(T,"R="..SP[0].."+"..M[0].."="..SV[0].."/"..SR[0].." D="..SP[1].."+"..M[1].."="..SV[1].."/"..SR[1].." E="..SP[2].."+"..M[2].."="..SV[2].."/"..SR[2]);end
function R()local i,j,k,l;l=0;SP[0]=0;SP[1]=0;SP[2]=0;SV[0]=0;SV[1]=0;SV[2]=0;SR[0]=0;SR[1]=0;SR[2]=0;for i=0,N-1 do a[i][2]=getParamEx(a[i][1][0],a[i][0],"LAST").param_value;SP[a[i][1][1]]=tonumber(SP[a[i][1][1]])+a[i][1][6];j=a[i][2]/a[i][1][7]*100-100;if j > 1 then SR[a[i][1][1]]=SR[a[i][1][1]]+a[i][1][6];end;SV[a[i][1][1]]=SV[a[i][1][1]]+(a[i][2]-a[i][1][7])*a[i][1][5]*a[i][1][3];j=a[i][2]/a[i][1][7]*100-100;k=0;j=a[i][2]/a[i][1][7]*100-100;if j<-5 and a[i][2]~=0 then k=1;end;if a[i][1][5]>0 then j=a[i][2]/a[i][5][a[i][1][4]-1]*100-100;if j>3 or j<-3 then k=1;end;end;if k==0 and a[i][9]~=-1 then l=1;a[i][9]=-1;end;if k~=0 and a[i][9]==-1 then if f then a[i][2]=0;a[i][9]=InsertRow(T,-1);end;end;end;if l~=0 then if f then Clear(T);end;i=0;for i=0,N-1 do if a[i][9]~=-1 then a[i][2]=0;if f then a[i][9]=InsertRow(T,-1);end;end;end;end;C=C+1;end
function OnStop() f=false;end
function b(n) local i=0;a[n][1][5]=0;a[n][1][6]=0;while i<a[n][1][4] do a[n][1][5]=a[n][1][5]+a[n][5][i];a[n][1][6]=a[n][1][6]+a[n][5][i]*a[n][5][i+1]*a[n][1][3];i=i+2;end;if a[n][1][5]~=0 then a[n][1][7]=a[n][1][6]/a[n][1][5]/a[n][1][3];else a[n][1][7]=a[n][5][a[n][1][4]-1];end;end
function d0(s) s=tonumber(s);if s==math.floor(s) then s=math.floor(s) end return tostring(s);end
function e() f=false;message("Файл бракованный!");sleep(5000);end
function main() local i,j,s;CL={0,0x9900,0x99};f=true;c=0;C=0;N=0;T=0;a={};M={};M[0]=0;M[1]=0;M[2]=0;SP={};SV={};SR={};F=io.open(getScriptPath().."//T","r");if F==nil then e();return;end;for l in F:lines() do s=l:sub(1,1);if s=="_" then loadstring(l:sub(2))();end;if s~="-" and s~="_" then i=l:find("\1");if i==nil then e();return;end;a[N]={};a[N][1]={};a[N][1][0]=l:sub(1,i-1);l=l:sub(i+1);i=l:find("\2");if i==nil then e();return;end;a[N][0]=l:sub(1,i-1);if l:sub(i+2,i+2)~="\3" or l:sub(i+4,i+4)~="\t" then e();return;end;a[N][1][1]=tonumber(l:sub(i+1,i+1));a[N][1][2]=l:sub(i+3,i+3);l=l:sub(i+5);a[N][1][3]=getParamEx(a[N][1][0],a[N][0],"LOTSIZE").param_value;i=l:find("\t");if i==nil then e();return;end;a[N][2]=0;l=l:sub(i+1);a[N][3]=0;a[N][4]=0;a[N][5]={};j=0;while l:sub(1,1)~="#" do i=l:find("\t");if i==nil then e();return;end;s=l:sub(1,i-1);l=l:sub(i+1);i=s:find(":");if i==nil then e();return;end;a[N][5][j]=s:sub(1,i-1);a[N][5][j+1]=s:sub(i+1);j=j+2;end;a[N][1][4]=j;a[N][6]={};a[N][7]={};a[N][8]={};j=0;while j<12 do a[N][6][j]=0;a[N][7][j]=0;a[N][8][j]=0;j=j+1;end;l=l:sub(i+1);j=0;while j<12 do i=l:find("\4");if i==nil then break;end;i=l:find(":");if i==nil then e();return;end;a[N][6][j]=l:sub(2,i-1);l=l:sub(i+1);i=l:find(":");if i==nil then e();return;end;a[N][7][j]=l:sub(2,i-1);l=l:sub(i+1);i=l:find("\4");if i==nil then e();return;end;a[N][8][j]=l:sub(2,i-1);l=l:sub(i+1);j=j+1;end;a[N][9]=-1;b(N);N=N+1;end;end;F:close();T=AllocTable();AddColumn(T,1,"Тикер",true,QTABLE_STRING_TYPE,8);AddColumn(T,2,"Кол",true,QTABLE_STRING_TYPE,6);AddColumn(T,3,"Цена",true,QTABLE_STRING_TYPE,12);AddColumn(T,4,"Сумма",true,QTABLE_STRING_TYPE,12);AddColumn(T,5,"Затраты",true,QTABLE_STRING_TYPE,12);AddColumn(T,6,"Med",true,QTABLE_STRING_TYPE,12);AddColumn(T,7,"%",true,QTABLE_STRING_TYPE,12);AddColumn(T,8,"Last",true,QTABLE_STRING_TYPE,12);AddColumn(T,9,"%",true,QTABLE_STRING_TYPE,12);CreateWindow(T);SetWindowPos(T,0,0,900,560);R();F=io.open(getScriptPath().."//LOG","w");if F==nil then e();return;end;message("Скрипт запущен, акций: "..N);while f do sleep(1500);r();end;F:close();F=io.open(getScriptPath().."//TTT","w");if F==nil then e();return;end;i=0;while i<N do F:write(a[i][1][0].."\1"..a[i][0].."\2"..a[i][1][1].."\3"..a[i][1][2].."\t"..d0(a[i][2]).."\t");j=0;while j<a[i][1][4] do F:write(a[i][5][j]..":"..d0(a[i][5][j+1]).."\t");j=j+2;end;F:write("#");j=0;while j<12 do F:write(d0(a[i][6][j])..":"..d0(a[i][7][j])..":"..d0(a[i][8][j]).."\4");j=j+1;end;F:write("\n");i=i+1;end;F:close();message("Скрипт остановлен!");end
function r() local i,j,k;c = c + 1 ; if c = = 10 then c = 0 ;R(); end ; for i = 0 ,N - 1 do if a[i][ 9 ]~ = - 1 then j = a[i][ 2 ];a[i][ 2 ] = getParamEx (a[i][ 1 ][ 0 ],a[i][ 0 ],"LAST").param_value;k = 0xFFFFFF ; if j~ = a[i][ 2 ] then if tonumber(j) > tonumber(a[i][ 2 ]) then k = 0xFFCCCC ; end ; if tonumber(j) < tonumber(a[i][ 2 ]) then k = 0xCCCCFF ; end ; end ;j = CL[a[i][ 1 ][ 1 ]]; if tonumber(a[i][ 1 ][ 5 ]) = = 0 then j = 0x666666 ; end ; if f then SetColor (T,a[i][ 9 ],QTABLE_NO_INDEX,k,j, - 1 , - 1 ); end ; if tonumber(a[i][ 2 ]) = = 0 then if f then SetColor (T,a[i][ 9 ], 1 , 0 , 0xFFFFFF , - 1 , - 1 ); end ; end ; if f then SetCell (T,a[i][ 9 ], 1 ,a[i][ 0 ]); end ; if f then SetCell (T,a[i][ 9 ], 2 ,d0(a[i][ 1 ][ 5 ])); end ; if f then SetCell (T,a[i][ 9 ], 3 ,d0(a[i][ 2 ])); end ; if f then SetCell (T,a[i][ 9 ], 4 , string.format ( "%1.2f" ,a[i][ 2 ] * a[i][ 1 ][ 3 ] * a[i][ 1 ][ 5 ])); end ; if f then SetCell (T,a[i][ 9 ], 5 , string.format ( "%1.2f" ,a[i][ 1 ][ 6 ])); end ; if f then SetCell (T,a[i][ 9 ], 6 ,d0( string.format ( "%1.3f" ,a[i][ 1 ][ 7 ]))); end ; if f then SetCell (T,a[i][ 9 ], 7 , string.format ( "%1.2f" ,a[i][ 2 ]/a[i][ 1 ][ 7 ] * 100 - 100 )); end ;j = a[i][ 5 ][a[i][ 1 ][ 4 ] - 1 ]; if f then SetCell (T,a[i][ 9 ], 8 ,d0(j)); end ;j = a[i][ 2 ]/j * 100 - 100 ; if j > 5 then if f then SetColor (T,a[i][ 9 ], 9 , 0xCCCCFF , 0 , - 1 , - 1 ); end ; end ; if j < - 5 then if f then SetColor (T,a[i][ 9 ], 9 , 0xFFCCCC , 0 , - 1 , - 1 ); end ; end ; if f then SetCell (T,a[i][ 9 ], 9 , string.format ( "%1.2f" ,j)); end ; end ; end ; SetWindowCaption (T,"R = "..SP[0].." + " .. M[ 0 ] .. " = "..SV[0].." /" .. SR[ 0 ] .. " D = "..SP[1].." + " .. M[ 1 ] .. " = "..SV[1].." /" .. SR[ 1 ] .. " E = "..SP[2].." + " .. M[ 2 ] .. " = "..SV[2].." /" .. SR[ 2 ]); end
function R() local i,j,k,l;l = 0 ;SP[ 0 ] = 0 ;SP[ 1 ] = 0 ;SP[ 2 ] = 0 ;SV[ 0 ] = 0 ;SV[ 1 ] = 0 ;SV[ 2 ] = 0 ;SR[ 0 ] = 0 ;SR[ 1 ] = 0 ;SR[ 2 ] = 0 ; for i = 0 ,N - 1 do a[i][ 2 ] = getParamEx (a[i][ 1 ][ 0 ],a[i][ 0 ],"LAST").param_value;SP[a[i][ 1 ][ 1 ]] = tonumber(SP[a[i][ 1 ][ 1 ]]) + a[i][ 1 ][ 6 ];j = a[i][ 2 ]/a[i][ 1 ][ 7 ] * 100 - 100 ; if j > 1 then SR[a[i][ 1 ][ 1 ]] = SR[a[i][ 1 ][ 1 ]] + a[i][ 1 ][ 6 ]; end ;SV[a[i][ 1 ][ 1 ]] = SV[a[i][ 1 ][ 1 ]] + (a[i][ 2 ] - a[i][ 1 ][ 7 ]) * a[i][ 1 ][ 5 ] * a[i][ 1 ][ 3 ];j = a[i][ 2 ]/a[i][ 1 ][ 7 ] * 100 - 100 ;k = 0 ;j = a[i][ 2 ]/a[i][ 1 ][ 7 ] * 100 - 100 ; if j < - 5 and a[i][ 2 ]~ = 0 then k = 1 ; end ; if a[i][ 1 ][ 5 ] > 0 then j = a[i][ 2 ]/a[i][ 5 ][a[i][ 1 ][ 4 ] - 1 ] * 100 - 100 ; if j > 3 or j < - 3 then k = 1 ; end ; end ; if k = = 0 and a[i][ 9 ]~ = - 1 then l = 1 ;a[i][ 9 ] = - 1 ; end ; if k~ = 0 and a[i][ 9 ] = = - 1 then if f then a[i][ 2 ] = 0 ;a[i][ 9 ] = InsertRow (T, - 1 ); end ; end ; end ; if l~ = 0 then if f then Clear (T); end ;i = 0 ; for i = 0 ,N - 1 do if a[i][ 9 ]~ = - 1 then a[i][ 2 ] = 0 ; if f then a[i][ 9 ] = InsertRow (T, - 1 ); end ; end ; end ; end ;C = C + 1 ; end
function OnStop () f = false ; end
function b(n) local i = 0 ;a[n][ 1 ][ 5 ] = 0 ;a[n][ 1 ][ 6 ] = 0 ; while i < a[n][ 1 ][ 4 ] do a[n][ 1 ][ 5 ] = a[n][ 1 ][ 5 ] + a[n][ 5 ][i];a[n][ 1 ][ 6 ] = a[n][ 1 ][ 6 ] + a[n][ 5 ][i] * a[n][ 5 ][i + 1 ] * a[n][ 1 ][ 3 ];i = i + 2 ; end ; if a[n][ 1 ][ 5 ]~ = 0 then a[n][ 1 ][ 7 ] = a[n][ 1 ][ 6 ]/a[n][ 1 ][ 5 ]/a[n][ 1 ][ 3 ]; else a[n][ 1 ][ 7 ] = a[n][ 5 ][a[n][ 1 ][ 4 ] - 1 ]; end ; end
function d0 (s) s = tonumber(s); if s = = math.floor (s) then s = math.floor (s) end return tostring(s); end
function e() f = false ; message ( "Файл бракованный!" ); sleep ( 5000 ); end
function main () local i,j,s;CL = { 0 , 0x9900 , 0x99 };f = true ;c = 0 ;C = 0 ;N = 0 ;T = 0 ;a = {};M = {};M[ 0 ] = 0 ;M[ 1 ] = 0 ;M[ 2 ] = 0 ;SP = {};SV = {};SR = {};F = io.open ( getScriptPath () .. "//T","r"); if F = = nil then e(); return ; end ; for l in F:lines() do s = l:sub( 1 , 1 ); if s = = "_" then loadstring(l:sub( 2 ))(); end ; if s~ = "-" and s~ = "_" then i = l:find( "\1" ); if i = = nil then e(); return ; end ;a[N] = {};a[N][ 1 ] = {};a[N][ 1 ][ 0 ] = l:sub( 1 ,i - 1 );l = l:sub(i + 1 );i = l:find( "\2" ); if i = = nil then e(); return ; end ;a[N][ 0 ] = l:sub( 1 ,i - 1 ); if l:sub(i + 2 ,i + 2 )~ = "\3" or l:sub(i + 4 ,i + 4 )~ = "\t" then e(); return ; end ;a[N][ 1 ][ 1 ] = l:sub(i + 1 ,i + 1 );a[N][ 1 ][ 2 ] = l:sub(i + 3 ,i + 3 );l = l:sub(i + 5 );a[N][ 1 ][ 3 ] = getParamEx (a[N][ 1 ][ 0 ],a[N][ 0 ],"LOTSIZE").param_value;i = l:find( "\t" ); if i = = nil then e(); return ; end ;a[N][ 2 ] = 0 ;l = l:sub(i + 1 );a[N][ 3 ] = 0 ;a[N][ 4 ] = 0 ;a[N][ 5 ] = {};j = 0 ; while l:sub( 1 , 1 )~ = "#" do i = l:find( "\t" ); if i = = nil then e(); return ; end ;s = l:sub( 1 ,i - 1 );l = l:sub(i + 1 );i = s:find( ":" ); if i = = nil then e(); return ; end ;a[N][ 5 ][j] = s:sub( 1 ,i - 1 );a[N][ 5 ][j + 1 ] = s:sub(i + 1 );j = j + 2 ; end ;a[N][ 1 ][ 4 ] = j;a[N][ 6 ] = {};a[N][ 7 ] = {};a[N][ 8 ] = {};j = 0 ; while j < 12 do a[N][ 6 ][j] = 0 ;a[N][ 7 ][j] = 0 ;a[N][ 8 ][j] = 0 ;j = j + 1 ; end ;l = l:sub(i + 1 );j = 0 ; while j < 12 do i = l:find( "\4" ); if i = = nil then break ; end ;i = l:find( ":" ); if i = = nil then e(); return ; end ;a[N][ 6 ][j] = l:sub( 2 ,i - 1 );l = l:sub(i + 1 );i = l:find( ":" ); if i = = nil then e(); return ; end ;a[N][ 7 ][j] = l:sub( 2 ,i - 1 );l = l:sub(i + 1 );i = l:find( "\4" ); if i = = nil then e(); return ; end ;a[N][ 8 ][j] = l:sub( 2 ,i - 1 );l = l:sub(i + 1 );j = j + 1 ; end ;a[N][ 9 ] = - 1 ;b(N);N = N + 1 ; end ; end ;F:close();T = AllocTable (); AddColumn (T, 1 ,"Тикер", true ,QTABLE_STRING_TYPE, 8 ); AddColumn (T, 2 ,"Кол", true ,QTABLE_STRING_TYPE, 6 ); AddColumn (T, 3 ,"Цена", true ,QTABLE_STRING_TYPE, 12 ); AddColumn (T, 4 ,"Сумма", true ,QTABLE_STRING_TYPE, 12 ); AddColumn (T, 5 ,"Затраты", true ,QTABLE_STRING_TYPE, 12 ); AddColumn (T, 6 ,"Med", true ,QTABLE_STRING_TYPE, 12 ); AddColumn (T, 7 ,"%", true ,QTABLE_STRING_TYPE, 12 ); AddColumn (T, 8 ,"Last", true ,QTABLE_STRING_TYPE, 12 ); AddColumn (T, 9 ,"%", true ,QTABLE_STRING_TYPE, 12 ); CreateWindow (T); SetWindowPos (T, 0 , 0 , 900 , 560 );R();F = io.open ( getScriptPath () .. "//LOG","w"); if F = = nil then e(); return ; end ; message ( "Скрипт запущен, акций: " .. N); while f do sleep ( 1500 );r(); end ;F:close();F = io.open ( getScriptPath () .. "//TTT","w"); if F = = nil then e(); return ; end ;i = 0 ; while i < N do F:write(a[i][ 1 ][ 0 ] .. "\ 1 " .. a[i][ 0 ] .. "\ 2 " .. a[i][ 1 ][ 1 ] .. "\ 3 " .. a[i][ 1 ][ 2 ] .. "\t" .. d0(a[i][ 2 ]) .. "\t");j = 0 ; while j < a[i][ 1 ][ 4 ] do F:write(a[i][ 5 ][j] .. ":" .. d0(a[i][ 5 ][j + 1 ]) .. "\t");j = j + 2 ; end ;F:write( "#" );j = 0 ; while j < 12 do F:write(d0(a[i][ 6 ][j]) .. ":" .. d0(a[i][ 7 ][j]) .. ":" .. d0(a[i][ 8 ][j]) .. "\ 4 ");j = j + 1 ; end ;F:write( "\n" );i = i + 1 ; end ;F:close(); message ( "Скрипт остановлен!" ); end
Последняя версия, ругается на "attempt to perform arithmetic on a nil value". если отрезать SP, SV, SR - работает: рисует таблицу, меняет в ней данные, записывает результаты в файл. Вот прям ща и работает - советует акции Nokia продать. ::
для полной картины не хватает содержимого файла "//T"
Владимир написал: Sergey Gorokhov, SP- строка (массив) на три числа, а - сложное, разветвлённое дерево объектов с разнообразной информацией по тикерам, отследить которое не представляется возможным. В частности, этот код выполняется в "большом" прерывании, инициализация - в main, визуализация результатов - малом,обновление - в разных местах.
В виде КОДА а не слов.
Цитата
Владимир написал: Sergey Gorokhov, Сергей, я 40 лет программистом, причём системщик, был даже когда-то в соавторы бортовой операционки включён. Поверьте, я кое-что смыслю в программировании. ::
Для того чтобы выложить "полную версию кода которая не работает" не надо быть программистом
Владимир, У Вас есть понимание что фраза "полная версия кода которая не работает." означает что в коде должно быть всё для того чтобы его можно было запустить и получить ошибку?
Владимир написал: Там алгоритмически сложный код, в котором любой запутается, а тут простейшее действие, выделенное мною после "ругательств" интерпретатора на арифметику.
1) Поверьте, поддержку это совсем не пугает 2) Вы понимаете что без отслеживания значений в "a" и "SP" разобраться в причинах не представляется возможным? 3) Можно повторить пробелму на отдельном, более компактном коде. 4) Если не хотите сотрудничать то увы ничем помочь не можем.
Владимир, Логично предположить что Вам надо привести свою версию кода которая не работает. ПОЛНУЮ версию кода, а не пару строк которые ничего не значат
Nikolay написал: Если у Вас в SP[a[i][1][1]] ничего нет, т.е. nil, то и будет ошибка.
он говорит что в SP[a[i][1][1]] что-то есть. иначе, вот это ..SP[2]); - вернуло бы nil, а оно возвращает "0: SP[2]=0" a[i][1][1]] равно 2, потому что message(i..": SP["..a[i][1][1].."]"); -- печатает "0: SP[2]"
Владимир написал: Александр, А зачем там вообще double? Код заявки - ЦЕЛОЕ число! Эксперимент показал, что его разрядности достаточно. Какому дебилу понадобилось объединить int и float в идиотский number, да ещё и на уровне исполнения использовать именно float? Мало других способов поймать приключения на свою задницу?
Просьба сдерживаться в выражениях иначе придется принять меры.
Владимир написал: ОЙ! Спасибо, конечно, Sergey Gorokhov , И повторяю пожелание: нельзя ли дать возможность редактировать свои комменты - скажем, в течение 5 минут?
К сожалению ядро форума не предоставляет такой возможности. В ближайшее время подобный функционал к добавлению не планируется.
Владимир написал: 1. Не работает раскраска ячеек: вызов SetCell меняет содержимое ячеек "автоматически", а вот на SetColor она пилюёт: всё остаётся чёрно-белым, а я бы хотел раскрасить таблицу как попугая: цвет - это тоже информация, и весьма наглядная.
Для анализа нужен пример кода, на котором воспроизводится проблема.
Цитата
Владимир написал: 2. Попытка динамически обновлять количество строк в таблице закончилась крахом. Я делал так:
Для анализа нужен пример кода, на котором воспроизводится проблема. Словесное описание во всех подобных вопросах только вносит смуту и порождает лишние вопросы. Проще - быстрее - надежней, привести пример кода на котором повторяется проблема (а не пару строк), тогда и решение Вы получите в разы быстрее.
Юрий Z написал: Данное API уже позволяет получать тики в обход qlua/qpile? Как знаю, оно уже давно значительно не обновлялось.
Нет не позволяет, но это же не делает его не "API для внешних программ" если Вам нужен аналог qlua/qpile то для этого уже есть FIX Client Connector но он платный.
Сергей написал: В случае, если lua скрипт, запускаемый через окно Доступные скрипты, будет содержать только одну строчку dofile("Адрес скрипта lua, который хотим запустить"), могут ли быть какие то странности в работе такого скрипта по сравнению с тем, если бы он был запущен напрямую?
Если скриптов будет несколько, то в них не должно быть функций с одинаковыми именами, в остальном не должно быть проблем.
Владимир, То что ситуация повторяется не всегда, совершенно не значит что мы сможем разобраться по отдельным строкам кода. Просьба привести полный пример кода на котором повторяется проблема, иначе разбор может затянуться на века.
Например, Вы знаете что функция tonumber может принимать два параметра, а не один, и если случайно передать туда что попало во второй параметр, то тоже будет nil? мы же не знаем что Вы туда передаете. ну "s" и что? а вдруг эта самая "s" и не "s" вовсе, а функция или еще что. Вот и получается что мы можем только гадать как у Вас там устроено, а Вы будете эти догадки отметать. И так по кругу пока воображения на догадки хватает.
вот и приведите эту последовательность. Или последовательности.
только желательно в общем виде. Я пытался многими способами и все равно время от времени получаю от людей, которые пользуются моими роботами логи, в которых видны невообразимые чудеса в вопросе получаемых роботами данных.
Как уже было сказано и еще раз повторим, надежного способа НЕТ. Нельзя надежно определить что данные актуальны в условиях непрерывно поступающих данных. Можно примерно оценить актуальность, сравнивая текущее время с временем на самих данных (тут уже могут быть разные варианты с синхронизацией часов и т.п.) Если Вы скажите, что это не надежно, то будете абсолютно правы, потому что как уже было сказано надежного способа НЕТ.
s_mike@rambler.ru, Михаил, к чему это все? Мы же с Вами уже не один год общаемся и ровно этот вопрос совершенно точно уже обсуждали. ответ не поменялся, надежного способа нет, есть разные варианты которые могут дать более менее правдивую оценку актуальности данных.
Nikolay, Тема про "math.tointeger" возникла из-за появления ".0", к большим числам она не относится. Автор хотел исследовать вопрос и ему было предложено такое решение для ознакомления
Цитата
Nikolay написал: С другой стороны, не очень понятно зачем вообще применять форматирование для чисел типа integer. tostring итак их выводит корректно. Если только вы не гарантируете тип integer для номера заявки. Но тогда это будет уже другой разговор
применять форматирование не нужно, в той же ветке сказано что tostring будет работать с большими числами, собственно Вы и сами это говорили.
По сути, с числами есть две проблемы, первая это появление ".0" у любых чисел, и эта проблема чинится предложенной функцией. Вторая это некорректное преобразование 19ти значных дробных чисел в строку и решения для нее нет. Но в практике, 19 ти значные числа есть только в номерах заявок/сделок, а для них нет никаких практических задач которые могли бы привести к преобразованию их в дробное число.
Kolossi, Да Вы правы, предложенный вариант с tradingphase не решает поставленной задачи. Согласно биржевому протоколу, в указанном параметре tradingphase нет отдельного признака для вечерней сессии, а значит и в QUIK Вы его никак увидеть не сможете.