Condor V

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

2015122212_7813832_19968812Скрипт торгует опционами виртуально. При первом запуске открываем позицию "бабочка" или "кондор" зависит от настроек (если Start_Call = Start_Put - бабочка если Start_Call > Start_Put - кондор)
Стратегия: если цена фьючерса выше BU_1 (безубыток 1-й Call позиции), то закрываем крыло Call и открываем новое с большими страйками, если цена выше Start_Call, но ниже BU_2 - Step_Strike - закрываем крыло Call и открываем с меньшими страйками. Аналогично для Put только в другую сторону.

Код скрипта
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
Class_Fut   = "SPBFUT"     -- Класс фьючерса
Sec_Fut     = "SRH6"       -- Код фьючерса
Class_Opt   = "SPBOPT"     -- Класс опциона
Sec_Call    = "SR10000BA6" -- Код опциона Call
Sec_Put     = "SR10000BM6" -- Код опциона Put
Start_Call  = 10250        -- 1-й BU_2 - ниже него, крыло Call не открываем, выше можно
Start_Put   = 10250        -- 1-й BU_3 - выше него, крыло Put не открываем, ниже можно
Step_Strike = 250          -- Шаг страйка
Lots        = 1            -- Лот
Commission  = 2.25         -- Комиссия (биржа + брокер за 1-у торговую операцию по 1-му лоту)
 
Sec_1       = ""           -- Call код 1 позиции
Sec_2       = ""           -- Call код 2 позиции
Sec_3       = ""           -- Put код 3 позиции
Sec_4       = ""           -- Put код 4 позиции
Volume_1    = 0            -- Объем 1 позиции
Volume_2    = 0            -- Объем 2 позиции
Volume_3    = 0            -- Объем 3 позиции
Volume_4    = 0            -- Объем 4 позиции
Open_1      = 0            -- Цена открытия 1 позиции
Open_2      = 0            -- Цена открытия 2 позиции
Open_3      = 0            -- Цена открытия 3 позиции
Open_4      = 0            -- Цена открытия 4 позиции
BU_1        = 0            -- Безубыток 1 позиции
BU_2        = 0            -- Безубыток 2 позиции
BU_3        = 0            -- Безубыток 3 позиции
BU_4        = 0            -- Безубыток 4 позиции
All_Profit  = 0            -- Общий заработанный профит
 
-- Константы для строк таблицы
Pos_1 = 1 -- Позиция 1 (Call, код, объем, цена, профит, безубыток, прибыль/убыток)
Pos_2 = 2 -- Позиция 2 (Call, код, объем, цена, профит, безубыток, прибыль/убыток)
Pos_3 = 3 -- Позиция 3 (Put, код, объем, цена, профит, безубыток)
Pos_4 = 4 -- Позиция 4 (Put, код, объем, цена, профит, безубыток, прибыль/убыток)
Total = 5 -- Профит Call + Put + заработанный профит, заработанный профит, Call + Put
 
IsRun = true -- Флаг поддержания работы скрипта
 
function OnInit() -- Функция вызывается терминалом QUIK перед вызовом функции main()
   local f = io.open(getScriptPath().."//Condor V.txt","r+") -- Пытается открыть файл состояния в режиме "чтения/записи"
   if f ~= nil then -- Если файл существует, перебирает строки файла, считывает содержимое в соответствующие переменные
      local Count = 0 -- Счетчик строк
      for line in f:lines() do
         Count = Count + 1
         if     Count == 1  then Sec_1      = line           -- Call код 1 позиции
         elseif Count == 2  then Sec_2      = line           -- Call код 2 позиции
         elseif Count == 3  then Sec_3      = line           -- Put код 3 позиции
         elseif Count == 4  then Sec_4      = line           -- Put код 4 позиции
         elseif Count == 5  then Volume_1   = tonumber(line) -- Объем 1 позиции
         elseif Count == 6  then Volume_2   = tonumber(line) -- Объем 2 позиции
         elseif Count == 7  then Volume_3   = tonumber(line) -- Объем 3 позиции
         elseif Count == 8  then Volume_4   = tonumber(line) -- Объем 4 позиции
         elseif Count == 9  then Open_1     = tonumber(line) -- Цена открытия 1 позиции
         elseif Count == 10 then Open_2     = tonumber(line) -- Цена открытия 2 позиции
         elseif Count == 11 then Open_3     = tonumber(line) -- Цена открытия 3 позиции
         elseif Count == 12 then Open_4     = tonumber(line) -- Цена открытия 4 позиции
         elseif Count == 13 then BU_1       = tonumber(line) -- Безубыток 1 позиции
         elseif Count == 14 then BU_2       = tonumber(line) -- Безубыток 2 позиции
         elseif Count == 15 then BU_3       = tonumber(line) -- Безубыток 3 позиции
         elseif Count == 16 then BU_4       = tonumber(line) -- Безубыток 4 позиции
         elseif Count == 17 then All_Profit = tonumber(line) -- Общий заработанный профит
         end
      end
      f:close() -- Закрывает файл
   end
 
   CreateTable() -- Создает таблицу
