Download software Tutorial videos
Subscription & data-feed pricing Class schedule


New account application Trading resources
Margin rates Stock & option commissions

Attention: Discussion forums are read-only for extended maintenance until further notice.
Welcome Guest, please sign in to participate in a discussion. Search | Active Topics |

Audible alert help Rate this Topic:
Previous Topic · Next Topic Watch this topic · Print this topic ·
Surfrider67
Posted : Thursday, June 9, 2011 4:09:31 PM
Registered User
Joined: 10/31/2010
Posts: 106
Hi, I've read the information in the Ref guide and on this forum concerning audible alerts and I've got the system to sound off but not according to my condition rules. Here's what I want:

1-When my RSI line crosses up passed it's (5 period) moving average - sound alert.
2-When my RSI line crosses down passed it's (5 period) moving average - sound alert. (The RSI line is based on it's symbol price)

When I wrote the code I simply dropped the original 2 conditions I made that monitors the RSI crossing the MAinto the RC box and then added the alert text you guys provided in the ref guide. Like this:

(this example is just the cross down, the cross up is a separate condition/RC)

'# RC = condition.unlinked.RSICrossdown
If isLastBar Then
LokiStatic.PlaySound("Z:\Documents\StockFinder5\Surfrider67\Alarms\mshot.wav")
End If

When I add it to a watch list it simply repeats the my alert .wav over and over.
Thanks in advance!
Surfrider67
Posted : Monday, June 13, 2011 3:28:03 PM
Registered User
Joined: 10/31/2010
Posts: 106
For some reason nobody has wrote me back on this question, I am still trying to solve it and cannot. My latest attempt: '# RSI = chart.RSI'# MA = chart.MovingAverage.5'# If RSI > MA Then PassIf isLastBar Then LokiStatic.PlaySound("Z:\Documents\StockFinder5\Surfrider67\Alarms\mshot.wav")End If End IfElseSetIndexInvalidEnd If What I'm really looking for is the ability to drop any condition into a real code script for making an audio alert. I found one on this site but can't get it to work for me. If this isn't possible can someone point me in the right direction for the answer to my original post?
jas0501
Posted : Tuesday, June 14, 2011 11:13:08 AM
Registered User
Joined: 12/31/2005
Posts: 2,499
QUOTE (Surfrider67)
Hi, I've read the information in the Ref guide and on this forum concerning audible alerts and I've got the system to sound off but not according to my condition rules. Here's what I want:

1-When my RSI line crosses up passed it's (5 period) moving average - sound alert.
2-When my RSI line crosses down passed it's (5 period) moving average - sound alert. (The RSI line is based on it's symbol price)

When I wrote the code I simply dropped the original 2 conditions I made that monitors the RSI crossing the MAinto the RC box and then added the alert text you guys provided in the ref guide. Like this:

(this example is just the cross down, the cross up is a separate condition/RC)

'# RC = condition.unlinked.RSICrossdown
If isLastBar Then
LokiStatic.PlaySound("Z:\Documents\StockFinder5\Surfrider67\Alarms\mshot.wav")
End If

When I add it to a watch list it simply repeats the my alert .wav over and over.
Thanks in advance!


Your code above as written will play the sound on the last bar of every watchlist item

Try
'# RC = condition.unlinked.RSICrossdown 
'
' only alert on the last bar when RC.value is true
'
If isLastBar Then 
   if RC.value then
          LokiStatic.PlaySound("Z:\Documents\StockFinder5\Surfrider67\Alarms\mshot.wav")
   end if
End If



Surfrider67
Posted : Tuesday, June 14, 2011 1:45:50 PM
Registered User
Joined: 10/31/2010
Posts: 106
That was it thanks Jas. It plays however until the condition turns false-how would I write it to play only once?
jas0501
Posted : Tuesday, June 14, 2011 5:03:13 PM
Registered User
Joined: 12/31/2005
Posts: 2,499
QUOTE (Surfrider67)
That was it thanks Jas. It plays however until the condition turns false-how would I write it to play only once?


That is complicated

You would need to record when the alert was issed and then check to see if the current alert situation was still in the same timeframe, whether it was by bar, or hour, or day. 

Using a Static NameValueCollection to record the symbol name and asOfTime of the alert,  and then later checking to see if there was an alert issued for the current symbol and if it was not within the timeframe would provide a method of skipping the alert.

