Постов с тегом "LUA": 341

LUA


У кого есть Lua .

    • 20 апреля 2020, 08:29
    • |
    • McDuck
  • Еще
Здравствуйте народ. Хотел спросить может у кого есть Lua скрипт работающий по пересечению индикатором нулевой зоны гистограммой, который можно подключить через идентификатор в QUIK.  Либо чтобы открывались сделки по данным скрипта qpl по перевесу (дельте) оборота сделок. Скрипт прилагаю, в нем подсчитывается объем.  
Написание скрипта тоже рассмотрю, пишите в личку.  
PORTFOLIO_EX LUK;
DESCRIPTION Объёмы купли/продажи за интервал;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST FIRMID;

PROGRAM

'Автор:  Михаил Булычев
'Что делает:
'   подсчитывается объёмы купли\продажи по определённому инструменту за 
'   заданный интервал   
'Как использовать:
'  В следующих строках следует указать код бумаги и код класса для 
'  отслеживаемого инструмента

'=============================НАСТРОЙКИ===============================
SecCode="LKOH" '  Код инструмента
ClassCode="TQBR" 'Код класса
interv=3600 'является интервалом в секундах
razn = 0 'смещение часового пояса относительно времени торговой системы. 
'=============================НАСТРОЙКИ===============================


FUNC is_in_interval(interval, trade_time, sys_time, hour_shift)
  csys_time_value=0
  c_time_value=0
  csys_time_value =0 + (0 + get_value(sys_time, "Hour") + hour_shift)*3600 + _
                    get_value(sys_time, "Min")*60 + _
                    get_value(sys_time, "Sec")
  c_time_value=0 + ((0 + substr("" & trade_time, 0, 2)) * 3600) + ((0 + substr("" & trade_time, 2, 2)) * 60) + ((0 + substr("" & trade_time, 4, 2)))

csys_time_value = csys_time_value + 0
c_time_value = c_time_value + 0

k=csys_time_value - c_time_value

if k <= interval
    result=1
  else
    result=0
  end if
END FUNC

  buy_value=0
  sell_value=0
  total_value=0
  sys_time = GET_DATETIME()
  delete_all_items() 
  mString=create_map()
  


  j=0
  n=get_number_of("ALL_TRADES")
  for i from 0 to n
    mTrade=get_item("ALL_TRADES", n-i)
    trade_time=get_value(mTrade, "TIME")
    if (get_value(mTrade, "SECCODE")= SecCode) AND (get_value(mTrade, "CLASSCODE")= ClassCode)
      if is_in_interval(interv, trade_time, sys_time, 0-razn) = 1
        value=0+get_value(mTrade, "VALUE")
        j=j+1
        if (get_value(mTrade, "OPERATION") = "BUY")
          buy_value=buy_value+value    
        else
          sell_value=sell_value+value      
        end if
        total_value=total_value+value
      else
        break
      end if
    end if    
  end for
  mString=set_value(mString, "vol", total_value)
  mString=set_value(mString, "volbuy", buy_value)
  mString=set_value(mString, "volsell", sell_value)
  add_item(1, mString)
END_PROGRAM

PARAMETER vol;
PARAMETER_TITLE vol;
PARAMETER_DESCRIPTION Купили;
PARAMETER_TYPE NUMERIC(10,0);
END
PARAMETER volbuy;
PARAMETER_TITLE volbuy;
PARAMETER_DESCRIPTION Купили;
PARAMETER_TYPE NUMERIC(10,0);
END
PARAMETER volsell;
PARAMETER_TITLE volsell;
PARAMETER_DESCRIPTION Продали;
PARAMETER_TYPE NUMERIC(10,0);
END
END_PORTFOLIO_EX
  • обсудить на форуме:
  • Quik Lua

Open Source : Lua - MatLab Connector (3)



Краткое описание :

Библиотека Matlab2Lua  позволяет интегрировать Lua скрипты и Маtrix Laboratory Engine.


Полное описание :

Библиотека позволяет Lua и Матлаб обмениваться данными при помощи функций :

lua variable = Get( string Matlab varname );  — получение переменной из среды матлаб по имени, поддерживаются Double Array, Cell Array of Strings, Double Value, Integer Value, String Value. Возвращает -1 в случае неудачи.

int Eval ( string MatlabСommand ) — передает команду в MatLab Command Line, в качестве переменной типа string; возвращает -1 в случае неудачи, и 1 в случае успеха.

int PutVal( string Name, string/number Value) — передает в Матлаб значение Value типа string или number под именем Name. 1- успех, -1 — неудача.

int PutDouble( string Name, table T) — передает в Матлаб под именем Name таблицу Луа, заполненную численными значениями. Ответ — аналогичный.

