Sugestão para o código que criei para cbots
Sugestão para o código que criei para cbots
15 Mar 2024, 12:20
Bom dia! Eu gostaria de uma sugestão para meu código, ele não apresentou nenhum erro, mas no backtest não abriu nenhuma ordem. Segue o meu código:
using cAlgo.API;
using cAlgo.API.Indicators;
namespace cAlgo.Robots
{
[Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
public class BullishBearishDetector : Robot
{
[Parameter("Lot Size", DefaultValue = 100000, MinValue = 0)]
public int LotSize { get; set; }
private DirectionalMovementSystem _dms;
private MovingAverage _maFast, _maSlow;
private int _periodDMS = 14;
private int _periodFastMA = 50;
private int _periodSlowMA = 200;
private double _highestBullishBarPrice = double.MinValue;
private double _lowestBearishBarPrice = double.MaxValue;
private double _stopLoss, _takeProfit;
protected override void OnStart()
{
// Inicialize o sistema de movimento direcional e as médias móveis
_dms = Indicators.DirectionalMovementSystem(_periodDMS);
_maFast = Indicators.MovingAverage(Bars.ClosePrices, _periodFastMA, MovingAverageType.Simple);
_maSlow = Indicators.MovingAverage(Bars.ClosePrices, _periodSlowMA, MovingAverageType.Simple);
}
protected override void OnBar()
{
// Verifique se o indicador -DI cruzou acima do +DI
bool isDIMinusCrossAbove = _dms.DIMinus.Last(1) < _dms.DIPlus.Last(1) && _dms.DIMinus.LastValue > _dms.DIPlus.LastValue;
// Verifique se a média móvel rápida cruzou abaixo da média móvel lenta
bool isFastMACrossBelow = _maFast.Result.Last(1) > _maSlow.Result.Last(1) && _maFast.Result.LastValue < _maSlow.Result.LastValue;
// Se ambas as condições forem verdadeiras, identificamos uma mudança de bullish para bearish
if (isDIMinusCrossAbove && isFastMACrossBelow)
{
_lowestBearishBarPrice = Bars.LowPrices.LastValue;
_stopLoss = Symbol.Ask - _lowestBearishBarPrice;
// Verifique se o preço tocou o início do candle de venda mais baixo do movimento bearish
if (Bars.LowPrices.LastValue <= _lowestBearishBarPrice)
{
// Execute uma ordem de compra no mercado
var tradeResult = ExecuteMarketOrder(TradeType.Buy, SymbolName, LotSize);
if (tradeResult.IsSuccessful)
{
_takeProfit = 3 * _stopLoss;
// Modifique a posição com o novo stop loss e take profit
var modifyResult = ModifyPosition(tradeResult.Position, _stopLoss, _takeProfit);
// Verifique se a modificação foi bem-sucedida
if (!modifyResult.IsSuccessful)
{
Print("Falha ao modificar a posição: ", modifyResult.Error);
}
}
}
}
else
{
_lowestBearishBarPrice = double.MaxValue;
}
// Verifique se o indicador +DI cruzou acima do -DI
bool isDIPlusCrossAbove = _dms.DIPlus.Last(1) < _dms.DIMinus.Last(1) && _dms.DIPlus.LastValue > _dms.DIMinus.LastValue;
// Verifique se a média móvel rápida cruzou acima da média móvel lenta
bool isFastMACrossAbove = _maFast.Result.Last(1) < _maSlow.Result.Last(1) && _maFast.Result.LastValue > _maSlow.Result.LastValue;
// Se ambas as condições forem verdadeiras, identificamos uma mudança de bearish para bullish
if (isDIPlusCrossAbove && isFastMACrossAbove)
{
_highestBullishBarPrice = Bars.HighPrices.LastValue;
_stopLoss = _highestBullishBarPrice - Symbol.Bid;
// Verifique se o preço tocou o início do candle de compra mais alto do movimento bullish
if (Bars.HighPrices.LastValue >= _highestBullishBarPrice)
{
// Execute uma ordem de venda no mercado
var tradeResult = ExecuteMarketOrder(TradeType.Sell, SymbolName, LotSize);
if (tradeResult.IsSuccessful)
{
_takeProfit = 3 * _stopLoss;
// Modifique a posição com o novo stop loss e take profit
var modifyResult = ModifyPosition(tradeResult.Position, _stopLoss, _takeProfit);
// Verifique se a modificação foi bem-sucedida
if (!modifyResult.IsSuccessful)
{
Print("Falha ao modificar a posição: ", modifyResult.Error);
}
}
}
}
else
{
_highestBullishBarPrice = double.MinValue;
}
}
}
}