What sucks it that there are a bunch of bs dependencies in every platform out there - - visual basic and / or VBA can at least get rid of the dependencies. Wealthlab was bought by TDAmeritrade and was already somewhat locked down by those dorks with dotNet, so there goes that code. The modulusfe dot com stuff looks good, but there is a big chunk of cash to get all of the source - - if anyone has some, then modify it accordingly and show us to help accellerate the progress here. Otherwise, I was thinking we could use the code inside of a platform that has visual basic (not dotNet) or visual-basic-like scripting involved. The only one that I have found so far that lets you at least use visual basic to script is Visual Trader, so here is some of their flavor in the next couple of posts...
almost forgot - - visual basic like scripting in tradersstudio as well, but I have not taken the time to try it yet since it does not interface with live data yet... So here is a quick example from traders studio to show why I am excited that visual basic can drop-kick any of the dependencies out there. Sub PrintPerfectProfit (TickValue As Integer) Dim i As Integer Dim PerfectProfit As BarArray Dim PerfectWinnings As BarArray 'Range is a global bararray Print "Perfect Profit for the day"," ", FormatDateTime(D), " ", Range For i = FirstBar To LastBar Step 1 Next PerfectProfit = PerfectProfit + Range PerfectWinnings = PerfectProfit * TickValue Print "Running Total"," ",PerfectProfit Print "PnL"," ","$","",PerfectWinnings End Sub
Dim Period As Double Dim Num As Double Dim Den As Double Dim i As Integer Dim PreviousValue As Double Dim PresentBar As Double Dim value As Double Const Data As Long = 0 Option Explicit Public APP As OscUserApp Implements Indicator Public Sub Indicator_OnInitCalculate() With APP Num = 0 Den = 0 i = 0 PreviousValue = 0 PresentBar = Period - 1 value = 0 .StartBar = Period End With End Sub Public Sub Indicator_OnCalculateBar(ByVal Bar As Long) With APP If .CurrentBar <> PresentBar Then Num = 0 Den = 0 For i = 1 To Period Num = Num + (1 + i) * (.High(i) + .Low(i) / 2) Den = Den + (.High(i) + .Low(i) / 2) Next i If Den <> 0 Then value = -Num / Den End If .SetIndicatorValue value .SetIndicatorValue PreviousValue, 2 PreviousValue = value PresentBar = .CurrentBar End If End With End Sub Public Sub Indicator_OnSetParameters(ParamArray ParamList() As Variant) Period = ParamList(1) End Sub Public Sub Indicator_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 Indicator_OnCalculateBar i i = i + 1 Wend End Sub Private Sub OscUserAppInstance_OnConnection(ByVal Application As OscUserApp, ByVal MTDllInst As Object, Custom() As Variant) Set APP = Application End Sub
Dim Range As Double Dim a As Double Dim c1 As Double Dim c2 As Double Dim c3 As Double Dim c4 As Double Dim res As Double Dim E1Period As Double Dim E2Period As Double Dim E3Period As Double Dim E4Period As Double Dim E5Period As Double Dim E6Period As Double Dim E1PriceSource As Price Dim E2PriceSource As Price Dim E3PriceSource As Price Dim E4PriceSource As Price Dim E5PriceSource As Price Dim E6PriceSource As Price Const Data As Long = 0 Dim E1 As Long Dim E2 As Long Dim E3 As Long Dim E4 As Long Dim E5 As Long Dim E6 As Long Option Explicit Public APP As OscUserApp Implements Indicator Public Sub Indicator_OnInitCalculate() With APP c1 = 0 c2 = 0 c3 = 0 c4 = 0 res = 0 E1Period = Range E2Period = Range E3Period = Range E4Period = Range E5Period = Range E6Period = Range E1PriceSource = 0 E2PriceSource = 0 E3PriceSource = 0 E4PriceSource = 0 E5PriceSource = 0 E6PriceSource = 0 E1 = .GetIndicatorIdentifier(AvExponential, Data, E1Period, E1PriceSource) E2 = .GetIndicatorIdentifier(AvExponential, E1, E2Period, E2PriceSource) E3 = .GetIndicatorIdentifier(AvExponential, E2, E3Period, E3PriceSource) E4 = .GetIndicatorIdentifier(AvExponential, E3, E4Period, E4PriceSource) E5 = .GetIndicatorIdentifier(AvExponential, E4, E5Period, E5PriceSource) E6 = .GetIndicatorIdentifier(AvExponential, E5, E6Period, E6PriceSource) .StartBar = 0 End With End Sub Public Sub Indicator_OnCalculateBar(ByVal Bar As Long) With APP c1 = -(a * a * a) c2 = 3 * a * a + 3 * a * a * a c3 = -6 * a * a - 3 * a - 3 * a * a * a c4 = 1 + 3 * a + a * a * a + 3 * a * a res = c1 * .GetIndicatorValue(E6) + c2 * .GetIndicatorValue(E5) + c3 * .GetIndicatorValue(E4) + c4 * .GetIndicatorValue(E3) .SetIndicatorValue res End With End Sub Public Sub Indicator_OnSetParameters(ParamArray ParamList() As Variant) Range = ParamList(1) a = ParamList(2) End Sub Public Sub Indicator_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 Indicator_OnCalculateBar i i = i + 1 Wend End Sub Private Sub OscUserAppInstance_OnConnection(ByVal Application As OscUserApp, ByVal MTDllInst As Object, Custom() As Variant) Set APP = Application End Sub
Dim TicksNumber As Long Dim OnChangeClose As String Dim LastBar As Double Dim X As Double Dim Ticks() As Double Dim LastClose As Double Dim SymbolCode As String Option Explicit Public APP As OscUserApp Implements Indicator Public Sub Indicator_OnInitCalculate() With APP ReDim Preserve Ticks(TicksNumber) As Double If SymbolCode <> Mid(.GetSymbolInfo(SbiCode, Data, Date), 7, 3) Then For X = 0 To TicksNumber Ticks(X) = NullValue Next X SymbolCode = Mid(.GetSymbolInfo(SbiCode, Data, Date), 7, 3) End If End With End Sub Public Sub Indicator_OnCalculateBar(ByVal Bar As Long) With APP If .CurrentBar = LastBar Then If OnChangeClose = "No" Then For X = TicksNumber To 1 Step -1 Ticks(X) = Ticks(X - 1) Next X Ticks(0) = .Close For X = 0 To TicksNumber If Ticks(X) <> 0 And X < .CurrentBar Then .SetIndicatorValue Ticks(X), 1, X End If Next X Else If .Close <> LastClose Then For X = TicksNumber To 1 Step -1 Ticks(X) = Ticks(X - 1) Next X Ticks(0) = .Close For X = 0 To TicksNumber If Ticks(X) <> 0 And X < .CurrentBar Then .SetIndicatorValue Ticks(X), 1, X End If Next X End If End If End If LastClose = .Close End With End Sub Public Sub Indicator_OnSetParameters(ParamArray ParamList() As Variant) TicksNumber = ParamList(1) OnChangeClose = ParamList(2) End Sub Public Sub Indicator_OnCalculateRange(ByVal StartBar As Long, ByVal FinalBar As Long) LastBar = FinalBar 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 Indicator_OnCalculateBar i i = i + 1 Wend End Sub Private Sub OscUserAppInstance_OnConnection(ByVal Application As OscUserApp, ByVal MTDllInst As Object, Custom() As Variant) Set APP = Application End Sub
Dim X As Double Dim Z As Double Const Data As Long = 0 Option Explicit Public APP As DrwUserApp Implements Study Public Sub Study_OnInitCalculate() With APP X = 0 Z = 0 .StartBar = 0 End With End Sub Public Sub Study_OnCalculateBar(ByVal Bar As Long) With APP X = 0 While .Close(X) > .Close(X + 1) X = X + 1 Wend Z = 0 While .Close(Z) < .Close(Z + 1) Z = Z + 1 Wend If X >= Z Then .PaintBar .Open, .High, .Low, .Close, RGB(0, 0, 255), 0, X - 1, 0 Else .PaintBar .Open, .High, .Low, .Close, RGB(255, 0, 0), 0, Z - 1, 0 End If End With End Sub Public Sub Study_OnSetParameters(ParamArray ParamList() As Variant) End Sub Public Sub Study_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 Study_OnCalculateBar i i = i + 1 Wend End Sub Private Sub DrwUserAppInstance_OnConnection(ByVal Application As DrwUserApp, ByVal MTDllInst As Object, Custom() As Variant) Set APP = Application End Sub
'tick charts vol Dim TicksNumber As Long Dim OnChangeClose As String Dim LastBar As Double Dim X As Double Dim Ticks() As Double Dim LastClose As Double Dim SymbolCode As String Dim LastVolume As Double Dim LastCurrentBar As Double Option Explicit Public APP As OscUserApp Implements Indicator Public Sub Indicator_OnInitCalculate() With APP ReDim Ticks(TicksNumber) As Double If SymbolCode <> Mid(.GetSymbolInfo(SbiCode, Data, Date), 7, 3) Then For X = 0 To TicksNumber Ticks(X) = NullValue Next X SymbolCode = Mid(.GetSymbolInfo(SbiCode, Data, Date), 7, 3) End If End With End Sub Public Sub Indicator_OnCalculateBar(ByVal Bar As Long) With APP If .CurrentBar > LastCurrentBar Then LastVolume = 0 End If If .CurrentBar = LastBar Then If OnChangeClose = "No" Then For X = TicksNumber To 1 Step -1 Ticks(X) = Ticks(X - 1) Next X Ticks(0) = .Volume - LastVolume LastVolume = .Volume For X = 0 To TicksNumber If Ticks(X) <> 0 And X < .CurrentBar Then .SetIndicatorValue Ticks(X), 1, X End If Next X Else If .Close <> LastClose Then For X = TicksNumber To 1 Step -1 Ticks(X) = Ticks(X - 1) Next X Ticks(0) = .Volume - LastVolume LastVolume = .Volume For X = 0 To TicksNumber If Ticks(X) <> 0 And X < .CurrentBar Then .SetIndicatorValue Ticks(X), 1, X End If Next X End If End If End If LastClose = .Close LastCurrentBar = .CurrentBar End With End Sub Public Sub Indicator_OnSetParameters(ParamArray ParamList() As Variant) TicksNumber = ParamList(1) OnChangeClose = ParamList(2) End Sub Public Sub Indicator_OnCalculateRange(ByVal StartBar As Long, ByVal FinalBar As Long) LastBar = FinalBar 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 Indicator_OnCalculateBar i i = i + 1 Wend End Sub Private Sub OscUserAppInstance_OnConnection(ByVal Application As OscUserApp, ByVal MTDllInst As Object, Custom() As Variant) Set APP = Application End Sub
This is just what I was talking about: Traders Studio IS A PLATFORM. The fact that it uses VBA is just a choice. Tradestation's Easy Language would use about 1/2 the amount of code. So VBA, even with Traders Studio is NOT the easiest-to-program platform.
'Trend Tracking Indicator Dim Period As Integer Option Explicit Option Base 1 Dim Z As Integer Dim UpPivotValue As Double Dim UpPivot As Double Dim UpPivotAverage As Double Dim DownPivotAverage As Double Dim DownPivot As Double Dim DownPivotValue As Double Dim LateralBars As Integer Dim PivotNumber As Integer Dim UpFind As Integer Dim DownFind As Integer Dim UpPivotAverageReserve As Double Dim Avg() As Double Dim CommonAvg As Double Dim AvgCounter As Double Dim DefinitiveAvg As Double Dim Inidicator_Value As Double Dim nPeriod As Integer Dim Control_Time As Double Dim Control_Date As Double Dim FinalControl As Boolean Dim Msg, Style, Title, Help, Ctxt, Response, MyString Dim MovilAvg As DataIdentifier Public APP As OscUserApp Implements Indicator Public Sub Indicator_OnInitCalculate() With APP FinalControl = True .StartBar = Period * 20 + 1 nPeriod = Period * 6 PivotNumber = Period - 1 LateralBars = Period DefinitiveAvg = 0 Inidicator_Value = 0 CommonAvg = 0 Control_Time = 0 Control_Date = 0 MovilAvg = .GetIndicatorIdentifier(AvSimple, Data, 3, PriceClose) ReDim Avg(nPeriod) AvgCounter = 1 ' Controls if the value introduced in Period is within the allowed rank If Period <= 1 Or Period > 10 Then Msg = "It has introduced a value for Period not between 1 and 10, do you want to continue calculating this indicator?" ' Define message. Style = vbOKCancel + vbCritical + vbDefaultButton2 ' Define buttons. Title = "Error of Parameter" ' Define title. Ctxt = 1000 ' Define topic ' context. ' Display message. Response = MsgBox(Msg, Style, Title, Help, Ctxt) If Response = vbCancel Then FinalControl = False End If End If End With End Sub Public Sub Indicator_OnCalculateBar(ByVal Bar As Long) With APP UpPivotAverage = 0 DownPivotAverage = 0 UpFind = 0 DownFind = 0 For Z = 1 To PivotNumber DownPivot = .GetSwingLow(Data, Z, PriceLow, LateralBars, Period * 20) UpPivot = .GetSwingHigh(Data, Z, PriceHigh, LateralBars, Period * 20) If UpPivot <> NullValue Then UpPivotAverage = UpPivotAverage + UpPivot UpFind = UpFind + 1 End If If DownPivot <> NullValue Then DownPivotAverage = DownPivotAverage + DownPivot DownFind = DownFind + 1 End If Next Z UpPivotAverage = UpPivotAverage / UpFind DownPivotAverage = DownPivotAverage / DownFind If .High > UpPivotAverage Then CommonAvg = DownPivotAverage End If If .Low < DownPivotAverage Then CommonAvg = UpPivotAverage End If If .CurrentBar = .StartBar Then For Z = 1 To nPeriod Avg(Z) = CommonAvg Next Z End If If .Time > Control_Time Or .Date > Control_Date Then If AvgCounter <= nPeriod Then Avg(AvgCounter) = CommonAvg AvgCounter = AvgCounter + 1 Else AvgCounter = 1 Avg(AvgCounter) = CommonAvg AvgCounter = AvgCounter + 1 End If Control_Time = .Time Control_Date = .Date End If DefinitiveAvg = 0 For Z = 1 To nPeriod DefinitiveAvg = DefinitiveAvg + Avg(Z) Next Z DefinitiveAvg = DefinitiveAvg / nPeriod Inidicator_Value = .GetIndicatorValue(MovilAvg) - DefinitiveAvg .SetIndicatorValue Inidicator_Value, 1 .SetIndicatorValue 0, 2 End With End Sub Public Sub Indicator_OnSetParameters(ParamArray ParamList() As Variant) Period = ParamList(1) End Sub Public Sub Indicator_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 And FinalControl APP.CurrentBar = i Indicator_OnCalculateBar i i = i + 1 Wend End Sub Private Sub OscUserAppInstance_OnConnection(ByVal Application As OscUserApp, ByVal MTDllInst As Object, Custom() As Variant) Set APP = Application End Sub
Visual Basic for Applications and Visual Basic (not dotNet) is less of a hassle - - whatever platform, just less proprietary BS... Tradestation does not even let you do intrabar arrow indicators...