Закрывает 2 раза позицию, в итоге открывает

Страницы: 1
RSS
Закрывает 2 раза позицию, в итоге открывает
 
Здравствуйте еще раз. Разобрался со старыми ошибками скрипта, там не верно работал цикл фо. Теперь этот скрипт покупает хорошо, но возникла трудность с продажей. На демоквике хорошо работает, а в реальном первую заявку он считает не прошедшей и открывает еще одну. вот часть лога: ,0,30.05.2017,12:42:03,Робот: ОТКРЫЛ ПОЗИЦИЮ №1,,
1,0,30.05.2017,12:52:32,Простой MA-робот: В ПРОЦЕССЕ ЗАКРЫТИЯ,,
1,0,30.05.2017,12:52:32,Точка закрытия 1: 1,,
1,0,30.05.2017,12:52:32,Точка закрытия 3,,
1,0,30.05.2017,12:52:32,звкрытие Status 4303,,
1,0,30.05.2017,12:52:32,Робот: Транзакция не прошла! ОШИБКА: ,,
1,0,30.05.2017,12:52:32,Точка закрытия 1: 1,,
1,0,30.05.2017,12:52:32,Точка закрытия 3,,
1,0,30.05.2017,12:52:32,Заявка 26412225679 успешно зарегистрирована.,,
1,0,30.05.2017,12:52:33,Робот: trans_Status 3 trans_result_msg Заявка 26412225703 успешно зарегистрирована.,,
1,0,30.05.2017,12:52:33,Робот: trans_Status 4305 trans_result_msg ,,
А вот код, помогите пожалуйста понять почему первая заявка у него не верная
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
--[[
]]

--/*НАСТРАИВАЕМЫЕ ПАРАМЕТРЫ*/
--ACCOUNT           = 'NL0011100043';       -- Идентификатор счета
ACCOUNT           = 'SPBFUT0025E';        -- Идентификатор счета
--CLASS_CODE        = 'QJSIM';              -- Код класса
CLASS_CODE        = 'SPBFUT';             -- Код класса
--SEC_CODE          = 'SBER';               -- Код бумаги
SEC_CODE          = 'SiM7';               -- Код бумаги
NPos=1   --размер открываемых позиций одной сделкой
NProsk=50 --проскальзывание
Price1="PRICE_SAR"  --ссылка на график цены
ParMed1="SAR_1"     --синий, ссылка на график медленного параболика
ParSr1="SAR_2"      --красный, ссылка на график среднего параболика
ParFiltr1="SAR_3"   --зеленый, ссылка на график фильтровочного параболика
ParFas1="SAR_4"      --желтый, ссылка на график быстрого параболика

INTERVAL          = INTERVAL_M1;          -- Таймфрейм графика (для построения скользящих)

--/*РАБОЧИЕ ПЕРЕМЕННЫЕ РОБОТА (менять не нужно)*/
SEC_PRICE_STEP    = 0;                    -- ШАГ ЦЕНЫ ИНСТРУМЕНТА
DS                = nil;                  -- Источник данных графика (DataSource)
ROBOT_STATE       ='В ПОИСКЕ ТОЧКИ ВХОДА';-- СОСТОЯНИЕ робота ['В ПРОЦЕССЕ СДЕЛКИ', либо 'В ПОИСКЕ ТОЧКИ ВХОДА']
trans_id          = os.time();            -- Задает начальный номер ID транзакций
trans_Status      = nil;                  -- Статус текущей транзакции из функции OnTransPeply
trans_result_msg  = '';                   -- Сообщение по текущей транзакции из функции OnTransPeply
CurrentDir ect     = 'BUY';                -- Текущее НАПРАВЛЕНИЕ ['BUY', или 'SELL']
LastOpenBarIndex  =  0;                   -- Индекс свечи, на которой была открыта последняя позиция (нужен для того, чтобы после закрытия по стопу тут же не открыть еще одну позицию)
Run               = true;                 -- Флаг поддержания работы бесконечного цикла в main
Napravlenie_Sdelki=false --направление открытия позиции  ,Napravlenie_Sdelki='ПОЗИЯ КУПЛЕНА, ОТКРЫТА'   Napravlenie_Sdelki='ПОЗИЯ ПРОДАНА, ОТКРЫТА'




