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

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

Страницы: Пред. 1 2 3 4 5 6 7 След.
функции в функцию
 
Цитата
Archie_ написал:
Думаю объяснил понятно
Ну так как вы написали, только скобки у ф-ций в аргументах уберите, и будет работать.
Код
function main(fun_1, fun_2)
    if something then
        --fun_1(????????)
    else
        --fun_2(????????)
    end
end

if     bla_1 then
    main(One, Two)
elseif bla_2 then
    main(Three, Four)
elseif bla_3 then
    main(Five, Four)
elseif bla_4 then
    main(Six, Seven)
elseif bla_5 then
    main(Seven, One)
end
Прочесть таблицу новости через LUA
 
Цитата
Юрий написал:
Я точно не помню, посмотрите в настройках квика, нет ли там опции читать все новости с сервера и сохранять. Я тело новости не парсил, мне нужны были только заголовки.
Есть флажок «Запрашивать тело новости вместе с заголовком». Но надо проверять, то или не то. Может и запрашивает, но в файл news.log не будет сохранять.
Прочесть таблицу новости через LUA
 
Цитата
null написал:
Вот самый стабильный вариант.
1. Не злоупотребляйте new/delete операциями. Это очень тяжёлые ресурсоёмкие операции, которые приводят к вызову системных ф-ций выделения памяти из кучи и пр. При этом исполняется код объёмом под 150 КБ... поэтому, всегда нужно стараться использовать обычные переменные на стеке, память под которые выделяется всего одной инструкцией процессора записи в регистр указателя стека... Я уже выше писал об этом про структуры. Но тоже самое касается и массивов с константным размером. Например ваш код:
Код
wchar_t *cname = new wchar_t[128];
if(GetClassName(hwnd, cname, 128) && !wcscmp(cname, L"InfoNews"))
...
delete[] cname;
можно ускорить в сотни раз:
Код
wchar_t cname[256];
if(GetClassName(hwnd, cname, _countof(cname)) && !wcscmp(cname, L"InfoNews"))

2. Максимальный размер имени класса окна в WNDCLASSEX равен 256, а не 128.

3. Ещё раз посмотрел весь код, и та же мысль... ну не так. Вообще не нужно количество новостей из заголовка вытаскивать. И мышка не нужна. И координаты не нужны. Нужно:
• нажать Ctrl+End (окно прокрутится вниз, и выделится самая последняя новость), а затем Enter (новость появится в RichEdit20A);
• далее в цикле идти вверх, нажимать UpArrow+Enter, читая новости и считая их количество и следя за сдвигом ползунка;
• в самом верху, как только позиция ползунка обнулилась, выходим из цикла;
В итоге, все новости прочитаны и их количество подсчитано. Да ещё в придачу, если в момент нашего цикла пришла новая новость, то ничего страшного, к моменту прихода нашего цикла вверх, она также обработается и подсчитается.

4. Про разбор даты, агентства и заголовка. Посмотрел формат там у всех агентств разный. Поэтому, если и делать разбор, то нужно сначала пробежать по новости, и поискать там ключевые слова: «ПРАЙМ», «Interfax» и пр.. То-есть, определить новостное агентство. И уже затем, для каждого из них, разбирать отдельно. У Интерфакса, за вычетом пустых строк, идёт в первой строчке дата, во второй ключ. слова, в следующей заголовок, и далее тело. Для ПРАЙМ всё слитно, вначале дата, и далее сразу тело новости без заголовка. Ну и т.д. Тут конечно можно поизвращаться, но что-то красивое и универсальное не сделать, скорее всего...
Прочесть таблицу новости через LUA
 
Цитата
Юрий написал:
Покопался в архивах, раньше файл назывался news.log, возможно название изменилось. Файл начинается с INFONEWS, строки оканчиваются нулём.
Идея хорошая... смущает только одна вещь. Посмотрел у себя этот файл, и такое впечатление, что там только заголовки новостей и те новости, которые читались. То-есть, если в окне новостей щёлкнуть на новость и её текст появится в
RichEdit20A, то он сохраняется в news.log. А если новость не читали, то её нет в news.log.
Quik + Python
 
Цитата
Let_it_go написал:
Неужели нет простого способа прочитать питоном стакан или текущую таблицу?
Из Lua через Lunatic Python вызываете Python ф-цию и передаёте в неё аргументами данные из стакана, ТТП и т.д..
https://stackoverflow.com/questions/20400390/how-to-call-a-python-function-from-lua
Автоматический запуск QUIK
 
Всё подробно расписано: https://blogs.msdn.microsoft.com/winsdk/2009/07/14/launching-an-interactive-process-from-windows-ser...
Автоматический запуск QUIK
 
