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

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

Страницы: Пред. 1 ... 9 10 11 12 13 14 15 16 17 18 19 След.
Предложение к разработчикам
 
Александр, Я и пишу на С так, как мне хочется. А остальным пофиг этот маразм с "мерцающими" типами данных или необходимость соблюдения (недокументированной!) последовательностью операторов? Одна только высосанная из пальца "проблема" с 19-значными кодами чего стоит! Умников развелось - прям плюнуть негде!
Функции onInit, onStop, onClose
 
Ах ты сволочь какая! Действительно, СТРОКА! А я сдурья поверил талмуду:

TABLE getParamEx (STRING class_code, STRING sec_code, STRING param_name)
Функция возвращает таблицу Lua с параметрами:
param_type STRING Тип данных параметра, используемый в Таблице текущих торгов. Возможные
значения:
«1» – DOUBLE;
«2» – LONG;
«3» – CHAR;
«4» – перечислимый тип;
«5» – время;
«6» – дата
param_value STRING Значение параметра. Для param_type = 3 значение параметра равно «0», в остальных случаях – числовое представление. Для перечислимых типов значение равно порядковому значению перечисления.

Я-то подумал, что там действительно "числовое представление", а у них В СТРОКЕ "числовое представление", панимаш! То-то я смотрю, у меня значения при обрыве связи подкрашиваться перестали...  :smile:  
Функции onInit, onStop, onClose
 
Игорь Б, Кто сказал, что "это строка"?! Я совсем недавно отменил tonumber для этой операции.  :smile:

Серега, Я тоже здесь меньше месяца. А исчезнуть здесь может всё, что угодно!  :smile:  
Функции onInit, onStop, onClose
 
Серега, Никто не работает с nil - на то он и nil  :smile:

string.format("%0.0f", getParamEx (classcode, seccode, "last").param_value)) - ДОЛЖЕН работать!
Функции onInit, onStop, onClose
 
Серега, Кстати, string.format("%0.0f", 100 ) преобразовывает как раз в строку.  :smile:  
Функции onInit, onStop, onClose
 
Серега, Насколько я успел заметить,
PARAM_VALUE DOUBLE Значение параметра, и его не нужно обувать в tonumber.
PARAM_IMAGE STRING Строковое значение параметра, и его не нужно обувать в tostring.
Предложение к разработчикам
 
В своём коде я "обвистовал" все присвоения tostring или tonumber - пока работает (а мне, собственно, осталось только отладить подачу заявок и контроль их исполнения, да обработку событий от юзера), но замечания к реализации остались. На код глядеть местами тошно, но это мелочи. Однако, есть и довольно важные замечания. Попробую их изложить по группам:

I. Настоятельно рекомендуемые к исправлению:

1. У меня все до единого обращения к функциям другого потока (SetCell, SetColor и прочие) выполняются только после контроля флага останова. Тем не менее, даже после этого мне доводилось пару раз так "удачно" нажать на кнопку "остановить", что управление в main больше не возвращалось, скрипт завершался принудительно, и вместо записанного файла результатов работы скрипта я получал шиш с маслом. Здесь уже высказывалось мнение, что это "на 100% зона ответственности QUIK, и я с ним согласен. Я отслеживаю эту ситуацию по наличию или отсутствия финального message("Скрипт остановлен!") и по нулевому размеру файла результатов, но это же ненормально! Как и бесконечные "if f then ... end".

2. Как и первое предложение, это высказывалось уже давно, и не исправляется ГОДАМИ! Как и в первом случае, я не понимаю (и не хочу понимать!) почему "для того, чтобы строки отображались, необходимо, чтобы вызов CreateWindow() производился ДО процедуры добавления строк в таблицу". Здесь участники дискуссии, на мой взгляд, очень убедительно показывали, что такого быть не должно, но хотя бы внесите в описание языка эту "особенность"! Ведь многие (особенно новички) даже не подозревают о таких "нюансах" и тратят многие часы на отладку того, что в принципе не может быть отлажено.

3. Некоторые функции допускают необязательные аргументы (например, основание системы счисления в tonumber), а другие - нет. Так,
SetColor (iTable, iRow, iCol, BCol, TCol)
НЕ работает, а если подставить туда два дополнительных аргумента , SelBCol, SelTCol, равные QTABLE_NO_INDEX (-1) - начинает работать! Поскольку мне совершенно не были нужны выделенные ячейки, до необходимости переделать вызов в
SetColor (iTable, iRow, iCol, BCol, TCol, SelBCol, SelTCol, -1, -1)
без подсказки от службы техподдержки я бы просто не додумался НИКОГДА!