end
 
function main() -- Функция, реализующая основной поток выполнения в скрипте
   while IsRun do -- Цикл будет выполнятся, пока IsRun == true
      local Price_Call = tonumber(getParamEx(Class_Fut, Sec_Fut, "bid").param_value) + (Start_Call - Start_Put) / 2 -- Текущая цена фьючерса для крыла Call
      local Price_Put = tonumber(getParamEx(Class_Fut, Sec_Fut, "bid").param_value) - (Start_Call - Start_Put) / 2 -- Текущая цена фьючерса для крыла Put
 
      if Price_Call > 0 and Price_Put > 0 then
         if Volume_1 == 0 and Volume_2 == 0 and Volume_3 == 0 and Volume_4 == 0 then -- Позиции нет
            Sec_1 = string.sub(Sec_Call, 1, 2)..tostring(Start_Call + Step_Strike)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call) -- Код опциона 1 позиции
            Volume_1 = Lots -- Объем 1 позиции
            Open_1 = tonumber(getParamEx(Class_Opt, Sec_1, "theorprice").param_value) -- Цена открытия 1 позиции
 
            Sec_2 = string.sub(Sec_Call, 1, 2)..tostring(Start_Call)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call) -- Код опциона 2 позиции
            Volume_2 = -Lots -- Объем 2 позиции
            Open_2 = tonumber(getParamEx(Class_Opt, Sec_2, "theorprice").param_value) -- Цена открытия 2 позиции
 
            Sec_4 = string.sub(Sec_Put, 1, 2)..tostring(Start_Put - Step_Strike)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put) -- Код опциона 4 позиции
            Volume_4 = Lots -- Объем 4 позиции
            Open_4 = tonumber(getParamEx(Class_Opt, Sec_4, "theorprice").param_value) -- Цена открытия 4 позиции
 
            Sec_3 = string.sub(Sec_Put, 1, 2)..tostring(Start_Put)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put) -- Код опциона 3 позиции
            Volume_3 = -Lots -- Объем 3 позиции
            Open_3 = tonumber(getParamEx(Class_Opt, Sec_3, "theorprice").param_value) -- Цена открытия 3 позиции
 
            BU_2 = tonumber(string.sub(Sec_2, 3, #Sec_2 - 3)) -- Безубыток 2 позиции
            BU_3 = tonumber(string.sub(Sec_3, 3, #Sec_3 - 3)) -- Безубыток 3 позиции
            BU_1 = BU_2 + Open_2 - Open_1 + math.ceil(Volume_4 * (Open_3 - Open_4) / Volume_1) -- Безубыток 1 позиции
            if BU_1 > tonumber(string.sub(Sec_1, 3, #Sec_1 - 3)) then BU_1 = tonumber(string.sub(Sec_1, 3, #Sec_1 - 3)) end
            BU_4 = BU_3 - Open_3 + Open_4 - math.floor(Volume_1 * (Open_2 - Open_1) / Volume_4) -- Безубыток 4 позиции
            if BU_4 < tonumber(string.sub(Sec_4, 3, #Sec_4 - 3)) then BU_4 = tonumber(string.sub(Sec_4, 3, #Sec_4 - 3)) end
            CorrectTable(Pos_1, Sec_1, Volume_1, Open_1, BU_1) -- Изменим таблицу
            CorrectTable(Pos_2, Sec_2, Volume_2, Open_2, BU_2) -- Изменим таблицу
            CorrectTable(Pos_3, Sec_3, Volume_3, Open_3, BU_3) -- Изменим таблицу
            CorrectTable(Pos_4, Sec_4, Volume_4, Open_4, BU_4) -- Изменим таблицу
         end
 
         if Volume_1 > 0 and Volume_2 < 0 and Volume_3 < 0 and Volume_4 > 0 then -- Позиция есть
            if Price_Call > BU_1 then -- Call - цена идет вверх
               All_Profit = All_Profit + ProfitBuy(Sec_1, Volume_1, Open_1) + ProfitSell(Sec_2, Volume_2, Open_2) -- Профит от закрытия 1 и 2 позиции
 
               Sec_1 = string.sub(Sec_Call, 1, 2)..tostring(string.sub(Sec_1, 3, #Sec_1 - 3) + Step_Strike)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call) -- Код опциона 1 позиции
               Volume_1 = Lots -- Объем 1 позиции
               Open_1 = tonumber(getParamEx(Class_Opt, Sec_1, "theorprice").param_value) -- Цена открытия 1 позиции
 
               Sec_2 = string.sub(Sec_Call, 1, 2)..tostring(string.sub(Sec_1, 3, #Sec_1 - 3) - Step_Strike)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call) -- Код опциона 2 позиции
               Volume_2 = -Lots -- Объем 2 позиции
               Open_2 = tonumber(getParamEx(Class_Opt, Sec_2, "theorprice").param_value) -- Цена открытия 2 позиции
 
               BU_2 = tonumber(string.sub(Sec_2, 3, #Sec_2 - 3)) -- Безубыток 2 позиции
               BU_1 = BU_2 + Open_2 - Open_1 + math.ceil(Volume_4 * (Open_3 - Open_4) / Volume_1) -- Безубыток 1 позиции
               if BU_1 > tonumber(string.sub(Sec_1, 3, #Sec_1 - 3)) then BU_1 = tonumber(string.sub(Sec_1, 3, #Sec_1 - 3)) end
               CorrectTable(Pos_1, Sec_1, Volume_1, Open_1, BU_1) -- Изменим таблицу
               CorrectTable(Pos_2, Sec_2, Volume_2, Open_2, BU_2) -- Изменим таблицу
            end
 
            if BU_2 > Start_Call and Price_Call < BU_2 - Step_Strike then -- Call - цена идет вниз
               All_Profit = All_Profit + ProfitBuy(Sec_1, Volume_1, Open_1) + ProfitSell(Sec_2, Volume_2, Open_2) -- Профит от закрытия 1 и 2 позиции
 
               Sec_1 = string.sub(Sec_Call, 1, 2)..tostring(string.sub(Sec_1, 3, #Sec_1 - 3) - Step_Strike)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call) -- Код опциона 1 позиции
               Volume_1 = Lots -- Объем 1 позиции
               Open_1 = tonumber(getParamEx(Class_Opt, Sec_1, "theorprice").param_value) -- Цена открытия 1 позиции
 
               Sec_2 = string.sub(Sec_Call, 1, 2)..tostring(string.sub(Sec_1, 3, #Sec_1 - 3) - Step_Strike)..string.sub(Sec_Call, #Sec_Call - 2, #Sec_Call) -- Код опциона 2 позиции
               Volume_2 = -Lots -- Объем 2 позиции
               Open_2 = tonumber(getParamEx(Class_Opt, Sec_2, "theorprice").param_value) -- Цена открытия 2 позиции
 
               BU_2 = tonumber(string.sub(Sec_2, 3, #Sec_2 - 3)) -- Безубыток 2 позиции
               BU_1 = BU_2 + Open_2 - Open_1 + math.ceil(Volume_4 * (Open_3 - Open_4) / Volume_1) -- Безубыток 1 позиции
               if BU_1 > tonumber(string.sub(Sec_1, 3, #Sec_1 - 3)) then BU_1 = tonumber(string.sub(Sec_1, 3, #Sec_1 - 3)) end
               CorrectTable(Pos_1, Sec_1, Volume_1, Open_1, BU_1) -- Изменим таблицу
               CorrectTable(Pos_2, Sec_2, Volume_2, Open_2, BU_2) -- Изменим таблицу
            end
 
            if Price_Put < BU_4 then -- Put - цена идет вниз
               All_Profit = All_Profit + ProfitBuy(Sec_4, Volume_4, Open_4) + ProfitSell(Sec_3, Volume_3, Open_3) -- Профит от закрытия 4 и 3 позиции
 
               Sec_4 = string.sub(Sec_Put, 1, 2)..tostring(string.sub(Sec_4, 3, #Sec_4 - 3) - Step_Strike)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put) -- Код опциона 4 позиции
               Volume_4 = Lots -- Объем 4 позиции
               Open_4 = tonumber(getParamEx(Class_Opt, Sec_4, "theorprice").param_value) -- Цена открытия 4 позиции
 
               Sec_3 = string.sub(Sec_Put, 1, 2)..tostring(string.sub(Sec_4, 3, #Sec_4 - 3) + Step_Strike)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put) -- Код опциона 3 позиции
               Volume_3 = -Lots -- Объем 3 позиции
               Open_3 = tonumber(getParamEx(Class_Opt, Sec_3, "theorprice").param_value) -- Цена открытия 3 позиции
 
               BU_3 = tonumber(string.sub(Sec_3, 3, #Sec_3 - 3)) -- Безубыток 3 позиции
               BU_4 = BU_3 - Open_3 + Open_4 - math.floor(Volume_1 * (Open_2 - Open_1) / Volume_4) -- Безубыток 4 позиции
               if BU_4 < tonumber(string.sub(Sec_4, 3, #Sec_4 - 3)) then BU_4 = tonumber(string.sub(Sec_4, 3, #Sec_4 - 3)) end
               CorrectTable(Pos_3, Sec_3, Volume_3, Open_3, BU_3) -- Изменим таблицу
               CorrectTable(Pos_4, Sec_4, Volume_4, Open_4, BU_4) -- Изменим таблицу
            end
 
            if BU_3 < Start_Put and Price_Put > BU_3 + Step_Strike then -- Put - цена идет вверх
               All_Profit = All_Profit + ProfitBuy(Sec_4, Volume_4, Open_4) + ProfitSell(Sec_3, Volume_3, Open_3) -- Профит от закрытия 4 и 3 позиции
 
               Sec_4 = string.sub(Sec_Put, 1, 2)..tostring(string.sub(Sec_4, 3, #Sec_4 - 3) + Step_Strike)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put) -- Код опциона 4 позиции
               Volume_4 = Lots -- Объем 4 позиции
               Open_4 = tonumber(getParamEx(Class_Opt, Sec_4, "theorprice").param_value) -- Цена открытия 4 позиции
 
               Sec_3 = string.sub(Sec_Put, 1, 2)..tostring(string.sub(Sec_4, 3, #Sec_4 - 3) + Step_Strike)..string.sub(Sec_Put, #Sec_Put - 2, #Sec_Put) -- Код опциона 3 позиции
               Volume_3 = -Lots -- Объем 3 позиции
               Open_3 = tonumber(getParamEx(Class_Opt, Sec_3, "theorprice").param_value) -- Цена открытия 3 позиции
 
               BU_3 = tonumber(string.sub(Sec_3, 3, #Sec_3 - 3)) -- Безубыток 3 позиции
               BU_4 = BU_3 - Open_3 + Open_4 - math.floor(Volume_1 * (Open_2 - Open_1) / Volume_4) -- Безубыток 4 позиции
               if BU_4 < tonumber(string.sub(Sec_4, 3, #Sec_4 - 3)) then BU_4 = tonumber(string.sub(Sec_4, 3, #Sec_4 - 3)) end
               CorrectTable(Pos_3, Sec_3, Volume_3, Open_3, BU_3) -- Изменим таблицу
               CorrectTable(Pos_4, Sec_4, Volume_4, Open_4, BU_4) -- Изменим таблицу
            end
         end
      end
 
      local Profit_1 = ProfitBuy(Sec_1, Volume_1, Open_1) Str(Pos_1, 4, Profit_1) -- Считает, выводит и окрашивает текущий профит Buy 1 позиции
      local Profit_2 = ProfitSell(Sec_2, Volume_2, Open_2) Str(Pos_2, 4, Profit_2) -- Считает, выводит и окрашивает текущий профит Sell 2 позиции
      local Profit_3 = ProfitSell(Sec_3, Volume_3, Open_3) Str(Pos_3, 4, Profit_3) -- Считает, выводит и окрашивает текущий профит Sell 3 позиции
      local Profit_4 = ProfitBuy(Sec_4, Volume_4, Open_4) Str(Pos_4, 4, Profit_4) -- Считает, выводит и окрашивает текущий профит Buy 4 позиции
      local ProfitCP = Profit_1 + Profit_2 + Profit_3 + Profit_4 Str(Total, 4, ProfitCP) -- Считает, выводит и окрашивает текущий профит Call + Put
      Str(Total, 3, All_Profit) -- Выводит и окрашивает заработанный профит
      local Profit = ProfitCP + All_Profit Str(Total, 1, Profit) -- Считает, выводит и окрашивает текущий профит Call + Put + заработанный профит
 
      BU_2 = tonumber(string.sub(Sec_2, 3, #Sec_2 - 3)) -- Безубыток 2 позиции
      BU_3 = tonumber(string.sub(Sec_3, 3, #Sec_3 - 3)) -- Безубыток 3 позиции
      BU_1 = BU_2 + Open_2 - Open_1 + math.ceil(Volume_4 * (Open_3 - Open_4) / Volume_1) -- Безубыток 1 позиции
      if BU_1 > tonumber(string.sub(Sec_1, 3, #Sec_1 - 3)) then BU_1 = tonumber(string.sub(Sec_1, 3, #Sec_1 - 3)) end
      BU_4 = BU_3 - Open_3 + Open_4 - math.floor(Volume_1 * (Open_2 - Open_1) / Volume_4) -- Безубыток 4 позиции
      if BU_4 < tonumber(string.sub(Sec_4, 3, #Sec_4 - 3)) then BU_4 = tonumber(string.sub(Sec_4, 3, #Sec_4 - 3)) end
      CorrectTable(Pos_1, Sec_1, Volume_1, Open_1, BU_1) -- Изменим таблицу
      CorrectTable(Pos_2, Sec_2, Volume_2, Open_2, BU_2) -- Изменим таблицу
      CorrectTable(Pos_3, Sec_3, Volume_3, Open_3, BU_3) -- Изменим таблицу
      CorrectTable(Pos_4, Sec_4, Volume_4, Open_4, BU_4) -- Изменим таблицу
 
      Str(Pos_1, 6, ProfitCall() + ProfitPut()) -- Считает, выводит и окрашивает прибыль всей позиции на момент экспирации
      Str(Pos_2, 6, LesionCall() + ProfitPut()) -- Считает, выводит и окрашивает убыток всей позиции на момент экспирации Call (правое крыло)
      Str(Pos_4, 6, LesionPut() + ProfitCall()) -- Считает, выводит и окрашивает убыток позиции на момент экспирации Put (левое крыло)
 
      sleep(100)
   end
end
 
function OnStop() -- Функция вызывается терминалом QUIK при остановке скрипта из диалога управления
   -- Сохранение текущего состояния в файл
   local f = io.open(getScriptPath().."//Condor V.txt","r+") -- Пытается открыть файл в режиме "чтения/записи"
   if f == nil then -- Если файл не существует
      f = io.open(getScriptPath().."//Condor V.txt","w") -- Создает файл в режиме "записи"
      f:close() -- Закрывает файл
      f = io.open(getScriptPath().."//Condor V.txt","r+") -- Открывает уже существующий файл в режиме "чтения/записи"
   end
   -- Записывает в файл текущие состояния (каждое значение в новой строке)
   f:write(Sec_1.."\n")                -- Call код 1 позиции
   f:write(Sec_2.."\n")                -- Call код 2 позиции
   f:write(Sec_3.."\n")                -- Put код 3 позиции
   f:write(Sec_4.."\n")                -- Put код 4 позиции
   f:write(tostring(Volume_1).."\n")   -- Объем 1 позиции
   f:write(tostring(Volume_2).."\n")   -- Объем 2 позиции
   f:write(tostring(Volume_3).."\n")   -- Объем 3 позиции
   f:write(tostring(Volume_4).."\n")   -- Объем 4 позиции
   f:write(tostring(Open_1).."\n")     -- Цена открытия 1 позиции
   f:write(tostring(Open_2).."\n")     -- Цена открытия 2 позиции
   f:write(tostring(Open_3).."\n")     -- Цена открытия 3 позиции
   f:write(tostring(Open_4).."\n")     -- Цена открытия 4 позиции
   f:write(tostring(BU_1).."\n")       -- Безубыток 1 позиции
   f:write(tostring(BU_2).."\n")       -- Безубыток 2 позиции
   f:write(tostring(BU_3).."\n")       -- Безубыток 3 позиции
   f:write(tostring(BU_4).."\n")       -- Безубыток 4 позиции
   f:write(tostring(All_Profit).."\n") -- Общий заработанный профит
   f:flush()                           -- Сохраняет изменения в файле
   f:close()                           -- Закрывает файл
 
   IsRun = false
end
 
function CreateTable() -- Функция создает таблицу
   t_id = AllocTable() -- Получает доступный id для создания
   -- Добавляет колонки
   AddColumn(t_id, 0, "", true, QTABLE_STRING_TYPE, 7)
   AddColumn(t_id, 1, "Инструмент", true, QTABLE_STRING_TYPE, 15)
   AddColumn(t_id, 2, "Позиция", true, QTABLE_INT_TYPE, 5)
   AddColumn(t_id, 3, "Цена", true, QTABLE_INT_TYPE, 10)
   AddColumn(t_id, 4, "Профит", true, QTABLE_INT_TYPE, 10)
   AddColumn(t_id, 5, "БУ", true, QTABLE_INT_TYPE, 10)
   AddColumn(t_id, 6, "П/У", true, QTABLE_INT_TYPE, 10)
   t = CreateWindow(t_id) -- Создает таблицу
   SetWindowCaption(t_id, "Condor V") -- Устанавливает заголовок
   SetWindowPos(t_id, 390, 460, 390, 130) -- Задает положение и размеры окна таблицы
   -- Добавляет строки
   InsertRow(t_id, Pos_1)
   InsertRow(t_id, Pos_2)
   InsertRow(t_id, Pos_3)
   InsertRow(t_id, Pos_4)
   InsertRow(t_id, Total)
   -- Добавляет значения в ячейки
   SetCell(t_id, Pos_1, 0, "Call") SetCell(t_id, Pos_1, 1, Sec_1) SetCell(t_id, Pos_1, 2, tostring(Volume_1)) SetCell(t_id, Pos_1, 3, tostring(Open_1)) SetCell(t_id, Pos_1, 5, tostring(BU_1))
   SetCell(t_id, Pos_2, 0, "Call") SetCell(t_id, Pos_2, 1, Sec_2) SetCell(t_id, Pos_2, 2, tostring(Volume_2)) SetCell(t_id, Pos_2, 3, tostring(Open_2)) SetCell(t_id, Pos_2, 5, tostring(BU_2))
   SetCell(t_id, Pos_3, 0, "Put")  SetCell(t_id, Pos_3, 1, Sec_3) SetCell(t_id, Pos_3, 2, tostring(Volume_3)) SetCell(t_id, Pos_3, 3, tostring(Open_3)) SetCell(t_id, Pos_3, 5, tostring(BU_3))
   SetCell(t_id, Pos_4, 0, "Put")  SetCell(t_id, Pos_4, 1, Sec_4) SetCell(t_id, Pos_4, 2, tostring(Volume_4)) SetCell(t_id, Pos_4, 3, tostring(Open_4)) SetCell(t_id, Pos_4, 5, tostring(BU_4))
   SetCell(t_id, Total, 0, "Итого")
end
 
function CorrectTable(str, sec, volume, open, bu) -- Функция корректирует таблицу
   SetCell(t_id, str, 1, sec) SetCell(t_id, str, 2, tostring(volume)) SetCell(t_id, str, 3, tostring(open)) SetCell(t_id, str, 5, tostring(bu)) -- Изменим таблицу
end
 
function Str(str, num, profit) -- Функция выводит и окрашивает переданный профит в таблицу
   SetCell(t_id, str, num, tostring(profit)) -- Выводит значение в таблицу
   if profit > 0 then Green(str, num) elseif profit == 0 then Gray(str, num) else Red(str, num) end -- Окрашивает строку в зависимости от значения профита
end
 
-- Функции по раскраске строк/ячеек таблицы
function Green(Line, Col) -- Зеленый
   if Col == nil then Col = QTABLE_NO_INDEX end -- Если индекс столбца не указан, окрашивает всю строку
   SetColor(t_id, Line, Col, RGB(165,227,128), RGB(0,0,0), RGB(165,227,128), RGB(0,0,0))
end
function Gray(Line, Col) -- Серый
   if Col == nil then Col = QTABLE_NO_INDEX end -- Если индекс столбца не указан, окрашивает всю строку
   SetColor(t_id, Line, Col, RGB(200,200,200), RGB(0,0,0), RGB(200,200,200), RGB(0,0,0))
end
function Red(Line, Col) -- Красный
   if Col == nil then Col = QTABLE_NO_INDEX end -- Если индекс столбца не указан, окрашивает всю строку
   SetColor(t_id, Line, Col, RGB(255,168,164), RGB(0,0,0), RGB(255,168,164), RGB(0,0,0))
end
 
function ProfitBuy(sec, volume, open) -- Функция считает текущий профит Buy по теоретической цене с учетом комиссии
   local theorprice = tonumber(getParamEx(Class_Opt, sec, "theorprice").param_value) -- Получает текущий theorprice по опциону
   local Profit = (theorprice - open) * math.abs(volume) - Commission * 2 * math.abs(volume) -- Считает текущий профит по опционной позиции
   return(Profit) -- Возвращает значение Profit
end
function ProfitSell(sec, volume, open) -- Функция считает текущий профит Sell по теоретической цене с учетом комиссии
   local theorprice = tonumber(getParamEx(Class_Opt, sec, "theorprice").param_value) -- Получает текущий theorprice по опциону
   local Profit = (open - theorprice) * math.abs(volume) - Commission * 2 * math.abs(volume) -- Считает текущий профит по опционной позиции
   return(Profit) -- Возвращает значение Profit
end
 
function ProfitCall() -- Функция считает прибыль позиции Call
   local pc = Volume_1 * (Open_2 - Open_1) -- Прибыль 1 и 2 позиции
   return(pc) -- Возвращает значение
end
function LesionCall() -- Функция считает убыток позиции Call
   local lc = Volume_1 * ((tonumber(string.sub(Sec_2, 3, #Sec_2 - 3)) + Open_2) - (tonumber(string.sub(Sec_1, 3, #Sec_1 - 3)) + Open_1)) -- Убыток 1 и 2 позиции
   return(lc) -- Возвращает значение
end
 
function ProfitPut() -- Функция считает прибыль позиции Put
   local pp = Volume_4 * (Open_3 - Open_4) -- Прибыль 3 и 4 позиции
   return(pp) -- Возвращает значение
end
function LesionPut() -- Функция считает убыток позиции Put
   local lp = Volume_4 * ((tonumber(string.sub(Sec_4, 3, #Sec_4 - 3)) - Open_4) - (tonumber(string.sub(Sec_3, 3, #Sec_3 - 3)) - Open_3)) -- Убыток 3 и 4 позиции
   return(lp) -- Возвращает значение
end

Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!