Скрипт торгует опционами виртуально. При первом запуске открываем позицию "бабочка" или "кондор" зависит от настроек (если Start_Call = Start_Put - бабочка если Start_Call > Start_Put - кондор)
Стратегия: если цена фьючерса выше BU_1 (безубыток 1-й Call позиции), то закрываем крыло Call и открываем новое с большими страйками, если цена выше Start_Call, но ниже BU_2 - Step_Strike - закрываем крыло Call и открываем с меньшими страйками. Аналогично для Put только в другую сторону.
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 | Class_Fut = "SPBFUT" -- Класс фьючерса Sec_Fut = "SRH6" -- Код фьючерса Class_Opt = "SPBOPT" -- Класс опциона Sec_Call = "SR10000BA6" -- Код опциона Call Sec_Put = "SR10000BM6" -- Код опциона Put Start_Call = 10250 -- 1-й BU_2 - ниже него, крыло Call не открываем, выше можно Start_Put = 10250 -- 1-й BU_3 - выше него, крыло Put не открываем, ниже можно Step_Strike = 250 -- Шаг страйка Lots = 1 -- Лот Commission = 2.25 -- Комиссия (биржа + брокер за 1-у торговую операцию по 1-му лоту) Sec_1 = "" -- Call код 1 позиции Sec_2 = "" -- Call код 2 позиции Sec_3 = "" -- Put код 3 позиции Sec_4 = "" -- Put код 4 позиции Volume_1 = 0 -- Объем 1 позиции Volume_2 = 0 -- Объем 2 позиции Volume_3 = 0 -- Объем 3 позиции Volume_4 = 0 -- Объем 4 позиции Open_1 = 0 -- Цена открытия 1 позиции Open_2 = 0 -- Цена открытия 2 позиции Open_3 = 0 -- Цена открытия 3 позиции Open_4 = 0 -- Цена открытия 4 позиции BU_1 = 0 -- Безубыток 1 позиции BU_2 = 0 -- Безубыток 2 позиции BU_3 = 0 -- Безубыток 3 позиции BU_4 = 0 -- Безубыток 4 позиции All_Profit = 0 -- Общий заработанный профит -- Константы для строк таблицы Pos_1 = 1 -- Позиция 1 (Call, код, объем, цена, профит, безубыток, прибыль/убыток) Pos_2 = 2 -- Позиция 2 (Call, код, объем, цена, профит, безубыток, прибыль/убыток) Pos_3 = 3 -- Позиция 3 (Put, код, объем, цена, профит, безубыток) Pos_4 = 4 -- Позиция 4 (Put, код, объем, цена, профит, безубыток, прибыль/убыток) Total = 5 -- Профит Call + Put + заработанный профит, заработанный профит, Call + Put IsRun = true -- Флаг поддержания работы скрипта function OnInit() -- Функция вызывается терминалом QUIK перед вызовом функции main() local f = io.open(getScriptPath().."//Condor V.txt","r+") -- Пытается открыть файл состояния в режиме "чтения/записи" if f ~= nil then -- Если файл существует, перебирает строки файла, считывает содержимое в соответствующие переменные local Count = 0 -- Счетчик строк for line in f:lines() do Count = Count + 1 if Count == 1 then Sec_1 = line -- Call код 1 позиции elseif Count == 2 then Sec_2 = line -- Call код 2 позиции elseif Count == 3 then Sec_3 = line -- Put код 3 позиции elseif Count == 4 then Sec_4 = line -- Put код 4 позиции elseif Count == 5 then Volume_1 = tonumber(line) -- Объем 1 позиции elseif Count == 6 then Volume_2 = tonumber(line) -- Объем 2 позиции elseif Count == 7 then Volume_3 = tonumber(line) -- Объем 3 позиции elseif Count == 8 then Volume_4 = tonumber(line) -- Объем 4 позиции elseif Count == 9 then Open_1 = tonumber(line) -- Цена открытия 1 позиции elseif Count == 10 then Open_2 = tonumber(line) -- Цена открытия 2 позиции elseif Count == 11 then Open_3 = tonumber(line) -- Цена открытия 3 позиции elseif Count == 12 then Open_4 = tonumber(line) -- Цена открытия 4 позиции elseif Count == 13 then BU_1 = tonumber(line) -- Безубыток 1 позиции elseif Count == 14 then BU_2 = tonumber(line) -- Безубыток 2 позиции elseif Count == 15 then BU_3 = tonumber(line) -- Безубыток 3 позиции elseif Count == 16 then BU_4 = tonumber(line) -- Безубыток 4 позиции elseif Count == 17 then All_Profit = tonumber(line) -- Общий заработанный профит end end f:close() -- Закрывает файл end CreateTable() -- Создает таблицу end function main() -- Функция, реализующая основной поток выполнения в скрипте while IsRun do -- Цикл будет выполнятся, пока IsRun == true local Price_Call = tonumber(getParamEx(Class_Fut, Sec_Fut, "bid").param_value) + (Start_Call - Start_Put) / 2 -- Текущая цена фьючерса для крыла Call local Price_Put = tonumber(getParamEx(Class_Fut, Sec_Fut, "bid").param_value) - (Start_Call - Start_Put) / 2 -- Текущая цена фьючерса для крыла Put if Price_Call > 0 and Price_Put > 0 then if Volume_1 == 0 and Volume_2 == 0 and Volume_3 == 0 and Volume_4 == 0 then -- Позиции нет Sec_1 = string.sub(Sec_Call, 1, 2)..tostring(Start_Call + Step_Strike)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call) -- Код опциона 1 позиции Volume_1 = Lots -- Объем 1 позиции Open_1 = tonumber(getParamEx(Class_Opt, Sec_1, "theorprice").param_value) -- Цена открытия 1 позиции Sec_2 = string.sub(Sec_Call, 1, 2)..tostring(Start_Call)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call) -- Код опциона 2 позиции Volume_2 = -Lots -- Объем 2 позиции Open_2 = tonumber(getParamEx(Class_Opt, Sec_2, "theorprice").param_value) -- Цена открытия 2 позиции Sec_4 = string.sub(Sec_Put, 1, 2)..tostring(Start_Put - Step_Strike)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put) -- Код опциона 4 позиции Volume_4 = Lots -- Объем 4 позиции Open_4 = tonumber(getParamEx(Class_Opt, Sec_4, "theorprice").param_value) -- Цена открытия 4 позиции Sec_3 = string.sub(Sec_Put, 1, 2)..tostring(Start_Put)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put) -- Код опциона 3 позиции Volume_3 = -Lots -- Объем 3 позиции Open_3 = tonumber(getParamEx(Class_Opt, Sec_3, "theorprice").param_value) -- Цена открытия 3 позиции BU_2 = tonumber(string.sub(Sec_2, 3, #Sec_2 - 3)) -- Безубыток 2 позиции BU_3 = tonumber(string.sub(Sec_3, 3, #Sec_3 - 3)) -- Безубыток 3 позиции BU_1 = BU_2 + Open_2 - Open_1 + math.ceil(Volume_4 * (Open_3 - Open_4) / Volume_1) -- Безубыток 1 позиции if BU_1 > tonumber(string.sub(Sec_1, 3, #Sec_1 - 3)) then BU_1 = tonumber(string.sub(Sec_1, 3, #Sec_1 - 3)) end BU_4 = BU_3 - Open_3 + Open_4 - math.floor(Volume_1 * (Open_2 - Open_1) / Volume_4) -- Безубыток 4 позиции if BU_4 < tonumber(string.sub(Sec_4, 3, #Sec_4 - 3)) then BU_4 = tonumber(string.sub(Sec_4, 3, #Sec_4 - 3)) end CorrectTable(Pos_1, Sec_1, Volume_1, Open_1, BU_1) -- Изменим таблицу CorrectTable(Pos_2, Sec_2, Volume_2, Open_2, BU_2) -- Изменим таблицу CorrectTable(Pos_3, Sec_3, Volume_3, Open_3, BU_3) -- Изменим таблицу CorrectTable(Pos_4, Sec_4, Volume_4, Open_4, BU_4) -- Изменим таблицу end if Volume_1 > 0 and Volume_2 < 0 and Volume_3 < 0 and Volume_4 > 0 then -- Позиция есть if Price_Call > BU_1 then -- Call - цена идет вверх All_Profit = All_Profit + ProfitBuy(Sec_1, Volume_1, Open_1) + ProfitSell(Sec_2, Volume_2, Open_2) -- Профит от закрытия 1 и 2 позиции Sec_1 = string.sub(Sec_Call, 1, 2)..tostring(string.sub(Sec_1, 3, #Sec_1 - 3) + Step_Strike)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call) -- Код опциона 1 позиции Volume_1 = Lots -- Объем 1 позиции Open_1 = tonumber(getParamEx(Class_Opt, Sec_1, "theorprice").param_value) -- Цена открытия 1 позиции Sec_2 = string.sub(Sec_Call, 1, 2)..tostring(string.sub(Sec_1, 3, #Sec_1 - 3) - Step_Strike)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call) -- Код опциона 2 позиции Volume_2 = -Lots -- Объем 2 позиции Open_2 = tonumber(getParamEx(Class_Opt, Sec_2, "theorprice").param_value) -- Цена открытия 2 позиции BU_2 = tonumber(string.sub(Sec_2, 3, #Sec_2 - 3)) -- Безубыток 2 позиции BU_1 = BU_2 + Open_2 - Open_1 + math.ceil(Volume_4 * (Open_3 - Open_4) / Volume_1) -- Безубыток 1 позиции if BU_1 > tonumber(string.sub(Sec_1, 3, #Sec_1 - 3)) then BU_1 = tonumber(string.sub(Sec_1, 3, #Sec_1 - 3)) end CorrectTable(Pos_1, Sec_1, Volume_1, Open_1, BU_1) -- Изменим таблицу CorrectTable(Pos_2, Sec_2, Volume_2, Open_2, BU_2) -- Изменим таблицу end if BU_2 > Start_Call and Price_Call < BU_2 - Step_Strike then -- Call - цена идет вниз All_Profit = All_Profit + ProfitBuy(Sec_1, Volume_1, Open_1) + ProfitSell(Sec_2, Volume_2, Open_2) -- Профит от закрытия 1 и 2 позиции Sec_1 = string.sub(Sec_Call, 1, 2)..tostring(string.sub(Sec_1, 3, #Sec_1 - 3) - Step_Strike)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call) -- Код опциона 1 позиции Volume_1 = Lots -- Объем 1 позиции Open_1 = tonumber(getParamEx(Class_Opt, Sec_1, "theorprice").param_value) -- Цена открытия 1 позиции Sec_2 = string.sub(Sec_Call, 1, 2)..tostring(string.sub(Sec_1, 3, #Sec_1 - 3) - Step_Strike)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call) -- Код опциона 2 позиции Volume_2 = -Lots -- Объем 2 позиции Open_2 = tonumber(getParamEx(Class_Opt, Sec_2, "theorprice").param_value) -- Цена открытия 2 позиции BU_2 = tonumber(string.sub(Sec_2, 3, #Sec_2 - 3)) -- Безубыток 2 позиции BU_1 = BU_2 + Open_2 - Open_1 + math.ceil(Volume_4 * (Open_3 - Open_4) / Volume_1) -- Безубыток 1 позиции if BU_1 > tonumber(string.sub(Sec_1, 3, #Sec_1 - 3)) then BU_1 = tonumber(string.sub(Sec_1, 3, #Sec_1 - 3)) end CorrectTable(Pos_1, Sec_1, Volume_1, Open_1, BU_1) -- Изменим таблицу CorrectTable(Pos_2, Sec_2, Volume_2, Open_2, BU_2) -- Изменим таблицу end if Price_Put < BU_4 then -- Put - цена идет вниз All_Profit = All_Profit + ProfitBuy(Sec_4, Volume_4, Open_4) + ProfitSell(Sec_3, Volume_3, Open_3) -- Профит от закрытия 4 и 3 позиции Sec_4 = string.sub(Sec_Put, 1, 2)..tostring(string.sub(Sec_4, 3, #Sec_4 - 3) - Step_Strike)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put) -- Код опциона 4 позиции Volume_4 = Lots -- Объем 4 позиции Open_4 = tonumber(getParamEx(Class_Opt, Sec_4, "theorprice").param_value) -- Цена открытия 4 позиции Sec_3 = string.sub(Sec_Put, 1, 2)..tostring(string.sub(Sec_4, 3, #Sec_4 - 3) + Step_Strike)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put) -- Код опциона 3 позиции Volume_3 = -Lots -- Объем 3 позиции Open_3 = tonumber(getParamEx(Class_Opt, Sec_3, "theorprice").param_value) -- Цена открытия 3 позиции BU_3 = tonumber(string.sub(Sec_3, 3, #Sec_3 - 3)) -- Безубыток 3 позиции BU_4 = BU_3 - Open_3 + Open_4 - math.floor(Volume_1 * (Open_2 - Open_1) / Volume_4) -- Безубыток 4 позиции if BU_4 < tonumber(string.sub(Sec_4, 3, #Sec_4 - 3)) then BU_4 = tonumber(string.sub(Sec_4, 3, #Sec_4 - 3)) end CorrectTable(Pos_3, Sec_3, Volume_3, Open_3, BU_3) -- Изменим таблицу CorrectTable(Pos_4, Sec_4, Volume_4, Open_4, BU_4) -- Изменим таблицу end if BU_3 < Start_Put and Price_Put > BU_3 + Step_Strike then -- Put - цена идет вверх All_Profit = All_Profit + ProfitBuy(Sec_4, Volume_4, Open_4) + ProfitSell(Sec_3, Volume_3, Open_3) -- Профит от закрытия 4 и 3 позиции Sec_4 = string.sub(Sec_Put, 1, 2)..tostring(string.sub(Sec_4, 3, #Sec_4 - 3) + Step_Strike)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put) -- Код опциона 4 позиции Volume_4 = Lots -- Объем 4 позиции Open_4 = tonumber(getParamEx(Class_Opt, Sec_4, "theorprice").param_value) -- Цена открытия 4 позиции Sec_3 = string.sub(Sec_Put, 1, 2)..tostring(string.sub(Sec_4, 3, #Sec_4 - 3) + Step_Strike)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put) -- Код опциона 3 позиции Volume_3 = -Lots -- Объем 3 позиции Open_3 = tonumber(getParamEx(Class_Opt, Sec_3, "theorprice").param_value) -- Цена открытия 3 позиции BU_3 = tonumber(string.sub(Sec_3, 3, #Sec_3 - 3)) -- Безубыток 3 позиции BU_4 = BU_3 - Open_3 + Open_4 - math.floor(Volume_1 * (Open_2 - Open_1) / Volume_4) -- Безубыток 4 позиции if BU_4 < tonumber(string.sub(Sec_4, 3, #Sec_4 - 3)) then BU_4 = tonumber(string.sub(Sec_4, 3, #Sec_4 - 3)) end CorrectTable(Pos_3, Sec_3, Volume_3, Open_3, BU_3) -- Изменим таблицу CorrectTable(Pos_4, Sec_4, Volume_4, Open_4, BU_4) -- Изменим таблицу end end end local Profit_1 = ProfitBuy(Sec_1, Volume_1, Open_1) Str(Pos_1, 4, Profit_1) -- Считает, выводит и окрашивает текущий профит Buy 1 позиции local Profit_2 = ProfitSell(Sec_2, Volume_2, Open_2) Str(Pos_2, 4, Profit_2) -- Считает, выводит и окрашивает текущий профит Sell 2 позиции local Profit_3 = ProfitSell(Sec_3, Volume_3, Open_3) Str(Pos_3, 4, Profit_3) -- Считает, выводит и окрашивает текущий профит Sell 3 позиции local Profit_4 = ProfitBuy(Sec_4, Volume_4, Open_4) Str(Pos_4, 4, Profit_4) -- Считает, выводит и окрашивает текущий профит Buy 4 позиции local ProfitCP = Profit_1 + Profit_2 + Profit_3 + Profit_4 Str(Total, 4, ProfitCP) -- Считает, выводит и окрашивает текущий профит Call + Put Str(Total, 3, All_Profit) -- Выводит и окрашивает заработанный профит local Profit = ProfitCP + All_Profit Str(Total, 1, Profit) -- Считает, выводит и окрашивает текущий профит Call + Put + заработанный профит BU_2 = tonumber(string.sub(Sec_2, 3, #Sec_2 - 3)) -- Безубыток 2 позиции BU_3 = tonumber(string.sub(Sec_3, 3, #Sec_3 - 3)) -- Безубыток 3 позиции BU_1 = BU_2 + Open_2 - Open_1 + math.ceil(Volume_4 * (Open_3 - Open_4) / Volume_1) -- Безубыток 1 позиции if BU_1 > tonumber(string.sub(Sec_1, 3, #Sec_1 - 3)) then BU_1 = tonumber(string.sub(Sec_1, 3, #Sec_1 - 3)) end BU_4 = BU_3 - Open_3 + Open_4 - math.floor(Volume_1 * (Open_2 - Open_1) / Volume_4) -- Безубыток 4 позиции if BU_4 < tonumber(string.sub(Sec_4, 3, #Sec_4 - 3)) then BU_4 = tonumber(string.sub(Sec_4, 3, #Sec_4 - 3)) end CorrectTable(Pos_1, Sec_1, Volume_1, Open_1, BU_1) -- Изменим таблицу CorrectTable(Pos_2, Sec_2, Volume_2, Open_2, BU_2) -- Изменим таблицу CorrectTable(Pos_3, Sec_3, Volume_3, Open_3, BU_3) -- Изменим таблицу CorrectTable(Pos_4, Sec_4, Volume_4, Open_4, BU_4) -- Изменим таблицу Str(Pos_1, 6, ProfitCall() + ProfitPut()) -- Считает, выводит и окрашивает прибыль всей позиции на момент экспирации Str(Pos_2, 6, LesionCall() + ProfitPut()) -- Считает, выводит и окрашивает убыток всей позиции на момент экспирации Call (правое крыло) Str(Pos_4, 6, LesionPut() + ProfitCall()) -- Считает, выводит и окрашивает убыток позиции на момент экспирации Put (левое крыло) sleep(100) end end function OnStop() -- Функция вызывается терминалом QUIK при остановке скрипта из диалога управления -- Сохранение текущего состояния в файл local f = io.open(getScriptPath().."//Condor V.txt","r+") -- Пытается открыть файл в режиме "чтения/записи" if f == nil then -- Если файл не существует f = io.open(getScriptPath().."//Condor V.txt","w") -- Создает файл в режиме "записи" f:close() -- Закрывает файл f = io.open(getScriptPath().."//Condor V.txt","r+") -- Открывает уже существующий файл в режиме "чтения/записи" end -- Записывает в файл текущие состояния (каждое значение в новой строке) f:write(Sec_1.."\n") -- Call код 1 позиции f:write(Sec_2.."\n") -- Call код 2 позиции f:write(Sec_3.."\n") -- Put код 3 позиции f:write(Sec_4.."\n") -- Put код 4 позиции f:write(tostring(Volume_1).."\n") -- Объем 1 позиции f:write(tostring(Volume_2).."\n") -- Объем 2 позиции f:write(tostring(Volume_3).."\n") -- Объем 3 позиции f:write(tostring(Volume_4).."\n") -- Объем 4 позиции f:write(tostring(Open_1).."\n") -- Цена открытия 1 позиции f:write(tostring(Open_2).."\n") -- Цена открытия 2 позиции f:write(tostring(Open_3).."\n") -- Цена открытия 3 позиции f:write(tostring(Open_4).."\n") -- Цена открытия 4 позиции f:write(tostring(BU_1).."\n") -- Безубыток 1 позиции f:write(tostring(BU_2).."\n") -- Безубыток 2 позиции f:write(tostring(BU_3).."\n") -- Безубыток 3 позиции f:write(tostring(BU_4).."\n") -- Безубыток 4 позиции f:write(tostring(All_Profit).."\n") -- Общий заработанный профит f:flush() -- Сохраняет изменения в файле f:close() -- Закрывает файл IsRun = false end function CreateTable() -- Функция создает таблицу t_id = AllocTable() -- Получает доступный id для создания -- Добавляет колонки AddColumn(t_id, 0, "", true, QTABLE_STRING_TYPE, 7) AddColumn(t_id, 1, "Инструмент", true, QTABLE_STRING_TYPE, 15) AddColumn(t_id, 2, "Позиция", true, QTABLE_INT_TYPE, 5) AddColumn(t_id, 3, "Цена", true, QTABLE_INT_TYPE, 10) AddColumn(t_id, 4, "Профит", true, QTABLE_INT_TYPE, 10) AddColumn(t_id, 5, "БУ", true, QTABLE_INT_TYPE, 10) AddColumn(t_id, 6, "П/У", true, QTABLE_INT_TYPE, 10) t = CreateWindow(t_id) -- Создает таблицу SetWindowCaption(t_id, "Condor V") -- Устанавливает заголовок SetWindowPos(t_id, 390, 460, 390, 130) -- Задает положение и размеры окна таблицы -- Добавляет строки InsertRow(t_id, Pos_1) InsertRow(t_id, Pos_2) InsertRow(t_id, Pos_3) InsertRow(t_id, Pos_4) InsertRow(t_id, Total) -- Добавляет значения в ячейки SetCell(t_id, Pos_1, 0, "Call") SetCell(t_id, Pos_1, 1, Sec_1) SetCell(t_id, Pos_1, 2, tostring(Volume_1)) SetCell(t_id, Pos_1, 3, tostring(Open_1)) SetCell(t_id, Pos_1, 5, tostring(BU_1)) SetCell(t_id, Pos_2, 0, "Call") SetCell(t_id, Pos_2, 1, Sec_2) SetCell(t_id, Pos_2, 2, tostring(Volume_2)) SetCell(t_id, Pos_2, 3, tostring(Open_2)) SetCell(t_id, Pos_2, 5, tostring(BU_2)) SetCell(t_id, Pos_3, 0, "Put") SetCell(t_id, Pos_3, 1, Sec_3) SetCell(t_id, Pos_3, 2, tostring(Volume_3)) SetCell(t_id, Pos_3, 3, tostring(Open_3)) SetCell(t_id, Pos_3, 5, tostring(BU_3)) SetCell(t_id, Pos_4, 0, "Put") SetCell(t_id, Pos_4, 1, Sec_4) SetCell(t_id, Pos_4, 2, tostring(Volume_4)) SetCell(t_id, Pos_4, 3, tostring(Open_4)) SetCell(t_id, Pos_4, 5, tostring(BU_4)) SetCell(t_id, Total, 0, "Итого") end function CorrectTable(str, sec, volume, open, bu) -- Функция корректирует таблицу SetCell(t_id, str, 1, sec) SetCell(t_id, str, 2, tostring(volume)) SetCell(t_id, str, 3, tostring(open)) SetCell(t_id, str, 5, tostring(bu)) -- Изменим таблицу end function Str(str, num, profit) -- Функция выводит и окрашивает переданный профит в таблицу SetCell(t_id, str, num, tostring(profit)) -- Выводит значение в таблицу if profit > 0 then Green(str, num) elseif profit == 0 then Gray(str, num) else Red(str, num) end -- Окрашивает строку в зависимости от значения профита 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 ProfitBuy(sec, volume, open) -- Функция считает текущий профит Buy по теоретической цене с учетом комиссии local theorprice = tonumber(getParamEx(Class_Opt, sec, "theorprice").param_value) -- Получает текущий theorprice по опциону local Profit = (theorprice - open) * math.abs(volume) - Commission * 2 * math.abs(volume) -- Считает текущий профит по опционной позиции return(Profit) -- Возвращает значение Profit end function ProfitSell(sec, volume, open) -- Функция считает текущий профит Sell по теоретической цене с учетом комиссии local theorprice = tonumber(getParamEx(Class_Opt, sec, "theorprice").param_value) -- Получает текущий theorprice по опциону local Profit = (open - theorprice) * math.abs(volume) - Commission * 2 * math.abs(volume) -- Считает текущий профит по опционной позиции return(Profit) -- Возвращает значение Profit end function ProfitCall() -- Функция считает прибыль позиции Call local pc = Volume_1 * (Open_2 - Open_1) -- Прибыль 1 и 2 позиции return(pc) -- Возвращает значение end function LesionCall() -- Функция считает убыток позиции Call local lc = Volume_1 * ((tonumber(string.sub(Sec_2, 3, #Sec_2 - 3)) + Open_2) - (tonumber(string.sub(Sec_1, 3, #Sec_1 - 3)) + Open_1)) -- Убыток 1 и 2 позиции return(lc) -- Возвращает значение end function ProfitPut() -- Функция считает прибыль позиции Put local pp = Volume_4 * (Open_3 - Open_4) -- Прибыль 3 и 4 позиции return(pp) -- Возвращает значение end function LesionPut() -- Функция считает убыток позиции Put local lp = Volume_4 * ((tonumber(string.sub(Sec_4, 3, #Sec_4 - 3)) - Open_4) - (tonumber(string.sub(Sec_3, 3, #Sec_3 - 3)) - Open_3)) -- Убыток 3 и 4 позиции return(lp) -- Возвращает значение end |
Class_Fut = "SPBFUT" -- Класс фьючерса Sec_Fut = "SRH6" -- Код фьючерса Class_Opt = "SPBOPT" -- Класс опциона Sec_Call = "SR10000BA6" -- Код опциона Call Sec_Put = "SR10000BM6" -- Код опциона Put Start_Call = 10250 -- 1-й BU_2 - ниже него, крыло Call не открываем, выше можно Start_Put = 10250 -- 1-й BU_3 - выше него, крыло Put не открываем, ниже можно Step_Strike = 250 -- Шаг страйка Lots = 1 -- Лот Commission = 2.25 -- Комиссия (биржа + брокер за 1-у торговую операцию по 1-му лоту) Sec_1 = "" -- Call код 1 позиции Sec_2 = "" -- Call код 2 позиции Sec_3 = "" -- Put код 3 позиции Sec_4 = "" -- Put код 4 позиции Volume_1 = 0 -- Объем 1 позиции Volume_2 = 0 -- Объем 2 позиции Volume_3 = 0 -- Объем 3 позиции Volume_4 = 0 -- Объем 4 позиции Open_1 = 0 -- Цена открытия 1 позиции Open_2 = 0 -- Цена открытия 2 позиции Open_3 = 0 -- Цена открытия 3 позиции Open_4 = 0 -- Цена открытия 4 позиции BU_1 = 0 -- Безубыток 1 позиции BU_2 = 0 -- Безубыток 2 позиции BU_3 = 0 -- Безубыток 3 позиции BU_4 = 0 -- Безубыток 4 позиции All_Profit = 0 -- Общий заработанный профит -- Константы для строк таблицы Pos_1 = 1 -- Позиция 1 (Call, код, объем, цена, профит, безубыток, прибыль/убыток) Pos_2 = 2 -- Позиция 2 (Call, код, объем, цена, профит, безубыток, прибыль/убыток) Pos_3 = 3 -- Позиция 3 (Put, код, объем, цена, профит, безубыток) Pos_4 = 4 -- Позиция 4 (Put, код, объем, цена, профит, безубыток, прибыль/убыток) Total = 5 -- Профит Call + Put + заработанный профит, заработанный профит, Call + Put IsRun = true -- Флаг поддержания работы скрипта function OnInit() -- Функция вызывается терминалом QUIK перед вызовом функции main() local f = io.open(getScriptPath().."//Condor V.txt","r+") -- Пытается открыть файл состояния в режиме "чтения/записи" if f ~= nil then -- Если файл существует, перебирает строки файла, считывает содержимое в соответствующие переменные local Count = 0 -- Счетчик строк for line in f:lines() do Count = Count + 1 if Count == 1 then Sec_1 = line -- Call код 1 позиции elseif Count == 2 then Sec_2 = line -- Call код 2 позиции elseif Count == 3 then Sec_3 = line -- Put код 3 позиции elseif Count == 4 then Sec_4 = line -- Put код 4 позиции elseif Count == 5 then Volume_1 = tonumber(line) -- Объем 1 позиции elseif Count == 6 then Volume_2 = tonumber(line) -- Объем 2 позиции elseif Count == 7 then Volume_3 = tonumber(line) -- Объем 3 позиции elseif Count == 8 then Volume_4 = tonumber(line) -- Объем 4 позиции elseif Count == 9 then Open_1 = tonumber(line) -- Цена открытия 1 позиции elseif Count == 10 then Open_2 = tonumber(line) -- Цена открытия 2 позиции elseif Count == 11 then Open_3 = tonumber(line) -- Цена открытия 3 позиции elseif Count == 12 then Open_4 = tonumber(line) -- Цена открытия 4 позиции elseif Count == 13 then BU_1 = tonumber(line) -- Безубыток 1 позиции elseif Count == 14 then BU_2 = tonumber(line) -- Безубыток 2 позиции elseif Count == 15 then BU_3 = tonumber(line) -- Безубыток 3 позиции elseif Count == 16 then BU_4 = tonumber(line) -- Безубыток 4 позиции elseif Count == 17 then All_Profit = tonumber(line) -- Общий заработанный профит end end f:close() -- Закрывает файл end CreateTable() -- Создает таблицу end function main() -- Функция, реализующая основной поток выполнения в скрипте while IsRun do -- Цикл будет выполнятся, пока IsRun == true local Price_Call = tonumber(getParamEx(Class_Fut, Sec_Fut, "bid").param_value) + (Start_Call - Start_Put) / 2 -- Текущая цена фьючерса для крыла Call local Price_Put = tonumber(getParamEx(Class_Fut, Sec_Fut, "bid").param_value) - (Start_Call - Start_Put) / 2 -- Текущая цена фьючерса для крыла Put if Price_Call > 0 and Price_Put > 0 then if Volume_1 == 0 and Volume_2 == 0 and Volume_3 == 0 and Volume_4 == 0 then -- Позиции нет Sec_1 = string.sub(Sec_Call, 1, 2)..tostring(Start_Call + Step_Strike)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call) -- Код опциона 1 позиции Volume_1 = Lots -- Объем 1 позиции Open_1 = tonumber(getParamEx(Class_Opt, Sec_1, "theorprice").param_value) -- Цена открытия 1 позиции Sec_2 = string.sub(Sec_Call, 1, 2)..tostring(Start_Call)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call) -- Код опциона 2 позиции Volume_2 = -Lots -- Объем 2 позиции Open_2 = tonumber(getParamEx(Class_Opt, Sec_2, "theorprice").param_value) -- Цена открытия 2 позиции Sec_4 = string.sub(Sec_Put, 1, 2)..tostring(Start_Put - Step_Strike)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put) -- Код опциона 4 позиции Volume_4 = Lots -- Объем 4 позиции Open_4 = tonumber(getParamEx(Class_Opt, Sec_4, "theorprice").param_value) -- Цена открытия 4 позиции Sec_3 = string.sub(Sec_Put, 1, 2)..tostring(Start_Put)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put) -- Код опциона 3 позиции Volume_3 = -Lots -- Объем 3 позиции Open_3 = tonumber(getParamEx(Class_Opt, Sec_3, "theorprice").param_value) -- Цена открытия 3 позиции BU_2 = tonumber(string.sub(Sec_2, 3, #Sec_2 - 3)) -- Безубыток 2 позиции BU_3 = tonumber(string.sub(Sec_3, 3, #Sec_3 - 3)) -- Безубыток 3 позиции BU_1 = BU_2 + Open_2 - Open_1 + math.ceil(Volume_4 * (Open_3 - Open_4) / Volume_1) -- Безубыток 1 позиции if BU_1 > tonumber(string.sub(Sec_1, 3, #Sec_1 - 3)) then BU_1 = tonumber(string.sub(Sec_1, 3, #Sec_1 - 3)) end BU_4 = BU_3 - Open_3 + Open_4 - math.floor(Volume_1 * (Open_2 - Open_1) / Volume_4) -- Безубыток 4 позиции if BU_4 < tonumber(string.sub(Sec_4, 3, #Sec_4 - 3)) then BU_4 = tonumber(string.sub(Sec_4, 3, #Sec_4 - 3)) end CorrectTable(Pos_1, Sec_1, Volume_1, Open_1, BU_1) -- Изменим таблицу CorrectTable(Pos_2, Sec_2, Volume_2, Open_2, BU_2) -- Изменим таблицу CorrectTable(Pos_3, Sec_3, Volume_3, Open_3, BU_3) -- Изменим таблицу CorrectTable(Pos_4, Sec_4, Volume_4, Open_4, BU_4) -- Изменим таблицу end if Volume_1 > 0 and Volume_2 < 0 and Volume_3 < 0 and Volume_4 > 0 then -- Позиция есть if Price_Call > BU_1 then -- Call - цена идет вверх All_Profit = All_Profit + ProfitBuy(Sec_1, Volume_1, Open_1) + ProfitSell(Sec_2, Volume_2, Open_2) -- Профит от закрытия 1 и 2 позиции Sec_1 = string.sub(Sec_Call, 1, 2)..tostring(string.sub(Sec_1, 3, #Sec_1 - 3) + Step_Strike)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call) -- Код опциона 1 позиции Volume_1 = Lots -- Объем 1 позиции Open_1 = tonumber(getParamEx(Class_Opt, Sec_1, "theorprice").param_value) -- Цена открытия 1 позиции Sec_2 = string.sub(Sec_Call, 1, 2)..tostring(string.sub(Sec_1, 3, #Sec_1 - 3) - Step_Strike)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call) -- Код опциона 2 позиции Volume_2 = -Lots -- Объем 2 позиции Open_2 = tonumber(getParamEx(Class_Opt, Sec_2, "theorprice").param_value) -- Цена открытия 2 позиции BU_2 = tonumber(string.sub(Sec_2, 3, #Sec_2 - 3)) -- Безубыток 2 позиции BU_1 = BU_2 + Open_2 - Open_1 + math.ceil(Volume_4 * (Open_3 - Open_4) / Volume_1) -- Безубыток 1 позиции if BU_1 > tonumber(string.sub(Sec_1, 3, #Sec_1 - 3)) then BU_1 = tonumber(string.sub(Sec_1, 3, #Sec_1 - 3)) end CorrectTable(Pos_1, Sec_1, Volume_1, Open_1, BU_1) -- Изменим таблицу CorrectTable(Pos_2, Sec_2, Volume_2, Open_2, BU_2) -- Изменим таблицу end if BU_2 > Start_Call and Price_Call < BU_2 - Step_Strike then -- Call - цена идет вниз All_Profit = All_Profit + ProfitBuy(Sec_1, Volume_1, Open_1) + ProfitSell(Sec_2, Volume_2, Open_2) -- Профит от закрытия 1 и 2 позиции Sec_1 = string.sub(Sec_Call, 1, 2)..tostring(string.sub(Sec_1, 3, #Sec_1 - 3) - Step_Strike)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call) -- Код опциона 1 позиции Volume_1 = Lots -- Объем 1 позиции Open_1 = tonumber(getParamEx(Class_Opt, Sec_1, "theorprice").param_value) -- Цена открытия 1 позиции Sec_2 = string.sub(Sec_Call, 1, 2)..tostring(string.sub(Sec_1, 3, #Sec_1 - 3) - Step_Strike)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call) -- Код опциона 2 позиции Volume_2 = -Lots -- Объем 2 позиции Open_2 = tonumber(getParamEx(Class_Opt, Sec_2, "theorprice").param_value) -- Цена открытия 2 позиции BU_2 = tonumber(string.sub(Sec_2, 3, #Sec_2 - 3)) -- Безубыток 2 позиции BU_1 = BU_2 + Open_2 - Open_1 + math.ceil(Volume_4 * (Open_3 - Open_4) / Volume_1) -- Безубыток 1 позиции if BU_1 > tonumber(string.sub(Sec_1, 3, #Sec_1 - 3)) then BU_1 = tonumber(string.sub(Sec_1, 3, #Sec_1 - 3)) end CorrectTable(Pos_1, Sec_1, Volume_1, Open_1, BU_1) -- Изменим таблицу CorrectTable(Pos_2, Sec_2, Volume_2, Open_2, BU_2) -- Изменим таблицу end if Price_Put < BU_4 then -- Put - цена идет вниз All_Profit = All_Profit + ProfitBuy(Sec_4, Volume_4, Open_4) + ProfitSell(Sec_3, Volume_3, Open_3) -- Профит от закрытия 4 и 3 позиции Sec_4 = string.sub(Sec_Put, 1, 2)..tostring(string.sub(Sec_4, 3, #Sec_4 - 3) - Step_Strike)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put) -- Код опциона 4 позиции Volume_4 = Lots -- Объем 4 позиции Open_4 = tonumber(getParamEx(Class_Opt, Sec_4, "theorprice").param_value) -- Цена открытия 4 позиции Sec_3 = string.sub(Sec_Put, 1, 2)..tostring(string.sub(Sec_4, 3, #Sec_4 - 3) + Step_Strike)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put) -- Код опциона 3 позиции Volume_3 = -Lots -- Объем 3 позиции Open_3 = tonumber(getParamEx(Class_Opt, Sec_3, "theorprice").param_value) -- Цена открытия 3 позиции BU_3 = tonumber(string.sub(Sec_3, 3, #Sec_3 - 3)) -- Безубыток 3 позиции BU_4 = BU_3 - Open_3 + Open_4 - math.floor(Volume_1 * (Open_2 - Open_1) / Volume_4) -- Безубыток 4 позиции if BU_4 < tonumber(string.sub(Sec_4, 3, #Sec_4 - 3)) then BU_4 = tonumber(string.sub(Sec_4, 3, #Sec_4 - 3)) end CorrectTable(Pos_3, Sec_3, Volume_3, Open_3, BU_3) -- Изменим таблицу CorrectTable(Pos_4, Sec_4, Volume_4, Open_4, BU_4) -- Изменим таблицу end if BU_3 < Start_Put and Price_Put > BU_3 + Step_Strike then -- Put - цена идет вверх All_Profit = All_Profit + ProfitBuy(Sec_4, Volume_4, Open_4) + ProfitSell(Sec_3, Volume_3, Open_3) -- Профит от закрытия 4 и 3 позиции Sec_4 = string.sub(Sec_Put, 1, 2)..tostring(string.sub(Sec_4, 3, #Sec_4 - 3) + Step_Strike)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put) -- Код опциона 4 позиции Volume_4 = Lots -- Объем 4 позиции Open_4 = tonumber(getParamEx(Class_Opt, Sec_4, "theorprice").param_value) -- Цена открытия 4 позиции Sec_3 = string.sub(Sec_Put, 1, 2)..tostring(string.sub(Sec_4, 3, #Sec_4 - 3) + Step_Strike)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put) -- Код опциона 3 позиции Volume_3 = -Lots -- Объем 3 позиции Open_3 = tonumber(getParamEx(Class_Opt, Sec_3, "theorprice").param_value) -- Цена открытия 3 позиции BU_3 = tonumber(string.sub(Sec_3, 3, #Sec_3 - 3)) -- Безубыток 3 позиции BU_4 = BU_3 - Open_3 + Open_4 - math.floor(Volume_1 * (Open_2 - Open_1) / Volume_4) -- Безубыток 4 позиции if BU_4 < tonumber(string.sub(Sec_4, 3, #Sec_4 - 3)) then BU_4 = tonumber(string.sub(Sec_4, 3, #Sec_4 - 3)) end CorrectTable(Pos_3, Sec_3, Volume_3, Open_3, BU_3) -- Изменим таблицу CorrectTable(Pos_4, Sec_4, Volume_4, Open_4, BU_4) -- Изменим таблицу end end end local Profit_1 = ProfitBuy(Sec_1, Volume_1, Open_1) Str(Pos_1, 4, Profit_1) -- Считает, выводит и окрашивает текущий профит Buy 1 позиции local Profit_2 = ProfitSell(Sec_2, Volume_2, Open_2) Str(Pos_2, 4, Profit_2) -- Считает, выводит и окрашивает текущий профит Sell 2 позиции local Profit_3 = ProfitSell(Sec_3, Volume_3, Open_3) Str(Pos_3, 4, Profit_3) -- Считает, выводит и окрашивает текущий профит Sell 3 позиции local Profit_4 = ProfitBuy(Sec_4, Volume_4, Open_4) Str(Pos_4, 4, Profit_4) -- Считает, выводит и окрашивает текущий профит Buy 4 позиции local ProfitCP = Profit_1 + Profit_2 + Profit_3 + Profit_4 Str(Total, 4, ProfitCP) -- Считает, выводит и окрашивает текущий профит Call + Put Str(Total, 3, All_Profit) -- Выводит и окрашивает заработанный профит local Profit = ProfitCP + All_Profit Str(Total, 1, Profit) -- Считает, выводит и окрашивает текущий профит Call + Put + заработанный профит BU_2 = tonumber(string.sub(Sec_2, 3, #Sec_2 - 3)) -- Безубыток 2 позиции BU_3 = tonumber(string.sub(Sec_3, 3, #Sec_3 - 3)) -- Безубыток 3 позиции BU_1 = BU_2 + Open_2 - Open_1 + math.ceil(Volume_4 * (Open_3 - Open_4) / Volume_1) -- Безубыток 1 позиции if BU_1 > tonumber(string.sub(Sec_1, 3, #Sec_1 - 3)) then BU_1 = tonumber(string.sub(Sec_1, 3, #Sec_1 - 3)) end BU_4 = BU_3 - Open_3 + Open_4 - math.floor(Volume_1 * (Open_2 - Open_1) / Volume_4) -- Безубыток 4 позиции if BU_4 < tonumber(string.sub(Sec_4, 3, #Sec_4 - 3)) then BU_4 = tonumber(string.sub(Sec_4, 3, #Sec_4 - 3)) end CorrectTable(Pos_1, Sec_1, Volume_1, Open_1, BU_1) -- Изменим таблицу CorrectTable(Pos_2, Sec_2, Volume_2, Open_2, BU_2) -- Изменим таблицу CorrectTable(Pos_3, Sec_3, Volume_3, Open_3, BU_3) -- Изменим таблицу CorrectTable(Pos_4, Sec_4, Volume_4, Open_4, BU_4) -- Изменим таблицу Str(Pos_1, 6, ProfitCall() + ProfitPut()) -- Считает, выводит и окрашивает прибыль всей позиции на момент экспирации Str(Pos_2, 6, LesionCall() + ProfitPut()) -- Считает, выводит и окрашивает убыток всей позиции на момент экспирации Call (правое крыло) Str(Pos_4, 6, LesionPut() + ProfitCall()) -- Считает, выводит и окрашивает убыток позиции на момент экспирации Put (левое крыло) sleep(100) end end function OnStop() -- Функция вызывается терминалом QUIK при остановке скрипта из диалога управления -- Сохранение текущего состояния в файл local f = io.open(getScriptPath().."//Condor V.txt","r+") -- Пытается открыть файл в режиме "чтения/записи" if f == nil then -- Если файл не существует f = io.open(getScriptPath().."//Condor V.txt","w") -- Создает файл в режиме "записи" f:close() -- Закрывает файл f = io.open(getScriptPath().."//Condor V.txt","r+") -- Открывает уже существующий файл в режиме "чтения/записи" end -- Записывает в файл текущие состояния (каждое значение в новой строке) f:write(Sec_1.."\n") -- Call код 1 позиции f:write(Sec_2.."\n") -- Call код 2 позиции f:write(Sec_3.."\n") -- Put код 3 позиции f:write(Sec_4.."\n") -- Put код 4 позиции f:write(tostring(Volume_1).."\n") -- Объем 1 позиции f:write(tostring(Volume_2).."\n") -- Объем 2 позиции f:write(tostring(Volume_3).."\n") -- Объем 3 позиции f:write(tostring(Volume_4).."\n") -- Объем 4 позиции f:write(tostring(Open_1).."\n") -- Цена открытия 1 позиции f:write(tostring(Open_2).."\n") -- Цена открытия 2 позиции f:write(tostring(Open_3).."\n") -- Цена открытия 3 позиции f:write(tostring(Open_4).."\n") -- Цена открытия 4 позиции f:write(tostring(BU_1).."\n") -- Безубыток 1 позиции f:write(tostring(BU_2).."\n") -- Безубыток 2 позиции f:write(tostring(BU_3).."\n") -- Безубыток 3 позиции f:write(tostring(BU_4).."\n") -- Безубыток 4 позиции f:write(tostring(All_Profit).."\n") -- Общий заработанный профит f:flush() -- Сохраняет изменения в файле f:close() -- Закрывает файл IsRun = false end function CreateTable() -- Функция создает таблицу t_id = AllocTable() -- Получает доступный id для создания -- Добавляет колонки AddColumn(t_id, 0, "", true, QTABLE_STRING_TYPE, 7) AddColumn(t_id, 1, "Инструмент", true, QTABLE_STRING_TYPE, 15) AddColumn(t_id, 2, "Позиция", true, QTABLE_INT_TYPE, 5) AddColumn(t_id, 3, "Цена", true, QTABLE_INT_TYPE, 10) AddColumn(t_id, 4, "Профит", true, QTABLE_INT_TYPE, 10) AddColumn(t_id, 5, "БУ", true, QTABLE_INT_TYPE, 10) AddColumn(t_id, 6, "П/У", true, QTABLE_INT_TYPE, 10) t = CreateWindow(t_id) -- Создает таблицу SetWindowCaption(t_id, "Condor V") -- Устанавливает заголовок SetWindowPos(t_id, 390, 460, 390, 130) -- Задает положение и размеры окна таблицы -- Добавляет строки InsertRow(t_id, Pos_1) InsertRow(t_id, Pos_2) InsertRow(t_id, Pos_3) InsertRow(t_id, Pos_4) InsertRow(t_id, Total) -- Добавляет значения в ячейки SetCell(t_id, Pos_1, 0, "Call") SetCell(t_id, Pos_1, 1, Sec_1) SetCell(t_id, Pos_1, 2, tostring(Volume_1)) SetCell(t_id, Pos_1, 3, tostring(Open_1)) SetCell(t_id, Pos_1, 5, tostring(BU_1)) SetCell(t_id, Pos_2, 0, "Call") SetCell(t_id, Pos_2, 1, Sec_2) SetCell(t_id, Pos_2, 2, tostring(Volume_2)) SetCell(t_id, Pos_2, 3, tostring(Open_2)) SetCell(t_id, Pos_2, 5, tostring(BU_2)) SetCell(t_id, Pos_3, 0, "Put") SetCell(t_id, Pos_3, 1, Sec_3) SetCell(t_id, Pos_3, 2, tostring(Volume_3)) SetCell(t_id, Pos_3, 3, tostring(Open_3)) SetCell(t_id, Pos_3, 5, tostring(BU_3)) SetCell(t_id, Pos_4, 0, "Put") SetCell(t_id, Pos_4, 1, Sec_4) SetCell(t_id, Pos_4, 2, tostring(Volume_4)) SetCell(t_id, Pos_4, 3, tostring(Open_4)) SetCell(t_id, Pos_4, 5, tostring(BU_4)) SetCell(t_id, Total, 0, "Итого") end function CorrectTable(str, sec, volume, open, bu) -- Функция корректирует таблицу SetCell(t_id, str, 1, sec) SetCell(t_id, str, 2, tostring(volume)) SetCell(t_id, str, 3, tostring(open)) SetCell(t_id, str, 5, tostring(bu)) -- Изменим таблицу end function Str(str, num, profit) -- Функция выводит и окрашивает переданный профит в таблицу SetCell(t_id, str, num, tostring(profit)) -- Выводит значение в таблицу if profit > 0 then Green(str, num) elseif profit == 0 then Gray(str, num) else Red(str, num) end -- Окрашивает строку в зависимости от значения профита 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 ProfitBuy(sec, volume, open) -- Функция считает текущий профит Buy по теоретической цене с учетом комиссии local theorprice = tonumber(getParamEx(Class_Opt, sec, "theorprice").param_value) -- Получает текущий theorprice по опциону local Profit = (theorprice - open) * math.abs(volume) - Commission * 2 * math.abs(volume) -- Считает текущий профит по опционной позиции return(Profit) -- Возвращает значение Profit end function ProfitSell(sec, volume, open) -- Функция считает текущий профит Sell по теоретической цене с учетом комиссии local theorprice = tonumber(getParamEx(Class_Opt, sec, "theorprice").param_value) -- Получает текущий theorprice по опциону local Profit = (open - theorprice) * math.abs(volume) - Commission * 2 * math.abs(volume) -- Считает текущий профит по опционной позиции return(Profit) -- Возвращает значение Profit end function ProfitCall() -- Функция считает прибыль позиции Call local pc = Volume_1 * (Open_2 - Open_1) -- Прибыль 1 и 2 позиции return(pc) -- Возвращает значение end function LesionCall() -- Функция считает убыток позиции Call local lc = Volume_1 * ((tonumber(string.sub(Sec_2, 3, #Sec_2 - 3)) + Open_2) - (tonumber(string.sub(Sec_1, 3, #Sec_1 - 3)) + Open_1)) -- Убыток 1 и 2 позиции return(lc) -- Возвращает значение end function ProfitPut() -- Функция считает прибыль позиции Put local pp = Volume_4 * (Open_3 - Open_4) -- Прибыль 3 и 4 позиции return(pp) -- Возвращает значение end function LesionPut() -- Функция считает убыток позиции Put local lp = Volume_4 * ((tonumber(string.sub(Sec_4, 3, #Sec_4 - 3)) - Open_4) - (tonumber(string.sub(Sec_3, 3, #Sec_3 - 3)) - Open_3)) -- Убыток 3 и 4 позиции return(lp) -- Возвращает значение end
Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!