II. Очень хотелось бы, но это уже скорее ненаучная фантастика:

1. Определение типов данных программистом, типа STRING s, NUMBER n, BOOLEAN b, и чтобы интерпретатор не имел права менять указанный тип данных ни при каких обстоятельствах (вылетал бы с ошибкой). Хотя бы как дополнение к существующей "динамической типизации" (а лучше как полная её замена).

2. Вернуть "украденный" целочисленный тип данных (INTEGER i) и операции булевой алгебры для работы с ними (and, or, not или, в сишном синтаксисе, &, |, ^, >>= и т.д).

3. Отделить ключи от индексов. Точнее, ввести индексы в их классическом понимании как порядковый номер элемента в массиве (автоматически получая возможность задавать именно массивы, а не "таблицы Lua"), а также структуры данных (и, соответственно, возможность определять таблицы как массивы структур или, в реляционной терминологии, как массивы кортежей). Это, к тому же, заставит нумеровать массивы либо с нуля, либо с единицы, а не как Бог на душу положит. Для меня в своё время стало открытием, что определив таблицу как T={} я спокойно заполняю её данными, начиная с нулевого индекса, а если начинаю инициализировать вроде:
Q = { 0x999999, 0xFFFFFF, 0x99FFFF, 0x99FF99 };
то для обращения к первому элементу требуется указать именно 1, а не 0.

III. Синтаксис

1. В циклах имеется break, а вот continue почему-то нет (про goto я просто молчу).

2. Неплохо бы вообще приблизить синтаксис к совершенно гениальному языку C (фигурные скобки вместо "паскалевских" begin-end - тем более, что никакого begin как начало блока здесь вообще нет), возможность определять константы (#define), возможность условной трансляции/исполнения (#if) - тогда языку просто цены не будет!  :smile:  
Открытие файла и память
 
валерий, Как минимум, открывать и закрывать файл нужно в main, а не раз в 0.1 секунды. Ну и stopped вряд ли должен быть local.
Функции onInit, onStop, onClose
 
Sergey Gorokhov, Да мне не нужно - я справлюсь и на этом языке.  :smile:  
Функции onInit, onStop, onClose
 
Незнайка, Что, лапуль, перешли на тяфтяфки? Так и должно быть, ибо по делу Вам сказать тупо НЕЧЕГО.  :wink:  
Функции onInit, onStop, onClose
 
Незнайка, Да неужели? Не подскажете, почему же в моём примере a[i][1][1] - строка, а после j=a[i][1][1j вдруг оказывается ЧИСЛОМ? И почему добрая половина моих переменных, которые я ВСЕ ДО ЕДИНОГО заносил как строки вдруг оказываются числами?  :wink: Так что не надо БРЕХАТЬ, милок, я СОВСЕМ НЕ ТО достаю, что положил - это только В НОРМАЛЬНЫХ языках такое происходит, но не в Lua или JS. Так что Вы ТОЖЕ "ПОНЯТИЯ НЕ ИМЕЕТЕ по каким соображениям она присваивает данные и передаёт аргументы какого-то типа". Как и 99% всех здесь присутствующих, включая службу поддержки.
Функции onInit, onStop, onClose
 
Незнайка, Если чай посолить, он будет солёный. А толку от всех этих трепыханий нуль целых хрен десятых.
Функции onInit, onStop, onClose
 
Nikolay, Строки-то из таблиц удаляются, только что при этом происходит с их идентификаторами? У меня вдруг начинает писать в неудалённую строку по другому месту, а вставляемые строки иногда вставляются не в конец таблицы, а через несколько промежуточных (пустых) строк. Это я говорю, разумеется, не про таблицы Lua, а только про таблицы визуализации - роботу они вообще не нужны, а для человека бывают весьма полезны.

Вот я и изучаю язык, в описании которого сказано:
а) программист НЕ МОЖЕТ самостоятельно описать тип своих данных.
б) Данные могут ПОМЕНЯТЬ свой тип в любой момент, если интерпретатор посчитает это нужным.
В) В языке НЕТ целочисленных типов вообще - есть только NUMBER, который (теоретически) может быть и целочисленным, но это НИКАК не зависит от воли и желания программиста.
г) В описании языка действительно говорится про ИНДЕКСЫ, но фактически никаких индексов в языке тоже НЕТ - есть только КЛЮЧИ, а это "две большие разницы".
д) Насколько я вижу по коду, Ваш конструктор не устанавливает типы данных, а лишь определяет их, а возвращает и вообще proxy, который описан как таблица! Вы уверены, что Ваш local t = typedT('number') имеет действительно числовой (не говоря уже про целочисленный) тип? А если сразу после этого сделать t=""? И если вместо обычного описания int a; float b; string c; приходится ТАК извращаться, то это просто УБИЙСТВЕННАЯ характеристику языку! Кому и зачем это надо? Я уж лучше в момент записи данных в таблицы буду принудительно их заворачивать в tostring или tonumber (ещё не решил) и, при необходимости, "разворачивать" их в нужный тип в нужный момент. Если она И ПОСЛЕ ЭТОГО начнёт путать типы данных - это уже в морг.
Функции onInit, onStop, onClose
 
