erukumk
February 10, 2022, 9:26am
#1
I have an AFL that calculates composite score based on indicator values.
Help needed in below aspects:
There must be a better way to do than the way i am doing. The code is taking about 75 seconds for 200 symbols.
Looking for guidance on running this AFL as a function that can be called from another AFL.
// AFL to calculate composite score
// PPO part is working as expected.
// CCI part is working as expected.
// ADX part is working as expected.
for( i = 1; i < BarCount; i++ )
{
CompScore = 0;
// Below values to be commented when not testing
//PPOScore = 0;
//CCIScore = 0;
_SECTION_BEGIN("PPO Calculation");
// PPO Status
// Current variables match the PPO settings
PPOScore = 0;
PPOImportance = 5;
PPOMulFac = 0;
PPOShort = 8;
PPOLong = 17;
PPOsignal = 9;
PPO = ( EMA( C, PPOShort ) - EMA( C, PPOLong ) ) / EMA( C, PPOLong );
if(PPO[I] <= -0.08)
{
PPOMulFac = -4;
} else if(PPO[I] <= -0.02){
PPOMulFac = -2;
} else if(PPO[I] <= 0.001){
PPOMulFac = 0;
} else if(PPO[I] <= 0.01){
PPOMulFac = 2;
}
ELSE{
PPOMulFac = 4;
}
PPOScore = PPOImportance * PPOMulFac;
_SECTION_END();
_SECTION_BEGIN("CCI Calculation");
CCIScore = 0;
CCIImportance = 3;
CCIMulFac = 0;
CCIPeriods = 5; // 5 periods
CCIValue = CCI(CCIPeriods);
if(CCIValue[I] <= -150)
{
CCIMulFac = -4;
} else if(CCIValue[I] <= -30){
CCIMulFac = -2;
} else if(CCIValue[I] <= 30){
CCIMulFac = 0;
} else if(CCIValue[I] <= 150){
CCIMulFac = 2;
}
ELSE{
CCIMulFac = 4;
}
CCIScore = CCIImportance * CCIMulFac;
_SECTION_END();
_SECTION_BEGIN("ADX Calculation");
ADXScore = 0;
ADXImportance = 5;
ADXMulFac = 0;
ADXPeriods = 2; // 2 periods
ADXValue = ADX(ADXPeriods);
PDIValue = PDI(ADXPeriods);
MDIValue = MDI(ADXPeriods);
if(ADXValue[I] > 25 AND PDIValue[i] > MDIValue[i]){
if(ADXValue[I]<=50 )
{
ADXMulFac = 1;
} else if(ADXValue[I]<=75 ){
ADXMulFac = 2;
} else if(ADXValue[I]<=150){
ADXMulFac = 3;
}
}if(ADXValue[I] > 25 AND MDIValue[i] > PDIValue[i]){
if(ADXValue[I]<=50 )
{
ADXMulFac = -1;
} else if(ADXValue[I]<=75 ){
ADXMulFac = -2;
} else if(ADXValue[I]<=150){
ADXMulFac = -3;
} else
ADXMulFac = 0;
}
ADXScore = ADXImportance * ADXMulFac;
_SECTION_END();
CompScore = CompScore + PPOScore + CCIScore + ADXScore;
}
Filter = 1;
AddColumn(PPOScore, "PPOScore", 1.2);
AddColumn(CCIScore, "CCIScore", 1.2);
AddColumn(ADXScore, "ADXScore", 1.2);
AddColumn(CompScore, "Composite Score", 1.2);
Creating Composites has been covered many times before - search forum before posting.
Loops (and Foreign) are not required and should not be used to create a composite.
See Add to Composite .
See Static Var Add .
Background
Some people come here and ask single-line SMS-style question (plus sometimes some random code) and expect "solution" without showing any effort made from their side.
Then all the good souls on this forum hopelessly try to figure out "what the heck original poster meant?"
So please follow the tips below so your question is more likely to get proper answer.
How to ask a good question
Follow the forum rules first: How to use this site Please use the search field in this forum, the…
erukumk
February 10, 2022, 9:40am
#3
Thank you @TrendSurfer , will take a look at Add to Composite and Static Var Add.
erukumk
February 10, 2022, 10:30am
#4
I went through Add to composite examples, i am not sure whether it provides me what i am looking for. I am not an expert programmer.
I am using for loop because i do not know of a better method to access last value and i need the last value of indicator as PPOMulFac is dependent on the last value and hence the indicator value(PPOScore). Posting a shorter (but standalone) afl below.
for( i = 1; i < BarCount; i++ )
{
CompScore = 0;
// Below values to be commented when not testing
//PPOScore = 0;
//CCIScore = 0;
_SECTION_BEGIN("PPO Calculation");
// PPO Status
// Current variables match the PPO settings
PPOScore = 0;
PPOImportance = 5;
PPOMulFac = 0;
PPOShort = 8;
PPOLong = 17;
PPOsignal = 9;
PPO = ( EMA( C, PPOShort ) - EMA( C, PPOLong ) ) / EMA( C, PPOLong );
if(PPO[I] <= -0.08)
{
PPOMulFac = -4;
} else if(PPO[I] <= -0.02){
PPOMulFac = -2;
} else if(PPO[I] <= 0.001){
PPOMulFac = 0;
} else if(PPO[I] <= 0.01){
PPOMulFac = 2;
}
ELSE{
PPOMulFac = 4;
}
PPOScore = PPOImportance * PPOMulFac;
_SECTION_END();
CompScore = CompScore + PPOScore;
}
Filter = 1;
AddColumn(PPOScore, "PPOScore", 1.2);
AddColumn(CompScore, "Composite Score", 1.2);
fxshrat
February 10, 2022, 11:08am
#5
Your loop is incorrect because you are iterating entire array ( PPO
) inside that BarCount
loop (besides other wrong doings...).
You do not need loop.
PPOScore = 0;
PPOImportance = 5;
PPOShort = 8;
PPOLong = 17;
PPOsignal = 9;
// THIS IS AN ARRAY
PPO = ( EMA( C, PPOShort ) - EMA( C, PPOLong ) ) / EMA( C, PPOLong );
// THIS IS AN ARRAY
PPOMulFac = IIf(PPO<= -0.08, -4,
IIf(PPO <= -0.02, -2,
IIf(PPO <= 0.001, 0,
IIf(PPO <= 0.01, 2, 4))));
// THIS IS AN ELEMENT OF ARRAY
last_value_PPOMulFac = LastValue(PPOMulFac);
Important read:
https://www.amibroker.com/guide/h_understandafl.html
2 Likes
system
Closed
May 21, 2022, 11:08am
#6
This topic was automatically closed 100 days after the last reply. New replies are no longer allowed.