Ir para o conteúdo

Como utilizar indicadores em cBots

Neste artigo e no vídeo correspondente, explicamos como pode usar indicadores integrados nos seus cBots. O uso de indicadores num cBot é normalmente feito para uma variedade de propósitos, mais notavelmente fazendo com que os cBots tomem decisões de negociação dependendo dos resultados dos indicadores. Para demonstrar isto, iremos desenvolver uma simples estratégia de negociação automatizada baseada no Relative Strength Index (RSI).

Criar um novo cBot

Para criar um novo cBot, mude para o separador Algo e clique em Novo cBot.

Iremos renomear o nosso cBot para "RSI cBot". Eis como a nossa estratégia de negociação automatizada irá funcionar.

  • O bot irá entrar em posições de compra quando o indicador RSI se mover abaixo de um limite predefinido.
  • O bot irá entrar em posições de venda quando o indicador RSI se mover acima de um limite predefinido.

Definir e inicializar o indicador

A primeira coisa que precisamos de fazer é definir o indicador RSI na nossa classe cBot. Para tal, declaramos um novo campo.

1
private RelativeStrengthIndicator rsi;

Usando membros de classe privados

Podemos tornar o campo rsi privado com segurança, pois será usado apenas no nosso cBot.

Todos os indicadores cTrader precisam de ser inicializados antes de podermos usá-los. Isto é melhor feito no corpo do método OnStart() para que o cBot tenha acesso ao resultado do indicador após começar a funcionar. O cTrader oferece uma classe útil que lhe permite inicializar facilmente indicadores integrados usando construtores pré-feitos. Antes de podermos ver como isto é feito, iremos adicionar dois parâmetros necessários para inicializar o indicador RSI.

1
2
3
4
5
[Parameter("Source", Group = "RSI")]
public DataSeries Source { get; set; }

[Parameter("Periods", Group = "RSI", DefaultValue = 14)]
public int Periods { get; set; }

Agora que adicionámos os nossos parâmetros, estamos prontos para inicializar o indicador.

1
2
3
4
protected override void OnStart()
{
    rsi = Indicators.RelativeStrengthIndex(Source, Periods);
}

Implementar lógica de negociação

Como já inicializámos o indicador, podemos chamá-lo e usá-lo na nossa lógica de negociação. No caso do indicador RSI, podemos ler os resultados usando a coleção Results.

Para tal, iremos usar o método OnBar() e implementar as seguintes condições.

  • Se o valor atual do RSI estiver abaixo do limite de compra do RSI, entre numa nova posição de compra.
  • Se o valor atual do RSI estiver acima do limite de venda do RSI, entre numa nova posição de venda.

Como dependemos de limites predefinidos para executar a nossa lógica de negociação, iremos adicionar mais dois parâmetros ao nosso cBot.

1
2
3
4
5
[Parameter("Buy Level", Group = "RSI", DefaultValue = 30)]
public int BuyLevel { get; set; }

[Parameter("Sell Level", Group = "RSI", DefaultValue = 70)]
public int SellLevel { get; set; }

A seguir, iremos implementar as nossas condições no código do cBot.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
protected override void OnBarClosed()
{
    if (rsi.Result.LastValue < BuyLevel)
    {
    // Enter buy position
    }
    else if (rsi.Result.LastValue > SellLevel)
    {
    // Enter sell position
    }
}

É hora de implementar métodos auxiliares para executar ordens de negociação. Isto é feito para criar um nível adicional de abstração no código, melhorando a legibilidade e a reutilização.

Começamos por adicionar mais um parâmetro cBot que lhe permite definir o volume negociado.

1
2
[Parameter("Quantity (Lots)", Group = "Volume", DefaultValue = 1, MinValue = 0.01, Step = 0.01)]
public double Quantity { get; set; }

Depois, iremos adicionar os métodos Open() e Close() para entrar numa nova posição e fechar todas as posições abertas pelo cBot numa determinada direção.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
private void Open(TradeType tradeType)
{
    var position = Positions.Find("SampleRSI", SymbolName, tradeType);
    var volumeInUnits = Symbol.QuantityToVolumeInUnits(Quantity);

    if (position == null)
        ExecuteMarketOrder(tradeType, SymbolName, volumeInUnits, "RSI cBot");
}

private void Close(TradeType tradeType)
{
    foreach (var position in Positions.FindAll("SampleRSI", SymbolName, tradeType))
        ClosePosition(position);
}

Podemos usar os nossos métodos auxiliares para completar a estratégia de negociação automatizada.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
protected override void OnTick()
{
    if (rsi.Result.LastValue < BuyLevel)
    {
        Close(TradeType.Sell);
        Open(TradeType.Buy);
    }
    else if (rsi.Result.LastValue > SellLevel)
    {
        Close(TradeType.Buy);
        Open(TradeType.Sell);
    }
}

Teste de verificação do cBot

Depois de terminarmos a programação do cBot, podemos construí-lo e mudar para o separador Testes de verificação para ver como funciona em dados históricos.

Também podemos anexar o indicador RSI ao gráfico atual para ver se as negociações executadas pelo cBot correspondem aos pontos de entrada pretendidos.

Image title