Login Page - Create Account

Support Board


Date/Time: Thu, 12 Jun 2025 08:56:15 +0000



Post From: Custom study does not calculate properly during chart reload

[2022-11-11 01:07:53]
dwfleener - Posts: 8
I created a custom study that was working fine one moment and I didn't change anything and now it won't work properly. Now it seems when the chart is first loaded or recalculated (INSERT key) it doesn't invoke my custom study during recalculation but only fires it after it has been loaded so the custom Xs are mostly skipped and not drawn (only the new real-time candles has the potential for it to draw an X above or below a candle hence only after it does a full recalculation during chart loading). What can cause this? Here is the code for the custom study. It is based on Rob Hoffman's Inventory Retracement Bar (IRB) concept. I added the line "sc.AddMessageToLog("[!]", true);" to see that it isn't firing my custom study during chart reload.

SCSFExport scsf_IRB(SCStudyInterfaceRef sc) {

SCInputRef enabledInput = sc.Input[0];
SCInputRef retracementInput = sc.Input[1];
//SCInputRef enableRegimeInput = sc.Input[2];
SCInputRef regimeStudyInput = sc.Input[3];

SCSubgraphRef irbSubgraph = sc.Subgraph[0];
SCSubgraphRef revIrbSubgraph = sc.Subgraph[1];

if (sc.SetDefaults) {
sc.GraphName = "IRB";
sc.StudyDescription = "...";

sc.AutoLoop = false;

sc.FreeDLL = false;

sc.GraphRegion = 0;

enabledInput.Name = "Enabled";
enabledInput.SetYesNo(YES);

retracementInput.Name = "Retracement [in %]";
retracementInput.SetInt(45);
retracementInput.SetIntLimits(0, 100);

//enableRegimeInput.Name = "Enable Regime";
//enableRegimeInput.SetYesNo(YES);

regimeStudyInput.Name = "Regime Study";
regimeStudyInput.SetChartStudySubgraphValues(1, 1, 0);

irbSubgraph.Name = "IRB+";
irbSubgraph.PrimaryColor = RGB(255, 255, 255);
irbSubgraph.DrawStyle = DRAWSTYLE_X;

revIrbSubgraph.Name = "IRB-";
revIrbSubgraph.PrimaryColor = RGB(255, 255, 255);
revIrbSubgraph.DrawStyle = DRAWSTYLE_X;

return;
}

// at least this point on does not get invoked during chart recalculation

if (enabledInput.GetYesNo() == false)
return;

sc.AddMessageToLog("[!]", true); // this line was added to debug why it isn't firing my custom study during chart reload

auto const currentIndex = sc.Index; // [!] is it safe to have this const?

auto const currentOpen = sc.BaseDataIn[SC_OPEN][currentIndex];
auto const currentHigh = sc.BaseDataIn[SC_HIGH][currentIndex];
auto const currentLow = sc.BaseDataIn[SC_LOW][currentIndex];
auto const currentClose = sc.BaseDataIn[SC_LAST][currentIndex];

auto const currentOpenInTicks = sc.PriceValueToTicks(currentOpen);
auto const currentHighInTicks = sc.PriceValueToTicks(currentHigh);
auto const currentLowInTicks = sc.PriceValueToTicks(currentLow);
auto const currentCloseInTicks = sc.PriceValueToTicks(currentClose);

SCGraphData regimeStudyData;
sc.GetStudyArraysFromChartUsingID(regimeStudyInput.GetChartNumber(), regimeStudyInput.GetStudyID(), regimeStudyData);

SCFloatArrayRef regimeStudySubgraphArray = regimeStudyData[0];

if (regimeStudySubgraphArray.GetArraySize() == 0)
return;

auto refChartIndex = sc.GetNearestMatchForDateTimeIndex(regimeStudyInput.GetChartNumber(), currentIndex);
auto nearestRegimeSubgraphValue = regimeStudySubgraphArray[refChartIndex];

int64_t candleRangeInTicks = abs((int)currentHighInTicks - (int)currentLowInTicks);

auto c = retracementInput.GetInt() / 100.0;

auto irb = min(currentCloseInTicks, currentOpenInTicks) > ((candleRangeInTicks * c) + currentLowInTicks);
auto revIrb = max(currentCloseInTicks, currentOpenInTicks) < currentHighInTicks - (candleRangeInTicks * c);

if (irb && currentCloseInTicks > sc.PriceValueToTicks(nearestRegimeSubgraphValue)) {
irbSubgraph[currentIndex] = sc.TicksToPriceValue(currentLowInTicks);

return;
}

if (revIrb && currentCloseInTicks > sc.PriceValueToTicks(nearestRegimeSubgraphValue)) {
irbSubgraph[currentIndex] = sc.TicksToPriceValue(currentLowInTicks);

return;
}

if (irb && currentCloseInTicks < sc.PriceValueToTicks(nearestRegimeSubgraphValue)) {
revIrbSubgraph[currentIndex] = sc.TicksToPriceValue(currentHighInTicks);

return;
}

if (revIrb && currentCloseInTicks < sc.PriceValueToTicks(nearestRegimeSubgraphValue)) {
revIrbSubgraph[currentIndex] = sc.TicksToPriceValue(currentHighInTicks);

return;
}
}

Any help to resolve this odd behavior will be greatly appreciated.
Date Time Of Last Edit: 2022-11-11 01:16:44