See http://vb.net-informations.com/collections/vb.net_namevaluecollection.htm for some example code for using NameValueCollection.

The idea is to collect the list of alerts and keep it around. Normally, but not in this case, there is code like
If isFirstBar then
    ' clear the static value of the previous symbol
end if

However you need to keep the collection from symbl to symbol, so that when StockFinder revists a symbol the collection of alerts can be checked to see if the alert needs to be issues and the new timeframe store in the collection for that symbol by replacing the old entry if present or adding a new one if not.

So the isFirstBar clear in NOT needed,

This collection stays around as long as the instance of the indicator exists. I'm not sure when StockFinder creates a new instance. If it is based on the chart, then changing watchlist would still use the same collection, which is good..


Hope this helps.

jas0501
Posted : Tuesday, June 14, 2011 5:14:07 PM
Registered User
Joined: 12/31/2005
Posts: 2,499
see also:

http://msdn.microsoft.com/en-us/library/system.collections.specialized.namevaluecollection_members(v=vs.85).aspx

Surfrider67
Posted : Tuesday, June 14, 2011 9:36:38 PM
Registered User
Joined: 10/31/2010
Posts: 106
I'll give it a shot, thank you, again!
pthegreat
Posted : Sunday, September 22, 2013 2:23:50 AM

Registered User
Joined: 6/15/2008
Posts: 1,356

Jas, Bruce, or anyone else;

I was wondering if you have used NameValueCollection() in realcode ?

I've been doing some experimenting, and ran into some strange problems:

first off; you need to add   " Imports system.Collections.Specialized " as the very 1st line in your Class code, for realcode to acknowledge NameValueCollection(). 

like so:

http://screencast.com/t/6ImQZ35m

Entering this line anywhere else, will generate errors.

Next;

Once I have an "error free" code, the condition runs, but after I edit the code again, and make changes, it will execute the code, as if it was before I edited and made the changes. So, no matter what I change in the code, it'll run as when it was edited the first time!

very weird.

so question is; is NameValueCollection() supported in realcode? or am I wasting time, trying to implement it?

 

 

 

 

 

pthegreat
Posted : Sunday, September 22, 2013 7:25:23 PM

Registered User
Joined: 6/15/2008
Posts: 1,356

Here's some test code I'm experimenting with:

a simple indicator that finds the high and low over the past 500bars, and then triggers if price retraces over 23.6%.

Imports system.Collections.Specialized

<WBIGuid("d4af43f1-eb1c-476f-8dee-5f986504edd6"),FriendlyName("RealCodeCondition"),BlockTemplateEmptyMethodOnly()> _

