-
Notifications
You must be signed in to change notification settings - Fork 0
/
iRTS_export v8.lua
879 lines (769 loc) · 30.8 KB
/
iRTS_export v8.lua
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
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
socket=require("socket")
host = "localhost"
port = 12345
do_main=true
Server_Date = getTradeDate().date
num_candles = 0
instrument_graph_code="RTS-12.20"
initialization=0
Lots2Buy=0
can_trade_after_190000=0
function getTradeAccount(class_code)
-- Ôóíêöèÿ âîçâðàùàåò òàáëèöó ñ îïèñàíèåì òîðãîâîãî ñ÷åòà äëÿ çàïðàøèâàåìîãî êîäà êëàññà
for i=0,getNumberOf ("trade_accounts")-1 do
local trade_account=getItem("trade_accounts",i)
if string.find(trade_account.class_codes,class_code,1,1) then
message(trade_account.trdaccid,1)
return trade_account.trdaccid
end
end
return nil
end
CLASS_CODE_FUT = "SPBFUT"; -- Êëàññ ÔÜÞ×ÅÐÑÎÂ
TRADE_ACC = getTradeAccount(CLASS_CODE_FUT) -- Òîðãîâûé ñ÷åò
CLIENT_CODE = TRADE_ACC; -- Êîä êëèåíòà
SEC_CODE_FUT_FOR_OPEN = "RIZ0"; -- Êîä ÔÜÞ×ÅÐÑÀ äëÿ îòêðûòèÿ
SEC_CODE_FUT_IN_POS = ""; -- Êîä ÔÜÞ×ÅÐÑÀ â ïîçèöèè
OPEN_BALANCE_FUT = 0; -- Áàëàíñ ïîçèöèè ïî ÔÜÞ×ÅÐÑÀÌ
OPEN_PRICE_FUT = 0; -- Ñðåäíÿÿ öåíà îòêðûòèÿ ïîçèöèè ïî ÔÜÞ×ÅÐÑÀÌ
OPEN_DATE_FUT = ""; -- Äàòà îòêðûòèÿ ïîçèöèè ïî ÔÜÞ×ÅÐÑÀÌ
NotBS_FUT = true; -- Ôëàã, ÷òî ÔÜÞ×ÅÐÑÛ åùå íå êóïëåíû/ïðîäàíû
OpenPosProcessed = false; -- Ôëàã, ÷òî îòêðûòèå ïîçèöèé îáðàáîòàíî
ClosePosProcessed = false; -- Ôëàã, ÷òî çàêðûòèå ïîçèöèé îáðàáîòàíî
STATE = nil; -- Ôëàã òåêóùåãî ïðîöåññà ("OPEN"/"CLOSE")
trans_id_FUT = nil; -- ID çàÿâêè íà ôüþ÷åðñ
OrderNum_FUT = nil; -- Íîìåð çàÿâêè íà ôüþ÷åðñ â òîðãîâîé ñèñòåìå
require "logging.file"
local logger = logging.file("test%s.log", "%Y-%m-%d")
-- Âîçâðàùàåò òàáëèöó-îïèñàíèå òîðãîâîãî ñ÷åòà ïî åãî íàçâàíèþ èëè nil, åñëè òîðãîâûé ñ÷åò íå îáíàðóæåí
--function(trdaccid) return trdaccid == account end
function search_account(account)
--message("in search_account(account)",1)
--message(account,1)
local t_cnt=getNumberOf("trade_accounts")
for i=0, t_cnt-1 do
local t=getItem("trade_accounts",i)
if t.trdaccid==account then
--message("Find :"..tostring(t.trdaccid),1)
return t
end
end
end
function OnStop(stop_flag)
do_main=false
Log:close();
message("Log file closed",1)
end
function OnInit()
-- Ïûòàåòñÿ îòêðûòü ëîã-ôàéë â ðåæèìå "÷òåíèÿ/çàïèñè"
Log = io.open(getScriptPath().."//Log.txt","r+");
-- Åñëè ôàéë íå ñóùåñòâóåò
if Log == nil then
-- Ñîçäàåò ôàéë â ðåæèìå "çàïèñè"
Log = io.open(getScriptPath().."//Log.txt","w");
-- Çàêðûâàåò ôàéë
Log:close();
-- Îòêðûâàåò óæå ñóùåñòâóþùèé ôàéë â ðåæèìå "÷òåíèÿ/çàïèñè"
Log = io.open(getScriptPath().."//Log.txt","r+");
end;
-- Âñòàåò â êîíåö ôàéëà
Log:seek("end",0);
-- Äîáàâëÿåò ïóñòóþ ñòðîêó-ðàçðûâ
Log:write("\n");
Log:flush();
message("Log file open",1)
ToLog("Script started! ")
-- Èíèöèàëèçèðóåò ãåíåðàòîð
math.randomseed(os.date("*t",os.time()).sec); -- Èíèöèàëèçèðóåò ãåíåðàòîð ïñåâäîñëó÷àéíûõ ÷èñåë ïàðàìåòðîì, êàæäûé ïàðàìåòð ïîðîæäàåò ñîîòâåòñòâóþùóþ (íî îäíó è òó æå) ïîñëåäîâàòåëüíîñòü ïñåâäîñëó÷àéíûõ ÷èñåë.
end;
-- Ôóíêöèÿ äëÿ çàïèñè â ëîã äåéñòâèé ñêðèïòà
function ToLog(str)
local datetime = os.date("*t",os.time()); -- Òåêóùèå äàòà/âðåìÿ
local sec_mcs_str = tostring(os.clock()); -- Ñåêóíäû ñ ìèêðîñåêóíäàìè
local mcs_str = string.sub(sec_mcs_str, sec_mcs_str:find("%.") + 1); -- Ìèêðîñåêóíäû
-- Çàïèñûâàåò â ëîã-ôàéë ïåðåäàííóþ ñòðîêó, äîáàâëÿÿ â åå íà÷àëî âðåìÿ ñ òî÷íîñòüþ äî ìèêðîñåêóíä
Log:write(tostring(datetime.day).."-"
..tostring(datetime.month).."-"
..tostring(datetime.year).." "
..tostring(datetime.hour)..":"
..tostring(datetime.min)..":"
..tostring(datetime.sec).."."
..mcs_str.." "
..str.."\n"); -- Çàïèñûâàåò â ëîã-ôàéë
Log:flush(); -- Ñîõðàíÿåò èçìåíåíèÿ â ëîã-ôàéëå
end;
function getTimeframe(ident) -- òàéìôðåì ãðàôèêà â ñåêóíäàõ
local candles = getCandlesByIndex(ident,0,0,getNumCandles(ident)-1)
if candles then
for i = 1,#candles do
candles[i] = os.time(candles[i].datetime)
end
for i = 2,#candles do
candles[i-1] = candles[i] - candles[i-1]
end
return math.min(unpack(candles))
end
end
function string_full_time(local_date_time)
local hour_=tostring(local_date_time.hour)
local min_ = tostring(local_date_time.min)
local sec_= tostring(local_date_time.sec)
if local_date_time.hour<10
then
hour_="0"..tostring(local_date_time.hour)
else
hour_=tostring(local_date_time.hour)
end
if local_date_time.min<10
then
min_="0"..tostring(local_date_time.min)
else
min_=tostring(local_date_time.min)
end
if local_date_time.sec<10
then
sec_="0"..tostring(local_date_time.sec)
else
sec_=tostring(local_date_time.sec)
end
local string_full_time_ = hour_ .. min_ .. sec_
return string_full_time_
end
function string_full_date(local_date_time)
local year_=tostring(local_date_time.year)
local month_ = tostring(local_date_time.month)
local day_= tostring(local_date_time.day)
if local_date_time.month<10
then
month_="0"..tostring(local_date_time.month)
else
month_=tostring(local_date_time.month)
end
if local_date_time.day<10
then
day_="0"..tostring(local_date_time.day)
else
day_=tostring(local_date_time.day)
end
local string_full_time_ = year_ .. month_ .. day_
return string_full_time_
end
function nGetIndexPrevDateFirstCandle(ind)
local date_=0
local nIndexPrevDateFirstCandle=-1
local server_date_ = tonumber(string_full_date(getTradeDate()))
--logger:debug("server_date_..."..tostring(server_date_))
local c_number=getNumCandles(ind)
local t, res, _ = getCandlesByIndex (ind, 0, 0, c_number)
for i = c_number-1, 2, -1 do
date_ = tonumber(string_full_date(t[i].datetime))
--logger:debug("date_"..tostring(date_))
prev_date2=tonumber(string_full_date(t[i-1].datetime))
--logger:debug("prev_date2..."..tostring(prev_date2))
if date_<server_date_ and date_> prev_date2 then
nIndexPrevDateFirstCandle=i
break
end
end
--logger:debug("nIndexPrevDateFirstCandle..."..tostring(nIndexPrevDateFirstCandle))
return nIndexPrevDateFirstCandle
end
function PrintIndexDateTimeFC(graph)
-- Ïå÷àòü íîìåð, äåíü, äàòà ïåðâîé ñâå÷è ïðåäûäóùåãî äíÿ
local date_=0
local nIndexPrevDateFirstCandle=-1
local server_date_ = tonumber(string_full_date(getTradeDate()))
local c_number=getNumCandles(graph)
local t, res, _ = getCandlesByIndex (graph, 0, 0, c_number)
for i = c_number-1, 2, -1 do
date_ = tonumber(string_full_date(t[i].datetime))
prev_date2=tonumber(string_full_date(t[i-1].datetime))
if date_<server_date_ and date_> prev_date2 then
nIndexPrevDateFirstCandle=i
break
end
end
t, res, _ = getCandlesByIndex (graph, 0, nIndexPrevDateFirstCandle, 1)
local full_time=string_full_time(t[0].datetime)
local full_date=string_full_date(t[0].datetime)
message(tostring(nIndexPrevDateFirstCandle).."; "..full_date.."; "..full_time,1)
return 1
end
function main()
if CheckGraphExist(instrument_graph_code) ~=1
then
message("Graph "..instrument_graph_code.." is not opened!!! Exit from script",1)
ToLog("Graph "..instrument_graph_code.." is not opened!!! Exit from script")
return
else
message("Graph "..instrument_graph_code.." is opened!!!",1)
ToLog("Graph "..instrument_graph_code.." is opened!!!")
end
if CheckFuturesSetup(CLASS_CODE_FUT, SEC_CODE_FUT_FOR_OPEN, instrument_graph_code)>0 then
return
end
-- Ïðîâåðÿåì ñîîòíîøåíèå ACCOUNT è CLASSCODE
local account_description = search_account(TRADE_ACC)
if account_description == nil then
message("Trade account " .. TRADE_ACC .. " not found",1)
ToLog("Trade account " .. TRADE_ACC .. " not found")
elseif string.find(account_description.class_codes,CLASS_CODE_FUT) == nil then
message("Trade account " .. TRADE_ACC .. " doesn't allow to trade " .. CLASS_CODE_FUT,1)
ToLog("Trade account " .. TRADE_ACC .. " doesn't allow to trade " .. CLASS_CODE_FUT)
end
local fut_code_status = tonumber(getParamEx(CLASS_CODE_FUT, SEC_CODE_FUT_FOR_OPEN, "STATUS").param_value);
-- Âûâîäèò ñîîáùåíèå î òåêóùåì ñîñòîÿíèè
if fut_code_status == 1 then
message(SEC_CODE_FUT_FOR_OPEN.." trading");
else
message(SEC_CODE_FUT_FOR_OPEN.." is not trading!!");
return
end;
local socket_version=socket._VERSION
message("Start. Socket version: ".. socket_version,1)
message("Attempting connection to host '" ..host.. "' and port " ..port.. "...",1)
connection = assert(socket.connect(host, port))
message("Connected local port!",1)
--assert(connection:send("Good!".. "\n"))
--num_candles = getNumCandles(instrument_graph_code)
local graph_timeframe = getTimeframe(instrument_graph_code)
graph_timeframe=graph_timeframe/60
message("Graph time frame: " .. tostring(graph_timeframe),1)
if graph_timeframe~=5 then
message("Graph time is NOT 5 minutes",1)
return
end
local export_string_begin = instrument_graph_code..","..tostring(graph_timeframe)..","
local export_string=export_string_begin
local control_signal=-1
--num_candles = nGetIndexPrevDateFirstCandle(instrument_graph_code)-150 -- Òóò íóæíî ïåðåïèñàòü, ò.ê. îïðåäåëÿòü ïåðâóþ ñâå÷ó äíÿ íóæíî îòñ÷åòîì ñâå÷åé, âû÷èòàòü íåëüçÿ, ò.ê. åñòü âå÷åðíÿÿ ñåññèÿ
begin_date=GetGraphStartDatefromConstraints("iRTS_futures_constraints.conf")
current_candle_id = GetCandleIndexbyDate(instrument_graph_code, begin_date)
str_out="Start sending rates from candle: "..tostring(current_candle_id)
message(str_out)
ToLog(str_out)
--PrintIndexDateTimeFC(instrument_graph_code)
num_candles=0
if initialization==0 then
--local num_candles_1=current_candle_id
str_out="Start Initialization! Sending Candles from ".. tostring(current_candle_id).." to external tool..."
message(str_out)
ToLog(str_out)
--local ttable,ret_number, chart_legend=getCandlesByIndex(instrument_graph_code, 0, current_candle_id, 1)
--str_out=ReturnStringwithCandleParams(ttable[0])
--message(str_out)
--message(tostring(current_candle_id)..";"..tostring(getNumCandles(instrument_graph_code)))
while getNumCandles(instrument_graph_code) ~= num_candles do
num_candles_1=getNumCandles(instrument_graph_code)
local get_count = num_candles_1- current_candle_id
local ttable,ret_number, chart_legend=getCandlesByIndex(instrument_graph_code, 0, current_candle_id, get_count)
for i=0, get_count-1 do
--local full_time=string_full_time(ttable[i].datetime)
--local full_date=string_full_date(ttable[i].datetime)
--local o=ttable[i].open
--local c=ttable[i].close
--local h=ttable[i].high
--local l=ttable[i].low
--local v=ttable[i].volume
control_signal=0 --Êîíòðîëüíûé ñèìâîë 0 - ïåðåäà÷à íîâîé ñâå÷è
export_string=tostring(control_signal)..","..export_string_begin .. ReturnStringwithCandleParams(ttable[i])
assert(connection:send(export_string.. "\n"))
local receive_str=""
local receive_partial=""
local connection_receive_status=0
receive_str,connection_receive_status, receive_partial = connection:receive('*l')
local total_receive_str= receive_str or receive_partial
--message(total_receive_str,1)
end
num_candles=num_candles_1
current_candle_id=current_candle_id+get_count
end
initialization=1
message("Initialization Completed! Candles processed: "..tostring(num_candles), 1)
logger:debug("Candles processed: "..tostring(num_candles))
end
-- Training model; Control_signal==1
if control_signal~=1 then
control_signal="Train KRLS"
export_string=tostring(control_signal)
assert(connection:send(export_string.. "\n"))
local receive_str=""
local receive_partial=""
local connection_receive_status=0
receive_str,connection_receive_status, receive_partial = connection:receive('*l')
local total_receive_str= receive_str or receive_partial
if string.find(total_receive_str, "KRLS trained!") then
message("KRLS trained!",1)
else
message("ERROR while KRLS training!!",1)
return
end
end
local re_init=0
local MayTrade = 1
--message("Last candle processed: "..)
while do_main do
num_candles_=getNumCandles(instrument_graph_code)
--logger:debug("Current candles #: "..tostring(num_candles_))
local prediction=0
-- Ïðîâåðÿåì, ÷òî ïîñëå 18-40-00 íåò îòêðûòîé ïîçèöèè
if GetCurrentTime()>184000 then
local current_futures_position=GetCurrentPositionOnFutures(SEC_CODE_FUT_FOR_OPEN)
--message("Currenttime>184000. Current position: "..tostring(current_futures_position),1)
if current_futures_position ~= nil and current_futures_position>0 then
TransactionOnFutures("S",current_futures_position)
MayTrade = 0
end
if current_futures_position ~= nil and current_futures_position<0 then
TransactionOnFutures("B",current_futures_position)
MayTrade = 0
end
MayTrade = 1 -- ÏÎÌÅÍßÒÜ!!!!
end
if num_candles_> num_candles
then
--------------------
if re_init==0 then
-- Çàïðàøèâàåì ó ñåðâåðà ïàðàìåòðû ïîñëåäíåé ñâå÷è
assert(connection:send("GetLastCandleParams".. "\n"))
logger:debug("GetLastCandleParams".. "\n")
receive_str,connection_receive_status, receive_partial = connection:receive('*l')
local total_receive_str= receive_str or receive_partial
message(total_receive_str)
local good_status=CheckLastCandleParams4TwoTools(total_receive_str,instrument_graph_code, num_candles-1)
message("Check status of prev candle: "..tostring(good_status),1)
if good_status==-1
then
-- äàòà è âðåìÿ ïðåäûäóùåé ñâå÷è ñîâïàäàþò, íî ïàðàìåòðû íåò
local ttable,ret_number, chart_legend=getCandlesByIndex(instrument_graph_code, 0, num_candles-1, 1)
for i=0, 0 do
--local full_time=string_full_time(ttable[i].datetime)
--local full_date=string_full_date(ttable[i].datetime)
--local o=ttable[i].open
--local c=ttable[i].close
--local h=ttable[i].high
--local l=ttable[i].low
--local v=ttable[i].volume
control_signal=1 -- Àêòóàëèçèðóåì ïîñëåäíþþ ñâå÷ó
export_string=tostring(control_signal)..","..export_string_begin .. ReturnStringwithCandleParams(ttable[i])
assert(connection:send(export_string.. "\n"))
local receive_str=""
local receive_partial=""
local connection_receive_status=0
receive_str,connection_receive_status, receive_partial = connection:receive('*l')
local total_receive_str= receive_str or receive_partial
message(total_receive_str,1)
end
good_status=1
elseif good_status==-2
then
-- äàòà ÈËÈ âðåìÿ ïðåäûäóùåé ñâå÷è ÍÅ ñîâïàäàþò
local date_2=splitstring(total_receive_str, ",")[0]
local time_2=splitstring(total_receive_str, ",")[1]
local candle2resend=GetCandleIndexbyDateTime(instrument_graph_code, date_2, time_2)
message("Candle to resend: "..candle2resend,1)
local resend_cnt=getNumCandles(instrument_graph_code)-candle2resend
local ttable, ret_number, chart_legend=getCandlesByIndex(instrument_graph_code, 0, candle2resend, resend_cnt)
--message(tostring(getNumberOf(ttable)))
for i=0, resend_cnt-1 do
local full_time=string_full_time(ttable[i].datetime)
local full_date=string_full_date(ttable[i].datetime)
local o=ttable[i].open
local c=ttable[i].close
local h=ttable[i].high
local l=ttable[i].low
local v=ttable[i].volume
control_signal=1 -- "Resend candle"
export_string=tostring(control_signal)..","..export_string_begin .. full_date..","..full_time..","..tostring(o)..","..tostring(h)..","..tostring(l)..","..tostring(c)..","..tostring(v)
assert(connection:send(export_string.. "\n"))
local receive_str=""
local receive_partial=""
local connection_receive_status=0
receive_str,connection_receive_status, receive_partial = connection:receive('*l')
local total_receive_str= receive_str or receive_partial
message(total_receive_str,1)
end
good_status=1
end
--re_init=1
end
--------------------
control_signal=2
message("New candle: " .. tostring(num_candles_).." ("..tostring(CandleTimeByIndex(num_candles_))..")",1)
num_candles = num_candles_
local ttable,ret_number,chart_legend=getCandlesByIndex(instrument_graph_code, 0, num_candles-1,1)
local full_time=string_full_time(ttable[0].datetime)
local full_date=string_full_date(ttable[0].datetime)
local o=ttable[0].open
local c=ttable[0].close
local h=ttable[0].high
local l=ttable[0].low
local v=ttable[0].volume
export_string=tostring(control_signal)..","..export_string_begin .. full_date..","..full_time..","..tostring(o)..","..tostring(h)..","..tostring(l)..","..tostring(c)..","..tostring(v)
--message("New candle time: " .. full_date .. " : ".. full_time,1)
--message(export_string,1)
--message("New candle price: " .. tostring(o).." : "..tostring(h).." : "..tostring(l).." : "..tostring(c).." : "..tostring(v),1)
assert(connection:send(export_string.. "\n"))
local receive_str=""
local receive_partial=""
local connection_receive_status=0
receive_str,connection_receive_status, receive_partial = connection:receive('*l')
local total_receive_str= receive_str or receive_partial
message("Predicted value: "..tostring(total_receive_str),1)
prediction=tonumber(total_receive_str)
if MayTrade==1 then
-- we can trade
-- Ïåðåáèðàåò ñòðîêè òàáëèöû "Ïîçèöèè ïî êëèåíòñêèì ñ÷åòàì (ôüþ÷åðñû)", èùåò Òåêóùèå ÷èñòûå ïîçèöèè ïî èíñòðóìåíòó "RIH5"
local exist_position=0
for i = 0, getNumberOf("FUTURES_CLIENT_HOLDING") - 1 do
-- ÅÑËÈ ñòðîêà ïî íóæíîìó èíñòðóìåíòó È ÷èñòàÿ ïîçèöèÿ íå ðàâíà íóëþ ÒÎ
if getItem("FUTURES_CLIENT_HOLDING",i).sec_code == SEC_CODE_FUT_FOR_OPEN and getItem("FUTURES_CLIENT_HOLDING",i).totalnet ~= 0 then
local futures_in_position = getItem("FUTURES_CLIENT_HOLDING",i).totalnet
-- ÅÑËÈ òåêóùàÿ ÷èñòàÿ ïîçèöèÿ < 0 è ñèãíàë BUY, ÒÎ îòêðûòà äëèííàÿ ïîçèöèÿ (BUY)
if futures_in_position ~= nil and futures_in_position < 0 and prediction> 0
then
--IsBuy = true;
--BuyVol = getItem("FUTURES_CLIENT_HOLDING",i).totalnet; -- Êîëè÷åñòâî ëîòîâ â ïîçèöèè BUY
TransactionOnFutures("B", 2*futures_in_position)
end
if futures_in_position ~= nil and futures_in_position > 0 and prediction< 0 then
--IsBuy = true;
--BuyVol = getItem("FUTURES_CLIENT_HOLDING",i).totalnet; -- Êîëè÷åñòâî ëîòîâ â ïîçèöèè BUY
TransactionOnFutures("S", 2*futures_in_position)
end
exist_position=1
end;
end;
if exist_position==0 then
if prediction> 0 then
--BuyVol = getItem("FUTURES_CLIENT_HOLDING",i).totalnet; -- Êîëè÷åñòâî ëîòîâ â ïîçèöèè BUY
TransactionOnFutures("B", Lots2Buy) --çàäàòü ïàðàìåòð
end
if prediction< 0 then
--BuyVol = getItem("FUTURES_CLIENT_HOLDING",i).totalnet; -- Êîëè÷åñòâî ëîòîâ â ïîçèöèè BUY
TransactionOnFutures("S", Lots2Buy) --çàäàòü ïàðàìåòð
end
end
-- else
-- we don't trade
-- re_init=1
end
end
end
message("Stop",1)
end
-- Ôóíêöèÿ
function TransactionOnFutures(BS_operation, BS_quantity)
--message("Function TransactionOnFutures() is disabled now! Comment return from the top of the function")
--return 0
if can_trade_after_190000==0
then
message("Can't trade after 19:00")
ToLog("Can't trade after 19:00")
return
end
if not (BS_operation =="B" or BS_operation =="S")
then
message("wrong B/S operation code received: "..tostring(BS_operation),1)
return
end
ToLog("OpenPosition"); -- Çàïèñûâàåò â ëîã-ôàéë
-- Óñòàíàâëèâàåò ôëàã òåêóùåãî ïðîöåññà â ÎÒÊÐÛÒÈÅ ïîçèöèè
-- Ñáðàñûâàåò ôëàã îáðàáîòêè îòêðûòèÿ ïîçèöèé
OpenPosProcessed = false;
-- Ãåíåðèðóåò ñëó÷àéíûé ID òðàíçàêöèè íà ïðîäàæó ÔÜÞ×ÅÐÑÎÂ
trans_id_FUT = math.random(1,9999);
ToLog("trans_id_FUT = "..tostring(trans_id_FUT)); -- Çàïèñûâàåò â ëîã-ôàéë
-- Çàïîëíÿåò ñòðóêòóðó äëÿ îòïðàâêè òðàíçàêöèè íà ïðîäàæó ÔÜÞ×ÅÐÑÎÂ
local trn_comment=""
if BS_operation == "B" then
trn_comment="Ïîêóïêà ôüþ÷åðñîâ ñêðèïòîì"
STATE = "BUY";
end
if BS_operation == "S" then
trn_comment="Ïðîäàæà ôüþ÷åðñîâ ñêðèïòîì"
STATE = "SELL";
end
-- ["PRICE"] = tostring(getParamEx(CLASS_CODE_FUT, SEC_CODE_FUT_FOR_OPEN, "bid").param_value - 10*getParamEx(CLASS_CODE_FUT, SEC_CODE_FUT_FOR_OPEN, "SEC_PRICE_STEP").param_value), -- ïî öåíå, çàíèæåííîé íà 10 ìèí. øàãîâ öåíû
local string_BS_quantity=tostring(BS_quantity)
local Transaction={
["TRANS_ID"] = tostring(trans_id_FUT),
["ACTION"] = "NEW_ORDER",
["CLASSCODE"] = CLASS_CODE_FUT,
["SECCODE"] = SEC_CODE_FUT_FOR_OPEN,
["OPERATION"] = BS_operation, -- ïðîäàæà (SELL)
["TYPE"] = "M", -- ïî ðûíêó (MARKET)
["QUANTITY"] = string_BS_quantity, -- êîëè÷åñòâî
["ACCOUNT"] = TRADE_ACC,
["PRICE"] = "0",
["COMMENT"] = trn_comment
}
-- Ôëàã, ÷òî ÔÜÞ×ÅÐÑÛ åùå íå ïðîäàíû
NotBS_FUT = true;
local Result = sendTransaction(Transaction);
ToLog("Çàÿâêà "..BS_operation.." îòïðàâëåíà"); -- Çàïèñûâàåò â ëîã-ôàéë
ToLog("Result = "..Result); -- Çàïèñûâàåò â ëîã-ôàéë
-- ÅÑËÈ ôóíêöèÿ âåðíóëà ñòðîêó äèàãíîñòèêè îøèáêè, ÒÎ çíà÷èò òðàíçàêöèÿ íå ïðîøëà
if Result ~= "" then
-- Âûâîäèò ñîîáùåíèå ñ îøèáêîé
message(BS_operation.." îïåðàöèÿ íå óäàëàñü!\nÎØÈÁÊÀ: "..Result);
-- Çàâåðøàåò âûïîëíåíèå ôóíêöèè
return(0);
end;
end;
--- Ôóíêöèÿ âûçûâàåòñÿ òåðìèíàëîì QUIK ïðè ïîëó÷åíèè íîâîé çàÿâêè èëè ïðè èçìåíåíèè ïàðàìåòðîâ ñóùåñòâóþùåé çàÿâêè.
function OnOrder(order)
-- ÅÑËÈ òåêóùèé ïðîöåññ ÎÒÊÐÛÒÈÅ ïîçèöèè, ÒÎ
if STATE == "BUY" then
-- Åñëè èñïîëíèëàñü çàÿâêà íà ïðîäàæó ÔÜÞ×ÅÐÑÎÂ
if order.trans_id == trans_id_FUT and order.balance == 0 and NotBS_FUT then
ToLog("OnOrder");
ToLog("trans_id = "..tostring(order.trans_id).." balance = "..tostring(order.balance).." order_num = "..tostring(order.order_num));
-- Ìåíÿåò çíà÷åíèå ôëàãà
NotBS_FUT = false;
ToLog("ÔÜÞ×ÅÐÑÛ êóïëåíû"); -- Çàïèñûâàåò â ëîã-ôàéë
-- Çàïîìèíàåò íîìåð çàÿâêè íà ôüþ÷åðñû â òîðãîâîé ñèñòåìå
OrderNum_FUT = order.order_num;
end;
elseif STATE == "SELL" then -- ÅÑËÈ òåêóùèé ïðîöåññ ÇÀÊÐÛÒÈÅ ïîçèöèè, ÒÎ
-- Åñëè èñïîëíèëàñü çàÿâêà íà ïîêóïêó ÔÜÞ×ÅÐÑÎÂ
if order.trans_id == trans_id_FUT and order.balance == 0 and NotBS_FUT then
ToLog("OnOrder");
ToLog("trans_id = "..tostring(order.trans_id).." balance = "..tostring(order.balance).." order_num = "..tostring(order.order_num));
-- Ìåíÿåò çíà÷åíèå ôëàãà
NotBS_FUT = false;
ToLog("ÔÜÞ×ÅÐÑÛ ïðîäàíû"); -- Çàïèñûâàåò â ëîã-ôàéë
-- Çàïîìèíàåò íîìåð çàÿâêè íà ôüþ÷åðñû â òîðãîâîé ñèñòåìå
OrderNum_FUT = order.order_num;
end;
end;
end;
function GetCurrentTime()
local num_candles_2=getNumCandles(instrument_graph_code)
local tt,ret_number,chart_legend=getCandlesByIndex(instrument_graph_code, 0, num_candles_2-1, 1)
local full_time=tonumber(string_full_time(tt[0].datetime))
return full_time
end
function GetCurrentPositionOnFutures(futures_code)
local current_position = nil
for i = 0, getNumberOf("FUTURES_CLIENT_HOLDING") - 1 do
-- ÅÑËÈ ñòðîêà ïî íóæíîìó èíñòðóìåíòó È ÷èñòàÿ ïîçèöèÿ íå ðàâíà íóëþ ÒÎ
if getItem("FUTURES_CLIENT_HOLDING",i).sec_code == futures_code then
current_position = getItem("FUTURES_CLIENT_HOLDING",i).totalnet
break
end
end
return current_position
end
function CheckGraphExist(graph)
local num_candles_3=getNumCandles(graph)
local exists=0
if num_candles_3 ~= nil and num_candles_3>0
then
exists=1
else
exists=0
end
return exists
end
function GetCandleIndexbyDateTime(graph_code_, date_, time_)
--message(date_..","..time_,1)
local candles_cnt=getNumCandles(graph_code_)
local tt,ret_number,chart_legend=getCandlesByIndex(graph_code_, 0, 0, candles_cnt)
local index=-1
for i=candles_cnt-1, 0, -1 do
local full_time=string_full_time(tt[i].datetime)
local full_date=string_full_date(tt[i].datetime)
--message(full_date..","..full_time,1)
if date_== full_date and time_==full_time
then
return i
end
end
return -1
end
function GetCandleIndexbyDate(graph_code_, date_)
-- Get Index of the first candle of a day date_
message(date_,1)
local candles_cnt=getNumCandles(graph_code_)
local tt,ret_number,chart_legend=getCandlesByIndex(graph_code_, 0, 0, candles_cnt)
local index=-1
for i=0, candles_cnt-1 do
--local full_time=string_full_time(tt[i].datetime)
local full_date=string_full_date(tt[i].datetime)
--message(full_date..","..full_time,1)
if tonumber(date_) == tonumber(full_date)
then
return i
end
end
return -1
end
function splitstring(inputstr, sep)
if sep == nil then
sep = "%s"
end
local t={} ; i=0
for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
t[i] = str
i = i + 1
end
return t
end
function CheckLastCandleParams4TwoTools(total_receive_str, graph_code, c_index)
local split = splitstring(total_receive_str, ",")
--message("String received: "..total_receive_str,1)
local date_=split[0]
local time_=split[1]
local o_=split[2]
local h_=split[3]
local l_=split[4]
local c_=split[5]
local v_=split[6]
local ttable,ret_number,chart_legend=getCandlesByIndex(graph_code, 0, c_index,1)
local full_time=string_full_time(ttable[0].datetime)
local full_date=string_full_date(ttable[0].datetime)
local o=ttable[0].open
local c=ttable[0].close
local h=ttable[0].high
local l=ttable[0].low
local v=ttable[0].volume
local result=0
if date_ ~= full_date or time_~=full_time
then
return -2
end
if date_ == full_date and time_==full_time
then
if o_ ~=o or h_ ~=h or l_~=l or c_~=c or v_~=v
then
return -1
end
end
return 1
end
function ReturnStringwithCandleParams(ttable)
local res_string=""
local full_time=string_full_time(ttable.datetime)
local full_date=string_full_date(ttable.datetime)
local o=ttable.open
local c=ttable.close
local h=ttable.high
local l=ttable.low
local v=ttable.volume
res_string=full_date..","..full_time..","..tostring(o)..","..tostring(h)..","..tostring(l)..","..tostring(c)..","..tostring(v)
return res_string
end
function CandleTimeByIndex(index)
local ttable,ret_number,chart_legend=getCandlesByIndex(instrument_graph_code, 0, index-1,1)
local full_time=string_full_time(ttable[0].datetime)
return full_time
end
function GetPrevDate(instrument_graph_code)
local prev_date=""
local num_candles=getNumCandles(instrument_graph_code)
local ttable, ret_number, chart_legend=getCandlesByIndex(instrument_graph_code, 0, num_candles-1, 1)
local full_date=string_full_date(ttable[0].datetime)
local CurrentDate=full_date
local idx_candle=num_candles-2
while idx_candle>=0 do
local ttable, ret_number, chart_legend=getCandlesByIndex(instrument_graph_code, 0, idx_candle, 1)
local full_date=string_full_date(ttable[0].datetime)
if (full_date~=CurrentDate) then
prev_date=full_date
return full_date
end
idx_candle=idx_candle-1
if idx_candle<0 then
return CurrentDate
end
end
end
function GetIndexBeginningOfDay(instrument_graph_code, day)
local search_index=-1
local num_candles=getNumCandles(instrument_graph_code)
for i=0, num_candles-1 do
local ttable, ret_number, chart_legend=getCandlesByIndex(instrument_graph_code, 0, i, 1)
local full_date=string_full_date(ttable[0].datetime)
if full_date==day then
search_index=i
break
end
end
return search_index
end
function GetIndexEndOfDay(instrument_graph_code, day)
local search_index=-1
local num_candles=getNumCandles(instrument_graph_code)
local ttable, ret_number, chart_legend=getCandlesByIndex(instrument_graph_code, 0, num_candles-1, 1)
local full_date=string_full_date(ttable[0].datetime)
if (full_date==day) then
search_index=num_candles-1
return search_index
end
index_scan=num_candles-1
while index_scan>=0 do
ttable, ret_number, chart_legend=getCandlesByIndex(instrument_graph_code, 0, index_scan, 1)
full_date=string_full_date(ttable[0].datetime)
if full_date==day then
search_index=index_scan
return search_index
end
index_scan=index_scan-1
end
return search_index
end
function GetDateByIndex(instrument_graph_code, idx)
local day=""
local num_candles=getNumCandles(instrument_graph_code)
local ttable, ret_number, chart_legend=getCandlesByIndex(instrument_graph_code, 0, idx, 1)
local full_date=string_full_date(ttable[0].datetime)
day=full_date
return day
end
function CheckFuturesSetup(CLASS_CODE_FUT, SEC_CODE_FUT_FOR_OPEN, instrument_graph_code)
-- Check that futures code (short name) in TTP == futures code in opened graph
rts_ptype=tostring(getParamEx(CLASS_CODE_FUT, SEC_CODE_FUT_FOR_OPEN, "shortname").param_type)
rts_name=tostring(getParamEx(CLASS_CODE_FUT, SEC_CODE_FUT_FOR_OPEN, "shortname").param_value)
rts_ok=tostring(getParamEx(CLASS_CODE_FUT, SEC_CODE_FUT_FOR_OPEN, "shortname").result)
rts_image=tostring(getParamEx(CLASS_CODE_FUT, SEC_CODE_FUT_FOR_OPEN, "shortname").param_image)
if rts_ptype == "3" then
if rts_image==instrument_graph_code then
return 0
else
message("Graph is opened for wrong futures code! Please check code names...")
return 1
end
end
return 0
end
function GetGraphStartDatefromConstraints(fn)
local date_constraints = {}
local start_date=""
for line in io.lines(fn) do
cnt=0
for w in line:gmatch("(.-);") do
if cnt==0 then fut_code=w end
if cnt==1 then fut_desc=w end
if cnt==2 then date_begin=tonumber(w) end
if cnt==3 then date_end=tonumber(w) end
--message(w)
cnt=cnt+1
end
--local fut_code, fut_desc, date_begin, date_end, file_name = line:match("(%w+);(.+);(%d+);(%d+);(.+)")
--date_begin=tonumber(date_begin)
--date_end=tonumber(date_end)
curr_date=tonumber(string_full_date(getTradeDate()))
str_out=tostring(fut_code)..";"..tostring(date_begin)..";"..tostring(date_end)..";"..tostring(curr_date)..";"
ToLog(str_out)
--message(str_out)
start_date=date_begin
if (curr_date>=date_begin and curr_date<=date_end) then
str_out="Start date fro graph: "..tostring(start_date)
ToLog(str_out)
--message(str_out)
return start_date
end
end
return start_date
end