No me es posible establecer un valor para (EntryAgo). Solo admite un valor en el momento que se selecciona dicha función. ¿No es posible asignar este valor de EntryAgo a una variable y que éste pueda variar? Por ejemplo, para unas veces me interesará cual es la ganancia en el negocio actual (EntryAgo=0) y para otras cual ha sido en el anterior (EntryAgo=1) y para otras en el antepenúltimo (EntryAgo=2). Al activar parámetros de la función (Activar EntryAgo como parámetro para que pueda cambiar de valor) da error.
s2
Ayuda sobre GetPositionProfit de Visual Chart....
Ayuda sobre GetPositionProfit de Visual Chart....
No por mucho madrugar amanece más temprano
-
- Mensajes: 44
- Registrado: 12 Jun 2006 12:02
- Ubicación: Barcelona
-
- Mensajes: 25
- Registrado: 27 May 2006 00:51
Hola elchavo:
He hecho un apaño que te puede resolver el problema. Se trata de una
clase que almacena los valores que le pasas y te los devuelve según
el índice que le pidas.
Su uso es muy fácil aunque su "puesta en marcha" sea un poco engorrosa la
primera vez.
Tienes que agregar al proyecto de VBA una clase a la que llamarás "clsValuesBag" y depués le pegas el siguiente código:
'// ***************************************************************
Option Explicit
Public MaxValues As Long
Dim ValuesBag As New Collection
Public Sub AddValue(ByVal pvarValue)
'// Añade valores a la colección
'// El último elemento que se añade es el primero accesible,
'// desplazando los existentes hacia abajo
If ValuesBag.Count Then
ValuesBag.Add pvarValue, , 1
Else
ValuesBag.Add pvarValue
End If
'// Si se alcanza el número máximo de valores permitido
'// se elimina el elemento más antiguo.
If ValuesBag.Count > MaxValues Then
ValuesBag.Remove ValuesBag.Count
End If
End Sub
Public Function GetValue(Optional plngIndex As Long)
'// Devuelve los valores de la colección.
'// Si no se le pasa ningún parámetro,
'// devuelve siempre el elemento añadido más reciente
If IsMissing(plngIndex) Then
GetValue = ValuesBag(1)
Else
If plngIndex < MaxValues Then
GetValue = ValuesBag(plngIndex + 1)
End If
End If
End Function
Private Sub Class_Initialize()
'// Por defecto el número máximo de valores
'// que almacena es de 300
MaxValues = 300
End Sub
Private Sub Class_Terminate()
Set ValuesBag = Nothing
End Sub
'// ***************************************************************
Hasta aquí el código de la clase.
Para su uso tienes que declarar en el módulo del proyecto, una variable con el nombre que quieras por ejemplo:
Dim myGetPositionProfit as new clsValuesBag
Después tienes que ir pasándole los valores que quieras almacenar de la siguiente forma:
myGetPositionProfit.AddValue "el valor que quieras añadir"
Esto debes hacerlo en el procedimiento OnCalculateBar del módulo de la estrategia.
Para luego saber el valor de X barras hacia atrás lo puedes hacer usando:
"el valor que quieras sabe" = myGetPositionProfit.GetValue( X )
Si no le pasas ningún valor, o le pasas 0, te devuelve siempre el último valor añadido.
El número máximo de valores que puede almacenar es por defecto 300 para ahorrar memoria, pero lo puedes modificar con la propiedad MaxValues.
Los valores se almacenan en variables tipo variant porque no se qué valores vasa usar, pero los puedes convertir a enteros, dobles, etc.
Espero que te sirva y entiendo que te pueda resultar un poco lioso, así que si tienes pegas, me comentas.
Un saludo
He hecho un apaño que te puede resolver el problema. Se trata de una
clase que almacena los valores que le pasas y te los devuelve según
el índice que le pidas.
Su uso es muy fácil aunque su "puesta en marcha" sea un poco engorrosa la
primera vez.
Tienes que agregar al proyecto de VBA una clase a la que llamarás "clsValuesBag" y depués le pegas el siguiente código:
'// ***************************************************************
Option Explicit
Public MaxValues As Long
Dim ValuesBag As New Collection
Public Sub AddValue(ByVal pvarValue)
'// Añade valores a la colección
'// El último elemento que se añade es el primero accesible,
'// desplazando los existentes hacia abajo
If ValuesBag.Count Then
ValuesBag.Add pvarValue, , 1
Else
ValuesBag.Add pvarValue
End If
'// Si se alcanza el número máximo de valores permitido
'// se elimina el elemento más antiguo.
If ValuesBag.Count > MaxValues Then
ValuesBag.Remove ValuesBag.Count
End If
End Sub
Public Function GetValue(Optional plngIndex As Long)
'// Devuelve los valores de la colección.
'// Si no se le pasa ningún parámetro,
'// devuelve siempre el elemento añadido más reciente
If IsMissing(plngIndex) Then
GetValue = ValuesBag(1)
Else
If plngIndex < MaxValues Then
GetValue = ValuesBag(plngIndex + 1)
End If
End If
End Function
Private Sub Class_Initialize()
'// Por defecto el número máximo de valores
'// que almacena es de 300
MaxValues = 300
End Sub
Private Sub Class_Terminate()
Set ValuesBag = Nothing
End Sub
'// ***************************************************************
Hasta aquí el código de la clase.
Para su uso tienes que declarar en el módulo del proyecto, una variable con el nombre que quieras por ejemplo:
Dim myGetPositionProfit as new clsValuesBag
Después tienes que ir pasándole los valores que quieras almacenar de la siguiente forma:
myGetPositionProfit.AddValue "el valor que quieras añadir"
Esto debes hacerlo en el procedimiento OnCalculateBar del módulo de la estrategia.
Para luego saber el valor de X barras hacia atrás lo puedes hacer usando:
"el valor que quieras sabe" = myGetPositionProfit.GetValue( X )
Si no le pasas ningún valor, o le pasas 0, te devuelve siempre el último valor añadido.
El número máximo de valores que puede almacenar es por defecto 300 para ahorrar memoria, pero lo puedes modificar con la propiedad MaxValues.
Los valores se almacenan en variables tipo variant porque no se qué valores vasa usar, pero los puedes convertir a enteros, dobles, etc.
Espero que te sirva y entiendo que te pueda resultar un poco lioso, así que si tienes pegas, me comentas.
Un saludo
Mil gracias Developer. Siento el trabajo que te has tomado para poner todo esto, pero yo lo decía para el entorno visual, no para visual basic.
Parece ser que el problema es que no lo tienen implementado los de VChart en el entorno visual y que no hay nada que hacer. Quería saber si alguno, en este entorno sencillo de programación, lo había conseguido de alguna forma.
Gracias otra vez.
Parece ser que el problema es que no lo tienen implementado los de VChart en el entorno visual y que no hay nada que hacer. Quería saber si alguno, en este entorno sencillo de programación, lo había conseguido de alguna forma.
Gracias otra vez.
No por mucho madrugar amanece más temprano
-
- Mensajes: 25
- Registrado: 27 May 2006 00:51
Si te ha gustado este hilo del Foro, ¡compártelo en redes!