Public partial Class RealCodeCondition

                inherits RealCodeCondition_base

                Sub New

                                autoloop = False

                End Sub

                Public Overrides Sub CallUserCode()

                                '# Retrace = userinput.single = 23.6

                                '# BarsAgo = UserInput.Integer = 0

                                '# Period = UserInput.Integer = 500

                                Dim Range(1) As Integer

                                Range(1) = Price.Bar.Count - 1 - BarsAgo

                                Range(0) = Range(1) - Period + 1

                                Dim BarA As Integer = Range(0)

                                If Range(0) >= 0 Then

                                                For i As Integer = Range(0) To Range(1)

                                                                If Price.Bar.HighValue(i) >= Price.Bar.HighValue(BarA) Then

                                                                                BarA = i

                                                                End If

                                                Next

                                End If

                                If BarA < Range(1) - 1 Then

                                                Dim BarB As Integer = BarA

                                                Dim BarBqualified As Integer = BarA

                                  

                                                For i As Integer = BarA + 1 To Range(1) - 1

                                                                If Price.Bar.LowValue(i) < Price.Bar.LowValue(BarB) Then

                                                                                BarB = i

                                                                                For j As Integer = i To Range(1) - 1

                                                                                                If Price.Bar.lowValue(j) < Price.Bar.lowValue(j - 1) AndAlso _

                                                                                                                Price.Bar.lowValue(j) < Price.Bar.lowValue(j + 1) Then

                                                                                                                BarBqualified = BarB

                                                                                                end if

                                                                                                Exit For

                                                                                Next

                                                                end if

                                                next

                                                If BarBqualified > BarA Then

                                                                Static alert_dbase As New NameValueCollection()

                                                                Dim alert_time As Date

                                                                Dim alert_minute As Integer

                                                                Dim level As Single = price.bar.lowvalue(BarBqualified) + Retrace / 100 * _

                                                                                (price.bar.highvalue(BarA) - price.bar.lowvalue(BarBqualified))

                                                                Dim brklevel As Integer = 0

                                                                Static sym As String

                                                                For i As Integer = BarBqualified To Range(1)

                                                                                If price.Bar.lastvalue(i) > level AndAlso price.Bar.lastvalue(i - 1) < level Then

                                                                                                brklevel = i

                                                                                End If

                                                                Next

                                                                For j As Integer = 0 To price.Bar.count - 1

                                                                                If j = brklevel Then

                                                                                                MyBase.addtoOutput(price.bar.datevalue(j), True)

                                                                                                If brklevel = price.Bar.count - 1 AndAlso sym <> CurrentSymbol Then

                                                                                                                sym = CurrentSymbol

                                                                                                                alert_time = datetime.now

                                                                                                                alert_minute = alert_time.Minute

                                                                                                                Dim symtrue As Boolean = False

                                                                                                                Dim i As Integer

                                                                                                                For i = 0 To alert_dbase.count - 1

                                                                                                                                If alert_dbase.Get(i) = sym Then

                                                                                                                                                symtrue = True

                                                                                                                                                showmessage("already in dbase" & " " & Me.currentsymbol)

                                                                                                                                                Exit For

                                                                                                                                End If

                                                                                                                Next

                                                                                                                If symtrue = False Then

                                                                                                                                alert_dbase.Add(sym, alert_minute)

                                                                                                                                showmessage("adding" & " " & Me.currentsymbol & " " & alert_dbase.Count)

                                                                                                                                                                               

                                                                                                                End If

                                                                                                                                                                                                                                                                                                                               

                                                                                                                lokistatic.playsound("c:\notify.wav")

                                                                                                                                               

                                                                                                End If   

                                                               

                                                                                Else

                                                                                                MyBase.addtoOutput(price.bar.datevalue(j), False)

                                                                                End If

                                                                Next

                                End If

                                End If

                               

                               

 

end sub

End Class

 

My first test is to add the symbol and date stamp into the NameValueCollection, it should popup a mesage whether it is being added, if it's not yet in the Collection, or popup a message if it's already in the Collection.

 

well, it's not working.

anyone any ideas?

pthegreat
Posted : Monday, September 23, 2013 1:34:08 AM

Registered User
Joined: 6/15/2008
Posts: 1,356

ok, moving on:

upgraded .NET framework from 4.0 to 4.5, and still not working.

Instead of NameValueCollection()   trying ArrayList()

which works!!!  without having to add the "import" statement as first line;

 

<WBIGuid("d4af43f1-eb1c-476f-8dee-5f986504edd6"),FriendlyName("RealCodeCondition"),BlockTemplateEmptyMethodOnly()> _

