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

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

Страницы: Пред. 1 ... 31 32 33 34 35 36 37 38 39 40 41 След.
Предложение к разработчикам
 
Anton, Потому, что ПИЖОНЫ! Ещё 20 лет назад говорил им: "Уберите  jmp из ассемблера и попробуйте написать хоть что-нибудь"!

Да хрен с ними, с Дейкстрами! Пусть думают, что хотят, а мы своими мозгами шевелить будем.  :smile:

Вот ветка 20-летней давности, начавшаяся именно с дискуссии про goto, где собралось целое созвездие программистов высочайшей квалификации - одних только разработчиков компиляторов там было штуки три: https://forum.ixbt.com/topic.cgi?id=40:160

Несколько фрагментов оттуда:

- Простите, а этот код (который был в примере) - человек писал? То есть руками? Без комментариев? Таких программистов надо выгонять с работы. Без разговоров.
- Согласен, токо это писал я сам, и я же сам директор и есть.

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

- Мои высказывания были только насчёт понятности программы человеком. Так сказать, human-readability
- Так я-ж не поленился, скопировал код, и отформатировал его. Клянусь - readability не на грамм не повысилась. Как не понимал ни бельмеса в том, что там творится, так и не понял.

- Сам я goto очень не люблю, но регулярно использую... К сожалению выиграть прямо сейчас пару минут иногда привлекательнее всех разговоров о чистоте кода.
Вопросы Новичка
 
swerg, А где этот " "игровой сервер"? Первый раз слышу о таком. Я бы потестировал подачу заявок и контроль их исполнения (особенно частичного) именно "на кошках".  :smile:  
Предложение к разработчикам
 
swerg, Это говорил не Александр, а я. Документацию я читал другую, "рекомендуемую", и там не было ни звука ни про loadstring, ни про goto с метками. А ковыряться по всему Инету в поисках "правильной" документации на дерьмовенький язык - много чести. Кстати, goto я вообще не искал, ибо был уверен, что его давно уже выбросили всякие пижоны от программирования, как и из других языков - здесь Александр меня приятно удивил.
Вопросы Новичка
 
Maksimus, Я про прелесть" не сказал ни звука. Абсолютно понятный синтаксис, (хоть и придурковатый местами) - настолько, что справочник практически и не нужен. Плюс полностью обеспечена необходимая [мне] функциональность. Что ещё от языка требовать? Разве что убрать некоторые глюки, но и это претензия не к языку, а к реализации.
Вопросы Новичка
 
Maksimus, Поддержка здесь как раз отвечает прекрасно! И "кодить" на этом языке проще простого. Недостатки есть, как и в любом другом языке, некоторые сильно раздражают, но для торговли вполне потянет!

Беглый взгляд на Вики про MQL сразу же упёрся в: "Платформа всё так же ориентирована исключительно для маржинальной торговли на рынках Forex, Futures и CFD, но не ориентирована на фондовый рынок или для проведения операций без маржинальных условий" - это в морг!

Ну или: "MQL4 основан на концепции широко распространенного языка программирования С++. Синтаксис языка MQL4 подобен синтаксису С++". То есть не стали выдрипываться с "--" для строчных комментариев и тому подобной белиберде, а взяли классический синтаксис. Но, в конце концов, какая разница, какой там синтаксис? Была бы функциональность, и у Lua она есть!
debugview - где его взять и как им пользоваться?
 
Андрей, По молодости первое время пытался пользоваться отладчиком, пока не напоролся несколько раз на ситуацию, когда глючил сам отладчик. И какой ещё "редактор lua"? У меня это обыкновенный блокнот (точнее, редактор Far Manager), и лучшего не требуется. Что вообще можно отлаживать в интерпретаторе? Потерю управления между потоками? Так ведь не поможет тут никакой отладчик.

P.S. Мастдай 95 работал на пару порядков лучше нынешнего софта.  :smile:  
getMoney
 
Роман, Я делаю то же самое, только без комиссии и уведомления.  :smile:  
getMoney
 