int PutCell( string Name, table T)  — передает в Матлаб под именем Name таблицу Луа, заполненную строковыми или численными значениями, подлежащими преобразованию в строки. Ответ — аналогичный.


( Читать дальше )
  • обсудить на форуме:
  • Quik Lua

Скрипт lua Баланс покупок/продаж

Всем привет. Переделал первоначальную версию скрипта. Исправил некоторые ошибки и немного расширил функционал. Теперь скрипт может сохранять данные в текстовый файл, который потом можно анализировать в другой программе (например exсel). Также, в отличии от первого варианта, скрипт показывает в таблице усредненную цену, по которой прошли сделки. В первом варианте отображалась цена последней сделки. И в скрипте добавлен показ накопленной дельты за все время пока скрипт работает.

TICER = "SBER";
CLASS_CODE = "TQBR";
FilePath = getScriptPath() .. "\\export.txt";--путь к файлу
save = false;--сохранять данные в файл если false нет, true да

f = nil;
stopped = false;
t_id = nil
H = -1;
M = -1;
VSELL = 0;
VBUY  = 0;
CDelta = 0;
CountTrans = 0;
PriceTrans = 0.0; 
t = "";
function OnInit()
    CountTrans = 0;
        if save then f = io.open(FilePath,"w"); end
        CreateTable();
end 

function main() 
        while not stopped do 
          if IsWindowClosed(t_id) then
         stopped = true;
      end       
          sleep(10);
        end
end

function CreateTable()
   t_id = AllocTable(); 
   AddColumn(t_id, 0, "Время", true, QTABLE_STRING_TYPE, 10);
   AddColumn(t_id, 1, "BUY", true, QTABLE_INT_TYPE, 10);
   AddColumn(t_id, 2, "SELL", true, QTABLE_INT_TYPE, 10);
   AddColumn(t_id, 3, "Дельта V", true, QTABLE_INT_TYPE, 10);   
   AddColumn(t_id, 4, "AVG Цена", true, QTABLE_DOUBLE_TYPE, 15);
   AddColumn(t_id, 5, "Накопленная Дельта", true, QTABLE_INT_TYPE, 15);
   AddColumn(t_id, 6, "Кол-во сделок", true, QTABLE_DOUBLE_TYPE, 12);   
   tab = CreateWindow(t_id);
   local NAME = tostring(getParamEx(CLASS_CODE,TICER,"LONGNAME").param_image);
   SetWindowCaption(t_id, TICER.." ("..NAME..") Баланс покупок/продаж");
   SetTableNotificationCallback(t_id, EventCallBack);
end

function Calc(alltrade)
        if bit.test(alltrade.flags, 0) then VSELL = VSELL+alltrade.qty;  --Продажа
        else VBUY  = VBUY+alltrade.qty;  end                            
        CountTrans = CountTrans+1;
        PriceTrans = PriceTrans+alltrade.price;                 
end

function OnAllTrade(alltrade)    
        if alltrade.sec_code == TICER then      
                local Rows, Col = GetTableSize(t_id);
                
                if H==-1 or H~= alltrade.datetime.hour then 
                        H = alltrade.datetime.hour;
                        M = alltrade.datetime.min;
                        t = tostring(alltrade.datetime.hour)..":"..tostring(alltrade.datetime.min);
                end
                if M==alltrade.datetime.min then
                        Calc(alltrade);
                else                                    
                M=alltrade.datetime.min;        
                        InsertRow(t_id, -1);                                               
                        local Delta = VBUY-VSELL;
                        Price = PriceTrans/CountTrans;
                        SetCell(t_id, Rows, 6, tostring(CountTrans));                   
                        SetCell(t_id, Rows, 0, t);
                        SetCell(t_id, Rows, 1, tostring(VBUY));
                        SetCell(t_id, Rows, 2, tostring(VSELL));                           
                        SetCell(t_id, Rows, 3, tostring(Delta));
                        local SEC_SCALE = tostring(getParamEx(CLASS_CODE,TICER,"SEC_SCALE").param_value);
                        SEC_SCALE = string.format("%.0f",SEC_SCALE);                    
                        SetCell(t_id, Rows, 4, string.format("%."..SEC_SCALE.."f", tostring(Price)));
                   if Rows>=2 then
                           local OldPrice = tonumber(GetCell(t_id,Rows-1,4).image);
                           if OldPrice>Price then 
                                        Red(Rows,4); 
                           else 
                                        Green(Rows,4);
                           end
                           CDelta = tonumber(GetCell(t_id,Rows-1,5).image);
                           CDelta = CDelta + Delta;                        
                        else 
                          CDelta = Delta;
                        end
                        SetCell(t_id, Rows, 5, tostring(CDelta));
                    if Delta<0 then Red(Rows,3); end
                    if Delta>0 then Green(Rows,3); end
                    if CDelta<0 then Red(Rows,5); end
                    if CDelta>0 then Green(Rows,5); end                                                   
                   if save then
                                local Str = tostring(H)..";"..tostring(M)..";"..tostring(VBUY)..";"..tostring(VSELL)..";"
                                                ..tostring(Delta)..";"..tostring(Price)..";"..tostring(CDelta);
                           Str=Str.."\n";
                           SaveFile(Str);
                        end
                t = tostring(alltrade.datetime.hour)..":"..tostring(alltrade.datetime.min);                        
                    VBUY = 0;VSELL = 0;
                        PriceTrans = 0;
                        CountTrans = 0;
                        Calc(alltrade);
                end
        end --if alltrade.sec_code == TICER then        