Public partial Class RealCodeCondition

            inherits RealCodeCondition_base

            Sub New

                        autoloop = False

            End Sub

            Public Overrides Sub CallUserCode()

                        '# Retrace = userinput.single = 23.6

                        '# BarsAgo = UserInput.Integer = 0

                        '# Period = UserInput.Integer = 500

                        Dim Range(1) As Integer

                        Range(1) = Price.Bar.Count - 1 - BarsAgo

                        Range(0) = Range(1) - Period + 1

                        Dim BarA As Integer = Range(0)

                        If Range(0) >= 0 Then

                                    For i As Integer = Range(0) To Range(1)

                                                If Price.Bar.HighValue(i) >= Price.Bar.HighValue(BarA) Then

                                                            BarA = i

                                                End If

                                    Next

                        End If

                        If BarA < Range(1) - 1 Then

                                    Dim BarB As Integer = BarA

                                    Dim BarBqualified As Integer = BarA

                          

                                    For i As Integer = BarA + 1 To Range(1) - 1

                                                If Price.Bar.LowValue(i) < Price.Bar.LowValue(BarB) Then

                                                            BarB = i

                                                            For j As Integer = i To Range(1) - 1

                                                                        If Price.Bar.lowValue(j) < Price.Bar.lowValue(j - 1) AndAlso _

                                                                                    Price.Bar.lowValue(j) < Price.Bar.lowValue(j + 1) Then

                                                                                    BarBqualified = BarB

                                                                        end if

                                                                        Exit For

                                                            Next

                                                end if

                                    next

                                    If BarBqualified > BarA Then

                                                Static alert_dbase As New Arraylist()

                                                Dim alert_time As Date

                                                Dim alert_minute As Integer

                                                Dim level As Single = price.bar.lowvalue(BarBqualified) + Retrace / 100 * _

                                                            (price.bar.highvalue(BarA) - price.bar.lowvalue(BarBqualified))

                                                Dim brklevel As Integer = 0

                                                Static sym As String

                                                For i As Integer = BarBqualified To Range(1)

                                                            If price.Bar.lastvalue(i) > level AndAlso price.Bar.lastvalue(i - 1) < level Then

                                                                        brklevel = i

                                                            End If

                                                Next

                                                For j As Integer = 0 To price.Bar.count - 1

                                                            If j = brklevel Then

                                                                        MyBase.addtoOutput(price.bar.datevalue(j), True)

                                                                        If brklevel = price.Bar.count - 1 AndAlso sym <> CurrentSymbol Then

                                                                                    sym = CurrentSymbol

                                                                                    alert_time = datetime.now

                                                                                    alert_minute = alert_time.Minute

                                                                                    Dim symtrue As Boolean = False

                                                                                   

                                                                                    If alert_dbase.Contains(sym) Then

                                                                                                            symtrue = True

                                                                                                showmessage("already in dbase" & " " & Me.currentsymbol & " " & alert_dbase.Count)

                                                                                               

                                                                                                End If

                                                                       

                                                                                    If symtrue = False Then

                                                                                                alert_dbase.Add(sym)

                                                                                                showmessage("adding" & " " & Me.currentsymbol & " " & alert_dbase.Count)

                                                                                                                                   

                                                                                    End If

                                                                                                                                                                                                                                               

                                                                                    lokistatic.playsound("c:\notify.wav")

                                                                                                           

                                                                        End If

                                               

                                                            Else

                                                                        MyBase.addtoOutput(price.bar.datevalue(j), False)

                                                            End If

                                                Next

                                    End If

                        End If

           

            End Sub

End Class

 

 

problem now: I can't store both ticker and timestamp in the arraylist, and as far as I know, ArrayList() does not support multidimensional arrays.

Next problem is that once you change timeframe the ArrayList() keeps its values, so need to come up with a routine to clear the ArrayList when the timeframe is being changed.

 

So Bruce, question : which types of lists, dictionaries, and Collection classes are supported in realcode? There are a whole bunch, listed on the http://msdn.microsoft.com/en-us/library/System.Collections.aspx  website.

 

I'd rather not having to try them all out one by one.

 

 

 

 

Bruce_L
Posted : Monday, September 23, 2013 10:11:02 AM


Worden Trainer

Joined: 10/7/2004
Posts: 65,138

According to development, any .NET collection is supported.



-Bruce
Personal Criteria Formulas
TC2000 Support Articles
Kuf
Posted : Monday, September 23, 2013 10:18:34 AM


Administration

Joined: 9/18/2004
Posts: 3,522

Glancing over your code, I think you want to use a Generic Dictionary. 

FYI, you can always declare your variable like so, without having to use the imports statement:

 

 Static alert_dbase As New system.Collections.Specialized.NameValueCollection()

 

 



Ken Gilb (Kuf)
Chief Software Engineer - Worden Brothers Inc.
Try/Catch - My RealCode Blog
pthegreat
Posted : Monday, September 23, 2013 10:22:59 AM

Registered User
Joined: 6/15/2008
Posts: 1,356

Thanks Kuf/Bruce, appreciate it.

pthegreat
Posted : Monday, September 23, 2013 1:43:31 PM

Registered User
Joined: 6/15/2008
Posts: 1,356

Ha,  fantastic!  works perfectly with generic dictionary.

 

modified the "test" code, for who-ever is interested :

 

<WBIGuid("d4af43f1-eb1c-476f-8dee-5f986504edd6"),FriendlyName("RealCodeCondition"),BlockTemplateEmptyMethodOnly()> _

