Back Testing Algorithmic Trading Modern Portfolio Simulator - Some Code
Previous Post | Next Post |
---|
This module (5K lines of source C++ code) is based on ExSan a multipurpose master library, It is a console-oriented worksheet tool written in C++11 that is comparable in functionality to Excel or Matlab. Some Outputs in the next entries of this blog. ExSan is already plugged into Interactive Brokers C++ API to perform live market data analysis.
This ALGORITHM is used in line 3231 .
I am looking for a job as a C/C++ developer / programmer .
My portfolio https://lnkd.in/dPC3ZuDr Personal https://lnkd.in/dDuC9uMi
Some lines of code have been omitted to protect the author's copyright.
57 /***********START***************/
58 void hft(void) {
59 setJobID("hft");
60
158 //fout << "Today is " << as::date << now << " and tomorrow is " << now + 24 * 3600 << endl;
159 //time_t now = time(0);
160 //fout << "Today is "<< as::date << now << " and tomorrow is " << now+24*3600 << endl;
161 //fout << "Current time is "<< as::time << now << endl;
162 //fout << "The current weekday is "<< as::ftime("%A") << now << endl;
163 ////*/
164 //fout << " 1 menos 99.9999998759799979797774747 = " << setprecision(33) <
165 ptime pt;
166 string temporal;
167
168 std::time_t now = std::time(0);
169 boost::random::mt19937 gen{ static_cast(now) };
170
171 string plot_smooth_data, plot_LS_data;
172
173 unsigned seed = chrono::system_clock::now().time_since_epoch().count();
174 default_random_engine generator(seed);
175
177 unsigned short xsnFileOutID(0);
178
222 }
223 /*
224 else {
225 //printf("\tOPEN Balance Sheet File: ", balanceSheet);
226 fout.flush() << "\tReady Balance Sheet File: " << balanceSheet ;
227 //return;
228 }
229 //*/
230 fstream f1db, fLS, fsos;
231
241 "stockDB_2.txt", // 2 half of stockDB
242 "stockDB_4.txt", // 3 84 quarter of stockDB
243 "stockDB_8.txt", // 4 43 1/8 of stockDB
244 "stockDB_16.txt", // 5 22 1/16 of stockDB
245 "stockDB_base.txt", // 6 7
246 "stockDB15.txt", // 7 15
247 "stockOneDB.txt", // 8
248 "stockTwoDB.txt", // 9
249 "stocki.txt", // 10
250 "stocki2.txt", // 11
251 };
252
253 unsigned short dbfileID = 4;
313 j = 0;
314 fdb.open(dbFile, ios::in); //scramble file
315 do {
316 fdb >> stock;
317 //if (fdb.eof()) break;
318 //cout << stock;
319 stockID[j] = stock; //new ary of scrambled file
320 //fout << "\t" << j << "\t"<< stockID[j] << " " << stock << endl; //system("pause");
321 j++;
322 } while (j < stockCounterDB);
323 fdb.close();
324 //return;
325
346 double sum1(0), sum2(0);
347 gnuplot plot, endLess, pltCorr, pltCorrA, pltCorrB, pltCorrAB, pltInvCorr, pltInvCorrA, pltInvCorrB, pltInvCor
348 gnuplot graph[5];
349
350 //solo mostrar los 10 primeros <= 9
351 //gnuplot pltCorr[10], pltCorrA[10], pltCorrB[10], pltCorrAB[10], pltInvCorr[10], pltInvCorrA[10], pltInvCorrB
352 //nuplot pltCorr[10];
353 //gnuplot* pltCorr = new gnuplot[10];
354 // RESET COUNTER Endless Macro Correlation : -3.193 Slope : 0.876315 Lineal Correlation : 0.656907
355 //inebitable que el ultimo dato se lea dos veces....
356 ///////////////////////
357 //dummy variables
358 double const transactionFee(0.), transactionFeeShort(0.); // Transaction Fee
359 bool hedging(1), validSign(0), dummyExecutePortfolio(1), backFromDangerousBlock(0), flagSOS(1); // portfolio
360 ///hedge .33 minDB 12
361 bool onlyOnce(0), goodReturn(0), linealCorrelatedOnly(1), inData(0), plotDenoisedData(0), hedge(1); /// if d
362 unsigned long int geNSTOCKS(999999), geNSTOCKSlimit(50); // 99K ok sino demora mucho test 3 // m
363 double thisRunInvestment(0), myInvestment(10000), minInvPerStock(15), stFrom(3.), stTo(10000.); // stFrom(0)
364 double mmu(0.1), ep(0.0001), counterBadTickLimit(3.), temp(0);
365 unsigned short cols(10), minDB(4), maxDB(33), minDBsearchRHO(2), nRHOS(2), nTicksLineal(3), run(3);
366 unsigned short bigRun(run);
367 double stPrice(0), stDeltaPercent(60), carryInv(0); // stFrom(0) SI DIFERENTE DE CERO ALGO ESTA MAL range s
368 if (stPrice && 50) {//range stock val around %
369 stFrom = stPrice * (1. - stDeltaPercent / 100.);
370 stTo = stPrice * (1. + stDeltaPercent / 100.);
371 }
372 double sumReturn(0), factoRun(2), toInvest(0), toSavings(0), toBank(0), timesLaspse(0), limitSavings(10000), t
373 double expectedReturn(2.00), hedgeBand(0.2), factor_correlation(0.92345), factor_linear_correlation(.9456), sl
374 //double expectedReturn(2.3300), hedgeBand(0.33), factor_correlation(0.7889012533), slope(.4155675678933), fac
375 bool retakeData(1), onlyInteger(0), evenOdd(0); // if hedging - program looks for negative macro correlation
376 //auxiliar data used during the program
377 bool noEnd(1), changeInRecord(0), backUPcheck(1), plotSelected(0);
378 double Invest_0(0), discarPercent(.05), meanTimer(0), currentBalanceTemp(0); // discarPercent(.05)
379 bool readyDB(0), portfolio(0), plotMacro(1), doneTime(0), change(0);
380 double prePreviousFValStock(0), completeRecDB(0.33), acumReturn(0), retFactor(2.0); // % of completenss
381 bool justCounter(0), outOfRangeNoThisRow(0);//
382 unsigned short checkTrigger(minDB), minPortfolio(2); //minDB data que entra al principio files que se leen
383 unsigned short limitTicks(0), completeRec(0), ss, currentF(0), previousF(0), prePreviousF(0), colIndex(5);
384 unsigned short tickLimitToClear(33);
385
386 ntNodesCols = cols; // ntTree solo en estas columnas
387 ntNodes = 2; //how many nodes in each cell
388 //*capture input unsigned short*/
389 //ntNodes = capture_val(1, 20, "Numeber of NOdes; 1 min - 0 Exit ");
390 //// input parameters using file
391 if (!ntNodes || nTicksLineal < 3) {
392 if (!ntNodes) fout << "\nntNodes should be at least 1";
393 if (nTicksLineal < 3) fout << "\n\tTicksLineal should be at least 3";
394 return;
395 }
396
397 ///-------------Read Parameters from File------------------------------
404 fout.flush() << "\t:413: Couldn't open Parameter Sheet File: " << finpFile;
405 exit(1);
406 }
407 else { // MASTER FILE DATA READ TO EXECUTE EXSAN
408 fout.flush() << "\n\t:408: Parameters File : " << finpFile;
409 finp >> dbfileID; fout << "\n\t:409: 1 dbfileID: " << dbfileID << " " << dbfiles[dbfileID];
410 finp >> geNSTOCKS; fout << "\n\t:410: 2 nTickRead: " << geNSTOCKS;
411 finp >> cols; fout << "\n\t:411: 3 cols: " << cols; //10
412 finp >> ntNodes; //1 3
413 finp >> factor_correlation; //0.9699 4
414 finp >> factor_linear_correlation;//.877 5
415 finp >> expectedReturn; //.2333 6
416 finp >> minDB; fout << "\n\t:416: 7 minDB: " << minDB; //10 // 4 7
417 finp >> hedgeBand; // .1 8
418 finp >> retFactor; //1.5 9
419 finp >> limitWeightFactor; //10
420 finp >> noEnd; //11
421 finp.close();
422 }
423
424 if (factor_correlation > 0.93377 || factor_linear_correlation > 0.97733) { // RHO/rho
425 fout.flush() << "\t:425: Incompatible parameters; ";
426 if (factor_correlation >= 0.9677) fout.flush() << "\tRho is too high: " << factor_correlation;
427 if (factor_linear_correlation >= 0.97733) fout.flush() << "\tLineal Correlation is too high: " << factor_line
428 exit(1);
429 }
430 ///-------------Read Parameters from File End --------------------------
431
432 string thiStock = "NOLE"; // NOLE, MSFT
433 unsigned short copyntNodes(ntNodes);
434 //factor_linear_correlation = factor_correlation + 0.1233 * (1. - factor_correlation); // el factor en 0-1
435 //el slope viene siendo cuanto en dolar sube en cada tick y esto
436 // dependería del valor minimo de la accion y de como varia ??? no tanto así
437 //al tener un numero menor hay un problema toma el registro incompleto com
438 bool trade(0);
439 if (trade) {
440 mu = .33; // smooth factor for data, .33 parece razonable ligero smooth
441 mmu = 0.10; //.10 SOFT FACTOR SOMOOTH DATA
442 expectedReturn = 3.33; //3.0 expected Return 3.0% , si menor se asegura pronta ganancia
443 cols = 12; // number of ticks considered for calculating RHO
444 stFrom = 10., stTo = 100.; // Stock price RANGE
445 ep = 0.0001; // percentage around pre and pre_previous 2 concecutives data epsilon ep*d
446 factor_correlation = 0.977; // RHO .977 IDEAL .96 Y LA CORRELACION es +/-
447 factor_linear_correlation = 0.967; //
448 slope = .6777; //
449 hedgeBand = .03; // .033 percent around 1 for hedging
450 cols = 12; //ok n ticksata considered for RHO
451 nTicksLineal = 4; //ok last n_ticks for Lineal Correlation
452 //timesLaspse = 1; // 1 normal val !!! no change
453 timeZoomFactor = 1.; // 1 normal valores muy altos, para visualizar subir a 200
454 minDB = 12; //# stocks in portfolio 7 lucky number
455 minDBsearchRHO = 1 + minDB / 2; //after capture the fastes, how many min for RHO
456 nRHOS = minDBsearchRHO; //HAW MANY BIG RHOS BEFORE LOOK FOR LINEAL CORRELATION
457
458 ///* CONSTANT DO NOT CHANGE
459 linealCorrelatedOnly = hedging = 1;
460 //*/
461 /*
462 bool noEnd(0), changeInRecord(0), backUPcheck(1);
463 double stPrice(7), stDeltaPercent(50), stFrom(7.), stTo(777.); // stFrom(0) SI DIFERENTE DE CERO ALGO ESTA
464 //double stFrom(stPrice*(1. - stDeltaPercent/100.)), stTo(stPrice*(1. + stDeltaPercent / 100.));//range sto
465 double slope(.3451655), factor_linear_correlation(0.67877543); //.977 IDEAL .96 Y LA CORRELACION es +/-
466 bool linealCorrelatedOnly(1), hedging(1), retakeData(1); // if hedging - program looks for negative macro co
467 double myInvestment(10000), discarPercent(.02), meanTimer(0); // discarPercent(.05)
468 double timesLaspse(12.0), timeZoomFactor(1); // zoom only 1000 for testing, normal val 1
469 bool readyDB(0), portfolio(0), plotMacro(1), doneTime(0), change(0);
470 double hedgeBand(15.), completeRecDB(0.456789); // % of completenss
471 bool justCounter(0), outOfRangeNoThisRow(0);//
472 minDB(200) minDBsearchRHO(100
473 unsigned short checkTrigger(stockCounterDB/3), run(3), cols(7), nTicksLineal(4), minPortfolio(3), minDB(3), m
474 unsigned short completeRec(0); // 1.e5
475 */
476 }
477
478 //capture input
479 //cols = capture_val(3, 20, "0 Exit.cols");
480 //timesLaspse = capture_float(1, 33, "0 Exit.TimeLapse"); //Ctrl g goto 1333
481
482 //----begin macro graph
483 unsigned short idPlotG(0);
484 gnuplot pltM; // multiple graphs data / candle data
485 unsigned short nStocksMg(1); // limite es 5 de gnuplot si es de un solo tipo 2 si es candle y linear
486 unsigned short nPointers(nStocksMg);
487 double superMin(10000), superMax(0);
488 ROWPTR* aryStockPtr = new ROWPTR[nPointers];
489 CELLPTR* aryPtr = new CELLPTR[nPointers];
490
491 //pltM.set_titleMg("Snap Shot of the Market, sometime after 2000");
492 //----end macro graph
493 ///////////////////////
494 unsigned short const dbRecSize(cols - nTicksLineal);
495 //unsigned short const dbRecSize(cols - 1); // the last cluster is not included, always ntNodes greather than
496 const short nTL = nTicksLineal;
497 unsigned short presCol(3), widthCol(8), checkCounter(0), countAsset(0), countAssetPlus(0), countAssetMinus(0);
498 unsigned short rrows(stockCounterDB + 1); // (stockCounterDB + 3) mayor posible para no perder datos, a col
499 //SEARCH CONCENTRATION OF PRICES
500 const int nstars = 100; // maximum number of stars to distribute
501 const int nintervals = 10; // number of intervals
502 unsigned long int p[nintervals] = {};
503 //int p1[nintervals] = {};
504 unsigned short nrolls(0); // number of experiments
505 unsigned short countRC(0), counterSt(0);
506 int starsMax = 50;
507
508 //hedgeband
509 double lowHB(.5 - hedgeBand / 2.), upHB(.5 + hedgeBand / 2.), keepAbsRet(0);
510 double sum(0), posSum(0), negSum(0), prevabSum(0), abSum(0), prevposSum(0), prevnegSum(0), AbsRet(0), deltaPri
511 double prev_nt_Val(0), prev_nt_PreVal(0);
512 double hdplus(0), hdminus(0), hdsum(0);
513
514 bool firstReturn(1);
515 double carryValStock(0);
516 double returnVal(0);
517
518 if (expectedReturn > 3.33) {
519 fout << "\nexpectedReturn > 3.33";
520 return;
521 }
522 //widthCol = presCol + 2; // 123.343 asume centenas y el punto
529 exit(1);
530 }
531 //else fstat << "\n----------------------------------------- " << topic_id_job;
532 else fstat << endl;
533
534 //string invFile = "c: .....\\\invest.txt";
535 string invFile = ExSan_Data_path + "invest.txt";
536 //fstream finv;
537 //finv.open(invFile, ios::in | ios::out);
538
539 double savings(0), initial(0), myInvestment0(0);
540 fstream finv(invFile, ios::in);
541 if (finv.is_open()) { /* ok, proceed with output */
542 finv >> myInvestment;
543 finv >> savings;
544 finv >> initial;
545 if (!myInvestment || myInvestment < .7777 * 1000.) {
546 printf("Error! No funds to invest");
547 fout.flush();
548 exit(1);
549 }
550 finv.close();
551 print("Read From File myInvestment: ", myInvestment, " Savings: ", savings);
552 }
553 else {
554 printf("Error! Couldn't Open Investment File", invFile);
555 exit(1);
556 }
557
558 //myInvestment = 1000; // to test the program, uncommon for normal execution
559 myInvestment0 = myInvestment;
560 thisRunInvestment = myInvestment;
561 //stTo = myInvestment;
562 //stFrom = stTo / 20.;
563
564 if (stFrom < 7.) stFrom = 7.;
565 //if (stFrom < 4.) stFrom = 4.;
566 minInvPerStock = 10;
567 // investment in not direct proporcion to return but inverse
568 if(!xsn)fout << "\n\tstFrom : " << stFrom << " <---> ";// << stTo << " ";--->
569 double myInvestRange[7] = {1000., 2000., 3500., 5500., 9000. };
570
571 if (myInvestment <= 1000.) {
572 minDB = 7;
573 stTo = .77 * myInvestment / minDB;
574 if (!xsn)fout << stTo << " stTo = .77 * myInvestment / minDB : " << .5 * myInvestment << " / " << minDB
575 }
576 else if (myInvestment > 1000. && myInvestment <= 2000.) {
577 minDB = 8;
578 minInvPerStock += 10;
579 expectedReturn += .01;
580 stTo = .66 * myInvestment / minDB;
581 if (!xsn)fout << stTo << " stTo = .66 * myInvestment / minDB : " << .66 * myInvestment << " / " << minDB
582 }
583 else if (myInvestment > 2000. && myInvestment <= 3000.) {
584 minDB = 9;
585 minInvPerStock += 20;
586 expectedReturn += .03;
587 stTo = .55 * myInvestment / minDB;
588 if (!xsn)fout << stTo << " stTo = .55 * myInvestment / minDB : " << .55 * myInvestment << " / " << minDB
589 }
590 else if (myInvestment > 3000. && myInvestment <= 4000.) {
591 minDB = 10;
592 minInvPerStock += 30;
593 expectedReturn += .06;
594 stTo = .50 * myInvestment / minDB;
595 if (!xsn)fout << stTo << " stTo = .50 * myInvestment / minDB : " << .50 * myInvestment << " / " << minDB
596 }
597 else { // > 10000
598 minDB = 10;
599 minInvPerStock += 40;
600 expectedReturn += .04;
601 stTo = 0.45 * myInvestment / minDB;
602 if (!xsn)fout << stTo << " stTo = 0.45 * myInvestment / minDB : " << 0.45 * myInvestment << " / " << mi
603 }
604
605 //myInvestment = 1000; keep comented just for testing enable this
606 //only one of this group must be enable
607 //limitSavings *= 1.33, minDB +=1, factoRun = 2; //10K reached / 2 run;
608 //limitSavings *= (1.33*1.33), minDB +=2, factoRun = 3; //13.k reched
609 //limitSavings *= (1.33*1.33*1.33), minDB +=3, factoRun = 4; //13.k reched
610 //limitSavings *= (1.33*1.33*1.33*1.33), minDB +=4, factoRun = 5; //13.k reched
611 //limitSavings *= (1.33*1.33*1.33*1.33*1.33), minDB +=5, factoRun = 3; //13.k reched
612 //limitSavings *= (1.33*1.33*1.33*1.33*1.33*1.33), minDB +=6, factoRun = 3; //13.k reched
613
614 if (minDB > stockCounterDB) minDB = stockCounterDB; //
615 //minDB = 2; // comment this to allow previous block
616 //nRHOS = minDB / 2; // en un caso optimo, no se usa esta variable
617 //geNSTOCKSlimit = minDB* tickLimitToClear; // en siete ticks tiene que definirse
618 // when stock is done set the remaining of tick minus the tick counter - 7
619
620 double startInvestment = myInvestment;
621 //string dbStatRHO = "c:...... n\\\\exsan_data\\\\statisticsRHO.txt";
622 string dbStatRHO = ExSan_Data_path + "statistics.txt";
623
624 fstream fstatR;
625 unsigned short indexMaxRHO(0);
626 bool setRHO(0);
627 fstatR.open(dbStatRHO, ios::app);
628 if (!fstatR) {
629 printf("Error! Couldn't Statistics File", dbStat);
630 exit(1);
631 }
632 //else fstatR << "\n------------------------------------------------------------------------------------ " <<
633 //fstatR << "\n\tn\t";
634 fstatR.width(2);
635 //for (k = 99; k > 80; k--) fstatR << k << "\t";
636 /*
637 //fstat << "\n" << setw(7) << "id" << " "
638 fstat << "\n" << setw(4) << "c" // cols
639 << setw(5) << "cL" // cols used for linear regre
640 << setw(16) << "RHO" // big RHO between stocks
641 << setw(10) << "r1" //
642 << setw(10) << "s1" //
643 << setw(10) << "r2" //
644 << setw(10) << "s2" //
645 << setw(8) << "nR" // how many aprove linear reg selection
646 << setw(5) << "nS" // Number Of Stocks
647 << setw(5) << "hd" // hedge bande
648 << setw(10) << "%RF" << endl; // portfolio perfomance
649 //*/
650 token tok;
651 unsigned short menuOpt(0);
652 enum menumOpt { go, tLaspse, noend, st_o, st_f, macroCorr, slopeLineal, linealCorr, nTicks, checkTrig, linealN
653 double param[linealNTicks + 1];
654 string menuOPT[linealNTicks + 1];
655
656 menuOPT[go] = "GO !"; param[macroCorr] = 0;
657 menuOPT[tLaspse] = "Time Lapse"; param[tLaspse] = timesLaspse;
658 menuOPT[st_o] = "Stock Min Val"; param[st_o] = stFrom;
659 menuOPT[st_f] = "Stock Max Val"; param[st_f] = stTo;
660 menuOPT[macroCorr] = "Macro Correlation"; param[macroCorr] = factor_correlation;
661 menuOPT[linealCorr] = "Lineal Correlation"; param[linealCorr] = factor_linear_correlation;
662 menuOPT[nTicks] = "n ticks "; param[nTicks] = cols;
663 menuOPT[linealNTicks] = "n ticks for lineal correl"; param[linealNTicks] = nTicksLineal;
664 menuOPT[slopeLineal] = "Slope"; param[slopeLineal] = slope;
665 menuOPT[checkTrig] = "Trigger Counter"; param[checkTrig] = checkTrigger;
666 menuOPT[noend] = "Endless"; param[noend] = noEnd;
667
668 do {
669 //system("cls");
670 for (unsigned o = go; o <= linealNTicks; o++) cout << "\n\t" << o << " " << menuOPT[o] << " :-> " << param[o
671 //cout << "\n\tWhich one"; //habilitar cuando menu???
672 //menuOpt = capture_val(go, linealNTicks," menu opt");
673 menuOpt = 0;
674 switch (menuOpt) {
675 case go: break;
676 case macroCorr: factor_correlation = capture_float(.5, .9, "0 Exit Macro Correlation factor "); param[macroC
677 case linealCorr: factor_linear_correlation = capture_float(.5, .9, "0 Exit Lineal Correlation factor"); par
678 case nTicks: cols = capture_val(10, 33, " nTicks"); break;
679 case linealNTicks: nTicksLineal = capture_val(4, cols - 1, " nTicks Lineal Correlation"); param[linealNTicks
680 case slopeLineal: slope = capture_float(0, 7., "Slope"); param[slopeLineal] = slope; break;
681 case st_o: stFrom = capture_float(0, 1000, " Range of Stock MIN"); param[st_o] = stFrom; break;
682 case st_f: stTo = capture_float(0, 1000, " Range of Stock MAX"); param[st_f] = stTo; break;
683 case noend: cout << "\n\tEndless"; noEnd = tok.get_bool(); param[noend] = noEnd; break;
684 case tLaspse: timesLaspse = capture_float(1, 5000, "Range of Time Lapse"); param[tLaspse] =
685 //case: break;
686 default: cout << "\n\tnot in menu"; return;
687 }
688 menuOpt = go;
689 //if (menuOpt == go) break;
690 //cout << "\n\ttry again"; // habilitar cuando menu input?
691 // } while (tok.get_bool());
692 } while (0);
693 //if (hedging) fout << "\n\tONLY NEGATIVE CORRELATION";
694 //if (linealCorrelatedOnly) fout << "\n\tPortfolio has extrictly lineal dependent & Correlated assets ";
695 //mostrar el circ previous and previous to previus of discarded
696 if (nTicksLineal > cols) nTicksLineal = cols - 1;
697 //minDB = minPortfolio;
698 bool abortPortfolio(0);
699 bool testPCapacity(false);
700 if (testPCapacity) { fout << "\tTest PC Suitability for handling size : "; rrows = 1500; }
701 // 8Gb RAM pueden con rows = 1500
702 //if (minPortfolio > minDB) minPortfolio = minDB - 3;
703 unsigned int grandTotal = geNSTOCKS;
704 if (justCounter) rrows = 50;
705 unsigned short colss(0), tempCheckCounter(0), nCol(0), firstRow(0), lastRow(0), firstCol(0), lastCol(0), maxF
706 bool firsTime(0), check(0), displayDB(1), found(0), oonlyOnce(0);
707 unsigned short ccols(0);// = rrows + 1; /// ahora si estaba (2 *cols) + 1
708 double delta(0), returnPortfolio(0), currentValueOfPortfolio(0), initialInvestment(0), retPortfolio(0), dprevi
709 ////
710 double min2(1e10);
711 unsigned short kmin, previous_dbSize(0);
712 bool doneSelect(0);
713 double maxAllowed(0);
714 unsigned short counterINdenoised(0), imin;
715 unsigned long int sumUpFreqCounter(0), previous_sumUpFreqCounter(0);
716 unsigned short counterIN(0);
717
718 double bigRHO[100], prevbigRHO[100];
719
720 CELLPTR cell_ptrmin(nullptr);
721 NODEPTR node_ptr(nullptr);
722
723 string time_series_data, ffile, twoStocks, tempSt;
724 fstream fts;
725 //
726 const enum pages_nt { pp_lastIN, ppnt_time, ppnt_data, ppnt_medium }; // es necesario el elemento zero el ppn
727 unsigned short* ary_ntPage = new unsigned short[ppnt_medium];
728 //ary_ntPage = { pp_lastIN , ppnt_time, ppnt_data, ppnt_medium};
729 //
730
731 //
732 enum FLOAT { ppAux, ppU, ppX, ppReturn, ppDB, ppTilda, ppCovMatrix, ppCorrBU, ppCorr, ppDataIn, ppTime, ppRTi
733 enum BOOL { pp_bscorr, pp_bool };/// dos paginas????
734 enum USHORT { temp_us, pp_key_index, pp_us };
735 enum STRING { pp_string };
736 enum CHAR { pp_char };
737 //
738
739 /* PAGE DESCRIPTION
740 fout << "\n\tPAGE ID & Function";
741 fout << "\n\t" << setw(15) << "ppU: " << setw(2) << ppU << "\tMean / Portfolio Final Value - Return Mean col
742 fout << "\n\t" << setw(15) << "ppX: " << setw(2) << ppX << " ";
743 fout << "\n\t" << setw(15) << "ppReturn: " << setw(2) << ppReturn << "\t (Vf-Vo)/Vo ";
744 fout << "\n\t" << setw(15) << "ppDB: " << setw(2) << ppDB << "\tre-arranged data on time -talvez se podria ev
745 fout << "\n\t" << setw(15) << "ppTilda: " << setw(2) << ppTilda << "\t.. ";
746 fout << "\n\t" << setw(15) << "ppCovMatrix: "<< setw(2) << ppCovMatrix << "\t.. ";
747 fout << "\n\t" << setw(15) << "ppCorrBU: " << setw(2) << ppCorrBU << "\t .. ";
748 fout << "\n\t" << setw(15) << "ppCorr: " << setw(2) << ppCorr << "\t ,.. ";
749 fout << "\n\t" << setw(15) << "ppDataIn: " << setw(2) << ppDataIn << " Main Storage for input data / Portfolio
750 fout << "\n\t" << setw(15) << "ppTime: " << setw(2) << ppTime << "\tTime Stamped in";
751 fout << "\n\t" << setw(15) << "ppRTime: " << setw(2) << ppRTime << "\tMean Time related to wall time, backup o
752 fout << "\n\t" << setw(15) << "ppDB3: " << setw(2) << ppDB3 << "\tSmoothed data to feed RHO ";
753 fout << "\n\t" << setw(15) << "matC2: " << setw(2) << matC2 << "\t.. ";
754 fout << "\n\t" << setw(15) << "ppRhist: " << setw(2) << ppRhist << "\t.. ";
755 fout << "\n\t" << setw(15) << "ppRcount: " << setw(2) << ppRcount << "\t.. ";
756 fout << "\n\t" << setw(15) << "ppSumR: " << setw(2) << ppSumR << "\t.. ";
757 fout << "\n\t" << setw(15) << "pp_float: " << setw(2) << pp_float << "\t.. " ;
758 fout << "\n\t-------files-----------------" << endl;
759 fout << "\n\tfdb " << setw(15) << dbFile << " all the stock names" ;
760 fout << "\n\tf1db " << setw(15) << firstInDbFile << " ...";
761 fout << "\n\tfstat " << setw(15) << dbStat << " ...";
762 fout << "\n\tc:......n\\\\out_" + id_job + ".txt crash file\n";
763 ////*/
764
765 fout << "\n\tpp_lastIN " << pp_lastIN << "\tppnt_time " << ppnt_time << "\tppnt_data " << ppnt_data;
766
767 if (rrows + 1 < (2 * cols) + 1) {
768 fout << "\t ... -> prev 1, last 0\n";
769 ccols = (2 * cols) + 1; //se corrige el numero de cols y se hace matriz cuadrada
770 }
771 else ccols = rrows + 1;
772
773 if (rrows + 1 < (2 * cols) + 1) {
774 fout << "\t ... -> prev 1, last 0\n";
775 rrows = (2 * cols) + 1; //se corrige el numero de cols y se hace matriz cuadrada
776 }
777 //else = rrows + 1;
778 out("", "stockCounterDB: ", stockCounterDB, " mu: ", mu, " Limit Trading / Savings: ", limitSavings, " Fact
779 out("h2", "******************");
780
781 short int rndRow(0);
782 if (justCounter) rrows -= 3;
783
784 NETPTR net(nullptr);//
785 NODEPTR previous_nt_Datum(nullptr), previous_nt_PreDatum(nullptr);
786 CELLPTR previousDatum(nullptr), previousPreDatum(nullptr), ptr(nullptr), auxPtr(nullptr), ptrDB(nullptr), ptr2
787 ROWPTR stockPtr(nullptr), auxRowPtr(nullptr), stPtr(nullptr), idStockPtr(nullptr);
788 //test PC capacity
789 fout << XSNfrom;
790 net = net->exsan(rrows, ccols, pp_float, pp_bool, pp_us, pp_string, pp_char);
791 //cout << "\t ... -> XSNET READY!!!\n";
792 //fstat << "\n" << topic_id_job << setw(4) << cols << setw(3) << nTicksLineal;
793 //statVector.back() << cols
794 statVector[0] = cols; // statVector.push_back(cols);
795 statVector[1] = nTicksLineal; //statVector.at(1) = nTicksLineal;//statVector[1] = nTicksLineal; // sta
796 if (testPCapacity) { net->kill_exsan(net); f1db.close(); return; }
797 //Mem Usage
798 //net->thisNetRAM(net, pp_float, pp_bool, pp_us, pp_string, pp_char);
799 ROWRECORDPTR rr_ptr(net->get_main_row_record());
800 ROWPTR rootStocks;
801 ROWPTR rowPtr(nullptr);
802 //PLATFORM FOR CUBIC SMOOTHING
803 double xMean(0);
804 //fout << "\t ... -> aqui\n";
805 net->set_work_sheet(net, ppRcount, cols, 2 * cols - 1);
806 //fout << "\t ... -> aca!!!\n";
807
808 ptr = net->point_to(net, ppRcount, 1, 1, 'f');
809 for (unsigned short col = 1; col <= cols; col++) {
810 //xMean += col;
811 ptr->set_data(ppRcount, 1);
812 ptr = ptr->get_se_ptr();
813 }
814 //if (cols < 10) { fout << "\N\tPage ppRcount-> " << ppRcount; net->show_page(net, ppRcount, 'f', 0, 3, 8, 5)
815 ///double aryInitial[5] = { xMean, 1, 2, 3, 4 };
816 //net->set_work_sheet(net, ppAux2, cols, 2 * cols - 1);
817 ptr = net->point_to(net, ppRcount, 1, cols + 1, 'f');
818 for (unsigned short col = cols + 1; col <= 2 * cols - 1; col++) {
819 ptr->set_data(ppRcount, -sqrt(mmu));
820 ptr->get_s_ptr()->set_data(ppRcount, sqrt(mmu));
821 ptr = ptr->get_se_ptr();
822 }
823 //if (cols <= 10) net->show_page(net, ppRcount, 'f', 0, 3, 8, 5);
824
825 //relative correlation on ppDB backward
826 bool* aryColsRelativeVol = new bool[net->get_net_cols() + 1];
827 for (k = net->get_net_cols(); k >= 1; k--){
828 if(k >= net->get_rows_in_page(ppDB, 'f')- net->get_cols_in_page(ppDB, 'f')) aryColsRelativeVol[k] = 1;
829 else aryColsRelativeVol[k] = 0;
830 }
831
832 bool* aryRows2 = new bool[net->get_rows_in_page(ppRcount, 'f') + 1];
833 bool* aryCols2 = new bool[net->get_cols_in_page(ppRcount, 'f') + 1];
834 for (k = 1; k <= net->get_rows_in_page(ppRcount, 'f'); k++) aryRows2[k] = 1;
835 for (k = 1; k <= net->get_cols_in_page(ppRcount, 'f'); k++) aryCols2[k] = 1;
836 for (k = 0; k < 100; k++) prevbigRHO[k] = bigRHO[k] = 0;
837 if (cols <= 10) {
838 //fout << "Generate A_transpose * A";
839 //print("MULTIPLY XXt");
840 //net->show_page(net, ppAux2, 'f', 0, 3, 8, 5);
841 //fout << "rows "; for (k = 1; k <= net->get_rows_in_page(ppAux2, 'f'); k++) fout << aryRows2[k];
842 //fout << "\ncols "; for (k = 1; k <= net->get_cols_in_page(ppAux2, 'f'); k++) fout << aryCols2[k];
843 }
844 ///*
845 net->set_work_sheet(net, ppRhist, net->get_rows_in_page(ppRcount, 'f'), net->get_rows_in_page(ppRcount, 'f'));
846 net->sparce_mat_multXXt(net, ppRhist, ppRcount, aryRows2, aryCols2);
847 //if (cols <= 10) net->show_page(net, ppRhist, 'f', 0, 3, 8, 5);
848 net->solverSysEq(net, ppRhist, 0); // tempF2 no puede ser la pp0
849 //if (cols < 8){ fout << "Get Inverse"; net->show_page(net, tempF2, 'f', 0, 3, 8, 5);}
850 net->matrix_multiply(net, matC2, ppRhist, ppRcount);
851 //if (cols <= 10) { fout << "* X pp matC2" << matC2; net->show_page(net, matC2, 'f', 0, 3, 10, 5); }
852 // se termina de construir la plataforma para cubic smoothing matC2!!!
853 // BLANQUEA ESTA MATRIZ PARA USAR EN RHO HISTORICO ACUMULADO
854 //net->matrixDivValue(net, ppCorr, ppCorr, double(nTicksLineal - 1), aryDBin, aryDBin);
855 //void Net::matrixMultValue(Net* net, unsigned short pageT, unsigned short pageA, double val, bool * ary_rows,
856 net->matrixMultValue(net, ppRcount, ppRcount, 0, nullptr, nullptr);
857 net->set_work_sheet(net, ppRcount, rrows, ccols); //creo no hace falta
858 net->matrixMultValue(net, ppRhist, ppRhist, 0, nullptr, nullptr);
859 net->set_work_sheet(net, ppRhist, rrows, ccols); //creo no hace falta
860 //*/
861
862 ///* inicializa el puntero donde empieza la captura de data
863 unsigned short rows(rrows - 1);
864 net->set_work_sheet(net, ppDataIn, rows, cols);
865 //------------mesh-----------
866 stockPtr = net->goto_row(net, ppDataIn, 1, 'u');
867 for (unsigned short thisRow = 1; thisRow <= net->get_rows_in_page(ppDataIn, 'f'); thisRow++) {
868 ptr = stockPtr->get_forward_ptr();
869 //fout << "\n\n\trptr row: " << rptr->get_n_row() << "\t(" << ptr->get_row() << ", " << ptr->get_col() << ")"
870 for (unsigned short thisCol = 1; thisCol <= net->get_cols_in_page(ppDataIn, 'f'); thisCol++) {
871 NODEPTR root_nt(nullptr), ptr_new_node(nullptr);
872 for (unsigned short i = 1; i <= ntNodes; i++) {
873 ptr_new_node = ptr_new_node->create_Node();
874 ptr_new_node->set_key_nt(i); // every node has a sequential key
875 //fout << "\n\t(" << row << ", " << col << ") ntNode i: " << i << " key: " << ptr_new_node->get_key_nt();
876 //ptr_nueva_celda->Tree_Insert_nt(root_nt, ptr_new_node); to test binary tree
877 ptr->RB_Insert_data_nt(ptr, root_nt, ptr_new_node); // the rb_tree
878 ptr->set_ntHead(root_nt);
879 //out("", "alpha//inOrder"); hout << "<\p>"; ptr->Tree_Inorder_nt(ptr, root_nt, 1);
880 //out("", "PreOrder"); hout << "<\p>"; ptr_nueva_celda->Tree_PreOrder_nt(ptr_nueva_celda, root_nt);
881 //delete ptr_new_node; // esta instruccion NO! no va
882 }
883 ptr = ptr->get_next_ptr();
884 }
885 stockPtr = stockPtr->get_down_ptr();
886 }
887 //------------mesh-----------
888
889
890 stockPtr = net->goto_row(net, ppDataIn, 1, 'f');
891 //fout << "\n\tThis Row holds the dbTReeDATa " << stockPtr->get_n_row();
892 // este arbol va a almacenar la correlacion relativa entre stocks
893 ROWPTR rootRowHolDB;
894 rootRowHolDB = stockPtr = net->goto_row(net, ppDataIn, 1, 'f');
895 CELLRECORDPTR crptr(stockPtr->get_cell_record_ptr());
896 CELLPTR db_root(stockPtr->get_cell_root_db_data()); /// esta es la cabeza de dbTree
897 CELLPTR ptrData(nullptr), ptr1(nullptr);
898 fout << "\n\tTotal Number of assets allocated: " << net->get_rows_in_page(ppDataIn, 'f') << endl;
899 //db_root = net->goto_row(net, ppDataIn, 1, 'f')->get_cell_root_db_data();
900 //
901 rootStocks = stockPtr->get_db_root_ptr();
902 for (i = 1; i <= net->get_rows_in_page(ppDataIn, 'f'); i++) {
903 stockPtr->tickInPoinTo(stockPtr->get_forward_ptr());
904 stockPtr = stockPtr->get_down_ptr();
905 }
906
907 net->set_work_sheet(net, ppTime, rows, cols);
908 net->set_work_sheet(net, ppDB, rows, cols);
909 net->set_work_sheet(net, ppU, rows, 1);
910 net->set_work_sheet(net, ppRTime, rows, 1);
911
912 bool* aryCols = new bool[net->get_net_cols() + 1];
913 bool* aryStocksCorr = new bool[rows + 1];
914 bool* aryStockAux = new bool[net->get_rows_in_page(ppDataIn, 'f')];
915 bool* aryStock = new bool[net->get_rows_in_page(ppDataIn, 'f')];
916 for (i = 1; i <= net->get_rows_in_page(ppDataIn, 'f'); i++) { aryStockAux[i] = aryStock[i] = 0; }
917
918 bool* aryPortfolio = new bool[30];// new bool[minPortfolio + 1];
919 bool* aryDBinEq = new bool[net->get_net_rows()];
920 bool* aryDBin = new bool[net->get_rows_in_page(ppDataIn, 'f')];
921 bool* aryDBinTemp = new bool[net->get_rows_in_page(ppDataIn, 'f')];
922 bool* aryDB = new bool[net->get_rows_in_page(ppDataIn, 'f')];
923 bool* previousDB = new bool[net->get_rows_in_page(ppDataIn, 'f')];
924 for (i = 1; i <= net->get_rows_in_page(ppDataIn, 'f'); i++) previousDB[i] = 0;
925
926 normal_distribution rndNormStock0(double(rrows / 2), 1.); // como concentra de donde escoge la data}
927 normal_distribution rndNormStock1(.25 * (double)rrows, 2); // como concentra de donde escoge la data}
928 normal_distribution rndNormStock2(.50 * (double)rrows, .2035); // como concentra de donde escoge la d
929 normal_distribution rndNormStock3(.75 * (double)rrows, 2); // como concentra de donde escoge la data}
930 //(mean, stdev) concentro en la parte inferior
931 //fout << " activity around these rows: " << unsigned short( .25 * rrows) << " " << unsigned short(.50 * rr
932 //fout << " activity around these rows: " << 0 << " and "<< stockCounterDB - 1;
933 uniform_int_distribution rndIntUniDist_0CntrDB(0, stockCounterDB - 1);
934
935 boost::random::uniform_int_distribution<> dist0tostockCounterDB{ 0, stockCounterDB };
936 uniform_int_distribution rndIntUniDist_0CntrDBcentral(stockCounterDB * .25, .75 * stockCounterDB); // me
937 uniform_int_distribution rndIntUniDist_1CntrDBcentral(stockCounterDB * .50, .75 * stockCounterDB);
938 boost::random::uniform_int_distribution rndIntUniDist_2CntrDBcentral(stockCounterDB * .48, .52 * stockCou
939
940 typedef boost::mt19937 RNGType;
941 RNGType rng(time(0));
942 double meaND(.50 * (double)rrows), sigmaND(1.0);
943 boost::normal_distribution randNormalInt(meaND, sigmaND);
944 //boost::variate_generator< RNGType, boost::normal_distribution > randStock(rng, randNormalInt);
945 //int ndd = randStock();
946 //randStock.operator();
947 //randStock.engine
948 //std::time_t now = std::time(0);
949 //boost::random::mt19937 gen{ static_cast(now) };
950 //boost::random::bernoulli_distribution<> distB;
951 //fout << "*******bernoulli_distribution************ " << distB(rng) << '\n';
952 //int n = randStock(rng, randNormalInt);
953 //uniform_int_distribution rndIntUniDist_1CntrDBcentral(stockCounterDB*.75, .75*stockCounterDB);
954 //open the available DB, shift randomly pointers
955 unsigned short shftSTock(0);
956 for (i = 0; i < j; i++) {
957 fileID[i] = core + stockID[i] + ".txt";
958 //fout << "\n\tstockID[" << i << "]\t" << stockID[i] << " " << fileID[i] << endl;
959 fDB[i].open(fileID[i], ios::in);
960 if (!fDB[i]) {
961 printf("Error!");
962 fout.flush() << "\n\t:911: This file does not exist " << fileID[i] << " exit forced\n";
963 exit(1);
964 }
965 shftSTock = dist0tostockCounterDB(generator); //much better randomness
966 //fout << "\n\tstockID[" << right << setw(3) << i << "]\t" << stockID[i] << " " << fileID[i] << " shift: "
967 //fout << "\n\t:770: stockID[" << right << setw(3) << i << "]" << setw(7) << right << stockID[i] << " ---> "
968 while (shftSTock--) fDB[i] >> datum; /// shift in this file i
969 }
970 timesLaspse = dist0tostockCounterDB(generator) / minDB;
971 if (!timesLaspse) timesLaspse = 1;
972
973 stockPtr = net->goto_row(net, ppDataIn, 1, 'f');
974 rootStocks = stockPtr->get_db_root_ptr();
975 //fout << "\n\tThe default format is \" %ws wall, %us user + %ss system = %ts CPU(%p%)";
976 cpu_timer timer;
977 cpu_times times;
978 long int prevTimes(0);
979 //fout << "\n\tLet's Go ---> " << " timer.format()---> " << timer.format();
980
981 //TO CHECK A PARTICULAR STOCK //stockID[s] = "GNTX";
982 //s = 0; fout << "\n\tTest this stock---> " << setw(8) << left << stockID[s];
983 //string choosenStockID = "XLFN"; //fout << "\n\tTest this stock---> " << choosenStockID; //GE
984
985 bool firsTimeThischoosenStockID = true; //true to show / false not show
986 bool onlyOnceSone = true;
987 unsigned short choosenStock = 0;
988 unsigned short choosenStockInRow = 0;
989 unsigned short pin(3); /// donde inicia
990
991 minDB = 2; //comentar, forzar aqui este parametro XSN
992
993 fprmtr.flush() << "\n"
994 << cols << "\t"
995 << nTicksLineal << "\t"
996 << ntNodes << "\t"
997 << factor_correlation << "\t"
998 << factor_linear_correlation << "\t"
999 << slope << "\t"
1000 //<< setw( 5) << setprecision(3) << hedgeBand
1001 << minDB;
1002
1003 //ptime pt = second_clock::universal_time();
1004 ptime pt2 = second_clock::local_time();
1005 string ptString = to_iso_string(pt2);
1006 //fbs << "\n"//<< setw(15) << ptString
1007 //stFrom = 2.0, stTo = 500; ///comment just to print capacity of exsan at the bottom does not allow normal w
1008 //if(!xsn){
1009 if (1) {
1010 out("h1", "PARAMETERS"); // SOFT FACTOR SOMOOTH DATA
1011 //out("", stFrom, " $tocks ", stTo, "Investment: ", myInvestment, " min Inv/Stock: ", minInvPerStock);
1012 out("", "Investment: ", myInvestment, " min Inv/Stock: ", minInvPerStock, "# Ticks -cols-: ", cols, " beta:
1013 out("", "HedgeBand ", lowHB, " <-- hedgeband="" nbsp=""> ", upHB, " R( ", factor_correlation, " ; ", factor_lin-->
1014 out("", "Expected Return: ", expectedReturn * 10., "% minDB: ", minDB, " timesLapse: ", timesLaspse, " ti
1015 out("", "Check Trigger Counter: ", checkTrigger, " Number of times dice is thrown: ", geNSTOCKS, " EndLess: "
1016 out("", "Run: ", run, " onlyInteger", onlyInteger, "hedge: ", hedge, " ntNodes: ", ntNodes, "limitWeightFacto
1017 out("", "dbFile: ", dbFile );
1018 }
1019
1020 fout.flush() << "\n\t|<--------e-x-s-a-n---hft------->|";--------e-x-s-a-n---hft------->
1021 //fstat << "\n----------------------------------------------------- " << setw(15) << ptString << " " << pt.d
1022 while (!portfolio && --geNSTOCKS) { //portfolio control externo si 0 entra a generar portfolio 1 solo lectur
1023 //if (backFromDangerousBlock) { backFromDangerousBlock = 0; fout.flush() << "\n\t:853: BackFromDangerousBlock
1024 if (noEnd && geNSTOCKS == 1) {
1025 //crear un tabla logica de 0/1 R r slope
1026 //cada hit return pierde un diez milesimo
1027 geNSTOCKS = 3333;
1028 //fout << "\n\tRESET PARAMETERS every " << geNSTOCKS << " ticks";
1029 /*
1030 if (0.9999*factor_correlation > .95) {
1031 ///fout << "\n\tprevious RHO " << factor_correlation;
1032 factor_correlation *= .9999;
1033 //fout << "\tnew RHO " << factor_correlation;
1034 //slope *= 0.999;
1035 //factor_linear_correlation *= 0.999;
1036 //expectedReturn *= 0.999;
1037 }
1038 */
1039 //fout << "\n\n\tRESET Endless - RHO: " << factor_correlation << " Slope: " << slope << "\tLineal_Rho: " <<
1040 //fout << "\n\tRHO: " << factor_correlation << "\trho: " << factor_linear_correlation << "\tslope: " << slop
1041 }
1042 ///*
1043 do {
1044 readNewDatum:
1045 /// here the block to resest timer
1046 //es mucho mas balanceado al usar las otras distribuciones consume mucho tiempo y hace imposib
1047 s = dist0tostockCounterDB(generator); //corre toda la micro base a la misma velocidad, no simula most activ
1048 if (firsTimeThischoosenStockID) {
1049 firsTimeThischoosenStockID = !firsTimeThischoosenStockID;
1050 s0 = s;
1051 thiStock = stockID[s0];
1052 }
1053
1054 //s = rndNormStock2(generator); // distribucion normal, centrada y stdev .2 bien punteado
1055 //s = rndNormStock0(generator); // distribucion normal, centrada y stdev 1
1056 /*
1057 if(geNSTOCKS <= grandTotal*.90) { //the last 1/3rd of grandTotal concentracion
1058 //los ticks del final rotan en esta concentración
1059 if (geNSTOCKS <= grandTotal * .5) {
1060 //pin = 2;
1061 //s = rndNormStock2(generator);
1062 s = rndIntUniDist_2CntrDBcentral(generator);
1063 //conctrate in the midle with stdev = 1
1064 }
1065 else{
1066 if (pin == 1) s = rndNormStock1(generator);
1067 else
1068 if (pin == 2) s = rndNormStock2(generator);
1069 else s = rndNormStock3(generator);
1070 pin--;
1071 if (!pin) pin = 3;
1072 }
1073 //s = (unsigned short)rndIntUniDist_0CntrDB(generator);
1074 //if (geNSTOCKS <= 55)
1075 //fout << "\n\tpin: " << pin << " geNSTOCKS: " << geNSTOCKS;
1076 }
1077 else{ // first 2/3 of geNSTOCK to populate DB
1078 s = dist(generator);
1079 }
1080 */
1081 } while (s < 0 || s >= stockCounterDB); // asegura que s esta en el rango
1082 //fout.flush() << "\n\n\trandom file id s: " << s;
1083 /* //MOSTREMOS LA CONCENTRACION DE PRECIOS
1084 if (nrolls && !(nrolls % 100) ) { //añadir que sea por lo menos nfiles**cols poblada
1085 fout << "\n\n\t" << stFrom << " " << stTo;
1086 fout << std::fixed; fout.precision(1);
1087 //unsigned short mxP = 0;
1088 //unsigned short minP = 100000;
1089 unsigned short indexP = 0;
1090 for (unsigned short ip = 0; ip < nintervals; ++ip) {
1091 fout << "\n\t" << stTo*float(ip) / nintervals << "-" << stTo*float(ip + 1) / nintervals << ": " << string(p
1092 //fout << nstars << " " << nrolls;
1093 //countP = p[ip];
1094 if (p[ip] * nstars / nrolls >= 10) {
1095 indexP = ip + 1;
1096 fout << "\tIndex captured " << indexP << " Stars: " << p[ip] * nstars / nrolls;
1097 }
1098 }
1099 if (indexP) {
1100 nrolls = 0;
1101 //fout << "\n\tNEW RANGE:": << stTo << " " ;
1102 //range stock cost selection
1103 stPrice = (indexP) * (stTo - stFrom) /( nintervals*2.0);
1104 //stFrom = stTo*float(indexP - 1);
1105 stFrom = stPrice*(1. - stDeltaPercent / 100.);
1106 stTo = stPrice*(1. + stDeltaPercent / 100.);
1107 //stTo = stTo*float(indexP);
1108 fout << "\n\t" << stFrom << "\t\t" << stTo;
1109 stDeltaPercent *= 0.7;
1110 ///if(starsMax*.5 > 10) starsMax *= 0.5; degenera
1111 for (unsigned short ip = 0; ip < nintervals; ++ip) p[ip] = 0;
1112 factor_correlation = 0.93;
1113 }
1114 }
1115 ///*/
1116 fout << std::fixed; fout.precision(2);
1117 if (fDB[s].eof()) { //read file reached the end of it
1118 if (firsTimeThischoosenStockID && thiStock == stockID[s]) {
1119 fout.flush() << "\n\t\t\t\t\t:939: EOF has been reached " << fileID[s];
1120 }
1121 fDB[s].close(); // net->kill_exsan(net); return; }
1122 fDB[s].open(fileID[s], ios::in); //fout << "\tre Open ";
1123 //stockPtr->set_nTick(0); ///no creo esta instruccion sigue la actividad
1124 stockPtr->tickInPoinTo(stockPtr->get_forward_ptr());
1125 fDB[s] >> datum;
1126 }
1127 else { //normal read of data
1128 //fDB[s] >> datum;
1129 //{pp_lastIN, ppnt_temp, ppnt_data, ppnt_medium };
1130 //if (thiStock == stockID[s])
1131 dt = val.get_float(1, fDB[s]);
1132 }
1133 //fout << "\n\t:960: datum read " << dt << " stock:" << fileID[s];
1134 if (val.get_valid()) { //!avoid enter
1135 datum = dt;
1136 //if (firsTimeThischoosenStockID && thiStock == stockID[s]) fout.flush() << "\n\n\t:966: Asset " << setw(5)
1137 if (is_val_in_range_t(datum, stFrom, stTo)) {
1138 /*if (backFromDangerousBlock) {
1139 //backFromDangerousBlock = 0;
1140 //fout.flush() << "\n\t:968: BackFromDangerousBlock flag set to zero/back to read ";
1141 fout << "\n\t:970: BackFromDangerousBlock datum read " << dt << " stock:" << fileID[s];
1142 }*/
1143 if (firsTimeThischoosenStockID && thiStock == stockID[s]) fout.flush() << " OK!";
1144 rowPtr = rr_ptr->iStockInDB(rootStocks, stockID[s]);
1284 ptr = ptr->get_next_ptr(); // idem to previuos
1285 fout.flush() << "\n\t:1034: (cols - 1) Tree data\n\t"; ptr->Tree_Inorder_nt_Traverse(ptr, ptr->get_ntHead
1286 //fout << "\n\t:1021: Tree time "; ptr->Tree_Inorder_nt(ptr, ptr->get_ntHead(), ppnt_time); fout << endl
1287 //*/
1288 //++p[(unsigned long int) ((nintervals - 1)*(datum - stFrom) / (stTo - stFrom))];
1289 nrolls++;
1290 //fout << "\n\tFirst Record ever IN-> " << setw(8) << left << stockID[s];
1291 //fout << "-datum ---> " << "(" << ptr->get_row() << ", " << ptr->get_col() << "): " << datum ;
1292 //inData = 1;
1293 //else fout << "\tDiscarded not in range <> " << endl;
1294 stockPtr = stockPtr->get_down_ptr();
1295 //fout.flush() << "\n\t\t:1059: END First Time Ever Asset In :975: nrolls: " << nrolls;
1296 }
1297 }//se cierra if (!rowPtr) {//Stock n
1298 else {//fout.flush() << "\n\t\t:1042: BEGIN Asset is already In DB " << setw(8) << left << stockID[s] << "\
1299 //fout.flush() << "\n\t\t:1073:\tdatum in range rowPtr->get_ptrLasTick()->get_col(): " << rowPtr->get_ptrL
1300 /*
1301 if (backFromDangerousBlock) {
1302 //backFromDangerousBlock = 0;
1303 fout.flush() << "\n\t\t:1130: BEGIN Asset is already In DB " << setw(8) << left << stockID[s] << "\tdatum
1304 fout.flush() << "\n\t:1131: BackFromDangerousBlock flag set to zero/back to read ";
1305 fout << "\n\t:1132: datum read " << dt << " stock:" << fileID[s];
1306 }
1307 */
1308 if (rowPtr->get_ptrLasTick()->get_col() > net->get_cols_in_page(ppDataIn, 'f')) { //end_hft();
1309 }
1310 ////////////// prior error overflow check and exit, now input
1311 ptr = rowPtr->get_ptrLasTick(); //ptr points where datum will be in
1312 //previous_nt_PreDatum = previous_nt_Datum = nullptr; //?
1313 //previousPreDatum = previousPreDatum = nullptr; //?
1314
1315 if (ptr->get_ushort(pp_key_index) > 1) {//fout.flush() << "\n\t\t\t:1115: > 1 index: " << ptr->get_ushort(
1316 ptr->inOrderSearch_nt_ptr(ptr, ptr->get_ntHead(), ptr->get_ushort(pp_key_index), previous_nt_Datum = null
1317 ptr->inOrderSearch_nt_ptr(ptr, ptr->get_ntHead(), ptr->get_ushort(pp_key_index) - 1, previous_nt_PreDatum
1318 /*
1319 if(ptr->get_col() > 2){
1320 ptr->inOrderSearch_nt_ptr(ptr, ptr->get_ntHead(), ptr->get_ushort(pp_key_index) , previous_nt_Datum =
1321 ptr->inOrderSearch_nt_ptr(ptr, ptr->get_ntHead(), ptr->get_ushort(pp_key_index) - 1, previous_nt_PreDatu
1322 }
1323 else
1324 if (ptr->get_col() >= 2) {
1325 ptr->inOrderSearch_nt_ptr(ptr, ptr->get_ntHead(), ptr->get_ushort(pp_key_index) , previous_nt_Datum =
1326 ptr->inOrderSearch_nt_ptr(ptr, ptr->get_ntHead(), ptr->get_ushort(pp_key_index) - 1, previous_nt_PreDat
1327 }
1328 else { //(ptr->get_col() == 1)
1329 fout << "\n\t\t\t:1150: BEGINS index > 1 "; if (ntNodes == 2)fout << "\tERROR this should not appear i
1330 ptr->inOrderSearch_nt_ptr(ptr, ptr->get_ntHead(), ptr->get_ushort(pp_key_index) , previous_nt_Datum =
1331 ptr->inOrderSearch_nt_ptr(ptr, ptr->get_ntHead(), ptr->get_ushort(pp_key_index) - 1, previous_nt_PreDat
1332 }
1333 */
1334 //fout.flush() << "\n\t\t\t:1111: ends index > 1 :1104: ";
1335 }
1336 else {//fout.flush() << "\n\t\t:1138: 0 || 1 index: " << setprecision(0) << ptr->get_ushort(pp_key_index)
1337 if (ptr->get_ushort(pp_key_index) == 1) {//fout.flush() << "\n\t\t:1137: BEGINS index = 1"; if (ntNodes =
1338 if (ptr->get_col() >= 2) {//fout << "\t:1138: col: " << ptr->get_col(); if (ntNodes == 1)fout << "\tERRO
1339 ptr->inOrderSearch_nt_ptr(ptr, ptr->get_ntHead(), 1, previous_nt_Datum = nullptr);//OK
1340 previousPreDatum = ptr->get_previous_ptr(); // the last in previous tree
1341 previousPreDatum->inOrderSearch_nt_ptr(previousPreDatum, previousPreDatum->get_ntHead(), ntNodes, previ
1342 //fout.flush() << "\n\t\t\t:1111: col 1 ends :1127:";
1343 }
1344 else {//fout.flush() << "\t:1146: col 1";
1345 ptr->inOrderSearch_nt_ptr(ptr, ptr->get_ntHead(), 1, previous_nt_Datum = nullptr);//OK
1346 previousPreDatum = net->goto_col(net, ppDataIn, ptr->get_row(), net->get_cols_in_page(ppDataIn, 'f'), '
1347 previousPreDatum->inOrderSearch_nt_ptr(previousPreDatum, previousPreDatum->get_ntHead(), ntNodes, previ
1348 //fout.flush() << "\n\t\t\t:1117: col 1 ends :1133:";
1349 }
1350 //fout.flush() << "\n\t\t:1140: ENDS index = 1 :1127:";
1351 }
1352 else {//fout.flush() << "\n\t\t:1152: start a new cluster, index = 0";
1353 if (ntNodes != 1) {//fout.flush() << "\t:1153: ntNodes: = " << ntNodes;
1354 //if (thiStock == stockID[s]){fout << "\n\t\t\t:1155: " << stockID[s] << " BEGINS index = 0 ntNOdes NOT
1355 /*
1356 if (ptr->get_col() > 2) {
1357 //previousDatum = net->goto_col(net, ppDataIn, rowPtr->get_n_row(), net->get_cols_in_page(ppDataIn, 'f
1358 previousDatum = ptr->get_previous_ptr();
1359 previousDatum->inOrderSearch_nt_ptr(previousDatum, previousDatum->get_ntHead(), ntNodes , previous_
1360 previousDatum->inOrderSearch_nt_ptr(previousDatum, previousDatum->get_ntHead(), ntNodes - 1, previous_
1361 //if (!previous_nt_Datum){fout << "\n\t:1098: ***ERROR*** EMERGENCY EXIT"; rr_ptr->DiscardStockTree(r
1362 //fout << "\n\t:1123: Tree data previousDatum"; previousDatum->Tree_Inorder_nt(previousDatum, previou
1363 //previous_nt_Datum = previousDatum->inOrderSearch_nt(previousDatum, previousDatum->get_ntHead(), ntNo
1364 //prev_nt_Val = previous_nt_Datum->get_nt_data(ppnt_data); //fout << "\n\t prev_nt_Val: " << pre
1365 //previous_nt_PreDatum = previousDatum->inOrderSearch_nt(previousDatum, previousDatum->get_ntHead(), n
1366 }
1367 else
1368 */
1369 if (ptr->get_col() >= 2) {
1370 if (firsTimeThischoosenStockID && thiStock == stockID[s]) {
1371 fout.flush() << "\t:1184: col: " << ptr->get_col();
1372 }
1373 previousDatum = ptr->get_previous_ptr();
1374 previousDatum->inOrderSearch_nt_ptr(previousDatum, previousDatum->get_ntHead(), ntNodes, previous_nt_D
1375 previousDatum->inOrderSearch_nt_ptr(previousDatum, previousDatum->get_ntHead(), ntNodes - 1, previous_
1376 }
1377 else {//fout.flush() << "\n\t\t\t:1179: in col 1";
1378 if (firsTimeThischoosenStockID && thiStock == stockID[s]) {
1379 fout.flush() << "\n\t\t\t:1183: BEGINS index = 0 ntNOdes != 1 col: " << ptr->get_col();
1380 }//(ptr->get_col() == 1)
1381 previousDatum = ptr->get_previous_ptr();
1382 previousDatum = net->goto_col(net, ppDataIn, ptr->get_row(), net->get_cols_in_page(ppDataIn, 'f'), 'f'
1383 previousDatum->inOrderSearch_nt_ptr(previousDatum, previousDatum->get_ntHead(), ntNodes, previous_nt_D
1384 previousDatum->inOrderSearch_nt_ptr(previousDatum, previousDatum->get_ntHead(), ntNodes - 1, previous_
1385 //fout << "\n\t:1123: Tree data previousDatum"; previousDatum->Tree_Inorder_nt(previousDatum, previou
1386 //previous_nt_Datum = previousDatum->inOrderSearch_nt(previousDatum, previousDatum->get_ntHead(), ntNo
1387 //prev_nt_Val = previous_nt_Datum->get_nt_data(ppnt_data); //fout << "\n\t prev_nt_Val: " << pre
1388 //previous_nt_PreDatum = previousDatum->inOrderSearch_nt(previousDatum, previousDatum->get_ntHead(), n
1389 }
1390 }
1391 else {//fout.flush() << "\n\t\t:1195: ntNodes = 1"; //if (thiStock == stockID[s]) fout.flush() << "\n\t
1392 if (ptr->get_col() > 2) {//fout.flush() << " *:1196: col: " << ptr->get_col();//if (thiStock == stockI
1393 previousDatum = ptr->get_previous_ptr();
1394 previousDatum->inOrderSearch_nt_ptr(previousDatum, previousDatum->get_ntHead(), 1, previous_nt_Datum =
1395 previousPreDatum = previousDatum->get_previous_ptr();
1396 previousPreDatum->inOrderSearch_nt_ptr(previousPreDatum, previousPreDatum->get_ntHead(), 1, previous_n
1397 }
1398 else {
1399 if (ptr->get_col() == 2) {//fout.flush() << " *:1203: col = 2"; //if (thiStock == stockID[s])fout <
1400 previousDatum = ptr->get_previous_ptr();
1401 previousDatum->inOrderSearch_nt_ptr(previousDatum, previousDatum->get_ntHead(), 1, previous_nt_Datum
1402 previousPreDatum = net->goto_col(net, ppDataIn, rowPtr->get_n_row(), net->get_cols_in_page(ppDataIn,
1403 previousPreDatum->inOrderSearch_nt_ptr(previousPreDatum, previousPreDatum->get_ntHead(), 1, previous_
1404 }
1405 else {//fout.flush() << " *:1209: col = 1";//if (thiStock == stockID[s]) fout << "\n\t\t:1234: 1 BEGIN
1406 previousDatum = net->goto_col(net, ppDataIn, rowPtr->get_n_row(), net->get_cols_in_page(ppDataIn, 'f'
1407 previousDatum->inOrderSearch_nt_ptr(previousDatum, previousDatum->get_ntHead(), 1, previous_nt_Datum
1408 previousPreDatum = previousDatum->get_previous_ptr();
1409 previousPreDatum->inOrderSearch_nt_ptr(previousPreDatum, previousPreDatum->get_ntHead(), 1, previous_
1410 }
1411 }
1412 }
1413 }
1414 }
1415 //***************************
1416 prev_nt_PreVal = previous_nt_PreDatum->get_nt_data(ppnt_data); //fout.flush() << "\n\t\t:1221: nt_PreVal:
1417 prev_nt_Val = previous_nt_Datum->get_nt_data(ppnt_data); //fout.flush() << " :1220: nt_Val: " << prev_
1418 dprevious = ep * abs(prev_nt_Val - prev_nt_PreVal); //fout.flush() << " :1222: dprevious: " <<
1419
1420 //if(
1421 //firsTimeThischoosenStockID &&
1422 //thiStock == stockID[s]){
1423 //fout.flush() << "\n\t\t:1234: " << stockID[s] << "(pre-prev, prev, datum)->(" << setprecision(2) << pre
1424 //}
1425 ///*
1426 if (is_val_in_range_t(datum, prev_nt_Val - dprevious, prev_nt_Val + dprevious) ||
1427 is_val_in_range_t(datum, prev_nt_PreVal - dprevious, prev_nt_PreVal + dprevious)) {
1428 //fout.flush() << "\n\t:1240: " << stockID[s] << " denied datum: " << setw(15) << setprecision(6) << datu
1429 /*
1430 if (
1431 //firsTimeThischoosenStockID &&
1432 thiStock == stockID[s]) {
1433 fout.flush() << "\n\t:1242: " << stockID[s] << " denied datum: " << setw(15) << setprecision(6) << datum
1434 if (is_val_in_range_t(datum, prev_nt_Val - dprevious, prev_nt_Val + dprevious)) fout.flush() << "\
1435 if (is_val_in_range_t(datum, prev_nt_PreVal - dprevious, prev_nt_PreVal + dprevious)) fout.flush() << "\
1436 }
1437 */
1438 //dprevious = 0;
1439 //previous_nt_PreDatum = previous_nt_Datum = nullptr;
1440 //fout.flush() << "\n\t\t:1251: " << stockID[s] << " does not comply with imposed filter " << datum << "
1441 //if(thiStock == stockID[s]) {fout << " rejected data no vol add"; }
1442 //fout << "\n\tVf_2: " << previousPreDatum->get_data(ppDataIn) << "\tVf_1: " << previousDatum->get_data(
1443 //fout << "\n\tCompare with 2 previous data previous ep * previuos diff = " << ep * abs(previousDatum->ge
1444 //previousDatum->set_data(ppTime, timer.elapsed().wall / timeZoomFactor);
1445 //if (!onlyOnceSone && stockID[s] == choosenStockID) f1db << "\t\t\t\t\t\t\t°°-°° update TimeStamp co
1446 }
1447 else {
1448 //*/
1449 //fout.flush() << "\n\t\t:1237: in (" << ptr->get_row() << ", " << ptr->get_col() << ") index: " << setp
1450 //fout.flush() << "\t:1237: rowPtr->get_nTick() > 2 : " << rowPtr->get_nTick() << " <-complete cluster="" nbsp="" p="">
-complete>
1451 ptr->inOrderSearch_nt_ptr(ptr, ptr->get_ntHead(), ptr->get_ushort(pp_key_index) + 1, node_ptr = nullptr);
1452 /*
1453 if (!node_ptr) {fout << "\tnullptr"; rr_ptr->DiscardStockTree(rr_ptr, rootStocks);net->kill_exsan(net);
1454 //*/
1455 node_ptr->set_nt_data(ppnt_data, datum); //entra data
1456 node_ptr->set_nt_data(ppnt_time, (double)timer.elapsed().wall / timeZoomFactor); // timeStamp of data
1457 //fout.flush() << "\tafter data in nTree index: " << ptr->get_ushort(pp_key_index);
1458 ptr->set_ushort(pp_key_index, ptr->get_ushort(pp_key_index) + 1);
1459 //fout << "\n\tTree data last in record "; ptr->Tree_Inorder_nt(ptr, ptr->get_ntHead(), ppnt_data); cerr
1460 //fout.flush() << "\n\t\tptr in ( " << ptr->get_row() << ", " << ptr->get_col() << ") index: " << ptr->ge
1461 //puede ir arriba ?
1462 if (!rowPtr->get_forward_ptr()->get_bool(pp_bool)) {
1463 rowPtr->get_forward_ptr()->set_bool(pp_bool, 1); // avisa que hay cambio en el reg
1464 //fout << "\n\t---->rowPtr->get_forward_ptr()->get_bool(pp_bool) has been set, reg updated";
1465 //fout << "\n\t:1175: ----> reg updated: " << rowPtr->get_n_row();
1466 }
1467
1468 if (ptr->get_ushort(pp_key_index) == ntNodes) {//fout.flush() << "\t:1248: index = ntNodes cluster have b
1469 ptr->set_ushort(pp_key_index, 0); // Node is completed
1470 sum1 = sum2 = 0;
1471 ptr->Sum_nt_ind1_ind2(ptr, ptr->get_ntHead(), sum1 = 0, ppnt_data, sum2 = 0, ppnt_time);
1472 rowPtr->tickIn(ppDataIn, sum1 / (double)ntNodes);// recien aqui avanza
1473 ptr->set_data(ppTime, sum2 / (double)ntNodes);
1474 if(xsn) ptr->set_data(ppDB, ptr->get_data(ppDataIn)); // just to show data in sin la inicializacion prev
1475 if (firsTimeThischoosenStockID && thiStock == stockID[s]) {
1476 fout.flush() << " :11396: DONE Cluster! col: " << ptr->get_col();
1477 fout << "\n\t:1397: Last Tree data"; ptr->Tree_Inorder_nt(ptr, ptr->get_ntHead(), ppnt_data); //fout <<
1478 //fout << "\n\t:1280: Tree time "; ptr->Tree_Inorder_nt(ptr, ptr->get_ntHead(), ppnt_time); // fout
1479 //fout << "\n\t:1280: ppDataIn"; net->displayMKT(net, ppDataIn, aryStock, nullptr, 0, 5, widthCol - 1,
1480 }
1481 inData = 1;
1482 if (ptr->get_col() == net->get_cols_in_page(ppDataIn, 'f')) {
1483 //if(thiStock == stockID[s]) {fout.flush() << " complete record\n";}
1484 //fout << "\n\t\t\t--> reg trigering: " << rowPtr->get_n_row();
1485 if (!readyDB) {
1486 completeRec = 0; //COUNTER
1487 rr_ptr->rowTree_In_OrderStockCompleteRecordCounter(rr_ptr, rootStocks, cols, completeRec);
1488 if (completeRec > completeRecDB * stockCounterDB) {
1489 readyDB = 1;
1490 //fout << "\n\t---->check is available now DB is " << completeRecDB << "% complete readyDB = 1";
1491 //fout << "\n\t:1439: readyDB = 1; "; net->displayMKT(net, ppDataIn, aryStock, nullptr, 0, 5, width
1492 }
1493 }
1494 //else check = 1;
1495
1496 //times = timer.elapsed();
1497 //ptr->set_data(ppTime, (double)times.wall / timeZoomFactor);
1498 //ptr->set_data(ppTime, timer.elapsed().wall / timeZoomFactor);
1499 rowPtr->tickInPoinTo(rowPtr->get_forward_ptr());
1500 }
1501 }
1502 //bool static thisBlockdone(0);
1503 static unsigned short counterthisBlock(4);
1504 if (0 && xsn && !(geNSTOCKS % net->get_rows_in_page(ppDataIn, 'f')) && counterthisBlock) {
1505 {
1506 fout << "\n\t:1454: Polulating ExSan - Uploading DB Counter: " << counterthisBlock << " pp: " << pp
1507 fout.flush() << "\t" << thread_clock::now();
1508 //net->displayMKT(net, ppDataIn, aryStock, nullptr, 0, 2, 5, 2); //system("pause");
1509 net->displayMKT(net, ppDB, aryStock, nullptr, 0, 2, 5, 2); //system("pause");
1510 //fout.flush() << "\n\t
1511 --counterthisBlock;
1512 }
1513 }
1514 //rowPtr->tickIn(ppDataIn, datum);
1515 //enable this to see only when record has been completed
1516 //inData = 1;
1517 //fout << "\n\tIN-> " << setw(8) << left << stockID[s];
1518 //fout << "-datum ---> " << "(" << ptr->get_row() << ", " << ptr->get_col() << "): " << datum << " end of
1519 //////control when to start check
1520 //*
1521 if(!readyDB){
1522 //fout << "\n";
1523 //these 2 instructions togheter
1524 completeRec = 0; //COUNTER
1525 rr_ptr->rowTree_In_OrderStockCompleteRecordCounter(rr_ptr, rootStocks, cols, completeRec);
1526 if (completeRec > completeRecDB * stockCounterDB) {
1527 readyDB = 1;
1528 fout << "\n\t:1476: ---->check is available now DB is " << completeRecDB << "% complete";
1529 }
1530 }
1531 else {
1532 checkCounter++;
1533 //fout << "\n\t:1471: Hit checkCounter: " << checkCounter << "/" << checkTrigger;
1534 if (checkCounter == checkTrigger) {
1535 check = 1;
1536 //fout << "\n\t:1484: set check because ready DB is set, checkCounter equal checkTrigger: " << checkCou
1537 }
1538 }
1539 //*/
1540 //////control when to start check
1541 //check = 1; // at the end of a record
1542 //++p[(unsigned long int) ((nintervals - 1)*(datum - stFrom) / (stTo - stFrom))];
1543 //nrolls++;
1544 /*
1545 if (!rowPtr->get_forward_ptr()->get_bool(pp_bool)) {
1546 rowPtr->get_forward_ptr()->set_bool(pp_bool, 1); // avisa que hay cambio en el reg
1547 fout << "\n\t---->rowPtr->get_forward_ptr()->get_bool(pp_bool) has been set";
1548 }
1549 */
1550 //times = timer.elapsed();
1551 //ptr->set_data(ppTime, (double)times.wall / timeZoomFactor);
1552 //ptr->set_data(ppTime, timer.elapsed().wall / timeZoomFactor);
1553 //rowPtr->tickInPoinTo(rowPtr->get_forward_ptr());
1554 //fout.flush() << "\n\t\t:1338: ENDS datum in back to read a new datum";
1555 }// time stamp is updated
1556 //ptr->set_data(ppTime, timer.elapsed().wall / timeZoomFactor); ???? esto elimino en fecha Mayo 20
1557 //if (!stPtr->get_forward_ptr()->get_bool(ppRTime)) stPtr->get_forward_ptr()->set_bool(ppRTime, 1); // a
1558 //if(!onlyOnceSone && stockID[s] == choosenStockID) f1db << setw(15) << timer.elapsed().wall / timeZoomFac
1559 //fout << "\n\t\t:1240: ends datum in range and into db :1140: ";
1560 ////******************
1561
1562 //fout << "\n\tIN-> " << setw(8) << left << stockID[s] << "\tdatum: " << datum ; //setfill('.') <<
1563 //fout << "\n\tppDataIn"; net->displayMKT(net, ppDataIn, aryStock, nullptr, 0, 4, widthCol, 0); //system("
1564 //fout << "\n\tppTime"; net->displayMKT(net, ppTime, aryStock, nullptr, 0, 4, widthCol, 0);
1565 /*
1566 if (geNSTOCKS >= 10 && s == 0) {
1567 fout << "\n\tEXIT - datum- " << datum;
1568 //i = rowPtr->get_n_row();
1569 //i = stockCounterDB / 2;
1570 i = 1;
1571 aryStockAux[i] = 1;
1572 fout << "\n\tppDataIn"; net->displayMKT(net, ppDataIn, aryStockAux, nullptr, 0, 10, 10);
1573 fout << "\n\tppTime"; net->displayMKT(net, ppTime, aryStockAux, nullptr, 0, 10, 10, 4);
1574 aryStockAux[i] = 0;
1575 fout << "\n\t------------------END-----------------------------";
1576 }
1577 */ //fout << "\n\t\t:1556: ENDS StockIsInDbAlready :1251:";
1578 }
1579 }
1580 //else fout << " :1367: discarded DATUM not in range it closes :897:\n";
1581 }
1582 else fout << "\n\t\t\t\t:1536: Invalid datum -not a number- Stock: " << setw(7) << stockID[s] << " " << val.
1583
1584 /*
1585 if(inData){
1586 //fout << "\n\tREAL DATA ppDataIn"; net->displayMKT(net, ppDataIn, aryStock, nullptr, 0, 5, widthCol, presC
1587 fout << "\n\t(inData)TIME STAMP ppTime"; net->displayMKT(net, ppTime, aryStock, nullptr, 0, 5, widthCol,
1588 inData = 0;
1589 }
1590 //*/
1591 //check = false; //test input a singl stock enable next instruction
1592 if (1 && check) { // 0 do not look for portfolio jump the whole program
1593 static unsigned short counterthisBlock(1);
1594 if (1 && xsn && counterthisBlock) { //xssn
1595 {
1596 //fout << "\n\t:1521: Polulating ExSan - Uploading DB Counter: " << counterthisBlock << " pp: " << pp
1601 //printf("Error! Couldn't Statistics File: ", balanceSheet);
1602 fout.flush() << "\tCouldn't open Parameter Sheet File: " << txtFileXSN;
1603 exit(1);
1604 }
1605 do {
1606 getline(fxsn, line);
1607 fout << "\n\t" << line;
1608 } while (!fxsn.eof());
1609 fxsn.close();
1610 fout.flush() << "\n\t" << thread_clock::now();
1611 fout << "\n\t:1611: ExSan Frame ready for Volatily dependent selection DB Counter: " << counterthisBlock
1612 --counterthisBlock;
1613 }
1614 }
1615
1616 nTicksLineal = nTL; /// no entiendo la razon de esta instrucion
1617 checkCounter = 0;
1618 /*
1619 fout << "\n\t:1460: CHECK---- either a wrap around or no room for new data in DB "
1620 << "\tgeNSTOCKS: " << geNSTOCKS
1621 << "\tnTicksLineal " << nTicksLineal << "\t:nTL " << nTL;
1622 fout << "\n\t:1461: As it is *A ppDataIn"; net->displayMKT(net, ppDataIn, aryStock, nullptr, 0, 5, widthCol-
1623 /*/
1624
1625 if(0){ //python block
1626 /* Python block
1627
1628 fout << "\n\t:1461:PYTHON BLOCK As it is *A ppDataIn"; net->displayMKT(net, ppDataIn, aryStock, nullptr, 0,
1629 fout << "before calling result: " << ++result;
1630 //---CallPython Service Open-----
1631 fstream ftx("tx.txt");
1632 fstream frx("rx.txt");
1633 Py_Initialize();
1634 fout.close();
1635 hout.close();
1636 //---Call Python Service Close------
1637
1638
1639 PyObject* objTRX = Py_BuildValue("s", "usingTxRx.py");
1640 FILE* fileTRX = _Py_fopen_obj(objTRX, "r+");
1641 if (fileTRX != NULL) {
1642 cout << "\n\t--Execute script usingTxRx.py";
1643 PyRun_SimpleFile(fileTRX, "usingTxRx.py");
1644 }
1645
1646 frx >> result;
1647
1648 //--------Python Service Done - Open------------------------
1649 //std::ofstream fout, hout; // asume que es una variable local nueva????
1650 fout.open(out_txt_file_name, ios::out | fstream::app); // open the output file
1651 hout.open(out_html_file_name, ios::out | fstream::app); // open the output file
1652 Py_Finalize();
1653 ftx.close();
1654 ftx.close();
1655 //---------Python Service Done - Close----------
1656 cout << "\n\t\t--Back in C/C++ after Python Call result: " << result;
1657 fout << "\n\t\t--Back in C/C++ after Python Call result: " << result;
1658 //*/
1659
1660 }
1661
1662 /*
1663 if(stockCounterDB <= 2 ) {
1664 CELLPTR ptr(nullptr);
1665 fout << "\n\tTRAVERSE IN ORDER TO VERYFY INPUT\n";
1666 //for (i = 1; i <= net->get_rows_in_page(ppDataIn, 'f'); i++) {
1667 for (i = 1; i <= 3; i++) { // las tres primeras filas
1668 ptr = net->point_to(net, ppDataIn, i, 1, 'f');
1669 for (j = 1; j <= net->get_cols_in_page(ppDataIn, 'f'); j++) {
1670 //fout << "\n\tindex: " << ptr->get_ushort(pp_key_index) << endl;
1671 ptr->Tree_Inorder_nt(ptr, ptr->get_ntHead(), ppnt_data);
1672 fout << endl;
1673 ptr = ptr->get_next_ptr();
1674 }
1675 fout << endl;
1676 }
1677 }
1678 //*/
1679 //fout << "\n\t:1480: ppTime";
1680 //fout << "\n\t:1481: Timer current mark---> " << setw(10) << setprecision(6) << timer.elapsed().wall / time
1681 /*
1682 cpu_times times = timer.elapsed();
1683 fout << "\n\n\ttimer.format()---> " << timer.format();
1684 fout << "\n\ttimes.wall---> " << times.wall;
1685 //fout << "\n\ttimes.user---> " << times.user; fout << "\n\ttimes.user " << times.system;
1686 //*/
1687 //fout << "\n\tRelative Timer ppRTime"; net->displayMKT(net, ppRTime, aryStock, nullptr, 0, 3, 10, 0);
1688 //fout << "\n\tMost active stock #ticks:-> " << maxF; // << " ppDataIn"; net->displayMKT(net, ppDataIn, ar
1689 //fout << "\n\tppTime Elapsed Time Tick by Tick times.wall---> " << setw(10) << setprecision(6) << times.wal
1690 //quizas este bloque atraves del arbol
1691 //me parece que aqui se hace la seleccion de la data en base al conteo de actividad
1692 //no de mas activo
1693 //buscar los menores en la columna de set_hiTime
1694 /// last tick in complete Jun 22 Start
1695 //fout << "\n\t:1700: last tick in";
1696 /*
1697 for (i = 1; i <= net->get_rows_in_page(ppDataIn, 'f'); i++) { //SERIA BUENO SOLO CORREGIR LOS NECESARIOS REG
1698 //for (i = 1; i <= 10; i++) { //only for test
1699 rowPtr = net->goto_row(net, ppDataIn, i, 'f');
1700 ptr = rowPtr->get_ptrLasTick();
1701 if(ptr->get_ushort(pp_key_index) && ptr->get_ushort(pp_key_index) < ntNodes){//OK
1702 //hay calculo repetido, habria que detectar los que no han cambiado
1703 ptr->set_data(ppDataIn, 0); //do not erase, this is the initial val
1704 ptr->set_data(ppTime, 0); //do not erase, this is the initial val
1705 //fout << "\n\t:1350: Reset Tre-set-data:-> " << ptr->get_data(ppDataIn) << " - " << ptr->get_data(ppTime)
1706 fout << "\n\tLast incomplete cluster: " << ptr->get_ushort(pp_key_index) << " row: " << i;
1707 //fout << "\tLast Tree in\n"; ptr->Tree_Inorder_nt(ptr, ptr->get_ntHead(), ppnt_data); fout << endl; ptr->
1708 //fout << "\t(data - time) Current( " << ptr->get_data(ppDataIn) << " - " << ptr->get_data( ppTime) << ")
1709 j = ptr->get_ushort(pp_key_index); //fout << "\n\t(" << i << "," << j << ")";// j es actualizada en cada
1710 ptr->Tree_Inorder_nt_update_Data_Time(ptr, ptr->get_ntHead(), ppDataIn , ppTime, j, ptr->get_ushort(pp_k
1711 fout << "\t:1353: UPDATED (" << setw(2) << i << ", " << setw(2) << ptr->get_col() << ") " << setw(5) <<
1712 }
1713 }//OK
1714 fout << "\n\t:1356: UPDATED check *A1 ppDataIn"; net->displayMKT(net, ppDataIn, aryStock, nullptr, 0, 5, wid
1715 */
1716 /// last tick in complete Jun 22 End
1717 // solo entran a la db los que ary no sea cero ojo!!!!!
1718 completeDB = 0;
1719 times = timer.elapsed(); //!!!importante no borrar es el punto de referencia¡¡¡
1720 //fout << "\n\tCurrent times.wall " << times.wall << "\tPrevious " << prevTimes;
1721 //fout << "\n\tTimer current mark -used-as-reference--> " << setw(15) << setprecision(6) << times.wall / tim
1722 //!!!importante no borrar es el punto de referencia¡¡¡
1723 maxF = 0;
1724 stPtr = net->goto_row(net, ppDataIn, 1, 'f');
1725 crptr->DiscarDB(crptr, db_root, 'f');
1726 counterSt = 0;
1727 change = false;
1728 onlyOnce = 1; //not used yet!!!
1729 dataCounter[2] = dataCounter[3] = dataCounter[4] = 0;
1730 // averiguar el promedio tickInTimer
1731 for (i = 1; i <= net->get_rows_in_page(ppDataIn, 'f'); i++) {//OK revised Aug 27
1732 //sobra esta instruccion
1733 //aryDB[i] = 0; // nadie en db para portfolio este es parametro para correLinealPLus
1734 //if (aryStock[i] && stPtr->get_nTick() > maxF) maxF = stPtr->get_nTick(); //no entiendo que hace esta inst
1735 // si esta proximo al ultimo Tick InTime
1736 // vuelve a calcular el chrono time aun cuando no hay cambio???
1737 // hay que usar una bandera para evitar este recalculo
1738 //if(stPtr->get_nTick() > cols && stPtr->get_forward_ptr()->get_bool(pp_bool)) { // solo de aquellos que
1739 if (stPtr->get_nTick() >= net->get_cols_in_page(ppDataIn, 'f') && // ONLY COMPLETE RECORD/FULL CLUSTER
1740 ( stPtr->get_forward_ptr()->get_bool(pp_bool) || //those belonging to the current check
1741 stPtr->get_forward_ptr()->get_next_ptr()->get_bool(pp_bool)) //from previous check it TimeMaxGap
1742 ) { //is set when it changes
1743
1744 //just stadistics
1745 if (stPtr->get_forward_ptr()->get_bool(pp_bool)) dataCounter[2]++; //los propios de este check
1746 if (stPtr->get_forward_ptr()->get_next_ptr()->get_bool(pp_bool)) dataCounter[3]++; //de la anterior corri
1747
1748 ///*:regTimeSaver: maybe comment this block to keep the stocks for next round if there is not enough Nov
1749 stPtr->get_forward_ptr()->set_bool(pp_bool, 0); // reset OUTSIDE THE LOOP, no
1750 stPtr->get_forward_ptr()->get_next_ptr()->set_bool(pp_bool, 0); // reset previous in
1751 ///*/
1752
1753 //XSN-> why it considers only those that are apdated????? a bell is ringed at the end of the record
1754 // consider only those who changed in the round, I think it is ok
1755 //fout << "\n\t:1481: Updated Stock: " << setw(4) << stPtr->get_n_row() << ": " << setw(6) << stPtr->get_s
1756 ////////////////////////// from uppper block
1757 ptr = stPtr->get_ptrLasTick();
1758 if (ptr->get_ushort(pp_key_index) && ptr->get_ushort(pp_key_index) < ntNodes) {//OK
1759 ptr->set_data(ppDataIn, 0); //do not erase, this is the initial val
1760 ptr->set_data(ppTime, 0); //do not erase, this is the initial val
1761 //fout << "\n\t:1350: Reset Tre-set-data:-> " << ptr->get_data(ppDataIn) << " - " << ptr->get_data(ppTime
1762 //fout << "\n\t:1384: Last incomplete cluster: " << ptr->get_ushort(pp_key_index) << " row: " << i;
1763 //fout << "\tLast Tree in\n"; ptr->Tree_Inorder_nt(ptr, ptr->get_ntHead(), ppnt_data); fout << endl; ptr-
1764 //fout << "\t(data - time) Current( " << ptr->get_data(ppDataIn) << " - " << ptr->get_data( ppTime) << "
1765 j = ptr->get_ushort(pp_key_index); //fout << "\n\t(" << i << "," << j << ")";// j es actualizada en cada
1766 ptr->Tree_Inorder_nt_update_Data_Time(ptr, ptr->get_ntHead(), ppDataIn, ppTime, j, ptr->get_ushort(pp_key
1767 //fout << "\t:1719: UPDATED (" << setw(2) << i << ", " << setw(2) << ptr->get_col() << ") " << setw(5) <<
1768 }
1769 //////////////////////////
1770
1771 //*----------------------------------
1772 // cluster traversal
1773 if (0) { //para garantizar una poblacion necesaria
1774 //if(geNSTOCKS <= .1* grandTotal){ //para garantizar una poblacion necesaria
1775
1776 fout << "\n\t:1574: Begin --- cluster traversal----- nStocks: " << nStocksMg;
1777 //unsigned short nPointers(countElementInAry(aryDBin, true, firstRow, lastRow));
1778
1779 for (i = 0; i <= nPointers - 1; i++) {
1780 aryStockPtr[i] = nullptr;
1781 aryPtr[i] = nullptr;
1782 aryStockPtr[i] = net->goto_row(net, ppDataIn, i + 1, 'f');
1783 pltM.idStockInQue(aryStockPtr[i]->get_stock_name());
1784 aryPtr[i] = aryStockPtr[i]->get_ptrLasTick();
1785 }
1786 //aryStockPtr[0] = net->goto_row(net, ppDataIn, 1, 'f');
1787 //aryStockPtr[1] = net->goto_row(net, ppDataIn, 2, 'f');
1788 //aryStockPtr[2] = net->goto_row(net, ppDataIn, 3, 'f');
1789
1790 //for (i = 0; i <= nPointers - 1; i++) {
1791 //ptr points where datum will be in
1792 //OK revised Feb 15
1793 //aryPtr[i] = aryStockPtr[i]->get_ptrLasTick();
1794 //fout << "\n\t: (" << aryPtr[i]->get_row() << ", " << aryPtr[i]->get_col() << ") = " << aryPtr[i]->get_
1795
1796 //}
1797 fout << "\n";
1798 for (j = 1; j <= net->get_cols_in_page(ppDataIn, 'f'); j++) {//OK revised Aug 27
1799 //for (i = 1; i <= 1; i++) {//OK revised Aug 27
1800 for (i = 0; i <= nPointers - 1; i++) {//OK revised Aug 27
1801 //for (std::size_t i = 0; i < nPointers; ++i)
1802 fout << "\t: (" << aryPtr[i]->get_row() << ", " << aryPtr[i]->get_col() << ")-> " << aryPtr[i]->get_d
1803 //doNodeClustering
1804 aryPtr[i]->Tree_nt_CandleParameters(aryPtr[i], aryPtr[i]->get_ntHead(), ppnt_data, pp_openVal, pp_lowVa
1805
1806 aryPtr[i] = aryPtr[i]->get_next_ptr();
1807 if(aryPtr[i]->get_col() > net->get_cols_in_page(ppDataIn, 'f')) aryPtr[i] = aryStockPtr[i]->get_forward
1808 }
1809 fout << "\n";
1810 }
1811
1812 fout << "\n\tData RANGE <" << superMin << " - " << superMax << ">";
1813 net->set_work_sheet(net, pp_openVal, net->get_rows_in_page(ppDataIn, 'f'), net->get_cols_in_page(ppDataIn
1814 net->set_work_sheet(net, pp_lowVal, net->get_rows_in_page(ppDataIn, 'f'), net->get_cols_in_page(ppDataIn,
1815 net->set_work_sheet(net, pp_highVal, net->get_rows_in_page(ppDataIn, 'f'), net->get_cols_in_page(ppDataIn
1816 net->set_work_sheet(net, pp_closeVal, net->get_rows_in_page(ppDataIn, 'f'), net->get_cols_in_page(ppDataI
1817
1818 fout << "\n\t:1589: pp_openVal"; net->displayMKT(net, pp_openVal, aryStock, nullptr, 0, 5, widthCol - 1,
1819 fout << "\n\t:1589: pp_lowVal"; net->displayMKT(net, pp_lowVal, aryStock, nullptr, 0, 5, widthCol - 1,
1820 fout << "\n\t:1589: pp_highVal"; net->displayMKT(net, pp_highVal, aryStock, nullptr, 0, 5, widthCol - 1,
1821 fout << "\n\t:1589: pp_closeVal"; net->displayMKT(net, pp_closeVal,aryStock, nullptr, 0, 5, widthCol - 1,
1822
1823 unsigned short idGraph(0);
1824
1825 pltM.set_titleMg("HISTORICAL DATA - Snapshot of Market, sometime after 2000 " + idGraph);
1826
1829
1830 pltM.set_path(plot_data);
1831 pltM.set_idPlotmG(++idPlotG);
1832
1833 unsigned short * indexNtNodeAry = new unsigned short[nStocksMg];
1834 fstream* fAry = new fstream[nStocksMg]; //candle
1835 fstream* fAryData = new fstream[nStocksMg]; //full data
1836
1837 string* AryDataFileName = new string[nStocksMg]; //full data
1838 string* AryDataFileName2 = new string[nStocksMg]; //full data
1839
1840 double* minfAryData = new double[nStocksMg]; //full data
1841 double* maxfAryData = new double[nStocksMg]; //full data
1842
1843 double* minfAry = new double[nStocksMg]; //candle
1844 double* maxfAry = new double[nStocksMg]; //candel
1845
1846 for (unsigned short ff = 0; ff < nStocksMg; ff++) {
1847 minfAry[ff] = minfAryData[ff] = 10000000.;
1848 maxfAry[ff] = maxfAryData[ff] = 0;
1849 indexNtNodeAry[ff] = 0;
1850 AryDataFileName[ff] = plot_data + "_cndlData_" + to_string(idPlotG) + to_string(ff) + "_" + topic_id_job
1851 //fAry[ff].open(plot_data + to_string(ff) + "_" + topic_id_job + ".txt", ios::out);
1852 fAry[ff].open(AryDataFileName[ff], ios::out);
1853
1854 AryDataFileName2[ff] = plot_data + "_rawData_" + to_string(idPlotG) + to_string(ff) + "_" + topic_id_job
1855 //fAryData[ff].open(plot_data + "_rawData_" + to_string(ff) + "_" + topic_id_job + ".txt", ios::out);
1856 fAryData[ff].open(AryDataFileName2[ff], ios::out);
1857 }
1858
1859 for (i = 0; i <= nPointers - 1; i++) {
1860 aryPtr[i] = aryStockPtr[i]->get_ptrLasTick();
1861 //fout << "\n\t: (" << aryPtr[i]->get_row() << ", " << aryPtr[i]->get_col() << ") = " << aryPtr[i]->get_
1862 }
1863 fout << "\n";
1864
1865 //const enum pages_nt { pp_lastIN, ppnt_time, ppnt_data, ppnt_medium }; // es necesario el elemento zero
1866 //unsigned short* ary_ntPage = new unsigned short[ppnt_medium];
1867
1868 for (j = 1; j <= net->get_cols_in_page(ppDataIn, 'f'); j++) {//OK revised Aug 27
1869 for (i = 0; i <= nPointers - 1; i++) {//OK revised Aug 27
1870 //fout << "\t: (" << aryPtr[i]->get_row() << ", " << aryPtr[i]->get_col() << ")-> " << aryPtr[i]->ge
1871 switch (aryPtr[i]->get_row()) {
1872 case 1: //fAry[0] << "\t: (" << aryPtr[i]->get_row() << ", " << aryPtr[i]->get_col() << ")-> " <<
1873 if (j == 1) fAry[0] << ntNodes / 2 ; else fAry[0] << ntNodes / 2 + j * ntNodes;
1874 fAry[0] << "\t" << aryPtr[i]->get_data(pp_openVal) << "\t" << aryPtr[i]->get_data(pp_lowVal) << "\
1875
1876 if (aryPtr[i]->get_data(pp_lowVal) < minfAry[0]) minfAry[0] = aryPtr[i]->get_data(pp_lowVal)
1877 else if (maxfAry[0] < aryPtr[i]->get_data(pp_highVal)) maxfAry[0] = aryPtr[i]->get_data(pp_highVal
1878
1879 break;
1880
1881 case 2: //fAry[1] << "\t: (" << aryPtr[i]->get_row() << ", " << aryPtr[i]->get_col() << ")-> " << ar
1882 if (j == 1) fAry[1] << ntNodes / 2; else fAry[1] << ntNodes / 2 + (j-1) * ntNodes;
1883 fAry[1] << "\t" << aryPtr[i]->get_data(pp_openVal) << "\t" << aryPtr[i]->get_data(pp_lowVal) << "\
1884
1885 if (aryPtr[i]->get_data(pp_lowVal) < minfAry[1]) minfAry[1] = aryPtr[i]->get_data(pp_lowVal)
1886 else if (maxfAry[1] < aryPtr[i]->get_data(pp_highVal)) maxfAry[1] = aryPtr[i]->get_data(pp_highVal
1887
1888 break;
1889
1890
1891 case 3: //fAry[2] << "\t: (" << aryPtr[i]->get_row() << ", " << aryPtr[i]->get_col() << ")-> " <<
1892 if (j == 1) fAry[2] << ntNodes / 2; else fAry[2] << ntNodes / 2 + (j-1) * ntNodes;
1893 fAry[2] << "\t" << aryPtr[i]->get_data(pp_openVal) << "\t" << aryPtr[i]->get_data(pp_lowVal) << "\
1894
1895 if (aryPtr[i]->get_data(pp_lowVal) < minfAry[2]) minfAry[2] = aryPtr[i]->get_data(pp_lowVal)
1896 else if (maxfAry[1] < aryPtr[2]->get_data(pp_highVal)) maxfAry[2] = aryPtr[i]->get_data(pp_highVal
1897
1898 break;
1899
1900 case 4: //fAry[2] << "\t: (" << aryPtr[i]->get_row() << ", " << aryPtr[i]->get_col() << ")-> " <<
1901 if (j == 1) fAry[2] << ntNodes / 2; else fAry[3] << ntNodes / 2 + (j - 1) * ntNodes;
1902 fAry[3] << "\t" << aryPtr[i]->get_data(pp_openVal) << "\t" << aryPtr[i]->get_data(pp_lowVal) << "\
1903
1904 if (aryPtr[i]->get_data(pp_lowVal) < minfAry[2]) minfAry[2] = aryPtr[i]->get_data(pp_lowVal)
1905 else if (maxfAry[1] < aryPtr[2]->get_data(pp_highVal)) maxfAry[2] = aryPtr[i]->get_data(pp_highVal
1906 break;
1907
1908 case 5: //fAry[2] << "\t: (" << aryPtr[i]->get_row() << ", " << aryPtr[i]->get_col() << ")-> " <<
1909 if (j == 1) fAry[4] << ntNodes / 2; else fAry[4] << ntNodes / 2 + j * ntNodes;
1910 fAry[4] << "\t" << aryPtr[i]->get_data(pp_openVal) << "\t" << aryPtr[i]->get_data(pp_lowVal) << "\
1911
1912 if (aryPtr[i]->get_data(pp_lowVal) < minfAry[2]) minfAry[2] = aryPtr[i]->get_data(pp_lowVal)
1913 else if (maxfAry[1] < aryPtr[2]->get_data(pp_highVal)) maxfAry[2] = aryPtr[i]->get_data(pp_highVal
1914 break;
1915 }
1916
1917 switch (aryPtr[i]->get_row()) {
1918 case 1:
1919 aryPtr[i]->Tree_Inorder_nt_toFile(aryPtr[i], aryPtr[i]->get_ntHead(), ppnt_data, indexNtNodeAry[0]
1920 break;
1921 case 2:
1922 aryPtr[i]->Tree_Inorder_nt_toFile(aryPtr[i], aryPtr[i]->get_ntHead(), ppnt_data, indexNtNodeAry[1]
1923 break;
1924
1925 case 3:
1926 aryPtr[i]->Tree_Inorder_nt_toFile(aryPtr[i], aryPtr[i]->get_ntHead(), ppnt_data, indexNtNodeAry[2
1927 break;
1928
1929 case 4:
1930 aryPtr[i]->Tree_Inorder_nt_toFile(aryPtr[i], aryPtr[i]->get_ntHead(), ppnt_data, indexNtNodeAry[3]
1931 break;
1932
1933 case 5:
1934 aryPtr[i]->Tree_Inorder_nt_toFile(aryPtr[i], aryPtr[i]->get_ntHead(), ppnt_data, indexNtNodeAry[4]
1935 break;
1936 }
1937
1938 aryPtr[i] = aryPtr[i]->get_next_ptr();
1939 if (aryPtr[i]->get_col() > net->get_cols_in_page(ppDataIn, 'f')) aryPtr[i] = aryStockPtr[i]->get_forwar
1940 }
1941 //fout << "\n";
1942 //fAry[aryPtr[i]->get_row()] << "\n";
1943 }
1944
1945 double supermax(0), supermin(50000);
1946 for (unsigned short ff = 0; ff < nStocksMg; ff++) {
1947 fout << "\n\t: file " << ff << "\tmin1: " << minfAryData[ff] << "\tmax1: " << maxfAryData[ff];
1948 fout << "\n\t: file " << ff << "\tmin2: " << minfAry[ff] << "\tmax2: " << maxfAry[ff];
1949 if (minfAry[ff] < supermin) supermin = minfAry[ff];
1950 if (maxfAry[ff] > supermax) supermax = maxfAry[ff];
1951
1952 fAry[ff].close();
1953 fAryData[ff].close();
1954 pltM.dataFilesInQue(AryDataFileName2[ff]);
1955 pltM.dataFilesInQueCndl(AryDataFileName[ff]);
1956 }
1957
1958 pltM.set_xrangeMg(1, net->get_cols_in_page(ppDataIn, 'f') * ntNodes);
1959 //pltM.set_yrangeMg(stFrom, stTo);
1960 pltM.set_yrangeMg(supermin, supermax);
1961
1962 //pltM.extract_mulGraph();
1963 //pltM.resetMG(); // Before clear container:"; para la siguiente pasada
1964 /*
1965 for (i = 0; i <= nPointers - 1; i++) {
1966 delete aryStockPtr[i];
1967 delete aryPtr[i];
1968 }
1969 */
1970 ///delete aryStockPtr;
1971 //delete aryPtr;
1972 fout << "\n\t:1978: End --- cluster traversal-----";
1973 }
1974 //*/
1975 //-------------cluster traversal--------------------
1976 meanTimer = 0;
1977 //if (stPtr->whereTickIn() > cols)
1978 ptr = stPtr->get_forward_ptr(); //
1979 //fout << endl;
1980 for (k = 1; k <= cols; k++) {//fout << " + " << ptr->get_data(ppTime);
1981 meanTimer += ptr->get_data(ppTime);
1982 ptr = ptr->get_next_ptr();
1983 }
1984 //fout << "\n\teach times.wall " << times.wall;
1985 stPtr->set_hiTime(times.wall / timeZoomFactor - meanTimer / cols);
1986 //fout << "\tmeanTimer: " << meanTimer << "/#cols: " << meanTimer / cols << " relative elapsed time " <<
1987 stPtr->get_forward_ptr()->set_data(ppRTime, times.wall / timeZoomFactor - meanTimer / cols);
1988 crptr->RB_Insert_data(db_root, stPtr->get_forward_ptr(), 'f', ppRTime);
1989 counterSt++;
1990 if (!change) change = true;
1991 ///*
1992 //fout << "\n\t" << counterSt << " Insert... " << stPtr->get_forward_ptr()->get_data(ppRTime);
1993 //fout << "\n\tInside IN ORDER timeStamp"; net->InOrderData(net, crptr, db_root, ppRTime);
1994 ///*/
1995 }
1996 //Dec 3
1997 //stPtr->get_forward_ptr()->set_bool(pp_bool, 0); //here copy of this environment
1998 //dataCounter[3] = 0;
1999 //if(stPtr->get_forward_ptr()->get_bool(pp_bool)){
2000 //stPtr->get_forward_ptr()set_bool(pp_bool, stPtr->get_forward_ptr()->get_bool(pp_bool))
2001 //dataCounter[3]++;
2002 //}
2003 //stPtr->get_forward_ptr()->set_bool(pp_bool, 0); // reset current environment
2004 //fout << "\n\tAfter If - Inside IN ORDER timeStamp -one at the time- DB ppRTime"; net->InOrderData(net, cr
2005 stPtr = stPtr->get_down_ptr();
2006 }//ok timeZoomFactor 1.e6 NO TOPAR ESTE BLOQUE!!! no topar!!! Sept 19
2007 statVector[2] = (double)dataCounter[2]; // esta corrida
2008 statVector[3] = (double)dataCounter[3]; // anterior corrida
2009 statVector[4] = (double)counterSt; //esta corrida total
2010 //fstat << "\n\n\t:1576:"; for (int i = 0; i <= 4; i++) fstat << "\t" << setw(7) << statVector[i]; fstat <<
2011 /*
2012 for (int i = 0; i <= 2; i++) {
2013 double frac(0);
2014 modf(statVector[i], &frac);
2015 if (frac) fstat << setw(7) << setprecision(3) << statVector[i] << " ";
2016 else fstat << setw(5) << statVector[i] << " ";
2017 }fstat << " selected from input" << endl;
2018 */
2019 //if(change) fout << "\n\tCHANGE DB";
2020 prevTimes = times.wall; // do not comment this, time reference
2021 //fout << "\n\t:1830: Reference Time clock times.wall---> " << setw(10) << setprecision(6) << times.wall / t
2022 //fout << "\n\t:1831: ppRTime Chrono---> ppRTime"; net->displayMKT(net, ppRTime, aryStock, nullptr, 0, 3, 1
2023 /*
2024 if(db_root){//dummy to visulalize
2025 fout << "\n\t:1835: TimeStamp dbTree:" ;
2026 unsigned short counT = 0;
2027 net->InOrderData(net, crptr, db_root, ppRTime, counT);
2028 fout << "\n\tchange = " << change << "\tExpected minDB: " << minDB << " <> " << counT << " :counterSt";
2029 }
2030 //*/
2031 //change = 0; // normal op comment here enable to test reset stock change
2032 //minDB = 4; // s comment all the time
2033
2034 if(change && counterSt >= minDB) {//ok!!!LABEL
2035 static unsigned short counterthisBlock(1);
2036 if (1 && xsn && !(geNSTOCKS % net->get_rows_in_page(ppDataIn, 'f')) && counterthisBlock) { //XSN
2037 {
2038 fout << "\n\t:2045: Snapshot populating ExSan Counter: " << counterthisBlock << " pp: "
2039 fout.flush() << "\t" << thread_clock::now();
2040 //net->displayMKT(net, ppDataIn, aryStock, nullptr, 0, 2, 5, 2); //system("pause");
2041 net->displayMKT(net, ppDB, aryStock, nullptr, 0, 2, 6, 2);
2042 --counterthisBlock;
2043 }
2044 }
2045 unsigned short counterST = 0;
2046 //fout << "\n\t:1850: TimeStamp dbTree:" ; net->InOrderData(net, crptr, db_root, ppRTime, counterST);
2047 //fout << "\n\t:1851: --- chrono filtered stocks db --- basic db counterST:--> " << counterST << " >= " <<
2048 imin = minDB; //Mar 7 between the firs imin search the max
2049 min2 = 0;
2050 completeDB = 0; //ok
2051 for (i = 1; i <= net->get_rows_in_page(ppDataIn, 'f'); i++) aryDB[i] = 0; // nadie en db para portfolio est
2052 net->timeMaxGap(net, crptr, db_root, ppRTime, pp_bool, counterSt, imin, min2 = 0, completeDB, aryDB);
2053 //fout << endl;
2054 statVector[5] = completeDB; //??? esto corrige la cuenta
2055 //fstat << "\n\t:1615:"; for (int i = 0; i <= 5; i++) fstat << "\t" << setw(7) << statVector[i]; fstat <<
2056 /*
2057 for (int i = 0; i <= 3; i++) {
2058 //double frac(0);
2059 //modf(statVector[i], &frac);
2060 //if (frac) fstat << setw(7) << setprecision(3) << statVector[i] << " ";
2061 //else
2062 fstat << setw(4) << statVector[i] << " ";
2063 }fstat << " selected from timing" << endl;
2064 /*/
2065 /* dummy block
2066 if(completeDB <= 10){
2067 fout << "\n\t:1870: NEW METHOD Max Delta between records: " << setw(4) << min2 << "\tcompleteDB: " << comp
2068 //fout << "\n\t:1493:Tick times.wall---> " << setw(10) << setprecision(2) << times.wall / timeZoomFactor <
2069 //fout << "\n\t:1494:NEW BEFORE RE ARRENGE ppTime completeDB: " << completeDB; net->displayMKT(net, pp
2070 fout << "\n\t:1871: NEW BEFORE RE ARRENGE ppDataIn *B"; net->displayMKT(net, ppDataIn, ar
2071 }
2072 //*/
2077 if (completeDB >= minDB) { //Mar 7 //
2078 //fout << "\n\n\n\t:2084: completeDB " << setw(3) << completeDB << " >= " << minDB << " <-:mindb: nbsp="" p="">
-:mindb:>
2079 ///*if (completeDB < 10) {
2080 //fout << "\n\t:1577: ********** stocks in db chrono selected ****************************";
2081 //fout << "\n\t:1578: completeDB:-> " << completeDB << " > " << minDBsearchRHO << " <-:mindbsearchrho p="" ttim="">
-:mindbsearchrho>
2082 //fout << "\n\t:1579: NEW METHOD Max Delta between records: " << setw(4) << min2 << "\tcompleteDB: " << co
2083 //fout << "\n\t:1580B: Tick times.wall---> " << setw(10) << setprecision(2) << times.wall / timeZoomFactor
2084 //fout << "\n\t:1581: NEW BEFORE RE ARRENGE ppTime completeDB: " << completeDB; net->displayMKT(net, ppT
2085 //fout << "\n\t:1936: NEW BEFORE RE ARRENGE *B ppDataIn"; net->displayMKT(net, ppDataIn, aryDB, nullptr, 0
2086
2087 if (0 && xsn && !(geNSTOCKS % 100)) {
2088 static unsigned short counterthisBlock(4);
2089 {
2090 fout << "\n\t:2097: Number of datum read: " << grandTotal - geNSTOCKS << "\t" << thread_clock::now() <
2091 fout.flush() << "\n\t:2098: -AT THIS INSTANT- Stocks selected that can be used to establish correlation";
2092 --counterthisBlock;
2093 }
2094 }
2095 ////*/}
2096
2098 //fout << "\n\tppTime Elapsed Time Tick by Tick AFTER times.wall---> " << setw(10) << setprecision(6) << t
2099 //fout << "\n\tppData in TO PORTFOLIO"; net->displayMKT(net, ppDataIn, aryDB, nullptr, 0,
2100 //nrolls = 0; for (unsigned short ip = 0; ip < nintervals; ++ip) p[ip] = 0;
2101
2102 //fout << "\n\n\t__It seems there is always a different MATRIX, no need to check if it is a new one_____";
2103 //fout << "\n\tCOMPLETE DB ONLY AROUND THE HIGH -activity- minDB: " << minDB << " min expected correlatio
2104 //fout << "\n\tppTime Elapsed Time Tick by Tick AFTER times.wall---> " << setw(10) << setprecision(6) << t
2105 //fout << "\n\tppData PORTFOLIO DB to be considered"; net->displayMKT(net, ppDataI
2106 //si es necesario antes de repetir todo este bloque hay que verificar si la matriz
2107 // ha cambiado.. .hay que hacer una resta respecto de un backup
2108 //quizas no hace falta restar toda la pp sino en el calculo de los tiempos ver si hay
2109 //cambio
2110 //check if DB is a different one, a lo mejor si es importante verificar esto seria necesario solo una
2111 // resta de matrices
2112 //fout << "\n\tnew DB used for cubic interpolation aryDB has the selected stocks after chromo";
2113 //fout << "\n\t:2124C:***BEFORE RE ARRENGE ppDataIn"; net->displayMKT(net, ppDataIn, aryDB, nullptr, 0, 5,
2114 //fout << "\n\t:1590:***BEFORE RE ARRENGE ppTime"; net->displayMKT(net, ppTime, aryDB, nullptr, 0
2115 /*//dummy to visulalize what is on db
2116 if(db_root){
2117 fout << "\n\t:11594: DB Tree Data:\n" ;
2118 net->InOrderData(net, crptr, db_root, ppRTime);
2119 }
2120 //*/
2121 //fout << "\n\t:1963: ROW-COL Re-Order ";
2122 net->reArrangeRowData(net, crptr, db_root, ppDataIn, ppDB, cols, pp_key_index); //only data is re-arrenge
2123 net->all_boundaries(net, ppDB, 'f', aryDB, firstRow, lastRow, nullptr, firstCol, lastCol);
2124 net->set_work_sheet(net, ppDB, net->get_rows_in_page(ppDB, 'f'), net->get_cols_in_page(ppDB, 'f'));
2125
2126 //fout << "\n\n\t:2132: Re-Arranged INPUT before smoothing - *C ppDB"; net->displayMKT(net, ppDB
2127 //fout << "\n\t:1680: Time Stamp Cluster - *C ppTime"; net->displayMKT(net, ppTime, aryDB, nullptr, 0, 5,
2128 //fout << "\n\t:1681: Dummy traversal ppDB"; net->traverse_nt_record(net, crptr, db_root, ppDB, cols, 1, a
2129
2130 //////VRA Measuring Volatility with the Relative Average Daily Range
2131 if(0) { //ppDB the re arranged ordered input DB
2132 for (i = firstRow; i <= lastRow; i++) { //
2133 if (!aryDB[i])continue;
2134 stockPtr = net->go_to_row(net, i);
2242 i = lastRow;
2243 }
2244 //} while (ptr); // the whole record set to 0 ===???
2245 //fout << "\tgoto readNewDatum"; //goto readNewDatum; NOO!!!!!
2246 }
2247 ptr = net->point_to(net, ppDB, i, net->get_cols_in_page(ppDB, 'f'), 'f'); //last in record to force
2248 }
2249 ptr = ptr->get_next_ptr();
2250 } while (ptr->get_col() <= net->get_cols_in_page(ppDB, 'f'));
2251 }
2252 //else fout << "\n\t row: " << i << " sum val is negative";
2253 }
2254 }
2255 //fout << "\n\t:2244: Re-Arranged INPUT -Final Volatility DB- before smoothing - *C ppDB"; net->displayM
2256 //////VRA Measuring Volatility with the Relative Average Daily Range VRA END
2257
3122 }
3123 */
3124 ///dummy block to visualize sol*/
3125
3126 //if(1){ // para forzar la entrada
3127 //HEDGING BAND
3128 //fstat << setw(10) << abs(abs(negSum) / posSum - 1.) ;
3129 //if (is_val_in_range_t(1. - ((posSum + abs(negSum)) / abSum)) &&
3130 if(0 && xsn){
3131 fout << "\n\t:2957: before hedge checking count: " << count << endl;
3132 fout << "\n\t:2958: countAssetMinus: " << countAsset << " <- counta="" countassetminus="" nbsp="" p="">
->
3133 }
3134 evenOdd = 0;
3135 if (!(countAsset % 2) && countAssetPlus == countAsset / 2 && countAssetMinus == countAsset / 2) {
3136 evenOdd = 1; // fout << "\n\tOK PORTFOLIO - even number ";
3137 }
3138 else {// odd number
3139 if (countAssetMinus < countAssetPlus) {
3140 if (countAssetMinus + 1 == countAssetPlus) {
3141 evenOdd = 1; // fout << "\n\tOK PORTFOLIO - odd ";
3142 }
3143 }
3144 else {
3145 if (countAssetPlus + 1 == countAssetMinus) {
3146 evenOdd = 1; //fout << "\n\tOK PORTFOLIO - odd ";
3147 }
3148 }
3149 }
3150 evenOdd = 0; // the number of short - direct less than 2
3151 if (countAssetPlus >= countAssetMinus && countAssetPlus - countAssetMinus <= 2) evenOdd = 1;
3152 else
3153 if (countAssetPlus < countAssetMinus && countAssetMinus - countAssetPlus <= 2) evenOdd = 1;
3154
3155 //if (evenOdd) fout << "\n\t:2526: PORTFOLIO difference is <= 2"; else fout << "\n\t:2503: NO!!!! PO
3156 ///*
3157 bool dummyPortfolio(1); //set to zero to avoid this if block 1 normal execution
3158 if (dummyPortfolio &&
3159 //evenOdd &&
3160 //abs(abs(negSum) / posSum - 1.) < hedgeBand && //el concepto de hedge Band ha cambiado
3161 //negSum && // no hace falta
3162 //is_val_in_range_t(temp) && // bloqueo esta instruccion para que se ejecute el portfolio
3163 //abs(posSum / abSum) - 0.5 <= hedgeBand &&
3164 count >= minDB) {//cambiar por un minimo en portfolio
3165 //*/
3166 /*/
3167 if (negSum && is_val_in_range_t(temp) &&
3168 count >= minDB) {//cambiar por un minimo
3169 *
3170 fout << "\n\n\t:2310: START PORTFOLIO Stock count: " << count << endl;
3171 //fout << "\n\t:2206:YES HEDGING!!!! hedgeBand: " << hedgeBand;
3172 //fout << "\n\t:2207: °Original Adding Up Weights: " << setprecision(8) << setw(12) << sum << "\n\t
3173 //fout << "\n\tSolution has been verified\t\ttemp val is around -0.1e-7 <= t <= 0.1e-7 : " << setpre
3174
3175 /* dummy block to visualize Wi SOL
3176 aryCols[net->get_net_cols()] = 1; // solo deja seteado la col independiente
3177 fout << "\n\t:2212: -*-Sys Eq Solution"; net->show_page(net, ppCorr, 'f', 0, 3, 10, 4, aryDBin, ary
3178 aryCols[net->get_net_cols()] = 0;
3179 ///*/
3180 //fout << "\n\t:L2361:posSum: " << posSum << "\tfabs(negSum): " << fabs(negSum) << "\tAsset Portafol
3181 //fout.flush() << "\n\t:L2363: Got to normalize Wi en db tree if no change posSum: " << posSum <<
3182 //*
3183 //if (counterIN < 10) {
3184 //fout << "\n\t:2320: At Portfolio Tick times.wall---> " << setw(10) << setprecision(2) << times.wa
3185 //fout << "\n\t:1780: Reference Time clock times.wall---> " << setw(10) << setprecision(6) << times
3186 //fout << "\n\t:2320: At Portfolio ppRTime Chrono---> ppRTime"; net->displayMKT(net, ppRTime, aryD
3187 //fout << "\n\t:2320: At Portfolio ppDataIn"; net->displayMKT(net, ppDataIn, aryDBin, nullptr, 0, 5
3188 //fout << "\n\t:2320: At Portfolio RE ARRENGE ppTime completeDB: " << completeDB; net->displayMKT
3189 //}
3190 //*/
3191 //fout.flush() << "\n\t:3021: BEFORE do";
3192 fout << "\n\n\n\t:3192: PORTFOLIO Selected Stocks ppDB"; net->displayMKT(net, ppDB, aryDB, nullptr,
3193 do {//ib: 2120:
3194 temp = 0;
3195 abSum = sum = posSum = negSum = 0;
3196 hdplus = hdminus = hdsum = 0;
3197 change = false;
3198 //fout << "\n\t:2551: ppCorr Wi last col: " << lastCol << "\t" << net->get_cols_in_page(ppCorr, 'f
3199 ptr = net->point_to(net, ppCorr, firstRow, lastCol, 'f'); //fout << "\tptr OK ";
3200 auxPtr = net->point_to(net, ppDB, firstRow, net->get_cols_in_page(ppDB, 'f'), 'f');//BID PRICE
3201 //temp = 0;
3202 counter = 0;
3203 //fout << "\n\t:3203: Available Funds:" << setprecision(2) << setw(15) << myInvestment; fout.flush(
3204 do { //ib :2131:
3205 //fout.flush() << "\n\t" << setw(5) << net->goto_row(net, ppDataIn, auxPtr->get_row(), 'f')->get_s
3206 //fout.flush() << "\n\tbid price row(" << auxPtr->get_row() << "<" << net->goto_row(net, ppDataIn
3207 ptr->set_data(ppCorr, ptr->get_data(ppCorr) / prevabSum);
3208 //fout << "\n\t:2553: new w_" << ptr->get_row() << " = " << setprecision(4) <get_data(ppCorr
3209 //if(ptr->get_data(ppCorr) < 0) ptr->set_data(ppCorr, ptr->get_data(ppCorr) / fabs(prevnegSum));
3210 //else ptr->set_data(ppCorr, ptr->get_data(ppCorr) / prevposSum);
3211 abSum += fabs(ptr->get_data(ppCorr));
3212 //sum += ptr->get_data(ppCorr);
3213 if (ptr->get_data(ppCorr) > 0) posSum += ptr->get_data(ppCorr);
3214 else negSum += ptr->get_data(ppCorr);
3215
3216 rowPtr = net->goto_row(net, ppCorr, ptr->get_row(), 'f');
3217 if (rowPtr->get_backward_ptr()->get_data(ppCorr) * ptr->get_data(ppCorr) < 0) {
3218 //fout << "\t:2508: new normalized w_" << ptr->get_row() << " = " << ptr->get_data(ppCorr) << " c
3219 ptr->set_data(ppCorr, -1. * ptr->get_data(ppCorr));
3220 }
3221 if (rowPtr->get_backward_ptr()->get_data(ppCorr) == 1.) hdplus += fabs(ptr->get_data(ppCorr));
3222 else hdminus += fabs(ptr->get_data(ppCorr));
3223 counter++;
3224 if (onlyInteger && !short((myInvestment * ptr->get_data(ppCorr) / auxPtr->get_data(ppDB)))) { //
3225 //fout << "\n\t\tshort((myInvest* ptr->get_data(ppCorr) / auxPtr->get_data(ppDB)): " << myInvestm
3226 //fout << "\tw_i / $stock- ptr->get_data(ppCorr)- : " << " / " << auxPtr->get_data(ppDB) << "= "
3227 //fout << "\n\t°*°No need to check the rest of Assets Big Correlated counter before\n\tNumber o
3228 //
3229 //fout.flush() << "\n\t:2580: This for only integer BEFORE masterRecursive
3230 if (countElementInAry(aryDBin, true, 1, lastCol) > minDB) {
3231 net->masterRecursive(net, crptr, rootRowHolDB, db_root, ptr, ppCorrBU, scorr, aryDBin, count)
3232 //fout << "\n\t:2583: Back From masterRecursive counter: " << counter;
3233 }
3234 else counter = minDB - 1; // force to enter the if
3235 if (counter < minDB || !db_root) {
3236 ////*
3237 //if (!db_root ) {fout << "\n\t\t2 head of db nullptr counter: " << counter; }
3238 //if (!counter) fout << "\n\t\t2 ZERO counter: " << counter;
3239 //fout << "\n\t\tgoto keepOnProgram;";
3240 goto keepOnProgram;
3241 //net->kill_exsan(net); return;
3242 }
3243 else {
3244 //counterIN = counter;
3245 //minDB in portfolio
3246 net->all_boundaries(net, ppCorrBU, 'f', aryDBin);
3247 net->set_work_sheet(net, ppCorrBU, lastRow, lastCol);
3248
3249 ///new
3250 net->set_work_sheet(net, ppTilda, lastRow, lastRow);
3251 net->set_work_sheet(net, ppCorr, lastRow, lastRow);
3252 displayMKT(net, ppTilda, aryDBin, aryDBin, 0, 3, 1
3253 net->matrixSumValue(net, ppCorr, ppTilda, 0, aryDBin, aryDBin);
3254 //fout << "\n\t\t:2261: restored ppCorr"; net->di,
3255 //fout << "\n\t\t°*2*° goto selectedRhos";
3256 goto selectedRhos;
3257 }
3258 }
3259 if (ptr->get_row() <= lastRow) {
3260 do {
3261 ptr = ptr->get_s_ptr();
3262 auxPtr = auxPtr->get_s_ptr();
3263 } while (!aryDBin[ptr->get_row()] && ptr->get_row() <= lastRow);
3264 }
3265 } while (ptr->get_row() <= lastRow);
3266 fout.flush() << "\n\t:3266: NORMALIZED-SCALED Adding Up Weights: " << setprecision(8) << setw(12) <
3267 //fout << "\n\tDummy Call STOCKS IN PORTFOLIO " << countElementInAry(aryDBin, true, firstRow, lastR
3268 //if (posSum - negSum == 1.) fout << "\t°*°OK "; else fout.flush() << "\t***ERROR sum W_i: " << s
3269 if (change) {
3270 //prevabSum += fabs(temp);
3271 prevabSum = 1. - fabs(temp);
3272 //fout << "\n\t°°there is change prevabSum = " << prevabSum;
3273 }
3274 } while (change); //ib :2202:
3275 fout << "\n\t:3275: end normalizar el output °°° Adding Up Weights sum: " << setprecision(8) << s
3276 //fout << "\n\t:2891: Final Updated Wi ppCorr "; net->show_page(net, ppCorr, 'f', 0, 8, 12, 8, aryD
3277 hdsum = hdplus + hdminus;
3278 /* dummy block
3279 fout.flush() << "\n\t:3106: Final + hdplus: " << hdplus << " -hdminus: " << hdminus << " hdsum: "
3280 if (is_val_in_range_t(hdplus / hdsum, lowHB, upHB)) { // criteria for hedging
3281 fout.flush() << "\n\t:310: YES HEDGING, In range " << lowHB << " < " << hdplus / hdsum << " < " <<
3282 }
3283 else fout.flush() << "\n\t:3110: NO HEDGING, NOT in range " << lowHB << " < " << hdplus / hdsum <<
3284 //*/
3285 //le hdplus(0), hdminus(0), hdsum(0); //
3286 //fout << "\n\t:2639: Stock Counter?: " << counter;// << "\tabs(posSum " << posSum << " / " << abSu
3287 ///*
3293 if (is_val_in_range_t(hdplus / hdsum, lowHB, upHB)) { // to make it wider
3294 fout << "\n\t:3300: -----------------------------------------------";
3295 fout << "\n\t:3301: HEDGING (hdplus/hdsum) Ok! In range " << lowHB << " < " << hdplus / hdsum << "
3296 ptr = net->point_to(net, ppCorr, firstRow, lastCol, 'f');
3297 do { //
3298 //++counter;
3299 stockPtr = net->goto_row(net, ppCorr, ptr->get_row(), 'f');
3300 //fout << stockPtr->get_ptrLasTick()->get_data(ppDataIn) << endl; //no es correcto
3301 //stockPtr->set_stock_name(to_string(ptr->get_row()));
3302 //stockPtr->set_stock_name(numToString(ptr->get_row()));
3303 //precio ??? esta captando 10 antes
3304 //ptr->get_previous_ptr()->set_data(ppCorr, stockPtr->get_ptrLasTick()->get_data(ppDataIn)); //???
3305 //estas lineas corrigen lo anterior
3306 auxPtr = net->point_to(net, ppDB, ptr->get_row(), net->get_cols_in_page(ppDB, 'f'), 'f');
3307 ptr->get_previous_ptr()->set_data(ppCorr, auxPtr->get_data(ppDB)); // recupera el ultimo precio y
3308 // el ultimo tick en la primera columna
3309 //fout << "\n\t:2409: " << setw(6)<< stockPtr->get_stock_name() << "\tData stored: " << ptr->get_p
3310 //**** ? from //esta bien para acelerar data sobre la que trabaja portfolio
3311 //stockPtr->get_forward_ptr()->set_data(ppU, stockPtr->get_ptrLasTick()->get_data(ppDataIn));
3312 // cambio Sept 12
3313 stockPtr->get_forward_ptr()->set_data(ppU, auxPtr->get_data(ppDB));
3314 //stockPtr->get_forward_ptr()->set_data(ppDataIn, auxPtr->get_data(ppDB)); /// el mismo dato con
3315 // pero pierde tiempo marcando un dato extra que ya salio antes
3316 //stockPtr->get_forward_ptr()->set_data(ppDataIn, stockPtr->get_ptrLasTick()->get_data(ppDataIn));
3317 //stockPtr->get_forward_ptr()->set_data(ppDataIn, 0); /// ?????
3318
3319 //fout << "\n\tValue stored in ppU & ppDatain -used to compare prev val-" << setw(7) << stockPtr->
3320 //**** ? to
3321 // n shares in table
3322 //onlyInteger = 0; //COMENT HERE TO SET AT THE BEGINING
3323 /*
3324 if (onlyInteger) ptr->get_previous_ptr()->get_previous_ptr()->set_data(ppCorr, int(fabs(ptr->get_d
3325 else ptr->get_previous_ptr()->get_previous_ptr()->set_data(ppCorr, 0.9999 * fabs(ptr->get_data(pp
3326 /// hago una minima correccion para que al sumar no pase del total disponible????
3327 //if(ptr->get_previous_ptr()->get_previous_ptr()->get_data(ppCorr)) fout << "\n\t:2418: n shares i
3328 stockPtr->get_forward_ptr()->get_next_ptr()->get_next_ptr()->get_next_ptr()->set_data(ppDataIn, pt
3329
3330 stockPtr->get_forward_ptr()->set_data(ppTilda, ptr->get_previous_ptr()->get_previous_ptr()->get_da
3331 //last tick price// read real data bid
3332 stockPtr->get_forward_ptr()->set_data(ppDataIn, ptr->get_previous_ptr()->get_data(ppCorr) * copysi
3333 //copysignf(1.0, ptr->get_data(ppCorr))
3334 //fout << "\t\tFraccion " << ptr->get_previous_ptr()->get_previous_ptr()->get_data(ppCorr);
3335 //fout << "\t\t Creo debería ser w*I/$stock " << int( ptr->get_data(ppCorr)*myInvestment / ptr->g
3336 if (ptr->get_previous_ptr()->get_previous_ptr()->get_data(ppCorr))
3337 ptr->get_previous_ptr()->get_previous_ptr()->get_previous_ptr()->set_data(ppCorr, ptr->get_previo
3338
3339 if (ptr->get_previous_ptr()->get_previous_ptr()->get_data(ppCorr) && ptr->get_previous_ptr()->get_
3340 myInvestment -= ptr->get_previous_ptr()->get_previous_ptr()->get_previous_ptr()->get_data(ppCorr)
3341 fout.flush() << "\n\t:2686: // this stock is not eliminated here this stock out inv$: " << setpre
3342 //aryDBin[ptr->get_row()] = aryDB[ptr->get_row()] = 0; // no eliminar aqui este valor
3343 fout.flush() << "\n\t:2688: Stock Counter: " << count;
3344 count--;
3345 //fout.flush() << "\t:2461: Updated Because investment to low Stock Counter: " << count;
3346 if (count < minDB) {//
3347 fout.flush() << "\n\t:2692: Total Stock Counter " << count << " is less than " << minDB << " :m
3348 firstRow = lastRow; // para que no entre en el for siguiente
3349 ptr = net->point_to(net, ppCorr, lastRow - 1, lastCol, 'f');
3350 }
3351
3352 }
3353 */
3354 //if (ptr->get_data(ppCorr) > 0) posSum += ptr->get_data(ppCorr);
3355 //else negSum += ptr->get_data(ppCorr);
3356 //print(ptr->get_data(ppCorr), " ", sum);
3358 do {
3359 ptr = ptr->get_s_ptr();
3360 } while (aryDB[ptr->get_row()] == 0 && ptr->get_row() <= lastRow);
3361 } while (ptr->get_row() <= lastRow);
3362 fout.flush() << "\n\t:3362: Adding Up Weights: " << setprecision(8) << setw(12) << sum << " +Sum:"
3363 //fout << "\n\tppDB Re-Arrenged Input DB to determine Correlation - high Freq Simmmilar ppDB |ok|";
3364 //fout << "\n\tYES Selection Portfolio counter: " << counterIN << "/" << minPortfolio << endl;
3365 //net->TreeInOrderPlot(net, crptr, db_root, ppDB, nTicksLineal, aryDBin);
3366 //fout << "\n\t:2467: Run: " << run;
3367 //if (!run) geNSTOCKS = 0;
3368 //run--;
3369 // almacena lo que esta en portfolio para emergency recovery
3370 /// stockPtr->set_stock_name(stock);
3371 //rr_ptr->RB_Insert_row(rr_ptr, rootStocks, stockPtr, 's', 0);
3372 //quizas esto se puede hacer en el paso anterior
3373 //fout << "\n\t:2725: Store PORTFOLIO items TREE AND IN EMERGENCY FILE exsan\\out_" << id_job << ".
3374 //July PREPARES FOR A NEW TREE
3375 fts.open("c:\\\....\\\\out_" + id_job + ".txt", ios::out);
3376 fts << "\n\tEMERGENCY FILE IN CASE OF CRASH *** c:......\\\\out_" + id_job + ".txt nTick se
3377 // de discard atravesar
3378 goodReturn = 0;
3379 //counter = 0; no usar el valor anterior
3380 //net->DiscarDB(net, crptr, rootRowHolDB, db_root, 'f');
3381 //hay que rehacer esta instruccion a traves de net
3382 rr_ptr->DiscardStockTree(rr_ptr, rootStocks);
3383 //fout << "\n\t:2727: se pierde algunas filas? PREPARE NEW SCENARIO rows [" << firstRow << " - " <<
3384 /// ------next instructions ok!!!
3385 stockPtr = net->goto_row(net, ppDataIn, firstRow, 'f');
3386 rootStocks = stockPtr->get_db_root_ptr();
3387 fts << run + 1 << "\n";
3388 fout << "\n\t:3216: run: " << run << " counter: " << counter;
3389 abSum = 0;
3390 initialInvestment = 0;
3391 j = counter; //save previous val
3392 counter = 0;
3393 for (i = firstRow; i <= lastRow; i++) {
3394 if (aryDBin[i]) {
3395 counter++; // tiene que descontar todo lo que había antes
3396 fts << stockPtr->get_stock_name() << " " << stockPtr->get_forward_ptr()->get_data(ppDataIn) << "\
3397 //fout << "\n\t:2744: Into DB: " << stockPtr->get_stock_name() << " ";
3398 stockPtr->set_nTick(1);
3399 stockPtr->set_nTickCopy(1); // Sept 12
3400 stockPtr->set_hiTime(0); ///ok cero= para contar los ticks en contra
3401 rr_ptr->RB_Insert_row(rr_ptr, rootStocks, stockPtr, 's', 0);
3402 //net->RB_Insert_data(net, rootRowHolDB, db_root, stockPtr, 'f', ppDataIn); //NO!!! version corr
3403 ptr = stockPtr->get_forward_ptr()->get_next_ptr(); //ubico ptr
3404 for (unsigned short in = 0; in <= 7; in++) { //7 es correcto prepara el escenario
3405 ptr->set_data(ppDataIn, 0);
3406 ptr = ptr->get_next_ptr();
3407 }
3408 ptr = net->point_to(net, ppCorr, i, lastCol, 'f');
3409 //fout << "\n\t:2756: wi lastCol " << ptr->get_data(ppCorr) << " final-normalized " << ptr->get
3410 ptr->set_data(ppCorr, ptr->get_data(ppCorr) / hdsum);
3411 //fout << "\n\t:2775: normalized w_i becomes: " << ptr->get_data(ppCorr); // hasta aqui el nue
3412 if (fabs(ptr->get_data(ppCorr)) > limitWeightFactor) {//fout << "\t:2784: OUT, w_i is bigger than
3413 aryDBin[ptr->get_row()] = aryDB[ptr->get_row()] = 0; // no eliminar aqui este valor
4612 }
4613 //*/
4614 if (0 && xsn && !((grandTotal - geNSTOCKS ) % 333)) {
4615 static unsigned short counterthisBlock(4);
4616 {
4617 if(counterthisBlock){
4618 fout << "\n\t:4416: Number of datum read: " << grandTotal - geNSTOCKS << "\t" << thread_clock::now();
4619 fout << "\n\t:4417: No Portfolio. Back to read a new DATUM";
4620 /*
4621 fout << "\n\t:4422: Number of datum read:" << grandTotal - geNSTOCKS << "\t" << thread_clock::now();
4622 fout.flush() << "\n\t:2766: Sys Eq *SOLUTUION IN LAST FULL COLUMN* RANGE Rows[ " << firstRow << " - " << l
4623 fout.flush() << "\n\t:2767: ppCorr"; net->show_page(net, ppCorr, 'f', 0, 3, 8, 7, aryDBin, aryCols);
4624 //fout.flush() << "\n\t
4625 */
4626 --counterthisBlock;
4627 }
4628 }
4629 }
4630
4631 keepOnProgram:
4632 check = !check;
4633 //fout.flush() << "\n\t:3837: Here |keepOnProgram| check has been reseted, ends RUN: " << geNSTOCKS << "\ti
4634 } // cierra if (check)
4635 //else fout << "\n\t:1504: no check ";
4636 }//cierra while (!portfolio && --geNSTOCKS)
4658 rr_ptr->DiscardStockTree(rr_ptr, rootStocks);
4659 net->kill_exsan(net);
4660 fout << XSNto;
4661 //fout << "\n\tstockCounterDB: " << stockCounterDB;
4662 for (i = 0; i < stockCounterDB; i++) {//CLOSE all files
4663 //fout << "\n\t CLOSE FILE ID" << " " << fileID[i] << endl;
4664 fDB[i].close();
4665 }
4666 f1db.close();
4667 fstat.close();
4668 fstatR.close();
4669 fprmtr.close();
4670 fsos.close();
4671 if (xsn) { fxsn.close(); }
4672
4673
4674 //fbs << endl; //
4675 fbs.close();
4676 if(!xsn) Beep(500, 77); fout << "\n\t:4484: Beep ExSan has been killed "; /// f,t
4677 //backUP balance sheet en dos directorios en c y google drive
4678 fbs.close();
4679
4680
4681
4682 /*
4686 */
4687
4688
4689 /* this is blocked termporarily for a review May 27
4697
4698 copy_bs += topic + "_" + id_job + ".txt";
4699 copy_bs_to_GC += topic + "_" + id_job + ".txt";
4700 //copy_bs += "_";
4701 //copy_bs += id_job;
4702 //copy_bs += ".txt";
4703 char output_copy[100];
4704 unsigned short i1(0), length = copy_bs.length();
4705
4706 do {
4707 output_copy[i1] = copy_bs[i1];
4708 } while (++i1 <= length);
4709 if(!xsn) print("1 action ---> ", output_copy);
4710 system(output_copy);
4711
4712 i1 = 0, length = copy_bs_to_GC.length();
4713 char output_copy_gd[100];
4714 do {
4715 output_copy_gd[i1] = copy_bs_to_GC[i1];
4716 } while (++i1 <= length);
4717 if (!xsn) print("2 action ---> ", output_copy_gd);
4718 system(output_copy_gd);
4719
4720 //string cdDos = "cd c:\\";
4721 string cdDos = "cd..";
4722 char output_cdDos[100];
4723 i1 = 0, length = cdDos.length();
4724 do {
4725 output_cdDos[i1] = cdDos[i1];
4726 } while (++i1 <= length);
4727 //print("3 action ---> ", output_cdDos);
4728 system(output_copy);
4729
4730 */
4756 fout.flush();// << "\n\tJUST BEFORE RETURN, LEAVING Portfolio Simulator, back to main()";
4761 return;
4762 }
4763 /***********END hft*****************/
4764 //for (k = 0; k < 100; k++) if(bigRHO[k]) fout << "\n\t" << k << " " << bigRHO[k];
4765 //if(setRHO && db_root && counterIN > 1 && counterIN < 7) { // only display here
4766 //countElementInAry(aryDBin, true, firstRow, lastRow) - 1;
4767
4768 /****************************/
4769 void end_hft(NETPTR net, ROWRECORDPTR rr_ptr, ROWPTR rootStocks) { //, rr_ptr, rootStocks
4770 rr_ptr->DiscardStockTree(rr_ptr, rootStocks);
4771 fout.flush() << "\n\n\t:46:\t\tERROR";
4780 f1db.close();
4781 fstat.close();
4782 fstatR.close();
4783 fbs.close();
4800 i1 = 0, length = copy_bs_to_GC.length();
4801 char output_copy_gd[100];
4802 do {
4803 output_copy_gd[i1] = copy_bs_to_GC[i1];
4804 } while (++i1 <= length);
4805 print("2 action ---> ", output_copy_gd);
4806 system(output_copy_gd);
4807
4809 string cdDos = "cd..";
4810 char output_cdDos[100];
4811 i1 = 0, length = cdDos.length();
4812 do {
4813 output_cdDos[i1] = cdDos[i1];
4814 } while (++i1 <= length);
4815 //print("3 action ---> ", output_cdDos);
4816 system(output_copy);
4817 */
4818 return;
4819 }
4820 /***********END end_hft*****************/
This module (5K lines of source C++ code) is based on ExSan a multipurpose master library, It is a console-oriented worksheet tool written in C++11 that is comparable in functionality to Excel or Matlab. Some Outputs in the next entries of this blog. I am looking for a job as a C/C++ developer / programmer
ExSan is already plugged into Interactive Brokers C++ API to perform live market data analysis.
Polulating ExSan with Market Data Tick by Tick
Low Latency Systematic Trading Algorithm
Previous Post
Next Post
+
+
C
E
x
S
a
n
C
+
+
D
o
N
o
t
A
c
c
e
p
t
D
e
f
a
u
l
t
s
T
h
i
n
k
D
i
f
f
e
r
e
n
t
Comments
Post a Comment