-- More information about this indicator can be found at: -- http://fxcodebase.com/code/viewtopic.php?f=27&t=19630 --+------------------------------------------------------------------------------------------------+ --| Copyright © 2021, Gehtsoft USA LLC | --| http://fxcodebase.com | --+------------------------------------------------------------------------------------------------+ --| Support our efforts by donating | --| Paypal: https://goo.gl/9Rj74e | --+------------------------------------------------------------------------------------------------+ --| Developed by : Mario Jemic | --| mario.jemic@gmail.com | --| https://AppliedMachineLearning.systems | --| Patreon : https://goo.gl/GdXWeN | --+------------------------------------------------------------------------------------------------+ --+------------------------------------------------------------------------------------------------+ --|BitCoin Address : 15VCJTLaz12Amr7adHSBtL9v8XomURo9RF | --|Ethereum Address : 0x8C110cD61538fb6d7A2B47858F0c0AaBd663068D | --|Cardano/ADA : addr1v868jza77crzdc87khzpppecmhmrg224qyumud6utqf6f4s99fvqv | --|Dogecoin Address : DNDTFfmVa2Gjts5YvSKEYaiih6cums2L6C | --|Binance(ERC20 & BSC only) : 0xe84751063de8ade7c5fbff5e73f6502f02af4e2c | | --+------------------------------------------------------------------------------------------------+ function Init() strategy:name("MA strategy") strategy:description("MA strategy") strategy.parameters:addGroup("Parameters") strategy.parameters:addInteger("Period1", "Period of MA1", "", 100) strategy.parameters:addString("Method1", "Method of MA1", "", "MVA") strategy.parameters:addStringAlternative("Method1", "MVA", "", "MVA") strategy.parameters:addStringAlternative("Method1", "EMA", "", "EMA") strategy.parameters:addStringAlternative("Method1", "KAMA", "", "KAMA") strategy.parameters:addStringAlternative("Method1", "Wilder", "", "Wilder") strategy.parameters:addStringAlternative("Method1", "LWMA", "", "LWMA") strategy.parameters:addStringAlternative("Method1", "SineWMA", "", "SineWMA") strategy.parameters:addStringAlternative("Method1", "TriMA", "", "TriMA") strategy.parameters:addStringAlternative("Method1", "LSMA", "", "LSMA") strategy.parameters:addStringAlternative("Method1", "SMMA", "", "SMMA") strategy.parameters:addStringAlternative("Method1", "HMA", "", "HMA") strategy.parameters:addStringAlternative("Method1", "ZeroLagEMA", "", "ZeroLagEMA") strategy.parameters:addStringAlternative("Method1", "DEMA", "", "DEMA") strategy.parameters:addStringAlternative("Method1", "T3", "", "T3") strategy.parameters:addStringAlternative("Method1", "ITrend", "", "ITrend") strategy.parameters:addStringAlternative("Method1", "Median", "", "Median") strategy.parameters:addStringAlternative("Method1", "GeoMean", "", "GeoMean") strategy.parameters:addStringAlternative("Method1", "REMA", "", "REMA") strategy.parameters:addStringAlternative("Method1", "ILRS", "", "ILRS") strategy.parameters:addStringAlternative("Method1", "IE/2", "", "IE/2") strategy.parameters:addStringAlternative("Method1", "TriMAgen", "", "TriMAgen") strategy.parameters:addStringAlternative("Method1", "JSmooth", "", "JSmooth") strategy.parameters:addString("Price1", "Price of MA1", "", "close") strategy.parameters:addStringAlternative("Price1", "close", "", "close") strategy.parameters:addStringAlternative("Price1", "open", "", "open") strategy.parameters:addStringAlternative("Price1", "high", "", "high") strategy.parameters:addStringAlternative("Price1", "low", "", "low") strategy.parameters:addStringAlternative("Price1", "median", "", "median") strategy.parameters:addStringAlternative("Price1", "typical", "", "typical") strategy.parameters:addStringAlternative("Price1", "weighted", "", "weighted") strategy.parameters:addInteger("Period2", "Period of MA2", "", 30) strategy.parameters:addString("Method2", "Method of MA2", "", "MVA") strategy.parameters:addStringAlternative("Method2", "MVA", "", "MVA") strategy.parameters:addStringAlternative("Method2", "EMA", "", "EMA") strategy.parameters:addStringAlternative("Method2", "KAMA", "", "KAMA") strategy.parameters:addStringAlternative("Method2", "Wilder", "", "Wilder") strategy.parameters:addStringAlternative("Method2", "LWMA", "", "LWMA") strategy.parameters:addStringAlternative("Method2", "SineWMA", "", "SineWMA") strategy.parameters:addStringAlternative("Method2", "TriMA", "", "TriMA") strategy.parameters:addStringAlternative("Method2", "LSMA", "", "LSMA") strategy.parameters:addStringAlternative("Method2", "SMMA", "", "SMMA") strategy.parameters:addStringAlternative("Method2", "HMA", "", "HMA") strategy.parameters:addStringAlternative("Method2", "ZeroLagEMA", "", "ZeroLagEMA") strategy.parameters:addStringAlternative("Method2", "DEMA", "", "DEMA") strategy.parameters:addStringAlternative("Method2", "T3", "", "T3") strategy.parameters:addStringAlternative("Method2", "ITrend", "", "ITrend") strategy.parameters:addStringAlternative("Method2", "Median", "", "Median") strategy.parameters:addStringAlternative("Method2", "GeoMean", "", "GeoMean") strategy.parameters:addStringAlternative("Method2", "REMA", "", "REMA") strategy.parameters:addStringAlternative("Method2", "ILRS", "", "ILRS") strategy.parameters:addStringAlternative("Method2", "IE/2", "", "IE/2") strategy.parameters:addStringAlternative("Method2", "TriMAgen", "", "TriMAgen") strategy.parameters:addStringAlternative("Method2", "JSmooth", "", "JSmooth") strategy.parameters:addString("Price2", "Price of MA2", "", "close") strategy.parameters:addStringAlternative("Price2", "close", "", "close") strategy.parameters:addStringAlternative("Price2", "open", "", "open") strategy.parameters:addStringAlternative("Price2", "high", "", "high") strategy.parameters:addStringAlternative("Price2", "low", "", "low") strategy.parameters:addStringAlternative("Price2", "median", "", "median") strategy.parameters:addStringAlternative("Price2", "typical", "", "typical") strategy.parameters:addStringAlternative("Price2", "weighted", "", "weighted") strategy.parameters:addGroup("Strategy Parameters") strategy.parameters:addString("TypeSignal", "Type of signal", "", "direct") strategy.parameters:addStringAlternative("TypeSignal", "direct", "", "direct") strategy.parameters:addStringAlternative("TypeSignal", "reverse", "", "reverse") strategy.parameters:addGroup("Price Parameters") strategy.parameters:addString("TF", "Time Frame", "", "m15") strategy.parameters:setFlag("TF", core.FLAG_PERIODS) strategy.parameters:addGroup("Trading Parameters") strategy.parameters:addBoolean("AllowTrade", "Allow strategy to trade", "", false) strategy.parameters:addString("Account", "Account to trade on", "", "") strategy.parameters:setFlag("Account", core.FLAG_ACCOUNT) strategy.parameters:addInteger("Amount", "Trade Amount in Lots", "", 1, 1, 100) strategy.parameters:addBoolean("SetLimit", "Set Limit Orders", "", false) strategy.parameters:addInteger("Limit", "Limit Order in pips", "", 30, 1, 10000) strategy.parameters:addBoolean("SetStop", "Set Stop Orders", "", false) strategy.parameters:addInteger("Stop", "Stop Order in pips", "", 30, 1, 10000) strategy.parameters:addBoolean("TrailingStop", "Trailing stop order", "", false) strategy.parameters:addString("AllowDirection", "Allow direction for positions", "", "Both") strategy.parameters:addStringAlternative("AllowDirection", "Both", "", "Both") strategy.parameters:addStringAlternative("AllowDirection", "Long", "", "Long") strategy.parameters:addStringAlternative("AllowDirection", "Short", "", "Short") strategy.parameters:addGroup("Signal Parameters") strategy.parameters:addBoolean("ShowAlert", "Show Alert", "", true) strategy.parameters:addBoolean("PlaySound", "Play Sound", "", false) strategy.parameters:addFile("SoundFile", "Sound File", "", "") strategy.parameters:setFlag("SoundFile", core.FLAG_SOUND) strategy.parameters:addBoolean("Recurrent", "RecurrentSound", "", false) strategy.parameters:addGroup("Email Parameters") strategy.parameters:addBoolean("SendEmail", "Send email", "", false) strategy.parameters:addString("Email", "Email address", "", "") strategy.parameters:setFlag("Email", core.FLAG_EMAIL) end local ShowAlert local SoundFile local RecurrentSound local SendEmail, Email local TMAC = nil local openLevel = 0 local closeLevel = 0 local confirmTrend local AllowTrade = nil local Account = nil local Amount = nil local BaseSize = nil local PipSize local SetLimit = nil local Limit = nil local SetStop = nil local Stop = nil local TrailingStop = nil local CanClose = nil local AllowDirection function Prepare() ShowAlert = instance.parameters.ShowAlert AllowDirection = instance.parameters.AllowDirection local PlaySound = instance.parameters.PlaySound if PlaySound then SoundFile = instance.parameters.SoundFile else SoundFile = nil end assert(not (PlaySound) or SoundFile ~= "", "Sound file must be chosen") RecurrentSound = instance.parameters.Recurrent local SendEmail = instance.parameters.SendEmail if SendEmail then Email = instance.parameters.Email else Email = nil end assert(not (SendEmail) or Email ~= "", "Email address must be specified") assert(instance.parameters.TF ~= "t1", "The time frame must not be tick") local name name = profile:id() .. "(" .. instance.bid:name() .. "." .. instance.parameters.TF .. "," .. ")" instance:name(name) AllowTrade = instance.parameters.AllowTrade if AllowTrade then Account = instance.parameters.Account Amount = instance.parameters.Amount BaseSize = core.host:execute("getTradingProperty", "baseUnitSize", instance.bid:instrument(), Account) Offer = core.host:findTable("offers"):find("Instrument", instance.bid:instrument()).OfferID CanClose = core.host:execute("getTradingProperty", "canCreateMarketClose", instance.bid:instrument(), Account) PipSize = instance.bid:pipSize() SetLimit = instance.parameters.SetLimit Limit = instance.parameters.Limit SetStop = instance.parameters.SetStop Stop = instance.parameters.Stop TrailingStop = instance.parameters.TrailingStop end assert(core.indicators:findIndicator("TWO_MA_CROSS2") ~= nil, "Please, download and install TWO_MA_CROSS2.LUA indicator"); Source = ExtSubscribe(2, nil, instance.parameters.TF, true, "bar") TMAC = core.indicators:create( "TWO_MA_CROSS2", Source, instance.parameters.Period1, instance.parameters.Method1, instance.parameters.Price1, instance.parameters.Period2, instance.parameters.Method2, instance.parameters.Price2 ) ExtSetupSignal(profile:id() .. ":", ShowAlert) ExtSetupSignalMail(name) end function haveTrades(BuySell) local enum = core.host:findTable("trades"):enumerator() local row = enum:next() while (not found) and (row ~= nil) do if row.AccountID == Account and (row.BS == BuySell or BuySell == nil) then return true end row = enum:next() end return false end function ExtUpdate(id, source, period) TMAC:update(core.UpdateLast) if (TMAC.DATA:first() > (period - 1)) then return end local pipSize = instance.bid:pipSize() local trades = core.host:findTable("trades") local MustOpenB = false local MustOpenS = false if TMAC.MA1_Buff[period - 1] > TMAC.MA2_Buff[period - 1] and TMAC.MA1_Buff[period] < TMAC.MA2_Buff[period] then if instance.parameters.TypeSignal == "direct" then MustOpenB = true else MustOpenS = true end end if TMAC.MA1_Buff[period - 1] < TMAC.MA2_Buff[period - 1] and TMAC.MA1_Buff[period] > TMAC.MA2_Buff[period] then if instance.parameters.TypeSignal == "direct" then MustOpenS = true else MustOpenB = true end end if (haveTrades()) then local enum = trades:enumerator() while true do local row = enum:next() if row == nil then break end if row.AccountID == Account and row.OfferID == Offer then if row.BS == "B" then if MustOpenS then if ShowAlert then if instance.parameters.AllowDirection == "Long" then ExtSignal(source, period, "Close BUY", SoundFile, Email, RecurrentSound) else ExtSignal(source, period, "Close BUY and SELL", SoundFile, Email, RecurrentSound) end end if AllowTrade then Close(row) if instance.parameters.AllowDirection ~= "Long" then Open("S") end end end elseif row.BS == "S" then if MustOpenB then if ShowAlert then if instance.parameters.AllowDirection == "Short" then ExtSignal(source, period, "Close SELL", SoundFile, Email, RecurrentSound) else ExtSignal(source, period, "Close SELL and BUY", SoundFile, Email, RecurrentSound) end end if AllowTrade then Close(row) if instance.parameters.AllowDirection ~= "Short" then Open("B") end end end end end end else if MustOpenB == true and instance.parameters.AllowDirection ~= "Short" then if ShowAlert then ExtSignal(source, period, "BUY", SoundFile, Email, RecurrentSound) end if AllowTrade then Open("B") end end if MustOpenS == true and instance.parameters.AllowDirection ~= "Long" then if ShowAlert then ExtSignal(source, period, "SELL", SoundFile, Email, RecurrentSound) end if AllowTrade then Open("S") end end end end function ReleaseInstance() end function Open(side) local valuemap valuemap = core.valuemap() valuemap.OrderType = "OM" valuemap.OfferID = Offer valuemap.AcctID = Account valuemap.Quantity = Amount * BaseSize valuemap.CustomID = CID valuemap.BuySell = side valuemap.QTXT = "1" if SetStop and CanClose then valuemap.PegTypeStop = "O" if side == "B" then valuemap.PegPriceOffsetPipsStop = -Stop else valuemap.PegPriceOffsetPipsStop = Stop end if TrailingStop then valuemap.TrailStepStop = 1 end end if SetLimit and CanClose then valuemap.PegTypeLimit = "O" if side == "B" then valuemap.PegPriceOffsetPipsLimit = Limit else valuemap.PegPriceOffsetPipsLimit = -Limit end end success, msg = terminal:execute(200, valuemap) assert(success, msg) if not (CanClose) then if SetStop then valuemap = core.valuemap() valuemap.OrderType = "SE" valuemap.OfferID = Offer valuemap.AcctID = Account valuemap.NetQtyFlag = "y" if side == "B" then valuemap.BuySell = "S" rate = instance.ask[NOW] - Stop * PipSize valuemap.Rate = rate elseif side == "S" then valuemap.BuySell = "B" rate = instance.bid[NOW] + Stop * PipSize valuemap.Rate = rate end if TrailingStop then valuemap.TrailUpdatePips = 1 end success, msg = terminal:execute(200, valuemap) assert(success, msg) end if SetLimit then valuemap = core.valuemap() valuemap.OrderType = "LE" valuemap.OfferID = Offer valuemap.AcctID = Account valuemap.NetQtyFlag = "y" if side == "B" then valuemap.BuySell = "S" rate = instance.ask[NOW] + Limit * PipSize valuemap.Rate = rate elseif side == "S" then valuemap.BuySell = "B" rate = instance.bid[NOW] - Limit * PipSize valuemap.Rate = rate end success, msg = terminal:execute(200, valuemap) assert(success, msg) end end end function Close(trade) local valuemap valuemap = core.valuemap() if CanClose then valuemap.OrderType = "CM" valuemap.TradeID = trade.TradeID else valuemap.OrderType = "OM" end valuemap.OfferID = trade.OfferID valuemap.AcctID = trade.AccountID valuemap.Quantity = trade.Lot valuemap.CustomID = trade.QTXT if trade.BS == "B" then valuemap.BuySell = "S" else valuemap.BuySell = "B" end success, msg = terminal:execute(200, valuemap) assert(success, msg) end function AsyncOperationFinished(cookie, successful, message) if not successful then core.host:trace("Error: " .. message) end end dofile(core.app_path() .. "\\strategies\\standard\\include\\helper.lua")