Public partial Class RealCodeCondition

            inherits RealCodeCondition_base

            Sub New

                        autoloop = False

            End Sub

            Public Overrides Sub CallUserCode()

                        '# Retrace = userinput.single = 23.6

                        '# BarsAgo = UserInput.Integer = 0

                        '# Period = UserInput.Integer = 500

                        Dim Range(1) As Integer

                        Range(1) = Price.Bar.Count - 1 - BarsAgo

                        Range(0) = Range(1) - Period + 1

                        Dim BarA As Integer = Range(0)

                        If Range(0) >= 0 Then

                                    For i As Integer = Range(0) To Range(1)

                                                If Price.Bar.HighValue(i) >= Price.Bar.HighValue(BarA) Then

                                                            BarA = i

                                                End If

                                    Next

                        End If

                        If BarA < Range(1) - 1 Then

                                    Dim BarB As Integer = BarA

                                    Dim BarBqualified As Integer = BarA

                          

                                    For i As Integer = BarA + 1 To Range(1) - 1

                                                If Price.Bar.LowValue(i) < Price.Bar.LowValue(BarB) Then

                                                            BarB = i

                                                            For j As Integer = i To Range(1) - 1

                                                                        If Price.Bar.lowValue(j) < Price.Bar.lowValue(j - 1) AndAlso _

                                                                                    Price.Bar.lowValue(j) < Price.Bar.lowValue(j + 1) Then

                                                                                    BarBqualified = BarB

                                                                        end if

                                                                        Exit For

                                                            Next

                                                end if

                                    Next

                                    If BarBqualified > BarA Then

                                               

                                                            Static alert_dbase As New dictionary(Of String, Date)

                                                Dim alert_time As Date

                                                Dim alert_minute As Integer

                                                Dim level As Single = price.bar.lowvalue(BarBqualified) + Retrace / 100 * _

                                                            (price.bar.highvalue(BarA) - price.bar.lowvalue(BarBqualified))

                                                Dim brklevel As Integer = 0

                                                Static sym As String

                                                For i As Integer = BarBqualified To Range(1)

                                                            If price.Bar.lastvalue(i) > level AndAlso price.Bar.lastvalue(i - 1) < level Then

                                                                        brklevel = i

                                                            End If

                                                Next

                                                For j As Integer = 0 To price.Bar.count - 1

                                                            If j = brklevel Then

                                                                        MyBase.addtoOutput(price.bar.datevalue(j), True)

                                                                        If brklevel = price.Bar.count - 1 AndAlso sym <> CurrentSymbol Then

                                                                                    sym = CurrentSymbol

                                                                                    alert_time = datetime.now

                                                                                    alert_minute = alert_time.Minute

                                                                                    Dim symtrue As Boolean = False

                                                                                   

                                                                                    If alert_dbase.ContainsKey(sym) Then

                                                                                                symtrue = True

                                                                                                Dim keydate As Date = alert_dbase.Item(sym)

                                                                                                showmessage("already in dbase" & " " & sym & " date of entry: " & keydate & " total entries in dbase: " & alert_dbase.Count)

                                                                                               

                                                                                    End If

                                                                       

                                                                                    If symtrue = False Then

                                                                                                alert_dbase.Add(sym, datetime.now)

                                                                                                showmessage("adding" & " " & Me.currentsymbol & " " & alert_dbase.Count)

                                                                                                                                   

                                                                                    End If

                                                                                                                                                                                                                                               

                                                                                    lokistatic.playsound("c:\notify.wav")

                                                                                                           

                                                                        End If

                                               

                                                            Else

                                                                        MyBase.addtoOutput(price.bar.datevalue(j), False)

                                                            End If

                                                Next

                                    End If

                        End If

           

            End Sub

End Class

 

a good link for description and examples:

http://www.dotnetperls.com/dictionary-vbnet

I used the dictionary with "string" as the key, which will hold the tickersymbol, and "date" for the time stamp.

the above test code, detects if the symbol is in the dictionary already, if not, then it will add the symbol with the date at the time the condition passed.

 

next step is to manipulate the entries in the dictionary based on current bar and timestamp

pthegreat
Posted : Wednesday, October 9, 2013 7:53:31 PM

Registered User
Joined: 6/15/2008
Posts: 1,356

got something working

