Re: SAR Signal [Upd Oct, 18]
Posted: Sun Nov 07, 2010 7:28 pm
Yes, it can be done. Please give me a couple of days to finish all urgent things and I'll do it.
Your last stop on a way to find a fast growing community of forex traders and software developers. Best forex charts indicators are available here for download. Custom development of indicators and translation to .LUA is also available on request.
http://fxcodebase.com/code/
fxjunkie wrote:Awesome indicator. I've been bugging fxcm for months to get this one. So they can thank you for making this so I get off their back. lol. One request, any chance of getting it to work on the change of the sar instead of the close of the bar? I trade mostly on 5 or 15 min chart and find sometimes by the close of the bar I miss opportunities. Just a suggestion, either way I love the indicator, ty
function ExtUpdate(id, source, period)
if id == 1 then
SAR:update(core.UpdateLast);
if period >= SAR.DATA:first() + 1 then
local message = nil;
if not(SAR.DN:hasData(period - 1)) and SAR.DN:hasData(period) then
message = "SAR switched down";
elseif not(SAR.UP:hasData(period - 1)) and SAR.UP:hasData(period) then
message = "SAR switched up";
end
Apprentice wrote:Can you post the entire code for this strategy.
-- Indicator profile initialization routine
-- Defines indicator profile properties and indicator parameters
function Init()
strategy:name("Simple SAR signal");
strategy:description("Signals when SAR changes the direction");
strategy.parameters:addGroup("SAR parameters");
strategy.parameters:addDouble("Step", "Step", "", 0.02, 0.001, 1);
strategy.parameters:addDouble("Max", "Max", "", 0.2, 0.001, 10);
strategy.parameters:addGroup("Price parameters");
strategy.parameters:addString("Period", "Time frame", "", "m1");
strategy.parameters:setFlag("Period", core.FLAG_PERIODS);
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
-- Indicator instance initialization routine
-- Processes indicator parameters and creates output streams
-- Parameters block
local SAR;
local gSource;
local SoundFile;
local RecurrentSound;
local Email;
local ShowAlert;
local name;
-- Routine
function Prepare(onlyName)
local Step;
local Max;
local ExplosionPower;
Step = instance.parameters.Step;
Max = instance.parameters.Max;
ShowAlert = instance.parameters.ShowAlert;
if instance.parameters.PlaySound then
SoundFile = instance.parameters.SoundFile;
else
SoundFile = nil;
end
assert(not(PlaySound) or (PlaySound and SoundFile ~= ""), "Sound file must be specified");
RecurrentSound = instance.parameters.Recurrent;
local SendEmail = instance.parameters.SendEmail;
if SendEmail then
Email = instance.parameters.Email;
else
Email = nil;
end
assert(not(SendEmail) or (SendEmail and Email ~= ""), "Email address must be specified");
name = profile:id() .. "(" .. instance.bid:instrument() .. "," .. Step .. "," .. Max .. ")";
instance:name(name);
if onlyName then
return ;
end
assert(instance.parameters.Period ~= "t1", "Can't be applied on ticks!");
gSource = ExtSubscribe(1, nil, instance.parameters.Period, true, "bar");
SAR = core.indicators:create("SAR", gSource, Step, Max);
end
function ExtUpdate(id, source, period)
if id == 1 then
SAR:update(core.UpdateLast);
if period >= SAR.DATA:first() + 1 then
local message = nil;
if not(SAR.DN:hasData(period - 1)) and SAR.DN:hasData(period) then
message = "SAR switched down";
elseif not(SAR.UP:hasData(period - 1)) and SAR.UP:hasData(period) then
message = "SAR switched up";
end
if message ~= nil then
if ShowAlert then
terminal:alertMessage(instance.bid:instrument(), instance.bid[NOW], message, instance.bid:date(NOW));
end
if SoundFile ~= nil then
terminal:alertSound(SoundFile, RecurrentSound);
end
if Email ~= nil then
terminal:alertEmail(Email, name, name .. "(" .. core.formatDate(instance.bid:date(NOW)) .. ") : " .. message);
end
end
end
end
end
dofile(core.app_path() .. "\\strategies\\standard\\include\\helper.lua");
-- Indicator profile initialization routine
-- Defines indicator profile properties and indicator parameters
function Init()
strategy:name("Simple SAR signal");
strategy:description("Signals when SAR changes the direction");
strategy.parameters:addGroup("SAR parameters");
strategy.parameters:addDouble("Step", "Step", "", 0.02, 0.001, 1);
strategy.parameters:addDouble("Max", "Max", "", 0.2, 0.001, 10);
strategy.parameters:addGroup("Price parameters");
strategy.parameters:addString("Period", "Time frame", "", "m1");
strategy.parameters:setFlag("Period", core.FLAG_PERIODS);
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
-- Indicator instance initialization routine
-- Processes indicator parameters and creates output streams
-- Parameters block
local SAR;
local gSource;
local SoundFile;
local RecurrentSound;
local Email;
local ShowAlert;
local name;
-- Routine
function Prepare(onlyName)
local Step;
local Max;
local ExplosionPower;
Step = instance.parameters.Step;
Max = instance.parameters.Max;
ShowAlert = instance.parameters.ShowAlert;
if instance.parameters.PlaySound then
SoundFile = instance.parameters.SoundFile;
else
SoundFile = nil;
end
assert(not(PlaySound) or (PlaySound and SoundFile ~= ""), "Sound file must be specified");
RecurrentSound = instance.parameters.Recurrent;
local SendEmail = instance.parameters.SendEmail;
if SendEmail then
Email = instance.parameters.Email;
else
Email = nil;
end
assert(not(SendEmail) or (SendEmail and Email ~= ""), "Email address must be specified");
name = profile:id() .. "(" .. instance.bid:instrument() .. "," .. Step .. "," .. Max .. ")";
instance:name(name);
if onlyName then
return ;
end
assert(instance.parameters.Period ~= "t1", "Can't be applied on ticks!");
gSource = ExtSubscribe(1, nil, instance.parameters.Period, true, "bar");
SAR = core.indicators:create("SAR", gSource, Step, Max);
end
function ExtUpdate(id, source, period)
if id == 1 then
SAR:update(core.UpdateLast);
if period >= SAR.DATA:first() + 1 then
local message = nil;
if (SAR.DN:hasData(period)) and (SAR.UP:hasData(period)) then
message = "SAR switched";
end
if message ~= nil then
if ShowAlert then
terminal:alertMessage(instance.bid:instrument(), instance.bid[NOW], message, instance.bid:date(NOW));
end
if SoundFile ~= nil then
terminal:alertSound(SoundFile, RecurrentSound);
end
if Email ~= nil then
terminal:alertEmail(Email, name, name .. "(" .. core.formatDate(instance.bid:date(NOW)) .. ") : " .. message);
end
end
end
end
end
dofile(core.app_path() .. "\\strategies\\standard\\include\\helper.lua");