Пожалуйста, этот бот принимает двойную сделку, как я могу заставить его совершать одну сделку? [закрыто]C#

Место общения программистов C#
Anonymous
Пожалуйста, этот бот принимает двойную сделку, как я могу заставить его совершать одну сделку? [закрыто]

Сообщение Anonymous »

Условие Heiken Ashi Supertrend все еще не работает, сделки должны восприниматься как супертренд
Условие Heiken Ashi Supertrend все еще не работает. Так, например, я провел тестирование на истории 24 октября, и в этот день супертренд на графике Хайкен Аши был зеленым с 11:40 до примерно 18:10. Это означает, что если это условие включено, как я сделал при тестировании на исторических данных, то короткие сделки совершать нельзя. Однако во время бэктеста я увидел несколько коротких сделок, совершенных за этот период времени. Можете ли вы поработать над этим?

угу Сему6:30 утра
поэтому в прикрепленном cbot вам нужно добавить следующие условия, выделенные жирным шрифтом и курсивом

Сделки на покупку

Настройки Heiken Ashi

1. Последняя полоса Heiken Ashi имеет зеленый цвет (должна быть возможность включить или выключить это условие)

2. Супертренд зеленый, настройки по умолчанию: периоды 10, множитель 2, сдвиг 0 (должна быть возможность включить или выключить это условие)

3. Для длинных сделок максимум последнего бара должен быть выше максимума предыдущего бара (т. е. последний бар должен был достичь более высокого максимума. Должна быть возможность включить или выключить это

Условия графика Ренко

1. Супертренд зеленый (настройки по умолчанию: Множитель 45, Периоды 2, Сдвиг 0)

2. 100 EMA выше 300 EMA (должна быть возможность включить или выключить это условие)

2. Минимум последнего бара ренко ниже 300 EMA

3. Сделка на покупку открывается, когда текущий бар закрывается в виде зеленого столбца.

4. Стоп составляет 5 пунктов (по умолчанию).

5. на красный

Сделки на продажу

Настройки Heiken Ashi

1. Последний столбик Heiken Ashi красный (должна быть возможность включить или выключить это условие)

2. Супертренд - красный, настройки по умолчанию: периоды 10, множитель 2, сдвиг 0 (должна быть возможность включить это). состояние включено или выключено)

3. Для коротких сделок минимум последнего бара должен быть ниже минимума предыдущего бара, т. е. последний бар должен был создать более низкий минимум

Настройки графика Ренко

1. Супертренд имеет красный цвет

2. ema (Должна быть возможность включить или выключить это условие)

2. Максимум последнего бара ренко выше 300 EMA

3. Сделка на покупку открывается, когда текущий бар закрывается в виде красного столбца

4. Стоп составляет 5 пунктов

5. Супертренд меняется с красного на зеленый

Код: Выделить всё

using System;
using cAlgo.API;
using cAlgo.API.Indicators;