-- Функция первичной инициализации скрипта (ВЫЗЫВАЕТСЯ ТЕРМИНАЛОМ QUIK в самом начале)
function OnInit()
  -- Получает доступ к свечам графика
  local Error = '';
  DS,Error = CreateDataSource(CLASS_CODE, SEC_CODE, INTERVAL);
  -- Проверка
  if DS == nil then
     message('Простой MA-робот:ОШИБКА получения доступа к свечам! '..Error);
     -- Завершает выполнение скрипта
     Run = false;
     return;
  end;

  -- Получает ШАГ ЦЕНЫ ИНСТРУМЕНТА
  SEC_PRICE_STEP = getParamEx(CLASS_CODE, SEC_CODE, "SEC_PRICE_STEP").param_value;
  message('SEC_PRICE_STEP'..tostring(SEC_PRICE_STEP))
   --message(' Price = getParamEx(CLASS_CODE, SEC_CODE, offer).param_value'..tostring( getParamEx(CLASS_CODE, SEC_CODE, 'offer').param_value))
--message(' Price = getParamEx(CLASS_CODE, SEC_CODE, bid).param_value'..tostring( getParamEx(CLASS_CODE, SEC_CODE, 'bid').param_value))

end;

function main()

  -- Выводит сообщение
  message('Простой MA-робот: '..ROBOT_STATE);
  -- "Бесконечный" цикл
  while Run do
  NumCandles1=getNumCandles(Price1)
  NumCandles2=getNumCandles(ParMed1)

    tPrice1,n1,s1 = getCandlesByIndex (Price1, 0, NumCandles1-2, 2)   --считывает данные с графика цены
    tPrice2,n2,s2 = getCandlesByIndex (ParMed1, 0, NumCandles2-2, 2)  --считывает данные с графика медленного параболика

 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------
 --механизм открытия позиции 1
 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------
 --Если СОСТОЯНИЕ робота "В ПРОЦЕССЕ СДЕЛКИ"
     if ROBOT_STATE == 'В ПРОЦЕССЕ СДЕЛКИ' then
        -- Выводит сообщение
        message('Робот: В ПРОЦЕССЕ СДЕЛКИ');
        -- Делает 10 попыток открыть сделку
        local Price = false; -- Переменная для получения результата открытия позиции (цена, либо ошибка(false))
        for i=1,10 do
           if not Run then return; end; -- Если скрипт останавливается, не затягивает процесс
           -- Совершает СДЕЛКУ указанного типа ["BUY", или "SELL"] по рыночной(текущей) цене размером в 1 лот,
           --- возвращает цену открытой сделки, либо FALSE, если невозможно открыть сделку
           Price = Trade(CurrentDirect);
           -- Если сделка открылась
           if Price ~= false or ROBOT_STATE =='ОТКРЫЛ ПОЗИЦИЮ №1'  then
ROBOT_STATE = 'ОТКРЫЛ ПОЗИЦИЮ №1'
LastOpenBarIndex = DS:Size();
              -- Прерывает цикл FOR
  i=20
              break;
           end;
           sleep(100); -- Пауза в 100 мс между попытками открыть сделку
if i==10 and Price == false and  ROBOT_STATE == 'В ПРОЦЕССЕ СДЕЛКИ' then  ROBOT_STATE='В ПОИСКЕ ТОЧКИ ВХОДА'  end
        end;
        if not Run then return; end; -- Если скрипт останавливается, не затягивает процесс
        -- Если сделка открыта
        if Price ~= false then
