Login Page - Create Account

Support Board


Date/Time: Sun, 19 May 2024 02:02:45 +0000



Post From: DRAWSTYLE_COLOR_BAR does not work with DRAWSTYLE_BACKGROUND

[2020-05-10 00:02:22]
Yoda - Posts: 106
I have a study that colors the bars when certain conditions are met.

I decided to add the option to switch between coloring the bars and coloring the background.

However, I found once I added DRAWSTYLE_BACKGROUND to the code, DRAWSTYLE_COLOR_BAR no longer worked.

I tried numerous other drawstyles, like DRAWSTYLE_ARROW_DOWN and DRAWSTYLE_POINT in place of DRAWSTYLE_COLOR_BAR and all of those worked.

The issue appears to be only with DRAWSTYLE_COLOR_BAR.

To demonstrate this issue, I created a study (1st example below) from the BackgroundDrawStyleExample in studies8.cpp and added the option to switch to DRAWSTYLE_COLOR_BAR. You will note that when you switch to Color bar, the bars are not colored.

If you comment out Subgraph_ColorBar.DrawStyle = DRAWSTYLE_COLOR_BAR; and un-comment either one of the two lines below it, you will see that both arrow down and the point works without any issue.

To further demonstrate this issue, I have a second study below. It is the same code as the first study, but I have commented out all of the lines related to Subgraph_Background and Subgraph_BackgroundDC. You will note that the bars are now being colored.

Is this a bug in SC or is there something I need to do to have DRAWSTYLE_COLOR_BAR working with DRAWSTYLE_BACKGROUND?


/******************************************************************************
Name      : BackgroundDrawStyleExampleWithColorBar01.cpp
Description    : Demonstrates issue when combining
            DRAWSTYLE_BACKGROUND & DRAWSTYLE_COLOR_BAR
Last Modified Date  : 20200509-1823
Version      : 0.01
Disclosure *****  : SEE DISCLOSURE BELOW CODE
******************************************************************************/

#include "sierrachart.h"

SCDLLName("BackgroundDrawStyleExampleWithColorBar01")

