Creación de un indicador
La creación de un indicador propio en la API se describe en la sección Indicador personalizado. Estos indicadores son totalmente compatibles con Designer.
Para crear un indicador, en el panel Esquema debe seleccionar la carpeta Indicadores, hacer clic con el botón derecho y seleccionar Añadir en el menú contextual:

El código del indicador tendrá este aspecto:
/// <summary>
/// Indicador de ejemplo que demuestra cómo guardar y cargar parámetros.
/// Cambia el precio de entrada en +20% o -20%.
///
/// Vea más ejemplos:
/// https://github.com/StockSharp/StockSharp/tree/master/Algo/Indicators
///
/// Documentación:
/// https://doc.stocksharp.com/topics/designer/strategies/using_code/fsharp/create_own_indicator.html
/// </summary>
type EmptyIndicator() as this =
inherit BaseIndicator()
// Campos internos
let mutable changeValue = 20
let mutable counter = 0
let mutable isFormedValue = false
/// <summary>
/// Valor porcentual (+/-) usado para modificar el precio de entrada.
/// </summary>
member this.Change
with get () = changeValue
and set value =
changeValue <- value
this.Reset()
/// <summary>
/// Define si el indicador se ha formado (quedó listo para trading).
/// </summary>
override this.CalcIsFormed() = isFormedValue
/// <summary>
/// Restablece el indicador a su estado inicial.
/// </summary>
override this.Reset() =
base.Reset()
isFormedValue <- false
counter <- 0
/// <summary>
/// Lógica principal para procesar valores de entrada.
/// </summary>
override this.OnProcess(input: IIndicatorValue) : IIndicatorValue =
// cada décima llamada intenta devolver un valor "vacío"
if RandomGen.GetInt(0, 10) = 0 then
// el valor vacío aún contiene solo tiempo, sin datos reales
DecimalIndicatorValue(this, input.Time)
else
// incrementar contador en cada llamada
counter <- counter + 1
// después de 5 entradas, el indicador se considera formado
if counter = 5 then
isFormedValue <- true
let mutable value = input.ToDecimal()
// cambio aleatorio por un factor de +/- Change%
let randomFactor = decimal (RandomGen.GetInt(-changeValue, changeValue)) / 100m
value <- value + (value * randomFactor)
// devolver valor final del indicador
let result = DecimalIndicatorValue(this, value, input.Time)
// marcarlo aleatoriamente como final o no
result.IsFinal <- RandomGen.GetBool()
result
/// <summary>
/// Cargar configuración del indicador desde un <see cref="SettingsStorage"/> dado.
/// </summary>
override this.Load(storage: SettingsStorage) =
base.Load(storage)
this.Change <- storage.GetValue<int>(nameof(this.Change))
/// <summary>
/// Guardar configuración del indicador en un <see cref="SettingsStorage"/> dado.
/// </summary>
override this.Save(storage: SettingsStorage) =
base.Save(storage)
storage.SetValue(nameof(this.Change), this.Change)
/// <summary>
/// Representación de cadena que incluye el valor actual de <see cref="Change"/>.
/// </summary>
override this.ToString() =
sprintf "Change: %d" this.Change
Este indicador recibe un valor entrante y realiza una desviación arbitraria según el valor establecido del parámetro Cambio.
La descripción de los métodos del indicador está disponible en la sección Indicador personalizado.
Para añadir el indicador creado al diagrama, debe usar el cubo Indicador y especificar en él el indicador necesario:

El parámetro Cambio, establecido previamente en el código del indicador, se muestra en el panel de propiedades.
Warning
Los indicadores creados con código F# no pueden usarse en estrategias creadas con código F#. Solo pueden usarse en estrategias creadas a partir de cubos.