ROBOT_STATE = 'ОТКРЫЛ ПОЗИЦИЮ №1'
message('Робот: ОТКРЫЛ ПОЗИЦИЮ №1');
       end;
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--откоытие позиции 1
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     else
        -- СОСТОЯНИЕ робота 'В ПОИСКЕ ТОЧКИ ВХОДА'
        -- Если на этой свече еще не было открыто позиций
        if DS:Size() > LastOpenBarIndex then
           -- Если быстрая пересекла медленную СНИЗУ ВВЕРХ
          -- if FastMA(DS:Size()-1)  SlowMA() then
  if crossOverMed() and ROBOT_STATE == 'В ПОИСКЕ ТОЧКИ ВХОДА' and ParFiltrOver() or crossOverFiltr() and ROBOT_STATE == 'В ПОИСКЕ ТОЧКИ ВХОДА' and  ParFiltSar1Over() then
              -- Задает направление НА ПОКУПКУ
              CurrentDirect = 'BUY';
              message('CurrentDirect = "BUY"');
              -- Меняет СОСТОЯНИЕ робота на "В ПРОЦЕССЕ СДЕЛКИ"
              ROBOT_STATE = 'В ПРОЦЕССЕ СДЕЛКИ';
           -- Если быстрая пересекла медленную СВЕРХУ ВНИЗ
           elseif   crossUnderMed() and ROBOT_STATE == 'В ПОИСКЕ ТОЧКИ ВХОДА' and ParFiltrUnder()  or crossUnderFiltr() and ROBOT_STATE == 'В ПОИСКЕ ТОЧКИ ВХОДА' and  ParFiltrSar1Under() then
              -- Если по данному инструменту не запрещены операции шорт

                 -- Задает направление НА ПРОДАЖУ
                 CurrentDirect = 'SELL';
                 message('CurrentDirect = "SELL"');
                 -- Меняет СОСТОЯНИЕ робота на "В ПРОЦЕССЕ СДЕЛКИ"
                 ROBOT_STATE = 'В ПРОЦЕССЕ СДЕЛКИ';

           end;
        end;
     end;

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--закрытие позиции 1
    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    if ROBOT_STATE == 'ОТКРЫЛ ПОЗИЦИЮ №1' and Napravlenie_Sdelki=='ПОЗИЯ КУПЛЕНА, ОТКРЫТА' and crossUnderMed() or ROBOT_STATE == 'ОТКРЫЛ ПОЗИЦИЮ №1' and Napravlenie_Sdelki=='ПОЗИЯ ПРОДАНА, ОТКРЫТА' and crossOverMed() then
        -- Выводит сообщение
        message('Робот: В ПРОЦЕССЕ ЗАКРЫТИЯ');
ROBOT_STATE = 'В ПРОЦЕССЕ ЗАКРЫТИЯ'
        -- Делает 10 попыток закрыть сделку
        local PriceZak = false; -- Переменная для получения результата открытия позиции (цена, либо ошибка(false))
        for i=1,10 do
           if not Run then return; end; -- Если скрипт останавливается, не затягивает процесс
             if Napravlenie_Sdelki=='ПОЗИЯ КУПЛЕНА, ОТКРЫТА' then  CurrentDirectZak='SELLzak' elseif Napravlenie_Sdelki=='ПОЗИЯ ПРОДАНА, ОТКРЫТА' then CurrentDirectZak='BUYzak' end
           -- Совершает СДЕЛКУ указанного типа ["BUY", или "SELL"] по рыночной(текущей) цене размером в 1 лот,
           --- возвращает цену открытой сделки, либо FALSE, если невозможно открыть сделку
           PriceZak = TradeZak(CurrentDirectZak);
           -- Если сделка открылась
           if getItem ("FUTURES_CLIENT_HOLDING",0).totalnet==0 or ROBOT_STATE == 'В ПОИСКЕ ТОЧКИ ВХОДА' then
i=20
              -- Прерывает цикл FOR
              break;
           end;
           sleep(100); -- Пауза в 100 мс между попытками открыть сделку
if i==10 and Price == false and  ROBOT_STATE == 'В ПРОЦЕССЕ ЗАКРЫТИЯ' then  ROBOT_STATE='ОТКРЫЛ ПОЗИЦИЮ №1' end
        end;
        if not Run then return; end; -- Если скрипт останавливается, не затягивает процесс
        -- Если сделка закрыта
        if PriceZak~= false and getItem ("FUTURES_CLIENT_HOLDING",0).totalnet==0 then
           -- Запоминает индекс свечи, на которой была открыта последняя позиция (нужен для того, чтобы после закрытия по стопу тут же не открыть еще одну позицию)
          -- LastOpenBarIndex = DS:Size();
           -- Выводит сообщение
           message('Робот: Закрыта сделка '..tostring(CurrentDirectZak)..' по цене '..tostring(PriceZak));
ROBOT_STATE = 'В ПОИСКЕ ТОЧКИ ВХОДА';
        end
 end

-----------------------------------------------------------------------------------------------------------------------





------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     sleep(1);--Пауза 10 мс, для того, чтобы не перегружать процессор компьютера
  end;
end;

-- Функция вызывается терминалом QUIK при получении ответа на транзакцию пользователя
function OnTransReply(trans_reply)
  -- Если поступила информация по текущей транзакции
  if trans_reply.trans_id == trans_id then
     -- Передает статус в глобальную переменную
     trans_Status = trans_reply.status;
     -- Передает сообщение в глобальную переменную
     trans_result_msg  = trans_reply.result_msg;
 message('Робот: trans_Status '..tostring(trans_Status)..' trans_result_msg '..tostring(trans_result_msg));
  end;
