|
|||||||
| Trading Indicators Post your custom trading indicators. If you download, remember to click INSTALL. |
![]() |
|
|
LinkBack (1) | Release Tools |
|
|
|||||
|
|||||
|
This is a Tradestation release for custom pivot points. This indicator has been made to use the following formula:
Soultrader's Pivot Points R3 = R1 + RANGE R2 = PP + RANGE R1 = (2 * PP) - LOW PP = (HIGH + LOW + CLOSE) / 3 S1 = (2 * PP) - HIGH S2 = PP - RANGE S3 = S1 - RANGE Following features: ...
__________________
James Lee - Founder Forum Guidelines | Forum Manual | Support Coder | Report a Bug ------------------------------------------------------------------------------------ Empowering traders with knowledge. Please support TL by visiting our sponsors. Thanks! |
| The Following User Says Thank You to Soultrader For This Useful Post: | ||
fandor (08-20-2008) | ||
|
By
Minetoo
on
10-16-2007, 11:13 AM
|
|
Re: Soultrader's Pivots for Tradestation
|
|
By
philloo
on
10-18-2007, 12:39 PM
|
|
Re: Soultrader's Pivots for Tradestation
These code are for esignal pivots. If someone can convert in tradestation it's arrange all the problem that indicator have.
philloo Fix History: 02/02/2005 - Initial Release 1.0.0 ========================= ========================= =================== Project Description: Dislaimer: For educational purposes only! Obviously, no guarantees whatsoever and use at your own risk. ************************* ************************* ********************/ // globals var vOutputArray = null; var vResultArray = null; var vLastSeenDay = null; //pivot line labels ( Daily, Weekly and Monthly) var vTitleArray = new Array("R3", "M6", "R2", "M5", "R1", "M4", "PP", "M3", "S1", "M2", "S2", "M1", "S3"); var vLabelArray = new Array("Daily R3","Midpoint","Daily R2","Midpoint","Daily R1","Midpoint","Daily PP","Midpoint","Daily S1","Midpoint","Daily S2","Midpoint","Daily S3"); var vLabelArrayW = new Array("Weekly R3","WMidpoint","Weekly R2","WMidpoint","Weekly R1","WMidpoint","Weekly PP","WMidpoint","Weekly S1","WMidpoint","Weekly S2","WMidpoint","Weekly S3"); var vLabelArrayM = new Array("Monthly R3","MMidpoint","Monthl y R2","MMidpoint","Monthl y R1","MMidpoint","Monthl y PP","MMidpoint","Monthl y S1","MMidpoint","Monthl y S2","MMidpoint","Monthl y S3"); //pivot line Colors in same order as labels above (e.g., R2=darkgreen, M4=blue, etc.) var vColorArray = new Array( Color.yellow, Color.white, Color.yellow, Color.white, Color.yellow, Color.white, Color.yellow, Color.white, Color.yellow, Color.white, Color.yellow, Color.white, Color.yellow ); //pivot line types var vTypeArray = new Array( "DASH", "DASHDOT", "DASH", "DASHDOT", "DASH", "DASHDOT", "SOLID", "DASHDOT", "DASH", "DASHDOT", "DASH", "DASHDOT", "DASH" ); //pivot line thicknesses var vThickArray = new Array(1,1,1,1,1,1,3,1,1,1 ,1,1,1); var vButLabels = new Array("", "Proj", "Gap1", "Gap2", "Reg", "(-)" ); var aFPArray = new Array(); var vInterval = null; var vSymbol = null; var nOffset = 2; //# of bars shifted to the right (from most current bar ) that you want to print the text var nColor = Color.navy; //Color for the text labels var sFont = "Arial"; //Font to use for the text var nFontSize = 10; //Font size for the text. var nPct = 100; //limit percentage var bCursorLabels = false; //show all of the cursor labels in the data window?? var nMaxDays = 20; //# of days to display var _nProject = null; var _nLabels = null; var _nGap = null; var _nFlatLines = true; var _nHLC = false; var _nLimitPct = null; var grID = 20; var nCurHigh = 0; var nCurLow = 0; var nCurOpen = 0; var nCurClose = 0; var nTMP = 0; //today's in-progress Mid Point var vToday = 0; var vNow = null; var vCalcInterval = "D"; var vTempDay = null; var tdayO = 0; //today's open var ydayO = 0; //yesterday's open var ydayH = 0; //yesterday's high var ydayL = 0; //yesterday's low var ydayC = 0; //yesterday's close var P = 0; //pivot var MP = 0; //Midpoint var W = 0; //Waist var R1 = 0; //R1 var S1 = 0; //S1 var R2 = 0; //R2 var S2 = 0; //S2 var R3 = 0; //R3 var S3 = 0; //S3 var done = false; var bInitialized = false; function preMain() { var x; setPriceStudy(true); setStudyTitle("TTM-Pivots (Daily)"); setShowTitleParameters(fa lse); for (x=0; x<vLabelArray.length; x++) { setCursorLabelName(vLabel Array[x], x); setDefaultBarStyle(eval( "PS_"+vTypeArray[x] ), x); setDefaultBarFgColor(vCol orArray[x], x); setDefaultBarThickness(vT hickArray[x], x); } setShowCursorLabel(bCurso rLabels); vLastSeenDay = null; vOutputArray = null; vResultArray = new Array(); //initialize formula parameters x=0; aFPArray[x] = new FunctionParameter( "frOpen", FunctionParameter.NUMBER) ; with( aFPArray[x] ) { setName( "Override Open" ); setLowerLimit(0); setDefault(0); } x++; aFPArray[x] = new FunctionParameter( "frHigh", FunctionParameter.NUMBER) ; with( aFPArray[x] ) { setName( "Override High" ); setLowerLimit(0); setDefault(0); } x++; aFPArray[x] = new FunctionParameter( "frLow", FunctionParameter.NUMBER) ; with( aFPArray[x] ) { setName( "Override Low" ); setLowerLimit(0); setDefault(0); } x++; aFPArray[x] = new FunctionParameter( "frClose", FunctionParameter.NUMBER) ; with( aFPArray[x] ) { setName( "Override Close" ); setLowerLimit(0); setDefault(0); } x++; aFPArray[x] = new FunctionParameter( "frMid", FunctionParameter.STRING) ; with( aFPArray[x] ) { setName( "Display MidPoints?" ); addOption( "T" ); addOption( "F" ); setDefault( "T" ); } x++; aFPArray[x] = new FunctionParameter( "frGap", FunctionParameter.STRING) ; with( aFPArray[x] ) { setName( "Apply Gap?" ); addOption( "T" ); addOption( "F" ); setDefault( "F" ); } x++; aFPArray[x] = new FunctionParameter( "frLabels", FunctionParameter.STRING) ; with( aFPArray[x] ) { setName( "Show Cursor Labels?" ); addOption("T"); addOption("F"); setDefault("T"); } x++; aFPArray[x] = new FunctionParameter( "frLabColor", FunctionParameter.COLOR); with( aFPArray[x] ) { setName( "Cursor Label Color" ); setDefault( Color.yellow ); } x++; aFPArray[x] = new FunctionParameter( "frDays", FunctionParameter.NUMBER) ; with( aFPArray[x] ) { setName( "Days to Display" ); setLowerLimit(1); setUpperLimit(50); setDefault(1); } x++; aFPArray[x] = new FunctionParameter( "frInterval", FunctionParameter.STRING) ; with( aFPArray[x] ) { setName( "Pivot Type" ); addOption("Daily"); addOption("Weekly"); addOption("Monthly"); setDefault("Daily"); } x++; y=x; for( z=0; z<vTitleArray.length; z++ ) { aFPArray[y] = new FunctionParameter( "frColor"+(z+1), FunctionParameter.COLOR); with( aFPArray[y] ) { setName( vTitleArray[z] + " Color" ); setDefault( vColorArray[z] ); } y++; aFPArray[y] = new FunctionParameter( "frThick"+(z+1), FunctionParameter.NUMBER) ; with( aFPArray[y] ) { setName( vTitleArray[z] + " Thickness" ); setDefault( vThickArray[z] ); } y++; aFPArray[y] = new FunctionParameter( "frStyle"+(z+1), FunctionParameter.STRING) ; with( aFPArray[y] ) { setName( vTitleArray[z] + " Style" ); addOption( "SOLID" ); addOption( "DASH" ); addOption( "DASHDOT" ); addOption( "DASHDOTDOT" ); setDefault( vTypeArray[z] ); } y++; } } function main( frOpen, frHigh, frLow, frClose, frMid, frGap, frLabels, frLabColor, frDays, frInterval, frColor1, frThick1, frStyle1, frColor2, frThick2, frStyle2, frColor3, frThick3, frStyle3, frColor4, frThick4, frStyle4, frColor5, frThick5, frStyle5, frColor6, frThick6, frStyle6, frColor7, frThick7, frStyle7, frColor8, frThick8, frStyle8, frColor9, frThick9, frStyle9, frColor10, frThick10, frStyle10, frColor11, frThick11, frStyle11, frColor12, frThick12, frStyle12, frColor13, frThick13, frStyle13 ) { // initialize upon first loading formula if(getBarState() == BARSTATE_ALLBARS) { //get today's date stamp vNow = new Date(); //get our bar interval vInterval = getInterval(); //get our symbol vSymbol = getSymbol().toUpperCase() ; // for RTH, eg, to convert, ES Z2 to ES Z2=2 var rootSymbol = vSymbol.substring(0,3); if (rootSymbol == "ES " || rootSymbol == "NQ ") { if ( vSymbol.indexOf("=2") == -1 ) { vSymbol += "=2"; } } return null; } // return null if not an intraday chart if(vInterval == null || vInterval == "D" || vInterval == "W" || vInterval == "M" || vInterval == "T") return null; if ( bInitialized == false ) { _nProject = 0; _nLabels = frLabels == "T" ? 1 : 0; _nGap = frGap=="T" ? 1 : 0; _nFlatLines = true; _nHLC = false; _nLimitPct = 100.0; nColor = frLabColor; nMaxDays = Math.round( frDays ); vCalcInterval = frInterval[0]; for ( x=0; x<vLabelArray.length; x++ ) { vColorArray[x] = eval( "frColor"+(x+1) ); vThickArray[x] = eval( "frThick"+(x+1) ); vTypeArray[x] = eval( "frStyle"+(x+1) ); } for ( x=0; x<vLabelArray.length; x++ ) { setDefaultBarStyle(eval( "PS_"+vTypeArray[x] ), x); setDefaultBarFgColor(vCol orArray[x], x); setDefaultBarThickness(vT hickArray[x], x); } //set plot type to flat lines if user selected this option if (_nFlatLines==true) { for (x=0; x<vLabelArray.length; x++) { setPlotType(PLOTTYPE_FLAT LINES, x); } } vSymbol += ","+vCalcInterval; //get the date stamp of the most recent bar vTempDay = new Date( getValueAbsolute( "time", 0 ) ); //now move back by the number of days specified by the user, skipping weekends for ( x=1; x<nMaxDays; x++ ) { vTempDay.setDate( vTempDay.getDate()-1 ); if (vTempDay.getDay() == 6) { vTempDay.setDate( vTempDay.getDate()-1 ); } if (vTempDay.getDay() == 0) { vTempDay.setDate( vTempDay.getDate()-2 ); } } //set the date/time stamp to the very beginning of the day vTempDay.setHours( 0, 0, 0 ); bInitialized = true ; } // if first bar in new day, get and save yesterday's data var vThisDay = null; if ((vLastSeenDay != (vThisDay = getDay(0)) )) { vToday = new Date( getValue( "time", 0 ) ); if ( vToday<vTempDay ) return; var vTime = getValue( "rawtime", 0 ); if(vTime != null) { if (_nProject != 0) { //We don't project if interval is not daily //if (vCalcInterval != "D") return; if (vCalcInterval!="D") { vTime = getValue("time", 0 ); vIndex = getWM( vTime, vCalcInterval); } //otherwise, get offset to correct daily bar else { var vIndex = getFirstBarIndexOfDay(vTi me,vSymbol); } //we want to use today's data to project tomorrows //pivot points so we have to draw the lines manually //var vIndex = getFirstBarIndexOfDay(vTi me,vSymbol); if(vIndex != null) { ydayO = frOpen>0 ? frOpen : getValueAbsolute("Open", vIndex, vSymbol); ydayH = frHigh>0 ? frHigh : getValueAbsolute("High", vIndex, vSymbol); ydayL = frLow>0 ? frLow : getValueAbsolute("Low", vIndex, vSymbol); ydayC = frClose>0 ? frClose : getValueAbsolute("Close", vIndex, vSymbol); //calcuate Pivot P = (ydayH + ydayL + ydayC) / 3; //calculate yesterday's Midpoint MP = (ydayH + ydayL)/2; //calculate yesterday's Waist W = (ydayO + ydayC)/2; //calculate the R/S variables R1 = 2 * P - ydayL; S1 = 2 * P - ydayH; R2 = (P - S1) + R1; S2 = P - (R1 - S1); R3 = (P + R2) - S1; S3 = (P - R2) + S1; M6 = (R2+R3)/2; M5 = (R2+R1)/2; M4 = (R1+P)/2; M3 = (S1+P)/2; M2 = (S2+S1)/2; M1 = (S2+S3)/2; clearLines(); clearText(); if ( frMid=="T" ) vOutputArray = new Array (R3,M6,R2,M5,R1,M4,P,M3,S 1,M2,S2,M1,S3) else vOutputArray = new Array (R3,null,R2,null,R1,null, P,null,S1,null,S2,null,S3 ); drawLines( vOutputArray ); vLastSeenDay = vThisDay; return null; } return null; } else { //Get today's open in case we need it for gaps vToday = getFirstBarIndexOfDay( vTime, vSymbol); if (vToday != null) { tdayO = getValueAbsolute("Open", vToday, vSymbol ); } //we are using yesterday's data to build today's pivots so //just return the values as an array to eSignal if (vCalcInterval=="D") { var vYDay = getPreviousTradingDay(vTi me,vSymbol); } else { vTime = getValue( "time", 0 ); var vYDay = vTime; } if(vYDay != null) { //if not on daily bars, find offset to correct weekly or monthly bar if (vCalcInterval!="D") { vIndex = getWM( vTime, vCalcInterval); } //otherwise, get offset to correct daily bar else { var vIndex = getFirstBarIndexOfDay(vYD ay,vSymbol); } if(vIndex != null) { ydayO = frOpen>0 ? frOpen : getValueAbsolute("Open", vIndex, vSymbol); ydayH = frHigh>0 ? frHigh : getValueAbsolute("High", vIndex, vSymbol); ydayL = frLow>0 ? frLow : getValueAbsolute("Low", vIndex, vSymbol); ydayC = frClose>0 ? frClose : getValueAbsolute("Close", vIndex, vSymbol); //calcuate Pivot P = (ydayH + ydayL + ydayC) / 3; //calculate yesterday's Midpoint MP = (ydayH + ydayL)/2; //calculate yesterday's Waist W = (ydayO + ydayC)/2; //calculate the R/S variables R1 = 2 * P - ydayL; S1 = 2 * P - ydayH; R2 = (P - S1) + R1; S2 = P - (R1 - S1); R3 = (P + R2) - S1; S3 = (P - R2) + S1; M6 = (R2+R3)/2; M5 = (R2+R1)/2; M4 = (R1+P)/2; M3 = (S1+P)/2; M2 = (S2+S1)/2; M1 = (S2+S3)/2; //display full or half gap... only if daily bars being used for pivot if ((_nGap>0) && (vCalcInterval=="D")) { if (_nGap==1){ vGap = (tdayO-ydayC); setStudyTitle("TTM-Pivots (Daily w/Gap)"); } P += vGap; R1 += vGap; S1 += vGap; R2 += vGap; S2 += vGap; R3 += vGap; S3 += vGap; M6 += vGap; M5 += vGap; M4 += vGap; M3 += vGap; M2 += vGap; M1 += vGap; } if (vCalcInterval=="W") { setStudyTitle("TTM-Pivots (Weekly)"); } else if (vCalcInterval=="M") { setStudyTitle("TTM-Pivots (Monthly)"); } if ( frMid=="T" ) vOutputArray = new Array (R3,M6,R2,M5,R1,M4,P,M3,S 1,M2,S2,M1,S3) else vOutputArray = new Array (R3,null,R2,null,R1,null, P,null,S1,null,S2,null,S3 ); vResultArray = reduceLines( vOutputArray, _nLimitPct, close() ); if (_nLabels==1) drawLabels( vResultArray ); vLastSeenDay = vThisDay; return vResultArray; } } return null; } } } // else just return the saved data else { if (_nProject==0) { vResultArray = reduceLines( vOutputArray, _nLimitPct, close() ); if (_nLabels==1) drawLabels( vResultArray ); return vResultArray; } } } //== Convert array elements to null if they are more than x% away from //== the current price (reduces the nnumber of lines drawn on the screen) function reduceLines( aArray, nCt, nPrice ) { var x; var xPct; var xTmp; var aReturn; if (aArray==null) return; xPct = nCt/100; for (x=0; x<aArray.length; x++) { if (aArray[x] != null) { xTmp = Math.abs((aArray[x] - nPrice) / nPrice); if (xTmp > xPct) { aArray[x] = null; } } } aReturn = new Array(); for (x=0; x<aArray.length; x++) { aReturn[x] = aArray[x]; } return( aReturn ); } //== Find the correct weekly or monthly bar based upon //== the date passed to this function function getWM( xTime, xInterval ) { var x; var c = xTime.getTime(); var d1; var d2; //Weekly and Monthly bars are date stamped with the last bar of week or month and //time stamped at 00:00 hours which would be the morning of that day. To facilitate //a comparison check, I add 1-day minus 1 millisecond to the value. x = 0; while( true ) { d1 = getValueAbsolute("Time", -x, getSymbol()+","+xInterval ).getTime()+86399999; d2 = getValueAbsolute("Time", -(x+1), getSymbol()+","+xInterval ).getTime()+86399999; if ((d2==null) || (d1==null)) return( null ); if ((c>d2) && (c<=d1)) { //we want the prior week or month so add 1 to the index return( -(x+1) ); } x++; } return( null ); } //== gID function assigns unique identifier to graphic/text routines function gID() { grID++; return( grID ); } //== draw text labels for the s/r levels function drawLabels( dataArray ) { var x; var sTmp; var sPrice; var xFlags; if ( dataArray==null ) return; //this prevents the labels from printing a gazillion times //as the chart is being built. Speeds up processing if (getCurrentBarIndex() != -1) return; //cycle through the output array and add the corresponding prefix //from the static label array for (x=0; x<dataArray.length; x++) { if (vCalcInterval=="D") sTmp = vLabelArray[x]+"="; if (vCalcInterval=="W") sTmp = vLabelArrayW[x]+"="; if (vCalcInterval=="M") sTmp = vLabelArrayM[x]+"="; if ( dataArray[x] != null ) { if (getBuildNumber() >= 564) { sPrice = formatPriceNumber( dataArray[x] ); xFlags = Text.VCENTER | Text.BOLD | Text.ONTOP; } else { sPrice = rnd( dataArray[x], 2 ); xFlags = Text.BOLD | Text.BOTTOM | Text.ONTOP; } drawTextAbsolute(nOffset, dataArray[x], sTmp+sPrice, nColor, null, xFlags , sFont, nFontSize, gID()); } } return; } //== rnd will round to N digits. function rnd(value, N) { var n; var mult=1; for(n=0;n<N;n++) mult*=10; value*=mult; return Math.round( value,N)/mult; } |
|
By
philloo
on
10-18-2007, 12:48 PM
|
|
Re: Soultrader's Pivots for Tradestation
|