Цитата
Виталий написал:
Уже не актуально - служба запускается в отдельном сеансе, соответственно все что запустит служба будет в том же сеансе, недоступном пользователю.
Без танцев с бубном это не победить
Как же тогда обычный планировщик (Task Scheduler) работает?
Глюки графиков в 7.19
 
Цитата
ISR написал:
и свой хостинг картинок
снизу поля сообщения есть ссылка «Загрузить картинки»
Прочесть таблицу новости через LUA
 
Цитата
null написал:
был какой-то глюк со свернутым окном, просто не находил InfoNews
свёрнутось окна не должна влиять, глюк был в чём-то другом... берите самое верхнее окно и от него делайте перебор детей... всё должно работать
Прочесть таблицу новости через LUA
 
Цитата
null написал:
Нашел способ как найти высоту строки. Но столкнулся с другой проблемой сообщения дабл клика приходят в окно, но новость не обновляется  
Код
  //Вычисляем высоту линии
SetScrollPos(hMulti, SB_VERT,  0 ,  true );
SendMessage(hMulti, WM_VSCROLL, SB_LINEDOWN,  0 );
const size_t height  =  GetScrollPos(hMulti, SB_VERT);  
Собственно, я об этом и написал перед этим... прокрутить на одну строчку вниз, и посмотреть nPos в GetScrollInfo, ну или как вы получаете тоже значение через GetScrollPos.

Цитата
null написал:
Вот сделал более менее рабочий вариант.
Мягко говоря... совсем «код новичка» так сказать. Ну по порядку:

Цитата
null написал:
Код
BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam)
{
   hNews  =  FindWindowEx(hwnd, nullptr, L"InfoNews", nullptr);
    if  (hNews  !  =  nullptr)  
Зачем?... в эту ф-цию обратного вызова и так идут все хендлы детей и их детей и т.д.... не нужно в ней ещё поддетей детей проверять... здесь нужно взять имя класса через GetClassName и сравнить его с "InfoNews".

Цитата
null написал:
Код
      const HWND hMdi  =  FindWindowEx(hWnd, nullptr, L"MDIClient", nullptr);

       if  (hMdi  !  =  nullptr)
      {
Зачем?... Не нужно MDIClient получать, можно сразу для InfoNews вызывать EnumChildWindows.

Цитата
null написал:
Код
               const size_t centr  =  (rect -  > right  -  rect -  > left) /  2   -   100 ;
               
                  const size_t x  =  centr  +  rand() %  50 ;
                  const size_t y  =  height  +   3   +  rand() % (height  -   3 );
                  const LPARAM pos  =  MAKELPARAM(x, y);  
Что за адские вычисления?... через rand() с остатком? это вообще зачем?

Цитата
null написал:
Код
                  PostMessage(hMulti, WM_ACTIVATE, WA_CLICKACTIVE,  0 );
                  // Перемещаем курсор
                  SendMessage(hMulti, WM_MOUSEMOVE,  0 , pos);
                  // Дабл клик по новости
                  SendMessage(hMulti, WM_LBUTTONDBLCLK, MK_LBUTTON,pos);
                  // Отпускаем левую кнопку мыши
                  SendMessage(hMulti, WM_LBUTTONUP,  0 , pos);

                  // Клик по новости
                  SendMessage(hMulti, WM_LBUTTONDOWN, MK_LBUTTON, pos);
                  // Отпускаем левую кнопку мыши
                  SendMessage(hMulti, WM_LBUTTONUP,  0 , pos);

                  //Sleep( 10 );
                  PostMessage(hMulti, WM_ACTIVATE, WA_INACTIVE,  0 );
                  current_LEN  =  SendMessage(hRich, WM_GETTEXTLENGTH, NULL, NULL);
                  wchar_t *  buff  =  new wchar_t[current_LEN  +   1 ];
                  SendMessage(hRich, WM_GETTEXT, current_LEN  +   1 , LPARAM(buff));
                  current_CRC  =  crc32c(buff, current_LEN);

                  // Next line;
                  SendMessage(hMulti, WM_VSCROLL, SB_LINEDOWN,  0 );  
Вот честно не нравится мне это... совсем... Мне кажется это нужно по-другому вообще сделать. Нужно сначала SetFocus() на MultiList сделать, а потом вообще клавиатурой пройтись по всему списку нажимая кнопки VK_DOWN и VK_RETURN. Так с ходу не могу сказать, нужно экспериментировать... но мне кажется, что это лучше, чем вычисление координат и  тыкание мышкой...

Цитата
null написал:
Код
               SCROLLINFO *  si  =  new SCROLLINFO();

               wchar_t *  title  =  new wchar_t[tlen  +   1 ];

               RECT *  rect  =  new RECT();

                  wchar_t *  buff  =  new wchar_t[current_LEN  +   1 ];  
Ну и наконец — самое главное — «гвоздь „программы”» в прямом и переносном смысле: где delete???
Вы везде ставите new, в том числе и в цикл его засунули, но при этом не делаете delete. У вас в программе сплошные утечки памяти идут.
Да и не нужны new для тех же структур WinAPI, зачем?... все эти структуры локально на стеке выделить и проинициализировать:
Код
SCROLLINFO si = {sizeof(SCROLLINFO)};
si.fMask = SIF_ALL;
if (!GetScrollInfo(hMulti, SB_VERT, &si)) /*ошибка*/;
...
RECT rect;
if (!GetClientRect(hMulti, &rect)) /*ошибка*/; 
и вызовы самих ф-ций на ошибки тоже нужно проверять... ну и т.д.
Прочесть таблицу новости через LUA
 
Цитата
Suntor написал:
Ну тогда, по-другому можно попробовать. Нужно нажать один раз кнопку полосы прокрутки вниз, чтобы на одну новость прокрутило. И повторно вызвать GetScrollInfo. В SCROLLINFO::nPos тогда уже будет точное значение высоты строки. Вручную попробуйте сначала, на одну новость прокрутить. Запустить тот же код. И посмотреть значение nPos, проверьте расчёт количества nMax/nPos.
Даже не так... сам подход неправильный. Будет ошибка округления набегать в любом случае, nPos нужно считать делением всей высоты на количество, а не наоборот.

Короче, нужно из заголовка окна из текста вытаскивать количество. Из nMax вытаскивать высоту клиентской области. Делить второе на первое, и округлять до целого.

То-есть, формула высоты прокрутки строки: h = (int)((double)nMax/(double)n+0.5);
У меня, к примеру, получается: (17930/1083 + 0.5) = (16.56+0.5) = 17
Как раз совпадает с тем, что возвращает в nPos при прокрутке на одну строчку.

Да и вообще, не нужны эти заморочки. Можно проще сделать. Нужно попиксельно пройтись по видимой части клиентской области нажимая мышкой, затем прокрутить страницу PGDOWN, и снова и т.д. до конца. При этом нужно следить за размером nMax, если он изменился в ходе обхода, то прервать процесс и начать заново, так как новая новость пришла. Дальше, держать в памяти количество собранных новостей и nMax, и добавлять уже новые по мере прихода.
Прочесть таблицу новости через LUA
 
Цитата
null написал:
Цитата
Делим одно на другое, и получаем количество строчек в окне новостей.
Хотелось бы так считать, но Новостей 402, а при делении получаем 337.
У меня совпало... высота 17 пикселей...

Ну тогда, по-другому можно попробовать. Нужно нажать один раз кнопку полосы прокрутки вниз, чтобы на одну новость прокрутило. И повторно вызвать GetScrollInfo. В SCROLLINFO::nPos тогда уже будет точное значение высоты строки. Вручную попробуйте сначала, на одну новость прокрутить. Запустить тот же код. И посмотреть значение nPos, проверьте расчёт количества nMax/nPos.
Прочесть таблицу новости через LUA
 
Цитата
null написал:
У меня по нулям возвращает...
Код
const LPSCROLLINFO lpsi  =  new tagSCROLLINFO();
GetScrollInfo(hMulti, SB_VERT, lpsi);
const PSCROLLBARINFO sbi  =  new tagSCROLLBARINFO();
GetScrollBarInfo(hMulti, OBJID_VSCROLL, sbi);  
Конечно по нулям будет возвращать, размер и маску то не указали...
Код
psi->cbSize = sizeof(SCROLLINFO);
psi->fMask = SIF_ALL;
...
psbi->cbSize = sizeof(SCROLLBARINFO);
Прочесть таблицу новости через LUA
 
Цитата
null написал:
Цитата
Suntor   написал:
GetScrollInfo попробуйте, может выцепит размер?...
Как раз его пробовал на MultiView, 0 возвращает.
Не поленился, проверил... всё отлично возвращает.

GetScrollInfo для SB_VERT возвращает в SCROLLINFO::nMax вертикальный размер всей клиентской области в пикселах.
GetScrollBarInfo для OBJID_VSCROLL возвращает в SCROLLBARINFO::dxyLineButton высоту ползунка в пикселах, и она для окна MultiList удачно совпадает с высотой строки в пикселах.

Делим одно на другое, и получаем количество строчек в окне новостей. Ну а дальше, уже дело техники...
Автоматический запуск QUIK
 
Цитата
Виталий написал:
Не подскажете, что может вызывать такое поведение?
Под каким пользователем запускается Quik? Диспетчер задач что пишет?
Прочесть таблицу новости через LUA
 
Цитата
null написал:
Я видел эти юзер сообщения
Ну так значит Spy++ отлично работает, чего на культовую утилиту бочку катить!?...  :evil:

Цитата
null написал:
Размер скрол ареа получить у меня не получилось
GetScrollInfo попробуйте, может выцепит размер?...
Прочесть таблицу новости через LUA
 
Цитата
null написал:
Он ловит только стандартные.
Если такую простыню кидаете, хотя бы под спойлейр её засунули...  :shock:

Spy++ всё ловит нормально, он либо ловит, либо нет... проверьте, что «Unknown» тип сообщений стоит в настройках. Вот к примеру, перехватил такие сообщения:
Код
<000129> 003C0EF6 P message:0x0118 [Unknown] wParam:0000FFFA lParam:0022B5A4
<000398> 000F035C S message:0x0090 [Unknown] wParam:00000000 lParam:00000000
<000399> 000F035C R message:0x0090 [Unknown] lResult:00000000

Но... это не поможет. Я понаблюдал, при добавлении новых новостей в список, нет никаких сообщений, только WM_PAINT и пр. То-есть, этот самописный контрол работает через прорисовку данных из какой-то внутренней структуры Quik, и никакого отдельного интерфейса к окну MultiList видимо нет, вся логика внутри самого окна. Поэтому, нечего там перехватывать.

Соответственно, пока вижу такой способ. Нужно просто взять размер окна этого MultiList, и затем попиксельно пройтись по нему WM_LBUTTONDOWN прокручивая страницу WM_KEYDOWN(VK_NEXT), одновременно перехватывая обновление окна RichEdit20A. И таким образом, собрать все новости.
Прочесть таблицу новости через LUA
 
Цитата
null написал:
SPY++ не ловит. Пробовал. Да это какой-то самописный класс. Поддержка наверное не даст коды сообщений.
У меня ловит... разрядность версии проверьте.
Прочесть таблицу новости через LUA
 
Цитата
null написал:
Кстати может знаете как из MultiList получить список строк?
Это, по-видимому, какой-то самописный класс со своими закрытыми сообщениями. Возможно, к нему есть возможность сделать запрос, но нужно знать коды этих самых сообщений. Можно конечно повозиться с Spy++ и попытаться отследить коды сообщений, но лучше чтобы сама тех. поддежка Quik их предоставила.
Lua сервер для передачи данных из Quik через сокеты., Данные передаются в формате json
 
Цитата
Арсений написал:
Доработал теперь есть многопоточность.
Теоретически, так будет работать. Но вообще по уму, нужно делать :settimeout(0) для всех сокетов, а затем вызывать socket.select для всех вернувших "timeout".
Прочесть таблицу новости через LUA
 
Цитата
null написал:
Может кому пригодится список хендлов
«хендлы» — это указатели, список их значений смысла не имеет, они всегда разные... при повторном запуске Quik, повторном создании окна и т.д... привязываться можно только к строковым именам окон и их классов...
Lua сервер для передачи данных из Quik через сокеты., Данные передаются в формате json
 
Цитата
Арсений написал:
Получается что сервер сейчас однопоточный
Да, именно. У вас там create и resume подряд идут, а yield нет нигде. Это просто вызов ф-ции получается.
Как сократить условие if 'string' then print() end
 
Цитата
Archie_ написал:
Можно ли в lua как то сокращать условие
Если только так:
Код
local Name = "Marina"
if string.find("Marina, Lena, Igor, Sveta, Dima", Name) then
    print(Name)
end
Lua сервер для передачи данных из Quik через сокеты., Данные передаются в формате json
 
Цитата
Арсений написал:
Ссылка на github репозиторий  https://github.com/Arseniys1/QuikSocketTransfer
А с какой целью у вас в main() вызываются ф-ции coroutine.create и coroutine.resume?
Экспорт своей таблицы в Excel по DDE
 
Цитата
Александр написал:
Далее эти таблицы пытаюсь отправить по DDE в эксель.
Передаются только пустые значения таблицы.
Как вы вообще его запустили, этот экспорт по DDE? У меня даже само меню неактивно, из которого его можно запустить...
Quik падает от двойного щелчка по заголовку столбца пустой таблицы...
 
Цитата
Sergey Gorokhov написал:
Пришлите на quiksupport@arqatech.com для анализа полный исходный код lua скрипта, на котором проблема повторяется и *.dmp файл пусть к которому указан у Вас на скриншоте.
Отправил.

Ошибка стабильная, всегда повторяется. Запустил на голом Quik 7.16.2.5 без настроек из отдельной папки, тоже самое. Валится сразу же. Скрипт минимальный из двух функций создания таблицы.
Функции CreateWindow() и InsertRow()
 
Цитата
Sergey Gorokhov написал:
Здравствуйте,
Такова текущая реализация.
Цитата
Илья написал:
Я согласен с Сергеем и хочу добавить, что, господа, если вы считаете, что это так и должно быть, то будьте добры,  задокументируйте  данное поведение. На текущий момент документация, мягко говоря, сильно оставляет желать лучшего.
Сидел как идиот пол часа искал ошибку в своём коде... уже начал думать, что с ума сошёл, пока не полез в Яндекс и не нашёл эту ветку... даже не хочется писать на тему «зачем» так сделано, но вот то, что за прошедший год не исправили документацию в этой части, это весьма прискорбно... (
Quik падает от двойного щелчка по заголовку столбца пустой таблицы...
 
Если создать пустую таблицу и отобразить её через ф-ции  AllocTable и CreateWindow, а затем сделать двойной щелчок по заголовку столбца, то Quik сразу падает с General Protection Fault... повторил несколько раз этот «фокус»... версия 7.16.2.5.
 
Прочесть таблицу новости через LUA
 
Цитата
null написал:
Друзья, подскажите пожалуйста можно ли как-то прочитать таблицу новостей QUIK через LUA ?
Можно через библиотеку w32.dll функциями FindWindow и FindWindowEx рекурсивно перебрать все дочерние открытые окна в Quik и найти окно новостей по имени класса «InfoNews». Оттуда уже из его дочернего окна списка вытащить новости.
Где находятся фьючерсы в Квике?
 
Цитата
Andrey.R написал:
И еще мне объяснили, что в самом Квике можно переводить деньги между разными видами рынков (фондовый, срочный и тд.) но там я еще не разбирался
Если модуль соответствующий стоит у вашего брокера, то можно... там в Quik'е должен появиться в главном меню пункт «Неторговые поручения». А также в самих таблицах позиций и ограничений клиентских счетов можно через меню вызвать пункт «Выполнить транзакцию», и там должны быть соответствующие классы операций на вывод денег с торговых счетов. Если они там есть, то вам повезло, и вы можете прямо из Quik'а делать вывод денег.
Где находятся фьючерсы в Квике?
 
Цитата
Андрей написал:
SVU8, цена инструмента 16,28 , в лоте 10 фьчерсов
не 10 фьючерсов, а 10 унций серебра в одном фьючерсе... серебро стоит около 16,2 долларов за унцию сейчас, соответственно 10 унций стоят около 162 долларов, или около 10'200 руб. — и это та сумма, по которой будет считаться вариационная маржа для этого фьючерса
Цитата
Андрей написал:
ГО на покупку 1333,63. Какая нужна сумма что бы купить один лот этого фьючерса?
1333,63 и нужно, чтобы купить один фьючерс содержащий серебра на 10 тыс. рублей... то-есть ГО составляет около 13%, а плечо соответственно больше 7
Цитата
Андрей написал:
Или тут цены в евро и долларах и надо в рубли пересчитывать?
Цена в стакане в долларах за унцию, как и на спотовом рынке на других биржах... но когда вы вводите заявку, то в полях «Объём» и «Объём ГО» видите цены в рублях, Quik сам их считает, счёт на FORTS у вас тоже в рублях.
Цитата
Андрей написал:
Или еще 3й вариант, после подключения фьчерсов в личном кабинете на сайте брокера появился дополнительный счет и там нет средств, может торговля фьючерсами идет по отдельному счету а не по тому, по которому списывалась цена по акциям? Не подскажете?
Да, на FORTS свой торговый счёт. На него отдельно нужно заводить деньги. В таблице «Клиентский портфель» будет несколько счетов висеть, для каждого рынка свой. Также в таблице «Ограничения по клиентским счетам (Фьючерсы и опционы)» можно смотреть непосредственно деньги которые у вас на FORTS есть... Вообще, у некоторых продвинутых брокеров есть отдельная услуга типа «Единый счёт» или «Мастер счёт» и пд. Когда деньги лежат на нём и доступны сразу на всех торговых площадках. Но мне кажется у Сбербанка такого нет, хотя может и есть, позвоните, узнайте... А пока можете через личный кабинет деньги попробовать перевести с фондового на срочный рынок, там должна быть специальная форма для этого.
Связь двух виртуалок
 
Цитата
Imersio Arrigo написал:
Цитата
Let_it_go   написал:
У меня две виртуалки, арендуемых у UltraVDS.
Возможно проще всего на одной из виртуалок поднять http или ftp сервер, а другую научить периодически подкладывать или скачивать файл. Но нужен как минимум один адрес у одной из виртуалок, которую увидит другая.
Виндовая локалка работает с любыми IP, хоть внешними, хоть внутренними. Нет смысла городить HTTP или FTP сервер дополнительно. Главное, чтобы доступ к 137,138,139,445 портам виртуалки с шарой был открыт для работы служб Netlogon и LanmanServer. Но этот доступ должен настраиваться в UltraVDS.
function
 
Цитата
Archie_ написал:
функция достаточно большая и перечислять надо очень много проще функцию продублировать и знаки поменять
Сделайте объект с разными функциями и общими данными. Параметры, если их много, будут общими, а функции с разными действиями разные, соответственно... Можно через замыкание, таким способом:
Код
function new_f()
    local a, b, c = 5, 10, 20
    return {
        f1 = function () print(a+b+c) end,
        f2 = function () print(a-b-c) end,
        f3 = function () print(a-b+c) end
    }
end

local my_f = new_f()

my_f.f1()
my_f.f2()
my_f.f3()
Вывод:
Код
35
-25
15
function
 
Цитата
Archie_ написал:
Код
   function   main (?)
    print ( 5  +  10  +  20 )
 end 

 function   main (?)
    print ( 5  -  10  -  20 )
 end 

 function   main (?)
    print ( 5  -  10  +  20 )
 end 

main(?)
  
Ну а в параметры вынести эти самые значения что мешает?
Код
function f(a, b, c)
    print(a+b+c)
end

f(5, 10, 20)
f(5, -10, -20)
f(5, -10, 20)
Помогите разобраться с ценой приобретения, Не правильная цена акций Сбербанка-п
 
Цитата
Алексей написал:
Спасибо за ответ, но у меня все иначе У меня была всего одна сделка 18 июня, взял 2 лота по стоп-лимиту за 186,12 (пришел отчет брокера).  На следующий день в терминале появилась цена приобретения 186,36995 и на графике позиция 186,37.
В таблице сделок какие цены были?
string.gmatch
 
Цитата
vgi написал:
for sec in string.gmatch(ticker_list,"[^,]+") do  --группа символов, но не запятая
Цитата
Let_it_go написал:
Код
for sec in string.gmatch (list_MMVB..","..list_FORTS..","..list_CETS,"([^,]+)") do
Тогда ещё пробельные не забудьте исключить... то-есть, так "[^%s,]+"
string.gmatch
 
Цитата
Let_it_go написал:
Заменить литеру %a+ на %w+ - это я умею, но здесь надо учитывать оба варианта - литерные и литерно-цифровые.
Ну да, так и сделать, просто заменить на %w+... оно подразумевает, что будут выбираться как буквенно-цифровые совпадения, так и чисто буквенные или чисто цифровые. То-есть это объединение множеств букв и цифр.
Многопоточность в Луа
 
Цитата
Let_it_go написал:
Спасибо. Это реально задействует новые ядра процессора?
Ну должно, если верить рекламе LuaLanes... )))
Я её сам не стал использовать, мне не нравится изоляция потоков по переменным и необходимость использовать объекты Linda для обмена данными, ну зато эта библиотека будет работать поверх стандартной однопоточной Lua.
Почему объем в лотов в сделке не совпадает с суммой по этой сделке?
 