end;

-- Функция ВЫЗЫВАЕТСЯ ТЕРМИНАЛОМ QUIK при остановке скрипта
function OnStop()
  Run = false;
end;

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ --
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

-- Совершает СДЕЛКУ указанного типа (Type) ["BUY", или "SELL"] по рыночной(текущей) цене размером в 1 лот,
--- возвращает цену открытой сделки, либо FALSE, если невозможно открыть сделку
function Trade(Type)
  --Получает ID транзакции
  trans_id = trans_id + 1;

  local Price = 0;
  local Operation = '';
  --Устанавливает цену и операцию, в зависимости от типа сделки и от класса инструмента
  if Type == 'BUY' then
     if CLASS_CODE ~= 'QJSIM' and CLASS_CODE ~= 'TQBR' then Price = getParamEx(CLASS_CODE, SEC_CODE, 'offer').param_value + NProsk*SEC_PRICE_STEP;end; -- по цене, завышенной на 10 мин. шагов цены
     Operation = 'B';
  else
     if CLASS_CODE ~= 'QJSIM' and CLASS_CODE ~= 'TQBR' then Price = getParamEx(CLASS_CODE, SEC_CODE, 'bid').param_value - NProsk*SEC_PRICE_STEP;end; -- по цене, заниженной на 10 мин. шагов цены
     Operation = 'S';
  end;
  -- Заполняет структуру для отправки транзакции
    message(' Price = getParamEx(CLASS_CODE, SEC_CODE, offer).param_value'..tostring( getParamEx(CLASS_CODE, SEC_CODE, 'offer').param_value))
    message(' Price = getParamEx(CLASS_CODE, SEC_CODE, bid).param_value'..tostring( getParamEx(CLASS_CODE, SEC_CODE, 'bid').param_value))

  local Transaction={
     ['TRANS_ID'] = tostring(trans_id),
     ['ACTION'] = 'NEW_ORDER',
     ['CLASSCODE'] = CLASS_CODE,
     ['SECCODE'] = SEC_CODE,
     ['OPERATION'] = Operation, -- операция ("B" - buy, или "S" - sell)
     ['TYPE'] = 'M', -- по рынку (MARKET)
     ['QUANTITY'] = tostring(NPos), -- количество
     ['ACCOUNT'] = ACCOUNT,
     ['PRICE'] = tostring(Price),
     ['COMMENT'] = 'Простой MA-робот'
  }
  -- Отправляет транзакцию
  sendTransaction(Transaction);
   --  OnTransReply()--пробую так исправить
  -- Ждет, пока получит статус текущей транзакции (переменные "trans_Status" и "trans_result_msg" заполняются в функции OnTransReply())
  while Run and trans_Status == nil do sleep(1);--[[ message('Робот1,1: trans_Status: '..tostring(trans_Status)..'trans_result_msg'..tostring(trans_result_msg));]] end;
  -- message('Робот: trans_Status: '..tostring(trans_Status))
  -- Запоминает значение
  local Status = trans_Status;
  -- Очищает глобальную переменную
  trans_Status = nil;
  -- Если транзакция не выполнена по какой-то причине
  --message('Робот1,2: trans_Status: '..tostring(trans_Status)..'trans_result_msg'..tostring(trans_result_msg));
  message('Робот1,2: Status: '..tostring(Status)..'trans_result_msg'..tostring(trans_result_msg));
  if Status ~= 3 then
        -- Выводит сообщение с ошибкой
        message('Робот: Транзакция не прошла!\nОШИБКА: '..tostring(trans_result_msg));

     -- Возвращает FALSE
     return false;
  else --Транзакция отправлена
     local OrderNum = nil;
     --ЖДЕТ пока ЗАЯВКА на ОТКРЫТИЕ сделки будет ИСПОЛНЕНА полностью
 message('ЖДЕТ пока ЗАЯВКА на ОТКРЫТИЕ сделки будет ИСПОЛНЕНА полностью');
     --Запоминает время начала в секундах
     local BeginTime = os.time();
     while Run and OrderNum == nil do
        --Перебирает ТАБЛИЦУ ЗАЯВОК
        for i=getNumberOf('orders')-1, 0, -1 do
           local order = getItem('orders', i);
--message('Робот1,3:order: '..tostring(order) );
           --Если заявка по отправленной транзакции ИСПОЛНЕНА ПОЛНОСТЬЮ
           if order.trans_id == trans_id and order.balance == 0 then
