Soultrader's Pivots for Tradestation - Page 2 - Traders Laboratory
Forum Guidelines | Contact Us
Home

Go Back   Traders Laboratory > Trading Resources > Trading Indicators

Trading Indicators Post your custom trading indicators. If you download, remember to click INSTALL.


Comment
 
LinkBack (1) Release Tools
 
Old 10-02-2006, 02:08 AM
Soultrader's Avatar
Soultrader Soultrader is offline
Soultrader is focusing on discipline.

Trader Specs
 
Join Date: Aug 2006
Location: Tokyo, Japan
Posts: 3,218
Thanks: 162
Thanked 467 Times in 208 Posts
Send a message via Skype™ to Soultrader
This member is the original thread starter. Soultrader's Pivots for Tradestation

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:
...
Attached Files
File Type: eld SOULTRADERPIVOTS.ELD (12.9 KB, 871 views)

__________________
James Lee - Founder
Forum Guidelines | Forum Manual | Support Coder | Report a Bug
------------------------------------------------------------------------------------
Empowering traders with knowledge.

Please support TL by visiting our sponsors. Thanks!
Reply With Quote
The Following User Says Thank You to Soultrader For This Useful Post:
fandor (08-20-2008)
  #10 (permalink)  
By boom-pow on 08-30-2007, 11:02 PM
Re: Soultrader's Pivots for Tradestation

Nice Update! Is there a way to display the current price on the pivot line? If not, this would also be a nice addition.
Reply With Quote
  #11 (permalink)  
By lenvec on 10-16-2007, 10:04 AM
Re: Soultrader's Pivots for Tradestation

When I put the soultrader pivots on my chart the labels show for a few seconds then disappear. Has anyone had the same problem?
Reply With Quote
  #12 (permalink)  
By Minetoo on 10-16-2007, 11:13 AM
Re: Soultrader's Pivots for Tradestation

Quote:
View Post
When I put the soultrader pivots on my chart the labels show for a few seconds then disappear. Has anyone had the same problem?
Yes, until Ant told me to remove the selection "Update value intra-bar (tick-by-tick)" under the General tab when you format the analysis technique.
Reply With Quote
  #13 (permalink)  
By philloo on 10-18-2007, 12:39 PM
Re: Soultrader's Pivots for Tradestation

Quote:
View Post
Is there any similar indicator for esignal ?
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;
}
Reply With Quote
  #14 (permalink)  
By philloo on 10-18-2007, 12:48 PM
Re: Soultrader's Pivots for Tradestation

Quote:
View Post
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;
}
I don't mention that the code are for the daliy pivots.
Reply With Quote
  #15 (permalink)  
By philloo on 10-18-2007, 01:08 PM
Re: Soultrader's Pivots for Tradestation

Well,you can chose the daily , weekly, and mountly pivots in the pivot type variables
Reply With Quote
  #16 (permalink)  
By trader_68 on 10-23-2007, 04:01 AM
Re: Soultrader's Pivots for Tradestation

Quote:
View Post