end

function SaveFile(Str)
        if f ~= nil then 
                f:write(Str);           
                f:flush();                               
        end
end

function Red(row,col)
        SetColor(t_id, row, col, RGB(255,0,0), RGB(0,0,0), RGB(255,0,0), RGB(0,0,0));
end
function Yellow(row,col)
        SetColor(t_id, row, col, RGB(240,240,0), RGB(0,0,0), RGB(240,240,0), RGB(0,0,0));
end
function Green(row,col)
        SetColor(t_id, row, col, RGB(0,200,0), RGB(0,0,0), RGB(0,200,0), RGB(0,0,0));
end


function EventCallBack(t_id, msg, par1, par2)
   if msg==QTABLE_CLOSE then
     OnStop();
   end;
end

function OnStop(s)
  if f ~= nil then f:close(); end
  if t_id ~= nil then
    DestroyTable (t_id);
  end;
  stopped = true;
end




Досужие размышления о Quik, Lua и Python.

    • 28 марта 2020, 16:03
    • |
    • 3Qu
  • Еще

Я уже писал, что у меня сделана C++ DLL, которая получает данные из Lua и пишет их в БД SQLite. Уже писал также, что DLL под Lua делается на раз, и даже приводил коды и шаблон проекта простенькой C++ DLL. Посмотрело несколько тысяч, скачало, аж 12 человек, применят от силы двое. КПД постов, прямо скажем, оч низкий.)

В DLL реализована как связь с Lua, и будет реализована сама стратегия, вот только не решил какая из них. Повторять старые стратегии на новой для меня платформе Quik уже неинтересно, а новых моделей АТС отработано уже несколько. Все моделируется в Python. Часть стратегий не требует сложной математики, и могут быть легко перенесены непосредственно на С++. Другие непосредственно в DLL перенесены быть не могут, т.к. используют пакеты Python — всяческие регрессии и машинное обучение.
В общем, получилось, что DLL является шаблоном для любой стратегии. Все необходимые для АТС данные доступны АТС — реал-тайм данные поступают в DLL непосредственно из терминала, а необходимая история пишется DLL в БД SQLite и читается АТС из базы данных.



( Читать дальше )

Скрипт lua читающий таблицу обезличенных сделок.

Всем привет. Может кому пригодится. Скрипт читает ленту сделок и раз в минуту подсчитывает разницу между покупками и продажами. Часть кода нашел в интернете часть кода написал сам. Не знаю может уже есть что то подобное. Цель была не написать что то оригинальное, а наработать навыки программирования на lua.

( Читать дальше )
  • обсудить на форуме:
  • QUIK

Алготрейдинг, Quik и Visual Studio 2017.

    • 24 марта 2020, 14:04
    • |
    • 3Qu
  • Еще
Делаю новую алгоритмическую торговую систему (АТС) под Quik. Базовой в системе является достаточно сложная многопоточная C++ DLL, связывающаяся с Quik через Lua. Для разработки с самого начала использовалась VS 2015. Т.к. в настоящее время перешел на х64 Quik занялся перекомпиляций всего своего х86 софта под Quik на платформу х64.
Все бы ничего, но при больших рыночных потоках данных Quik начинал подтормаживать, а при подключении DDL, Quik подтормаживал еще сильнее и через некоторое время падал вместе с DLL. Переход на х64 существенно улучшил ситуацию, Однако эпизодические падения, значительно реже, но продолжались.
Надо сказать, что все эти многопоточности и были ранее введены в DLL для снижения нагрузки на Quik, чтобы не грузить поток событий терминала. Вся обработка событий заключалась лишь в том, чтобы преобразовать данные получаемые из Lua и отдать их соответствующему потоку для дальнейшей обработки.
В общем, о стабильной АТС приходилось только мечтать, и думать что дальше с этим делать.
У меня на компе давно без дела пылилась Visual Studio 2017. Требований к железу она предъявляет больше чем VS 2015, и я ее использовал считанные разы, скорее, чтобы посмотреть что в ней нового и отличия от VS 2015. Существенных отличий не заметил, и продолжал работать на старой VS 2015.

