-- Настроечные параметры скрипта
TRADE_ACC = "123" -- торговый счет
CLIENT_CODE = "321" -- код клиента
SEC = "PIKK" -- Код инструмента
CLASS = "TQBR" -- Код класса
percent = 1 -- Желаемый процент профита
portfolio = 1 -- Количество лотов для покупки
uniq_trans_id = 0x18000 -- Уникальный идентификатор транзакции.
Block_sell_Case = 1 -- Если в портфеле есть акции, то
-- 1 - Запрещаем роботу их продавать при запуске
-- 0 - Робот выставляет все, что еще не в продаже в заявки при старте. Цена расчитывается с учетом percent
-- Конец настроечных параметров скрипта
-- Переменные в скрипте
security_info = getSecurityInfo(CLASS, SEC)
NAME = security_info.short_name -- Инструмент
PRICE_STEP = security_info.min_price_step -- шаг цены по инструменту
PRICE_SCALE = security_info.scale -- точность задания цены инструмента
LOT_SIZE = security_info.lot_size -- Размер лота
Open = 0 -- Цена окрытия свечи
High = 0 -- Максимум свечи
Low = 0 -- Минимум свечи
Close = 0 -- Цена закрытия свечи
Volume = 0 -- Объем свечи
Order = 0 -- Заявка
Case = 0 -- Текущее количество в портфеле
buy_price = 0 -- Цена покупки
sell_price = 0 -- Цена продажи
Total = 0 -- Итого, руб.
Date_Time = 0
Total_perc = 0 -- Итого, %
average_price = 0 -- средняя цена покупки.
block_sell = 0 -- Стоят на продаже.
stopped = false -- Признак работы или остановки скрипта.
cur_state = "" -- Текущее состояние робота.
-- "" ничего не куплено, не продано, не ожидаем.
-- "e_buy" ждем подтверждения, заявка выставлена
-- "e_sell" ждем подтверждения, заявка выставлена
-- "confirm_buy" ждем покупки по подтвержденной заявке
-- "confirm_sell" ждем продажи по подтвержденной заявке
-- "buy" купили
-- "sell" продали
-- "buy_kill" отмена заявки на покупку
-- "sell_kill" отмена заявки на продажу
t_id = 0
cur_order = 1
-- Работаем с битовыми флагами.
order_stat = 0 -- Статус заявки.
mask_bits = 7 -- Выделяем нужные биты из всех
-- 0 - Заявка исполнена
-- 1 - Заявка активна, иначе - не активна.
-- 2 - Заявка снята.
-- 3 -
-- 4 -
function OnStop(s)
stopped = true -- Скрипт остановлен закрытием таблицы или нажатием кнопки "Остановить"
DestroyTable(t_id) -- Закрываем таблицу
message("Скрипт остановлен пользователем, робот отключен")
end
function OnInit()
local NO = getNumberOf("orders")
Column_Table = { -- Создаем список колонок таблицы.function() return end
{"Инструмент",QTABLE_STRING_TYPE,15,function() return NAME end},
{"Шаг цены",QTABLE_DOUBLE_TYPE, 12,function() return tostring(PRICE_STEP) end},
{"Точность",QTABLE_INT_TYPE, 12,function() return tostring (PRICE_SCALE) end},
{"Заявка", QTABLE_STRING_TYPE, 10,function() return tostring(Order) end},
{"Портфель", QTABLE_INT_TYPE, 10,function() return tostring(Case) end},
{"Цена покупки", QTABLE_DOUBLE_TYPE, 15,function() return tostring(buy_price * LOT_SIZE) end},
{"Цена продажи", QTABLE_DOUBLE_TYPE, 15,function() return tostring(sell_price * LOT_SIZE) end},
{"Итого", QTABLE_DOUBLE_TYPE, 15,function() return tostring(Total) end},
{"Дата время", QTABLE_DOUBLE_TYPE, 15,function() return tostring(Date_Time) end},
{"Статус", QTABLE_STRING_TYPE, 10,function() return tostring(cur_state) end},
}
t_id = Table_init(Column_Table) -- Создаем таблицу и добавляем колонки.
-- File_Write()
end;
function main()
while not stopped do
if IsWindowClosed(t_id) then -- Если пользователь закрыл таблицу
stopped = true -- Стопим скрипт
message("Таблица закрыта пользователем, робот остановлен", 1)
end
Table_row(cur_order)
sleep(500)
end
end
function File_Write()
f = io.open(getScriptPath().."\\Robot\\log\\" .. SEC .. ".lua","r+"); -- Пытается открыть файл в режиме "чтения/записи"
message("Пытаюсь открыть файл \\Robot\\log\\" .. SEC .. ".lua")
if f == nil then -- Если файл не существует
message("Файл не существует!")
f = io.open(getScriptPath().."\\Robot\\log\\" .. SEC .. ".lua","w"); -- Создает файл в режиме "записи"
f:close(); -- Закрывает файл
f = io.open(getScriptPath().."\\Robot\\log\\" .. SEC .. ".lua","r+"); -- Открывает уже существующий файл в режиме "чтения/записи"
message("Файл создан!")
local i = 0
for i=1,#Column_Table,1 do -- Если файл не существует, то заполняем заголовок таблицы.
f:write(Column_Table[i][1])
f:write(string.rep(" ", Column_Table[i][3] - string.len(Column_Table[i][1]) - 2) .. "|" .. " ")
--f:write("\t")
end
f:write("\n")
end;
-- Встает в начало файла
-- 1-ым параметром задается относительно чего будет смещение:
-- "set" - начало, "cur" - текущая позиция, "end" - конец файла
-- 2-ым параметром задается смещение
f:seek("end",0);
for i=1,#Column_Table,1 do -- Если файл не существует, то заполняем заголовок таблицы.
f:write(Column_Table[i][4]())
f:write(string.rep(" ", Column_Table[i][3] - string.len(Column_Table[i][4]()) - 2) .. "|" .. " ")
end
f:write("\n")
f:flush() -- Сохраняет изменения в файле
f:close() -- Закрывает файл
-- f:write("Line1\nLine2"); -- Записывает в файл 2 строки, "\n" признак конца строки
-- for line in f:lines() do message(tostring(line));end -- Перебирает строки файла, выводит их содержимое в сообщениях
end
-- Инициализация таблицы
function Table_init(t)
-- Создаем таблицу и присваиваем имена столбцов из переданного массива t.
local i = 0
local Table = AllocTable()
for i=1,#t,1 do -- Перебираем массив по строкам от первой до последней. Количество строк массива получаем #t
AddColumn(Table, i, t[i][1], true, t[i][2], t[i][3])
end
CreateWindow(Table)
SetWindowCaption(Table, "Рабочая таблица робота " .. NAME)
-- SetWindowPos(Table, 0, 10, 2500, 200)
InsertRow(Table, -1)
return Table
end
-- Заполнение строки таблицы
function Table_row(row, color)
local i = 0
for i=1,#Column_Table,1 do
SetCell(t_id,row,i,Column_Table[i][4]())
end
end
function Add_row()
InsertRow(t_id, cur_order)
end