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

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

Страницы: 1 2 3 4 5 6 След.
string.upper(S) - русские буквы, Русские буквы в верхний регистр не получается сделать в string.upper(S) в Lua QUIK версии 8.13
 
Юрий Волошин, локаль влияет только на работу строковых функций, на сам язык никак не влияет. Можно задать регион применения локали: "collate", "ctype", "monetary", "numeric", "time".

Владимир,  юникод это стандарт, который надо соблюдать; кодовым страницам место на помойке, равно как и их преверженцам.
string.upper(S) - русские буквы, Русские буквы в верхний регистр не получается сделать в string.upper(S) в Lua QUIK версии 8.13
 
BlaZed, эта функция берет системную локаль. У вас системная локаль совпадает с требуемой, у меня - English_United States.1252 и на ней преобразование регистра кириллицы не работает (в ней кириллицы-то нет).

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


В отсуствии юникода нужно ставить локаль. Такие вещи устанавливать автоматически на стороне программы это плохая практика, но с учётом того что поддерживается только одна-единснтвенная кодировка 1251 то имел бы смысл устанавливать соответствующую локаль автоматически.
Quik 8.13 функция CreateDataSource возвращает пустой набор данных, если таймфрейм отличается от стандартного., Quik 8.13 функция CreateDataSource возвращает пустой набор данных, если интервал отличается от стандартного.
 
Я тут понимаю что на самом деле там могли накостылить миллион километров кода который по итогу делает то же самое, но суть от этого не меняется.
Quik 8.13 функция CreateDataSource возвращает пустой набор данных, если таймфрейм отличается от стандартного., Quik 8.13 функция CreateDataSource возвращает пустой набор данных, если интервал отличается от стандартного.
 
Владимир, я так понимаю что измение с версии 8.12 до 8.13 было вида

