Самый простой, по сути код. Но Lua выдаёт ошибку при компилировании без function main(), при том что Quik выполняет этот код без конструкции main или function. Раньше такой ошибки не было.message(«a»)
------------------------------Output------------------------------
>lua -e «io.stdout:setvbuf 'no'» «a.lua»
lua: a.lua:1: attempt to call global 'message' (a nil value)
stack traceback:
a.lua:1: in main chunk
[C]: ?
>Exit code: 1
Собираюсь пока поторговать его руками, чтобы окончательно убедиться в его работоспособности и потому, что еще не программировал на Lua вообще и для «квика» в частности.
Внутридневная торговля с минимальной просадкой (для желающих могу посчитать отдельно). До 10 сделок в день. Хорошо подходит для одного класса инструментов и плохо — для других, что является косвенным показателем жизнеспособности. Почему так происходит — мне тоже понятно.
Алгоритм без заглядывания в будущее и мартингейла. Ниже результаты бэктеста за пять лет. Конечно же, в идеальных условиях: без проскальзываний и комиссий брокера и биржи. Без реинвестирования прибыли.
Выручка от торгов BTC/USD с осени 2016 года:

Фьючерс S&P500 с начала 2015 года, когда он стоил 2055 пунктов:

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
Возможности новой версии
1. Реализован функционал быстрого фильтра в таблицах. Для активации \ деактивации быстрого фильтра используется пункт «Включить быстрый фильтр» \ «Выключить быстрый фильтр» контекстного меню, открываемого для заголовка самого левого столбца таблицы. Данный функционал позволяет фильтровать информацию в таблицах QUIK с наглядным отображением критериев фильтрации.

void lua_pushnumber (lua_State *L, lua_Number n);
const char *lua_pushstring (lua_State *L, const char *s);
lua_Number lua_tonumber (lua_State *L, int index);
const char *lua_tostring (lua_State *L, int index);где L — указатель Lua-стэка, а index — абсолютный или относительный индекс переменной в стэке.
Признаться уже достал этот 32-битный Quik 7. Работать стало почти невозможно, начал подвисать практически на пустом месте. А если повесить на Quik Lua, а к Lua прицепить DLL, то вообще все эпизодически вставало. DLL-ки, вообще-то, многопоточные и освобождают вызывающие потоки (события) Lua практически за миллисекунды, но если таких событий много Quik встает. Хотя, он и без Lua и DLL тоже регулярно встает.)
Были и другие причины ухода от 32-бит Quik, но это уже связано с брокером.
Итак, новый брокер — новый 64-битный Quik 8.4.1.6. Наконец сбылась мечта идиота!
Что можно сказать, — х64 Quik работает гораздо лучше, все равно временами немного подвисает, но, вроде, некритично. После логин-пароля, прежде чем работать надо подождать, — потоки обезличенных сделок начинают работать только через 3-4 минуты после старта. В общем, с этим все более-менее ОК.
Следующий этап — надо переводить весь софт с х86 на х64, и если есть исходники, то никаких проблем не должно появиться. Если вы не используете в своем софте каких либо дополнительных DLL, то все должно ограничиваться двумя действиями.
1. Меняете в проекте С++ в разделе Файлы ресурсов 32-битную версию файла Lua5.1.lib на 64-битную версию Lua5.1.lib,
2. Выставляете в свой свойствах проекта компиляцию в x64. Можно даже так:
Начал вчера работы по реализации "Брошенной стратегии". Хорошо когда есть наработки: взял готовые куски кода, немного доработал под новые нужды, соединил их вместе и уже все готово — почти все необходимые данные передаются в DLL, расставляются по местам и готовы к использованию. С этим почти закончено, остальное будет делаться по ходу пьесы, и по мере необходимости.
С передачей данных закончено, а стратегия даже не начиналась. Система новая и архитектора системы пока не ясна, есть несколько вариантов, выбрать из которых не так просто.
Пока суд, да дело, решил написать о передаче данных из Quik в С++DLL.
О том как сделать простую С++DLL для работы с Quik-Lua написано на сайте https://quikluacsharp.ru здесь и о передаче данных из Lua — здесь и в других материалах сайта. Наверняка многие из вас все это видели и знают, а некоторые это даже применяют. Я это все не использую, не очень разбирался, но, тем не менее, сам сайт
На самом деле для построения роботов все эти действия абсолютно не нужны. Поэтому, собственно, таких возможностей и не предусмотрено.
Практически со 100% вероятности то что вам необходимо, делается другими способами, которые являются документированными и стандартными.
Здравствуйте, коллеги!
ВОПРОС:
можно ли средствами только QLUA (не открывая окон редактирования настроек графика) менять настройки и параметры графика цен?
Нужно управлять:
1. идентификатором инструмента (например, заменить SRZ9 на SRH0 в определенный момент времени),
2. назначением имён линий графика (линия цен, линия индикатора) на подобие тех, что устанавливаются в окне «Редактирование настроек графика».
Eugene Bright,
1. Нет
2. Нет
И такой же ответ на остальные вопросы из этой серии.