I guess I have two questions. First, can anyone help me understand how the starting PSAR dot is calculated? As a visual observation, it seems like the starting PSAR point is a high or low of the last n bars but when I look at the PSAR code I don't seem to see anything that resembles that observation. Second, if I want to shift just the starting PSAR dot up or down, how would I do that? Would that only be possible to code if I shift every dot? I have tried to code this by adding to the high and low within the code, but have had no luck so far, it just ends up to be super messy to the point where it is not even worth it to include here.
I am trying to code a PSAR that will leave a little more room for volatility, hence shifting the starting dot a set amount. I hope that by having a starting point that is higher or lower than a recent high or low that it will allow price to go past a high or low without triggering a reverse signal.
Thanks!
I am trying to code a PSAR that will leave a little more room for volatility, hence shifting the starting dot a set amount. I hope that by having a starting point that is higher or lower than a recent high or low that it will allow price to go past a high or low without triggering a reverse signal.
Thanks!
Code:
#
# TD Ameritrade IP Company, Inc. (c) 2008-2020
#
input accelerationFactor = 0.02;
input accelerationLimit = 0.2;
assert(accelerationFactor > 0, "'acceleration factor' must be positive: " + accelerationFactor);
assert(accelerationLimit >= accelerationFactor, "'acceleration limit' (" + accelerationLimit + ") must be greater than or equal to 'acceleration factor' (" + accelerationFactor + ")");
def state = {default init, long, short};
def extreme;
def SAR;
def acc;
switch (state[1]) {
case init:
state = state.long;
acc = accelerationFactor;
extreme = high;
SAR = low;
case short:
if (SAR[1] < high)
then {
state = state.long;
acc = accelerationFactor;
extreme = high;
SAR = extreme[1];
} else {
state = state.short;
if (low < extreme[1])
then {
acc = min(acc[1] + accelerationFactor, accelerationLimit);
extreme = low;
} else {
acc = acc[1];
extreme = extreme[1];
}
SAR = max(max(high, high[1]), SAR[1] + acc * (extreme - SAR[1]));
}
case long:
if (SAR[1] > low)
then {
state = state.short;
acc = accelerationFactor;
extreme = low;
SAR = extreme[1];
} else {
state = state.long;
if (high > extreme[1])
then {
acc = min(acc[1] + accelerationFactor, accelerationLimit);
extreme = high;
} else {
acc = acc[1];
extreme = extreme[1];
}
SAR = min(min(low, low[1]), SAR[1] + acc * (extreme - SAR[1]));
}
}
plot parSAR = SAR;
parSAR.SetPaintingStrategy(PaintingStrategy.POINTS);
parSAR.SetDefaultColor(GetColor(5));