Support Board
Date/Time: Wed, 12 Feb 2025 09:50:40 +0000
Post From: ACSIL function for sorting values?
[2020-10-09 05:52:06] |
Ackin - Posts: 1865 |
Sierrachart example SCSFExport scsf_StochasticPercentile(SCStudyInterfaceRef sc) { SCSubgraphRef Subgraph_Stochastic = sc.Subgraph[0]; SCSubgraphRef Subgraph_StochasticAverage = sc.Subgraph[1]; SCSubgraphRef Subgraph_Line1 = sc.Subgraph[2]; SCSubgraphRef Subgraph_Line2 = sc.Subgraph[3]; SCInputRef Input_Data = sc.Input[0]; SCInputRef Input_StochasticLength = sc.Input[1]; SCInputRef Input_MovingAverageLength = sc.Input[2]; SCInputRef Input_Line1Value = sc.Input[3]; SCInputRef Input_Line2Value = sc.Input[4]; if (sc.SetDefaults) { sc.GraphName = "Stochastic - Percentile"; sc.ValueFormat = 2; Subgraph_Stochastic.Name = "Stochastic%"; Subgraph_Stochastic.DrawStyle = DRAWSTYLE_LINE; Subgraph_Stochastic.PrimaryColor = RGB(0,255,0); Subgraph_Stochastic.DrawZeros = true; Subgraph_StochasticAverage.Name = "Average"; Subgraph_StochasticAverage.DrawStyle = DRAWSTYLE_LINE; Subgraph_StochasticAverage.PrimaryColor = RGB(255, 127, 0); Subgraph_StochasticAverage.DrawZeros = true; Subgraph_Line1.Name = "Line1"; Subgraph_Line1.DrawStyle = DRAWSTYLE_LINE; Subgraph_Line1.PrimaryColor = RGB(255, 255, 0); Subgraph_Line1.DrawZeros = true; Subgraph_Line2.Name = "Line2"; Subgraph_Line2.DrawStyle = DRAWSTYLE_LINE; Subgraph_Line2.PrimaryColor = RGB(0, 0, 255); Subgraph_Line2.DrawZeros = true; Input_Data.Name = "Input Data"; Input_Data.SetInputDataIndex(SC_LAST); Input_StochasticLength.Name = "Length"; Input_StochasticLength.SetInt(10); Input_StochasticLength.SetIntLimits(1,MAX_STUDY_LENGTH); Input_MovingAverageLength.Name = "Moving Average Length"; Input_MovingAverageLength.SetInt(10); Input_MovingAverageLength.SetIntLimits(1, MAX_STUDY_LENGTH); Input_Line1Value.Name = "Line 1 Value"; Input_Line1Value.SetFloat(20); Input_Line2Value.Name = "Line 2 Value"; Input_Line2Value.SetFloat(80); sc.AutoLoop = false; return; } std::vector<float> AscendingValues; SCFloatArrayRef DataArray = sc.BaseData[Input_Data.GetInputDataIndex()]; sc.DataStartIndex = Input_StochasticLength.GetInt() - 1; for (int CurrentIndex = sc.UpdateStartIndex; CurrentIndex < sc.ArraySize; CurrentIndex++) { AscendingValues.clear(); int FirstIndex = CurrentIndex - Input_StochasticLength.GetInt() + 1; for (int BarIndex = FirstIndex; BarIndex <= CurrentIndex; BarIndex++) { AscendingValues.push_back(DataArray[BarIndex]); } std::sort(AscendingValues.begin(), AscendingValues.end()); float CurrentPrice = DataArray[CurrentIndex]; int AscendingValuesSize = static_cast<int>(AscendingValues.size()); int AscendingValuesIndex = 0; for(; AscendingValuesIndex < AscendingValuesSize; AscendingValuesIndex++) { if (CurrentPrice == AscendingValues[AscendingValuesIndex]) break; if (AscendingValuesIndex == AscendingValuesSize - 1) break; } Subgraph_Stochastic[CurrentIndex] = 100.0f*AscendingValuesIndex/(Input_StochasticLength.GetInt() - 1); sc.SimpleMovAvg(Subgraph_Stochastic, Subgraph_StochasticAverage, CurrentIndex, Input_MovingAverageLength.GetInt()); Subgraph_Line1[CurrentIndex] = Input_Line1Value.GetFloat(); Subgraph_Line2[CurrentIndex] = Input_Line2Value.GetFloat(); } return; } |