function Init() strategy:name("SE Repeat order"); strategy:description(""); strategy.parameters:addString("Account", "Account", "", ""); strategy.parameters:setFlag("Account", core.FLAG_ACCOUNT); strategy.parameters:addString("Type", "Price Type", "", "Bid"); strategy.parameters:addStringAlternative("Type", "Bid", "", "Bid"); strategy.parameters:addStringAlternative("Type", "Ask", "", "Ask"); end local Amount; local Offer; local Account; local PointSize; local Digits; local QTXT; local TickSource; local BaseSize; function Prepare() Offer = core.host:findTable("offers"):find("Instrument", instance.bid:instrument()).OfferID; PointSize = core.host:findTable("offers"):find("Instrument", instance.bid:instrument()).PointSize; Digits = core.host:findTable("offers"):find("Instrument", instance.bid:instrument()).Digits; Account = instance.parameters.Account; Amount = core.host:execute("getTradingProperty", "minQuantity", instance.bid:instrument(), Account); QTXT = "create_orders_SE_test"; BaseSize = core.host:execute("getTradingProperty", "baseUnitSize", instance.bid:instrument(), Account); TickSource = ExtSubscribe(1, nil, "t1", instance.parameters.Type == "Bid", "close"); end local started = false; local rate; local buy_sell = "B"; local limit_rate; local stop_rate; local trailing; local CreatedOrders = {} function ExtUpdate(id, source, period) -- The method called every time when a new bid or ask price appears. if not(checkReady("trades")) or not(checkReady("orders")) then return ; end local currentRate = TickSource[NOW]; local msg = CreateOrder(currentRate + 7 * PointSize) ; end function checkReady(table) return core.host:execute("isTableFilled", table); end function CreateOrder(rate) local valuemap, success, msg; valuemap = core.valuemap(); valuemap.Command = "CreateOrder"; if Side == "B" then if instance.ask[NOW] > rate then valuemap.OrderType = "LE"; else valuemap.OrderType = "SE"; end else if instance.bid[NOW] < rate then valuemap.OrderType = "LE"; else valuemap.OrderType = "SE"; end end valuemap.OfferID = Offer; valuemap.AcctID = Account; valuemap.Quantity = Amount * BaseSize; valuemap.Rate = rate; valuemap.CustomID = CustomID; valuemap.BuySell = "S"; success, msg = terminal:execute(200, valuemap); if not(success) then terminal:alertMessage(instance.bid:instrument(), instance.bid[instance.bid:size() - 1], " Open order failed " .. msg, instance.bid:date(instance.bid:size() - 1)); return false; end CreatedOrders[msg] = valuemap; return msg; end function findOrderIDByRequestID(requestID) local enum, row; local found = false; enum = core.host:findTable("orders"):enumerator(); row = enum:next(); while (not found) and (row ~= nil) do if row.RequestID == requestID then found = true; break; end row = enum:next(); end return found; end function ExtAsyncOperationFinished(cookie, success, message) if cookie == 200 then if not success then terminal:alertMessage(instance.bid:instrument(), instance.bid[instance.bid:size() - 1], "Open order failed" .. message, instance.bid:date(instance.bid:size() - 1)); end for k, v in pairs(CreatedOrders) do if findOrderIDByRequestID(k) == true then CreatedOrders[k] = nil else success, msg = terminal:execute(200, v); end end end end dofile(core.app_path() .. "\\strategies\\standard\\include\\helper.lua");