( Читать дальше )
  • обсудить на форуме:
  • QUIK

Переход на 64-бит Quik. Пляски с DLL. 2.

    • 22 марта 2020, 18:00
    • |
    • 3Qu
  • Еще

Не далее как вчера опубликовал топик "Смена x86 Quik 7.27.2.1 на x64 Quik 8.4.1.6. Пляски вокруг DLL", где кратко рассказывалось как перекомпилировать проект С++ с платформы х86 на х64. Надеюсь, что у вас все уже получилось или получится.
Но я «крутой» программист, и, естественно, у меня вначале вообще ничего и никак не получалось. А так как проект большой, да еще и непонятно в чем дело, а своими экспериментами я могу вообще все испортить, то решил сделать маленькую простенькую DLL LuaProba.dll, на ней отработать переход на х64, и потом перенести это в большой проект.
Привожу код С++ DLL целиком:

// LuaProba.cpp: определяет экспортированные функции для приложения DLL.
//

#include "stdafx.h"
#include <stdio.h>
#include <string.h>

//=== Необходимые для Lua константы ============================================================================//
#define LUA_LIB
#define LUA_BUILD_AS_DLL

//=== Заголовочные файлы LUA ===================================================================================//
extern "C" {
#include "Lua\lua.h"
#include "Lua/lauxlib.h"
}

static int forLua_TestFunc(lua_State *L) // Возвращает заданный текст
{
        const char *cc = "Привет из C/C++ и от меня 2 раза"; //str.c_str();
        lua_pushstring(L, cc);
        return(1);
}

//= == Регистрация реализованных в dll функций, чтобы они стали "видимы" для Lua == == == == == == == == == == == == == == == ==//
static struct luaL_reg ls_lib[] =
{
        { "TestFunc", forLua_TestFunc },
        { NULL, NULL }
};

//=== Регистрация названия библиотеки, видимого в скрипте Lua ==================================================//
extern "C" LUALIB_API int luaopen_LuaProba(lua_State *L)
{
        luaL_openlib(L, "LuaProba", ls_lib, 0);
        return 0;
}
Весь проект DLL для VS 2015 можно скачать по ссылке - 

( Читать дальше )
  • обсудить на форуме:
  • QUIK

Смена x86 Quik 7.27.2.1 на x64 Quik 8.4.1.6. Пляски вокруг DLL.

    • 21 марта 2020, 19:30
    • |
    • 3Qu
  • Еще

Признаться уже достал этот 32-битный Quik 7. Работать стало почти невозможно, начал подвисать практически на пустом месте. А если повесить на Quik Lua, а к Lua прицепить DLL, то вообще все эпизодически вставало. DLL-ки, вообще-то, многопоточные и освобождают вызывающие потоки (события) Lua практически за миллисекунды, но если таких событий много Quik встает. Хотя, он и без Lua и DLL тоже регулярно встает.)

Были и другие причины ухода от 32-бит Quik, но это уже связано с брокером и другими факторами.
Итак, новый брокер — новый 64-битный Quik 8.4.1.6. Наконец сбылась мечта идиота!
Что можно сказать, — х64 Quik работает гораздо лучше, все равно временами немного подвисает, но, вроде, некритично. После логин-пароля, прежде чем работать надо подождать, — потоки обезличенных сделок начинают работать только через 3-4 минуты после старта. В общем, с этим все более-менее ОК.
Следующий этап — надо переводить весь подключаемый к Quik софт с х86 на х64, и если есть исходники, то никаких проблем не должно появиться. Если вы не используете в своем софте каких либо дополнительных DLL, то все должно ограничиваться двумя действиями.
1. Меняете в проекте С++ в разделе Файлы ресурсов 32-битную версию файла Lua5.1.lib на 64-битную версию Lua5.1.lib,
2. Выставляете в свой свойствах проекта компиляцию в x64. Можно даже так:



( Читать дальше )

Почему я не продолжаю тему "Quik->Lua->C++ DLL".

    • 02 марта 2020, 20:12
    • |
    • 3Qu
  • Еще
Посмотрите на тематику сайта последние 2-3 недели — коронавирус, кризис — уже наступил, или еще только собирается, покупать или продавать, обсуждение падения, от все пропала до мы еще о-го-го, и счас как отскочим в небеса.
До каких-то Lua, DLL и автоторговли сейчас нет никому никакого дела. Кто сейчас это будет читать, когда и в более спокойные времена читали лишь немногие. Писать просто так не хочется, писать для себя — мне это тоже не нужно.
В общем, решил подождать с этой темой до лучших, более спокойных, времен. А там посмотрим, м.б. высохнет, и само отвалится.
  • обсудить на форуме:
  • Quik Lua

....все тэги
UPDONW
Новый дизайн