Есть рабочий скрипт, писал сам. Работает. Две недели как часы. Вчера во время отсутствия совершил более 100 сделок купил-продал. Прекратил такую петлю только после появления новой свечи на графике(данные берутся с графика). Условие скрипта не выполнялось. Сегодня повторилась та же история....В чем может быть дело?
Поместил внутрь. Вот так. Скрипт запускается и работает. Заявку отправляет, спасибо большое), но стоп и тейк так и не работают...
пишет "attempt to perform arithmetic on upvalue 'Trade_B' (a nil value)".....
не нравится условие Trade_B+50
Почему?
while stopped == false do local Date = getInfoParam("TRADEDATE") local Time = getInfoParam("SERVERTIME")
local DataCandles = getNumCandles("sberprice") local sberprice, sberN, sberName = getCandlesByIndex("sberprice", 0, 0, DataCandles)
local Day = sberprice[sberN-1].datetime.day local Hour = sberprice[sberN-1].datetime.hour local Minute = sberprice[sberN-1].datetime.min local Open = sberprice[sberN-1].open local Close = sberprice[sberN-1].close local High = sberprice[sberN-1].high local Low = sberprice[sberN-1].low
local Open2 = sberprice[sberN-2].open local Close2 = sberprice[sberN-2].close local High2 = sberprice[sberN-2].high local Low2 = sberprice[sberN-2].low
local Open3 = sberprice[sberN-3].open local Close3 = sberprice[sberN-3].close local High3 = sberprice[sberN-3].high local Low3 = sberprice[sberN-3].low
Условие скрипта думаю понятно...хотя уточню, что именно хотел реализовать.
"Если закрытие свечи больше чем предыдущий, а закрытие предыдущей больше более ранней, и нет открытых позиций, то отправляется заявка на покупку. Одновременно выставляется стоп-лосс и тейк-профит. После срабатывания тейка снимается стоп и наоборот."
В ранней версии скрипта делал покупку, но упорно не хотел ставить стоп и тейк. Пока разбирался с причиной и правил скрипт в итоге "добился" что и покупать перестал :( Смотрю, вроде все логично(ну опять таки в моем делитантском понимании), но причину не пойму.
Всем привет. Начинаю только изучать язык, написал ( как мог) примитивный скрипт, вроде все правильно, но не работает.....перепроверил много раз не могу понять в чем причина....Посмотрите, пожалуйста, если не трудно. Укажите на ошибки.
in_trade = false
local stopped = false function OnStop() stopped = true return 1000 end
local ID_B_Order = 100 local ID_B_Stop = 200 local ID_B_Take = 300 local ID_B_StopKill = 200.1 local ID_B_TakeKill = 300.1 local Status_B_Order local Status_B_Stop local Status_B_Take local Status_B_StopKill local Status_B_takeKill local MSG_B_Order local MSG_B_Stop local MSG_B_Take local MSG_B_StopKill local MSG_B_TakeKill local Num_B_Order local Num_B_Stop local Num_B_Take local State_B_Order local Trade_B local Stop_B_Activ = "NO" local Stop_Kill = "NO" local Take_B_Activ = "NO"
function OnTransReply(order) if order.trans_id == ID_B_Order then Status_B_Order = order.status Num_B_Order = order.order_num MSG_B_Order = order.result.msg end if order.trans_id == ID_B_Stop then Status_B_Stop = order.status Num_B_Stop = order.oreder_num MSG_B_Stop = order.result.msg end if order.trans_id == ID_B_Take then Status_B_Take = order.status Num_B_Take = order.oreder_num MSG_B_Take = order.result.msg end if order.trans_id == ID_B_StopKill then Status_B_StopKill = order.status MSG_B_StopKill = order.result.msg end if order.trans_id == ID_B_TakeKillKill then Status_B_takeKill = order.status MSG_B_TakeKill = order.result.msg end
end
function OnOrder(order) if Num_B_Order == order.order_num then if bit.band(order.flags, 0x1) == 0 and bit.band(order.flags, 0x2) == 0 then State_B_Order = "Исполнена" end end end
function OnTrade(trade) if trade.order_num == Num_B_Order then Trade_B = trade.price end end
function OnStopOrder(order) if Num_B_Stop == order.order_num then if bit.band(order.flags, 0x1) == 0 and bit.band (order.flags, 0x2) == 0 then Stop_B_Activ = "YES" end end if Num_B_Take == order.order_num then if bit.band(order.flags, 0x8000) ~= 0 then Take_B_Activ = "YES" end end end
function ResTransaction (ID, Num, Status, MSG, Err) local FileName = "C:\\Lua\\123.txt" local FileOpen = io.open(FileName, "a") local TradeDate = getInfoParam("TRADEDATE") local ServerTime = getInfoParam("SERVERTIME") if Status == 3 then message("ID: "..ID.. "\nNum: "..Num.. "\nStatus: "..Status.. "\nMSG: "..MSG, 1) FileOpen:write("Date: "..TradeDate.. "\tTime: "..ServerTime.. "\tID: "..ID.. "\tNum: "..Num.. "\tStatus "..Status) elseif Status == nil then message("Status == nil. ТРАНЗАКЦИЯ "..ID.." НЕ ВЫПОЛНЕНА. "..Err, 1) FileOpen:write ("Date: "..TradeDate "\tTIME: "..ServerTime.. "\tStatus == nil. ТРАНЗАКЦИЯ "..ID.."НЕ ВЫПОЛНЕНА. "..Err, 1) elseif Status ~=nil then message("MSG: "..MSG, 1) FileOpen:write ("DATE: "..TradeDate.. "\tTIME: "..ServerTime.. "\tMSG: "..MSG.. "\n") end FileOpen:close() end
while stopped == false do local Date = getInfoParam("TRADEDATE") local Time = getInfoParam("SERVERTIME")
local DataCandles = getNumCandles("sberprice") local sberprice, sberN, sberName = getCandlesByIndex("sberprice", 0, 0, DataCandles)
local Day = sberprice[sberN-1].datetime.day local Hour = sberprice[sberN-1].datetime.hour local Minute = sberprice[sberN-1].datetime.min local Open = sberprice[sberN-1].open local Close = sberprice[sberN-1].close local High = sberprice[sberN-1].high local Low = sberprice[sberN-1].low
local Open2 = sberprice[sberN-2].open local Close2 = sberprice[sberN-2].close local High2 = sberprice[sberN-2].high local Low2 = sberprice[sberN-2].low
local Open3 = sberprice[sberN-3].open local Close3 = sberprice[sberN-3].close local High3 = sberprice[sberN-3].high local Low3 = sberprice[sberN-3].low