Скрипт торгует виртуально - опцион
Стратегия
1. Позиции нет - открыть длинный Call
2. Цена после длинного Call идет вверх в мою сторону - вертикальный спред
3. Цена после вертикального спреда идет вверх в мою сторону - бабочка
4. Цена после бабочки идет вверх в мою сторону - кондор и т.д.
5. Цена после кондора пошла против меня вниз - кондор или бабочка
6. Цена после бабочки пошла против меня вниз - вертикальный спред
7. Цена после вертикального спреда пошла против меня вниз - длинный Call
8. Цена после длинного Call идет вниз против меня - рэйтио-спред
9. Цена после рэйтио-спред идет вниз против меня - рождественская елка и т.д.
10. Цена после рождественской елки идет вверх в мою сторону - рейтио-спред
11. Цена после рейтио-спред идет вверх в мою сторону - длинный Call
1. Позиции нет - открыть длинный Put
2. Цена после длинного Put идет вниз в мою сторону - вертикальный спред
3. Цена после вертикального спреда идет вниз в мою сторону - бабочка
4. Цена после бабочки идет вниз в мою сторону - кондор и т.д.
5. Цена после кондора пошла против меня вверх - кондор или бабочка
6. Цена после бабочки пошла против меня вверх - вертикальный спред
7. Цена после вертикального спреда пошла против меня вверх - длинный Put
8. Цена после длинного Put идет вверх против меня - рэйтио-спред
9. Цена после рэйтио-спред идет вверх против меня - рождественская елка и т.д.
10. Цена после рождественской елки идет вниз в мою сторону - рейтио-спред
11. Цена после рейтио-спред идет вниз в мою сторону - длинный 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 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 | -- Скрипт торгует виртуально - опцион -- Стратегия -- 1. Позиции нет - открыть длинный Call -- 2. Цена после длинного Call идет вверх в мою сторону - вертикальный спред -- 3. Цена после вертикального спреда идет вверх в мою сторону - бабочка -- 4. Цена после бабочки идет вверх в мою сторону - кондор и т.д. -- 5. Цена после кондора пошла против меня вниз - кондор или бабочка -- 6. Цена после бабочки пошла против меня вниз - вертикальный спред -- 7. Цена после вертикального спреда пошла против меня вниз - длинный Call -- 8. Цена после длинного Call идет вниз против меня - рэйтио-спред -- 9. Цена после рэйтио-спред идет вниз против меня - рождественская елка и т.д. -- 10. Цена после рождественской елки идет вверх в мою сторону - рейтио-спред -- 11. Цена после рейтио-спред идет вверх в мою сторону - длинный Call -- 1. Позиции нет - открыть длинный Put -- 2. Цена после длинного Put идет вниз в мою сторону - вертикальный спред -- 3. Цена после вертикального спреда идет вниз в мою сторону - бабочка -- 4. Цена после бабочки идет вниз в мою сторону - кондор и т.д. -- 5. Цена после кондора пошла против меня вверх - кондор или бабочка -- 6. Цена после бабочки пошла против меня вверх - вертикальный спред -- 7. Цена после вертикального спреда пошла против меня вверх - длинный Put -- 8. Цена после длинного Put идет вверх против меня - рэйтио-спред -- 9. Цена после рэйтио-спред идет вверх против меня - рождественская елка и т.д. -- 10. Цена после рождественской елки идет вниз в мою сторону - рейтио-спред -- 11. Цена после рейтио-спред идет вниз в мою сторону - длинный Put Class_Fut = "SPBFUT"; -- Класс фьючерса Sec_Fut = "SRZ5"; -- Код фьючерса Class_Opt = "SPBOPT"; -- Класс опциона Sec_Call = "SR10500BL5"; -- Код опциона Call для открытия Sec_Put = "SR10500BX5"; -- Код опциона Put для открытия Step_Strike = 250; -- Шаг страйка Lots = 1; -- Лот 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 = 0; -- Объем 1 позиции Volume_P2 = 0; -- Объем 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 позиции All_Profit = 0; -- Общий заработанный профит -- Константы для строк таблицы 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 -- 16; -- Пустая строка Itogo = 17; -- Текущий профит Call + Put + заработанный профит IsRun = true; -- Флаг поддержания работы скрипта function OnInit() -- Функция вызывается терминалом QUIK перед вызовом функции main() local f = io.open(getScriptPath().."//robot.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 позиции elseif Count == 25 then All_Profit = tonumber(line); -- Общий заработанный профит end; end; f:close(); -- Закрывает файл end; if Open_C1 > 0 then Strike_C1 = tonumber(string.sub(Sec_C1, 3, #Sec_C1 - 3)); else Strike_C1 = 0 end -- Получили цифры страйка if Open_C2 > 0 then Strike_C2 = tonumber(string.sub(Sec_C2, 3, #Sec_C2 - 3)); else Strike_C2 = 0 end -- Получили цифры страйка if Open_C3 > 0 then Strike_C3 = tonumber(string.sub(Sec_C3, 3, #Sec_C3 - 3)); else Strike_C3 = 0 end -- Получили цифры страйка if Open_C4 > 0 then Strike_C4 = tonumber(string.sub(Sec_C4, 3, #Sec_C4 - 3)); else Strike_C4 = 0 end -- Получили цифры страйка if Open_P1 > 0 then Strike_P1 = tonumber(string.sub(Sec_P1, 3, #Sec_P1 - 3)); else Strike_P1 = 0 end -- Получили цифры страйка if Open_P2 > 0 then Strike_P2 = tonumber(string.sub(Sec_P2, 3, #Sec_P2 - 3)); else Strike_P2 = 0 end -- Получили цифры страйка if Open_P3 > 0 then Strike_P3 = tonumber(string.sub(Sec_P3, 3, #Sec_P3 - 3)); else Strike_P3 = 0 end -- Получили цифры страйка if Open_P4 > 0 then Strike_P4 = tonumber(string.sub(Sec_P4, 3, #Sec_P4 - 3)); else Strike_P4 = 0 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)); -- Выводит "Текущая цена фьючерса" в таблицу -- 1. Позиции нет - открыть длинный Call if Volume_C1 == 0 then Strike_C1 = tonumber(string.sub(Sec_Call, 3, #Sec_Call - 3)); -- Получили цифры страйка "Опциона Call для открытия" if Price > Strike_C1 - 0.1 * Step_Strike and Price < Strike_C1 + 0.1 * Step_Strike then Sec_C1 = Sec_Call; -- Код опциона в 1 позиции Volume_C1 = Lots; -- Объем 1 позиции Open_C1 = tonumber(getParamEx(Class_Opt, Sec_C1, "offer").param_value); -- Цена открытия 1 позиции 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)); -- Изменим таблицу end; end; -- 2. Цена после длинного Call идет вверх в мою сторону - вертикальный спред if Volume_C1 > 0 and Volume_C2 == 0 and Price > Strike_C1 + 0.5 * Step_Strike then Strike_C2 = tonumber(Strike_C1 + Step_Strike); -- Получили новый страйк Sec_C2 = string.sub(Sec_Call, 1, 2)..tostring(Strike_C2)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call); -- Код опциона в 2 позиции Volume_C2 = -Lots; -- Объем 2 позиции Open_C2 = tonumber(getParamEx(Class_Opt, Sec_C2, "bid").param_value); -- Цена открытия 2 позиции 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)); -- Изменим таблицу end; -- 3. Цена после вертикального спреда идет вверх в мою сторону - бабочка if Volume_C1 > 0 and Volume_C2 < 0 and Volume_C3 == 0 and Volume_C4 == 0 and Price > Strike_C2 - 0.1 * Step_Strike then Strike_C3 = tonumber(Strike_C2); -- Получили новый страйк Sec_C3 = Sec_C2; -- Код опциона в 3 позиции Volume_C3 = -Lots; -- Объем 3 позиции Open_C3 = tonumber(getParamEx(Class_Opt, Sec_C3, "bid").param_value); -- Цена открытия 3 позиции 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)); -- Изменим таблицу Strike_C4 = tonumber(Strike_C3 + Step_Strike); -- Получили новый страйк Sec_C4 = string.sub(Sec_Call, 1, 2)..tostring(Strike_C4)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call); -- Код опциона в 4 позиции Volume_C4 = Lots; -- Объем 4 позиции Open_C4 = tonumber(getParamEx(Class_Opt, Sec_C4, "offer").param_value); -- Цена открытия 4 позиции 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)); -- Изменим таблицу end; -- 4. Цена после бабочки идет вверх в мою сторону - кондор и т.д. if Volume_C1 > 0 and Volume_C2 < 0 and Volume_C3 < 0 and Volume_C4 > 0 and Price > Strike_C4 - 0.1 * Step_Strike then All_Profit = All_Profit + ProfitSell(Sec_C3, Volume_C3, Open_C3) + ProfitBuy(Sec_C4, Volume_C4, Open_C4); -- Прибыль/убыток от закрытия 3 и 4 позиций Strike_C3 = tonumber(Strike_C4); -- Получили новый страйк Sec_C3 = Sec_C4; -- Код опциона в 3 позиции Volume_C3 = -Lots; -- Объем 3 позиции Open_C3 = tonumber(getParamEx(Class_Opt, Sec_C3, "bid").param_value); -- Цена открытия 3 позиции 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)); -- Изменим таблицу Strike_C4 = (Strike_C3 + Step_Strike); -- Получили новый страйк Sec_C4 = string.sub(Sec_Call, 1, 2)..tostring(Strike_C4)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call); -- Код опциона в 4 позиции Volume_C4 = Lots; -- Объем 4 позиции Open_C4 = tonumber(getParamEx(Class_Opt, Sec_C4, "offer").param_value); -- Цена открытия 4 позиции 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)); -- Изменим таблицу end; -- 5. Цена после кондора пошла против меня вниз - кондор или бабочка if Strike_C2 < Strike_C3 and Volume_C1 > 0 and Volume_C2 < 0 and Volume_C3 < 0 and Volume_C4 > 0 and Price < Strike_C3 - 0.9 * Step_Strike and ProfitSell(Sec_C3, Volume_C3, Open_C3) + ProfitBuy(Sec_C4, Volume_C4, Open_C4) > 0 then All_Profit = All_Profit + ProfitSell(Sec_C3, Volume_C3, Open_C3) + ProfitBuy(Sec_C4, Volume_C4, Open_C4); -- Прибыль/убыток от закрытия 3 и 4 позиций Strike_C3 = tonumber(Strike_C3 - Step_Strike); -- Получили новый страйк Sec_C3 = string.sub(Sec_Call, 1, 2)..tostring(Strike_C3)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call); -- Код опциона в 3 позиции Volume_C3 = -Lots; -- Объем 3 позиции Open_C3 = tonumber(getParamEx(Class_Opt, Sec_C3, "bid").param_value); -- Цена открытия 3 позиции 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)); -- Изменим таблицу Strike_C4 = tonumber(Strike_C3 + Step_Strike); -- Получили новый страйк Sec_C4 = string.sub(Sec_Call, 1, 2)..tostring(Strike_C4)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call); -- Код опциона в 4 позиции Volume_C4 = Lots; -- Объем 4 позиции Open_C4 = tonumber(getParamEx(Class_Opt, Sec_C4, "offer").param_value); -- Цена открытия 4 позиции 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)); -- Изменим таблицу end; -- 6. Цена после бабочки пошла против меня вниз - вертикальный спред if Strike_C2 == Strike_C3 and Volume_C1 > 0 and Volume_C2 < 0 and Volume_C3 < 0 and Volume_C4 > 0 and Price < Strike_C3 - 0.5 * Step_Strike and ProfitSell(Sec_C3, Volume_C3, Open_C3) + ProfitBuy(Sec_C4, Volume_C4, Open_C4) > 0 then All_Profit = All_Profit + ProfitSell(Sec_C3, Volume_C3, Open_C3) + ProfitBuy(Sec_C4, Volume_C4, Open_C4); -- Прибыль/убыток от закрытия 3 и 4 позиций Strike_C3 = tonumber(0); -- Получили новый страйк Sec_C3 = ""; -- Код опциона в 3 позиции Volume_C3 = 0; -- Объем 3 позиции Open_C3 = 0; -- Цена открытия 3 позиции 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)); -- Изменим таблицу Strike_C4 = tonumber(0); -- Получили новый страйк Sec_C4 = ""; -- Код опциона в 3 позиции Volume_C4 = 0; -- Объем 3 позиции Open_C4 = 0; -- Цена открытия 3 позиции 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)); -- Изменим таблицу end; -- 7. Цена после вертикального спреда пошла против меня вниз - длинный Call if Volume_C1 > 0 and Volume_C2 < 0 and Volume_C3 == 0 and Price < Strike_C1 - 0.1 * Step_Strike and ProfitSell(Sec_C2, Volume_C2, Open_C2) > 0 then All_Profit = All_Profit + ProfitSell(Sec_C2, Volume_C2, Open_C2); -- Прибыль/убыток от закрытия 2 позиции Strike_C2 = tonumber(0); -- Получили новый страйк Sec_C2 = ""; -- Код опциона в 3 позиции Volume_C2 = 0; -- Объем 3 позиции Open_C2 = 0; -- Цена открытия 3 позиции 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)); -- Изменим таблицу end; -- 8. Цена после длинного Call идет вниз против меня - рэйтио-спред if Volume_C1 > 0 and Volume_C2 == 0 and Price < Strike_C1 - 0.5 * Step_Strike then Strike_C2 = tonumber(Strike_C1 + Step_Strike); -- Получили новый страйк Sec_C2 = string.sub(Sec_Call, 1, 2)..tostring(Strike_C2)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call); -- Код опциона в 2 позиции Volume_C2 = -2 * Lots; -- Объем 2 позиции Open_C2 = tonumber(getParamEx(Class_Opt, Sec_C2, "bid").param_value); -- Цена открытия 2 позиции 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)); -- Изменим таблицу end; -- 9. Цена после рэйтио-спред идет вниз против меня - рождественская елка и т.д. if Volume_C1 > 0 and Volume_C2 < 0 and Price < Strike_C1 - 0.9 * Step_Strike then if Volume_C3 == 0 then All_Profit = All_Profit + ProfitBuy(Sec_C1, Volume_C1, Open_C1) + ProfitSell(Sec_C2, Volume_C2 / 2, Open_C2); end; -- Прибыль/убыток от закрытия 1 и (1/2) 2 позиций if Volume_C3 < 0 then All_Profit = All_Profit + ProfitBuy(Sec_C1, Volume_C1, Open_C1) + ProfitSell(Sec_C3, Volume_C3, Open_C3); end; -- Прибыль/убыток от закрытия 1 и 3 позиций Strike_C1 = tonumber(Strike_C1 - Step_Strike); -- Получили новый страйк Sec_C1 = string.sub(Sec_Call, 1, 2)..tostring(Strike_C1)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call); -- Код опциона в 1 позиции Volume_C1 = Lots; -- Объем 1 позиции Open_C1 = tonumber(getParamEx(Class_Opt, Sec_C1, "offer").param_value); -- Цена открытия 1 позиции 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)); -- Изменим таблицу Strike_C2 = tonumber(Strike_C1 + Step_Strike); -- Получили новый страйк Sec_C2 = string.sub(Sec_Call, 1, 2)..tostring(Strike_C2)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call); -- Код опциона в 2 позиции Volume_C2 = -Lots; -- Объем 2 позиции Open_C3 = Open_C2; -- Цена открытия 3 позиции Open_C2 = tonumber(getParamEx(Class_Opt, Sec_C2, "bid").param_value); -- Цена открытия 2 позиции 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)); -- Изменим таблицу Strike_C3 = tonumber(Strike_C2 + Step_Strike); -- Получили новый страйк Sec_C3 = string.sub(Sec_Call, 1, 2)..tostring(Strike_C3)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call); -- Код опциона в 3 позиции Volume_C3 = -Lots; -- Объем 3 позиции 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)); -- Изменим таблицу end; -- 10. Цена после рождественской елки идет вверх в мою сторону - рейтио-спред if Volume_C1 > 0 and Volume_C2 < 0 and Volume_C3 < 0 and Volume_C4 == 0 and Price > Strike_C1 + 0.9 * Step_Strike then All_Profit = All_Profit + ProfitBuy(Sec_C1, Volume_C1, Open_C1) + ProfitSell(Sec_C2, Volume_C2, Open_C2); -- Прибыль/убыток от закрытия 1 и 2 позиций Strike_C1 = tonumber(Strike_C1 + Step_Strike); -- Получили новый страйк Sec_C1 = string.sub(Sec_Call, 1, 2)..tostring(Strike_C1)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call); -- Код опциона в 1 позиции Volume_C1 = Lots; -- Объем 1 позиции Open_C1 = tonumber(getParamEx(Class_Opt, Sec_C1, "offer").param_value); -- Цена открытия 1 позиции 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)); -- Изменим таблицу Strike_C2 = tonumber(Strike_C1 + Step_Strike); -- Получили новый страйк Sec_C2 = string.sub(Sec_Call, 1, 2)..tostring(Strike_C2)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call); -- Код опциона в 2 позиции Volume_C2 = -2 * Lots; -- Объем 2 позиции Open_C2 = (Open_C3 + tonumber(getParamEx(Class_Opt, Sec_C2, "bid").param_value)) / 2; -- Цена открытия 2 позиции 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)); -- Изменим таблицу Strike_C3 = tonumber(0); -- Получили новый страйк Sec_C3 = ""; -- Код опциона в 3 позиции Volume_C3 = 0; -- Объем 3 позиции Open_C3 = 0; -- Цена открытия 3 позиции 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)); -- Изменим таблицу end; -- 11. Цена после рейтио-спред идет вверх в мою сторону - длинный Call if Volume_C1 > 0 and Volume_C2 < 0 and Volume_C3 == 0 and Price > Strike_C1 + 0.9 * Step_Strike then All_Profit = All_Profit + ProfitBuy(Sec_C1, Volume_C1, Open_C1) + ProfitSell(Sec_C2, Volume_C2, Open_C2); -- Прибыль/убыток от закрытия 1 и 2 позиций Strike_C1 = tonumber(Strike_C1 + Step_Strike); -- Получили новый страйк Sec_C1 = string.sub(Sec_Call, 1, 2)..tostring(Strike_C1)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call); -- Код опциона в 1 позиции Volume_C1 = Lots; -- Объем 1 позиции Open_C1 = tonumber(getParamEx(Class_Opt, Sec_C1, "offer").param_value); -- Цена открытия 1 позиции 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)); -- Изменим таблицу Strike_C2 = tonumber(0); -- Получили новый страйк Sec_C2 = ""; -- Код опциона в 2 позиции Volume_C2 = 0; -- Объем 2 позиции Open_C2 = 0; -- Цена открытия 2 позиции 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)); -- Изменим таблицу end; -- 1. Позиции нет - открыть длинный Put if Volume_P1 == 0 then Strike_P1 = tonumber(string.sub(Sec_Put, 3, #Sec_Put - 3)); -- Получили цифры страйка "Опциона Put для открытия" if Price > Strike_P1 - 0.1 * Step_Strike and Price < Strike_P1 + 0.1 * Step_Strike then Sec_P1 = Sec_Put; -- Код опциона в 1 позиции Volume_P1 = Lots; -- Объем 1 позиции Open_P1 = tonumber(getParamEx(Class_Opt, Sec_P1, "offer").param_value); -- Цена открытия 1 позиции 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)); -- Изменим таблицу end; end; -- 2. Цена после длинного Put идет вниз в мою сторону - вертикальный спред if Volume_P1 > 0 and Volume_P2 == 0 and Price < Strike_P1 - 0.5 * Step_Strike then Strike_P2 = tonumber(Strike_P1 - Step_Strike); -- Получили новый страйк Sec_P2 = string.sub(Sec_Put, 1, 2)..tostring(Strike_P2)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put); -- Код опциона в 2 позиции Volume_P2 = -Lots; -- Объем 2 позиции Open_P2 = tonumber(getParamEx(Class_Opt, Sec_P2, "bid").param_value); -- Цена открытия 2 позиции 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)); -- Изменим таблицу end; -- 3. Цена после вертикального спреда идет вниз в мою сторону - бабочка if Volume_P1 > 0 and Volume_P2 < 0 and Volume_P3 == 0 and Volume_P4 == 0 and Price < Strike_P2 + 0.1 * Step_Strike then Strike_P3 = tonumber(Strike_P2); -- Получили новый страйк Sec_P3 = Sec_P2; -- Код опциона в 3 позиции Volume_P3 = -Lots; -- Объем 3 позиции Open_P3 = tonumber(getParamEx(Class_Opt, Sec_P3, "bid").param_value); -- Цена открытия 3 позиции 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)); -- Изменим таблицу Strike_P4 = tonumber(Strike_P3 - Step_Strike); -- Получили новый страйк Sec_P4 = string.sub(Sec_Put, 1, 2)..tostring(Strike_P4)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put); -- Код опциона в 4 позиции Volume_P4 = Lots; -- Объем 4 позиции Open_P4 = tonumber(getParamEx(Class_Opt, Sec_P4, "offer").param_value); -- Цена открытия 4 позиции 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)); -- Изменим таблицу end; -- 4. Цена после бабочки идет вниз в мою сторону - кондор и т.д. if Volume_P1 > 0 and Volume_P2 < 0 and Volume_P3 < 0 and Volume_P4 > 0 and Price < Strike_P4 + 0.1 * Step_Strike then All_Profit = All_Profit + ProfitSell(Sec_P3, Volume_P3, Open_P3) + ProfitBuy(Sec_P4, Volume_P4, Open_P4); -- Прибыль/убыток от закрытия 3 и 4 позиций Strike_P3 = tonumber(Strike_P4) -- Получили новый страйк Sec_P3 = Sec_P4; -- Код опциона в 3 позиции Volume_P3 = -Lots; -- Объем 3 позиции Open_P3 = tonumber(getParamEx(Class_Opt, Sec_P3, "bid").param_value); -- Цена открытия 3 позиции 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)); -- Изменим таблицу Strike_P4 = tonumber(Strike_P3 - Step_Strike); -- Получили новый страйк Sec_P4 = string.sub(Sec_Put, 1, 2)..tostring(Strike_P4)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put); -- Код опциона в 4 позиции Volume_P4 = Lots; -- Объем 4 позиции Open_P4 = tonumber(getParamEx(Class_Opt, Sec_P4, "offer").param_value); -- Цена открытия 4 позиции 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)); -- Изменим таблицу end; -- 5. Цена после кондора пошла против меня вверх - кондор или бабочка if Strike_P2 > Strike_P3 and Volume_P1 > 0 and Volume_P2 < 0 and Volume_P3 < 0 and Volume_P4 > 0 and Price > Strike_P3 + 0.9 * Step_Strike and ProfitSell(Sec_P3, Volume_P3, Open_P3) + ProfitBuy(Sec_P4, Volume_P4, Open_P4) > 0 then All_Profit = All_Profit + ProfitSell(Sec_P3, Volume_P3, Open_P3) + ProfitBuy(Sec_P4, Volume_P4, Open_P4); -- Прибыль/убыток от закрытия 3 и 4 позиций Strike_P3 = tonumber(Strike_P3 + Step_Strike); -- Получили новый страйк Sec_P3 = string.sub(Sec_Put, 1, 2)..tostring(Strike_P3)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put); -- Код опциона в 3 позиции Volume_P3 = -Lots; -- Объем 3 позиции Open_P3 = tonumber(getParamEx(Class_Opt, Sec_P3, "bid").param_value); -- Цена открытия 3 позиции 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)); -- Изменим таблицу Strike_P4 = tonumber(Strike_P3 - Step_Strike); -- Получили новый страйк Sec_P4 = string.sub(Sec_Put, 1, 2)..tostring(Strike_P4)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put); -- Код опциона в 4 позиции Volume_P4 = Lots; -- Объем 4 позиции Open_P4 = tonumber(getParamEx(Class_Opt, Sec_P4, "offer").param_value); -- Цена открытия 4 позиции 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)); -- Изменим таблицу end; -- 6. Цена после бабочки пошла против меня вверх - вертикальный спред if Strike_P2 == Strike_P3 and Volume_P1 > 0 and Volume_P2 < 0 and Volume_P3 < 0 and Volume_P4 > 0 and Price > Strike_P3 + 0.5 * Step_Strike and ProfitSell(Sec_P3, Volume_P3, Open_P3) + ProfitBuy(Sec_P4, Volume_P4, Open_P4) > 0 then All_Profit = All_Profit + ProfitSell(Sec_P3, Volume_P3, Open_P3) + ProfitBuy(Sec_P4, Volume_P4, Open_P4); -- Прибыль/убыток от закрытия 3 и 4 позиций Strike_P3 = tonumber(0); -- Получили новый страйк Sec_P3 = ""; -- Код опциона в 3 позиции Volume_P3 = 0; -- Объем 3 позиции Open_P3 = 0; -- Цена открытия 3 позиции 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)); -- Изменим таблицу Strike_P4 = tonumber(0); -- Получили новый страйк Sec_P4 = ""; -- Код опциона в 3 позиции Volume_P4 = 0; -- Объем 3 позиции Open_P4 = 0; -- Цена открытия 3 позиции 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)); -- Изменим таблицу end; -- 7. Цена после вертикального спреда пошла против меня вверх - длинный Put if Volume_P1 > 0 and Volume_P2 < 0 and Volume_P3 == 0 and Price > Strike_P1 + 0.1 * Step_Strike and ProfitSell(Sec_P2, Volume_P2, Open_P2) > 0 then All_Profit = All_Profit + ProfitSell(Sec_P2, Volume_P2, Open_P2); -- Прибыль/убыток от закрытия 2 позиции Strike_P2 = tonumber(0); -- Получили новый страйк Sec_P2 = ""; -- Код опциона в 3 позиции Volume_P2 = 0; -- Объем 3 позиции Open_P2 = 0; -- Цена открытия 3 позиции 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)); -- Изменим таблицу end; -- 8. Цена после длинного Put идет вверх против меня - рэйтио-спред if Volume_P1 > 0 and Volume_P2 == 0 and Price > Strike_P1 + 0.5 * Step_Strike then Strike_P2 = tonumber(Strike_P1 - Step_Strike); -- Получили новый страйк Sec_P2 = string.sub(Sec_Put, 1, 2)..tostring(Strike_P2)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put); -- Код опциона в 2 позиции Volume_P2 = -2 * Lots; -- Объем 2 позиции Open_P2 = tonumber(getParamEx(Class_Opt, Sec_P2, "bid").param_value); -- Цена открытия 2 позиции 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)); -- Изменим таблицу end; -- 9. Цена после рэйтио-спред идет вверх против меня - рождественская елка и т.д. if Volume_P1 > 0 and Volume_P2 < 0 and Price > Strike_P1 + 0.9 * Step_Strike then if Volume_P3 == 0 then All_Profit = All_Profit + ProfitBuy(Sec_P1, Volume_P1, Open_P1) + ProfitSell(Sec_P2, Volume_P2 / 2, Open_P2); end; -- Прибыль/убыток от закрытия 1 и (1/2) 2 позиций if Volume_P3 < 0 then All_Profit = All_Profit + ProfitBuy(Sec_P1, Volume_P1, Open_P1) + ProfitSell(Sec_P3, Volume_P3, Open_P3); end; -- Прибыль/убыток от закрытия 1 и 3 позиций Strike_P1 = tonumber(Strike_P1 + Step_Strike); -- Получили новый страйк Sec_P1 = string.sub(Sec_Put, 1, 2)..tostring(Strike_P1)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put); -- Код опциона в 1 позиции Volume_P1 = Lots; -- Объем 1 позиции Open_P1 = tonumber(getParamEx(Class_Opt, Sec_P1, "offer").param_value); -- Цена открытия 1 позиции 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)); -- Изменим таблицу Strike_P2 = tonumber(Strike_P1 - Step_Strike); -- Получили новый страйк Sec_P2 = string.sub(Sec_Put, 1, 2)..tostring(Strike_P2)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put); -- Код опциона в 2 позиции Volume_P2 = -Lots; -- Объем 2 позиции Open_P3 = Open_P2; -- Цена открытия 3 позиции Open_P2 = tonumber(getParamEx(Class_Opt, Sec_P2, "bid").param_value); -- Цена открытия 2 позиции 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)); -- Изменим таблицу Strike_P3 = tonumber(Strike_P2 - Step_Strike); -- Получили новый страйк Sec_P3 = string.sub(Sec_Put, 1, 2)..tostring(Strike_P3)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put); -- Код опциона в 3 позиции Volume_P3 = -Lots; -- Объем 3 позиции 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)); -- Изменим таблицу end; -- 10. Цена после рождественской елки идет вниз в мою сторону - рейтио-спред if Volume_P1 > 0 and Volume_P2 < 0 and Volume_P3 < 0 and Volume_P4 == 0 and Price < Strike_P1 - 0.9 * Step_Strike then All_Profit = All_Profit + ProfitBuy(Sec_P1, Volume_P1, Open_P1) + ProfitSell(Sec_P2, Volume_P2, Open_P2); -- Прибыль/убыток от закрытия 1 и 2 позиций Strike_P1 = tonumber(Strike_P1 - Step_Strike); -- Получили новый страйк Sec_P1 = string.sub(Sec_Put, 1, 2)..tostring(Strike_P1)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put); -- Код опциона в 1 позиции Volume_P1 = Lots; -- Объем 1 позиции Open_P1 = tonumber(getParamEx(Class_Opt, Sec_P1, "offer").param_value); -- Цена открытия 1 позиции 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)); -- Изменим таблицу Strike_P2 = tonumber(Strike_P1 - Step_Strike); -- Получили новый страйк Sec_P2 = string.sub(Sec_Put, 1, 2)..tostring(Strike_P2)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put); -- Код опциона в 2 позиции Volume_P2 = -2 * Lots; -- Объем 2 позиции Open_P2 = (Open_P3 + tonumber(getParamEx(Class_Opt, Sec_P2, "bid").param_value)) / 2; -- Цена открытия 2 позиции 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)); -- Изменим таблицу Strike_P3 = tonumber(0); -- Получили новый страйк Sec_P3 = ""; -- Код опциона в 3 позиции Volume_P3 = 0; -- Объем 3 позиции Open_P3 = 0; -- Цена открытия 3 позиции 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)); -- Изменим таблицу end; -- 11. Цена после рейтио-спред идет вниз в мою сторону - длинный Put if Volume_P1 > 0 and Volume_P2 < 0 and Volume_P3 == 0 and Price < Strike_P1 - 0.9 * Step_Strike then All_Profit = All_Profit + ProfitBuy(Sec_P1, Volume_P1, Open_P1) + ProfitSell(Sec_P2, Volume_P2, Open_P2); -- Прибыль/убыток от закрытия 1 и 2 позиций Strike_P1 = tonumber(Strike_P1 - Step_Strike); -- Получили новый страйк Sec_P1 = string.sub(Sec_Put, 1, 2)..tostring(Strike_P1)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put); -- Код опциона в 1 позиции Volume_P1 = Lots; -- Объем 1 позиции Open_P1 = tonumber(getParamEx(Class_Opt, Sec_P1, "offer").param_value); -- Цена открытия 1 позиции 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)); -- Изменим таблицу Strike_P2 = tonumber(0); -- Получили новый страйк Sec_P2 = ""; -- Код опциона в 2 позиции Volume_P2 = 0; -- Объем 2 позиции Open_P2 = 0; -- Цена открытия 2 позиции SetCell(t_id, Put_2, 0, Sec_C2); SetCell(t_id, Put_2, 1, tostring(Volume_P2)); SetCell(t_id, Put_2, 2, tostring(Open_P2)); -- Изменим таблицу end; sleep(100); end; end; function ProfitBuy(sec, volume, open) -- Функция считает текущий профит Buy local Bid = tonumber(getParamEx(Class_Opt, sec, "bid").param_value); -- Получает текущий bid по опциону local Profit = (Bid - open) * math.abs(volume) - Commission * 2 * math.abs(volume); -- Считает текущий профит по опционной позиции return(Profit); end; function StrBuy(str, sec, volume, open) -- Функция считает, выводит, окрашивает - текущий профит Buy local Profit = ProfitBuy(sec, volume, open); -- Считает текущий профит по опционной позиции SetCell(t_id, str, 3, tostring(Profit)); -- Выводит значение в таблицу if Profit > 0 then Green(str); elseif Profit == 0 then Gray(str); else Red(str); end; -- Окрашивает строку в зависимости от профита end; function ProfitSell(sec, volume, open) -- Функция считает текущий профит Sell local Offer = tonumber(getParamEx(Class_Opt, sec, "offer").param_value); -- Получает текущий offer по опциону local Profit = (open - Offer) * math.abs(volume) - Commission * 2 * math.abs(volume); -- Считает текущий профит по опционной позиции return(Profit); end; function StrSell(str, sec, volume, open) -- Функция считает, выводит, окрашивает - текущий профит Sell local Profit = ProfitSell(sec, volume, open); -- Считает текущий профит по опционной позиции SetCell(t_id, str, 3, tostring(Profit)); -- Выводит значение в таблицу if Profit > 0 then Green(str); elseif Profit == 0 then Gray(str); else Red(str); 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); InsertRow(t_id, 16); -- Пустая строка InsertRow(t_id, Itogo); -- Добавляет значения в ячейки 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)); SetCell(t_id, Itogo, 0, "Итого"); SetCell(t_id, Itogo, 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 StrBuy(Call_1, Sec_C1, Volume_C1, Open_C1); end; -- Считает, выводит, окрашивает - текущий профит по опционной позиции if Volume_C1 < 0 then StrSell(Call_1, Sec_C1, Volume_C1, Open_C1); end; end; if sec == Sec_C2 then if Volume_C2 > 0 then StrBuy(Call_2, Sec_C2, Volume_C2, Open_C2); end; -- Считает, выводит, окрашивает - текущий профит по опционной позиции if Volume_C2 < 0 then StrSell(Call_2, Sec_C2, Volume_C2, Open_C2); end; end; if sec == Sec_C3 then if Volume_C3 > 0 then StrBuy(Call_3, Sec_C3, Volume_C3, Open_C3); end; -- Считает, выводит, окрашивает - текущий профит по опционной позиции if Volume_C3 < 0 then StrSell(Call_3, Sec_C3, Volume_C3, Open_C3); end; end; if sec == Sec_C4 then if Volume_C4 > 0 then StrBuy(Call_4, Sec_C4, Volume_C4, Open_C4); end; -- Считает, выводит, окрашивает - текущий профит по опционной позиции if Volume_C4 < 0 then StrSell(Call_4, Sec_C4, Volume_C4, Open_C4); 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 StrBuy(Put_1, Sec_P1, Volume_P1, Open_P1); end; -- Считает, выводит, окрашивает - текущий профит по опционной позиции if Volume_P1 < 0 then StrSell(Put_1, Sec_P1, Volume_P1, Open_P1); end; end; if sec == Sec_P2 then if Volume_P2 > 0 then StrBuy(Put_2, Sec_P2, Volume_P2, Open_P2); end; -- Считает, выводит, окрашивает - текущий профит по опционной позиции if Volume_P2 < 0 then StrSell(Put_2, Sec_P2, Volume_P2, Open_P2); end; end; if sec == Sec_P3 then if Volume_P3 > 0 then StrBuy(Put_3, Sec_P3, Volume_P3, Open_P3); end; -- Считает, выводит, окрашивает - текущий профит по опционной позиции if Volume_P3 < 0 then StrSell(Put_3, Sec_P3, Volume_P3, Open_P3); end; end; if sec == Sec_P4 then if Volume_P4 > 0 then StrBuy(Put_4, Sec_P4, Volume_P4, Open_P4); end; -- Считает, выводит, окрашивает - текущий профит по опционной позиции if Volume_P4 < 0 then StrSell(Put_4, Sec_P4, Volume_P4, Open_P4); 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; local Profit = tonumber(GetCell(t_id, Itogo_CP, 3).image) + All_Profit; -- Общий текущий профит Call + Put + общий заработанный профит SetCell(t_id, Itogo, 3, tostring(Profit)); if Profit > 0 then Green(Itogo); elseif Profit == 0 then Gray(Itogo); else Red(Itogo); end; end; end; function OnStop() -- Функция вызывается терминалом QUIK при остановке скрипта из диалога управления -- Сохранение текущего состояния в файл local f = io.open(getScriptPath().."//robot.txt","r+"); -- Пытается открыть файл в режиме "чтения/записи" if f == nil then -- Если файл не существует f = io.open(getScriptPath().."//robot.txt","w"); -- Создает файл в режиме "записи" f:close(); -- Закрывает файл f = io.open(getScriptPath().."//robot.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:write(tostring(All_Profit).."\n"); -- Общий заработанный профит f:flush(); -- Сохраняет изменения в файле f:close(); -- Закрывает файл IsRun = false; end; |
-- Скрипт торгует виртуально - опцион -- Стратегия -- 1. Позиции нет - открыть длинный Call -- 2. Цена после длинного Call идет вверх в мою сторону - вертикальный спред -- 3. Цена после вертикального спреда идет вверх в мою сторону - бабочка -- 4. Цена после бабочки идет вверх в мою сторону - кондор и т.д. -- 5. Цена после кондора пошла против меня вниз - кондор или бабочка -- 6. Цена после бабочки пошла против меня вниз - вертикальный спред -- 7. Цена после вертикального спреда пошла против меня вниз - длинный Call -- 8. Цена после длинного Call идет вниз против меня - рэйтио-спред -- 9. Цена после рэйтио-спред идет вниз против меня - рождественская елка и т.д. -- 10. Цена после рождественской елки идет вверх в мою сторону - рейтио-спред -- 11. Цена после рейтио-спред идет вверх в мою сторону - длинный Call -- 1. Позиции нет - открыть длинный Put -- 2. Цена после длинного Put идет вниз в мою сторону - вертикальный спред -- 3. Цена после вертикального спреда идет вниз в мою сторону - бабочка -- 4. Цена после бабочки идет вниз в мою сторону - кондор и т.д. -- 5. Цена после кондора пошла против меня вверх - кондор или бабочка -- 6. Цена после бабочки пошла против меня вверх - вертикальный спред -- 7. Цена после вертикального спреда пошла против меня вверх - длинный Put -- 8. Цена после длинного Put идет вверх против меня - рэйтио-спред -- 9. Цена после рэйтио-спред идет вверх против меня - рождественская елка и т.д. -- 10. Цена после рождественской елки идет вниз в мою сторону - рейтио-спред -- 11. Цена после рейтио-спред идет вниз в мою сторону - длинный Put Class_Fut = "SPBFUT"; -- Класс фьючерса Sec_Fut = "SRZ5"; -- Код фьючерса Class_Opt = "SPBOPT"; -- Класс опциона Sec_Call = "SR10500BL5"; -- Код опциона Call для открытия Sec_Put = "SR10500BX5"; -- Код опциона Put для открытия Step_Strike = 250; -- Шаг страйка Lots = 1; -- Лот 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 = 0; -- Объем 1 позиции Volume_P2 = 0; -- Объем 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 позиции All_Profit = 0; -- Общий заработанный профит -- Константы для строк таблицы 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 -- 16; -- Пустая строка Itogo = 17; -- Текущий профит Call + Put + заработанный профит IsRun = true; -- Флаг поддержания работы скрипта function OnInit() -- Функция вызывается терминалом QUIK перед вызовом функции main() local f = io.open(getScriptPath().."//robot.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 позиции elseif Count == 25 then All_Profit = tonumber(line); -- Общий заработанный профит end; end; f:close(); -- Закрывает файл end; if Open_C1 > 0 then Strike_C1 = tonumber(string.sub(Sec_C1, 3, #Sec_C1 - 3)); else Strike_C1 = 0 end -- Получили цифры страйка if Open_C2 > 0 then Strike_C2 = tonumber(string.sub(Sec_C2, 3, #Sec_C2 - 3)); else Strike_C2 = 0 end -- Получили цифры страйка if Open_C3 > 0 then Strike_C3 = tonumber(string.sub(Sec_C3, 3, #Sec_C3 - 3)); else Strike_C3 = 0 end -- Получили цифры страйка if Open_C4 > 0 then Strike_C4 = tonumber(string.sub(Sec_C4, 3, #Sec_C4 - 3)); else Strike_C4 = 0 end -- Получили цифры страйка if Open_P1 > 0 then Strike_P1 = tonumber(string.sub(Sec_P1, 3, #Sec_P1 - 3)); else Strike_P1 = 0 end -- Получили цифры страйка if Open_P2 > 0 then Strike_P2 = tonumber(string.sub(Sec_P2, 3, #Sec_P2 - 3)); else Strike_P2 = 0 end -- Получили цифры страйка if Open_P3 > 0 then Strike_P3 = tonumber(string.sub(Sec_P3, 3, #Sec_P3 - 3)); else Strike_P3 = 0 end -- Получили цифры страйка if Open_P4 > 0 then Strike_P4 = tonumber(string.sub(Sec_P4, 3, #Sec_P4 - 3)); else Strike_P4 = 0 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)); -- Выводит "Текущая цена фьючерса" в таблицу -- 1. Позиции нет - открыть длинный Call if Volume_C1 == 0 then Strike_C1 = tonumber(string.sub(Sec_Call, 3, #Sec_Call - 3)); -- Получили цифры страйка "Опциона Call для открытия" if Price > Strike_C1 - 0.1 * Step_Strike and Price < Strike_C1 + 0.1 * Step_Strike then Sec_C1 = Sec_Call; -- Код опциона в 1 позиции Volume_C1 = Lots; -- Объем 1 позиции Open_C1 = tonumber(getParamEx(Class_Opt, Sec_C1, "offer").param_value); -- Цена открытия 1 позиции 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)); -- Изменим таблицу end; end; -- 2. Цена после длинного Call идет вверх в мою сторону - вертикальный спред if Volume_C1 > 0 and Volume_C2 == 0 and Price > Strike_C1 + 0.5 * Step_Strike then Strike_C2 = tonumber(Strike_C1 + Step_Strike); -- Получили новый страйк Sec_C2 = string.sub(Sec_Call, 1, 2)..tostring(Strike_C2)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call); -- Код опциона в 2 позиции Volume_C2 = -Lots; -- Объем 2 позиции Open_C2 = tonumber(getParamEx(Class_Opt, Sec_C2, "bid").param_value); -- Цена открытия 2 позиции 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)); -- Изменим таблицу end; -- 3. Цена после вертикального спреда идет вверх в мою сторону - бабочка if Volume_C1 > 0 and Volume_C2 < 0 and Volume_C3 == 0 and Volume_C4 == 0 and Price > Strike_C2 - 0.1 * Step_Strike then Strike_C3 = tonumber(Strike_C2); -- Получили новый страйк Sec_C3 = Sec_C2; -- Код опциона в 3 позиции Volume_C3 = -Lots; -- Объем 3 позиции Open_C3 = tonumber(getParamEx(Class_Opt, Sec_C3, "bid").param_value); -- Цена открытия 3 позиции 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)); -- Изменим таблицу Strike_C4 = tonumber(Strike_C3 + Step_Strike); -- Получили новый страйк Sec_C4 = string.sub(Sec_Call, 1, 2)..tostring(Strike_C4)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call); -- Код опциона в 4 позиции Volume_C4 = Lots; -- Объем 4 позиции Open_C4 = tonumber(getParamEx(Class_Opt, Sec_C4, "offer").param_value); -- Цена открытия 4 позиции 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)); -- Изменим таблицу end; -- 4. Цена после бабочки идет вверх в мою сторону - кондор и т.д. if Volume_C1 > 0 and Volume_C2 < 0 and Volume_C3 < 0 and Volume_C4 > 0 and Price > Strike_C4 - 0.1 * Step_Strike then All_Profit = All_Profit + ProfitSell(Sec_C3, Volume_C3, Open_C3) + ProfitBuy(Sec_C4, Volume_C4, Open_C4); -- Прибыль/убыток от закрытия 3 и 4 позиций Strike_C3 = tonumber(Strike_C4); -- Получили новый страйк Sec_C3 = Sec_C4; -- Код опциона в 3 позиции Volume_C3 = -Lots; -- Объем 3 позиции Open_C3 = tonumber(getParamEx(Class_Opt, Sec_C3, "bid").param_value); -- Цена открытия 3 позиции 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)); -- Изменим таблицу Strike_C4 = (Strike_C3 + Step_Strike); -- Получили новый страйк Sec_C4 = string.sub(Sec_Call, 1, 2)..tostring(Strike_C4)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call); -- Код опциона в 4 позиции Volume_C4 = Lots; -- Объем 4 позиции Open_C4 = tonumber(getParamEx(Class_Opt, Sec_C4, "offer").param_value); -- Цена открытия 4 позиции 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)); -- Изменим таблицу end; -- 5. Цена после кондора пошла против меня вниз - кондор или бабочка if Strike_C2 < Strike_C3 and Volume_C1 > 0 and Volume_C2 < 0 and Volume_C3 < 0 and Volume_C4 > 0 and Price < Strike_C3 - 0.9 * Step_Strike and ProfitSell(Sec_C3, Volume_C3, Open_C3) + ProfitBuy(Sec_C4, Volume_C4, Open_C4) > 0 then All_Profit = All_Profit + ProfitSell(Sec_C3, Volume_C3, Open_C3) + ProfitBuy(Sec_C4, Volume_C4, Open_C4); -- Прибыль/убыток от закрытия 3 и 4 позиций Strike_C3 = tonumber(Strike_C3 - Step_Strike); -- Получили новый страйк Sec_C3 = string.sub(Sec_Call, 1, 2)..tostring(Strike_C3)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call); -- Код опциона в 3 позиции Volume_C3 = -Lots; -- Объем 3 позиции Open_C3 = tonumber(getParamEx(Class_Opt, Sec_C3, "bid").param_value); -- Цена открытия 3 позиции 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)); -- Изменим таблицу Strike_C4 = tonumber(Strike_C3 + Step_Strike); -- Получили новый страйк Sec_C4 = string.sub(Sec_Call, 1, 2)..tostring(Strike_C4)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call); -- Код опциона в 4 позиции Volume_C4 = Lots; -- Объем 4 позиции Open_C4 = tonumber(getParamEx(Class_Opt, Sec_C4, "offer").param_value); -- Цена открытия 4 позиции 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)); -- Изменим таблицу end; -- 6. Цена после бабочки пошла против меня вниз - вертикальный спред if Strike_C2 == Strike_C3 and Volume_C1 > 0 and Volume_C2 < 0 and Volume_C3 < 0 and Volume_C4 > 0 and Price < Strike_C3 - 0.5 * Step_Strike and ProfitSell(Sec_C3, Volume_C3, Open_C3) + ProfitBuy(Sec_C4, Volume_C4, Open_C4) > 0 then All_Profit = All_Profit + ProfitSell(Sec_C3, Volume_C3, Open_C3) + ProfitBuy(Sec_C4, Volume_C4, Open_C4); -- Прибыль/убыток от закрытия 3 и 4 позиций Strike_C3 = tonumber(0); -- Получили новый страйк Sec_C3 = ""; -- Код опциона в 3 позиции Volume_C3 = 0; -- Объем 3 позиции Open_C3 = 0; -- Цена открытия 3 позиции 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)); -- Изменим таблицу Strike_C4 = tonumber(0); -- Получили новый страйк Sec_C4 = ""; -- Код опциона в 3 позиции Volume_C4 = 0; -- Объем 3 позиции Open_C4 = 0; -- Цена открытия 3 позиции 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)); -- Изменим таблицу end; -- 7. Цена после вертикального спреда пошла против меня вниз - длинный Call if Volume_C1 > 0 and Volume_C2 < 0 and Volume_C3 == 0 and Price < Strike_C1 - 0.1 * Step_Strike and ProfitSell(Sec_C2, Volume_C2, Open_C2) > 0 then All_Profit = All_Profit + ProfitSell(Sec_C2, Volume_C2, Open_C2); -- Прибыль/убыток от закрытия 2 позиции Strike_C2 = tonumber(0); -- Получили новый страйк Sec_C2 = ""; -- Код опциона в 3 позиции Volume_C2 = 0; -- Объем 3 позиции Open_C2 = 0; -- Цена открытия 3 позиции 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)); -- Изменим таблицу end; -- 8. Цена после длинного Call идет вниз против меня - рэйтио-спред if Volume_C1 > 0 and Volume_C2 == 0 and Price < Strike_C1 - 0.5 * Step_Strike then Strike_C2 = tonumber(Strike_C1 + Step_Strike); -- Получили новый страйк Sec_C2 = string.sub(Sec_Call, 1, 2)..tostring(Strike_C2)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call); -- Код опциона в 2 позиции Volume_C2 = -2 * Lots; -- Объем 2 позиции Open_C2 = tonumber(getParamEx(Class_Opt, Sec_C2, "bid").param_value); -- Цена открытия 2 позиции 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)); -- Изменим таблицу end; -- 9. Цена после рэйтио-спред идет вниз против меня - рождественская елка и т.д. if Volume_C1 > 0 and Volume_C2 < 0 and Price < Strike_C1 - 0.9 * Step_Strike then if Volume_C3 == 0 then All_Profit = All_Profit + ProfitBuy(Sec_C1, Volume_C1, Open_C1) + ProfitSell(Sec_C2, Volume_C2 / 2, Open_C2); end; -- Прибыль/убыток от закрытия 1 и (1/2) 2 позиций if Volume_C3 < 0 then All_Profit = All_Profit + ProfitBuy(Sec_C1, Volume_C1, Open_C1) + ProfitSell(Sec_C3, Volume_C3, Open_C3); end; -- Прибыль/убыток от закрытия 1 и 3 позиций Strike_C1 = tonumber(Strike_C1 - Step_Strike); -- Получили новый страйк Sec_C1 = string.sub(Sec_Call, 1, 2)..tostring(Strike_C1)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call); -- Код опциона в 1 позиции Volume_C1 = Lots; -- Объем 1 позиции Open_C1 = tonumber(getParamEx(Class_Opt, Sec_C1, "offer").param_value); -- Цена открытия 1 позиции 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)); -- Изменим таблицу Strike_C2 = tonumber(Strike_C1 + Step_Strike); -- Получили новый страйк Sec_C2 = string.sub(Sec_Call, 1, 2)..tostring(Strike_C2)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call); -- Код опциона в 2 позиции Volume_C2 = -Lots; -- Объем 2 позиции Open_C3 = Open_C2; -- Цена открытия 3 позиции Open_C2 = tonumber(getParamEx(Class_Opt, Sec_C2, "bid").param_value); -- Цена открытия 2 позиции 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)); -- Изменим таблицу Strike_C3 = tonumber(Strike_C2 + Step_Strike); -- Получили новый страйк Sec_C3 = string.sub(Sec_Call, 1, 2)..tostring(Strike_C3)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call); -- Код опциона в 3 позиции Volume_C3 = -Lots; -- Объем 3 позиции 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)); -- Изменим таблицу end; -- 10. Цена после рождественской елки идет вверх в мою сторону - рейтио-спред if Volume_C1 > 0 and Volume_C2 < 0 and Volume_C3 < 0 and Volume_C4 == 0 and Price > Strike_C1 + 0.9 * Step_Strike then All_Profit = All_Profit + ProfitBuy(Sec_C1, Volume_C1, Open_C1) + ProfitSell(Sec_C2, Volume_C2, Open_C2); -- Прибыль/убыток от закрытия 1 и 2 позиций Strike_C1 = tonumber(Strike_C1 + Step_Strike); -- Получили новый страйк Sec_C1 = string.sub(Sec_Call, 1, 2)..tostring(Strike_C1)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call); -- Код опциона в 1 позиции Volume_C1 = Lots; -- Объем 1 позиции Open_C1 = tonumber(getParamEx(Class_Opt, Sec_C1, "offer").param_value); -- Цена открытия 1 позиции 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)); -- Изменим таблицу Strike_C2 = tonumber(Strike_C1 + Step_Strike); -- Получили новый страйк Sec_C2 = string.sub(Sec_Call, 1, 2)..tostring(Strike_C2)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call); -- Код опциона в 2 позиции Volume_C2 = -2 * Lots; -- Объем 2 позиции Open_C2 = (Open_C3 + tonumber(getParamEx(Class_Opt, Sec_C2, "bid").param_value)) / 2; -- Цена открытия 2 позиции 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)); -- Изменим таблицу Strike_C3 = tonumber(0); -- Получили новый страйк Sec_C3 = ""; -- Код опциона в 3 позиции Volume_C3 = 0; -- Объем 3 позиции Open_C3 = 0; -- Цена открытия 3 позиции 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)); -- Изменим таблицу end; -- 11. Цена после рейтио-спред идет вверх в мою сторону - длинный Call if Volume_C1 > 0 and Volume_C2 < 0 and Volume_C3 == 0 and Price > Strike_C1 + 0.9 * Step_Strike then All_Profit = All_Profit + ProfitBuy(Sec_C1, Volume_C1, Open_C1) + ProfitSell(Sec_C2, Volume_C2, Open_C2); -- Прибыль/убыток от закрытия 1 и 2 позиций Strike_C1 = tonumber(Strike_C1 + Step_Strike); -- Получили новый страйк Sec_C1 = string.sub(Sec_Call, 1, 2)..tostring(Strike_C1)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call); -- Код опциона в 1 позиции Volume_C1 = Lots; -- Объем 1 позиции Open_C1 = tonumber(getParamEx(Class_Opt, Sec_C1, "offer").param_value); -- Цена открытия 1 позиции 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)); -- Изменим таблицу Strike_C2 = tonumber(0); -- Получили новый страйк Sec_C2 = ""; -- Код опциона в 2 позиции Volume_C2 = 0; -- Объем 2 позиции Open_C2 = 0; -- Цена открытия 2 позиции 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)); -- Изменим таблицу end; -- 1. Позиции нет - открыть длинный Put if Volume_P1 == 0 then Strike_P1 = tonumber(string.sub(Sec_Put, 3, #Sec_Put - 3)); -- Получили цифры страйка "Опциона Put для открытия" if Price > Strike_P1 - 0.1 * Step_Strike and Price < Strike_P1 + 0.1 * Step_Strike then Sec_P1 = Sec_Put; -- Код опциона в 1 позиции Volume_P1 = Lots; -- Объем 1 позиции Open_P1 = tonumber(getParamEx(Class_Opt, Sec_P1, "offer").param_value); -- Цена открытия 1 позиции 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)); -- Изменим таблицу end; end; -- 2. Цена после длинного Put идет вниз в мою сторону - вертикальный спред if Volume_P1 > 0 and Volume_P2 == 0 and Price < Strike_P1 - 0.5 * Step_Strike then Strike_P2 = tonumber(Strike_P1 - Step_Strike); -- Получили новый страйк Sec_P2 = string.sub(Sec_Put, 1, 2)..tostring(Strike_P2)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put); -- Код опциона в 2 позиции Volume_P2 = -Lots; -- Объем 2 позиции Open_P2 = tonumber(getParamEx(Class_Opt, Sec_P2, "bid").param_value); -- Цена открытия 2 позиции 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)); -- Изменим таблицу end; -- 3. Цена после вертикального спреда идет вниз в мою сторону - бабочка if Volume_P1 > 0 and Volume_P2 < 0 and Volume_P3 == 0 and Volume_P4 == 0 and Price < Strike_P2 + 0.1 * Step_Strike then Strike_P3 = tonumber(Strike_P2); -- Получили новый страйк Sec_P3 = Sec_P2; -- Код опциона в 3 позиции Volume_P3 = -Lots; -- Объем 3 позиции Open_P3 = tonumber(getParamEx(Class_Opt, Sec_P3, "bid").param_value); -- Цена открытия 3 позиции 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)); -- Изменим таблицу Strike_P4 = tonumber(Strike_P3 - Step_Strike); -- Получили новый страйк Sec_P4 = string.sub(Sec_Put, 1, 2)..tostring(Strike_P4)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put); -- Код опциона в 4 позиции Volume_P4 = Lots; -- Объем 4 позиции Open_P4 = tonumber(getParamEx(Class_Opt, Sec_P4, "offer").param_value); -- Цена открытия 4 позиции 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)); -- Изменим таблицу end; -- 4. Цена после бабочки идет вниз в мою сторону - кондор и т.д. if Volume_P1 > 0 and Volume_P2 < 0 and Volume_P3 < 0 and Volume_P4 > 0 and Price < Strike_P4 + 0.1 * Step_Strike then All_Profit = All_Profit + ProfitSell(Sec_P3, Volume_P3, Open_P3) + ProfitBuy(Sec_P4, Volume_P4, Open_P4); -- Прибыль/убыток от закрытия 3 и 4 позиций Strike_P3 = tonumber(Strike_P4) -- Получили новый страйк Sec_P3 = Sec_P4; -- Код опциона в 3 позиции Volume_P3 = -Lots; -- Объем 3 позиции Open_P3 = tonumber(getParamEx(Class_Opt, Sec_P3, "bid").param_value); -- Цена открытия 3 позиции 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)); -- Изменим таблицу Strike_P4 = tonumber(Strike_P3 - Step_Strike); -- Получили новый страйк Sec_P4 = string.sub(Sec_Put, 1, 2)..tostring(Strike_P4)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put); -- Код опциона в 4 позиции Volume_P4 = Lots; -- Объем 4 позиции Open_P4 = tonumber(getParamEx(Class_Opt, Sec_P4, "offer").param_value); -- Цена открытия 4 позиции 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)); -- Изменим таблицу end; -- 5. Цена после кондора пошла против меня вверх - кондор или бабочка if Strike_P2 > Strike_P3 and Volume_P1 > 0 and Volume_P2 < 0 and Volume_P3 < 0 and Volume_P4 > 0 and Price > Strike_P3 + 0.9 * Step_Strike and ProfitSell(Sec_P3, Volume_P3, Open_P3) + ProfitBuy(Sec_P4, Volume_P4, Open_P4) > 0 then All_Profit = All_Profit + ProfitSell(Sec_P3, Volume_P3, Open_P3) + ProfitBuy(Sec_P4, Volume_P4, Open_P4); -- Прибыль/убыток от закрытия 3 и 4 позиций Strike_P3 = tonumber(Strike_P3 + Step_Strike); -- Получили новый страйк Sec_P3 = string.sub(Sec_Put, 1, 2)..tostring(Strike_P3)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put); -- Код опциона в 3 позиции Volume_P3 = -Lots; -- Объем 3 позиции Open_P3 = tonumber(getParamEx(Class_Opt, Sec_P3, "bid").param_value); -- Цена открытия 3 позиции 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)); -- Изменим таблицу Strike_P4 = tonumber(Strike_P3 - Step_Strike); -- Получили новый страйк Sec_P4 = string.sub(Sec_Put, 1, 2)..tostring(Strike_P4)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put); -- Код опциона в 4 позиции Volume_P4 = Lots; -- Объем 4 позиции Open_P4 = tonumber(getParamEx(Class_Opt, Sec_P4, "offer").param_value); -- Цена открытия 4 позиции 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)); -- Изменим таблицу end; -- 6. Цена после бабочки пошла против меня вверх - вертикальный спред if Strike_P2 == Strike_P3 and Volume_P1 > 0 and Volume_P2 < 0 and Volume_P3 < 0 and Volume_P4 > 0 and Price > Strike_P3 + 0.5 * Step_Strike and ProfitSell(Sec_P3, Volume_P3, Open_P3) + ProfitBuy(Sec_P4, Volume_P4, Open_P4) > 0 then All_Profit = All_Profit + ProfitSell(Sec_P3, Volume_P3, Open_P3) + ProfitBuy(Sec_P4, Volume_P4, Open_P4); -- Прибыль/убыток от закрытия 3 и 4 позиций Strike_P3 = tonumber(0); -- Получили новый страйк Sec_P3 = ""; -- Код опциона в 3 позиции Volume_P3 = 0; -- Объем 3 позиции Open_P3 = 0; -- Цена открытия 3 позиции 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)); -- Изменим таблицу Strike_P4 = tonumber(0); -- Получили новый страйк Sec_P4 = ""; -- Код опциона в 3 позиции Volume_P4 = 0; -- Объем 3 позиции Open_P4 = 0; -- Цена открытия 3 позиции 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)); -- Изменим таблицу end; -- 7. Цена после вертикального спреда пошла против меня вверх - длинный Put if Volume_P1 > 0 and Volume_P2 < 0 and Volume_P3 == 0 and Price > Strike_P1 + 0.1 * Step_Strike and ProfitSell(Sec_P2, Volume_P2, Open_P2) > 0 then All_Profit = All_Profit + ProfitSell(Sec_P2, Volume_P2, Open_P2); -- Прибыль/убыток от закрытия 2 позиции Strike_P2 = tonumber(0); -- Получили новый страйк Sec_P2 = ""; -- Код опциона в 3 позиции Volume_P2 = 0; -- Объем 3 позиции Open_P2 = 0; -- Цена открытия 3 позиции 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)); -- Изменим таблицу end; -- 8. Цена после длинного Put идет вверх против меня - рэйтио-спред if Volume_P1 > 0 and Volume_P2 == 0 and Price > Strike_P1 + 0.5 * Step_Strike then Strike_P2 = tonumber(Strike_P1 - Step_Strike); -- Получили новый страйк Sec_P2 = string.sub(Sec_Put, 1, 2)..tostring(Strike_P2)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put); -- Код опциона в 2 позиции Volume_P2 = -2 * Lots; -- Объем 2 позиции Open_P2 = tonumber(getParamEx(Class_Opt, Sec_P2, "bid").param_value); -- Цена открытия 2 позиции 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)); -- Изменим таблицу end; -- 9. Цена после рэйтио-спред идет вверх против меня - рождественская елка и т.д. if Volume_P1 > 0 and Volume_P2 < 0 and Price > Strike_P1 + 0.9 * Step_Strike then if Volume_P3 == 0 then All_Profit = All_Profit + ProfitBuy(Sec_P1, Volume_P1, Open_P1) + ProfitSell(Sec_P2, Volume_P2 / 2, Open_P2); end; -- Прибыль/убыток от закрытия 1 и (1/2) 2 позиций if Volume_P3 < 0 then All_Profit = All_Profit + ProfitBuy(Sec_P1, Volume_P1, Open_P1) + ProfitSell(Sec_P3, Volume_P3, Open_P3); end; -- Прибыль/убыток от закрытия 1 и 3 позиций Strike_P1 = tonumber(Strike_P1 + Step_Strike); -- Получили новый страйк Sec_P1 = string.sub(Sec_Put, 1, 2)..tostring(Strike_P1)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put); -- Код опциона в 1 позиции Volume_P1 = Lots; -- Объем 1 позиции Open_P1 = tonumber(getParamEx(Class_Opt, Sec_P1, "offer").param_value); -- Цена открытия 1 позиции 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)); -- Изменим таблицу Strike_P2 = tonumber(Strike_P1 - Step_Strike); -- Получили новый страйк Sec_P2 = string.sub(Sec_Put, 1, 2)..tostring(Strike_P2)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put); -- Код опциона в 2 позиции Volume_P2 = -Lots; -- Объем 2 позиции Open_P3 = Open_P2; -- Цена открытия 3 позиции Open_P2 = tonumber(getParamEx(Class_Opt, Sec_P2, "bid").param_value); -- Цена открытия 2 позиции 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)); -- Изменим таблицу Strike_P3 = tonumber(Strike_P2 - Step_Strike); -- Получили новый страйк Sec_P3 = string.sub(Sec_Put, 1, 2)..tostring(Strike_P3)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put); -- Код опциона в 3 позиции Volume_P3 = -Lots; -- Объем 3 позиции 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)); -- Изменим таблицу end; -- 10. Цена после рождественской елки идет вниз в мою сторону - рейтио-спред if Volume_P1 > 0 and Volume_P2 < 0 and Volume_P3 < 0 and Volume_P4 == 0 and Price < Strike_P1 - 0.9 * Step_Strike then All_Profit = All_Profit + ProfitBuy(Sec_P1, Volume_P1, Open_P1) + ProfitSell(Sec_P2, Volume_P2, Open_P2); -- Прибыль/убыток от закрытия 1 и 2 позиций Strike_P1 = tonumber(Strike_P1 - Step_Strike); -- Получили новый страйк Sec_P1 = string.sub(Sec_Put, 1, 2)..tostring(Strike_P1)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put); -- Код опциона в 1 позиции Volume_P1 = Lots; -- Объем 1 позиции Open_P1 = tonumber(getParamEx(Class_Opt, Sec_P1, "offer").param_value); -- Цена открытия 1 позиции 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)); -- Изменим таблицу Strike_P2 = tonumber(Strike_P1 - Step_Strike); -- Получили новый страйк Sec_P2 = string.sub(Sec_Put, 1, 2)..tostring(Strike_P2)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put); -- Код опциона в 2 позиции Volume_P2 = -2 * Lots; -- Объем 2 позиции Open_P2 = (Open_P3 + tonumber(getParamEx(Class_Opt, Sec_P2, "bid").param_value)) / 2; -- Цена открытия 2 позиции 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)); -- Изменим таблицу Strike_P3 = tonumber(0); -- Получили новый страйк Sec_P3 = ""; -- Код опциона в 3 позиции Volume_P3 = 0; -- Объем 3 позиции Open_P3 = 0; -- Цена открытия 3 позиции 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)); -- Изменим таблицу end; -- 11. Цена после рейтио-спред идет вниз в мою сторону - длинный Put if Volume_P1 > 0 and Volume_P2 < 0 and Volume_P3 == 0 and Price < Strike_P1 - 0.9 * Step_Strike then All_Profit = All_Profit + ProfitBuy(Sec_P1, Volume_P1, Open_P1) + ProfitSell(Sec_P2, Volume_P2, Open_P2); -- Прибыль/убыток от закрытия 1 и 2 позиций Strike_P1 = tonumber(Strike_P1 - Step_Strike); -- Получили новый страйк Sec_P1 = string.sub(Sec_Put, 1, 2)..tostring(Strike_P1)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put); -- Код опциона в 1 позиции Volume_P1 = Lots; -- Объем 1 позиции Open_P1 = tonumber(getParamEx(Class_Opt, Sec_P1, "offer").param_value); -- Цена открытия 1 позиции 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)); -- Изменим таблицу Strike_P2 = tonumber(0); -- Получили новый страйк Sec_P2 = ""; -- Код опциона в 2 позиции Volume_P2 = 0; -- Объем 2 позиции Open_P2 = 0; -- Цена открытия 2 позиции SetCell(t_id, Put_2, 0, Sec_C2); SetCell(t_id, Put_2, 1, tostring(Volume_P2)); SetCell(t_id, Put_2, 2, tostring(Open_P2)); -- Изменим таблицу end; sleep(100); end; end; function ProfitBuy(sec, volume, open) -- Функция считает текущий профит Buy local Bid = tonumber(getParamEx(Class_Opt, sec, "bid").param_value); -- Получает текущий bid по опциону local Profit = (Bid - open) * math.abs(volume) - Commission * 2 * math.abs(volume); -- Считает текущий профит по опционной позиции return(Profit); end; function StrBuy(str, sec, volume, open) -- Функция считает, выводит, окрашивает - текущий профит Buy local Profit = ProfitBuy(sec, volume, open); -- Считает текущий профит по опционной позиции SetCell(t_id, str, 3, tostring(Profit)); -- Выводит значение в таблицу if Profit > 0 then Green(str); elseif Profit == 0 then Gray(str); else Red(str); end; -- Окрашивает строку в зависимости от профита end; function ProfitSell(sec, volume, open) -- Функция считает текущий профит Sell local Offer = tonumber(getParamEx(Class_Opt, sec, "offer").param_value); -- Получает текущий offer по опциону local Profit = (open - Offer) * math.abs(volume) - Commission * 2 * math.abs(volume); -- Считает текущий профит по опционной позиции return(Profit); end; function StrSell(str, sec, volume, open) -- Функция считает, выводит, окрашивает - текущий профит Sell local Profit = ProfitSell(sec, volume, open); -- Считает текущий профит по опционной позиции SetCell(t_id, str, 3, tostring(Profit)); -- Выводит значение в таблицу if Profit > 0 then Green(str); elseif Profit == 0 then Gray(str); else Red(str); 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); InsertRow(t_id, 16); -- Пустая строка InsertRow(t_id, Itogo); -- Добавляет значения в ячейки 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)); SetCell(t_id, Itogo, 0, "Итого"); SetCell(t_id, Itogo, 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 StrBuy(Call_1, Sec_C1, Volume_C1, Open_C1); end; -- Считает, выводит, окрашивает - текущий профит по опционной позиции if Volume_C1 < 0 then StrSell(Call_1, Sec_C1, Volume_C1, Open_C1); end; end; if sec == Sec_C2 then if Volume_C2 > 0 then StrBuy(Call_2, Sec_C2, Volume_C2, Open_C2); end; -- Считает, выводит, окрашивает - текущий профит по опционной позиции if Volume_C2 < 0 then StrSell(Call_2, Sec_C2, Volume_C2, Open_C2); end; end; if sec == Sec_C3 then if Volume_C3 > 0 then StrBuy(Call_3, Sec_C3, Volume_C3, Open_C3); end; -- Считает, выводит, окрашивает - текущий профит по опционной позиции if Volume_C3 < 0 then StrSell(Call_3, Sec_C3, Volume_C3, Open_C3); end; end; if sec == Sec_C4 then if Volume_C4 > 0 then StrBuy(Call_4, Sec_C4, Volume_C4, Open_C4); end; -- Считает, выводит, окрашивает - текущий профит по опционной позиции if Volume_C4 < 0 then StrSell(Call_4, Sec_C4, Volume_C4, Open_C4); 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 StrBuy(Put_1, Sec_P1, Volume_P1, Open_P1); end; -- Считает, выводит, окрашивает - текущий профит по опционной позиции if Volume_P1 < 0 then StrSell(Put_1, Sec_P1, Volume_P1, Open_P1); end; end; if sec == Sec_P2 then if Volume_P2 > 0 then StrBuy(Put_2, Sec_P2, Volume_P2, Open_P2); end; -- Считает, выводит, окрашивает - текущий профит по опционной позиции if Volume_P2 < 0 then StrSell(Put_2, Sec_P2, Volume_P2, Open_P2); end; end; if sec == Sec_P3 then if Volume_P3 > 0 then StrBuy(Put_3, Sec_P3, Volume_P3, Open_P3); end; -- Считает, выводит, окрашивает - текущий профит по опционной позиции if Volume_P3 < 0 then StrSell(Put_3, Sec_P3, Volume_P3, Open_P3); end; end; if sec == Sec_P4 then if Volume_P4 > 0 then StrBuy(Put_4, Sec_P4, Volume_P4, Open_P4); end; -- Считает, выводит, окрашивает - текущий профит по опционной позиции if Volume_P4 < 0 then StrSell(Put_4, Sec_P4, Volume_P4, Open_P4); 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; local Profit = tonumber(GetCell(t_id, Itogo_CP, 3).image) + All_Profit; -- Общий текущий профит Call + Put + общий заработанный профит SetCell(t_id, Itogo, 3, tostring(Profit)); if Profit > 0 then Green(Itogo); elseif Profit == 0 then Gray(Itogo); else Red(Itogo); end; end; end; function OnStop() -- Функция вызывается терминалом QUIK при остановке скрипта из диалога управления -- Сохранение текущего состояния в файл local f = io.open(getScriptPath().."//robot.txt","r+"); -- Пытается открыть файл в режиме "чтения/записи" if f == nil then -- Если файл не существует f = io.open(getScriptPath().."//robot.txt","w"); -- Создает файл в режиме "записи" f:close(); -- Закрывает файл f = io.open(getScriptPath().."//robot.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:write(tostring(All_Profit).."\n"); -- Общий заработанный профит f:flush(); -- Сохраняет изменения в файле f:close(); -- Закрывает файл IsRun = false; end;