## New version 18 available now

Subscription & data-feed pricing Class schedule

Margin rates Stock & option commissions

 Debugging Support Rate this Topic:
 Previous Topic · Next Topic Watch this topic · Print this topic ·
danielbender
 Posted : Tuesday, November 05, 2013 11:28:33 AM
Platinum Customer

Joined: 1/14/2006
Posts: 427

Bruce

I need some help debugging the attached code.   Take GMCR for example.  On 2/1/2007 the code identifies a gap greater than 2%, its first gap, ie. gapnumber = 1..  The intent is to keep track of the number of days &ldquo;sincegap(1)&rdquo; that the gapnumber 1 remains open, ie. the number of days the stock remains above the high price on the day prior to February 1.  The problem I am having is that &ldquo;sincegap(1) never goes above 1, even though thegapnumber 1 should remain open until 2/27/2007.  Thus sincegap(1) should be incrementing itself by one day for each of the 26 days between the gap open and close dates (2/1 through 2/27).  I need  another set of eyes to help me identify the fault in my logic.

Thanks&hellip;. Dan

'# Cumulative
'# OutputType = UserInput.Integer = 1
' Type 1 = gap size and percent of closure / Type 2 = bars since gap and % HoD close
'# MinGapPerc = UserInput.Single = 2
' Default setting for watchlist is currently 1%
'# GapType = UserInput.Integer = 1
' Type 1 = up gap / Type 2 = down gap

Dim gap(50) As Single
Dim sinceGap(50) As Integer
Dim gapclosed(50) As Integer
Static sign As Integer
Static gapnumber As Integer
Dim Gapretrace(50) As Single
Dim PrMnLowSncGap(50) As Single
Static PrMxHighSncGap(50) As Single
Dim outputgapnumber As Integer

' New Gap logic required to handle prior gaps
If isFirstBar Then
gap(1) = Single.NaN
gapretrace(1) = Single.NaN
' sinceGap(1) = 0
gapnumber = 0
gapclosed(1) = 1
PrMxHighSncGap(1) = 0
PrMnLowSncGap(1) = 0
Else If (1 - Price.High / Price.Low(1)) >= MinGapPerc / 100 And Price.High < Price.Low(1) Then
gapnumber = gapnumber + 1
gap(gapnumber) = -100 * (1 - Price.High / Price.Low(1)) ' new gap down logic
sinceGap(gapnumber) = 0 ' Revision 1
gapclosed(gapnumber) = 0
Else If (Price.Low / Price.High(1) - 1) >= MinGapPerc / 100 And Price.High(1) < Price.Low Then
gapnumber = gapnumber + 1
gap(gapnumber) = 100 * (Price.Low / Price.High(1) - 1) ' new gap up logic
sinceGap(gapnumber) = 0 ' Revision 1
gapclosed(gapnumber) = 0
End If
'Label = sincegap(1)
'Label = Sincegap(1)=0
'Label = gapclosed(1)=0
'Label = gapnumber '= 1 continuously
'Label = price.low

For i As Integer = 1 To System.Math.Max(gapnumber, 1)  'Increments Sincegap here
If Gapnumber = 0 Then
Exit For
Else If Gapclosed(i) = 0 Then
'sinceGap(i) += 1
'Label = sincegap(1)=0
'label = gapclosed(1)=0
sincegap(i) = sincegap(i) + 1
'Label = Sincegap(1) = 1
End If
Next
'Label = sincegap(1)=1

' Code Speedup stuff to replace Price.MaxHigh(sincegap)and Price.MinLow(sincegap)
For i As Integer = 1 To System.Math.Max(gapnumber, 1)
If Gapnumber = 0 Then Exit For
If gapclosed(i) = 0 Then
If sincegap(i) = 0 Then
PrMxHighSncGap(i) = Price.High
PrMnLowSncGap(i) = Price.Low
Else If sincegap(i) = 1 Then
PrMxHighSncGap(i) = Price.High
PrMnLowSncGap(i) = Price.Low
Else If sincegap(i) > 1 Then
If Price.High > PRMxHighSncGap(i) Then PrMxHighSncGap(i) = Price.High
If Price.Low < PrMnLowSncGap(i) Then PrMnLowSncGap(i) = Price.low
End If
End If
Next