Точнее на курс доллара умножить цену евро в долларах... для первого... более точно, всё считается по параметрам из ТТП, например для EDU8 сейчас :

Объём в заявке: 1,1700x1 = 74575,92 руб.

В таблице текущих параметров:
Цена послед.: 1,1700
Шаг цены: 0,0001
Ст. шага цены: 6,374010

Проверяем по формуле:
(1,1700/0,0001)*6,374010 = 74575,917 ≈ 74575,92
Почему объем в лотов в сделке не совпадает с суммой по этой сделке?
 
По первому сообщению: там лот 1000 евро, нужно ещё на курс евро умножить, и тогда получите правильный объём в рублях.
По второму сообщению: вы цену 1,1571 смотрите от EDM8 в таблице, а 1,1649 на графике для EDU8, разные фьючерсы
По третьему и четвёртому сообщениям: Вместо «Дата торгов», выведите столбец «Дата», и увидите, что это не сделки из будущего, а сделки за 20 число, вперемешку со сделками за 21 число. Вы отсортировали по столбцу «время», и оно в алфавитном порядке всё отсортировало и перемешало из разных дат с одним временем. Нужно сортировать по номерам сделок (они всегда возрастают), либо вообще не сортировать, оставить по умолчанию.
Связь двух виртуалок
 
