MARKET = «SPBFUT»
TICKER = «SiH7»
ACCOUNT = "----"
CLIENT_CODE = "----"
TRANS_ID = 0
STOP_FACTOR = 30
SPREAD_FACTOR = 30
LAST_ORDER = 0
TRANS_REPLY = nil
BALANCE = 0
BEZUBYTOK=STOP_FACTOR*5--0.0014--малый шаг
TP=STOP_FACTOR*30--STOP_FACTOR*1--0.015--в % внутри дня (тейк-профит).большой шаг
SREDNSHAG=STOP_FACTOR*10---0.007--средн.шаг(0.08* STOP_FACTOR /1000)
n=3-- кол-во кругов малого BEZUBYTOK>STOP_FACTOR*(n+1)--минимально
k=4--кол-во кругов безубытка --SREDNSHAG>STOP_FACTOR*(k+1)--минимально
run = true
function main()
while run do
if LAST_ORDER == 0 then
BALANCE = GetTotalnet()
if BALANCE ~= 0 then
LAST_ORDER = NewStopOrder(BALANCE)
end
else
BALANCE = GetTotalnet()
for i = getNumberOf(«STOP_ORDERS») — 1, 0, -1 do
local stop_order = getItem(«STOP_ORDERS», i)
if stop_order.order_num == LAST_ORDER then
if CheckBit(stop_order.flags, 0) then --«ACTIVE»
local HAVE_CHANGE = 0
local QUANTITY = stop_order.qty
if QUANTITY ~= math.abs(BALANCE) then
HAVE_CHANGE = 1
else
local PRICES = {}
PRICES = SetStopprice(PRICES, QUANTITY)
local SPRICE = PRICES[«STOPPRICE»]:gsub(',','.') + 0
local OPRICE = stop_order.condition_price
if not CheckBit(stop_order.flags, 2) then --«BUY»
if SPRICE < OPRICE-SREDNSHAG then — первый цикл средний круг
if SPRICE < OPRICE-TP then — тейк профит большой круг
HAVE_CHANGE =1
end
else
if SPRICE < OPRICE-STOP_FACTOR then — первый цикл малый круг
for i = 0, n do
if i< n then
-- message(«отодвигается!!! »..tostring(n)..")
message(«отодвигается!!!», 3)--
HAVE_CHANGE =1
end
end
if SPRICE < OPRICE-BEZUBYTOK then — первый цикл безубыток круг
for i = 0, k do
if i<k then
message(«безубыток!!!», 3)--;
HAVE_CHANGE =1
end
end
end
end
end
else — «SELL»
if SPRICE > OPRICE+SREDNSHAG then — первый цикл средний круг
if SPRICE > OPRICE+TP*OPRICE then — тейк профит большой круг
HAVE_CHANGE =1
end
else
if SPRICE > OPRICE+STOP_FACTOR then — первый цикл малый круг
for i = 0, n do
if i> n then
message(«отодвигается!!!», 3)--;
HAVE_CHANGE =1
end
end
if SPRICE > OPRICE+BEZUBYTOK then — первый цикл безубыток круг
for i = 0, k do
if i>k then
message(«безубыток!!!», 3)--;
HAVE_CHANGE =1
end
end
end
end
end
end
end
if HAVE_CHANGE == 1 then
KillStopOrder()
LAST_ORDER = 0
break
end
else
LAST_ORDER = 0
end
end
end
end
sleep(200)
end
end
function OnStop()
run = false
end
— Получает текущую чистую позицию по инструменту
GetTotalnet = function()
for i = 0,getNumberOf('futures_client_holding') — 1 do
local futures_client_holding = getItem('futures_client_holding',i)
if futures_client_holding.sec_code == TICKER then
return futures_client_holding.totalnet
end
end
— Если позиция по инструменту в таблице не найдена, возвращает 0
return 0
end
function NewStopOrder(size)
T = {}
TRANS_ID = TRANS_ID + 1
T[«TRANS_ID»] = tostring(TRANS_ID)
T[«ACTION»] = «NEW_STOP_ORDER»
T[«CLASSCODE»] = MARKET
T[«SECCODE»] = TICKER
T[«ACCOUNT»] = ACCOUNT
T[«CLIENT_CODE»] = CLIENT_CODE
T = SetStopprice(T)
if BALANCE > 0 then
T[«OPERATION»] = «S»
else
T[«OPERATION»] = «B»
end
T[«QUANTITY»] = tostring(math.abs(size))
local trans_reply = SEND_TRANSACTION(30, T)
if trans_reply ~= nil then
if trans_reply.order_num ~= nil then
return trans_reply.order_num
else
message(trans_reply.result_msg)
return 0
end
else
return 0
end
end
function KillStopOrder()
KILLING_STOP_ORDER = true
T = {}
TRANS_ID = TRANS_ID + 1
T[«TRANS_ID»] = tostring(TRANS_ID)
T[«ACTION»] = «KILL_STOP_ORDER»
T[«STOP_ORDER_KEY»] = tostring(LAST_ORDER)
T[«CLASSCODE»] = MARKET
T[«SECCODE»] = TICKER
T[«ACCOUNT»] = ACCOUNT
T[«CLIENT_CODE»] = CLIENT_CODE
local trans_reply = SEND_TRANSACTION(30, T)
if trans_reply ~= nil then
— Ждет результата снятия стоп-заявки (3 — снята, 4 — не удалось снять)
while TRANS_REPLY.status ~= 3 and TRANS_REPLY.status ~= 4 do
sleep(10)
end
end
end
function SetStopprice(T)
local last = getParamEx(MARKET, TICKER, «LAST»).param_value + 0
local price_step = getParamEx(MARKET, TICKER, «SEC_PRICE_STEP»).param_value + 0
local price = 0
local stop_price = 0
if BALANCE > 0 then
stop_price = last — STOP_FACTOR
price = stop_price — SPREAD_FACTOR
else
stop_price = last + STOP_FACTOR
price = stop_price + SPREAD_FACTOR
end
T[«PRICE»] = tostring(price):gsub('[\.]', ',')
T[«STOPPRICE»] = tostring(stop_price):gsub('[\.]', ',')
return T
end
function SEND_TRANSACTION(Timeout, T)
TRANS_REPLY = nil
local res = sendTransaction(T)
if res ~= "" then
message(res)
return nil
end
local time_sec = os.time()
while os.time() — time_sec < Timeout do
if TRANS_REPLY ~= nil and TRANS_REPLY.trans_id == TRANS_ID then
break
end
end
return TRANS_REPLY
end
function OnTransReply(trans_reply)
if trans_reply.trans_id == TRANS_ID then
TRANS_REPLY = trans_reply
end
end
— Функция проверяет установлен бит, или нет (возвращает true, или false)
CheckBit = function(flags, _bit)
— Проверяет, что переданные аргументы являются числами
if type(flags) ~= «number» then error(«Ошибка!!! Checkbit: 1-й аргумент не число!») end
if type(_bit) ~= «number» then error(«Ошибка!!! Checkbit: 2-й аргумент не число!») end
if _bit == 0 then _bit = 0x1
elseif _bit == 1 then _bit = 0x2
elseif _bit == 2 then _bit = 0x4
elseif _bit == 3 then _bit = 0x8
elseif _bit == 4 then _bit = 0x10
elseif _bit == 5 then _bit = 0x20
elseif _bit == 6 then _bit = 0x40
elseif _bit == 7 then _bit = 0x80
elseif _bit == 8 then _bit = 0x100
elseif _bit == 9 then _bit = 0x200
elseif _bit == 10 then _bit = 0x400
elseif _bit == 11 then _bit = 0x800
elseif _bit == 12 then _bit = 0x1000
elseif _bit == 13 then _bit = 0x2000
elseif _bit == 14 then _bit = 0x4000
elseif _bit == 15 then _bit = 0x8000
elseif _bit == 16 then _bit = 0x10000
elseif _bit == 17 then _bit = 0x20000
elseif _bit == 18 then _bit = 0x40000
elseif _bit == 19 then _bit = 0x80000
elseif _bit == 20 then _bit = 0x100000
end
if bit.band(flags,_bit ) == _bit then return true
else return false end
end
эта программа теперь не работает и разбираться не хочется.
это трейлинг стоп на 3 уровня.проходит первый уровень безубытка и второй уровень с третьим добавляет уровни.
MARKET = «TQBR»--«TQDE»
TICKER = «FEES»--«GMKN»--«TAER» --«GMKN»
ACCOUNT = «L01-00000F00»
CLIENT_CODE = "---"
LIMIT_KIND = 2
TRANS_ID = 0
STOP_FACTOR = 0.0006
STOP_FACTOR1 = STOP_FACTOR*2 — 0.0003
SPREAD_FACTOR = 0.001
LAST_ORDER = 0
TRANS_REPLY = nil
BALANCE = 0 --автостоп
BALANCE1=30 — постоянное кол-во
lot=1 — лот тикера
n=3-- кол-во кругов малого --BEZUBYTOK>STOP_FACTOR*(n+1)--минимально
k=4--кол-во кругов безубытка --SREDNSHAG>BEZUBYTOK*(k+1)---STOP_FACTOR*(k+1)--минимально
BEZUBYTOK=STOP_FACTOR*3--0.0014--малый шаг
TP=STOP_FACTOR*10--STOP_FACTOR*1--0.015--в % внутри дня (тейк-профит).большой шаг
SREDNSHAG=STOP_FACTOR*5---0.007--средн.шаг(0.08* STOP_FACTOR /1000)
i=0
c=0
run = true
function main()
while run do
if LAST_ORDER == 0 then
BALANCE = GetBalance()
if BALANCE ~= 0 then
LAST_ORDER = NewStopOrder(BALANCE)
end
else
BALANCE = GetBalance()
for i = getNumberOf(«STOP_ORDERS») — 1, 0, -1 do
local stop_order = getItem(«STOP_ORDERS», i)
if stop_order.order_num == LAST_ORDER then
if CheckBit(stop_order.flags, 0) then --«ACTIVE»
local HAVE_CHANGE = 0
local QUANTITY = stop_order.qty
if QUANTITY ~= math.abs(BALANCE/lot) then --обязательно делить на лот.иначе снимает
HAVE_CHANGE = 1
else
local PRICES = {}
PRICES = SetStopprice(PRICES, QUANTITY)
local SPRICE = PRICES[«STOPPRICE»]:gsub(',','.') + 0
local OPRICE = stop_order.condition_price
if not CheckBit(stop_order.flags, 2) then --«BUY»
if SPRICE < OPRICE-SREDNSHAG then — первый цикл средний круг
if SPRICE < OPRICE-TP then — тейк профит большой круг
HAVE_CHANGE =1
end
else
------------------------------------------------------------------------------------------------------------------------
if SPRICE < OPRICE-BEZUBYTOK then — первый цикл малый круг
--for i = 0, k do
if i <k then
message(«безубыток!!!», 3)--;
message(«i = »..i) --message('i = '..i)
STOP_FACTOR=STOP_FACTOR1 --отдаление шага
HAVE_CHANGE =1
i =i+1
end
else
if SPRICE < OPRICE-STOP_FACTOR then — первый цикл безубыток круг
--for c = 0, n do
if c <n then
message(«отодвигается!!!», 3)--;
message(«c = »..c) --message('c = '..c)
HAVE_CHANGE =1
c=c+1
end
end
end --
end
—
else — «SELL»
if SPRICE > OPRICE+SREDNSHAG then — первый цикл средний круг
if SPRICE > OPRICE+TP then — тейк профит большой круг
HAVE_CHANGE =1
end
else
------------------------------------------------------------------------------------------------------------------------
if SPRICE > OPRICE+BEZUBYTOK then — первый цикл малый круг
--for i = 0, k do
if i <k then
message(«безубыток!!!», 3)--;
message(«i = »..i) --message('i = '..i)
STOP_FACTOR=STOP_FACTOR1 --отдаление шага
HAVE_CHANGE =1
i =i+1
end
else
if SPRICE > OPRICE+STOP_FACTOR then — первый цикл безубыток круг
--for c = 0, n do
if c <n then
message(«отодвигается!!!», 3)--;
message(«c = »..c) --message('c = '..c)
HAVE_CHANGE =1
c=c+1
end
end
end --
--------------------------------------------------------------------------------------------------------------------------
end
end
end
if HAVE_CHANGE == 1 then
KillStopOrder()
LAST_ORDER = 0
break
end
else
LAST_ORDER = 0
end
end
end
end
sleep(10)
end
end
function OnStop()
run = false
end
function GetBalance()
for i = 0, getNumberOf(«DEPO_LIMITS») — 1 do
local depo_limit = getItem(«DEPO_LIMITS», i)
if depo_limit.sec_code == TICKER
and depo_limit.trdaccid == ACCOUNT
and depo_limit.limit_kind == LIMIT_KIND then
— return BALANCE1--depo_limit.currentbal — прыгает баланс--прозвон баланса--BALANCE1--перекос продажи и если условие if то докупщик и продажник
return depo_limit.currentbal
end
end
return 0
end
function NewStopOrder(size)
T = {}
TRANS_ID = TRANS_ID + 1
T[«TRANS_ID»] = tostring(TRANS_ID)
T[«ACTION»] = «NEW_STOP_ORDER»
T[«CLASSCODE»] = MARKET
T[«SECCODE»] = TICKER
T[«ACCOUNT»] = ACCOUNT
T[«CLIENT_CODE»] = CLIENT_CODE
T = SetStopprice(T)
if BALANCE > 0 then
T[«OPERATION»] = «S»
else
T[«OPERATION»] = «B»
end
T[«QUANTITY»] = tostring(math.abs(size/lot))
local trans_reply = SEND_TRANSACTION(30, T)
if trans_reply ~= nil then
if trans_reply.order_num ~= nil then
return trans_reply.order_num
else
message(trans_reply.result_msg)
return 0
end
else
return 0
end
end
function KillStopOrder()
KILLING_STOP_ORDER = true
T = {}
TRANS_ID = TRANS_ID + 1
T[«TRANS_ID»] = tostring(TRANS_ID)
T[«ACTION»] = «KILL_STOP_ORDER»
T[«STOP_ORDER_KEY»] = tostring(LAST_ORDER)
T[«CLASSCODE»] = MARKET
T[«SECCODE»] = TICKER
T[«ACCOUNT»] = ACCOUNT
T[«CLIENT_CODE»] = CLIENT_CODE
local trans_reply = SEND_TRANSACTION(30, T)
if trans_reply ~= nil then
— Ждет результата снятия стоп-заявки (3 — снята, 4 — не удалось снять)
while TRANS_REPLY.status ~= 3 and TRANS_REPLY.status ~= 4 do
sleep(10)
end
end
end
function SetStopprice(T)
local last = getParamEx(MARKET, TICKER, «LAST»).param_value + 0
local price_step = getParamEx(MARKET, TICKER, «SEC_PRICE_STEP»).param_value + 0
local price = 0
local stop_price = 0
if BALANCE > 0 then
stop_price = last — STOP_FACTOR
price = stop_price — SPREAD_FACTOR
else
stop_price = last + STOP_FACTOR
price = stop_price + SPREAD_FACTOR
end
T[«PRICE»] = tostring(price):gsub('[\.]', ',')
T[«STOPPRICE»] = tostring(stop_price):gsub('[\.]', ',')
return T
end
function SEND_TRANSACTION(Timeout, T)
TRANS_REPLY = nil
local res = sendTransaction(T)
if res ~= "" then
message(res)
return nil
end
local time_sec = os.time()
while os.time() — time_sec < Timeout do
if TRANS_REPLY ~= nil and TRANS_REPLY.trans_id == TRANS_ID then
break
end
end
return TRANS_REPLY
end
function OnTransReply(trans_reply)
if trans_reply.trans_id == TRANS_ID then
TRANS_REPLY = trans_reply
end
end
— Функция проверяет установлен бит, или нет (возвращает true, или false)
CheckBit = function(flags, _bit)
— Проверяет, что переданные аргументы являются числами
if type(flags) ~= «number» then error(«Ошибка!!! Checkbit: 1-й аргумент не число!») end
if type(_bit) ~= «number» then error(«Ошибка!!! Checkbit: 2-й аргумент не число!») end
if _bit == 0 then _bit = 0x1
elseif _bit == 1 then _bit = 0x2
elseif _bit == 2 then _bit = 0x4
elseif _bit == 3 then _bit = 0x8
elseif _bit == 4 then _bit = 0x10
elseif _bit == 5 then _bit = 0x20
elseif _bit == 6 then _bit = 0x40
elseif _bit == 7 then _bit = 0x80
elseif _bit == 8 then _bit = 0x100
elseif _bit == 9 then _bit = 0x200
elseif _bit == 10 then _bit = 0x400
elseif _bit == 11 then _bit = 0x800
elseif _bit == 12 then _bit = 0x1000
elseif _bit == 13 then _bit = 0x2000
elseif _bit == 14 then _bit = 0x4000
elseif _bit == 15 then _bit = 0x8000
elseif _bit == 16 then _bit = 0x10000
elseif _bit == 17 then _bit = 0x20000
elseif _bit == 18 then _bit = 0x40000
elseif _bit == 19 then _bit = 0x80000
elseif _bit == 20 then _bit = 0x100000
end
if bit.band(flags,_bit ) == _bit then return true
else return false end
end
--Параметры:
p_classcode=«SPBFUT» --Код класса
p_seccode=«RIZ5» --Код инструмента
p_account="---" --Код счета
p_clientcode="---" --Клиенткий код
p_count=1 --Размер позиции
p_spread=200 --Проскальзывание
p_sell_level_zigzag=500 --уровень RSI, при котором продаем
p_buy_level_zigzag=500 --уровень RSI, при котором покупаем
is_run = true
count = 0
function main()
while is_run do
sleep(100)
robot()
end
end
function robot()
local N1=getNumCandles(«RIZ5-zig-zag»)
--local N2=getNumCandles(«RSI-15-BRJ5»)
local N=getNumCandles(«RIZ5-zig-zag-price»)
— message(«RIZ5-zig-zag-price: »..RIZ5-zig-zag-price),1)
t1,n1,i1=getCandlesByIndex(«RIZ5-zig-zag», 0, N1-2, 2)--(«RSI-1», 0, N1-3, 2)
message(«RIZ5-zig-zag: »..t1[1].close,1)-- message(«MA1-RIH5: »..t1[0].close,1)
--t2,n2,i2=getCandlesByIndex(«RSI-15-BRJ5», 0, N2-3, 3)--(«RSI-2», 0, N2-3, 2)
t,n,i=getCandlesByIndex(«RIZ5-zig-zag-price», 0, N-1, 1)
message(«RIZ5-zig-zag-price: »..t[0].close,1)
--сигнал на продажу (первый мувинг пересекает втрой RSI-15-BRJ5 сверху вниз
if t[0].close<t1[1].close and t1[1].close>t[0].close+p_sell_level_zigzag then--фильтр уровня
--if t1[0].close>t2[0].close and t1[1].close<t2[1].close then
--if t1[0].close>t2[0].close and t1[1].close<t2[1].close then
--if t1[1].close>p_sell_level_RSI --фильтр уровня
Trade(«S»,count+p_count,t[0].close-p_spread)
--end
end
--сигнал на покупку (первый мувинг RSI-5-BRJ5 пересекает второй снизу вверх
if t[0].close>t1[1].close and t1[1].close<t[0].close-p_buy_level_zigzag then--фильтр уровня
--if t1[0].close>t2[0].close and t1[1].close<t2[1].close then
--if t1[1].close<p_buy_level_RSI --фильтр уровня
Trade(«B»,p_count-count,t[0].close+p_spread)
--end
end
end
function Trade(a_oper,a_count,a_price)
if a_count>0 then
t = {
[«CLASSCODE»]=p_classcode,
[«SECCODE»]=p_seccode,
[«ACTION»]=«NEW_ORDER»,
[«ACCOUNT»]=p_account,
[«CLIENT_CODE»]=p_clientcode,
[«TYPE»]=«L»,
[«OPERATION»]=a_oper,
[«QUANTITY»]=tostring(a_count),
[«PRICE»]=tostring(a_price),
[«EXPIRY_DATE»]=«TODAY»,
[«TRANS_ID»]=«1»
}
res=sendTransaction(t)
message(«Количество до »..tostring(count).." количество сделки "..tostring(a_count).." тип операции"..a_oper,1)
if a_oper==«B» then
count=count+a_count
else
count=count-a_count
end
message(«Количество после »..tostring(count),1)
end
end
function OnStop(stop_flag)
is_run=false
stop_flag=1
end
это все сейчас не работает на 16 битовой
сканер гэпов не работает
--Параметры:
p_classcode=«TQBR»--«SPBFUT» --Код класса
MARKET = «TQBR»
TICKER = «SBER»
ACCOUNT = "---"
CLIENT_CODE = "---"
p_seccode=«SBER» --Код инструмента
p_account=«L01-00----»--"---" --Код счета
p_clientcode="----" --Клиенткий код
--p_count=2 --Размер позиции
--p_spread=170 --Проскальзывание
p_day=3000-- дней
n_day=1000-- не мнеьше 2х.последние свечи
is_run = true
count = 0
function main()
while is_run do
sleep(100)
robot()
end
end
— два варианта -перебор от последней минус заданное или до заданного.
function robot()
local N1=getNumCandles(«SBER_low»)
local N2=getNumCandles(«SBER_high»)
local N=getNumCandles(«SBER»)
--t,n,i=getCandlesByIndex(«SBER», 0, N-2, 2)
if n_day <p_day then
t1,n1,i1=getCandlesByIndex(«SBER_low», 0, N1-n_day, 2)--
t2,n2,i2=getCandlesByIndex(«SBER_high», 0, N2-(n_day-1), 2) --
if t1[0].low>t2[0].high then
message(«t2[0].high = »..t2[0].high)
message(«t1[0].low = »..t1[0].low )
message(«n_day = »..n_day)
message(«гэп нижний!», 3)--;
end
— end
n_day =n_day+1
end
end
function OnStop(stop_flag)
is_run=false
stop_flag=1
end
Ставьте самый новый 8.11 и потом переделывайте скрипты
можно только добавлять
помню чудаки даже формат времени сменили идиоты с например «7» часов на «07» часов, или наоборот.
нахрена это делать то, кому это свербило, так и тут тоже
не интересно пока
встаёшь в аналитику андреева или кого главное стоп не сорвало первый и к вечеру если 3% в день в канале он не задевает куороткий стоп и переходит ещо дальше.
может так все на насдаке или уол стрит работают.
qpile здесь уже не работает!
скорости не хватает!