I think he is looking for a way to capture all indicator inputs in an EA circumventing the need for input values for each indicator. The alternative in his backtester is to manually edit every indicator with a signal buffer .
Try this a bit straightforward but the only approach possible so far.
enum XXX {x1 = -10, x2 = 0, x3 = 11};
template<typename E>
int EnumToArray(E dummy, int &values[], constint start = INT_MIN, constint stop = INT_MAX)
{
string t = typename(E) + "::";
int length = StringLen(t);
ArrayResize(values, 0);
int count = 0;
for(int i = start; i < stop && !IsStopped(); i++)
{
E e = (E)i;
if(StringCompare(StringSubstr(EnumToString(e), 0, length), t) != 0)
{
ArrayResize(values, count + 1);
values[count++] = i;
}
}
return count;
}
intOnInit()
{
Print("ENUM elements:");
XXX a;
int result[];
int n = EnumToArray(a, result, -100, 100);
Print("Count=", n);
for(int i = 0; i < n; i++)
{
Print(i, " ", EnumToString((XXX)result[i]), "=", result[i]);
}
return0;
}
Outputs:
ENUM elements:
Count=3
0 x1=-10
1 x2=0
2 x3=11
It's important to specify reasonable values for parameters start and stop , because the cycle from minimal to maximal integer value (which is used by default when the parameters are skipped) executes tooooo slow taking into account that string functions are used inside.
I know this conversation is quite old but here is an easy way to fill an array of any enum type.
voidOnStart()
{
ENUM_TIMEFRAMES array[];
int total_elements = enumFillArray(array);
printf("There are %d elements in the ENUM_TIMEFRAMES array.",
total_elements
);
for(int i=0;i<total_elements;i++)
Print(EnumToString(array[i]));
}
template<typename T>
int enumFillArray(T& res_array[])
{
ArrayResize(res_array,0);
int iter = 100000;
for(int i=-iter;i<iter;i++)
if(StringFind(EnumToString((T)i),"::")<0)
{
int index = ArrayResize(res_array,ArraySize(res_array)+1)-1;
res_array[index] = (T)i;
}
returnArraySize(res_array);
}
Just adding my solution for future generations on how I've solved this.
So the problem is knowing the number of entries in the enum dynamically with the ability to add or remove enum values. I need to know this for creating fixed sized arrays with enum values as the array index. What I tend to do is add a reserved value at the end of the enum that is only ever used as a length value. Here's an example.
enum ENUM_ENTRIES
{
SMALL_ENTRY = 0,
MEDIUM_ENTRY,
LARGE_ENTRY,
VERY_LARGE_ENTRY,
_ENUM_ENTRIES
};
ObjectType *entryArray[_ENUM_ENTRIES];
// Setting individual entries
entryArray[MEDIUM_ENTRY] = new ObjectType();
entryArray[LARGE_ENTRY] = new ObjectType();
// Looping through the arrayfor(int i = 0; i < _ENUM_ENTRIES; i++) {
entryArray[i] = new ObjectType();
}
This is nice and easy because you don't need to be fixed to the last entry everywhere like
// Fixed to last entry +1
ObjectType *entryArray[VERY_LARGE_ENTRY + 1];
for(int i = 0; i <= VERY_LARGE_ENTRY; i++) {
}
or you could add more entries to the end of the enum and the array and loop will still work.
/*
* Expanded enum entries
*/enum ENUM_ENTRIES
{
SMALL_ENTRY = 0,
MEDIUM_ENTRY,
LARGE_ENTRY,
VERY_LARGE_ENTRY,
EXTRA_LARGE_ENTRY,
EXTREMELY_LARGE_ENTRY,
_ENUM_ENTRIES
};
/*
* Previous code untouched and still works
*/
ObjectType *entryArray[_ENUM_ENTRIES];
// Setting individual entries
entryArray[MEDIUM_ENTRY] = new ObjectType();
entryArray[LARGE_ENTRY] = new ObjectType();
// Looping through the arrayfor(int i = 0; i < _ENUM_ENTRIES; i++) {
entryArray[i] = new ObjectType();
}
To obtain the current market information there are several functions: SymbolInfoInteger(), SymbolInfoDouble() and SymbolInfoString(). The first parameter is the symbol name, the values of the second function parameter can be one of the identifiers of ENUM_SYMBOL_INFO_INTEGER, ENUM_SYMBOL_INFO_DOUBLE and ENUM_SYMBOL_INFO_STRING. Some symbols...
in an EA circumventing the need for input values for each indicator.
The alternative in his backtester is to manually edit every indicator
with a signal buffer .
Try this a bit straightforward but the only approach possible so far.
Outputs:
ENUM elements:
Count=3
0 x1=-10
1 x2=0
2 x3=11
It's important to specify reasonable values for parameters start and stop , because the cycle from minimal to maximal integer value (which is used by default when the parameters are skipped) executes tooooo slow taking into account that string functions are used inside.
bool AddEnum(ENUMTYPE enumIn) {
enumIn = 0;
//iterate through enum and add as combo box
for(int i = 0; i<sizeof(enumIn); i++, enumIn++) {
m_list.AddItem(EnumToString(enumIn),i);
PrintFormat("adding %i = %s", i, EnumToString(enumIn));
}
return(0);
}
I added this to the CComboBox class, so I could pass in any ENUM type, and it would add it as a combo box.
But you can change it to do what you need.
The problem is, if you don't pass an ENUM and pass something like a double or float, you might crash your app.
I don't think there is any way to check the datatype passed.
bool AddEnum(ENUMTYPE enumIn) {
enumIn = 0;
//iterate through enum and add as combo box
for(int i = 0; i<sizeof(enumIn); i++, enumIn++) {
m_list.AddItem(EnumToString(enumIn),i);
PrintFormat("adding %i = %s", i, EnumToString(enumIn));
}
return(0);
}
I added this to the CComboBox class, so I could pass in any ENUM type, and it would add it as a combo box.
But you can change it to do what you need.
The problem is, if you don't pass an ENUM and pass something like a double or float, you might crash your app.
I don't think there is any way to check the datatype passed.
Yes it does, oops. I just noticed that.
It just so happens when I made this, the ENUM I was using actually had 4 properties :\
enum Combolist1{item1, item2, item3, item4, item5};
for(int i = 0; GetLastError()==0; i++) {For example, there has an enum definition:
enum ENUM_FRUIT {APPLE, BANANA, GRAPE};Next, I want to use it in loop:
FRUIT_FIRST=APPLE, FRUIT_LAST=GRAPE};
for (ENUM_FRUIT i = APPLE; i <= FRUIT_LAST; ++i) {
Print(EnumToString(i));
}
#define FRUIT_FIRST APPLE
#define FRUIT_LAST GRAPE
for (ENUM_FRUIT i = APPLE; i <= FRUIT_LAST; ++i) {
Print(EnumToString(i));
}
PERIOD_M1, PERIOD_M2, PERIOD_M3, PERIOD_M4, PERIOD_M5, PERIOD_M6,
PERIOD_M10, PERIOD_M12, PERIOD_M15, PERIOD_M20, PERIOD_M30, PERIOD_H1,
PERIOD_H2, PERIOD_H3, PERIOD_H4, PERIOD_H6, PERIOD_H8, PERIOD_H12,
PERIOD_D1, PERIOD_W1, PERIOD_MN1};
ENUM_TIMEFRAMES next(ENUM_TIMEFRAMES curr){
for(int i=0; gcPeriods[i] != curr; ++i){}
return gcPeriods[i+1];
}
Bad design of what
it mean number of member store in enum ?
I know this conversation is quite old but here is an easy way to fill an array of any enum type.
Just adding my solution for future generations on how I've solved this.
So the problem is knowing the number of entries in the enum dynamically with the ability to add or remove enum values. I need to know this for creating fixed sized arrays with enum values as the array index. What I tend to do is add a reserved value at the end of the enum that is only ever used as a length value. Here's an example.
This is nice and easy because you don't need to be fixed to the last entry everywhere likeor you could add more entries to the end of the enum and the array and loop will still work.