-- Id: 5081 -- Strategy profile initialization routine -- Defines Strategy profile properties and Strategy parameters function Init() strategy:name("NBarsInARow"); strategy:setTag("NonOptimizableParameters", "Email,SendEmail,SoundFile,RecurrentSound,PlaySound,ShowAlert"); strategy:description("NBarsInARow"); strategy.parameters:addGroup("Price Parameters"); strategy.parameters:addString("TF", "TF", "Time frame ('t1', 'm1', 'm5', etc.)", "m1"); strategy.parameters:setFlag("TF", core.FLAG_PERIODS); strategy.parameters:addString("Type", "Price type", "", "Bid"); strategy.parameters:addStringAlternative("Type", "Bid", "", "Bid"); strategy.parameters:addStringAlternative("Type", "Ask", "", "Ask"); strategy.parameters:addGroup("Parameters"); strategy.parameters:addInteger("N", "N", "", 3, 1, 100); strategy.parameters:addGroup("Notification"); strategy.parameters:addBoolean("ShowAlert", "Show Alert", "", true); strategy.parameters:addBoolean("PlaySound", "Play Sound", "", false); strategy.parameters:addBoolean("RecurSound", "Recurrent Sound", "", false); strategy.parameters:addString("SoundFile", "Sound File", "", ""); strategy.parameters:setFlag("SoundFile", core.FLAG_SOUND); strategy.parameters:addBoolean("SendEmail", "Send Email", "", false); strategy.parameters:addString("Email", "Email", "", ""); strategy.parameters:setFlag("Email", core.FLAG_EMAIL); end -- Parameters block local PlaySound; local RecurrentSound; local SoundFile; local Email; local SendEmail; local N -- strategy instance initialization routine -- Processes strategy parameters and subscribe to price streams -- TODO: Calculate all constants, create instances all necessary indicators and load all required libraries function Prepare(nameOnly) N = instance.parameters.N local name = profile:id() .. "(" .. instance.bid:instrument() .. "," .. N .. ")"; instance:name(name); if nameOnly then return ; end ShowAlert = instance.parameters.ShowAlert; PlaySound = instance.parameters.PlaySound; if PlaySound then RecurrentSound = instance.parameters.RecurSound; SoundFile = instance.parameters.SoundFile; else SoundFile = nil; end assert(not(PlaySound) or (PlaySound and SoundFile ~= ""), "Sound file must be specified"); SendEmail = instance.parameters.SendEmail; if SendEmail then Email = instance.parameters.Email; else Email = nil; end assert(not(SendEmail) or (SendEmail and Email ~= ""), "E-mail address must be specified"); gSource = ExtSubscribe(1, nil, instance.parameters.TF, instance.parameters.Type == "Bid", "bar"); ExtSetupSignal(profile:id() .. ":", ShowAlert); ExtSetupSignalMail(name); end -- strategy calculation routine -- TODO: Add your code for decision making -- TODO: Update the instance of your indicator(s) if needed function ExtUpdate(id, source, period) if period >= source:first() + N then local pos, neg = true, true for i = 0, N - 1 do if source.open[period - i] < source.close[period - i] then neg = false end if source.open[period - i] > source.close[period - i] then pos = false end end if pos then ExtSignal(source, period, tostring(N) .. " positive bars in a row", SoundFile, Email, RecurrentSound); end if neg then ExtSignal(source, period, tostring(N) .. " negative bars in a row", SoundFile, Email, RecurrentSound); end end end dofile(core.app_path() .. "\\strategies\\standard\\include\\helper.lua");