Цитата
Let_it_go написал:
Первая виртуалка готовит необходимый файл, вторая должна его прочитать.
На первой виртуалке расшарьте папку с файлом. На второй виртуалке подключите её в качестве сетевого диска (к примеру Z:), указав путь через IP первой виртуалки (\\xx.xx.xx.xx\share).
Ну а дальше на второй виртуалке, через dofile("Z:\\share\\filename") читайте свой файл.
Многопоточность в Луа
 
Цитата
Let_it_go написал:
Но не могу разобраться, где мне запускать эти потоки? Внутри функции main или за её пределами?
Вы же их не просто запускаете, а для проведения расчётов, у вас в коде есть место, где эти расчёты начинаются, и где заканчиваются. Вот в этом месте просто добавьте запуск дополнительных потоков, и дальше, ждите от них результата в этом же месте. Там где у вас комментарий «--утомительные расчёты на основе анализа множества файлов с рыночной информацией» стоит...
Окно графика со своим таймфреймом
 
Цитата
Андрей Пахомов написал:
Цитата
Борис Гудылин   написал:
Найдите вариант передачи данных между потоками...
Так вы знаете как нарисовать простую линию из программы или такой возможности, как я писал ранее, нету и вы просто пытаетесь показать, что очень умный?
Человек вам помочь пытается, дело говорит, а вы не слушаете... Его идея состоит в том, что линии рисуются в «индикаторе Lua», а данные для этого идут из «программы Lua». Потому что по-другому не получится.

