can multicharts' easylanguage the same as TS?

Questions about MultiCharts and user contributed studies.
bill
Posts: 9
Joined: 20 Nov 2006

can multicharts' easylanguage the same as TS?

Postby bill » 14 May 2009

I've been using TS 8 for the last few years, lately I am trying to see if multicharts works for me, however I have a few indicators(written in easylanguage and working for TS) can't compile with multicharts.

Just want to see what can I do to get it work

User avatar
TJ
Posts: 6584
Joined: 29 Aug 2006
Location: Global Citizen
Has thanked: 970 times
Been thanked: 1907 times

Postby TJ » 14 May 2009

it's a rare occasion that a TS8 study won't compile in MC.

you can post the code here... we can give you a hand.

or, post the error message, we will try our best to guess.

or, send the code to tech support. they are very helpful and responsive.

bill
Posts: 9
Joined: 20 Nov 2006

Postby bill » 14 May 2009

seems the word 'switch' and the word 'cancel' is costing problem. here is the code.

[LegacyColorValue = TRUE];




Inputs:
{*******SETUP PARAMETERS****}
Setup(9), {Number of Bars needed for Setup}
Lookback(4), {Reference bar of Setup}
Su_Price(Close), {Price used for comparison during Setup}
SetUp_EQ(False), {If true, comparison above during Setup uses <= and >=
If false, comparrison uses < and >.}
SS_Pric1(Low), {"Price" used to collect Sell Setup Low "Price", will be compared
to during countdown for possible recycle}
SS_Pric2(High), {"Price" used during Countdown to compare to Low Price
formed during SetUp for recycle}

{*******INTERSECTION PARAMETERS****}
Int_On(false), {If true, requires intersection
if false, no intersection required}
I_Signal(8), {First Bar of Setup to look for intersection}
I_Flag(True), {If true, looks for intersection during and after the setup is complete
If false, then looks for intersection only during SetUp,
starting with "I_Signal" bar}

{*******COUNTDOWN PARAMETERS****}
ContDown(13), {Number of Bars needed for Countdown}
C_Look(2), {Reference bar of CountDown}
CS_Price(Close), {"Price" used to compare to High of "2" bars ago during
a "Sell" CountDown}
Count_EQ(True); {If true, comparrison of prior bar uses <= and >=
If false, comparrison of prior bar uses < and >.}

Inputs:
{*******RECYCLE PARAMETERS****}
{***Note - A "Recycle" causes all of the CountDown Numbers to be
removed from the Chart***}
Before(True), {If true and you get a 9 setup in the same direction before the
completion of countdown, you "RECYCLE" - Restart Countdown}
On13(True), {If true and you get a 9 setup in the same direction ON the
completion of countdown, you "RECYCLE" - Restart Countdown}
After(True), {If true and you get a 9 setup in the same direction after the
completion of countdown, AND there has not been an intervening
"1" Setup counter in the opposite direction since the
completion of CountDown, you "RECYCLE" - Restart
Countdown}
Ignre1st(False), {If true, the first occurance of a "Recycle" will be ignored. In this
case, it will Recycle the 1st time there is a subsequent new 9 count.
If false, it will Recycle on the first occurance of a new 9 count}
IgnreSml(True), {If true, a subsequent new 9 count will be ignored if it has a
smaller true range from high to low}
SmlFactr(1), {Used to determine a smaller true range.
1.00 = Any smaller true range
.50 = Any true range that is half the size of the initial}
IgnreLrg(True), {If true, a subsequent new 9 count will be ignored if it has a
larger true range from high to low}
LrgFactr(1.618), {Used to determine a larger true range.
1.618 = Any true range that is more than 1.618 times the initial
1.00 = Any larger true range}