namespace cAlgo.Robots
{
[Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
public class EmaSupertrendRenkoBot_v3 : Robot
{
// ===== RENKO CHART PARAMETERS =====
[Parameter("Renko Supertrend Multiplier", DefaultValue = 45.0)]
public double RenkoSTMultiplier { get; set; }

[Parameter("Renko Supertrend Periods", DefaultValue = 2)]
public int RenkoSTPeriods { get; set; }

[Parameter("EMA Fast (100)", DefaultValue = 100)]
public int EmaFastPeriod { get; set; }

[Parameter("EMA Slow (300)", DefaultValue = 300)]
public int EmaSlowPeriod { get; set; }

[Parameter("Stop Loss (Pips)", DefaultValue = 5)]
public double StopLossPips { get; set; }

[Parameter("Volume (Lots)", DefaultValue = 0.01)]
public double VolumeInLots { get; set; }

[Parameter("Label", DefaultValue = "ESR_Renko_v3")]
public string Label { get; set; }

// ===== HEIKEN ASHI (M5) FILTER PARAMETERS =====
[Parameter("M5 HA TimeFrame", DefaultValue = "Minute5")]
public TimeFrame M5TimeFrame { get; set; }

[Parameter("M5 HA Supertrend Periods", DefaultValue = 10)]
public int HASupertrendPeriods { get; set; }

[Parameter("M5 HA Supertrend Multiplier", DefaultValue = 2.0)]
public double HASupertrendMultiplier { get; set; }

// ===== CONDITION TOGGLES (ON/OFF) =====
[Parameter("Use M5 HA Supertrend Filter?", DefaultValue = true, Group = "Toggles")]
public bool useM5HASupertrendFilter { get; set; }

[Parameter("Use M5 HA Last Bar Filter?", DefaultValue = true, Group = "Toggles")]
public bool useHALastBarFilter { get; set; }

[Parameter("Use HigherHigh/LowerLow Filter?", DefaultValue = true, Group = "Toggles")]
public bool useHHLFilter { get; set; }

[Parameter("Use Renko EMA Filter?", DefaultValue = true, Group = "Toggles")]
public bool useEmaFilter { get; set; }

// ===== RENKO INDICATORS =====
private ExponentialMovingAverage _emaFast;
private ExponentialMovingAverage _emaSlow;
private Supertrend _renkoSupertrend;

// ===== M5 HA INDICATORS (Manual Calculation) =====
private Bars _m5Bars;
private IndicatorDataSeries HAOpen, HAClose, HAHigh, HALow;
private IndicatorDataSeries TrueRange, AverageTrueRange;
private IndicatorDataSeries UpTrendLevel, DownTrendLevel;

protected override void OnStart()
{
// --- Renko Indicators ---
_emaFast = Indicators.ExponentialMovingAverage(Bars.ClosePrices, EmaFastPeriod);
_emaSlow = Indicators.ExponentialMovingAverage(Bars.ClosePrices, EmaSlowPeriod);

// *** THIS IS THE CORRECTED LINE THAT FIXES ALL BUILD ERRORS ***
_renkoSupertrend = Indicators.Supertrend(Bars, RenkoSTPeriods, RenkoSTMultiplier);

// --- M5 HA Setup ---
_m5Bars = MarketData.GetBars(M5TimeFrame);
HAOpen = CreateDataSeries();
HAClose = CreateDataSeries();
HAHigh = CreateDataSeries();
HALow = CreateDataSeries();
TrueRange = CreateDataSeries();
AverageTrueRange = CreateDataSeries();
UpTrendLevel = CreateDataSeries();
DownTrendLevel = CreateDataSeries();
}

protected override void OnBar()
{
// ----- 1. CALCULATE M5 HA & SUPERTREND -----
int m5Index = _m5Bars.Count - 1;
if (m5Index < HASupertrendPeriods) return;

// We must recalculate the HA indicator values on every new Renko bar
for (int i = Math.Max(0, m5Index - HASupertrendPeriods - 10); i  Bars.OpenPrices.Last(1);
bool renkoBarRed = Bars.ClosePrices.Last(1) < Bars.OpenPrices.Last(1);
bool renkoSTGreen = !double.IsNaN(renkoSTUp);
bool renkoSTRed = !double.IsNaN(renkoSTDown);

// --- M5 HA Values (using m5Index - 1 for the last closed M5 bar) ---
int m5ClosedIdx = m5Index - 1;
if (m5ClosedIdx < 1) return;

bool m5HASTGreen = !double.IsNaN(UpTrendLevel[m5ClosedIdx]);
bool m5HASTRed = !double.IsNaN(DownTrendLevel[m5ClosedIdx]);
bool m5HABarGreen = HAClose[m5ClosedIdx] > HAOpen[m5ClosedIdx];
bool m5HABarRed = HAClose[m5ClosedIdx] < HAOpen[m5ClosedIdx];
bool m5HigherHigh = HAHigh[m5ClosedIdx] > HAHigh[m5ClosedIdx - 1];
bool m5LowerLow = HALow[m5ClosedIdx] < HALow[m5ClosedIdx - 1];

// ----- 4. BUY TRADE LOGIC -----

bool canBuy = true;
if (useM5HASupertrendFilter && !m5HASTGreen)
{
canBuy = false;
}

bool allBuyConditionsMet =
(renkoSTGreen) &&
(renkoLow < renkoEmaSlow) &&
(renkoBarGreen) &&
(!useEmaFilter || (renkoEmaFast > renkoEmaSlow)) && // EMA Filter
(!useHALastBarFilter || m5HABarGreen) && // HA Bar Color Filter
(!useHHLFilter || m5HigherHigh); // HA Higher High Filter

// **ONE TRADE AT A TIME FIX IS HERE**
if (canBuy && allBuyConditionsMet && !HasAnyPosition())
{
ExecuteMarketOrder(TradeType.Buy, Symbol, VolumeInLots, Label, StopLossPips, null);
}

// ----- 5. SELL TRADE LOGIC -----

bool canSell = true;
// **THIS IS THE FIX FOR YOUR OCTOBER 24TH BUG**
if (useM5HASupertrendFilter && m5HASTGreen)
{
canSell = false; // M5 ST is GREEN, block ALL Sell trades
}

// This is an added check for safety
if (useM5HASupertrendFilter && !m5HASTRed)
{
// If the filter is on, the ST MUST be red.  If it's not red (i.e., it's green or neutral), block sells.
canSell = false;
}

bool allSellConditionsMet =
(renkoSTRed) &&
(renkoHigh > renkoEmaSlow) &&
(renkoBarRed) &&
(!useEmaFilter || (renkoEmaFast < renkoEmaSlow)) && // EMA Filter
(!useHALastBarFilter || m5HABarRed) && // HA Bar Color Filter

// *** THIS IS THE TYPO FIX: mf5LowerLow -> m5LowerLow ***
(!useHHLFilter || m5LowerLow); // HA Lower Low Filter

// **ONE TRADE AT A TIME FIX IS HERE**
if (canSell && allSellConditionsMet && !HasAnyPosition())
{
ExecuteMarketOrder(TradeType.Sell, Symbol, VolumeInLots, Label, StopLossPips, null);
}
}

// ===== HELPER METHODS (Manual M5 HA & ST Calcs) =====

private void CalculateHeikinAshi(int index)
{
if (index < 1)
{
if (index == 0)
{
HAClose[index] = (_m5Bars.OpenPrices[index] + _m5Bars.HighPrices[index] + _m5Bars.LowPrices[index] + _m5Bars.ClosePrices[index]) / 4.0;
HAOpen[index] = _m5Bars.OpenPrices[index];
HAHigh[index] = _m5Bars.HighPrices[index];
HALow[index] = _m5Bars.LowPrices[index];
}
return;
}

double open = _m5Bars.OpenPrices[index];
double high = _m5Bars.HighPrices[index];
double low = _m5Bars.LowPrices[index];
double close = _m5Bars.ClosePrices[index];

double haClose = (open + high + low + close) / 4.0;
// Use previous index values from the dataseries
double haOpen = (HAOpen[index-1] + HAClose[index-1]) / 2.0;
double haHigh = Math.Max(high, Math.Max(haOpen, haClose));
double haLow = Math.Min(low, Math.Min(haOpen, haClose));

HAClose[index] = haClose;
HAOpen[index] = haOpen;
HAHigh[index] = haHigh;
HALow[index] = haLow;
}

private void CalculateATR(int index)
{
if (index < 1)
{
if (index == 0) TrueRange[index] = HAHigh[index] - HALow[index];
return;
}

// Use the HA bars for ATR calculation
double tr = Math.Max(HAHigh[index] - HALow[index], Math.Max(Math.Abs(HAHigh[index] - HAClose[index - 1]), Math.Abs(HALow[index] - HAClose[index - 1])));
TrueRange[index] = tr;

if (index < HASupertrendPeriods)
{
AverageTrueRange[index] = double.NaN;
return;
}

// Simple Moving Average of TrueRange for ATR
double sumTR = 0;
for (int i = index - HASupertrendPeriods + 1; i  prevUpTrend || prevHAClose <  prevUpTrend) ? basicLowerBand : prevUpTrend;

// Calculate current DownTrend line
double currentDownTrend = (basicUpperBand < prevDownTrend || prevHAClose > prevDownTrend) ? basicUpperBand : prevDownTrend;

// Get previous trend direction (what was the active line?)
double previousSupertrendLine = double.NaN;
if (!double.IsNaN(UpTrendLevel[index - 1]))
{
previousSupertrendLine = UpTrendLevel[index - 1];
}
else if (!double.IsNaN(DownTrendLevel[index - 1]))
{
previousSupertrendLine = DownTrendLevel[index - 1];
}

// Determine current trend based on HA close
if (double.IsNaN(previousSupertrendLine) || HAClose[index] > previousSupertrendLine)
{
// We are in an uptrend (or just crossed into one)
UpTrendLevel[index] = currentUpTrend;
DownTrendLevel[index] = double.NaN;
}
else
{
// We are in a downtrend
DownTrendLevel[index] = currentDownTrend;
UpTrendLevel[index] = double.NaN;
}
}

// ===== POSITION MANAGEMENT HELPERS =====

// **ONE TRADE AT A TIME FIX IS HERE**
private bool HasAnyPosition()
{
// This checks if ANY position is open for this bot
return Positions.FindAll(Label, SymbolName).Length > 0;
}

private void ClosePositions(TradeType type)
{
foreach (var pos in Positions.FindAll(Label, SymbolName))
{
if (pos.TradeType == type)
ClosePosition(pos);
}
}
}
}
Просто добавьте эти условия. Условие Heiken Ashi Supertrend все еще не работает, оно должно воспринимать сделки как супертренд.
Условие Heiken Ashi Supertrend все еще не работает. Так, например, я провел тестирование на истории 24 октября, и в этот день супертренд на графике Хайкен Аши был зеленым с 11:40 до примерно 18:10. Это означает, что если это условие включено, как я сделал при тестировании на исторических данных, то короткие сделки совершать нельзя. Однако во время бэктеста я увидел несколько коротких сделок, совершенных за этот период времени. Можете ли вы поработать над этим?


Подробнее здесь: https://stackoverflow.com/questions/798 ... ngle-trade

Вернуться в «C#»