Public partial Class RealCodeCondition
  inherits RealCodeCondition_base
  Sub New
    autoloop = False
  End Sub
  Public Overrides Sub CallUserCode()
    '# Retrace = userinput.single = 23.6
    '# BarsAgo = UserInput.Integer = 0
    '# Period = UserInput.Integer = 500
 
    Dim Range(1) As Integer
    Range(1) = Price.Bar.Count - 1 - BarsAgo
    Range(0) = Range(1) - Period + 1
    Dim BarA As Integer = Range(0)
    Static alert_dbase As New dictionary(Of String, Date)
    Static CurrentTimeFrame As String
    Dim CheckTimeFrame As String
    Dim LastBar As Integer
    Static LastBarDate As Date
    LastBar = price.Bar.count - 1
    If Price.Bar.Datevalue(LastBar) <> LastBarDate Then
      LastBarDate = Price.Bar.Datevalue(LastBar)
      alert_dbase.clear
      ' showmessage("new bar, clear Dbase ; " & alert_dbase.count)
    End If
    CheckTimeFrame = WhatTimeFrame()
    If CheckTimeFrame <> CurrentTimeFrame Or Price.Bar.Datevalue(LastBar) <> LastBarDate Then
      alert_dbase.clear
      CurrentTimeFrame = CheckTimeFrame
      ' showmessage("new TimeFrame, clear Dbase ; " & alert_dbase.count)
    End If
    If Range(0) >= 0 Then
      For i As Integer = Range(0) To Range(1)
      If Price.Bar.HighValue(i) >= Price.Bar.HighValue(BarA) Then
        BarA = i
      End If
      Next
    End If
    If BarA < Range(1) - 1 Then
      Dim BarB As Integer = BarA
      Dim BarBqualified As Integer = BarA
  
      For i As Integer = BarA + 1 To Range(1) - 1
        If Price.Bar.LowValue(i) < Price.Bar.LowValue(BarB) Then
          BarB = i
          For j As Integer = i To Range(1) - 1
            If Price.Bar.lowValue(j) < Price.Bar.lowValue(j - 1) AndAlso _
              Price.Bar.lowValue(j) < Price.Bar.lowValue(j + 1) Then
              BarBqualified = BarB
            end if
          Exit For
          Next
        end if
      next
      If BarBqualified > BarA Then
 
        Dim alert_time As Date
        Dim alert_minute As Integer
        Dim level As Single = price.bar.lowvalue(BarBqualified) + Retrace / 100 * _
(price.bar.highvalue(BarA) - price.bar.lowvalue(BarBqualified))
        Dim brklevel As Integer = 0
        Static sym As String
        For i As Integer = BarBqualified To Range(1)
          If price.Bar.lastvalue(i) > level AndAlso price.Bar.lastvalue(i - 1) < level Then
            brklevel = i
          End If
        Next
        For j As Integer = 0 To price.Bar.count - 1
          If j = brklevel Then
            MyBase.addtoOutput(price.bar.datevalue(j), True)
            If brklevel = price.Bar.count - 1 AndAlso sym <> CurrentSymbol Then
              sym = CurrentSymbol
              alert_time = datetime.now
              alert_minute = alert_time.Minute
              Dim symtrue As Boolean = False
              If alert_dbase.ContainsKey(sym) Then
                symtrue = True
                'Dim keydate As Date = alert_dbase.Item(sym)
                'showmessage("already in dbase" & " " & sym & " date of entry: " & keydate & " total entries in dbase: " & alert_dbase.Count)
              End If
 
              If symtrue = False Then
                lokistatic.playsound("c:\notify.wav")
                alert_dbase.Add(sym, datetime.now)
                showmessage("adding" & " " & Me.currentsymbol & " " & alert_dbase.Count & " at: " & datetime.now)
                Me.log.info("entryCondition UP, on " & WhatTimeFrame() & " " & Me.currentsymbol & " at: " & datetime.now)
              End If
            End If
 
          Else
            MyBase.addtoOutput(price.bar.datevalue(j), False)
          End If
        Next
    End If
End If
 
end sub
  Private Function WhatTimeFrame() As String
  Dim tframe As String
  If Me.BarInterval.Days > 0 Then
    tframe = Me.BarInterval.Days & " Days "
  Else
    tframe = Me.BarInterval.TotalMinutes & " Minutes"
  End If
    Return tframe
  End Function
End Class
 

The yellow highlighted code initialises the "database" , with one string column, and one date column.