Возьмите к примеру драйвер в ОС. Который имеет доступ напрямую к портам, шинам, объектам ядра и т.д. Вы не можете написать обычную прикладную программу, которая напрямую работает в ядре. Поэтому разбиваете её на две части. На драйвер и на саму программу пользовательского режима. В программировании это обычное дело. То что может сделать программа она делает, а далее передаёт данные через файловый интерфейс IOCTL в драйвер, который уже к примеру рисует картинку на каком-нибудь устройстве.

В Quik тоже самое вам предлагает сделать Борис Гудылин, рисование вынести в индикатор, а логику в программу. И соединить их между собой. Индикатор Lua будет как бы вашим «драйвером» для рисования линии, а программа будет собственно программой. И они будут в связке между собой работать. Вы даже можете написать один раз специальный индикатор рисования линий с общим интерфейсом, и затем использовать его многократно во всех своих разных скриптах, чтобы не делать повторно его каждый раз.
Где находятся фьючерсы в Квике?
 
Цитата
Andrey.R написал:
эта цена известна с самого начала, в момент открытия контракта?
Нет. Это вы фьючерс с опционом путаете. Цена по которой исполняется фьючерс заранее неизвестна. Она определится в последний день его торгов из цены базового актива в тот же день.
Где находятся фьючерсы в Квике?
 