message('Робот1,4:trans_id: '..tostring(trans_id)..'order.balance '.. tostring(order.balance));
              --Запоминает номер заявки
              OrderNum  = order.order_num;
              --Прерывает цикл FOR
              break;
           end;
        end;
        --Если прошло 10 секунд, а заявка не исполнена, значит произошла ошибка
      --[[ if os.time() - BeginTime > 9 then
           -- Выводит сообщение с ошибкой
           message('Робот: Прошло 10 секунд, а заявка не исполнена, значит произошла ошибка');
           -- Возвращает FALSE
           return false;
        end;]]
        sleep(10); -- Пауза 10 мс, чтобы не перегружать процессор компьютера
     end;

     --ЖДЕТ пока СДЕЛКА ОТКРЫТИЯ позиции будет СОВЕРШЕНА
     --Запоминает время начала в секундах
     BeginTime = os.time();
     while Run do
        --Перебирает ТАБЛИЦУ СДЕЛОК
        for i=0,getNumberOf('trades')-1 do
           local trade = getItem('trades', i);
           --Если сделка по текущей заявке
--message('Робот1,5:trade: '..tostring(trade) );
           if trade.order_num == OrderNum then
message('Робот1,6:trade.order_num: '..tostring(trade.order_num) );
              --Возвращает фАКТИЧЕСКУЮ ЦЕНУ открытой сделки
  if Type == 'BUY' then Napravlenie_Sdelki='ПОЗИЯ КУПЛЕНА, ОТКРЫТА' elseif Type == 'SELL' then Napravlenie_Sdelki='ПОЗИЯ ПРОДАНА, ОТКРЫТА' end  -- флаг направления позиции
--message('открыта ли позиция роботом '..OnTransReply(status))
              message('Робот1,7:trade.order_num: '..tostring(trade.price) );
  return trade.price;
           end;
        end;
        --Если прошло 10 секунд, а сделка не совершена, значит на демо-счете произошла ошибка
      --[[ if os.time() - BeginTime > 9 then
           -- Выводит сообщение с ошибкой
           message('Робот: Прошло 10 секунд, а сделка не совершена, значит на демо-счете произошла ошибка');
           -- Возвращает FALSE
           return false;
        end;]]
        sleep(10); -- Пауза 10 мс, чтобы не перегружать процессор компьютера
     end;
  end;
end;

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--закрытие позиции
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