' Current Gap Closed (If close, reset sincegap zero)
For i As Integer = 1 To System.Math.Max(gapnumber, 1)
If gapnumber = 0 Then Exit For
If gap(i) < 0 And PrMxHighSncGap(i) > Price.Low(sincegap(i) + 1 - 1) Then
sincegap(i) = 0 ' gap down closed
gap(i) = 0
gapclosed(i) = 1
Else If gap(i) > 0 And PrMnLowSncGap(i) < Price.High(sincegap(i) + 1 - 1) Then
sincegap(i) = 0 ' gap up closed
gap(i) = 0
gapclosed(i) = 1
End If
Next
'Label = PrMnLowSncGap(1)
'Label = Price.High(sincegap(1))
'Label = gapclosed(1)=0
'Label = sincegap(1)=1

Plot = sincegap(1)
Bruce_L
 Posted : Tuesday, November 05, 2013 11:32:18 AM

Worden Trainer

Joined: 10/7/2004
Posts: 63,025

While I am not a programmer and am not really qualified to do debugging, I will both take a look at your code and run it to try and figure out what is happening. I will do my best to see if I can figure out a way to get it to do what you want.

-Bruce
Personal Criteria Formulas
TC2000 Support Articles
danielbender
 Posted : Tuesday, November 05, 2013 12:11:28 PM
Platinum Customer

Joined: 1/14/2006
Posts: 427

Bruce - you may not be a programmer, but you could fool me.  Based on my experieince, your coding is terrific - efficient and creative.  As far as debugging, I have no doubt you can pinpoint my coding issue(s).  I also have no doubt that you can improve/optimize my code as well.   Thanks again.  Dan

jas0501
 Posted : Tuesday, November 05, 2013 8:18:24 PM
Registered User
Joined: 12/31/2005
Posts: 2,499

This might be it:: Accidental comment
'sinceGap(i) += 1

For i As Integer = 1 To System.Math.Max(gapnumber, 1)  'Increments Sincegap here
If Gapnumber = 0 Then
Exit For
Else If Gapclosed(i) = 0 Then
'sinceGap(i) += 1
'Label = sincegap(1)=0
'label = gapclosed(1)=0
sincegap(i) = sincegap(i) + 1
'Label = Sincegap(1) = 1
End If
Next
'Label = sincegap(1)=1

1. Avoid divides and multiplies when possible.
Replace MinGapPerc / 100 with gapSize

Dim gapSize as single

If isfirstbar
gapSize = MinGapPerc / 100
...
...
Else If (1 - Price.High / Price.Low(1)) >= gapSize And Price.High < Price.Low(1) Then

========================================

2. The only way the gapSize can be statisfied is if Price.High < Price.Low(1)  so you don't need to check if High is less than yesterday's low yielding a simplified expression

Else If (1 - Price.High / Price.Low(1)) >= gapSize then

danielbender
 Posted : Tuesday, November 05, 2013 10:36:05 PM
Platinum Customer

Joined: 1/14/2006
Posts: 427

Bruce,

Eliminating the "accidental comment"

 'sinceGap(i) += 1

does not correct the issue of sincegap(i) getting stuck at 1.0 (not incrementing by 1 for each additional day since the initial gap).  Any other thoughts??????  For the ife of me, I cannot find my logic error.

By the way, thanks for the optimization suggestions.

Dan

Bruce_L
 Posted : Wednesday, November 06, 2013 9:17:37 AM

Worden Trainer

Joined: 10/7/2004
Posts: 63,025

The suggestions by jas0501 are actually from another customer who is quite good at writing RealCode. I have personally found previous suggestions to be quite helpful.

I have looked at, run and made some optimizations to your RealCode. I will post what I have so far, but there aren't actually calculations for all of the variables yet and some of the calculations which are made are not used. I probably won't make any additional changes without some feedback from you as I did not completely understand what your intent might be with some of the RealCode.

Are you interested in the RealCode working with symbols which might have negative values such as some index values? I ask because it makes a difference as to if we should implement one of the optimizations suggested by jas0501.

``````'# Cumulative
'# OutputType = UserInput.Integer = 1
' Type 1 = gap size and percent of closure / Type 2 = bars since gap and % HoD close
'# MinGapPerc = UserInput.Single = 2
' Default setting for watchlist is currently 1%
'# GapType = UserInput.Integer = 1
' Type 1 = up gap / Type 2 = down gap

Static gap As New List(Of Single)
Static gapUp As New List(Of Boolean)
Static gapBar As New List(Of Integer)
Static gapClose As New List(Of Integer)
Static gapRetrace As New List(Of Single)
Static gapMax As New List(Of Single)
Static gapMin As New List(Of Single)

