Dear All!
I'm currently trying to implement an automated trade strategy into a custom study DLL. Unfortunately, I have no C++ experience at all. I have spent the whole day reading the sierra chart help guide on programming, but I am still a bit confused.
The question I have will be very simple for someone who has done any coding in Sierra Chart. Here we go:
In my initial study I have 2 lines crossing and giving buy or sell signals. Now this will cause "endless" trading, because you are always in a position.
All i want is to implement a take profit/stop loss condition to my strategy so that the position could be closed not only when the lines cross, but when a stop or take limit has been reached.
Ideally, I would like to make stop/take size and order size changeable in Study options, without the need to tweak the code.
Sierra Chart have the following example of a study where 2 lines cross, but it does not contain the stop/take orders..
SCSFExport scsf_SC_TradingCrossOverExample(SCStudyGraphRef sc)
{
SCInputRef line1Ref = sc.Input[0];
SCInputRef line2Ref = sc.Input[1];
SCSubgraphRef bullish = sc.Subgraph[0];
SCSubgraphRef bearish = sc.Subgraph[1];
if (sc.SetDefaults)
{
// Set the configuration and defaults
sc.GraphName = "Trading CrossOver Example";
sc.StudyDescription = "An example of a trading system that enters a new position or \
reverses an existing one on the crossover of two study Subgraphs. \
When line1 crosses line2 from below, the system will look to be long. \
When line1 crosses line2 from above, the system will look to be short.";
sc.AutoLoop = 1; // true
sc.GraphRegion = 0;
sc.FreeDLL = 0;
sc.CalculationPrecedence = LOW_PREC_LEVEL;
line1Ref.Name = "Line1";
line1Ref.SetStudySubgraphValues(1, 0);
line2Ref.Name = "Line2";
line2Ref.SetStudySubgraphValues(1, 0);
bullish.Name = "Bullish";
bullish.DrawStyle = DRAWSTYLE_POINTHIGH;
bullish.LineWidth = 3;
bearish.Name = "Bearish";
bearish.DrawStyle = DRAWSTYLE_POINTLOW;
bearish.LineWidth = 3;
sc.AllowMultipleEntriesInSameDirection = false;
sc.MaximumPositionAllowed = 5;
sc.SupportReversals = true;
// This is false by default. Orders will go to the simulation system always.
sc.SendOrdersToTradeService = false;
sc.AllowOppositeEntryWithOpposingPositionOrOrders = false;
sc.SupportAttachedOrdersForTrading = false;
sc.CancelAllOrdersOnEntriesAndReversals= true;
sc.AllowEntryWithWorkingOrders = false;
sc.CancelAllWorkingOrdersOnExit = true;
sc.AllowOnlyOneTradePerBar = true;
sc.MaintainTradeStatisticsAndTradesData = true;
return;
}
// only process at the close of the bar; if it has not closed don't do anything
if (sc.GetBarHasClosedStatus() == BHCS_BAR_HAS_NOT_CLOSED)
{
return;
}
// using the line1Ref and line2Ref input variables, retrieve the subgraph arrays into line1,
// line2 arrays respectively
SCFloatArray line1;
sc.GetStudyArrayUsingID(line1Ref.GetStudyID(), line1Ref.GetSubgraphIndex(), line1);
SCFloatArray line2;
sc.GetStudyArrayUsingID(line2Ref.GetStudyID(), line2Ref.GetSubgraphIndex(), line2);
// code below is where we check for crossovers and take action accordingly
if (sc.CrossOver(line1, line2) == CROSS_FROM_BOTTOM)
{
// mark the crossover on the chart
bullish[sc.Index] = 1;
// Create a market order and enter long.
s_SCNewOrder order;
order.OrderQuantity = 1;
order.OrderType = SCT_ORDERTYPE_MARKET;
sc.BuyEntry(order);
}
if (sc.CrossOver(line1, line2) == CROSS_FROM_TOP)
{
// mark the crossover on the chart
bearish[sc.Index] = 1;
// create a market order and enter short
s_SCNewOrder order;
order.OrderQuantity = 1;
order.OrderType = SCT_ORDERTYPE_MARKET;
sc.SellEntry(order);
}
}
}
Can anyone help,please?
Very much appreciated!