-- Совершает СДЕЛКУ указанного типа (Type) ["BUY", или "SELL"] по рыночной(текущей) цене размером в 1 лот,
--- возвращает цену открытой сделки, либо FALSE, если невозможно открыть сделку
function TradeZak(TypeZak)
  --Получает ID транзакции
  trans_id = trans_id + 1;
  message('Точка закрытия 1: '..tostring(getItem("FUTURES_CLIENT_HOLDING",0).totalnet)) --then ROBOT_STATE = 'В ПОИСКЕ ТОЧКИ ВХОДА';  message('Точка закрытия 1') else
  if getItem("FUTURES_CLIENT_HOLDING",0).totalnet==0 then
  ROBOT_STATE = 'В ПОИСКЕ ТОЧКИ ВХОДА';  message('Точка закрытия 2') else
  message('Точка закрытия 3')
  local Price = 0;
  local Operation = '';
  --Устанавливает цену и операцию, в зависимости от типа сделки и от класса инструмента
  if getItem("FUTURES_CLIENT_HOLDING",0).totalnet0  then TypeZak ='SELLzak' end
  if TypeZak == 'BUYzak' then
     if CLASS_CODE ~= 'QJSIM' and CLASS_CODE ~= 'TQBR' then Price = getParamEx(CLASS_CODE, SEC_CODE, 'offer').param_value + NProsk*SEC_PRICE_STEP;end; -- по цене, завышенной на 10 мин. шагов цены
     Operation = 'B';
  else
     if CLASS_CODE ~= 'QJSIM' and CLASS_CODE ~= 'TQBR' then Price = getParamEx(CLASS_CODE, SEC_CODE, 'bid').param_value - NProsk*SEC_PRICE_STEP;end; -- по цене, заниженной на 10 мин. шагов цены
     Operation = 'S';
  end;
  -- Заполняет структуру для отправки транзакции
  local Transaction={
     ['TRANS_ID'] = tostring(trans_id),
     ['ACTION'] = 'NEW_ORDER',
     ['CLASSCODE'] = CLASS_CODE,
     ['SECCODE'] = SEC_CODE,
     ['OPERATION'] = Operation, -- операция ("B" - buy, или "S" - sell)
     ['TYPE'] = 'M', -- по рынку (MARKET)
     ['QUANTITY'] = tostring(math.abs(getItem("FUTURES_CLIENT_HOLDING",0).totalnet)), -- количество
     ['ACCOUNT'] = ACCOUNT,
     ['PRICE'] = tostring(Price),
     ['COMMENT'] = 'Простой MA-робот'
  }
  -- Отправляет транзакцию
  sendTransaction(Transaction);
  -- Ждет, пока получит статус текущей транзакции (переменные "trans_Status" и "trans_result_msg" заполняются в функции OnTransReply())
  while Run and trans_Status == nil do sleep(1); end;

  -- Запоминает значение
  local Status = trans_Status;
  -- Очищает глобальную переменную
  trans_Status = nil;
  message('звкрытие Status '..tostring(Status))
  -- Если транзакция не выполнена по какой-то причине
  if Status ~= 3 then
     -- Если данный инструмент запрещен для операции шорт

        -- Выводит сообщение с ошибкой
        message('Робот: Транзакция не прошла!\nОШИБКА: '..tostring(trans_result_msg));


     -- Возвращает FALSE
     return false;
  else --Транзакция отправлена
     local OrderNum = nil;
     --ЖДЕТ пока ЗАЯВКА на ОТКРЫТИЕ сделки будет ИСПОЛНЕНА полностью
     --Запоминает время начала в секундах
     local BeginTime = os.time();
     while Run and OrderNum == nil do
        --Перебирает ТАБЛИЦУ ЗАЯВОК
        for i=getNumberOf('orders')-1, 0, -1 do
           local order = getItem('orders', i);
           --Если заявка по отправленной транзакции ИСПОЛНЕНА ПОЛНОСТЬЮ
           if order.trans_id == trans_id and order.balance == 0 then
              --Запоминает номер заявки
              OrderNum  = order.order_num;
              --Прерывает цикл FOR
              break;
           end;
        end;
        --Если прошло 10 секунд, а заявка не исполнена, значит произошла ошибка
      --[[ if os.time() - BeginTime > 9 then
           -- Выводит сообщение с ошибкой
           message('Робот: Прошло 10 секунд, а заявка не исполнена, значит произошла ошибка');
           -- Возвращает FALSE
           return false;
        end;]]
        sleep(10); -- Пауза 10 мс, чтобы не перегружать процессор компьютера
     end;

     --ЖДЕТ пока СДЕЛКА ОТКРЫТИЯ позиции будет СОВЕРШЕНА
     --Запоминает время начала в секундах
     BeginTime = os.time();
     while Run do
        --Перебирает ТАБЛИЦУ СДЕЛОК
        for i=0,getNumberOf('trades')-1 do
           local tradeZak = getItem('trades', i);
           --Если сделка по текущей заявке
           if tradeZak.order_num == OrderNum --[[and getItem ("FUTURES_CLIENT_HOLDING",0).totalnet==0 ]] then

              --Возвращает фАКТИЧЕСКУЮ ЦЕНУ открытой сделки
  --if Type == 'BUY' then Napravlenie_Sdelki='ПОЗИЯ КУПЛЕНА, ОТКРЫТА' elseif Type == 'SELL' then Napravlenie_Sdelki='ПОЗИЯ ПРОДАНА, ОТКРЫТА' end  -- флаг направления позиции
ROBOT_STATE = 'В ПОИСКЕ ТОЧКИ ВХОДА';
              return tradeZak.price;
           end;
        end;
        --Если прошло 10 секунд, а сделка не совершена, значит на демо-счете произошла ошибка
      --[[ if os.time() - BeginTime > 9 then
           -- Выводит сообщение с ошибкой
           message('Робот: Прошло 10 секунд, а сделка не совершена, значит на демо-счете произошла ошибка');
           -- Возвращает FALSE
           return false;
        end;]]
        sleep(10); -- Пауза 10 мс, чтобы не перегружать процессор компьютера
     end;
  end;
end;
end
 
За такие посты надо сразу банить навечно! :(
 
kvazar1988, оформаляйте код и логи в спойлеры ( кнопка [SP] ). Невозможно смотреть на такие посты.
 
ясно, не знал, в следующий раз исправлю
Страницы: 1
Читают тему
Наверх