' New Gap logic required to handle prior gaps
If isFirstBar Then
gap.Clear
gapUp.Clear
gapBar.Clear
gapClose.Clear
gapRetrace.Clear
gapMax.Clear
gapMin.Clear
Else If Price.High < Price.Low(1) AndAlso _
Price.High <= Price.Low(1) * (1 - MinGapPerc / 100) Then
gap.Add(-100 * (1 - Price.High / Price.Low(1))) ' new gap down logic
Else If Price.Low > Price.High(1) AndAlso _
Price.Low >= Price.High(1) * (1 + MinGapPerc / 100) Then
gap.Add(100 * (Price.Low / Price.High(1) - 1)) ' new gap up logic
End If
If gap.Count > 0 Then
For i As Integer = 0 To gap.Count - 1
If gapClose(i) = 0 Then
gapMax(i) = System.Math.Max(gapMax(i), Price.High)
gapMin(i) = System.Math.Min(gapMin(i), Price.Low)
If gapUp(i) = True Then
If gapMin(i) < Price.High(CurrentIndex - gapBar(i) + 1) Then
gapClose(i) = CurrentIndex
Label = "Gap " & i + 1 & " Closed " & CurrentIndex - gapBar(i) + 1 & " Up"
End If
Else
If gapMax(i) > Price.Low(CurrentIndex - gapBar(i) + 1) Then
gapClose(i) = CurrentIndex
Label = "Gap " & i + 1 & " Closed " & CurrentIndex - gapBar(i) + 1 & " Down"
End If
End If
Plot = CurrentIndex - gapBar(gapBar.Count - 1) + 1
Else
Plot = 0
End If
Next
Else
Plot = 0
End If

If isLastBar Then
gap.Clear
gapUp.Clear
gapBar.Clear
gapClose.Clear
gapRetrace.Clear
gapMax.Clear
gapMin.Clear
End If``````

-Bruce
Personal Criteria Formulas
TC2000 Support Articles
danielbender
 Posted : Wednesday, November 06, 2013 12:52:20 PM
Platinum Customer

Joined: 1/14/2006
Posts: 427

Bruce

Wow.  Impressive.

Regarding the unused variables - they are referenced in some code I did not provide in my initial post.  Here is the entire indicator code that includes use of "Retrace" and other output variables.

Thanks.... Dan

+++++++++++

'# Cumulative
'# OutputType = UserInput.Integer = 2
' Type 1 = gap size and percent of closure / Type 2 = bars since gap and % HoD close
'# MinGapPerc = UserInput.Single = 2
' Default setting for watchlist is currently 1%
'# GapType = UserInput.Integer = 2
' Type 1 = up gap / Type 2 = down gap

Dim gap(50) As Single
Dim sinceGap(50) As Integer
Dim gapclosed(50) As Integer
Static sign As Integer
Static gapnumber As Integer
Dim Gapretrace(50) As Single
Dim PrMnLowSncGap(50) As Single
Static PrMxHighSncGap(50) As Single
Dim outputgapnumber As Integer

' New Gap occurred (logic only handles recent gaps)
' NEW LOGIC RQRD: Dim(20), gap(i), sincegap(i), sincegapclosed(i), PrMxHighSncGgap(i), PRMxLowSncGap(i)
If isFirstBar Then
gap(1) = Single.NaN
gapretrace(1) = Single.NaN
' sinceGap(1) = 0
gapnumber = 0
gapclosed(1) = 1
PrMxHighSncGap(1) = 0
PrMnLowSncGap(1) = 0
Else If (1 - Price.High / Price.Low(1)) >= MinGapPerc / 100 And Price.High < Price.Low(1) Then
gapnumber = gapnumber + 1
gap(gapnumber) = -100 * (1 - Price.High / Price.Low(1)) ' new gap down logic
sinceGap(gapnumber) = 0 ' Revision 1
gapclosed(gapnumber) = 0
Else If (Price.Low / Price.High(1) - 1) >= MinGapPerc / 100 And Price.High(1) < Price.Low Then
gapnumber = gapnumber + 1
gap(gapnumber) = 100 * (Price.Low / Price.High(1) - 1) ' new gap up logic
sinceGap(gapnumber) = 0 ' Revision 1
gapclosed(gapnumber) = 0
End If
'Label = sincegap(1)
'Label = Sincegap(1)=0
'Label = gapclosed(1)=0
'Label = gapnumber '= 1 continuously
'Label = price.low