Sergey Gorokhov, Если бы я сомневался в компетенции поддержки, я бы вообще с вами не разговаривал. И вера - это не про меня: я должен убедиться в правильности (или неправильности) любого положения. В данном случае, я хочу разобраться, что лучше: хранить данные в таблицах именно как строки или как то, что они представляют по смыслу. Начну со второго.
Функции onInit, onStop, onClose
 
Sergey Gorokhov, Значит, говорите, "a[i][1][1] должно быть числом а не строкой"? Допустим. А "j", простите, ЧЕМ должно быть после j=a[i][1][1]? Я ведь ему присваиваю именно СТРОКУ, если Вам верить! Так с какого же бодуна j вдруг оказывается ЧИСЛОМ, и message(i..": SP["..j.."]="..SP[j]) вдруг даёт правильный результат, а message(i..": SP["..a[i][1][1].."]="..SP[j]) - неправильный?

Ладно, попробую ещё раз, предельно аккуратно присваивать переменным при инициализации именно тот тип данных, который там должен быть по смыслу. Целочисленные типы разработчики украли, но можно завернуть string.sub перед присвоением хотя бы в tonumber. Это в чистом виде Ваш совет:"И наша рекомендация, наоборот, везде в индексах использовать числа, а не строки.
передавайте число а не строку в a[N][1][1]". Думаете, поможет? Ох, сомневаюсь! Я ведь это УЖЕ ДЕЛАЛ (хотя писал быстро, мог где-то что-то напутать), и пришёл к вывод, что надёжнее, наоборот, заворачивать всё как раз в tostring, а в числовой вид переводить непосредственно перед "арифметикой". Так и сделаю, если хранение в таблицах числовых данных снова начнёт глючить.
перестало работать снятие активной заявки
 
nikolz,При чём тут "мантисса", милок? Да будет Вам известно, что в целочисленных типах НЕТ Никакой "мантиссы"! Там работают ВСЕ 64 разряда до единого, и результат не округляется НИКОГДА! А теперь берём калькулятор в левую руку:

0xFFFFFFFFFFFFFFFF в десятичной системе счисления составит 18 446 744 073 709 515 615

Учите матчасть!  :wink:  
Более быстрый способ, all_trades
 
nikolz,То-то и оно, что "аксиом" - в подобную чушь можно только верить, а вера подразумевает полное отключение мозгов.  :smile:

Методы создания торговых роботов НИЧЕМ не отличаются от написания любых других программ.

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

2) Если робот не успевает обработать информацию до прихода новой, то его место на помойке. Лично у меня робот практически всё время просто спит.

3) Это вообще песня! Та ОС, в которой я был соавтором, так и называлась: "операционная система реального времени". И вот что удивительно: НИКТО из нас не считал циклы "злом" и не пытался их избегать!

Совершенно верно: "А уж Буратинам надо писать исключительно на луа". Язык, конечно, полное дерьмо, но и требования к софту для торговых роботов просто НУЛЕВЫЕ! Так что я буду писать именно на Lua, и не буду даже пытаться искать что-то лучшее.

Катати, а полный список "аксиом" можно услышать? Прям заинтриговали...  :smile:  
Более быстрый способ, all_trades
 
Владимир, Ах, да - количество не вывел:  Записей: 872869
Более быстрый способ, all_trades
 
Костя, Ну, попробовал. Секунды три всё удовольствие. 21 метр результирующий файл. Что получить-то надо?
Код
function main()
local i,j,k;
 k=getNumberOf("all_trades")
 F=io.open(getScriptPath().."//qq","w");
 for i=0, k-1 do
  j=getItem("all_trades", i)    
  F:write(tostring(j).."\n");
  end
 F:close();