It checks whether the timeframe has changed, if so, it clears the database, and it clears the database on a new bar.

so for example; if the condition runs on a 60min chart, it will clear the database at every hour, when the current bar closes.

The red highlighted code checks if the symbol is already in the database in case a symbol breaks the "brklevel" every subsequent time during the same bar, if so, it won't add that symbol, and it won't popup a message.

You can enable the showmessage, to confirm proper operation of the code.

 I only posted this code for finding a way to get the alert to trigger only once for a symbol during one bar. It would be to lenghty to post it with the indicator I actually use.

I have tested it a bit today, and it seems to work properly.

Any improvements/suggestions are welcome.

thanks.

P.

pthegreat
Posted : Wednesday, October 9, 2013 7:57:07 PM

Registered User
Joined: 6/15/2008
Posts: 1,356

for some reason the "highlighting" didn't work.

the yellow highlight is supposed to be from "

Static alert_dbase As New dictionary(Of String, Date)

to:

   ' showmessage("new TimeFrame, clear Dbase ; " & alert_dbase.count)

 

    End If
 
and the "red" highlight:
 
 If alert_dbase.ContainsKey(sym) Then
                symtrue = True
                'Dim keydate As Date = alert_dbase.Item(sym)
                'showmessage("already in dbase" & " " & sym & " date of entry: " & keydate & " total entries in dbase: " & alert_dbase.Count)
              End If
 
              If symtrue = False Then
                lokistatic.playsound("c:\notify.wav")
                alert_dbase.Add(sym, datetime.now)
                showmessage("adding" & " " & Me.currentsymbol & " " & alert_dbase.Count & " at: " & datetime.now)
                Me.log.info("entryCondition UP, on " & WhatTimeFrame() & " " & Me.currentsymbol & " at: " & datetime.now)
              End If

 

pthegreat
Posted : Wednesday, October 9, 2013 8:07:55 PM

Registered User
Joined: 6/15/2008
Posts: 1,356

 If CheckTimeFrame <> CurrentTimeFrame Or Price.Bar.Datevalue(LastBar) <> LastBarDate Then

should be:

 If CheckTimeFrame <> CurrentTimeFrame Then

pthegreat
Posted : Thursday, October 10, 2013 12:42:36 PM

Registered User
Joined: 6/15/2008
Posts: 1,356

Bruce;

As you can see from the code, I'd like to write certain events to a file.

Unfortunately, as I understand, we only have the option to write to the log file.

Apparently something in my code creates an error, even though the condition works fine.

Log file filling up with the following continuous error:

http://screencast.com/t/RN30TbjQ

Sincerely hope Worden one day picks up SF development again.

 

 

Bruce_L
Posted : Thursday, October 10, 2013 1:09:47 PM


Worden Trainer

Joined: 10/7/2004
Posts: 65,138

It is also my understanding that the only way you can write to disk directly from RealCode is to write to the log file.

You can get the values of a RealCode Indicator to disk by manually doing an export, but that is not the same thing as having the RealCode itself write to disk. That said, it might be possible to encode information into the values and dates of data in an indicator and then use a manual export to get the desired information into an external file.

I have looked at and played with your RealCode and do not know why it is generating the error in the log file.



-Bruce
Personal Criteria Formulas
TC2000 Support Articles
pthegreat
Posted : Thursday, October 10, 2013 4:26:39 PM

Registered User
Joined: 6/15/2008
Posts: 1,356

Yea "manual" isn't going to work for me. I use short timeframes mostly.

 

I gave it a quick try however, just to see what would happen"

 

enter:

Imports System.IO

as first line

then:

Using outfile As New StreamWriter("c:\testFile.txt")
outfile.Write("test")
End Using 
 
at the point where the symbol gets added to the alert_dbase.
 
although it compiles with no errors, it's not writing the file.
 
 

 

pthegreat
Posted : Thursday, October 10, 2013 10:59:31 PM

Registered User
Joined: 6/15/2008
Posts: 1,356

removed the "imports System.IO"

and wrote it as Kuf suggested in earlier post:

and.... it's working!!  well sort of.

it worked only once:

Now when I edit the realcode I do get an error:

 

aaaah. so close!

 

Kuf/Bruce;

Come on guys... allow IO ,  or do you know a way to make this work?

 

