Login Page - Create Account

Support Board


Date/Time: Fri, 26 Apr 2024 19:59:41 +0000



Post From: Stochastic Momentum source code

[2022-10-02 17:52:36]
Ackin - Posts: 1865

SCSFExport scsf_StochasticMomentumIndicator(SCStudyInterfaceRef sc)
{
  SCSubgraphRef Subgraph_SMI = sc.Subgraph[0];
  SCSubgraphRef Subgraph_AvgSMI = sc.Subgraph[1];
  SCSubgraphRef Subgraph_Overbought = sc.Subgraph[2];
  SCSubgraphRef Subgraph_Oversold = sc.Subgraph[3];

  SCInputRef Input_OverboughtInput = sc.Input[0];
  SCInputRef Input_OversoldInput = sc.Input[1];
  SCInputRef Input_PercentDLength = sc.Input[2];
  SCInputRef Input_PercentKLength = sc.Input[3];
  SCInputRef Input_ExpMovAvgLength = sc.Input[4];

  if (sc.SetDefaults)
  {
    sc.GraphName = "Stochastic Momentum Indicator";
    sc.StudyDescription = "Stochastic Momentum Indicator";

    
    sc.GraphRegion = 1;
    sc.AutoLoop = 1;

    Subgraph_SMI.Name = "SMI";
    Subgraph_SMI.DrawStyle = DRAWSTYLE_LINE;
    Subgraph_SMI.PrimaryColor = RGB(0,255,0);
    Subgraph_SMI.DrawZeros = false;

    Subgraph_AvgSMI.Name = "SMI Average";
    Subgraph_AvgSMI.DrawStyle = DRAWSTYLE_LINE;
    Subgraph_AvgSMI.PrimaryColor = RGB(255,0,255);
    Subgraph_AvgSMI.DrawZeros = false;

    Subgraph_Overbought.Name = "Overbought";
    Subgraph_Overbought.DrawStyle = DRAWSTYLE_LINE;
    Subgraph_Overbought.PrimaryColor = RGB(255,255,0);
    Subgraph_Overbought.DrawZeros = false;

    Subgraph_Oversold.Name = "Oversold";
    Subgraph_Oversold.DrawStyle = DRAWSTYLE_LINE;
    Subgraph_Oversold.PrimaryColor = RGB(255,127,0);
    Subgraph_Oversold.DrawZeros = false;

    Input_OverboughtInput.Name = "Overbought Value";
    Input_OverboughtInput.SetFloat(40.0f);

    Input_OversoldInput.Name = "Oversold Value";
    Input_OversoldInput.SetFloat(-40.0f);

    Input_PercentDLength.Name = "%D Length";
    Input_PercentDLength.SetInt(3);

    Input_PercentKLength.Name = "%K Length";
    Input_PercentKLength.SetInt(5);

    Input_ExpMovAvgLength.Name = "EMA Length";
    Input_ExpMovAvgLength.SetInt(3);

    return;
  }


  sc.DataStartIndex = max(Input_PercentKLength.GetInt(), Input_PercentDLength.GetInt());

  if (sc.Index < sc.DataStartIndex)
    return;

  SCFloatArrayRef TempLowest = Subgraph_SMI.Arrays[0];
  SCFloatArrayRef TempHighest = Subgraph_SMI.Arrays[1];
  SCFloatArrayRef TempRelDiff = Subgraph_SMI.Arrays[2];
  SCFloatArrayRef TempDiff = Subgraph_SMI.Arrays[3];
  SCFloatArrayRef TempAvgRelMA = Subgraph_SMI.Arrays[4];
  SCFloatArrayRef TempAvgRel = Subgraph_SMI.Arrays[5];
  SCFloatArrayRef TempAvgDiffMA = Subgraph_SMI.Arrays[6];
  SCFloatArrayRef TempAvgDiff = Subgraph_SMI.Arrays[7];

  sc.Lowest(sc.Low, TempLowest, Input_PercentKLength.GetInt());
  sc.Highest(sc.High, TempHighest, Input_PercentKLength.GetInt());

  TempRelDiff[sc.Index] = sc.Close[sc.Index] - (TempHighest[sc.Index] + TempLowest[sc.Index]) / 2.0f;
  TempDiff[sc.Index] = TempHighest[sc.Index] - TempLowest[sc.Index];

  sc.ExponentialMovAvg(TempRelDiff, TempAvgRelMA, Input_PercentDLength.GetInt());
  sc.ExponentialMovAvg(TempAvgRelMA, TempAvgRel, Input_PercentDLength.GetInt());
  sc.ExponentialMovAvg(TempDiff, TempAvgDiffMA, Input_PercentDLength.GetInt());
  sc.ExponentialMovAvg(TempAvgDiffMA, TempAvgDiff, Input_PercentDLength.GetInt());

  if (TempAvgDiff[sc.Index] != 0.0f)
    Subgraph_SMI[sc.Index] = TempAvgRel[sc.Index] / (TempAvgDiff[sc.Index] / 2.0f) * 100.0f;
  else
    Subgraph_SMI[sc.Index] = 0.0f;

  sc.ExponentialMovAvg(Subgraph_SMI, Subgraph_AvgSMI, Input_ExpMovAvgLength.GetInt());

  Subgraph_Overbought[sc.Index] = Input_OverboughtInput.GetFloat();
  Subgraph_Oversold[sc.Index] = Input_OversoldInput.GetFloat();
}