end;
Более быстрый способ, all_trades
 
Костя, Да я и пробовать не хочу! Получение массива БЕЗ прорисовки на экране НА ПОРЯДОК быстрее, чем без прорисовки! Если не на два.
Более быстрый способ, all_trades
 
Сроду не интересовали (и не заинтересуют) обезличенные сделки, но нажав тупо в Квике на эту таблицу (СПб), получил её примерно секунд за 10 (с прорисовкой!) Там на данный момент 563877 строк... ой, уже 563880 - таблица регулярно обновляется, и это время УЖ НИКАК не может быть больше, чем получение таблицы программным способом!
Вопросы Новичка
 
Игорь Б, Так целочисленные типы вообще спи... украли!  :smile: Мало того: у интерпретатора и на целочисленных типах крыша съезжает, поскольку для прямого обращения к элементу в нормальных языках требуется индекс, а здесь это ключ!
Вопросы Новичка
 
Игорь Б,  Ага, ЩАЗ!
Если даже
SP[tonumber(a[i][1][1])]=tonumber(SP[tonumber(a[i][1][1])])+tonumber(a[i][1][6]);
не всегда помогает, то поможет
SP[a[i][1][1]+0]=SP[a[i][1][1]+0]+a[i][1][6]+0;

Так, что ли? Свежо предание, да верится с трудом!(С) Это не язык - это... как это в нормативной лексике... это ГОВНО!
Функции onInit, onStop, onClose
 
Sergey Gorokhov,
Цитата
Ваши посты переданы модератору для анализа.
:smile:
Цитата
Разве? А это что?
А это НЕ задание SP как числа - это всё тот же грёбаный "антиллехт"! Вот если написать:
float SP=0;
это было бы уже задание SP как числа! Не говоря уже про
int SP=0; - о таком я и мечтать не смею!
Цитата
И наша рекомендация, на оборот, везде в индексах использовать числа, а не строки.
Блин, я ПЕРЕДАВАЛ! Ещё хуже! Только на строки надежда, ибо в Lua вообще ничего нет, кроме строк! Кстати, для интерпретатора это НОРМАЛЬНО! Между прочим, я вообще отказался передавать в таблицы Lua и числа, и строки -- язык путает ключи с индексами, а потому надежнее перебить все строки таблицы заново! Маразм? Конечно! А что делать?
Функции onInit, onStop, onClose
 
Sergey Gorokhov,Перечитал. Не нашёл ни единого примера "матерных матерных и нецензурных слов". "Головожопа", штоле, здесь считается "ненормативной лексикой"?

Ну не делайте из меня идиота! я прекрасно знаю, что строка НЕ равно число! В моём коде индексы SP НЕ "заданы как числа", и я НЕ "пытаюсь обратиться к ним как к строкам". Я лишь ПРЕДПОЛАГАЮ, что раз уж эта антиллехтуальная сволочь не даёт мне возможность самостоятельно описать тип данных, то должна же она ХОТЬ ЧТО-ТО соображать!

Я НЕ "использую числа а где-то строки" - Я НЕ ИМЕЮ ВОЗМОЖНОСТИ самостоятельно описать тип данных, а потому ВЫНУЖДЕН полагаться на антиллехт этого придурка! И у меня ВЕЗДЕ "однотипный способ получения данных" - код я Вам ПРИВЁЛ.
Функции onInit, onStop, onClose
 
Кстати, правильно мне советовал робот продать Нокию. Не послушался, а она начала падать.  :smile:  
Функции onInit, onStop, onClose
 
Sergey Gorokhov, Мне нужно, чтобы я ЗНАЛ, какого типа мои переменные и был уверен, что она не поменяет свой тип через миллисекунду. Повторяю: я ВСЕ свои данные заношу как строки (впрочем, Вы это могли увидеть по коду). А вот как интерпретатор их ВОСПРИНИМАЕТ - этого я уже не знаю.
Функции onInit, onStop, onClose
 
Sergey Gorokhov, Какие ещё "матерные и нецензурные слова"?!

Nikolay, Недосуг! Достаточно было увидеть:
i="string" - это строка
i=12345 - это уже число
i={} - а теперь таблица
i=true - а теперь boollean
i="" - а теперь опять строка!

См. выше, что я говорил про "изобретателей" - возможно, там и были "матерные и нецензурные слова".  :smile:  
Функции onInit, onStop, onClose
 
