Crear su propio cubo
De forma similar a la creación de un cubo a partir de un diagrama, puede crear su propio cubo basado en código F#. Este cubo será más funcional que un cubo creado a partir de un diagrama.
Para crear un cubo desde código, debe crearse en la carpeta Elementos propios:

En el ejemplo que se muestra a continuación, el cubo hereda de la clase DiagramExternalElement y tiene este aspecto:
/// <summary>
/// Elemento de diagrama de ejemplo que demuestra el uso de sockets de entrada y salida.
///
/// Vea más detalles:
/// https://doc.stocksharp.com/topics/designer/strategies/using_code/fsharp/creating_your_own_cube.html
/// </summary>
type EmptyDiagramElement() as this =
inherit DiagramExternalElement()
// Propiedad de ejemplo que muestra cómo crear parámetros
let minValueParam =
this.AddParam<int>("MinValue", 10)
.SetBasic(true) // hacer visible el parámetro en modo básico
.SetDisplay("Parámetros", "Valor mínimo", "Descripción del parámetro de valor mínimo", 10)
// Los sockets de salida son eventos marcados con el atributo DiagramExternal
let output1Event = new Event<Unit>()
let output2Event = new Event<Unit>()
[<CLIEvent>]
[<DiagramExternal>]
member this.Output1 = output1Event.Publish
[<CLIEvent>]
[<DiagramExternal>]
member this.Output2 = output2Event.Publish
// Descomente la siguiente propiedad si desea que el método Process
// se llame cada vez que se recibe un nuevo argumento
// (no es necesario esperar a recibir todos los argumentos de entrada).
//
// sobrescribir this.WaitAllInput
// with get () = false
// Los sockets de entrada son parámetros de método marcados con el atributo DiagramExternal
[<DiagramExternal>]
member this.Process(candle: CandleMessage, diff: Unit) =
let res = candle.ClosePrice + diff
if diff >= minValueParam.Value then
// Activar el primer evento de salida
output1Event.Trigger(res)
else
// Activar el segundo evento de salida
output2Event.Trigger(res)
override this.Start() =
base.Start()
// Añadir lógica antes del inicio si es necesario
override this.Stop() =
base.Stop()
// Añadir lógica después de detener si es necesario
override this.Reset() =
base.Reset()
// Añadir lógica para restablecer el estado interno si es necesario
En este código, el cubo tiene dos sockets de entrada y dos sockets de salida. Los sockets de entrada se definen aplicando el atributo DiagramExternalAttribute al método:
[<DiagramExternal>]
member this.Process(candle: CandleMessage, diff: Unit) =
Los sockets de salida se definen aplicando el atributo a un evento. En el ejemplo del cubo hay dos eventos de este tipo:
let output1Event = new Event<Unit>()
let output2Event = new Event<Unit>()
[<CLIEvent>]
[<DiagramExternal>]
member this.Output1 = output1Event.Publish
[<CLIEvent>]
[<DiagramExternal>]
member this.Output2 = output2Event.Publish
Por lo tanto, también habrá dos sockets de salida.
Además, se muestra cómo crear una propiedad para el cubo:
let minValueParam =
this.AddParam<int>("MinValue", 10)
.SetBasic(true) // hacer visible el parámetro en modo básico
.SetDisplay("Parámetros", "Valor mínimo", "Descripción del parámetro de valor mínimo", 10)
El uso de la clase DiagramElementParam aplica automáticamente el enfoque para guardar y restaurar la configuración.
La propiedad Valor mínimo está marcada como básica y será visible en el modo de propiedades básicas.
La propiedad comentada WaitAllInput es responsable del momento de llamada del método con sockets de entrada:
// sobrescribir this.WaitAllInput
// with get () = false
Si se descomenta, el método Proceso se llamará siempre en cuanto llegue al menos un valor (en el ejemplo, una vela o un valor numérico).
Para añadir el cubo resultante al diagrama, debe seleccionar el cubo creado en la paleta, en la sección Elementos propios:

Warning
Los cubos 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.