0

I am new to coding, I have developed a momentum indicator in EasyLanguage for TradeStation (simple one really). and Now I need to translate it to C++ (SierraChart ACSIL), I'm not able to compile it, any help would be really appreciated,.

Here is my trial code:

SCDLLName("TrueMomentum_H")

SCSFExport scsf_TrueMomentum_H(SCStudyInterfaceRef sc)
{
    SCSubgraphRef Subgraph_Main = sc.Subgraph[0];
    SCSubgraphRef Subgraph_Signal = sc.Subgraph[1];
    SCSubgraphRef Subgraph_ZeroLine = sc.Subgraph[2];
    SCSubgraphRef Subgraph_UpperLine = sc.Subgraph[3];
    SCSubgraphRef Subgraph_LowerLine = sc.Subgraph[4];
    SCSubgraphRef Subgraph_Overbought = sc.Subgraph[5];
    SCSubgraphRef Subgraph_Oversold = sc.Subgraph[6];

    SCInputRef Input_Length = sc.Input[0];
    SCInputRef Input_CalcLength = sc.Input[1];
    SCInputRef Input_SmoothLength = sc.Input[2];

    if (sc.SetDefaults)
    {
        sc.GraphName = "#MyTrueMomentum";

        sc.GraphRegion = 0;
        sc.ValueFormat = 2;
        sc.AutoLoop = 1;

        Subgraph_Main.Name = "Main";
        Subgraph_Main.DrawStyle = DRAWSTYLE_LINE;
        Subgraph_Main.PrimaryColor = RGB(0, 255, 0);
        Subgraph_Main.SecondaryColor = RGB(255, 0, 0);
        Subgraph_Main.SecondaryColorUsed = true;
        Subgraph_Main.DrawZeros = false;

        Subgraph_Signal.Name = "Signal";
        Subgraph_Signal.DrawStyle = DRAWSTYLE_LINE;
        Subgraph_Signal.PrimaryColor = RGB(0, 255, 0);
        Subgraph_Signal.SecondaryColor = RGB(255, 0, 0);
        Subgraph_Signal.SecondaryColorUsed = true;
        Subgraph_Signal.DrawZeros = false;

        Subgraph_ZeroLine.Name = "ZeroLine";
        Subgraph_ZeroLine.DrawStyle = DRAWSTYLE_LINE;
        Subgraph_ZeroLine.PrimaryColor = RGB(169, 169, 169);
        Subgraph_ZeroLine.DrawZeros = true;

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

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

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

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

        Input_Length.Name = "Length";
        Input_Length.SetInt(14);
        Input_Length.SetIntLimits(1, MAX_STUDY_LENGTH);

        Input_CalcLength.Name = "Calculation Length";
        Input_CalcLength.SetInt(5);
        Input_CalcLength.SetIntLimits(1, MAX_STUDY_LENGTH);

        Input_SmoothLength.Name = "Smooth Length";
        Input_SmoothLength.SetInt(3);
        Input_SmoothLength.SetIntLimits(1, MAX_STUDY_LENGTH);

        return;
    }

    int len = Input_Length.GetInt();
    SCFloatArrayRef s = sc.Subgraph[7]; // Create an array to store 's' values
    SCFloatArrayRef MA = sc.Subgraph[8]; // Create an array to store 'MA' values
    SCFloatArrayRef Main = sc.Subgraph[9]; // Create an array to store 'Main' values
    SCFloatArrayRef Signal = sc.Subgraph[10]; // Create an array to store 'Signal' values

    s[sc.Index] = 0;
    for (int ss = 0; ss < len; ss++)
    {
        if (sc.Close[sc.Index] > sc.Open[sc.Index - ss])
            s[sc.Index] = s[sc.Index] + 1;
        else if (sc.Close[sc.Index] < sc.Open[sc.Index - ss])
            s[sc.Index] = s[sc.Index] - 1;
        //else
        //  s[sc.Index] = 0;
    }

    MA[sc.Index] = sc.SimpleMovAvg(s, Input_CalcLength.GetInt());
    Main[sc.Index] = sc.SimpleMovAvg(MA, Input_SmoothLength.GetInt());
    Signal[sc.Index] = sc.SimpleMovAvg(Main, Input_SmoothLength.GetInt());

    Subgraph_Main[sc.Index] = Main[sc.Index];
    Subgraph_Signal[sc.Index] = Signal[sc.Index];
    Subgraph_ZeroLine[sc.Index] = 0;
    Subgraph_UpperLine[sc.Index] = len;
    Subgraph_LowerLine[sc.Index] = -len;
    Subgraph_Overbought[sc.Index] = len * 0.8;
    Subgraph_Oversold[sc.Index] = -len * 0.8;
}

Here is the error list I am facing when compiling:

-- Starting remote build of Custom Studies Source files: TrueMomentum_H.cpp. 64-bit --     14:17:12

Allow time for the server to compile the files and build the DLL.

