Es mi primer mensaje en el foro y , aunque de programación en v. chart más bien poco, voy a probar a ver si puedo ayudar a karma21sl.
Si dejas el código como aparece aquí el sistema está comprando cuando hay un cruce de medias ,el problema es que durante una barra las medias pueden cruzarse varias veces y generar un monton de operaciones antes de que cierre esa barra :
'¡¡ Parameters
'Parameters !!
'¡¡ PDV parameters
Dim AvSimpleDataPeriodo As Long '30
Dim AvSimple1DataPeriodo As Long '100
Const Data As Long = 0
Const Data1 As Long = 1
'PDV parameters !!
'¡¡ PDV declarations
Dim AvSimpleData As Long
Dim AvSimple1Data As Long
'PDV declarations !!
Public APP As SysUserApp
Implements System
Public Sub System_OnInitCalculate()
With APP
'¡¡ PDV initializations
AvSimpleData = .GetIndicatorIdentifier(AvSimple, Data, AvSimpleDataPeriodo, PriceClose)
AvSimple1Data = .GetIndicatorIdentifier(AvSimple, Data, AvSimple1DataPeriodo, PriceClose)
.StartBar = 0
'PDV initializations !!
End With
End Sub
Public Sub System_OnCalculateBar(ByVal Bar As Long)
With APP
'¡¡ PDV code
If .GetIndicatorValue(AvSimpleData) >= .GetIndicatorValue(AvSimple1Data) Then
.Buy AtClose, 1
Else
.Sell AtClose, 1
End If
'PDV code !!
End With
End Sub
Public Sub System_OnSetParameters(ParamArray ParamList() As Variant)
'¡¡ Parameters initialization
AvSimpleDataPeriodo = ParamList(1)
AvSimple1DataPeriodo = ParamList(2)
'Parameters initialization !!
End Sub
Public Sub System_OnCalculateRange(ByVal StartBar As Long, ByVal FinalBar As Long)
Dim i As Long
i = APP.StartBar
If StartBar > i Then
i = StartBar
End If
While Not APP.ShouldTerminate And i <= FinalBar
APP.CurrentBar = i
System_OnCalculateBar i
i = i + 1
Wend
End Sub
Private Sub SysUserAppInstance_OnConnection(ByVal Application As SysUserApp, ByVal MTDllInst As Object, Custom() As Variant)
Set APP = Application
End Sub ""
Para evitarlo, el código debería ser algo parecido a ésto:
"If .GetIndicatorValue(AvSimpleData) > .GetIndicatorValue(AvSimple1Data) and GetIndicatorValue(AvSimpleData, 1) < .GetIndicatorValue(AvSimple1Data, 1)
.Buy atClose
else
.Sell atClose
end if
end if"
De esta forma lo que le estas diciendo al sistema es que si en la barra actual la media corta es mayor que la larga y en la barra anterior la media corta es menor que la larga, pues eso, que compre al cierre DE LA SIGUIENTE BARRA.
No se si me habré explicado bien con tanto corto y largo
![Very Happy :D](./images/smilies/icon_biggrin.gif)
. Lo de los stops es otra historia y me parece que ya te han dado una solución por ahí
Suerte