For i As Integer = 1 To System.Math.Max(gapnumber, 1)  'NOT INCREMENTING SinceGAp ???? WHY NOT ?????????? GAPCLOSED(i) = 0 ???? GAP(i) RESET TO ZERO AFTER FIRST BAR?????
If Gapnumber = 0 Then
Exit For
Else If Gapclosed(i) = 0 Then
'sinceGap(i) += 1
'Label = sincegap(1)=0
'label = gapclosed(1)=0
sincegap(i) = sincegap(i) + 1
'Label = Sincegap(1) = 1
End If
Next
'Label = sincegap(1)=1

' Code Speedup stuff to replace Price.MaxHigh(sincegap)and Price.MinLow(sincegap)
For i As Integer = 1 To System.Math.Max(gapnumber, 1)
If Gapnumber = 0 Then Exit For
If gapclosed(i) = 0 Then
If sincegap(i) = 0 Then
PrMxHighSncGap(i) = Price.High
PrMnLowSncGap(i) = Price.Low
Else If sincegap(i) = 1 Then
PrMxHighSncGap(i) = Price.High
PrMnLowSncGap(i) = Price.Low
Else If sincegap(i) > 1 Then
If Price.High > PRMxHighSncGap(i) Then PrMxHighSncGap(i) = Price.High
If Price.Low < PrMnLowSncGap(i) Then PrMnLowSncGap(i) = Price.low
End If
End If
Next

' Current Gap Closed / sincegap reset to zero
For i As Integer = 1 To System.Math.Max(gapnumber, 1)
If gapnumber = 0 Then Exit For
If gap(i) < 0 And PrMxHighSncGap(i) > Price.Low(sincegap(i) + 1 - 1) Then
sincegap(i) = 0 ' gap down closed
gap(i) = 0
gapclosed(i) = 1
Else If gap(i) > 0 And PrMnLowSncGap(i) < Price.High(sincegap(i) + 1 - 1) Then
sincegap(i) = 0 ' gap up closed
gap(i) = 0
gapclosed(i) = 1
End If
Next
'Label = PrMnLowSncGap(1)
'Label = Price.High(sincegap(1))
'Label = gapclosed(1)=0
'Label = sincegap(1)=1

' Calculate Gap retracement
For i As Integer = 1 To System.Math.Max(gapnumber, 1)
If gapnumber = 0 Then Exit For
If sincegap(i) > 0 AndAlso gapclosed(i) = 0 Then
If gap(i) < 0 And PrMxHighSncGap(i) < Price.Low(sincegap(i) + 1 - 1)Then ' gap down logic
If sincegap(i) = 1 Then
Gapretrace(i) = (price.Last - price.low) / (price.Low(sincegap(i)) - price.high) 'Gap Day >> Use Open instead of high ??
Else
Gapretrace(i) = (Price.Last - Price.High(sinceGap(i) - 1)) / _
(Price.Low(sinceGap(i) + 1 - 1) - Price.High(sinceGap(i) - 1))  ' Note: *** Might want to use Price.high instead of price.last
End If
Else If gap(i) > 0 And PrMnLowSncGap(i) > Price.High(sincegap(i) + 1 - 1)Then ' gap up logic
If sincegap(i) = 1 Then
Gapretrace(i) = -(price.Last - price.high) / (price.High(sincegap(i)) - price.Low) 'Gap Day >> Use Open instead of Low??
Else
Gapretrace(i) = -(Price.Last - Price.Low(sinceGap(i) - 1)) / _
(Price.High(sinceGap(i) + 1 - 1) - Price.Low(sinceGap(i) - 1))   ' Note: *** Might want to use Price.low instead of price.last
End If
Else
Gapretrace(i) = 0 ' Put Continuation logic here >> do I want Abs% from gap or relative% from gap (based on gap size)??? Want consistency for easy analysis.
End If
End If
Next

' Find most recent unclosed gap
Outputgapnumber = 0
For i As Integer = 1 To System.Math.Max(gapnumber, 1)
If Gapnumber = 0 Then Exit For
If Gapclosed(Gapnumber + 1 - i) = 0 Then
Outputgapnumber = Gapnumber + 1 - i
Exit For
End If
Next
'Label = sincegap(1)=1
'Label = outputgapnumber = 1

