Скрипт показывает текущий профит Вашей опционной позиции. Запишите свои позиции в код скрипта или в файл состояния - profit. Данный файл сформируется (если включить, а потом выключить скрипт) в той же директории где лежит скрипт.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 | -- Текущий профит Class_Fut = "SPBFUT"; -- Класс фьючерса Sec_Fut = "SRZ5"; -- Код фьючерса Class_Opt = "SPBOPT"; -- Класс опциона Step_Strike = 250; -- Шаг страйка Commission = 2.25; -- Комиссия (биржа + брокер за 1-у торговую операцию по 1-му лоту) -- Call Sec_C1 = ""; -- Код опциона в 1 позиции Sec_C2 = ""; -- Код опциона в 2 позиции Sec_C3 = ""; -- Код опциона в 3 позиции Sec_C4 = ""; -- Код опциона в 4 позиции Volume_C1 = 0; -- Объем 1 позиции Volume_C2 = 0; -- Объем 2 позиции Volume_C3 = 0; -- Объем 3 позиции Volume_C4 = 0; -- Объем 4 позиции Open_C1 = 0; -- Цена открытия 1 позиции Open_C2 = 0; -- Цена открытия 2 позиции Open_C3 = 0; -- Цена открытия 3 позиции Open_C4 = 0; -- Цена открытия 4 позиции -- Put Sec_P1 = ""; -- Код опциона в 1 позиции Sec_P2 = ""; -- Код опциона в 2 позиции Sec_P3 = ""; -- Код опциона в 3 позиции Sec_P4 = ""; -- Код опциона в 4 позиции Volume_P1 = 1; -- Объем 1 позиции Volume_P2 = 1; -- Объем 2 позиции Volume_P3 = 0; -- Объем 3 позиции Volume_P4 = 0; -- Объем 4 позиции Open_P1 = 0; -- Цена открытия 1 позиции Open_P2 = 0; -- Цена открытия 2 позиции Open_P3 = 0; -- Цена открытия 3 позиции Open_P4 = 0; -- Цена открытия 4 позиции -- Константы для строк таблицы Call = 1; -- Наименование "Call" и текущая цена фьючерса (bid) Call_1 = 2; -- Позиция 1 (код опциона, объем, цена, профит) Call_2 = 3; -- Позиция 2 (код опциона, объем, цена, профит) Call_3 = 4; -- Позиция 3 (код опциона, объем, цена, профит) Call_4 = 5; -- Позиция 4 (код опциона, объем, цена, профит) Itogo_C = 6; -- Текущий профит Call -- 7; -- Пустая строка Put = 8; -- Наименование "Put" Put_1 = 9; -- Позиция 1 (код опциона, объем, цена, профит) Put_2 = 10; -- Позиция 2 (код опциона, объем, цена, профит) Put_3 = 11; -- Позиция 3 (код опциона, объем, цена, профит) Put_4 = 12; -- Позиция 4 (код опциона, объем, цена, профит) Itogo_P = 13; -- Текущий профит Put -- 14; -- Пустая строка Itogo_CP = 15; -- Текущий профит Call + Put IsRun = true; -- Флаг поддержания работы скрипта function OnInit() -- Функция вызывается терминалом QUIK перед вызовом функции main() local f = io.open(getScriptPath().."//profit.txt","r+"); -- Пытается открыть файл состояния в режиме "чтения/записи" if f ~= nil then -- Если файл существует, перебирает строки файла, считывает содержимое в соответствующие переменные local Count = 0; -- Счетчик строк for line in f:lines() do Count = Count + 1; if Count == 1 then Sec_C1 = line; -- Код опциона в 1 позиции elseif Count == 2 then Sec_C2 = line; -- Код опциона в 2 позиции elseif Count == 3 then Sec_C3 = line; -- Код опциона в 3 позиции elseif Count == 4 then Sec_C4 = line; -- Код опциона в 4 позиции elseif Count == 5 then Volume_C1 = tonumber(line); -- Объем 1 позиции elseif Count == 6 then Volume_C2 = tonumber(line); -- Объем 2 позиции elseif Count == 7 then Volume_C3 = tonumber(line); -- Объем 3 позиции elseif Count == 8 then Volume_C4 = tonumber(line); -- Объем 4 позиции elseif Count == 9 then Open_C1 = tonumber(line); -- Цена открытия 1 позиции elseif Count == 10 then Open_C2 = tonumber(line); -- Цена открытия 2 позиции elseif Count == 11 then Open_C3 = tonumber(line); -- Цена открытия 3 позиции elseif Count == 12 then Open_C4 = tonumber(line); -- Цена открытия 4 позиции elseif Count == 13 then Sec_P1 = line; -- Код опциона в 1 позиции elseif Count == 14 then Sec_P2 = line; -- Код опциона в 2 позиции elseif Count == 15 then Sec_P3 = line; -- Код опциона в 3 позиции elseif Count == 16 then Sec_P4 = line; -- Код опциона в 4 позиции elseif Count == 17 then Volume_P1 = tonumber(line); -- Объем 1 позиции elseif Count == 18 then Volume_P2 = tonumber(line); -- Объем 2 позиции elseif Count == 19 then Volume_P3 = tonumber(line); -- Объем 3 позиции elseif Count == 20 then Volume_P4 = tonumber(line); -- Объем 4 позиции elseif Count == 21 then Open_P1 = tonumber(line); -- Цена открытия 1 позиции elseif Count == 22 then Open_P2 = tonumber(line); -- Цена открытия 2 позиции elseif Count == 23 then Open_P3 = tonumber(line); -- Цена открытия 3 позиции elseif Count == 24 then Open_P4 = tonumber(line); -- Цена открытия 4 позиции end; end; f:close(); -- Закрывает файл end; CreateTable(); -- Создает таблицу end; function main() -- Функция, реализующая основной поток выполнения в скрипте while IsRun do -- Цикл будет выполнятся, пока IsRun == true Price = tonumber(getParamEx(Class_Fut, Sec_Fut, "bid").param_value); -- Текущая цена фьючерса SetCell(t_id, Call, 2, tostring(Price)); -- Выводит "Текущая цена фьючерса" в таблицу sleep(100); end; end; function CreateTable() -- Функция создает таблицу t_id = AllocTable(); -- Получает доступный id для создания -- Добавляет колонки AddColumn(t_id, 0, "Инструмент", true, QTABLE_STRING_TYPE, 15); AddColumn(t_id, 1, "Позиция", true, QTABLE_INT_TYPE, 15); AddColumn(t_id, 2, "Цена", true, QTABLE_INT_TYPE, 15); AddColumn(t_id, 3, "Профит", true, QTABLE_INT_TYPE, 15); t = CreateWindow(t_id); -- Создает таблицу SetWindowCaption(t_id, "Текущий профит"); -- Устанавливает заголовок SetWindowPos(t_id, 600, 0, 355, 310); -- Задает положение и размеры окна таблицы -- Добавляет строки InsertRow(t_id, Call); InsertRow(t_id, Call_1); InsertRow(t_id, Call_2); InsertRow(t_id, Call_3); InsertRow(t_id, Call_4); InsertRow(t_id, Itogo_C); InsertRow(t_id, 7); -- Пустая строка InsertRow(t_id, Put); InsertRow(t_id, Put_1); InsertRow(t_id, Put_2); InsertRow(t_id, Put_3); InsertRow(t_id, Put_4); InsertRow(t_id, Itogo_P); InsertRow(t_id, 14); -- Пустая строка InsertRow(t_id, Itogo_CP); -- Добавляет значения в ячейки SetCell(t_id, Call, 0, "Call"); Green(Call, 0); SetCell(t_id, Call_1, 0, Sec_C1); SetCell(t_id, Call_1, 1, tostring(Volume_C1)); SetCell(t_id, Call_1, 2, tostring(Open_C1)); SetCell(t_id, Call_1, 3, tostring(0)); SetCell(t_id, Call_2, 0, Sec_C2); SetCell(t_id, Call_2, 1, tostring(Volume_C2)); SetCell(t_id, Call_2, 2, tostring(Open_C2)); SetCell(t_id, Call_2, 3, tostring(0)); SetCell(t_id, Call_3, 0, Sec_C3); SetCell(t_id, Call_3, 1, tostring(Volume_C3)); SetCell(t_id, Call_3, 2, tostring(Open_C3)); SetCell(t_id, Call_3, 3, tostring(0)); SetCell(t_id, Call_4, 0, Sec_C4); SetCell(t_id, Call_4, 1, tostring(Volume_C4)); SetCell(t_id, Call_4, 2, tostring(Open_C4)); SetCell(t_id, Call_4, 3, tostring(0)); SetCell(t_id, Itogo_C, 0, "Итого Call"); SetCell(t_id, Itogo_C, 3, tostring(0)); SetCell(t_id, Put, 0, "Put"); Red(Put, 0); SetCell(t_id, Put_1, 0, Sec_P1); SetCell(t_id, Put_1, 1, tostring(Volume_P1)); SetCell(t_id, Put_1, 2, tostring(Open_P1)); SetCell(t_id, Put_1, 3, tostring(0)); SetCell(t_id, Put_2, 0, Sec_P2); SetCell(t_id, Put_2, 1, tostring(Volume_P2)); SetCell(t_id, Put_2, 2, tostring(Open_P2)); SetCell(t_id, Put_2, 3, tostring(0)); SetCell(t_id, Put_3, 0, Sec_P3); SetCell(t_id, Put_3, 1, tostring(Volume_P3)); SetCell(t_id, Put_3, 2, tostring(Open_P3)); SetCell(t_id, Put_3, 3, tostring(0)); SetCell(t_id, Put_4, 0, Sec_P4); SetCell(t_id, Put_4, 1, tostring(Volume_P4)); SetCell(t_id, Put_4, 2, tostring(Open_P4)); SetCell(t_id, Put_4, 3, tostring(0)); SetCell(t_id, Itogo_P, 0, "Итого Put"); SetCell(t_id, Itogo_P, 3, tostring(0)); SetCell(t_id, Itogo_CP, 0, "Итого C+P"); SetCell(t_id, Itogo_CP, 3, tostring(0)); end; -- Функции по раскраске строк/ячеек таблицы function Green(Line, Col) -- Зеленый if Col == nil then Col = QTABLE_NO_INDEX; end; -- Если индекс столбца не указан, окрашивает всю строку SetColor(t_id, Line, Col, RGB(165,227,128), RGB(0,0,0), RGB(165,227,128), RGB(0,0,0)); end; function Gray(Line, Col) -- Серый if Col == nil then Col = QTABLE_NO_INDEX; end; SetColor(t_id, Line, Col, RGB(200,200,200), RGB(0,0,0), RGB(200,200,200), RGB(0,0,0)); end; function Red(Line, Col) -- Красный if Col == nil then Col = QTABLE_NO_INDEX; end; SetColor(t_id, Line, Col, RGB(255,168,164), RGB(0,0,0), RGB(255,168,164), RGB(0,0,0)); end; function OnParam(class, sec) -- Функция вызывается терминалом QUIK при изменении текущих параметров if class == Class_Opt then -- Если скрипт в позиции по опционам и изменение пришло по этому опциону if sec == Sec_C1 then if Volume_C1 > 0 then local Bid = tonumber(getParamEx(Class_Opt, Sec_C1, "bid").param_value); -- Получает текущий bid по опциону local Profit = (Bid - Open_C1) * math.abs(Volume_C1) - Commission * 2 * math.abs(Volume_C1); -- Считает текущий профит по опционной позиции SetCell(t_id, Call_1, 3, tostring(Profit)); -- Выводит значение в таблицу if Profit > 0 then Green(Call_1); elseif Profit == 0 then Gray(Call_1); else Red(Call_1); end; -- Окрашивает строку в зависимости от профита end; if Volume_C1 < 0 then local Offer = tonumber(getParamEx(Class_Opt, Sec_C1, "offer").param_value); -- Получает текущий offer по опциону local Profit = (Open_C1 - Offer) * math.abs(Volume_C1) - Commission * 2 * math.abs(Volume_C1); -- Считает текущий профит по опционной позиции SetCell(t_id, Call_1, 3, tostring(Profit)); -- Выводит значение в таблицу if Profit > 0 then Green(Call_1); elseif Profit == 0 then Gray(Call_1); else Red(Call_1); end; -- Окрашивает строку в зависимости от профита end; end; if sec == Sec_C2 then if Volume_C2 > 0 then local Bid = tonumber(getParamEx(Class_Opt, Sec_C2, "bid").param_value); local Profit = (Bid - Open_C2) * math.abs(Volume_C2) - Commission * 2 * math.abs(Volume_C2); SetCell(t_id, Call_2, 3, tostring(Profit)); if Profit > 0 then Green(Call_2); elseif Profit == 0 then Gray(Call_2); else Red(Call_2); end; end; if Volume_C2 < 0 then local Offer = tonumber(getParamEx(Class_Opt, Sec_C2, "offer").param_value); local Profit = (Open_C2 - Offer) * math.abs(Volume_C2) - Commission * 2 * math.abs(Volume_C2); SetCell(t_id, Call_2, 3, tostring(Profit)); if Profit > 0 then Green(Call_2); elseif Profit == 0 then Gray(Call_2); else Red(Call_2); end; end; end; if sec == Sec_C3 then if Volume_C3 > 0 then local Bid = tonumber(getParamEx(Class_Opt, Sec_C3, "bid").param_value); local Profit = (Bid - Open_C3) * math.abs(Volume_C3) - Commission * 2 * math.abs(Volume_C3); SetCell(t_id, Call_3, 3, tostring(Profit)); if Profit > 0 then Green(Call_3); elseif Profit == 0 then Gray(Call_3); else Red(Call_3); end; end; if Volume_C3 < 0 then local Offer = tonumber(getParamEx(Class_Opt, Sec_C3, "offer").param_value); local Profit = (Open_C3 - Offer) * math.abs(Volume_C3) - Commission * 2 * math.abs(Volume_C3); SetCell(t_id, Call_3, 3, tostring(Profit)); if Profit > 0 then Green(Call_3); elseif Profit == 0 then Gray(Call_3); else Red(Call_3); end; end; end; if sec == Sec_C4 then if Volume_C4 > 0 then local Bid = tonumber(getParamEx(Class_Opt, Sec_C4, "bid").param_value); local Profit = (Bid - Open_C4) * math.abs(Volume_C4) - Commission * 2 * math.abs(Volume_C4); SetCell(t_id, Call_4, 3, tostring(Profit)); if Profit > 0 then Green(Call_4); elseif Profit == 0 then Gray(Call_4); else Red(Call_4); end; end; if Volume_C4 < 0 then local Offer = tonumber(getParamEx(Class_Opt, Sec_C4, "offer").param_value); local Profit = (Open_C4 - Offer) * math.abs(Volume_C4) - Commission * 2 * math.abs(Volume_C4); SetCell(t_id, Call_4, 3, tostring(Profit)); if Profit > 0 then Green(Call_4); elseif Profit == 0 then Gray(Call_4); else Red(Call_4); end; end; end; local ProfitCall = tonumber(GetCell(t_id, Call_1, 3).image) + tonumber(GetCell(t_id, Call_2, 3).image) + tonumber(GetCell(t_id, Call_3, 3).image) + tonumber(GetCell(t_id, Call_4, 3).image); -- Общий текущий профит Call SetCell(t_id, Itogo_C, 3, tostring(ProfitCall)); if ProfitCall > 0 then Green(Itogo_C); elseif ProfitCall == 0 then Gray(Itogo_C); else Red(Itogo_C); end; if sec == Sec_P1 then if Volume_P1 > 0 then local Bid = tonumber(getParamEx(Class_Opt, Sec_P1, "bid").param_value); local Profit = (Bid - Open_P1) * math.abs(Volume_P1) - Commission * 2 * math.abs(Volume_P1); SetCell(t_id, Put_1, 3, tostring(Profit)); if Profit > 0 then Green(Put_1); elseif Profit == 0 then Gray(Put_1); else Red(Put_1); end; end; if Volume_P1 < 0 then local Offer = tonumber(getParamEx(Class_Opt, Sec_P1, "offer").param_value); local Profit = (Open_P1 - Offer) * math.abs(Volume_P1) - Commission * 2 * math.abs(Volume_P1); SetCell(t_id, Put_1, 3, tostring(Profit)); if Profit > 0 then Green(Put_1); elseif Profit == 0 then Gray(Put_1); else Red(Put_1); end; end; end; if sec == Sec_P2 then if Volume_P2 > 0 then local Bid = tonumber(getParamEx(Class_Opt, Sec_P2, "bid").param_value); local Profit = (Bid - Open_P2) * math.abs(Volume_P2) - Commission * 2 * math.abs(Volume_P2); SetCell(t_id, Put_2, 3, tostring(Profit)); if Profit > 0 then Green(Put_2); elseif Profit == 0 then Gray(Put_2); else Red(Put_2); end; end; if Volume_P2 < 0 then local Offer = tonumber(getParamEx(Class_Opt, Sec_P2, "offer").param_value); local Profit = (Open_P2 - Offer) * math.abs(Volume_P2) - Commission * 2 * math.abs(Volume_P2); SetCell(t_id, Put_2, 3, tostring(Profit)); if Profit > 0 then Green(Put_2); elseif Profit == 0 then Gray(Put_2); else Red(Put_2); end; end; end; if sec == Sec_P3 then if Volume_P3 > 0 then local Bid = tonumber(getParamEx(Class_Opt, Sec_P3, "bid").param_value); local Profit = (Bid - Open_P3) * math.abs(Volume_P3) - Commission * 2 * math.abs(Volume_P3); SetCell(t_id, Put_3, 3, tostring(Profit)); if Profit > 0 then Green(Put_3); elseif Profit == 0 then Gray(Put_3); else Red(Put_3); end; end; if Volume_P3 < 0 then local Offer = tonumber(getParamEx(Class_Opt, Sec_P3, "offer").param_value); local Profit = (Open_P3 - Offer) * math.abs(Volume_P3) - Commission * 2 * math.abs(Volume_P3); SetCell(t_id, Put_3, 3, tostring(Profit)); if Profit > 0 then Green(Put_3); elseif Profit == 0 then Gray(Put_3); else Red(Put_3); end; end; end; if sec == Sec_P4 then if Volume_P4 > 0 then local Bid = tonumber(getParamEx(Class_Opt, Sec_P4, "bid").param_value); local Profit = (Bid - Open_P4) * math.abs(Volume_P4) - Commission * 2 * math.abs(Volume_P4); SetCell(t_id, Put_4, 3, tostring(Profit)); if Profit > 0 then Green(Put_4); elseif Profit == 0 then Gray(Put_4); else Red(Put_4); end; end; if Volume_P4 < 0 then local Offer = tonumber(getParamEx(Class_Opt, Sec_P4, "offer").param_value); local Profit = (Open_P4 - Offer) * math.abs(Volume_P4) - Commission * 2 * math.abs(Volume_P4); SetCell(t_id, Put_4, 3, tostring(Profit)); if Profit > 0 then Green(Put_4); elseif Profit == 0 then Gray(Put_4); else Red(Put_4); end; end; end; local ProfitPut = tonumber(GetCell(t_id, Put_1, 3).image) + tonumber(GetCell(t_id, Put_2, 3).image) + tonumber(GetCell(t_id, Put_3, 3).image) + tonumber(GetCell(t_id, Put_4, 3).image); -- Общий текущий профит Put SetCell(t_id, Itogo_P, 3, tostring(ProfitPut)); if ProfitPut > 0 then Green(Itogo_P); elseif ProfitPut == 0 then Gray(Itogo_P); else Red(Itogo_P); end; local ProfitCP = tonumber(GetCell(t_id, Itogo_C, 3).image) + tonumber(GetCell(t_id, Itogo_P, 3).image); -- Общий текущий профит Call + Put SetCell(t_id, Itogo_CP, 3, tostring(ProfitCP)); if ProfitCP > 0 then Green(Itogo_CP); elseif ProfitCP == 0 then Gray(Itogo_CP); else Red(Itogo_CP); end; end; end; function OnStop() -- Функция вызывается терминалом QUIK при остановке скрипта из диалога управления -- Сохранение текущего состояния в файл local f = io.open(getScriptPath().."//profit.txt","r+"); -- Пытается открыть файл в режиме "чтения/записи" if f == nil then -- Если файл не существует f = io.open(getScriptPath().."//profit.txt","w"); -- Создает файл в режиме "записи" f:close(); -- Закрывает файл f = io.open(getScriptPath().."//profit.txt","r+"); -- Открывает уже существующий файл в режиме "чтения/записи" end; -- Записывает в файл текущие состояния (каждое значение в новой строке) f:write(Sec_C1.."\n"); -- Код опциона в 1 позиции f:write(Sec_C2.."\n"); -- Код опциона в 2 позиции f:write(Sec_C3.."\n"); -- Код опциона в 3 позиции f:write(Sec_C4.."\n"); -- Код опциона в 4 позиции f:write(tostring(Volume_C1).."\n"); -- Объем 1 позиции f:write(tostring(Volume_C2).."\n"); -- Объем 2 позиции f:write(tostring(Volume_C3).."\n"); -- Объем 3 позиции f:write(tostring(Volume_C4).."\n"); -- Объем 4 позиции f:write(tostring(Open_C1).."\n"); -- Цена открытия 1 позиции f:write(tostring(Open_C2).."\n"); -- Цена открытия 2 позиции f:write(tostring(Open_C3).."\n"); -- Цена открытия 3 позиции f:write(tostring(Open_C4).."\n"); -- Цена открытия 4 позиции f:write(Sec_P1.."\n"); -- Код опциона в 1 позиции f:write(Sec_P2.."\n"); -- Код опциона в 2 позиции f:write(Sec_P3.."\n"); -- Код опциона в 3 позиции f:write(Sec_P4.."\n"); -- Код опциона в 4 позиции f:write(tostring(Volume_P1).."\n"); -- Объем 1 позиции f:write(tostring(Volume_P2).."\n"); -- Объем 2 позиции f:write(tostring(Volume_P3).."\n"); -- Объем 3 позиции f:write(tostring(Volume_P4).."\n"); -- Объем 4 позиции f:write(tostring(Open_P1).."\n"); -- Цена открытия 1 позиции f:write(tostring(Open_P2).."\n"); -- Цена открытия 2 позиции f:write(tostring(Open_P3).."\n"); -- Цена открытия 3 позиции f:write(tostring(Open_P4).."\n"); -- Цена открытия 4 позиции f:flush(); -- Сохраняет изменения в файле f:close(); -- Закрывает файл IsRun = false; end; |
-- Текущий профит Class_Fut = "SPBFUT"; -- Класс фьючерса Sec_Fut = "SRZ5"; -- Код фьючерса Class_Opt = "SPBOPT"; -- Класс опциона Step_Strike = 250; -- Шаг страйка Commission = 2.25; -- Комиссия (биржа + брокер за 1-у торговую операцию по 1-му лоту) -- Call Sec_C1 = ""; -- Код опциона в 1 позиции Sec_C2 = ""; -- Код опциона в 2 позиции Sec_C3 = ""; -- Код опциона в 3 позиции Sec_C4 = ""; -- Код опциона в 4 позиции Volume_C1 = 0; -- Объем 1 позиции Volume_C2 = 0; -- Объем 2 позиции Volume_C3 = 0; -- Объем 3 позиции Volume_C4 = 0; -- Объем 4 позиции Open_C1 = 0; -- Цена открытия 1 позиции Open_C2 = 0; -- Цена открытия 2 позиции Open_C3 = 0; -- Цена открытия 3 позиции Open_C4 = 0; -- Цена открытия 4 позиции -- Put Sec_P1 = ""; -- Код опциона в 1 позиции Sec_P2 = ""; -- Код опциона в 2 позиции Sec_P3 = ""; -- Код опциона в 3 позиции Sec_P4 = ""; -- Код опциона в 4 позиции Volume_P1 = 1; -- Объем 1 позиции Volume_P2 = 1; -- Объем 2 позиции Volume_P3 = 0; -- Объем 3 позиции Volume_P4 = 0; -- Объем 4 позиции Open_P1 = 0; -- Цена открытия 1 позиции Open_P2 = 0; -- Цена открытия 2 позиции Open_P3 = 0; -- Цена открытия 3 позиции Open_P4 = 0; -- Цена открытия 4 позиции -- Константы для строк таблицы Call = 1; -- Наименование "Call" и текущая цена фьючерса (bid) Call_1 = 2; -- Позиция 1 (код опциона, объем, цена, профит) Call_2 = 3; -- Позиция 2 (код опциона, объем, цена, профит) Call_3 = 4; -- Позиция 3 (код опциона, объем, цена, профит) Call_4 = 5; -- Позиция 4 (код опциона, объем, цена, профит) Itogo_C = 6; -- Текущий профит Call -- 7; -- Пустая строка Put = 8; -- Наименование "Put" Put_1 = 9; -- Позиция 1 (код опциона, объем, цена, профит) Put_2 = 10; -- Позиция 2 (код опциона, объем, цена, профит) Put_3 = 11; -- Позиция 3 (код опциона, объем, цена, профит) Put_4 = 12; -- Позиция 4 (код опциона, объем, цена, профит) Itogo_P = 13; -- Текущий профит Put -- 14; -- Пустая строка Itogo_CP = 15; -- Текущий профит Call + Put IsRun = true; -- Флаг поддержания работы скрипта function OnInit() -- Функция вызывается терминалом QUIK перед вызовом функции main() local f = io.open(getScriptPath().."//profit.txt","r+"); -- Пытается открыть файл состояния в режиме "чтения/записи" if f ~= nil then -- Если файл существует, перебирает строки файла, считывает содержимое в соответствующие переменные local Count = 0; -- Счетчик строк for line in f:lines() do Count = Count + 1; if Count == 1 then Sec_C1 = line; -- Код опциона в 1 позиции elseif Count == 2 then Sec_C2 = line; -- Код опциона в 2 позиции elseif Count == 3 then Sec_C3 = line; -- Код опциона в 3 позиции elseif Count == 4 then Sec_C4 = line; -- Код опциона в 4 позиции elseif Count == 5 then Volume_C1 = tonumber(line); -- Объем 1 позиции elseif Count == 6 then Volume_C2 = tonumber(line); -- Объем 2 позиции elseif Count == 7 then Volume_C3 = tonumber(line); -- Объем 3 позиции elseif Count == 8 then Volume_C4 = tonumber(line); -- Объем 4 позиции elseif Count == 9 then Open_C1 = tonumber(line); -- Цена открытия 1 позиции elseif Count == 10 then Open_C2 = tonumber(line); -- Цена открытия 2 позиции elseif Count == 11 then Open_C3 = tonumber(line); -- Цена открытия 3 позиции elseif Count == 12 then Open_C4 = tonumber(line); -- Цена открытия 4 позиции elseif Count == 13 then Sec_P1 = line; -- Код опциона в 1 позиции elseif Count == 14 then Sec_P2 = line; -- Код опциона в 2 позиции elseif Count == 15 then Sec_P3 = line; -- Код опциона в 3 позиции elseif Count == 16 then Sec_P4 = line; -- Код опциона в 4 позиции elseif Count == 17 then Volume_P1 = tonumber(line); -- Объем 1 позиции elseif Count == 18 then Volume_P2 = tonumber(line); -- Объем 2 позиции elseif Count == 19 then Volume_P3 = tonumber(line); -- Объем 3 позиции elseif Count == 20 then Volume_P4 = tonumber(line); -- Объем 4 позиции elseif Count == 21 then Open_P1 = tonumber(line); -- Цена открытия 1 позиции elseif Count == 22 then Open_P2 = tonumber(line); -- Цена открытия 2 позиции elseif Count == 23 then Open_P3 = tonumber(line); -- Цена открытия 3 позиции elseif Count == 24 then Open_P4 = tonumber(line); -- Цена открытия 4 позиции end; end; f:close(); -- Закрывает файл end; CreateTable(); -- Создает таблицу end; function main() -- Функция, реализующая основной поток выполнения в скрипте while IsRun do -- Цикл будет выполнятся, пока IsRun == true Price = tonumber(getParamEx(Class_Fut, Sec_Fut, "bid").param_value); -- Текущая цена фьючерса SetCell(t_id, Call, 2, tostring(Price)); -- Выводит "Текущая цена фьючерса" в таблицу sleep(100); end; end; function CreateTable() -- Функция создает таблицу t_id = AllocTable(); -- Получает доступный id для создания -- Добавляет колонки AddColumn(t_id, 0, "Инструмент", true, QTABLE_STRING_TYPE, 15); AddColumn(t_id, 1, "Позиция", true, QTABLE_INT_TYPE, 15); AddColumn(t_id, 2, "Цена", true, QTABLE_INT_TYPE, 15); AddColumn(t_id, 3, "Профит", true, QTABLE_INT_TYPE, 15); t = CreateWindow(t_id); -- Создает таблицу SetWindowCaption(t_id, "Текущий профит"); -- Устанавливает заголовок SetWindowPos(t_id, 600, 0, 355, 310); -- Задает положение и размеры окна таблицы -- Добавляет строки InsertRow(t_id, Call); InsertRow(t_id, Call_1); InsertRow(t_id, Call_2); InsertRow(t_id, Call_3); InsertRow(t_id, Call_4); InsertRow(t_id, Itogo_C); InsertRow(t_id, 7); -- Пустая строка InsertRow(t_id, Put); InsertRow(t_id, Put_1); InsertRow(t_id, Put_2); InsertRow(t_id, Put_3); InsertRow(t_id, Put_4); InsertRow(t_id, Itogo_P); InsertRow(t_id, 14); -- Пустая строка InsertRow(t_id, Itogo_CP); -- Добавляет значения в ячейки SetCell(t_id, Call, 0, "Call"); Green(Call, 0); SetCell(t_id, Call_1, 0, Sec_C1); SetCell(t_id, Call_1, 1, tostring(Volume_C1)); SetCell(t_id, Call_1, 2, tostring(Open_C1)); SetCell(t_id, Call_1, 3, tostring(0)); SetCell(t_id, Call_2, 0, Sec_C2); SetCell(t_id, Call_2, 1, tostring(Volume_C2)); SetCell(t_id, Call_2, 2, tostring(Open_C2)); SetCell(t_id, Call_2, 3, tostring(0)); SetCell(t_id, Call_3, 0, Sec_C3); SetCell(t_id, Call_3, 1, tostring(Volume_C3)); SetCell(t_id, Call_3, 2, tostring(Open_C3)); SetCell(t_id, Call_3, 3, tostring(0)); SetCell(t_id, Call_4, 0, Sec_C4); SetCell(t_id, Call_4, 1, tostring(Volume_C4)); SetCell(t_id, Call_4, 2, tostring(Open_C4)); SetCell(t_id, Call_4, 3, tostring(0)); SetCell(t_id, Itogo_C, 0, "Итого Call"); SetCell(t_id, Itogo_C, 3, tostring(0)); SetCell(t_id, Put, 0, "Put"); Red(Put, 0); SetCell(t_id, Put_1, 0, Sec_P1); SetCell(t_id, Put_1, 1, tostring(Volume_P1)); SetCell(t_id, Put_1, 2, tostring(Open_P1)); SetCell(t_id, Put_1, 3, tostring(0)); SetCell(t_id, Put_2, 0, Sec_P2); SetCell(t_id, Put_2, 1, tostring(Volume_P2)); SetCell(t_id, Put_2, 2, tostring(Open_P2)); SetCell(t_id, Put_2, 3, tostring(0)); SetCell(t_id, Put_3, 0, Sec_P3); SetCell(t_id, Put_3, 1, tostring(Volume_P3)); SetCell(t_id, Put_3, 2, tostring(Open_P3)); SetCell(t_id, Put_3, 3, tostring(0)); SetCell(t_id, Put_4, 0, Sec_P4); SetCell(t_id, Put_4, 1, tostring(Volume_P4)); SetCell(t_id, Put_4, 2, tostring(Open_P4)); SetCell(t_id, Put_4, 3, tostring(0)); SetCell(t_id, Itogo_P, 0, "Итого Put"); SetCell(t_id, Itogo_P, 3, tostring(0)); SetCell(t_id, Itogo_CP, 0, "Итого C+P"); SetCell(t_id, Itogo_CP, 3, tostring(0)); end; -- Функции по раскраске строк/ячеек таблицы function Green(Line, Col) -- Зеленый if Col == nil then Col = QTABLE_NO_INDEX; end; -- Если индекс столбца не указан, окрашивает всю строку SetColor(t_id, Line, Col, RGB(165,227,128), RGB(0,0,0), RGB(165,227,128), RGB(0,0,0)); end; function Gray(Line, Col) -- Серый if Col == nil then Col = QTABLE_NO_INDEX; end; SetColor(t_id, Line, Col, RGB(200,200,200), RGB(0,0,0), RGB(200,200,200), RGB(0,0,0)); end; function Red(Line, Col) -- Красный if Col == nil then Col = QTABLE_NO_INDEX; end; SetColor(t_id, Line, Col, RGB(255,168,164), RGB(0,0,0), RGB(255,168,164), RGB(0,0,0)); end; function OnParam(class, sec) -- Функция вызывается терминалом QUIK при изменении текущих параметров if class == Class_Opt then -- Если скрипт в позиции по опционам и изменение пришло по этому опциону if sec == Sec_C1 then if Volume_C1 > 0 then local Bid = tonumber(getParamEx(Class_Opt, Sec_C1, "bid").param_value); -- Получает текущий bid по опциону local Profit = (Bid - Open_C1) * math.abs(Volume_C1) - Commission * 2 * math.abs(Volume_C1); -- Считает текущий профит по опционной позиции SetCell(t_id, Call_1, 3, tostring(Profit)); -- Выводит значение в таблицу if Profit > 0 then Green(Call_1); elseif Profit == 0 then Gray(Call_1); else Red(Call_1); end; -- Окрашивает строку в зависимости от профита end; if Volume_C1 < 0 then local Offer = tonumber(getParamEx(Class_Opt, Sec_C1, "offer").param_value); -- Получает текущий offer по опциону local Profit = (Open_C1 - Offer) * math.abs(Volume_C1) - Commission * 2 * math.abs(Volume_C1); -- Считает текущий профит по опционной позиции SetCell(t_id, Call_1, 3, tostring(Profit)); -- Выводит значение в таблицу if Profit > 0 then Green(Call_1); elseif Profit == 0 then Gray(Call_1); else Red(Call_1); end; -- Окрашивает строку в зависимости от профита end; end; if sec == Sec_C2 then if Volume_C2 > 0 then local Bid = tonumber(getParamEx(Class_Opt, Sec_C2, "bid").param_value); local Profit = (Bid - Open_C2) * math.abs(Volume_C2) - Commission * 2 * math.abs(Volume_C2); SetCell(t_id, Call_2, 3, tostring(Profit)); if Profit > 0 then Green(Call_2); elseif Profit == 0 then Gray(Call_2); else Red(Call_2); end; end; if Volume_C2 < 0 then local Offer = tonumber(getParamEx(Class_Opt, Sec_C2, "offer").param_value); local Profit = (Open_C2 - Offer) * math.abs(Volume_C2) - Commission * 2 * math.abs(Volume_C2); SetCell(t_id, Call_2, 3, tostring(Profit)); if Profit > 0 then Green(Call_2); elseif Profit == 0 then Gray(Call_2); else Red(Call_2); end; end; end; if sec == Sec_C3 then if Volume_C3 > 0 then local Bid = tonumber(getParamEx(Class_Opt, Sec_C3, "bid").param_value); local Profit = (Bid - Open_C3) * math.abs(Volume_C3) - Commission * 2 * math.abs(Volume_C3); SetCell(t_id, Call_3, 3, tostring(Profit)); if Profit > 0 then Green(Call_3); elseif Profit == 0 then Gray(Call_3); else Red(Call_3); end; end; if Volume_C3 < 0 then local Offer = tonumber(getParamEx(Class_Opt, Sec_C3, "offer").param_value); local Profit = (Open_C3 - Offer) * math.abs(Volume_C3) - Commission * 2 * math.abs(Volume_C3); SetCell(t_id, Call_3, 3, tostring(Profit)); if Profit > 0 then Green(Call_3); elseif Profit == 0 then Gray(Call_3); else Red(Call_3); end; end; end; if sec == Sec_C4 then if Volume_C4 > 0 then local Bid = tonumber(getParamEx(Class_Opt, Sec_C4, "bid").param_value); local Profit = (Bid - Open_C4) * math.abs(Volume_C4) - Commission * 2 * math.abs(Volume_C4); SetCell(t_id, Call_4, 3, tostring(Profit)); if Profit > 0 then Green(Call_4); elseif Profit == 0 then Gray(Call_4); else Red(Call_4); end; end; if Volume_C4 < 0 then local Offer = tonumber(getParamEx(Class_Opt, Sec_C4, "offer").param_value); local Profit = (Open_C4 - Offer) * math.abs(Volume_C4) - Commission * 2 * math.abs(Volume_C4); SetCell(t_id, Call_4, 3, tostring(Profit)); if Profit > 0 then Green(Call_4); elseif Profit == 0 then Gray(Call_4); else Red(Call_4); end; end; end; local ProfitCall = tonumber(GetCell(t_id, Call_1, 3).image) + tonumber(GetCell(t_id, Call_2, 3).image) + tonumber(GetCell(t_id, Call_3, 3).image) + tonumber(GetCell(t_id, Call_4, 3).image); -- Общий текущий профит Call SetCell(t_id, Itogo_C, 3, tostring(ProfitCall)); if ProfitCall > 0 then Green(Itogo_C); elseif ProfitCall == 0 then Gray(Itogo_C); else Red(Itogo_C); end; if sec == Sec_P1 then if Volume_P1 > 0 then local Bid = tonumber(getParamEx(Class_Opt, Sec_P1, "bid").param_value); local Profit = (Bid - Open_P1) * math.abs(Volume_P1) - Commission * 2 * math.abs(Volume_P1); SetCell(t_id, Put_1, 3, tostring(Profit)); if Profit > 0 then Green(Put_1); elseif Profit == 0 then Gray(Put_1); else Red(Put_1); end; end; if Volume_P1 < 0 then local Offer = tonumber(getParamEx(Class_Opt, Sec_P1, "offer").param_value); local Profit = (Open_P1 - Offer) * math.abs(Volume_P1) - Commission * 2 * math.abs(Volume_P1); SetCell(t_id, Put_1, 3, tostring(Profit)); if Profit > 0 then Green(Put_1); elseif Profit == 0 then Gray(Put_1); else Red(Put_1); end; end; end; if sec == Sec_P2 then if Volume_P2 > 0 then local Bid = tonumber(getParamEx(Class_Opt, Sec_P2, "bid").param_value); local Profit = (Bid - Open_P2) * math.abs(Volume_P2) - Commission * 2 * math.abs(Volume_P2); SetCell(t_id, Put_2, 3, tostring(Profit)); if Profit > 0 then Green(Put_2); elseif Profit == 0 then Gray(Put_2); else Red(Put_2); end; end; if Volume_P2 < 0 then local Offer = tonumber(getParamEx(Class_Opt, Sec_P2, "offer").param_value); local Profit = (Open_P2 - Offer) * math.abs(Volume_P2) - Commission * 2 * math.abs(Volume_P2); SetCell(t_id, Put_2, 3, tostring(Profit)); if Profit > 0 then Green(Put_2); elseif Profit == 0 then Gray(Put_2); else Red(Put_2); end; end; end; if sec == Sec_P3 then if Volume_P3 > 0 then local Bid = tonumber(getParamEx(Class_Opt, Sec_P3, "bid").param_value); local Profit = (Bid - Open_P3) * math.abs(Volume_P3) - Commission * 2 * math.abs(Volume_P3); SetCell(t_id, Put_3, 3, tostring(Profit)); if Profit > 0 then Green(Put_3); elseif Profit == 0 then Gray(Put_3); else Red(Put_3); end; end; if Volume_P3 < 0 then local Offer = tonumber(getParamEx(Class_Opt, Sec_P3, "offer").param_value); local Profit = (Open_P3 - Offer) * math.abs(Volume_P3) - Commission * 2 * math.abs(Volume_P3); SetCell(t_id, Put_3, 3, tostring(Profit)); if Profit > 0 then Green(Put_3); elseif Profit == 0 then Gray(Put_3); else Red(Put_3); end; end; end; if sec == Sec_P4 then if Volume_P4 > 0 then local Bid = tonumber(getParamEx(Class_Opt, Sec_P4, "bid").param_value); local Profit = (Bid - Open_P4) * math.abs(Volume_P4) - Commission * 2 * math.abs(Volume_P4); SetCell(t_id, Put_4, 3, tostring(Profit)); if Profit > 0 then Green(Put_4); elseif Profit == 0 then Gray(Put_4); else Red(Put_4); end; end; if Volume_P4 < 0 then local Offer = tonumber(getParamEx(Class_Opt, Sec_P4, "offer").param_value); local Profit = (Open_P4 - Offer) * math.abs(Volume_P4) - Commission * 2 * math.abs(Volume_P4); SetCell(t_id, Put_4, 3, tostring(Profit)); if Profit > 0 then Green(Put_4); elseif Profit == 0 then Gray(Put_4); else Red(Put_4); end; end; end; local ProfitPut = tonumber(GetCell(t_id, Put_1, 3).image) + tonumber(GetCell(t_id, Put_2, 3).image) + tonumber(GetCell(t_id, Put_3, 3).image) + tonumber(GetCell(t_id, Put_4, 3).image); -- Общий текущий профит Put SetCell(t_id, Itogo_P, 3, tostring(ProfitPut)); if ProfitPut > 0 then Green(Itogo_P); elseif ProfitPut == 0 then Gray(Itogo_P); else Red(Itogo_P); end; local ProfitCP = tonumber(GetCell(t_id, Itogo_C, 3).image) + tonumber(GetCell(t_id, Itogo_P, 3).image); -- Общий текущий профит Call + Put SetCell(t_id, Itogo_CP, 3, tostring(ProfitCP)); if ProfitCP > 0 then Green(Itogo_CP); elseif ProfitCP == 0 then Gray(Itogo_CP); else Red(Itogo_CP); end; end; end; function OnStop() -- Функция вызывается терминалом QUIK при остановке скрипта из диалога управления -- Сохранение текущего состояния в файл local f = io.open(getScriptPath().."//profit.txt","r+"); -- Пытается открыть файл в режиме "чтения/записи" if f == nil then -- Если файл не существует f = io.open(getScriptPath().."//profit.txt","w"); -- Создает файл в режиме "записи" f:close(); -- Закрывает файл f = io.open(getScriptPath().."//profit.txt","r+"); -- Открывает уже существующий файл в режиме "чтения/записи" end; -- Записывает в файл текущие состояния (каждое значение в новой строке) f:write(Sec_C1.."\n"); -- Код опциона в 1 позиции f:write(Sec_C2.."\n"); -- Код опциона в 2 позиции f:write(Sec_C3.."\n"); -- Код опциона в 3 позиции f:write(Sec_C4.."\n"); -- Код опциона в 4 позиции f:write(tostring(Volume_C1).."\n"); -- Объем 1 позиции f:write(tostring(Volume_C2).."\n"); -- Объем 2 позиции f:write(tostring(Volume_C3).."\n"); -- Объем 3 позиции f:write(tostring(Volume_C4).."\n"); -- Объем 4 позиции f:write(tostring(Open_C1).."\n"); -- Цена открытия 1 позиции f:write(tostring(Open_C2).."\n"); -- Цена открытия 2 позиции f:write(tostring(Open_C3).."\n"); -- Цена открытия 3 позиции f:write(tostring(Open_C4).."\n"); -- Цена открытия 4 позиции f:write(Sec_P1.."\n"); -- Код опциона в 1 позиции f:write(Sec_P2.."\n"); -- Код опциона в 2 позиции f:write(Sec_P3.."\n"); -- Код опциона в 3 позиции f:write(Sec_P4.."\n"); -- Код опциона в 4 позиции f:write(tostring(Volume_P1).."\n"); -- Объем 1 позиции f:write(tostring(Volume_P2).."\n"); -- Объем 2 позиции f:write(tostring(Volume_P3).."\n"); -- Объем 3 позиции f:write(tostring(Volume_P4).."\n"); -- Объем 4 позиции f:write(tostring(Open_P1).."\n"); -- Цена открытия 1 позиции f:write(tostring(Open_P2).."\n"); -- Цена открытия 2 позиции f:write(tostring(Open_P3).."\n"); -- Цена открытия 3 позиции f:write(tostring(Open_P4).."\n"); -- Цена открытия 4 позиции f:flush(); -- Сохраняет изменения в файле f:close(); -- Закрывает файл IsRun = false; end;
Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!