Робот Виртуал

Автор записи: АндрейАВ

Робот виртуал
Скрипт торгует виртуально - опцион
Стратегия
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

Код QLua
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;
Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!