Here is an example of the Awesome Oscillator as it is described at
Awesome Oscillator — Technical Indicators, Technical Analysis
How to install:
1) Create the file AO.lua
2) Copy the code below into this file
3) Save the file
or
1,2,3) Just right-click on
this link and choose "Save As..." from the menu.
4) Go to "Charts/Chart/Manage Custom Indicators" menu of the Trading Station
5) Click "Load"
6) Choose the AO.lua file create at the previous steps
or
Code:
function Init()
indicator:name("Awesome Oscillator");
indicator:description("No description");
indicator:requiredSource(core.Bar);
indicator:type(core.Oscillator);
indicator.parameters:addInteger("FM", "Fast Moving Average", "The number of periods to calculate the fast moving average of the median price", 5, 2, 10000);
indicator.parameters:addInteger("SM", "Slow Moving Average", "The number of periods to calculate the slow moving average of the median price", 35, 2, 10000);
indicator.parameters:addColor("CL_color", "Color for covering line", "Color for covering line", core.rgb(255, 255, 255));
indicator.parameters:addColor("GO_color", "Color for higher bars", "Color for higher bars", core.rgb(0, 255, 0));
indicator.parameters:addColor("RO_color", "Color for lower bars", "Color for lower bars", core.rgb(255, 0, 0));
end
local FM;
local SM;
local first;
local source = nil;
-- Streams block
local CL = nil;
local GO = nil;
local RO = nil;
local MEDIAN = nil;
local FMVA = nil;
local SMVA = nil;
function Prepare()
FM = instance.parameters.FM;
SM = instance.parameters.SM;
assert(FM < SM, "Fast moving average parameter must be less than slow moving average");
source = instance.source;
first = source:first() + SM;
-- Create the median stream
MEDIAN = instance:addInternalStream(0, 0);
FMVA = core.indicators:create("MVA", MEDIAN, FM);
SMVA = core.indicators:create("MVA", MEDIAN, SM);
local name = profile:id() .. "(" .. source:name() .. ", " .. FM .. ", " .. SM .. ")";
instance:name(name);
CL = instance:addStream("AO", core.Line, name .. ".AO", "AO", instance.parameters.CL_color, first);
CL:addLevel(0);
GO = instance:addStream("GO", core.Bar, name .. ".GO", "GO", instance.parameters.GO_color, first);
RO = instance:addStream("RO", core.Bar, name .. ".RO", "RO", instance.parameters.RO_color, first);
end
function Update(period, mode)
MEDIAN[period] = (source.high[period] + source.low[period]) / 2;
FMVA:update(mode);
SMVA:update(mode);
if (period >= first) then
CL[period] = FMVA.DATA[period] - SMVA.DATA[period];
end
if (period >= first + 1) then
if (CL[period] > CL[period - 1]) then
GO[period] = CL[period];
else
RO[period] = CL[period];
end
end
end