static int EventPresent (int *es, int m, int cb) {
// Используется функцией Rules для облегчения кодирования
int i ;
for(i=cb- m+l; i<=cb; i++)
if(es[i]) return TRUE;
return FALSE ;
}
static void Rules (float *opn, float *hi, float *lo, float *cls, float *vol, float *oi, float *atr, int nb, int vl, float v2, float v3, float v4, int *ans) {
// Процедура определяет шаблоны правил, используемых
// в генетическом процессе эволюции модели, основанной на правилах.
// opn, hi, lo, cls — стандартные ценовые данные [l..nb]
// vol, oi — объем и открытый интерес [l..nb]
// nb — количество дней
// vl, v2, v3, v4 — селектор правил и параметры
// ans — выходные ценовые данные [l..nb]
// локальные макрофункции
#define LinearScale(х,a,b) ( (х)* ( {b}- (а))/1000.0+(а) )
#define BiasedPosScale(х,а) (0 . 000001*(х)*(х)*{а})
#define Compare{a,b,dir) (((dir)> = 0)?((a)>(b) }: (fa)<(b)))
// локальные переменные
static int lbl, lb2, per, cb, maxlb=100;
static float thr, fac, thr2, thrl, tmp, tiny=l.ОЕ- 20;
static int IsNewHigh[MAXBAR+l], IsNewLow[MAXBAR+l];
static float Serl[MAXBAR+1] ;
// шаблоны правил
switch(vl} { // выбираем правило
case 1: // сравнение изменения цены с порогом
lb1 = (int)BiasedPosScale(v2, 50.0);
lb2 = (int)BiasedPosScale(v3, 50.0);
fac = LinearScale(v4, - 2.5, 2.5) * sqrt(abs(lbl - I b 2 ) > ;
for(cb- maxlb; cb<=nb; cb++) {
thr = fac * atr [cb];
ans[cb] = cls[cb- lbl] - cls[cb- lb2] > thr;
]
break;
case 2: // сравнение цены с простым скользящим средним
per = 2 + (int)BiasedPosScale(v2, 48.0);
Averages(Serl, cls, per, nb) ;
for(cb=maxlb; cb<=nb; cb++)
ans[cb] = Compare(cls[cb], Serl[cb], V4- 500.0);
break;
case 3: // сравнение цены с экспоненциальным скользящим средним
per = 2 + (int)BiasedPosScale(v2, 48.0);
XAverageS(Serl, cls, per, nb) ;
for(cb- maxlb; cb<=nb; cb++)
ans[cb] = Compare(cls[cb], Serl[cb], V4- 500.0);
break;
case 4: // сравнение падения открытого интереса с пороговым значением
1b1 = 2 + (int)BiasedPosScale (v2, 48.0);
thr = LinearScale(v3, 0.01, 0.50);
for{cb=maxlb; cb<=nb; cb++) {
tmp = (oi[cb- lbl] - oi[cb- l]) / (oi [cb- lbl] + tiny);
ans [cb] = tmp > thr;
]
break;
case 5: // сравнение увеличения открытого интереса с пороговым значением
1b1 = 2 + (int) BiasedPosScale(v2, 48.0);
thr = LinearScale(v3, 0.01, 0.99);
for(cb=maxlb; cb<=nb; cb++) {
tmp = (oi [cb- 1] - oi[cb- lblj) / (oi [cb- lbl] + tiny) ;
ans [cb] = tmp > thr;
}
break;