The remote build did not succeed. Result:

TrueMomentum_H.cpp: In function 'void scsf_TrueMomentum_H(SCStudyInterfaceRef)':
TrueMomentum_H.cpp:105:61: error: no matching function for call to 's_sc::SimpleMovAvg(c_ArrayWrapper<float>&, int)'
  105 |  MA[sc.Index] = sc.SimpleMovAvg(s, Input_CalcLength.GetInt());
      |                                                             ^
In file included from TrueMomentum_H.cpp:2:
sierrachart.h:1253:18: note: candidate: 'c_ArrayWrapper<float>& s_sc::SimpleMovAvg(SCFloatArrayRef, SCFloatArrayRef, int, int)'
 1253 |  SCFloatArrayRef SimpleMovAvg(SCFloatArrayRef In, SCFloatArrayRef Out, int Index, int Length)
      |                  ^~~~~~~~~~~~
sierrachart.h:1253:18: note:   candidate expects 4 arguments, 2 provided
sierrachart.h:1257:18: note: candidate: 'c_ArrayWrapper<float>& s_sc::SimpleMovAvg(SCFloatArrayRef, SCFloatArrayRef, int)'
 1257 |  SCFloatArrayRef SimpleMovAvg(SCFloatArrayRef In, SCFloatArrayRef Out, int Length)
      |                  ^~~~~~~~~~~~
sierrachart.h:1257:18: note:   candidate expects 3 arguments, 2 provided
TrueMomentum_H.cpp:106:66: error: no matching function for call to 's_sc::SimpleMovAvg(c_ArrayWrapper<float>&, int)'
  106 |  Main[sc.Index] = sc.SimpleMovAvg(MA, Input_SmoothLength.GetInt());
      |                                                                  ^
In file included from TrueMomentum_H.cpp:2:
sierrachart.h:1253:18: note: candidate: 'c_ArrayWrapper<float>& s_sc::SimpleMovAvg(SCFloatArrayRef, SCFloatArrayRef, int, int)'
 1253 |  SCFloatArrayRef SimpleMovAvg(SCFloatArrayRef In, SCFloatArrayRef Out, int Index, int Length)
      |                  ^~~~~~~~~~~~
sierrachart.h:1253:18: note:   candidate expects 4 arguments, 2 provided
sierrachart.h:1257:18: note: candidate: 'c_ArrayWrapper<float>& s_sc::SimpleMovAvg(SCFloatArrayRef, SCFloatArrayRef, int)'
 1257 |  SCFloatArrayRef SimpleMovAvg(SCFloatArrayRef In, SCFloatArrayRef Out, int Length)
      |                  ^~~~~~~~~~~~
sierrachart.h:1257:18: note:   candidate expects 3 arguments, 2 provided
TrueMomentum_H.cpp:107:70: error: no matching function for call to 's_sc::SimpleMovAvg(c_ArrayWrapper<float>&, int)'
  107 |  Signal[sc.Index] = sc.SimpleMovAvg(Main, Input_SmoothLength.GetInt());
      |                                                                      ^
In file included from TrueMomentum_H.cpp:2:
sierrachart.h:1253:18: note: candidate: 'c_ArrayWrapper<float>& s_sc::SimpleMovAvg(SCFloatArrayRef, SCFloatArrayRef, int, int)'
 1253 |  SCFloatArrayRef SimpleMovAvg(SCFloatArrayRef In, SCFloatArrayRef Out, int Index, int Length)
      |                  ^~~~~~~~~~~~
sierrachart.h:1253:18: note:   candidate expects 4 arguments, 2 provided
sierrachart.h:1257:18: note: candidate: 'c_ArrayWrapper<float>& s_sc::SimpleMovAvg(SCFloatArrayRef, SCFloatArrayRef, int)'
 1257 |  SCFloatArrayRef SimpleMovAvg(SCFloatArrayRef In, SCFloatArrayRef Out, int Length)
      |                  ^~~~~~~~~~~~
sierrachart.h:1257:18: note:   candidate expects 3 arguments, 2 provided

-- End of Build --     14:17:17
Sam.H
  • 193
  • 2
  • 14
  • The line number in your error does not match the line number of the code you are showing. Is there possibly more code that you are not showing here? – Drew Dormann Aug 08 '23 at 18:49
  • The error message tells you that there is no function with a signature that accepts arguments with the types you're passing. Either the interface has changed since whatever code example you have based this off, or you have not read the documentation. The errors list the available overload candidates for `SimpleMovAvg`. – paddy Aug 08 '23 at 19:18
  • There is a 4-argument version of `SimpleMovAvg` and a 3-argument version of `SimpleMovAvg`, however your code attempts to call `SimpleMovAvg` with 2 arguments. You need to straighten this out, either your sample code using the library is wrong, or the library/header you're using is not correct or up to date. – PaulMcKenzie Aug 09 '23 at 00:51

0 Answers0