StringBuilder OpeningLogicHTMLReport()
{
StringBuilder sb = new StringBuilder();
string indicatorName = Data.Strategy.Slot[0].IndicatorName;
Indicator indOpen = Indicator_Store.ConstructIndicator(indicatorName, SlotTypes.Open);
indOpen.IndParam = Data.Strategy.Slot[0].IndParam;
indOpen.SetDescription(SlotTypes.Open);
// Logical groups of the opening conditions.
List<string> opengroups = new List<string>();
for (int slot = 1; slot <= Data.Strategy.OpenFilters; slot++)
{
string group = Data.Strategy.Slot[slot].LogicalGroup;
if (!opengroups.Contains(group) && group != "All")
opengroups.Add(group); // Adds all groups except "All"
}
if (opengroups.Count == 0 && Data.Strategy.OpenFilters > 0)
opengroups.Add("All"); // If all the slots are in "All" group, adds "All" to the list.
// Long position
string openLong = "<p>";
if (Data.Strategy.sameDirSignal == SameDirSignalAction.Add)
openLong = Language.T("Open a new long position or add to an existing position");
else if (Data.Strategy.sameDirSignal == SameDirSignalAction.Winner)
openLong = Language.T("Open a new long position or add to a winning position");
else if (Data.Strategy.sameDirSignal == SameDirSignalAction.Nothing)
openLong = Language.T("Open a new long position");
if (OppSignalAction == OppositeDirSignalAction.Close)
openLong += " " + Language.T("or close a short position");
else if (OppSignalAction == OppositeDirSignalAction.Reduce)
openLong += " " + Language.T("or reduce a short position");
else if (OppSignalAction == OppositeDirSignalAction.Reverse)
openLong += " " + Language.T("or reverse a short position");
else if (OppSignalAction == OppositeDirSignalAction.Nothing)
openLong += "";
openLong += " " + indOpen.EntryPointLongDescription;
if (Data.Strategy.OpenFilters == 0)
openLong += ".</p>";
else if (Data.Strategy.OpenFilters == 1)
openLong += " " + Language.T("when the following logic condition is satisfied") + ":</p>";
else if (opengroups.Count > 1)
openLong += " " + Language.T("when") + ":</p>";
else
openLong += " " + Language.T("when all the following logic conditions are satisfied") + ":</p>";
sb.AppendLine(openLong);
// Open Filters
if (Data.Strategy.OpenFilters > 0)
{
int groupnumb = 1;
if (opengroups.Count > 1)
sb.AppendLine("<ul>");
foreach (string group in opengroups)
{
if (opengroups.Count > 1)
{
sb.AppendLine("<li>" + (groupnumb == 1 ? "" : Language.T("or") + " ") + Language.T("logical group [#] is satisfied").Replace("#", group) + ":");
groupnumb++;
}
sb.AppendLine("<ul>");
int indInGroup = 0;
for (int slot = 1; slot <= Data.Strategy.OpenFilters; slot++)
if (Data.Strategy.Slot[slot].LogicalGroup == group || Data.Strategy.Slot[slot].LogicalGroup == "All")
indInGroup++;
int indnumb = 1;
for (int slot = 1; slot <= Data.Strategy.OpenFilters; slot++)
{
if (Data.Strategy.Slot[slot].LogicalGroup != group && Data.Strategy.Slot[slot].LogicalGroup != "All")
continue;
Indicator indOpenFilter = Indicator_Store.ConstructIndicator(Data.Strategy.Slot[slot].IndicatorName, SlotTypes.OpenFilter);
indOpenFilter.IndParam = Data.Strategy.Slot[slot].IndParam;
indOpenFilter.SetDescription(SlotTypes.OpenFilter);
if (indnumb < indInGroup)
sb.AppendLine("<li>" + indOpenFilter.EntryFilterLongDescription + "; " + Language.T("and") + "</li>");
else
sb.AppendLine("<li>" + indOpenFilter.EntryFilterLongDescription + ".</li>");
indnumb++;
}
sb.AppendLine("</ul>");
if (opengroups.Count > 1)
sb.AppendLine("</li>");
}
if (opengroups.Count > 1)
sb.AppendLine("</ul>");
}
// Short position
string openShort = "<p>";
if (Data.Strategy.sameDirSignal == SameDirSignalAction.Add)
openShort = Language.T("Open a new short position or add to an existing position");
else if (Data.Strategy.sameDirSignal == SameDirSignalAction.Winner)
openShort = Language.T("Open a new short position or add to a winning position");
else if (Data.Strategy.sameDirSignal == SameDirSignalAction.Nothing)
openShort = Language.T("Open a new short position");
if (OppSignalAction == OppositeDirSignalAction.Close)
openShort += " " + Language.T("or close a long position");
else if (OppSignalAction == OppositeDirSignalAction.Reduce)
openShort += " " + Language.T("or reduce a long position");
else if (OppSignalAction == OppositeDirSignalAction.Reverse)
openShort += " " + Language.T("or reverse a long position");
else if (OppSignalAction == OppositeDirSignalAction.Nothing)
openShort += "";
openShort += " " + indOpen.EntryPointShortDescription;
if (Data.Strategy.OpenFilters == 0)
openShort += ".</p>";
else if (Data.Strategy.OpenFilters == 1)
openShort += " " + Language.T("when the following logic condition is satisfied") + ":</p>";
else if (opengroups.Count > 1)
openShort += " " + Language.T("when") + ":</p>";
else
openShort += " " + Language.T("when all the following logic conditions are satisfied") + ":</p>";
sb.AppendLine(openShort);
// Open Filters
if (Data.Strategy.OpenFilters > 0)
{
int groupnumb = 1;
if (opengroups.Count > 1)
sb.AppendLine("<ul>");
foreach (string group in opengroups)
{
if (opengroups.Count > 1)
{
sb.AppendLine("<li>" + (groupnumb == 1 ? "" : Language.T("or") + " ") + Language.T("logical group [#] is satisfied").Replace("#", group) + ":");
groupnumb++;
}
sb.AppendLine("<ul>");
int indInGroup = 0;
for (int slot = 1; slot <= Data.Strategy.OpenFilters; slot++)
if (Data.Strategy.Slot[slot].LogicalGroup == group || Data.Strategy.Slot[slot].LogicalGroup == "All")
indInGroup++;
int indnumb = 1;
for (int slot = 1; slot <= Data.Strategy.OpenFilters; slot++)
{
if (Data.Strategy.Slot[slot].LogicalGroup != group && Data.Strategy.Slot[slot].LogicalGroup != "All")
continue;
Indicator indOpenFilter = Indicator_Store.ConstructIndicator(Data.Strategy.Slot[slot].IndicatorName, SlotTypes.OpenFilter);
indOpenFilter.IndParam = Data.Strategy.Slot[slot].IndParam;
indOpenFilter.SetDescription(SlotTypes.OpenFilter);
if (indnumb < indInGroup)
sb.AppendLine("<li>" + indOpenFilter.EntryFilterShortDescription + "; " + Language.T("and") + "</li>");
else
sb.AppendLine("<li>" + indOpenFilter.EntryFilterShortDescription + ".</li>");
indnumb++;
}
sb.AppendLine("</ul>");
if (opengroups.Count > 1)
sb.AppendLine("</li>");
}
if (opengroups.Count > 1)
sb.AppendLine("</ul>");
}
return sb;
}