File Name: eSignal_TRIX.efs
Description:
Based on Trading In Tempo by Jongseon Kim. This article appeared in the January 2004 issue of Stocks & Commodities.
Formula Parameters:
TRIX Length: 5
Signal Length: 3
Long Entry Signal (GC, B, Disable): GC
Long Exit Signal (DC, F): F
Short Entry Signal (DC, F, Disable): DC
Short Exit Signal (GC, B): B
Notes:
GC = Golden Cross
DC = Dead Cross
F = Fall
B = Bounce
Requires Daily, Weekly or Monthly chart interval.
The related article is copyrighted material. If you are not a subscriber of Stocks & Commodities, please visit www.traders.com.
Download File:
eSignal_TRIX.efs
EFS Code:
Description:
Based on Trading In Tempo by Jongseon Kim. This article appeared in the January 2004 issue of Stocks & Commodities.
Formula Parameters:
TRIX Length: 5
Signal Length: 3
Long Entry Signal (GC, B, Disable): GC
Long Exit Signal (DC, F): F
Short Entry Signal (DC, F, Disable): DC
Short Exit Signal (GC, B): B
Notes:
GC = Golden Cross
DC = Dead Cross
F = Fall
B = Bounce
Requires Daily, Weekly or Monthly chart interval.
The related article is copyrighted material. If you are not a subscriber of Stocks & Commodities, please visit www.traders.com.
Download File:
eSignal_TRIX.efs
EFS Code:
PHP Code:
/*****************************************************
Provided By : eSignal. (c) Copyright 2003
Indicator: TRIX
Formula Parameters: Defaults:
TRIX Length 5
Signal Length 3
Long Entry Signal (GC, B, Disable) GC
Long Exit Signal (DC, F) F
Short Entry Signal (DC, F, Disable) DC
Short Exit Signal (GC, B) B
Notes:
GC = Golden Cross
DC = Dead Cross
F = Fall
B = Bounce
*Requires Daily, Weekly or Monthly chart interval.
*****************************************************/
function preMain() {
setStudyTitle("TRIX ");
setCursorLabelName("TRIX", 0);
setCursorLabelName("Signal", 1);
setDefaultBarFgColor(Color.black, 0);
setDefaultBarFgColor(Color.red, 1);
setDefaultBarThickness(2, 0);
setDefaultBarThickness(2, 1);
var fp1 = new FunctionParameter("nLength",
FunctionParameter.NUMBER);
fp1.setName("TRIX Length");
fp1.setLowerLimit(2);
fp1.setDefault(5);
var fp2 = new FunctionParameter("nSLength",
FunctionParameter.NUMBER);
fp2.setName("Signal Length");
fp2.setLowerLimit(2);
fp2.setDefault(3);
var fp3 = new FunctionParameter("sLEntry",
FunctionParameter.STRING);
fp3.setName("Long Entry Signal");
fp3.addOption("GC");
fp3.addOption("B");
fp3.addOption("Disable");
fp3.setDefault("GC");
var fp4 = new FunctionParameter("sLExit",
FunctionParameter.STRING);
fp4.setName("Long Exit Signal");
fp4.addOption("DC");
fp4.addOption("F");
fp4.setDefault("F");
var fp5 = new FunctionParameter("sSEntry",
FunctionParameter.STRING);
fp5.setName("Short Entry Signal");
fp5.addOption("DC");
fp5.addOption("F");
fp5.addOption("Disable");
fp5.setDefault("DC");
var fp6 = new FunctionParameter("sSExit",
FunctionParameter.STRING);
fp6.setName("Short Exit Signal");
fp6.addOption("GC");
fp6.addOption("B");
fp6.setDefault("B");
}
var bEdit = true;
var vMax = null;
var vMin = null;
var nCntr = 0;
var EMA1 = null;
var EMA2 = null;
var EMA3 = null;
var vTRIX = null;
var aTrix = null;
var vSignal = null;
var vSignal1 = null;
var dPercent = 0.0;
var bPrimed = false;
var vPosition = null;
var bEntry = false;
var nSpace = null;
function main(nLength, nSLength, sLEntry, sLExit, sSEntry, sSExit) {
if (isDWM() == false) {
drawTextAbsolute(-1, 10, "Formula requires Daily, Weekly or Monthly interval.",
Color.red, Color.black,
Text.BOLD|Text.RIGHT|Text.RELATIVETOBOTTOM, null, 12, "error");
return;
}
var nState = getBarState();
nSLength = Math.round(nSLength);
if (bEdit == true || EMA1 == null) {
aTrix = new Array(nSLength);
nLength = Math.round(nLength);
EMA1 = new MAStudy(nLength, 0, "Close", MAStudy.EXPONENTIAL);
EMA2 = new MAStudy(nLength, 0, EMA1, MAStudy.MA, MAStudy.EXPONENTIAL);
EMA3 = new MAStudy(nLength, 0, EMA2, MAStudy.MA, MAStudy.EXPONENTIAL);
if (nSpace == null) {
var vInt = getInterval();
if (vInt == "D") nSpace = 0.001;
if (vInt == "W") nSpace = 0.003;
if (vInt == "M") nSpace = 0.02;
}
bEdit = false;
}
if (nState == BARSTATE_NEWBAR && vTRIX != null) {
nCntr += 1;
bEntry = false;
aTrix.pop(); // remove last array element
aTrix.unshift(vTRIX); // insert new array element [0]
}
var vEMA3 = EMA3.getValue(MAStudy.MA);
var vEMA3_1 = EMA3.getValue(MAStudy.MA, -1);
if (vEMA3 == null || vEMA3_1 == null) return;
vTRIX = (vEMA3 - vEMA3_1) / vEMA3_1;
if (vTRIX == null) return;
aTrix[0] = vTRIX;
if (aTrix[nSLength-1] == null) return;
vSignal = EMA(nSLength, aTrix);
// draw signals
var retData1 = ref(-1); // retData1[0] = TRIX, retData1[1] = Signal
var retData2 = ref(-2); // retData2[0] = TRIX, retData2[1] = Signal
if (retData1 != null && retData2 != null) {
var vT_1 = retData1[0];
var vS_1 = retData1[1];
var vT_2 = retData2[0];
var vS_2 = retData2[1];
// Long
if (bEntry == false && vPosition == null && sLEntry == "GC") {
if (vTRIX > vSignal && vT_1 < vS_1) { // GC - Golden Cross entry
drawTextRelative(0, vSignal-.001, "Long", Color.lime, Color.black,
Text.BOLD|Text.ONTOP|Text.TOP, null, 11,
"GC_long"+nCntr);
vPosition = "long";
bEntry = true;
} else {
removeText("GC_long"+nCntr);
vPosition = null;
}
} else if (bEntry == false && vPosition == null && sLEntry == "B") {
if (vTRIX > vT_1 && vT_1 < vT_2) { // B - Bounce entry
drawTextRelative(0, vTRIX-.001, "Long", Color.lime, Color.black,
Text.BOLD|Text.ONTOP|Text.CENTER, null, 11,
"B_long"+nCntr);
vPosition = "long";
bEntry = true;
} else {
removeText("B_long"+nCntr);
vPosition = null;
}
} else if (vPosition == "long" && sLExit == "DC") {
if (vTRIX < vSignal && vT_1 > vS_1) { // DC - Dead Cross exit
vPosition = null;
} else {
removeText("DC_long"+nCntr);
vPosition = "long";
}
} else if (vPosition == "long" && sLExit == "F") {
if (vTRIX < vT_1 && vT_1 > vT_2) { // F - Fall exit
vPosition = null;
} else {
removeText("F_long"+nCntr);
vPosition == "long";
}
}
// Short
if (bEntry == false && vPosition == null && sSEntry == "DC") {
if (vTRIX < vSignal && vT_1 > vS_1) { // DC - Dead Cross entry
drawTextRelative(0, vSignal+.001, "Short", Color.red, Color.black,
Text.BOLD|Text.ONTOP|Text.BOTTOM, null, 11,
"DC_short"+nCntr);
vPosition = "short";
bEntry = true;
} else {
removeText("DC_short"+nCntr);
vPosition = null;
}
} else if (bEntry == false && vPosition == null && sSEntry == "F") {
if (vTRIX < vT_1 && vT_1 > vT_2) { // F - Fall entry
drawTextRelative(0, vTRIX+.001, "Short", Color.red, Color.black,
Text.BOLD|Text.ONTOP|Text.BOTTOM, null, 11,
"F_short"+nCntr);
vPosition = "short";
bEntry = true;
} else {
removeText("F_short"+nCntr);
vPosition = null;
}
} else if (vPosition == "short" && sSExit == "GC") {
if (vTRIX > vSignal && vT_1 < vS_1) { // GC - Golden Cross exit
vPosition = null;
} else {
removeText("GC_short"+nCntr);
vPosition = "short";
}
} else if (vPosition == "short" && sSExit == "B") {
if (vTRIX > vT_1 && vT_1 < vT_2) { // B - Bounce exit
vPosition = null;
} else {
removeText("B_short"+nCntr);
vPosition == "short";
}
}
if (vPosition == "long") setBarBgColor(Color.green);
if (vPosition == "short") setBarBgColor(Color.maroon);
}
setMaxMin();
return new Array(vTRIX.toFixed(4)*1, vSignal.toFixed(4)*1);
}
/**** Functions ****/
function setMaxMin() {
if (vMax == null) {
vMax = vTRIX + nSpace;
} else {
vMax = Math.max(vMax, vTRIX+nSpace);
}
if (vMin == null) {
vMin = vTRIX - nSpace;
} else {
vMin = Math.min(vMin, vTRIX-nSpace);
}
setStudyMax(vMax);
setStudyMin(vMin);
return;
}
function EMA(nLength, nArray) {
var nBarState = getBarState();
var dSum = 0.0;
var dRef;
if(nBarState == BARSTATE_ALLBARS || bPrimed == false) {
dPercent = (2.0 / (nLength + 1.0));
bPrimed = false;
}
if (nBarState == BARSTATE_NEWBAR) {
vSignal1 = vSignal;
}
if(bPrimed == false) {
for(i = 0; i < nLength; i++) {
dSum += nArray[i];
}
bPrimed = true;
return (dSum / nLength);
} else {
return (((aTrix[0] - vSignal1) * dPercent) + vSignal1);
}
}