Sergey Gorokhov,Вот, я писал в другой ветке 07.10.2020 22:23:20
Теперь крыша едет от преобразования типов: я заглатываю исходную информацию из файла (там, естественно, строки) и распихиваю её по своим таблицам (а там уже и строки, и целочисленные поля, и поля с плавающей точкой). Но я ПОНЯТИЯ НЕ ИМЕЮ по каким соображениям она присваивает данные и передаёт аргументы какого-то типа. Если строки - ругается math.floor, если предварительно поставить s=tonumber(s) - ругается на этот оператор (вернее, возвращает nil). Я уже до ручки дошёл: перед вызовом функции обуваю аргумент в tostring, а внутри функции переворачиваю его в tonumber - пофиг: "attempt to concatenate a nil value (local 's')".
Функции onInit, onStop, onClose
 
Sergey Gorokhov, Спасибо я в курсе, что это разные вещи. Как в курсе и того, что этот долбаный "антиллехтуал" определяет тип данных как ему моча в голову вдарит! У меня ВСЕ элементы изначально строки, и заношу я их в таблицы именно как строки! Но в подавляющем большинстве случаев там с какого-то бодуна вдруг оказываются числа!
Функции onInit, onStop, onClose
 
Старатель, Охренеть! Работает, и даже заголовок выводится! И что, это чудо сотворил один-единственный tonumber(SP[a[i][1][1]])?! Но ведь там же одна сплошная арифметика, и всё с такими же ячейками! Почему SR, SV и другие элементы работают? Их ведь не заворачивали в tonumber!
Функции onInit, onStop, onClose
 
Старатель, И слава Богу, если попадает строка! Я уже ПРИНУДИТЕЛЬНО начал таблицы в "tostring" заворачивать! И плакался не раз, что руки-ноги бы этим "изобретателям динамической типизации" повыдёргивал с пожизненным запретом подходить к компу блиде, чем на километр! Если это строка, то почему tonumber на неё периодически ругается? Судя по всему, там то, что в данный момент интерпретатору в головожопу вдарит.

Нет, ничего не смущает А что должно смущать?  :smile:  
Функции onInit, onStop, onClose
 
Sergey Gorokhov, Ну уж это файл я точно не дам - там информация о моих сделках содержится. Но по коду разобраться в его структуре вполне возможно :lol: !  
Функции onInit, onStop, onClose
 
Sergey Gorokhov, О Господи! Ну, ловите:
Код
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 продать.  :smile:  
Функции onInit, onStop, onClose
 
Sergey Gorokhov, Нет, нельзя. Что Вы с ним делать-то будете? Тем более, без описания.
Функции onInit, onStop, onClose
 
Sergey Gorokhov, Это не сотрудничество. Я абсолютно точно знаю, что мне пришлось бы МЕСЯЦ рассказывать, что и как делает код. Вы хотели отслеживать a? Ну, рискните - вот её описание:

-- Структура таблицы данных для i-го тикера
-- [0] - код тикера
-- [1] - справочная информация по тикеру
-- [1][0] - код класса тикера
-- [1][1] - код валюты тикера (0 - рубли, 1 - доллары, 2 - евро)
-- [1][2] - код качества тикера (0 - наихудший 3 - наилучший)
-- [1][3] - размер лота (берётся из справочника)
-- [1][4] - общее количество сделок (минимум одна, хотя бы виртуальная)
-- [1][5] - общее количество закупленных лотов по тикеру
-- [1][6] - сумма затрат по тикеру
-- [1][7] - средняя цена по всем лотам
-- [2] - последнее значение курса (берётся из таблицы текущих торгов)
-- [3] - глобальный стоп-лосс
-- [4] - стоп-лосс последней ставки
-- [5] - сделки текущего тикера в виде пар: размер ставки в лотах - цена покупки
-- [6] - свечи текущего тикера по периодам (накапливаемые)
-- [7] - свечи текущего тикера (предпоследние)
-- [8] - свечи текущего тикера (последние)
-- [9] - ID строки в таблице визуализации или -1
Функции onInit, onStop, onClose
 
Sergey Gorokhov, Не вижу смысла. Тем более, что я за это время самостоятельно разобрался, почему возникают глюки.
Функции onInit, onStop, onClose
 
Sergey Gorokhov, Сергей, я 40 лет программистом, причём системщик, был даже когда-то в соавторы бортовой операционки включён. Поверьте, я кое-что смыслю в программировании.  :smile:  
Функции onInit, onStop, onClose
 