Код
void buildCandles ( Candles &source, Candles &output, int interval ) {
+ if ( !validInterval ( interval ) ) return;
  for ( int i = 0; i < source.len; i++ ) {   
и если его откатить то ничего не сломается.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
TGB, мой друг из индии сделает качественнее, так что за деньги я лучше к нему обращусь. А вы тут работаете за идею как я вижу, значит можно вместо костылей спорных делать костыли полезные.
Quik 8.13 функция CreateDataSource возвращает пустой набор данных, если таймфрейм отличается от стандартного., Quik 8.13 функция CreateDataSource возвращает пустой набор данных, если интервал отличается от стандартного.
 
Владимир, девять женщин не могут родить ребенка за один месяц. Разные программисты занимаются разными частами прогрммы, некоторые из них занимаются разработкой Lua API, вот в их баклог и будет это положено, на разработку других частей программы это не повлияет.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
TGB, предлагаю вам реализовать библиотеку QLuaJIT вместо Qesha. Это будет действительно полезно.
Добавить функции для отложения выполнения колбеков
 
swerg, я уже писал что считаю неуважительным разжёвывать информацию как для детей когда об этом никто не спрашивает. Если вам что-то непонятно то попросите уточнение, а не намекайте/открыто заявляйте о тупизне и некомпетентности - это не только неуважительно так еще и глупо; если вам что-то неясно то это у вас нехватает познаний а не у окружающих. Противная ситуация может быть когда выкладки людей выглядят несуразными так как противоречат вашим знаниям, но тут надо упомянуть про эффект даннинга-крюгера: то что вы считаете свои познания экспертными еще не значит что они действительно экспертные. Простой самотест: если вы думаете что ваши слова/познания 100% ничего не упустили, то вы 100% жертва этого эффекта. Этому эффекту подвержены все и избавиться от него можно только методом накопления знаний по существу вопроса, в плане психологии значит быть продемонстрированным в собственной неправоте столько раз пока вы сами не начнете в ней сомневаться. У более умных людей это занимает меньше попыток; нужно понимать, что мозг это очень слабый и абсолютно ненадёжный аппарат.

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


То что мой вариант использует еще дополнительные треды - это как лично я бы решил проблему с подвисанием квика во время исполнения колбеков в рамках мультитредовой реализации. Хотя лично я в собственной реализации бы не стал использовать луа мультитрединг вообще, у меня и колбеки и мейн работали бы в одном и том же треде. Была бы отдельная функция, которая дёргает все накопленные эвенты в квике и запускает соответствующие колбеки. Я бы эту функцию затолкал внутрь sleep(), раз скрипт всё равно в этот момент ничем не занят.
Как передать текущую таблицу котировок в python?
 
Наиболее простой, надёжный и портативный способ передавать данные между прогарммами на одной и той же машине это использовать UDP. Для этого надо будет написать скрипт на Lua который собирает нужные данные, и отправляет их через LuaSocket. На стороне Python надо будет принять данные через UDP socket.
Добавить функции для отложения выполнения колбеков
 
swerg, точно так же как в текущей реализации (в этом и суть предложения - поменьше изменений делать): выполнять всё это в одном треде, так что никакое "уже выполняется" там быть не может принципиально. Это во-первых. Во-вторых, мой подход был бы создать на каждый скрипт отдельный тред-диспатчер колбеков, который и занимается собственно их запуском - главный тред тут принципиально не будет ничем блокироваться.

Цитата
Артем написал:
Самому то не стыдно искренне считать что все окружающие - пустоголовые кретины?
Видимо не только не стыдно, но даже наоборот - горделиво. Тфьу.
Запуск скриптов по списку
 
swerg, я считаю достаточно было бы начать сыпать уведомления в окошко сообщений квика если скрипт падает с одной и той же ошибкой несколько раз подряд.
Запуск скриптов по списку
 
Anton, тут речь об отдельном скрипте, стало быть прибиваться и перезапускаться стал бы отдельный скрипт - как при нажатии на кнопку "остановить" и потом "запустить" на зависшем скрипте в окне скриптов.
Загрузка полной истории инструмента по выбору
 
Kander, F9 -> программа -> получение данных -> по выбранным классам.


Надо будет настроить полный список классов, инструментов и параметров, по которым вы хотите собирать историю.
Quik 8.13 функция CreateDataSource возвращает пустой набор данных, если таймфрейм отличается от стандартного., Quik 8.13 функция CreateDataSource возвращает пустой набор данных, если интервал отличается от стандартного.
 
Цитата
Roman Azarov написал:
Так или иначе, функционалом не предусмотрено использование нестандартных интервалов.
Вынужден не согласиться - внутренне такая возможность обязательно должна иметься. Подсчёт свечек на выбранном интервале имеет вид вот такого цикла (псевдокодом):
Код
for k = 1, i = 1; i <= source.len; i++:
  if source[i].time > candle[k].time + interval: 
    k++
    candle[k].time = source[i].time - source[i].time % interval
    candle[k].open = source[i].value
  candle[k].low = min ( candle[k].low, source[i].value )
  candle[k].high = max ( candle[k].high, source[i].value )
  candle[k].close = source[i].value
  candle[k].volume += source[i].volume 
где ширину интервала контролирует произвольная переменная. То есть ничего не мешает генерировать свечки с произвольным интервалом. При наличии достаточной индусонаправленности в плане программирования, можно преобразовать числовую константу в минутах (как передаётся из Lua) в энумератор, его передать во внутреннюю функцию-генератор свечек, и там энумератор преобразовать обратно в минуты чтобы интервалы считать. Альтернативно можно захардкодить генераторы свечек под каждый отдельный интервал, что занимает еще больше усилий и представляет собой еще меньше смысла. Тогда можно говорить что функционал генерации свечей не поддерживает произвольные интервалы - но это только потому, что программисты сами навесили сверху ограничений на алгоритм, который сам по себе может работать с произвольными данными.

Мне в целом это неважно. Я беру данные по степеням двойки и мне было бы полезно заказывать данные на 8, 16, 32, 64 минуты и т.п., но и 15, 30, 60 минут это невелика разница от нужного параметра.
Запуск скриптов по списку
 
Roman Azarov, только при падениях скрипта. Впрочем принудительный перезапуск зависших скриптов тоже может быть полезен.


В микроконтроллерах принудительный перезапуск зависшей прошивки реализован отдельным аппаратным блоком в котором работает таймер реального времени, который пользователь должен своевременно сбрасывать. Когда таймер долго не сбрасывается и достигает установленного таймаута, подаётся внутренний сигнал на линию RESET и программа перезапускается с нуля.
Quik 8.13 функция CreateDataSource возвращает пустой набор данных, если таймфрейм отличается от стандартного., Quik 8.13 функция CreateDataSource возвращает пустой набор данных, если интервал отличается от стандартного.
 
Roman Azarov, внутренняя функция построения свечек принимает интервал в виде произвольного числа в любом случае; добавление стандартных интервалов имеет смысл для улучшения графического интерфейса, но удаление всех нестандартных не несет никакой пользы.
string.upper(S) - русские буквы, Русские буквы в верхний регистр не получается сделать в string.upper(S) в Lua QUIK версии 8.13
 
BlaZed, действительно, промах. Ну это в любом случае просто велосипединг. Правильный вариант - использовать системные функции и языковую локаль - первым ответом был предложен.
Код
function string.upper ( str ) return str:gsub ( "([a-zа-яё])", function ( c ) return string.char ( string.byte ( c ) - ( c == 'ё' and 16 or 32 ) ) end ) end
function string.lower ( str ) return str:gsub ( "([A-ZА-ЯЁ])", function ( c ) return string.char ( string.byte ( c ) + ( c == 'ё' and 16 or 32 ) ) end ) end
Запуск скриптов по списку
 
Roman Azarov, по аналогии с перезапуском прошивки микроконтроллеров по watchdog timer. Ошибок нельзя избежать на 100%, но можно на 100% гарантировать что программа будет хоть как то пытаться работать а не лежать в спячке до лучших времён.
string.upper(S) - русские буквы, Русские буквы в верхний регистр не получается сделать в string.upper(S) в Lua QUIK версии 8.13
 
BlaZed, альтернативно:
Код
function string.upper ( str ) return str:gsub ( "([a-zа-я])", function ( c ) return string.char ( string.byte ( c ) - 32 ) end ) end
function string.lower ( str ) return str:gsub ( "([A-ZА-Я])", function ( c ) return string.char ( string.byte ( c ) + 32 ) end ) end
string.upper(S) - русские буквы, Русские буквы в верхний регистр не получается сделать в string.upper(S) в Lua QUIK версии 8.13
 
Стандартные текстовые функции Lua работают только с ASCII-строками, смена регистра работает через системную локаль.
Код
os.setlocale ( 'Russian_Russia.1251' ) -- 'ru_RU.CP1251', 'rus_RUS.CP1251', 'Russian_Russia.1251'
Quik 8.13 функция CreateDataSource возвращает пустой набор данных, если таймфрейм отличается от стандартного., Quik 8.13 функция CreateDataSource возвращает пустой набор данных, если интервал отличается от стандартного.
 
Старатель, судя по всему интервалы качаются отдельно, т.к. в более длинных интервалах первая свечка за более ранний период. Впрочем от настроек брокера зависит.
Добавить функции для отложения выполнения колбеков
 
Хотя нет не семафоры а просто флаги. Как то так, С++ псевдокодом.
Код
void QLuaManager::queueCallback ( Callback &callback ) {
  for ( auto &script : this.scripts )
    script.queueCallback ( callback );
}
void Script::queueCallback ( Callback &callback ) {
  this.queue.push ( callback );
  if ( this.queuePaused == false )
    this.executeQueue ( script );
}
void Script::pauseCallbacks ( ) {
  this.queuePaused = true;
}
void Script::resumeCallbacks ( ) {
  this.queuePaused = false;
  this.executeQueue ( script );
}
Добавить функции для отложения выполнения колбеков
 
swerg, тут уже было написано, что если просто повесить лок то терминал зависнет (до снятия всех локов во всех скриптах). Я в ОПе хотел об этом написать и предложить использовать семафоры, но мне что-то показалось что это и так будет всем очевидно, было бы (как это по русски? не "снисходительно") condescending такие вещи сразу же писать. Кроме того, многопоточно выполняются только колбеки, так что средства синхронизации не нужны, нужны только средства контроля вызова колбеков - так как бесконтрольный вызов колбеков зачастую деструктивный.


Про потокобезопасные варианты фукнций для тейблов я имел глупость ляпнуть в другом треде, отчасти потому что не прочитал вопрос полностью - хештейблы этими функциями не поддерживаются от слова совсем. Можно конечно хешевый код переделать под аррайный, но это во-первых не идиоматично для луа а во-вторых выбрасывает в окно О(1) поиск ключей - хотя в той ситуации было бы всё равно т.к. элементы брались все подряд. Там же я предложил двойную буферизацию, что действительно помогает с гонками данных т.к. там разные данные и гоняться там нечему. Но это никак не препятствует разрушению стека, которое возникает судя по всему когда квик захватывает лок и начинает исполнение колбека в тот момент, когда в основном треде все еще выполняются С функции которые не поставили лок. Просто отложив вызов колбеков до того момента, когда весь скриптовый код уже выполнен (и сразу вызвав весь собравшийся набор), возможно позволило бы полностью решить эту проблему не переписывая всю архитектуру, а только сделав небольшую модификацию. Еще в другом месте я предлагал, чтобы колбеки вызывались только при вызове sleep, что тоже возможно разрулило бы все эти проблемы. Вообще конечно sunk cost fallacy это fallacy, если решение оказалось плохое значит от него надо отказаться в пользу хорошего, причём абсолютно неважно сколько усилий уже было вложено в мертворождённую идею - надо похоронить и начать заново. Но мы тут как бы все должны понимать, что разработка новой системы которая будет работать без нареканий может занять очень много времени, при том что старая работает почти без нареканий и починить её можно было бы достаточно небольшими усилиями.

Убедительная просьба, прекратить тащить сюда ad dictionarium fallacy. Предмет обсуждения это проблемы связанные с многопоточным вызовом колбеков и методы их решения, а не чья терминология насколько соответствует словарной.
Добавить функции для отложения выполнения колбеков
 
Старатель,

Anton,


То есть общий порядок исполнения как на верхней диаграмме, а не на нижней?


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


Можете попробовать собирать локальный архив данных, чтобы они были доступны при отсутствии соединения. Попробуйте указать заказ данных по списку - они будут собираться вне зависимости от того, смотрели вы их или нет.
Добавить функции для отложения выполнения колбеков
 
Старатель,  из того что
Цитата
Anton написал:
Цитата
Артем написал:
и не исполняется параллельно
Он исполняется параллельно. Другое дело, что сам луа - разделяемый ресурс, и доступ к нему потоков - по очереди. Если мейн и колбеки сишные в длл, они реально будут параллельно исполняться (пока снова не полезут в луа). Картинку выше  для чистого луа  можно мелко порезать горизонтальными линиями и в каждой полосе будет работать  либо  мейн,  либо  колбек, это правда, но так же работает вытесняющая многозадачность на одноядерном процессоре и никто не говорит, что это не многозадачность.
Тут под "параллельно" имелось ввиду как раз исполнение луа функций одновременно на разных процессорах, то есть колбек выполнялся бы параллельно с мейном. Вытесняющая многозадачность действительно реализована прерываниями, только прерывание запускает соседний тред а не просто выполняется само по себе и возвращает управление в прерванный тред.
Добавить функции для отложения выполнения колбеков
 
swerg, я даже больше скажу - колбек может прийти только в тот момент, когда главный тред снимает лок Lua. Хотя в любой нетривиальной программе это происходит на каждой второй строчке. Это во-первых. А во-вторых, всё вами описаное действо не влияет на то, в какой точке (на какой строке) скриптовый main будет остановлен и очередной колбек будет запущен.


Я вам только что про "недосказание не значит незнание" указал, а вы опять туда же. Самому то не стыдно искренне считать что все окружающие - пустоголовые кретины? Я бы тут так же мог кукарекать что вы не соображаете как тут это работает раз не указали про локи в своем списке, но я понимаю головой что люди каждую мелочь не прописывают когда их не спрашивают.


Обычные колбеки в скриптах (это контекст) вызываются когда скрипт сам дёргает процедуру вызова всех накопленых колбеков прямым или косвенным способом, тобишь поллинг - стандартный метод практически везде, от видеоигр и веб-браузеров до программного обеспечения мейнфреймов. Это подразумевая что никакого мултитрединга скриптов нет, максимум - синглтредовые корутины, как и делают большинство людей с айсикью получше чем у остальных. Причина так делать чисто техническая - скриптовые языки принципиально не приспособлены работать на нескольких процессорах, как может работать функция на С через pthreads, так что люди программирующие на трезвую голову и не пытаются натянуть сову на глобус и просто живут с тем фактом, что мультитредового исполнения функций в скриптах нет и программные решения они разрабатывают вокруг этого факта. В арке люди решили что они умнее всей планеты и хакнули некое подобие мультитрединга, от чего в итоге просто страдают пользователи (кучу тредов по этому поводу уже нафлудили) и никакой выгоды по сравниению с поллингом достигнуто не было (треды функций скриптов всё равно выполняются по одному а не все одновременно). Так вот, колбеки которые вызывает хост-программа, вклинивающиеся прямо посреди мейна на первой же точке где снимается лок, это так-называемые "многопоточные колбеки". И работают они в целом аналогично прерываниям CPU (кто с микроконтроллерами работал тот хорошо знаком), только в новых версиях Lua прервать исполнение мейна можно не в любой момент, а только когда исполняется определённые опкоды. Подход к реализации этих "многопоточных колбеков" настолько несуразный, что по итогу не подходит никакая стандартная терминология. Я надеюсь вы теперь перестанете продвигать вашу ad dictionarium fallacy в качестве аргумента, так как "словарное определение" было дано.
Загрузка полной истории инструмента по выбору
 
Сервер вашего брокера должен работать по выходным и быть настроен на передачу данных по выходным; у моего брокера это работает. Сам квик тут ничего не решает, просто возвращает данные брокера "как есть".
Добавить функции для отложения выполнения колбеков
 
swerg, тут колбек останавливает выполнение главного треда в произвольный момент времени, а не запускается когда тот бездействует, и не исполняется параллельно. Так что функционально это прерывание а не колбек. Можно спорить конечно что прерывания это тоже колбеки так что всё правильно, но это ad dictionarium fallacy. Из контекста как раз должно было быть всё очевидно. Попробуйте тоже людей за идиотов не держать, не надо считать что если что-то недосказано значит ТС тупица а не то что это должно быть и так понятно всем кто имеет с этим дело так что подробно расписывать как для детей когда не спрашивают это как минимум неуважительно.
Изменить правила выноса окон за пределы окна Quik
 
Цитата
Артем написал:
Сюда же: добавить многооконный режим.
Отбой, многооконный режим в квике и так имеется, просто по умолчанию окна создаются внутри центральной консоли и отцеплять их надо вручную. Собственно да нужно просто добавить в луа интерфейс функцию чтобы можно было это делать программно для скриптовых таблиц, раз они не сохраняются.

Anton, квик и есть MDI. То что окошки прямо на десктопе это бестолково - можно спорить, но что для нескольких мониторов требуется такой режим - нельзя.
Изменить правила выноса окон за пределы окна Quik
 
Сюда же: добавить многооконный режим.
Добавить функции для отложения выполнения колбеков
 
Anton, понятно. Но как тогда основной стек ломается? Если ничего не трогать то и ошибок быть не должно - K.I.S.S. и все дела.
Добавить функции для отложения выполнения колбеков
 
Arrigo, тут уже люди много стен головами разломали по поводу квиковского оригинального подхода к многопоточности и связанных с этим проблем. Из недавнего:

https://forum.quik.ru/forum10/topic6356/
https://forum.quik.ru/forum10/topic5119/
https://forum.quik.ru/forum10/topic5823/

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


*когда ВМ снимает удерживаемый лок, т.е. при вызове любой функции или при аллокации памяти
iCode – код параметра, выводимого в колонке
 
Владимир, было бы уместно в таком случае делать "безголовый" клиент, который по локалхосту может отправлять данные в браузер - а как пользователи будут их отображать это будет их личное дело. Как раз можно было бы делать скины, дополнительные данные отображать, с помощью WebGL рисовать, и прочие свистелки и перделки задействовать.
Добавить функции для отложения выполнения колбеков
 
Arrigo, тут "колбеки" функционируют как прерывания - при вызове он вычищает стек, загружает вектор, исполняет прерывание, и после выхода восстанавливает стек. При этом как бы исполнение кода идет в одном и том же VM Lua однопоточно, но из разных тредов. Восстановление стека не всегда бывает корректное, в силу неизвестных причин, отчего скрипты падают. А еще колбек может вклиниться в исполнение главного треда прямо посреди внутреннего цикла, например, если используется pairs в частности, отчего бывают потери данных, как раз из-за гонок и прочего геморроя. Это наверное наименее очевидное и частое проявление жопошности архитектуры, при этом наиболее критическое к работе системы. Кому это не видится как "через жопу" у того у самого руки оттуда растут - это просто диагноз. Есть более простые ляпы, например использование глобальных числовых констант вместо строковых идентификаторов и вообще С-образный интерфейс в целом вместо Lua-идиоматичных объектов с методами (причем не везде).
iCode – код параметра, выводимого в колонке
 
Владимир, действительно. Опять я наивно полагал что сделано по-человечески а не через задницу - разбалован совсем западными программистами видимо. 😐

Вопрос стоит в том, чтобы программно вывесить таблицу за пределы окна квика, и таковой функционал на стороне Lua начисто отсутствует. Если вручную его вытащить, то потом можно координаты ставить как угодно, но если этого не сделать, то таблица будет просто двигаться внутри окна квика и просто делать километровые скролбары. Тут вообще имел бы смысл чтобы квик работал в многооконном режиме, а не заталкивал все окошки в главное окно.
Добавить функции для отложения выполнения колбеков
 
Цитата
Imersio Arrigo написал:
Ээээ, батенька... Дык вы в гонки данных не умеете. Ну так с этого и надо начинать, а не требовать реализации каких-то непонятных костылей.
Подразумевая что для решения вопросов с гонками данных пользоваться такими вещами как локи, мутексы и семафоры это нинужно, да и сами они это непонятные костыли.


То что я предложил реализовать в виде флага это как раз потому, что просто локи ставить - квик зависнет. Тут еще конечно под "колбеками" понимаются прерывания, да и вообще система через задницу что никакие стандартные термины не подходят. Но я людей за идиотов не считаю - думаю что они сами всё это соображают - а оказывается что нет.
iCode – код параметра, выводимого в колонке
 
Евгений, что вы имеете ввиду под "вынесена за пределы квика"?

Сбросить и загрузить табличные данные нетрудно. Надо только добавлять строки и столбцы с идентификаторами идущими по порядку начиная с 1.

Код
local function savetable ( tbl, fname, separator )
    local file, errmsg = io.open ( fname, "w" )
    if not file then error ( errmsg ) end

    local nr, nc = GetTableSize ( tbl )
    if not nr or not nc then error ( "Invalid table handler: " .. tostring ( tbl ) ) end

    if not separator then separator = "," end
    local replace = "\\" .. separator

    local data = { }
    for r = 1, nr do
        for c = 1, nc do
            local v = GetCell ( tbl, r, c )
            data[ #data + 1 ] = tostring ( v.value == 0 and v.image or tostring ( v.value ) ):gsub ( separator, replace )
            data[ #data + 1 ] = separator
        end
        data[ #data ] = "\n"
    end
    file:write ( table.concat ( data ) )
    file:close ( )
end

local function loadtable ( tbl, fname, separator )
    local file, errmsg = io.open ( fname, "r" )
    if not file then error ( errmsg ) end

    local nr, nc = GetTableSize ( tbl )
    if not nr or not nc then error ( "Invalid table handler: " .. tostring ( tbl ) ) end

    if not separator then separator = "," end
    local replace = "\\" .. separator
    local pattern =  "[^" .. separator .. "]*"

    local r, c= 0, 0
    for line in file:lines ( ) do
        c = 0
        r = r + 1
        for tok in line:gmatch ( pattern ) do
            col = col + 1
            tok = tok:gsub ( replace, separator )
            local num = tonumber ( tok )
            if num then
                SetCell ( tbl, r, c, tok, num )
            else
                SetCell ( tbl, r, c, tok )
            end
        end
    end
end
Добавить функции для отложения выполнения колбеков
 
swerg, мы тут все люди умные (точнее сказать я не считаю окружающих за идиотов), понимаем что просто пропускать колбеки с важной информацией это плохая задумка - стало быть надо их сохранять.

Обычно колбеки однопоточные - вызываются из того же треда, в котором работает скрипт, пока собственно скрипт лежит в спячке и ничего не делает. Тут ни у кого никаких проблем не возникает. Но ввиду особенностей квика, колбеки тут многопоточные - вызываются из чужого треда в любой момент, причём вызываться они могут прямо посреди выполнения другого кода. Иногда это прямым образом разрушает стек ВМ и скрипт падает с ошибками обращения к нилам, возможно с избавлением от Lua 5.1 эта проблема отпадёт. А еще иногда колбек вызывается в момент обработки очереди данных, которые собирает этот же колбек, из-за чего соответственно происходит разрушение очереди, из-за чего скрипт тоже падает с ошибками обращения к нилам, хотя тут целостность стека не нарушается, просто данные были удалены из другого треда.

Я говорил уже что от такой многопоточности надо избавляться, и делать скрипты Lua строго однопоточными. Колбеки можно вызывать из функции sleep, результат будет такой же только без всего этого многопоточного геморроя. Альтернативный вариант, без переписывания всей этой каши, это добавить вот такого рода две функции, чтобы заблокировать вызов колбеков когда не надо.
Добавить функции для отложения выполнения колбеков
 
swerg, вы сами прекрасно знаете что это за "многопоточные колбеки". Да, должна сохраняться очередь пропущенных колбеков и потом вызываться, на мой взгляд это должно было быть совершенно очевидно так что я не стал ничего расписывать.
Запуск скриптов по списку
 
Хотелось бы чтобы была функция авто-перезапуска упавших скриптов, в виде галочки например.
Добавить функции для отложения выполнения колбеков
 
Imersio Arrigo,в первом посте сразу же ссылка на тред, где у людей как раз такая пролема. Там собственно и попросили, я просто создал отделный тред и немного поточнее пожелание сформулировал.
Что делает SetEmptyCallback() ?
 
BlaZed, при умном заказе без этой функции получение новых данных определенно не работает, только из открытого графика.
Отладка QUIK 8.13
 
Владимир, ну что за детский сад опять - разглагольствовать о том какой вы молодец это всегда пожалуйста, а чтобы делом показать то найдется миллион отмазок? Складывается ощущение, что на деле вы из себя ничего толкового и не представляете.
Добавить функции для отложения выполнения колбеков
 
Imersio Arrigo, во-первых проигнорированный колбек не будет исоплнен повторно. Во-вторых колбек вызванный при обработке очереди этого же колбека создает потерю данных.

Не было бы проблемы - не было бы просьбы её решить.
Добавить функции для отложения выполнения колбеков
 
https://forum.quik.ru/messages/forum10/message55112/topic6356/#message55112

Добавить функции вида pauseCallbacks и resumeCallbacks, где первая приостанавливает вызовы многопоточных колбеков, а вторая возобновляет. Использование таких функций позволит избежать потери данных и обрушения скриптов в некоторых ситуациях.
Отладка QUIK 8.13
 
Владимир, ну тогда новую модель API в студию. А то губами шлёпать это не мешки ворочать.
Отладка QUIK 8.13
 
Владимир, интерфейс тут и так минимальный, слишком скудный и с неполным покрытием я бы сказал. Его надо расширять и углублять, а вы наоборот кастрировать предлагаете. При том что по итогу юзерам весь этот функционал придётся велосипедить самостоятельно, то есть в области простоты пользования будет отрицательный рост что называется.
Получать объемы сделок
 
Старатель, в Lua5.1 лок снимается в кажом цикле ВМ, в последующих версиях - только когда это требуется.
Отладка QUIK 8.13
 
Старатель, локи снимаются автоматически при вызове любой С-функции а также при выделении памяти.

* любая функция QUIK
* любая функция Lua (все библиотечные функции + pairs, next, getmetatable и т.п.)
* любая функция из внешней DLL
* любая операция со строковым результатом
* любая операция по созданию новых объектов
Страницы: 1 2 3 4 5 6 След.
Наверх