SCSFExport scsf_BackgroundDrawStyleExample(SCStudyInterfaceRef sc)
{
  SCSubgraphRef Subgraph_Background = sc.Subgraph[0];
  SCSubgraphRef Subgraph_BackgroundDC = sc.Subgraph[1];
  SCSubgraphRef Subgraph_ColorBar    = sc.Subgraph[2];
  SCSubgraphRef Subgraph_HighPrice  = sc.Subgraph[3];

  SCInputRef Input_ColorBar_or_ColorBackground  = sc.Input[1];

  if (sc.SetDefaults)
  {
    // Set the configuration and defaults
    sc.GraphName = "Background DrawStyle Example";
    sc.StudyDescription = "Background DrawStyle Example";

    sc.AutoLoop = true;
    
    sc.GraphRegion = 0;
    sc.DrawStudyUnderneathMainPriceGraph = 1; // not required in studies, but want color behind price for this study

    Subgraph_Background.Name = "Background";
    Subgraph_Background.DrawStyle = DRAWSTYLE_BACKGROUND;
    Subgraph_Background.PrimaryColor = COLOR_LIGHTGREEN;
    Subgraph_Background.SecondaryColor = COLOR_LIGHTPINK;
    Subgraph_Background.SecondaryColorUsed = true; // turn on if both colors are to be used
    Subgraph_Background.AutoColoring = AUTOCOLOR_POSNEG; // use positive/negative values to signify colors

    Subgraph_BackgroundDC.Name = "Background DataColor";
    Subgraph_BackgroundDC.DrawStyle = DRAWSTYLE_BACKGROUND;
    Subgraph_BackgroundDC.PrimaryColor = RGB(255,0,255);

    Subgraph_ColorBar.Name = "Background";
    Subgraph_ColorBar.DrawStyle = DRAWSTYLE_COLOR_BAR; // DOES NOT WORK
    //Subgraph_ColorBar.DrawStyle = DRAWSTYLE_ARROW_DOWN; // WORKS
    //Subgraph_ColorBar.DrawStyle = DRAWSTYLE_POINT; // WORKS
    Subgraph_ColorBar.PrimaryColor = COLOR_LIGHTGREEN;
    Subgraph_ColorBar.SecondaryColor = COLOR_LIGHTPINK;
    Subgraph_ColorBar.SecondaryColorUsed = true;  // turn on if both colors are to be used
    Subgraph_ColorBar.AutoColoring = AUTOCOLOR_POSNEG; // use positive/negative values to signify colors
    Subgraph_ColorBar.LineWidth = 8;

    Input_ColorBar_or_ColorBackground.Name = "Color Bar or background";
    Input_ColorBar_or_ColorBackground.SetCustomInputStrings("0: Color Background; 1: Color bar");
    Input_ColorBar_or_ColorBackground.SetCustomInputIndex(0);
    Input_ColorBar_or_ColorBackground.SetIntLimits(0,1);
        
    return;
  }

  // Do data processing
  int min = sc.BaseDateTimeIn[sc.Index].GetMinute();

  float High = sc.High[sc.Index];
  
  if (Input_ColorBar_or_ColorBackground.GetIndex() == 0) // Color Background
  {
    if (min > 0 && min < 15)
      Subgraph_Background[sc.Index] = 0; // do not color background
    else if (min >= 15 && min < 30)
      Subgraph_Background[sc.Index] = 1; // use primary color
    else if (min >= 30 && min < 45)
      Subgraph_Background[sc.Index] = -1; // use secondary color
    else if (min >= 45 && min < 60)
    {
      Subgraph_BackgroundDC[sc.Index] = 1;
      Subgraph_BackgroundDC.DataColor[sc.Index] = RGB(0, 0, 17*(60-min));
    }
  }
  else // 1st 15m no coloring, 2nd & 3rd color bars, 4th 15m color background
  {
    if (min > 0 && min < 15)
    {
      Subgraph_ColorBar[sc.Index] = 0;  // do not color bar
    }    
    else if (min >= 15 && min < 30)
    {
      Subgraph_ColorBar[sc.Index] = High;  
      Subgraph_ColorBar.DataColor[sc.Index] = Subgraph_ColorBar.PrimaryColor;
    }
    else if (min >= 30 && min < 45)
    {
      Subgraph_ColorBar[sc.Index] = High;
      Subgraph_ColorBar.DataColor[sc.Index] = Subgraph_ColorBar.SecondaryColor;
    }
    else if (min >= 45 && min < 60) // color background
    {
      Subgraph_BackgroundDC[sc.Index] = 1;
      Subgraph_BackgroundDC.DataColor[sc.Index] = RGB(0, 0, 17*(60-min));
    }
  }
/*****************************************************************************
DISCLAIMER / WARNING:
This code is provided for educational purposes on an As Is, Where Is basis.
No express or implied warranties are provided.
There may be errors in this code, and it must not be used for live trading.
Trading is very risky and you can lose more than you have invested.
Past performance is not necessarily indicative of future results.
By using any of this code, you acknowledge and agree to the above.

******************************************************************************/
}


/******************************************************************************
Name        : OnlyColorBar02.cpp
Description      : Shows DRAWSTYLE_COLOR_BAR works when
            DRAWSTYLE_BACKGROUND is commented out
Last Modified Date  : 20200509-1849
Version        : 0.01
Disclosure *****  : SEE DISCLOSURE BELOW CODE
******************************************************************************/

#include "sierrachart.h"

SCDLLName("OnlyColorBar02")