Роман, Портфель же Ваш! Какие проблемы посчитать самому ликвидную стоимость или прибыль дня? Тем более, что в "состоянии счёта" они считаются неправильно (при докупках округляются, а при частичных продажах остаются на месте, и в этом случае данные там получаются завышенными). Лично меня прибыль дня не интересует, а ликвидную стоимость мой скрипт пересчитывает раз в 15 секунд и, кроме того, считает её "плюсовую часть" (то есть сколько денег я могу освободить безболезненно в случае необходимости, не закрываясь в убыток).
Предложение к разработчикам
 
Nikolay, На кой мне это надо, если у меня даже интерпретатор почти всё время спит? Уж ХОТЬ НА ЧТО-НИБУДЬ lua пригоден? Я и пишу на чистом lua - язык, конечно, полное говно, но справлюсь уж как-нибудь.  :smile: Скрипт у меня, кстати, уже вполне себе работает в почти боевом режиме, на двух Квиках, на двух брокерах. Вчера, например, мне удалось "срубить по-бырому" более 20% прибыли "дневных" на одной из акций, причём американских рублей - без скрипта я этой возможности просто бы не заметил.
Предложение к разработчикам
 
Александр, А за goto спасибо - работает! Не ожидал встретить его здесь ещё лет 20 назад разные пижоны заявляли, что это "вредная конструкция".
Код
function main()
message("Скрипт запущен!");
goto qq;
message("Скрипт работает!");
::qq::
message("Скрипт остановлен!");
end

Предложение к разработчикам
 
Александр, А вот ветка про goto на этом самом форуме 4 года назад:
https://forum.quik.ru/forum10/topic1271/
Предложение к разработчикам
 
И на английском когда-то разговаривал совершенно свободно. Правда, за много лет без практики он выветривается. Последний раз в 2007 году в Греции доклад делал на английском.
Предложение к разработчикам
 
Александр, Да на кой мне "варианты типизации lua", если там типизация отсутствует в принципе, по определению? А костыли я уж как-нить и сам присобачу. К тому же, ни гитхаб, ни хабр меня давно не интересуют. Предложите лучше им реализовать мой "сортир" - года два уж пользуюсь по 10-100 раз в день, и до сих пор не нарадуюсь!  :smile:  
Предложение к разработчикам
 
Александр, Я умею и читать документацию и гуглить, но если для того, чтобы узнать, что goto существует, нужно ГУГЛИТЬ, то это очередная УБИЙСТВЕННАЯ характеристика языку! Не говоря уже про "continue эмулировать". А в стандартном описании языка нет ни звука ни про метки, ни про goto, ни даже про loadstring, которая уж точно есть, и я ею активно пользуюсь.
Предложение к разработчикам
 
nikolz, Почему "не к тем"? Это тоже разработчики, адаптирующие продукт ТЕХ разработчиков к своим задачам. Если предложение разумно, то ЭТИ разработчики вполне могут попросить ТЕХ его реализовать.

И что, что "это все Вам бесплатно т е халява"? Я ни копейки не платил ни за Си, ни за Паскаль, ни за Алгол, ни за... на чём там я ещё программировал... ни за три ассемблера, PL, Фортран, Бейсик... это же не мешает мне считать тот же Паскаль говном, а Си - гениальной разработкой. Принюхаться, конечно, можно ко всему, но стоит ли? Не пора ли "учиться и признавать ошибки", и убрать, наконец, к чертям свинячьим эту долбаную "динамическую типизацию"?  :smile:  
Предложение к разработчикам
 
Александр, Я и пишу на С так, как мне хочется. А остальным пофиг этот маразм с "мерцающими" типами данных или необходимость соблюдения (недокументированной!) последовательностью операторов? Одна только высосанная из пальца "проблема" с 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, Нет, нельзя. Что Вы с ним делать-то будете? Тем более, без описания.
Страницы: Пред. 1 ... 31 32 33 34 35 36 37 38 39 40 41 След.
Наверх