Registered User Joined: 12/1/2006 Posts: 25
|
In Telechart, there was an option that allowed a user to shift a moving average left. What is the real code to accomplish the same thing?
|
|
Worden Trainer
Joined: 10/7/2004 Posts: 65,138
|
I'm not sure I would generally use RealCode for this. The built in Moving Average that can be added by selecting Add Indicator | Select... | Moving Average has an Offset setting that can be be adjusted by left-clicking on the Moving Average to bring up the Main tab of the Edit window. You will want to set this Offset to either -Period/2 or -(Period-1)/2 to implement Shift Left.
That said, you could manually create a Shifted Left Simple Moving Average using the following RealCode:
'# Period = UserInput.Integer = 21
Static AvgC As Single
Static Offset(1) As Integer
Static Start(2) As Integer
If isFirstBar Then
AvgC = 0
Offset(0) = -(Period - 1) / 2
Start(0) = System.Math.Max(Offset(0), 0)
Offset(1) = Offset(0) + Period
Start(1) = System.Math.Max(Offset(1), Period)
Start(2) = Start(0) + Start(1) - 1
End If
If CurrentIndex >= Start(0) Then AvgC += Price.Last(Offset(0)) / Period
If CurrentIndex >= Start(1) Then AvgC -= Price.Last(Offset(1)) / Period
If CurrentIndex >= Start(2) Then
Plot = AvgC
Else
Plot = Single.NaN
End If
The negative Offset is what allows the access of future data in the RealCode.
-Bruce Personal Criteria Formulas TC2000 Support Articles
|
|
Registered User Joined: 12/1/2006 Posts: 25
|
Yes, I saw the offset; however, I was recalling a conversation I had with you about developing a pcf in Telechart that would create a moving average shifted left; and you said that it was not possible because you could not create a negative variable. So, you told me to get Stockfinder to perform this task. I will study the formula above.
|
|
Worden Trainer
Joined: 10/7/2004 Posts: 65,138
|
The RealCode above is basically doing the following for a 21-Period Shifted Left Simple Moving Average (and it's probably a more obvious example of how negative Offsets work in RealCode):
Plot = (Price.Last(-10) + _
Price.Last(-9) + _
Price.Last(-8) + _
Price.Last(-7) + _
Price.Last(-6) + _
Price.Last(-5) + _
Price.Last(-4) + _
Price.Last(-3) + _
Price.Last(-2) + _
Price.Last(-1) + _
Price.Last + _
Price.Last(1) + _
Price.Last(2) + _
Price.Last(3) + _
Price.Last(4) + _
Price.Last(5) + _
Price.Last(6 ) + _
Price.Last(7) + _
Price.Last(8) + _
Price.Last(9) + _
Price.Last(10)) / 21
It's just doing it in a more efficient way that subtracts the oldest value and adds the newest value in the Moving Average at each Bar instead of adding together all 21 values.
-Bruce Personal Criteria Formulas TC2000 Support Articles
|
|
Registered User Joined: 12/1/2006 Posts: 25
|
I will study your code. Are sitting up typing all this out when someone has a question? If so, that is a lot of typing.
|
|
Worden Trainer
Joined: 10/7/2004 Posts: 65,138
|
Yes, I am sitting here typing it all out (but I use Copy and Paste when possible to cut down the actual amount of typing required and sometimes use spreadsheets to create really long bits of repetitive code).
-Bruce Personal Criteria Formulas TC2000 Support Articles
|
|
Registered User Joined: 12/1/2006 Posts: 25
|
Bruce, how would I add a couple of calculations to the end of real code; so real code will calculate the coding above and then add the value derived from the appended coding to produce a total value? Ex. your code + (21+120+MJ/2) = total [This is made up coding ---> (21+120+MJ/2). I needed some kind of example.]
|
|
Worden Trainer
Joined: 10/7/2004 Posts: 65,138
|
Let's say MJ/2 is something fairly straightforward like Typical Price, (High+Low+Close)/3. You would just change the following line:
Plot = AvgC
To:
Plot = AvgC + (Price.High + Price.Low + Price.Last) / 3
Or you could assign it to a variable and then use that variable in the Plot line (this would allow you to do something more complicated without explicitely writing it into the Plot line:
Dim MJ As Single = (Price.High + Price.Low + Price.Last) / 3
Plot = AvgC + MJ
A real example that uses subtraction instead of addition is contained in Detrended Price Ocillator not current. The only difference between the second DPO in my Wednesday, October 22, 2008 9:54:12 AM ET post in that topic and the RealCode in my Thursday, October 23, 2008 10:51:01 AMET post in this topic is that the Plot line in the other topic is:
Plot = Price.Last - AvgC
While the Plot line in this topic is:
Plot = AvgC
-Bruce Personal Criteria Formulas TC2000 Support Articles
|
|
Registered User Joined: 12/1/2006 Posts: 25
|
How would you append that coding to this?
'# Period = UserInput.Integer = 21
Static AvgC As Single
Static Offset(1) As Integer
Static Start(2) As Integer
If isFirstBar Then
AvgC = 0
Offset(0) = -(Period - 1) / 2
Start(0) = System.Math.Max(Offset(0), 0)
Offset(1) = Offset(0) + Period
Start(1) = System.Math.Max(Offset(1), Period)
Start(2) = Start(0) + Start(1) - 1
End If
If CurrentIndex >= Start(0) Then AvgC += Price.Last(Offset(0)) / Period
If CurrentIndex >= Start(1) Then AvgC -= Price.Last(Offset(1)) / Period
If CurrentIndex >= Start(2) Then
Plot = AvgC
Else
Plot = Single.NaN
End If
|
|
Worden Trainer
Joined: 10/7/2004 Posts: 65,138
|
Changing:
Plot = AvgC
To:
Plot = AvgC + (Price.High + Price.Low + Price.Last) / 3
Would result in:
'# Period = UserInput.Integer = 21
Static AvgC As Single
Static Offset(1) As Integer
Static Start(2) As Integer
If isFirstBar Then
AvgC = 0
Offset(0) = -(Period - 1) / 2
Start(0) = System.Math.Max(Offset(0), 0)
Offset(1) = Offset(0) + Period
Start(1) = System.Math.Max(Offset(1), Period)
Start(2) = Start(0) + Start(1) - 1
End If
If CurrentIndex >= Start(0) Then AvgC += Price.Last(Offset(0)) / Period
If CurrentIndex >= Start(1) Then AvgC -= Price.Last(Offset(1)) / Period
If CurrentIndex >= Start(2) Then
Plot = AvgC + (Price.High + Price.Low + Price.Last) / 3
Else
Plot = Single.NaN
End If
Changing:
Plot = AvgC
To:
Dim MJ As Single = (Price.High + Price.Low + Price.Last) / 3
Plot = AvgC + MJ
Would result in:
'# Period = UserInput.Integer = 21
Static AvgC As Single
Static Offset(1) As Integer
Static Start(2) As Integer
If isFirstBar Then
AvgC = 0
Offset(0) = -(Period - 1) / 2
Start(0) = System.Math.Max(Offset(0), 0)
Offset(1) = Offset(0) + Period
Start(1) = System.Math.Max(Offset(1), Period)
Start(2) = Start(0) + Start(1) - 1
End If
If CurrentIndex >= Start(0) Then AvgC += Price.Last(Offset(0)) / Period
If CurrentIndex >= Start(1) Then AvgC -= Price.Last(Offset(1)) / Period
If CurrentIndex >= Start(2) Then
Dim MJ As Single = (Price.High + Price.Low + Price.Last) / 3
Plot = AvgC + MJ
Else
Plot = Single.NaN
End If
-Bruce Personal Criteria Formulas TC2000 Support Articles
|
|
Registered User Joined: 12/1/2006 Posts: 25
|
So, this statement 'Static AvgC As Single' in the coding allows for AvgC to reference the coding below:
'# Period = UserInput.Integer = 21
Static AvgC As Single
Static Offset(1) As Integer
Static Start(2) As Integer
If isFirstBar Then
AvgC = 0
Offset(0) = -(Period - 1) / 2
Start(0) = System.Math.Max(Offset(0), 0)
Offset(1) = Offset(0) + Period
Start(1) = System.Math.Max(Offset(1), Period)
Start(2) = Start(0) + Start(1) - 1
End If
If CurrentIndex >= Start(0) Then AvgC += Price.Last(Offset(0)) / Period
If CurrentIndex >= Start(1) Then AvgC -= Price.Last(Offset(1)) / Period
If CurrentIndex >= Start(2) Then
Dim MJ As Single = (Price.High + Price.Low + Price.Last) / 3
Plot = AvgC + MJ
Else
Plot = Single.NaN
End If
If that is true, then how would Plot = AvgC know that it references the above code if it is not within the same realcode? Ex. 1+1=2 but if Plot=2; how would it know it derived from 1+1=2
|
|
Worden Trainer
Joined: 10/7/2004 Posts: 65,138
|
You have to declare a variable to use it. If you don't declare the variable, you can't use it.
If you want to use the results of another Indicator or Rule is to select the Indicator/Rules button at the top of the RealCode Editor. This will add a line to the RealCode generating a reference. For example if you selected Price History, you would get a line looking something like the following (this example isn't very useful since you can already reference Price in RealCode):
'# PH = indicator.PriceHistory
You could then reference the previous value of the Price History plot as PH.Value(1).
-Bruce Personal Criteria Formulas TC2000 Support Articles
|
|
Registered User Joined: 12/1/2006 Posts: 25
|
I see you are creating an indicator or rule that reference a real code formula. For instance, you may say # happy = (21+120+MJ/2) and # gogo = Static AvgC As Single
Static Offset(1) As Integer
Static Start(2) As Integer
If isFirstBar Then
If we add happy + gogo = total, is this correct?
|
|
Worden Trainer
Joined: 10/7/2004 Posts: 65,138
|
Maybe it's because I'm not a programmer, but I'm really not understanding your question other than to know that your syntax is not valid (I really didn't entirely understand your last question either).
Let's say you have a RealCode Indicator called Shift Left SMA that you Plot on the Chart:
'# Period = UserInput.Integer = 21
Static AvgC As Single
Static Offset(1) As Integer
Static Start(2) As Integer
If isFirstBar Then
AvgC = 0
Offset(0) = -(Period - 1) / 2
Start(0) = System.Math.Max(Offset(0), 0)
Offset(1) = Offset(0) + Period
Start(1) = System.Math.Max(Offset(1), Period)
Start(2) = Start(0) + Start(1) - 1
End If
If CurrentIndex >= Start(0) Then AvgC += Price.Last(Offset(0)) / Period
If CurrentIndex >= Start(1) Then AvgC -= Price.Last(Offset(1)) / Period
If CurrentIndex >= Start(2) Then
Plot = AvgC
Else
Plot = Single.NaN
End If
If you select the Indicator/Rules button at the top of the RealCode Editor in another RealCode Indicator and select the Shift Left SMA, you'll get a line that looks something like the following:
'# SLS = indicator.ShiftLeftSMA
If you wanted to Plot this plus twenty-one, you could create something like the following:
Plot = SLS.Value + 21
So this entire new RealCode Indicator would look like:
'# SLS = indicator.ShiftLeftSMA
Plot = SLS.Value + 21
-Bruce Personal Criteria Formulas TC2000 Support Articles
|
|
Registered User Joined: 12/1/2006 Posts: 25
|
Yes, you understood! Thanks The only delima is that I have to study your code until your company develops a manual for realcode.
I appreciate your tact. You have assisted me on one other occassion; I am impressed with your skill and ability to comprehend.
|
|
Worden Trainer
Joined: 10/7/2004 Posts: 65,138
|
Well hopefully that won't be too long in coming. I'm in the process of reviewing the newest version of the RealCode Programmers Reference right now (as are others who are a lot better at programming).
-Bruce Personal Criteria Formulas TC2000 Support Articles
|
|
Guest-1 |