require QL require iuplua log moving_signals log --идентификаторы граф

  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
require"QL"
require"iuplua"
log="moving_signals.log"
--идентификаторы графиков
chart1="short_mov"
chart2="long_mov"
account="NL0011100043" --торговый счёт берем из заявки
client_code="KF101" --код клиента Брать из таблицы лимитов по денежным средствам
ticker_list = {"CHMF"} --задаём торгуемые акции
trade_volume=1 --задаём количество лотов, которые набираем в ходе торговли.
stop_steps=2 --размер стопа в шагах цены.
maxloss = 100 -- максимальный убыток, при котором торговля по позиции прекращается
is_run = true
function OnStop()
is_run = false
toLog(log,'OnStop. Script finished manually')
-- уничтожаем таблицу Квик
t:delete()
end
function main()
log=getScriptPath()..'\\'..log
toLog(log,"Start main")
--создаем таблицу Квик
t=QTable:new()
-- добавляем 2 столбца
t:AddColumn("TREND DETECTOR",QTABLE_STRING_TYPE,45)
t:AddColumn("SIGNAL",QTABLE_STRING_TYPE,30)
-- назначаем название для таблицы
t:SetCaption('Moving Signals')
-- показываем таблицу
t:Show()
-- добавляем пустую строку
line=t:AddLine()
while is_run do
stime=getSTime()
if stime>090030 and stime<234500 then --не считаем вне сессии
for key,sec in pairs(ticker_list) do
class=getSecurityInfo("",sec).class_code
lot=getParamEx(class,sec,"lotsize").param_value
step=getParamEx(class,sec,"SEC_PRICE_STEP").param_value
--получаем значения индикаторов
--обращаемся к короткому мувингу
if not isChartExist(chart1) then
toLog(log,'Can`t get data from chart '..chart1)
message('Не можем получить данные с графика '..chart1,1)
is_run=false
break
end
--обращаемся к длинному мувингу
if not isChartExist(chart2) then
toLog(log,'Can`t get data from chart '..chart2)
message('Не можем получить данные с графика '..chart2,1)
is_run=false
break
end
--Детектор тренда
if turnUp(1,chart1) and turnUp(1,chart2) then
toLog(log,'TrendUp detected')
TREND_DETECTOR="Оба мувинга растут. Рынок быков" --выводим переменную TREND_DETECTOR в таблицу КВИКа.
elseif turnDown(1,chart1) and turnDown(1,chart2) then
toLog(log,'TrendDown detected')
TREND_DETECTOR="Оба мувинга падают. Рынок медведей" --выводим переменную TREND_DETECTOR в таблицу КВИКа.
else
TREND_DETECTOR="Нет выраженного тренда"
end
--Генерация сигналов.
--Золотой крест
if crossOver(1,chart1,chart2) then
iup.Message('Новый сигнал!','ЗОЛОТОЙ КРЕСТ')
toLog (log, "Golden Cross detected")
SIGNAL="GOLDEN CROSS" --выводим в таблицу КВИКа.
--Мёртвый крест
elseif crossUnder(1,chart1,chart2) then
iup.Message('Новый сигнал!','МЁРТВЫЙ КРЕСТ')
toLog (log, "Dead Cross detected")
SIGNAL="DEAD CROSS" --выводим в таблицу КВИКа.
else
SIGNAL="NO SIGNAL" --выводим в таблицу КВИКа.
end
-- заполняем значения для ячеек таблицы
t:SetValue(line,"TREND DETECTOR",TREND_DETECTOR)
t:SetValue(line,"SIGNAL",SIGNAL)
--sleep(1000)
--Получаем стакан. Берём первых лучших.
local qt = getQuoteLevel2("QJSIM","CHMF") --тут надо поменять на параметры торгуемой акции . в данном случае Северсталь в симуляторе
local bid_1 = toPrice(sec, qt.bid[tonumber(qt.bid_count)+0].price)
local offer_1 = toPrice(sec, qt.offer[1].price)
--Получаем баланс
function get_balance(sec, cl_code)
local n=getNumberOf("depo_limits")
toLog (log, "number_of_depo_limits= "..n)
for i=0,n-1 do
limit = getItem("depo_limits", i)
--toLog (log, limit.sec_code.." "..limit.trdaccid)
if limit~=nil and limit.sec_code == sec and limit.trdaccid == cl_code then
return limit.currentbal
end
end
return 0
end
balance = get_balance("CHMF","KF101") --тут надо заменить аргументы на нужные
--if varmargin + sec.maxloss < 0 then sec.enabled = false end
--Открытие позиций
if stime>090030 and stime<233000 then
if TREND_DETECTOR=="Оба мувинга растут. Рынок быков" and balance<trade_volume*lot then toLog (log, "we're inside buy signal")
send_limit_buy, reply=sendLimit(class,sec,"B",bid_1+step,1,account,client_code, "BUY")
end
if TREND_DETECTOR=="Оба мувинга падают. Рынок медведей" and balance>(trade_volume*lot)*-1 then toLog (log, "we're inside sell signal")
send_limit_sell, reply=sendLimit(class,sec,"S",offer_1-step,1,account,client_code, "SELL")
end
end
--ЗАКРЫТИЕ ПОЗИЦИЙ
if stime>090030 and stime<234500 then
if balance>0 and (line_10-offer_1)>stop_steps*step --or lokomotiv_conditions=="Lokomotiv_DOWN")
then
--toLog (log, "we're inside sell out signal")
if tonumber(net_price)<tonumber(offer_1-step) then
--comment="Lokomotiv+"
else
--comment="Lokomotiv-"
end
send_limit_sell_out, reply=sendLimit(class,sec,"S",offer_1-step,1,account,client_code, comment)
--toLog(log, sec.." "..reply)
elseif balance<0 and (bid_1-line_10)>stop_steps*step --or lokomotiv_conditions=="Lokomotiv_UP")
then
--toLog (log, "we're inside buy out signal")
if tonumber(net_price)>tonumber(bid_1+step) then
--comment="Lokomot+"
else
--comment="Lokomotiv-"
end
send_limit_buy_out, reply=sendLimit(class,sec,"B",bid_1+step,1,account,client_code, comment)
--toLog(log, sec.." "..reply)
end
sleep(1000)
toLog(log,"Main ended")
iup.ExitLoop()
iup.Close()
end
end
end
end
end