SIDEBAR

System Implementation


by Jeffrey Owen Katz, Ph.D.,
with Donna L. McCormick

SIDEBAR FIGURE 1:
C++ System Implementation.

Here's the equivalent of a TradeStation system module. Please refer to Technical Analysis of STOCKS & COMMODITIES magazine, January 1997, for complete text of this article.





void SC_Art3_Model (float **d, int nb, float *p, float *res, TRDSIM &tsim)
{
  static float prices[22], avgdiff1, avgdiff2, oldprofit, tmp1, tmp2;
  static int cb, i, j, k;
  static bool condition1, condition2, firstpass=TRUE;

  #define diff1 d[101]
  #define diff2 d[102]

  // obtain guess of model parameters from genetic optimizer
  int   n1 = (int)   (p[1] = (int)   p[1]);      // 1..21
  int   n2 = (int)   (p[2] = (int)   p[2]);      // 1..21
  float n3 = (float) (p[3] = (float) p[3]);      // -2.0..2.0
  int   m1 = (int)   (p[4] = (int)   p[4]);      // 1..21
  int   m2 = (int)   (p[5] = (int)   p[5]);      // 1..21
  float m3 = (float) (p[6] = (float) p[6]);      // -2.0..2.0

  // for each bar...
  for (cb = 50; cb <= nb; cb++) {

     // update tsim, a simulated trading account
     tsim.update (O[cb], H[cb], L[cb], C[cb], cb);

     // assemble array of prices for easy comparison (see text)
     prices[1] = O[cb+1];
     for (i = 0; i < 5; i++) {
        prices[2+4*i] = C[cb-i];
        prices[3+4*i] = L[cb-i];
        prices[4+4*i] = H[cb-i];
        prices[5+4*i] = O[cb-i];
     }

     // compute absolute differences as series variables
     diff1[cb] = fabs (prices[m1] - prices[m2]);
     diff2[cb] = fabs (prices[n1] - prices[n2]);

     // evaluate trading rules (use lookback of 110 bars)
     if (cb > 110) {
        avgdiff1 = Average (diff1, 25, cb);
        avgdiff2 = Average (diff2, 25, cb);
        condition1 = prices[m1] > prices[m2] + m3 * avgdiff1;
        condition2 = prices[n1] > prices[n2] + n3 * avgdiff2;
        if (condition1 == TRUE && condition2 == TRUE) {
            tsim.buy_open();            // buy tomorrow's open
            tsim.exit_long_close();     // exit tomorrow's close
                        }
     }

     // return system fitness (see text)
     tmp1 = tsim.net_long() + tsim.net_short();
     if (DATE[cb] == 880104) oldprofit = tmp1;
     if (DATE[cb] == 941230) res[1] = tmp1 - oldprofit;
  }
}











Excerpted from an article originally published in the January 1997 issue of Technical Analysis of STOCKS & COMMODITIES magazine. 
© Copyright 1996, Technical Analysis, Inc. All rights reserved.

Back to Katz & McCormick Abstract or return to January Contents