pthegreat
Posted : Friday, October 11, 2013 5:16:15 PM

Registered User
Joined: 6/15/2008
Posts: 1,356

A little more progress:

the :

Using outfile As system.io.StreamWriter("c:\test\testFile.txt")

       outfile.Write("test")

End Using

from the previous example works, but it overwrites the same line in the text file, everytime the condition triggers.

 

No matter what I do, realcode accepts the code the first time you edit it into the condition, editing it afterwards will generate the "IO operations are not allowed" error.

here's the next example. It ADDS lines to a text file, everytime the condition triggers:

make sure you have a C:\test\ folder for the testFile.txt file.

 

 

pthegreat
Posted : Tuesday, October 22, 2013 1:30:02 PM

Registered User
Joined: 6/15/2008
Posts: 1,356

the experimenting has lead to a final code I'm using now.

 

Even though we are now able to minimize the amount of popup alerts with the "showmessage" command to just one alert per bar, I personally don't like the fact that you have to click the "ok" button on the popup message. The code pauses, and thus, the current scan stops, until you click the ok button.

On longer timeframes it's not an issue in my opinion, but on short timeframes it gets annoying. specially since sometimes the popup message is minimized to the task bar on your windows screen. so you could easily oversee a popup message, and subsequently miss alerts on other stocks in your watchlist.

therefore on short timeframes I use audible alerts only. And I found a way, by using text2speech to hear which ticker triggered.

I used this program TexttoWav  http://download.cnet.com/TextToWav/3000-2169_4-10773719.html

to create a small soundfile for each ticker in my watchlist, and copied them in a folder I created c:\StockfinderV5data\wavs

for example for Amazon, I typed "amazon, up"  in the texttowav program and saved it as amzn-up.wav 

Now everytime my condition passes for amazon, it'll say "amazon up" . and eneters a log entry in a file c:\StockfinderV5data\logs\entry-up.txt    (make sure you create the folders).

here is the final code. If you do want the popup message, just enable the showmessage line in the code by removing the '

any comments/suggestions/improvements welcome.

the output of the text file :

cortner
Posted : Monday, August 17, 2015 10:58:14 AM
Registered User
Joined: 4/13/2014
Posts: 11

I am pretty bad with coding pthegreat so I apologize ahead of time.

How could I use your above coding to add my basic coding example?

I am running only daily carts and would want theAlert to trigger only once a day and have that info added to the stockFinderApp.log

 

If isLastBar Then
  If (Price.close(0) - Price.Close(1)) / Price.Close(1) > .02 Then
    'showmessage("test")
    LokiStatic.PlaySound("c:\windows\media\notify.wav")
    Me.log.info("Alert passed on " & Me.currentsymbol & " with a price of" & price.close)
    pass
  End If
End If
Gr8Trades
Posted : Monday, August 17, 2015 11:12:16 AM
Registered User
Joined: 5/6/2014
Posts: 81

QUOTE (cortner)

I am pretty bad with coding pthegreat so I apologize ahead of time.

How could I use your above coding to add my basic coding example?

1st : don't have to apologize :-)   I learned to program from scratch myself (and still learning). Learned a lot from worden's forum. At first it seems overwhelming, and at times impossible. But trust me, if you put in some effort and time; read books etc. you'll start to understand and get bettter and better at it.

2nd: I don't use SF actively anymore, although I do like the platform very much.

having said that, I don't mind trying to code this for you as an example. However i don't have a lot of time. I might be able to have a look at it this coming weekend, unless Bruce or someone else takes a crack at it before then.

Thanks and have a gr8 day

cortner
Posted : Wednesday, August 19, 2015 11:24:11 AM
Registered User
Joined: 4/13/2014
Posts: 11

Any help would be much appreciated ! 

Thanks

 

Gr8Trades
Posted : Wednesday, August 19, 2015 7:18:31 PM
Registered User
Joined: 5/6/2014
Posts: 81

Cortner, In my spare time I'm working on setting up a website. on which I'm planning to post some SF indicators/conditions and such.

The alert system is a valuable part in creating a trading system, imo. As soon as I can I'll post it on the website, with an example to use it as an alert to any condition.

I'm working on it, but hope to get it all working by the weekend.

http://www.gr8wklytrades.com

Users browsing this topic
Guest-1

Forum Jump
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.