SCSFExport scsf_BackgroundDrawStyleExample(SCStudyInterfaceRef sc)
{
  //SCSubgraphRef Subgraph_Background = sc.Subgraph[0];
  //SCSubgraphRef Subgraph_BackgroundDC = sc.Subgraph[1];
  SCSubgraphRef Subgraph_ColorBar    = sc.Subgraph[2];
  SCSubgraphRef Subgraph_HighPrice  = sc.Subgraph[3];

  SCInputRef Input_ColorBar_or_ColorBackground  = sc.Input[1];

  if (sc.SetDefaults)
  {
    // Set the configuration and defaults
    sc.GraphName = "Background DrawStyle Example";
    sc.StudyDescription = "Background DrawStyle Example";

    sc.AutoLoop = true;
    
    sc.GraphRegion = 0;
    sc.DrawStudyUnderneathMainPriceGraph = 1; // not required in studies, but want color behind price for this study
  /*  
    Subgraph_Background.Name = "Background";
    Subgraph_Background.DrawStyle = DRAWSTYLE_BACKGROUND;
    Subgraph_Background.PrimaryColor = COLOR_LIGHTGREEN;
    Subgraph_Background.SecondaryColor = COLOR_LIGHTPINK;
    Subgraph_Background.SecondaryColorUsed = true; // turn on if both colors are to be used
    Subgraph_Background.AutoColoring = AUTOCOLOR_POSNEG; // use positive/negative values to signify colors

    Subgraph_BackgroundDC.Name = "Background DataColor";
    Subgraph_BackgroundDC.DrawStyle = DRAWSTYLE_BACKGROUND;
    Subgraph_BackgroundDC.PrimaryColor = RGB(255,0,255);
  */
    Subgraph_ColorBar.Name = "Background";
    Subgraph_ColorBar.DrawStyle = DRAWSTYLE_COLOR_BAR; // NOW WORKS
    //Subgraph_ColorBar.DrawStyle = DRAWSTYLE_ARROW_DOWN; // WORKS
    //Subgraph_ColorBar.DrawStyle = DRAWSTYLE_POINT; // WORKS
    Subgraph_ColorBar.PrimaryColor = COLOR_LIGHTGREEN;
    Subgraph_ColorBar.SecondaryColor = COLOR_LIGHTPINK;
    Subgraph_ColorBar.SecondaryColorUsed = true;  // turn on if both colors are to be used
    Subgraph_ColorBar.AutoColoring = AUTOCOLOR_POSNEG; // use positive/negative values to signify colors
    Subgraph_ColorBar.LineWidth = 8;

    Input_ColorBar_or_ColorBackground.Name = "Color Bar or background";
    Input_ColorBar_or_ColorBackground.SetCustomInputStrings("0: Color Background; 1: Color bar");
    Input_ColorBar_or_ColorBackground.SetCustomInputIndex(1);
    Input_ColorBar_or_ColorBackground.SetIntLimits(0,1);
        
    return;
  }

  // Do data processing
  int min = sc.BaseDateTimeIn[sc.Index].GetMinute();

  float High = sc.High[sc.Index];
/*  
  if (Input_ColorBar_or_ColorBackground.GetIndex() == 0) // Color Background
  {
    if (min > 0 && min < 15)
      Subgraph_Background[sc.Index] = 0; // do not color background
    else if (min >= 15 && min < 30)
      Subgraph_Background[sc.Index] = 1; // use primary color
    else if (min >= 30 && min < 45)
      Subgraph_Background[sc.Index] = -1; // use secondary color
    else if (min >= 45 && min < 60)
    {
      Subgraph_BackgroundDC[sc.Index] = 1;
      Subgraph_BackgroundDC.DataColor[sc.Index] = RGB(0, 0, 17*(60-min));
    }
  }
  else // 1st 15m no coloring, 2nd & 3rd color bars, 4th 15m color background
  {
*/    
    if (min > 0 && min < 15)
    {
      Subgraph_ColorBar[sc.Index] = 0;  // do not color bar
    }    
    else if (min >= 15 && min < 30)
    {
      Subgraph_ColorBar[sc.Index] = High;  
      Subgraph_ColorBar.DataColor[sc.Index] = Subgraph_ColorBar.PrimaryColor;
    }
    else if (min >= 30 && min < 45)
    {
      Subgraph_ColorBar[sc.Index] = High;
      Subgraph_ColorBar.DataColor[sc.Index] = Subgraph_ColorBar.SecondaryColor;
    }
  /*  else if (min >= 45 && min < 60) // color background
    {
      Subgraph_BackgroundDC[sc.Index] = 1;
      Subgraph_BackgroundDC.DataColor[sc.Index] = RGB(0, 0, 17*(60-min));
    }
  }
  */
/*****************************************************************************
DISCLAIMER / WARNING:
This code is provided for educational purposes on an As Is, Where Is basis.
No express or implied warranties are provided.
There may be errors in this code, and it must not be used for live trading.
Trading is very risky and you can lose more than you have invested.
Past performance is not necessarily indicative of future results.
By using any of this code, you acknowledge and agree to the above.

******************************************************************************/
}