Цитата
Andrey.R написал:
Подскажите пожалуйста по какой цене будет закрыт контракт на фьючерс МММ8 (MXI-6.18) не могу разобраться (остальное вроде бы нашел Дата начала 2.06.2017, Дата окончания 21.06.2018, Нижний лимит 2 115.95, Верхний лимит 2 333.35) И с нижним лимитом еще непонятно, нижний лимит на графике был ниже допустимого, вот картинки и ссылка.  МММ8
Значения «Максимальная:2 232,95» и «Минимальная:2 221,45» (взято только что по ссылке МММ8), и эти же значения вы можете видеть в столбцах «Макс. цена» и «Мин. цена» в ТТП, это крайние цены которые были за текущую торговую сессию, которая началась в 19:00 сегодня... они не имею отношения к максимальной и минимальной ценам за всё время торгов по инструменту, которое вы смотрите на графике с 2017 года и до сегодняшнего дня (ваша картинка «mmm8 лим.jpg»).

Значения «Мин.возм.цен.» = 2115,95 и «Макс.возм.цен.» = 2339,35, которые вы смотрите в ТТП, это допустимые цены по которым вы можете ставить заявки в текущей торговой сессии, которая началась в 19:00. Если попытаетесь ввести в заявке цену выходящую за эти границы, то вам напишет сообщение об ошибке.
По поводу стоп-заявок, вопрос разработчикам как отрабатываются стоп-заявки
 
Цитата
Imersio Arrigo написал:
Так он и говорит, что в софте сервера это поддержано.
А включил это брокер у себя при настройке системы или нет - личное дело брокера.
Не уверен, что это так работает. Думаю, имелось ввиду, что брокер также вручную переносит эти заявки между серверами. Только групповым образом. Впрочем, если тех. поддержка расскажет, как сделано администрирование этой функции со стороны брокера, то лишние вопросы отпадут...

Цитата
Imersio Arrigo написал:
Т.е. (условно: сервер1, сервер2) если стоп был выставлен на сервер1, а вы подключились на сервер2 - то делать операции с ней (изменять, снимать, исполнять) вручную нельзя. Для этого нужно "сделать стоп-заявку своей".
Зачем???... Вот зачем это нужно? Пользователю нужно, чтобы стоп поставился и работал, а не таскать его по разным серверам... это же не файл какой-то, чтобы забивать голову тем, где его хранить, и таскать туда-сюда.

Вот представьте такую же ситуацию с серверами биржи и обычными заявками, если бы она была. Вы выставили в стакан заявку, а вам там в отдельной колонке пишет, сервер-биржи-№1. Вы отключились, ушли на обед. А на бирже что-то случилось. Вы вернулись, подключаетесь, но уже к сервер-биржи-№2. И видите, свою заявку в стакане неисполненную, со статусом «чужой сервер» и рынок уже ушёл. Потом начинаете нажимать «Сделать своей»... Ну бред же? Так почему со стоп-заявками не бред? такой же бред... эту функцию можно объяснить только недоработкой ПО с былых времён. Понятно, что Рим не сразу строился, а Quik не сразу делался. Но тем не менее, сама по себе эта ф-ция смысла никакого не имеет и не нужна.