{*******Qualifier Parameters********}
{**This section allows us to to compare any 2 prices for additional confirmation.
You can compare a Setup bar to another Setup bar, a SetUp bar to a CountDown
bar or a CountDownBar to another CountDown Bar. The comparrison is in the
format of :
if Price of Qual1 is < Price of Qual2 then the Sequential is qualified
(For a Buy Setup). It would be ">" for a Sell Setup. An optional "=" sign
is available for <= (>=)**}
Qualify(True), {If true, perform this additional qualification}
Q_Price1(Close), {Price of first Qualifier}
Q_Price2(Close), {Price of Second Qualifier}
Q_Type1(2), {A "1" represents a bar in the SetUp phase of Sequential}
{A "2" represents a bar in the CountDown Phase of Sequential}
Q_Type2(2),
Q_Bar1(13), {This represents the Number of the bar in that phase}
Q_Bar2(8),
Q_UseEq(True), {If true, uses <= or >= for comparrison}
{***For example: If you want to say that for a Buy Sequential, the close of the 6
CountDown bar has to be < the close of the 8 Setup bar, you would
set the following parameters.
Q_Price1(close) USE CLOSE
Q_Price2(close) USE CLOSE
Q_Type1(2) CountDown Phase
Q_Type2(1) SetUp Phase
Q_Bar1(6) Bar # 6
Q_Bar2(10) Bar # 10
Q_UseEq(false) Don't use = sign in comparrison}

Color(Tool_Red),
Pt_Ofset(0),
AlrtBars(5); {If an alert is used, the Alert will be active this number of bars
after the initial alert}

Vars:pPt_Ofset(0);
if PT_Ofset = 0
then pPT_Ofset = Average(Range,maxbarsback) * .6
else pPt_Ofset = Pt_Ofset Points;

vars:Switch(0),SetUpCount(0),Intersection(false),SetupFlag(false),x(0),
CountDown(0),OK2CountDown(false),Direction(0),AutoMaticRecycle(false),
NineBarNumber(0),SetUpLow(0),CountPrice(0),Halt(false),Qual1(0),Qual2(0),
OK2Plot(false),Recycle(false),FirstRecycle(true),_13Bar(0),LastCountDown(0),
Stringg(""),AlertBarNum(-1000),StarCount(0),Smaller(false),Larger(false),
SetUpRange(0),PrevSetUpRange(0);

Arrays:RefNum[100](0),StarRefNum[150](0);

if barnumber = 1 then
begin
if Setup < 2 or Setup > 99 or
Lookback < 1 or Lookback >= Setup or
ContDown < 1 or Contdown > 99 or
C_Look < 1 or C_Look >= ContDown
then Halt = true;
plot1(l,"l");
end;

if Halt = false then BEGIN

Recycle = false;
AutoMaticRecycle = false;

if SetUp_EQ = false then
begin
if Su_Price = Su_Price[Lookback] then Switch = 0;
if Su_Price > Su_Price[Lookback] then Switch = 1; {***Looking for a Sell Set Up*****}
if Su_Price < Su_Price[Lookback] then Switch = -1; {***Looking for a Buy Set Up*****}
end
ELSE
begin
if Su_Price = Su_Price[Lookback] then Switch = Switch[1]; {= so use last Switch}
if Su_Price > Su_Price[Lookback] then Switch = 1; {***Looking for a Sell Set Up*****}
if Su_Price < Su_Price[Lookback] then Switch = -1; {***Looking for a Buy Set Up*****}
end;

if OK2CountDown then
begin {***Continue CountDown***}
if Direction = 1 then
begin {***Looking for a Sell setup***}

{***Have we gone below the Low "Price of the Setup? If condition1 is true,
it is OK to proceed. If not, we must recycle***}
condition1 = (SS_Pric2>SetUpLow and SetUp_EQ) or
(SS_Pric2>=SetUpLow and SetUp_EQ=false);
if Condition1 = false then
begin {***Exceeded low, must recycle***}
OK2CountDown = false;
AutoMaticRecycle = true;
end;
{***Check "Price" of current Bar with high of "2" bars ago***}
CountPrice = CS_Price;
if Condition1 then
condition2 = (Count_EQ and CountPrice >= high[C_Look]) or
(Count_EQ = false and CountPrice > high[C_Look]);
if Condition1 and Condition2 then
begin
CountDown = CountDown + 1;
{***Added a new bar to countdown, see if we need to save it for a Qualification***}
if Qualify then
begin
if Q_Type1 = 2 and Q_Bar1 = CountDown then Qual1 = Q_Price1;
if Q_Type2 = 2 and Q_Bar2 = CountDown then Qual2 = Q_Price2;
end;
end;

if CountDown > CountDown[1] then
begin
Stringg = NumToStr(CountDown,0);
OK2Plot = true;
if CountDown = Contdown then
begin
{**At last bar of countdown, check for Additional Qualification, if we don't qualify
Print and * and postpone countdown**}
if Qualify and
((Q_Type1 = 2 and Q_Bar1 = CountDown) or
(Q_Type2 = 2 and Q_Bar2 = CountDown)) then
begin
if Q_UseEQ then if Qual1< Qual2 then OK2Plot = false;
if Q_UseEQ = false then if Qual1 <= Qual2 then OK2Plot = false;
end;
if OK2Plot = false then
begin
CountDown = CountDown-1;
Ok2Plot = true;
Stringg = "*";
StarCount = StarCount+1;
end
ELSE
begin
_13Bar = barnumber;
{**Save this CountDown Value for Later possible Recycle use***}
LastCountDown = CountDown;
end;
end;
if OK2PLot then
begin
{*****Put CountDown # on Chart*****}
if Stringg = "*" then
begin
StarRefNum[StarCount]=Text_New(date,time,high+pPt_Ofset,Stringg);
value1 = StarRefNum[StarCount];
end
ELSE
begin
RefNum[CountDown]=Text_New(date,time,high+pPt_Ofset,Stringg);
value1 = RefNum[CountDown];
end;
value2 = Text_SetStyle(value1{RefNum[CountDown]},2,2);
value2 = Text_SetColor(value1{RefNum[CountDown]},Color);
end;
if CountDown = ContDown then
begin
OK2CountDown = false;
AlertBarNum = barnumber;
Alert = true;

end;
end;
end;
end;

if Switch = Switch[1] then
begin
if SetUpCount < Setup then
begin
SetUpCount = SetUpCount + 1;
{***Added a new bar to SetUP, see if we need to save it for a Qualification***}
if Qualify then
begin
if Q_Type1 = 1 and Q_Bar1 = SetUpCount then Qual1 = Q_Price1;
if Q_Type2 = 1 and Q_Bar2 = SetUpCount then Qual2 = Q_Price2;
end;
end;
if SetUpCount = Setup and SetUpCount[1] = Setup - 1 then
begin {***New "9-count", recycle and paint bars ***}

{***Decide if we need to RECYCLE and remove CountDown #'s from bars***}

{*If we get a Nine count in opposite direction, automatically Recycle*}
if Switch = 1 then SetUpRange = 0;
if Switch = -1 and OK2CountDown then
begin
AutoMaticRecycle = true;
OK2CountDown = false;
end;

{*If we get a 9 count in the same direction, we may or may not Recycle*}

if Switch = 1 and LastCountDown = ContDown and LastCountDown[1] = ContDown
and After and MRO(Switch=-1,Barnumber-_13Bar,1) = -1
then Recycle = true;
if Switch = 1 and (OK2Countdown or CountDown = ContDown) then
begin
if CountDown < ContDown and Before and CountDown <> 0
then Recycle = true;
if CountDown = ContDown and CountDown[1] <> ContDown
and ON13 then Recycle = true;

end;

NineBarnumber = barnumber;

{***Save the highest(for a sell) or lowest(for a buy) "Price" during Setup.
Need to to use it during countdown for possible "Recycle".***}
if Switch = 1 then
begin {**Sell Setup, save Lowest "Price"***}
SetUpLow = Lowest(TrueLow,Setup);
PrevSetUpRange = SetUpRange;
SetUpRange = Highest(TrueHigh,Setup) - Lowest(TrueLow,Setup);
Smaller = SetUpRange < (PrevSetUpRange * SmlFactr);
Larger = False;
If PrevSetUpRange <> 0 Then Larger = SetUpRange > (PrevSetUpRange * LrgFactr);
{If we have a smaller Setup and we ARE NOT ignoring a smaller Setup,
then cancel Countdown}
if Smaller and (IgnreSml = false) then AutoMaticRecycle = True;

{If we have a larger Setup and we ARE NOT ignoring a larger Setup,
then cancel Countdown}
if Larger and IgnreLrg = false then AutoMaticRecycle = True;
end;
end;
if SetUpCount >= I_Signal and Intersection = false then
begin {*****Check for intersection*****}
{***If we do not require intersection (Int_On = false), set Intersection
flag to true***}
if Int_On = false then Intersection = true;
{***Are we allowed to check for intersection yet?***}
if I_Flag = true or (I_Flag = false and SetUpCount[1] <= SetUP-1) then
begin {**OK to look for intersection**}
x = 3;
while x <= (SetUpCount -1) and Intersection = false
begin
if Switch = 1 and low < high[x]
then Intersection = true;
{ if Switch = -1 and high > low[x]
then Intersection = true;}
x = x+1;
end;
end;
end;
end
else
begin
SetUpCount = 1;
Intersection = false;
end;

if CountDown = ContDown and Switch = 1 then CountDown = 0;

if Recycle or (AutoMaticRecycle and CountDown <> 0) then
begin {**May be OK2 Recycle***}
{If we ARE NOT ignoring the 1st Recycle, then cancel Countdown
If AutoMaticRecycle is true, then cancel Countdown
If this IS NOT the 1st Recycle, cancel Countdown}
if ((Ignre1st = false) or AutoMaticRecycle or
(Ignre1st and FirstRecycle = false)) then
begin {****Remove Numbers****}
{***Turn off Alert***}
AlertBarNum = -1000;
if CountDown = 0 then Value86 = LastCountDown else value86 = CountDown;
for x = 1 to Value86
begin
value2 = Text_Delete(RefNum[x]);
end;

{****Delete Stars if necessary*****}
for x = 1 to StarCount
begin
value2 = Text_Delete(StarRefNum[x]);
end;
StarCount = 0;
CountDown = 0;
LastCountDown = 0;
end;
if Ignre1st and FirstRecycle then FirstRecycle = false;
Recycle = false;
end;

if (Intersection and Intersection[1] = false and SetUpCount = Setup) OR
(Intersection and SetUpCount[1] = Setup - 1) then

{*******************************************}
begin {***Just had intersection on this bar, it may be bar 9 or subsequent bar***}
if Recycle or CountDown = 0 then
begin
CountDown = 0;
if Switch = 1 then Ok2CountDown = true;
end;
{****************************}
if Switch = 1
then Direction = 1
else Direction = -1;

if Direction = -1 or OK2CountDown[1] = false then FirstRecycle = true;
if SetUpCount = SetUp and Direction = 1 and CountDown = 0 then
begin {**We are at the last SetUpBar, Countdown may begin now**}
condition1 = (SS_Pric2>SetUpLow and SetUp_EQ) or
(SS_Pric2>=SetUpLow and SetUp_EQ=false);
if Condition1 = false then
begin {***Exceeded low, must recycle***}
OK2CountDown = false;
Recycle = true;
end;

{***Check "Price" of current Bar with high of "2" bars ago***}
CountPrice = CS_Price;
if Condition1 then
condition2 = (Count_EQ and CountPrice >= high[C_Look]) or
(Count_EQ = false and CountPrice > high[C_Look]);
if Condition1 and Condition2 then
begin
CountDown = 1;
{***Added a new bar to countdown, see if we need to save it for a
Qualification***}
Stringg = NumToStr(CountDown,0);
if Qualify then
begin
if Q_Type1 = 2 and Q_Bar1 = CountDown then Qual1 = Q_Price1;
if Q_Type2 = 2 and Q_Bar2 = CountDown then Qual2 = Q_Price2;
{***Code added 2/24/97 if we do not qualify, postpone countDown, put an * on
chart and continue CountDown. ***}

if ((Q_Type1=2 and Q_Type2=2) and CountDown=MaxList(Q_Bar1,Q_Bar2))
or ((Q_Type1=1 and Q_Type2=2) and CountDown=Q_Bar2)
or ((Q_Type1=2 and Q_Type2=1) and CountDown=Q_Bar1) then
begin {**We at the last qualifier? Check for qualification***}
if Q_UseEQ then if Qual1 < Qual2 then OK2Plot = false;
if Q_UseEQ = false then if Qual1 <= Qual2 then OK2Plot = false;
end;
if OK2Plot = false then
begin
CountDown = CountDown-1;
Ok2Plot = true;
Stringg = "*";
StarCount = StarCount +1;
end;
end;
OK2Plot = true;
{*****Put CountDown # or * on Chart*****}
if Stringg = "*" then
begin StarRefNum[StarCount]=Text_New(date,time,high+pPt_Ofset,Stringg);
value1 = StarRefNum[StarCount];
end
ELSE
begin
RefNum[CountDown]=Text_New(date,time,high+pPt_Ofset,Stringg);
value1 = RefNum[CountDown];
end;

value2 = Text_SetStyle(value1{RefNum[CountDown]},2,2);
value2 = Text_SetColor(value1{RefNum[CountDown]},Color);
end;
end;
end;

if CountDown = 1 then StarCount = 0;
end;



if barnumber <= AlertBarNum + AlrtBars then Alert = true;


see if you can help me to sort the problem.

Actually I have 12 indicators that doesn't compile. most of the problem is similar to the one above.

User avatar
TJ
Posts: 6584
Joined: 29 Aug 2006
Location: Global Citizen
Has thanked: 970 times
Been thanked: 1907 times

Postby TJ » 14 May 2009

you guess is correct.


1. SWITCH is a reserved word in TS.
It is not in the MC dictionary, it seems that MC has reserved the word for future support. That's why you cannot use it as a variable name.


2. you have to use Cancel Alert.
just add ALERT to Cancel.

.

bill
Posts: 9
Joined: 20 Nov 2006

Postby bill » 15 May 2009

Thanks very much

is there any other word that I can use instead of this 'switch' in order to make this indicator work?

SP
Posts: 444
Joined: 06 Feb 2006
Has thanked: 36 times
Been thanked: 280 times

Postby SP » 15 May 2009

Go to switch, right click "replace", replace it with "MySwitch" and select replace all.

The main problems in MC are with older strategies. While TS 8... converts exitlong/exitshort automatic with sell/buytocover if you import an older ela, MC doesnt. If the code is closed you couldnt replace it yourself.

bill
Posts: 9
Joined: 20 Nov 2006

Postby bill » 15 May 2009

Thank you very much, I got most of them compile, the rest is password lock, is there anyway to unlock it?

Though I manage to compile the indicator, here comes another problem, when I the indicator to the chart, a red box appear on my right bottom screen saying this:

Message: Error in Study "TD Sell SetUp" :{EXCEPTION} Floating-point invalid operation

Is there anything I could do to make this indicator work?


Return to “MultiCharts”