Sergey Gorokhov, SP- строка (массив) на три числа, а - сложное, разветвлённое дерево объектов с разнообразной информацией по тикерам, отследить которое не представляется возможным. В частности, этот код выполняется в "большом" прерывании, инициализация - в main, визуализация результатов - малом,обновление - в разных местах.
Функции onInit, onStop, onClose
 
Sergey Gorokhov, Вот, я "повторил проблему на более компактном коде" - ошибка очевидна: у интерпретатора краша съезжает при вложенной индексации.
Функции onInit, onStop, onClose
 
Nikolay, Да не нужны мне строки - мне нужны ЧИСЛА! Вся эта хрень только для отладкти.

Кстати, о птичках:
Код
j=a[i][1][1];
message(i..": ");
message(i..": SP["..j.."]="..SP[2]);
message(i..": SP["..j.."]="..SP[j]);
В этом варианте всё РАБОТАЕТ!
Функции onInit, onStop, onClose
 
Sergey Gorokhov, Не логично. Там алгоритмически сложный код, в котором любой запутается, а тут простейшее действие, выделенное мною после "ругательств" интерпретатора на арифметику.
Функции onInit, onStop, onClose
 
Старатель, Мне тоже, но и tonumber не помогает.  :smile:  
Функции onInit, onStop, onClose
 
Nikolay, И не tostring мне тут нужен, а скорее tonumber (тоже не помогает), ибо здесь у меня идёт "арифметика", например:

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];-- считаем мгновенную ликвиность
Функции onInit, onStop, onClose
 
Nikolay, Ну я же показывал - там нуль должен быть! Перед циклом обнуляется:
SP[0]=0;SP[1]=0;SP[2]=0; -- сумма затрат (вложенных средств)
Функции onInit, onStop, onClose
 
Sergey Gorokhov,Нго у меня-то воспроизводится!  :smile:  И что делать?

i - переменная цикла по тикерам
a[i][1][1] - код валюты для данного тикера (в данном случае 2 - евро)
SP - сумма средств, вложенных в акции по данной валюте (считается в цикле).
Функции onInit, onStop, onClose
 
БЛИН, НУ НЕ ПОНИМАЮ Я!!!
Код
message(i..": ");            -- печатает "0: "
message(i..": SP["..a[i][1][1].."]");      -- печатает "0: SP[2]"
message(i..": SP["..a[i][1][1].."]="..SP[2]);   -- печатает "0: SP[2]=0"
message(i..": SP["..a[i][1][1].."]="..SP[a[i][1][1]]);
А на последний оператор у этой гадины "attempt to concatenate a nil value (field '?')" :what:  
Функции onInit, onStop, onClose
 
Сделал для себя два вывода из вчерашних-сегодняшних экспериментов:

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

2. При описании столбцов (AddColumn) не задавать им никаких QTABLE_INT_TYPE, QTABLE_DOUBLE_TYPE - оставить только QTABLE_STRING_TYPE, и при занесении значения в ячейки (SetCell) заворачивать значения в tostring - тогда, по крайней мере, сортировка по столбцам работает именно как сортировка строк, а не выдаёт результаты, от которых глаза на лоб лезут.

3. Ну и, конечно, как мне тут подсказали, любой чих, любые действия с таблицей должны заворачиваться в проверку флага, что кнопка останова скрипта не нажата.
из строки в числовое значение
 
Aleksandr,  У меня такое ощущение, что конвертация не гарантирует, что переменная впоследствии сохранит свой тип, а не поменяет его в любой момент. По виду код чистый - в таблице имеем дело только со строками, и nil здесь возможен лишь если в строке записаны не только цифры и десятичная точка, и строка '0.08' в этом плане безукоризненна. У меня была та же проблема (я о ней здесь писал), но потом она исчезла, и я так и не понял, почему. Подозреваю, что "сейчас эта функция стала возвращать nil" НЕ ВСЕГДА.
перестало работать снятие активной заявки
 
Anton, Какая разница? Насколько я помню, копирование СТРОК наиболее быстро производится через регистры сопроцессора (fld-fstp). Тип int тоже, по большому счёту, разновидность типа var - я всегда пользуюсь i16 или i32. Вот со стеком хуже: запихиваешь туда байт, а он, паскуда, пихает, что ему в голову взбредёт. И выравнивание структур, как компилятору в головожопу вдарит... странно, что вся эта софтина до сих пор хоть как-то работает! В любом случае, тип int отличается от типа float только разной интерпретацией входящих туда битов.
Страницы: Пред. 1 ... 9 10 11 12 13 14 15 16 17 18 19 След.
Наверх