Цитата
rinat написал:
lol
Смеяться после слова ... ? Нет, шутку то я понял. Просто заметил, что вы тонко подтролливаете многих здесь, и меня уже пытались пару раз. Поэтому на провокации не буду поддаваться. Без обид... )))
По поводу стоп-заявок, вопрос разработчикам как отрабатываются стоп-заявки
 
Цитата
Sergey Gorokhov написал:
А при чем тут мы?
Мы делаем софт, а как его использует брокер это дело брокера.
Если он захочет пусть делает Failover, QUIK это позволяет.
Серверную же часть вы пишите. И встроить подобный функционал в эту серверную часть только вы можете. Брокер тут вообще ни при чём.

Цитата
Sergey Gorokhov написал:
Кто сказал что у нас есть сеть серверов? Вы явно не понимаете что мы производитель ПО, а используют его брокера, у которых своя сеть к нам никакого отношения не имеющая.
Я имел ввиду, что у брокера стоит несколько серверов с вашим ПО, которое должно быть между собой связано в единую сеть. Ну как локалка обычная, или домен. Брокер поставил 3 сервера отдельных с вашим ПО, и они вместе работают как одна сеть. Снаружи это выглядит как один виртуальный Quik Server. Подъсоединиться можно физически к любому из них, но данные у них общие. Если один падает физический сервер, вся сеть продолжает работать, и стоп-заявки продолжают работать. И не нужно, ни брокеру, ни пользователю совершать никаких действий по перемещению заявок.

Вы когда на Google.com или Yandex.ru заходите, вы же не к конкретному физическому серверу по IP подсоединяетесь. Вы заходите на сайт по имени, и даже не знаете, куда вас физически подключило, с какого физического сервера данные вашей учётки пришли и т.д.. Для вас это всё прозрачно.

Цитата
Sergey Gorokhov написал:
Вам уже 100 раз было сказано  У БРОКЕРА ЕСТЬ ТАКАЯ ВОЗМОЖНОСТЬ
Участие брокера вообще не должно требоваться для синхронизации работы серверов.

Цитата
Sergey Gorokhov написал:
Что не понятно?
Наличие в Quik функции для ручного переноса заявок из упавших серверов на неупавшие... вот это непонятно. Выглядит как некий архаизм и недоработка с былых времён.

Эта тема началась с вопроса пользователя, что ему делать, когда начались проблемы с сервером у Брокера. И он должен теперь бегать в мыле, по форумам в выяснять, что ему нужно там нажимать за кнопки «сделать своей»...
Сртировка
 
Цитата
Роман написал:
Спасибо вам  Suntor !
Да не за что... )))
Очищение памяти
 
Цитата
_sk_ написал:
Если в таблице относительно немного колонок, но много строк, то есть способ сильно сэкономить, если хранить таблицу в виде набора колонок. В Вашем примере будет 6 колонок, которые можно реализовать через массив чисел с индексацией с 1. Конечно, надо беспокоиться о том, чтобы в колонках было одинаковое количество элементов. В результате экономия будет существенной, т.к. не будет создаваться хэш-таблица на каждую строку.
А вот это интересный приём... есть оценки сравнения по расходу памяти на таблицу чисел 10x1'000'000 в обоих форматах?... даже вот любопытно стало, будет время, запилю тестик....
Для чего нужна функция SetUpdateCallback?, Работа с данными.
 
Цитата
Ирина написал:
И абсолютно не нужна мне схема "опроса". Просто подозреваю, что если засунуть весь код в "колбэк", терминал атрофируется из-за 100% занятого основного потока, да и "колбэки" не будут успевать обрабатываться.
В этом сложность разработки алгоритма. Вы должны рассчитать, насколько ваш код тяжёлый и можно ли его поделить на ту часть, которая быстрая и которую можно поместить в «колбэк», и на ту часть, которая медленная и которую нужно поместить в main, а ещё дополнительно выделить ту часть, которая совсем тяжёлая и вынести её вообще в отдельную DLL, либо вообще в отдельный процесс... это всё отдельная задача проектирования, которую нужно решать и понимать конечную цель всех решений архитектурных.

В документации по Lua дают наиболее общую схему с очередью событий из «колбеков» и обработкой её в main, которая медленная, но не вешает Quik, и поэтому подойдёт большинству начинающих роботописателей. Поэтому она и даётся как пример.

Цитата
Ирина написал:
Все "глобальные" функции, кот. вызывает "колбэк", тоже выполняются в основном потоке терминала?
Да.
Страницы: Пред. 1 2 3 4 5 6 7 След.
Наверх