Creé un cBot que utiliza el CRTIndicator para establecer niveles de stop loss y take profit.
La idea es usar los niveles CRT (alto, medio, bajo) de una vela anterior (especificada por CandleIndex) para establecer el stop loss y take profit para una nueva operación.
Pasos:
- Crearemos un cBot que abra una operación (ya sea compra o venta) basada en alguna condición (que definiremos como un parámetro para pruebas).
- Usaremos el CRTIndicator para obtener los niveles de una vela anterior (el índice de la vela es establecido por el usuario).
- Para una operación de compra, estableceremos el stop loss en el bajo CRT y el take profit en el alto CRT de la vela de referencia.
- Para una operación de venta, estableceremos el stop loss en el alto CRT y el take profit en el bajo CRT de la vela de referencia.
Sin embargo, tenga en cuenta que el CRTIndicator que tenemos solo calcula los niveles para cada vela y los grafica.
Necesitamos acceder al indicador desde el cBot y obtener los valores para la vela específica que nos interesa.
Diseñemos el cBot:
Parámetros:
- CandleIndex: qué vela anterior usar (0 = actual, 1 = anterior, etc.)
- TradeType: podemos establecer un parámetro para elegir entre Comprar y Vender para pruebas, o podemos usar una señal (como un cruce de medias móviles) para decidir.
Para simplificar, hagamos un parámetro para elegir el tipo de operación.
Pero tenga en cuenta: en trading en vivo, usaríamos algunas condiciones para entrar. Haremos un cBot simple que abra una operación en la vela actual si no hay posición existente.
Supondremos que estamos operando en el marco temporal del gráfico.
Pasos en el cBot:
- Verificar si tenemos una posición abierta. Si no, considerar abrir una.
- Obtener los valores del CRTIndicator para el CandleIndex especificado (que es una vela pasada relativa a la actual).
- Para una operación de compra:
Stop Loss = Bajo CRT de la vela de referencia
Take Profit = Alto CRT de la vela de referencia - Para una operación de venta:
Stop Loss = Alto CRT de la vela de referencia
Take Profit = Bajo CRT de la vela de referencia
Sin embargo, tenga en cuenta que el indicador calcula para cada índice. Estamos graficando los mismos valores para cada índice (porque usamos un desplazamiento fijo de CandleIndex).
Pero en el cBot, queremos obtener los niveles del indicador en el tiempo actual (la vela completada más reciente) para el CandleIndex especificado.
Importante: el método Calculate del indicador se llama para cada índice, y almacena los valores para la vela de referencia (índice - CandleIndex) en el índice actual.
Entonces, si queremos obtener los niveles CRT para una vela histórica específica, ¿podemos simplemente leer la serie de salida del indicador en el índice de esa vela?
Pero tenga en cuenta: las salidas del indicador están alineadas con el índice actual. En realidad, el indicador está graficando el mismo valor para cada barra porque estamos estableciendo:
CRTHigh[index] = crtHigh; // donde crtHigh es el alto de la vela (index - CandleIndex)
Entonces, si estamos en el índice 100 y CandleIndex=1, estamos obteniendo el alto del índice 99 y graficándolo en el índice 100.
Esto significa que si queremos los niveles CRT para la vela que está CandleIndex barras atrás, podemos obtener la salida del indicador en la barra actual (índice) y eso nos dará los niveles de hace CandleIndex barras.
Pero espera, en el cBot, vamos a ejecutar OnBar o OnTick. Nos interesa la barra completada más reciente (índice = MarketSeries.Close.Count - 2) y la vela que queremos es (índice actual - CandleIndex).
Alternativamente, podemos cambiar el indicador para que emita los niveles en el mismo índice que la vela de referencia, pero entonces tendríamos que desplazar el gráfico por CandleIndex.
Sin embargo, el indicador actual está diseñado para graficar los niveles en la barra actual desde una barra anterior. Así que si establecemos CandleIndex=1, entonces en cada barra estamos graficando los niveles de la barra anterior.
Cómo podemos usarlo en el cBot:
Agregaremos el indicador al cBot y luego obtendremos los valores para la barra más reciente (índice = MarketSeries.Close.Count - 1) y eso nos dará los niveles de hace CandleIndex barras.
Ejemplo:
Índice de la barra actual = última barra (índice = MarketSeries.Close.Count - 1)
Entonces la salida del indicador en este índice (CRTHigh[MarketSeries.Close.Count-1]) es el alto de la barra (índice actual - CandleIndex).
Pero tenga en cuenta: el método Calculate del indicador se llama para cada barra histórica y luego para cada nueva barra. Así que la serie de salida para la última barra tendrá el valor que queremos.
Vamos a programar el cBot:
Tendremos parámetros:
[Parameter("Candle Index", DefaultValue = 1, MinValue = 0)]
public int CandleIndex { get; set; }
[Parameter("Trade Type", DefaultValue = TradeType.Buy)]
public TradeType SelectedTradeType { get; set; }
[Parameter("Volume (Lots)", DefaultValue = 1, MinValue = 0.01, Step = 0.01)]
public double Volume { get; set; }
También crearemos una instancia del CRTIndicator.
Pasos en OnBar:
si no hay posición, entonces abrir una nueva posición con el stop loss y take profit establecidos desde la salida del indicador para la barra actual (que corresponde a los niveles de hace CandleIndex barras).
Sin embargo, tenga en cuenta: la salida del indicador para la barra actual (última barra) está establecida en los niveles de (índice de la barra actual - CandleIndex). Pero cuando estamos al principio, debemos asegurarnos de tener suficientes barras.