' Output Plot logic during period Gap is still Open / plot gap size and percent of current gap closure
If outputgapnumber > 0 Then
If GapType = 2 And sincegap(outputgapnumber) > 0  Then 'Gap Down
If gap(outputgapnumber) < 0 And (gapretrace(outputgapnumber) > 0 Or sincegap(outputgapnumber) = 1) Then
If PrMxHighSncGap(outputgapnumber) = Price.High Then
Sign = 1 ' Todays high is new high since gap
Else
Sign = -1 'Todays high is not a new high since gap
End If
If outputtype = 1 Then ' 1st day retracement issue
If sincegap(outputgapnumber) = 1 Then
'Plot = System.Math.Round(sign * -gap, 0) + sign * system.math.abs(gapretrace)
Plot = System.Math.Round(gap(outputgapnumber), 0) - System.Math.Abs(gapretrace(outputgapnumber))
Else
Plot = System.Math.Round(Sign * -gap(outputgapnumber), 0) + Sign * Gapretrace(outputgapnumber)
End If
Else If outputtype = 2 Then
Plot = (sincegap(outputgapnumber) + ((Price.Close - Price.Low) / (Price.High - Price.Low)) / 10) * System.Math.Sign(price.NetChange)
End If
End If
Else If GapType = 1 And sincegap(outputgapnumber) > 0  Then ' Gap Up
If gap(outputgapnumber) > 0 And (gapretrace(outputgapnumber) < 0 Or sincegap(outputgapnumber) = 1) Then
If PrMnLowSncGap(outputgapnumber) = Price.Low Then  ' Todays low is new low since gap
Sign = -1
Else
Sign = 1  'Todays low is not a new low since gap
End If
If outputtype = 1 Then ' 1st day retracement issue
If sincegap(outputgapnumber) = 1 Then
'Plot = System.Math.Round(sign * gap, 0) + sign * system.math.abs(gapretrace)
Plot = System.Math.Round(gap(outputgapnumber), 0) + System.Math.Abs(gapretrace(outputgapnumber)) 'Plot = 2.5
Else
Plot = System.Math.Round(Sign * gap(outputgapnumber), 0) - Sign * Gapretrace(outputgapnumber)
End If
Else If outputtype = 2 Then
Plot = (sincegap(outputgapnumber) + ((Price.Close - Price.Low) / (Price.High - Price.Low)) / 10) * System.Math.Sign(price.NetChange)
End If
End If
Else Plot = 0
End If
Else Plot = 0
End If
danielbender
 Posted : Wednesday, November 06, 2013 2:55:29 PM
Platinum Customer

Joined: 1/14/2006
Posts: 427

Bruce - in response to your previous inquiry, I do not think I am interested in negative index values. thanks - Dan

danielbender
 Posted : Wednesday, November 06, 2013 3:06:30 PM
Platinum Customer

Joined: 1/14/2006
Posts: 427

Bruce - the code I sent was a work in progress.  My ultimate intent regarding output (Plot =) is to provide relevant information referring to the one current open gap (there may be several open gaps) where the current price is closest to the gap closing price.  The "Retrace" variable was used to determine the status of the current gap closure as a percentage of the current open gap magnitude on day one (day of gap open).  Hope this helps... Dan

Bruce_L
 Posted : Wednesday, November 06, 2013 7:11:39 PM

Worden Trainer

Joined: 10/7/2004
Posts: 63,025

If you are not interested in working with negative index values, then you should take jas0501's advice and remove the Price.High < Price.Low(1) and Price.Low > Price.High(1) sections from the RealCode.

-Bruce
Personal Criteria Formulas
TC2000 Support Articles
danielbender
 Posted : Thursday, November 07, 2013 12:17:09 PM
Platinum Customer

Joined: 1/14/2006
Posts: 427

Bruce

Where in your real code is the variable "gap.count" incremented?

Thanks... Dan

Bruce_L
 Posted : Thursday, November 07, 2013 12:36:08 PM

Worden Trainer

Joined: 10/7/2004
Posts: 63,025

This value is automatically incremented when you use gap.Add() because it actually returns the number of items in the gap list.

-Bruce
Personal Criteria Formulas
TC2000 Support Articles
Users browsing this topic
Guest-1

 Forum Jump Customer Training & Support - Ask a Trainer - TC2000 version 12/18 - Ask a Trainer - TC2000 version 7 - Ask a Trainer - StockFinder 5.0 - PCFs, EasyScan and Custom Indicators General Discussions - Stock and Market Talk - TC2000 version 12 or 18 - TC2000 version 7 - StockFinder 5.0 - RealCode for StockFinder 5.0 Tutorial Videos - TC2000 version 12 tutorial videos - TC2000 version 7 tutorial videos You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot delete your posts in this forum. You cannot edit your posts in this forum. You cannot create polls in this forum. You cannot vote in polls in this forum.