void BARS::calculateMA (Indicator *output) { if (maPeriod > 1) { PlotLine *in = data->getInput(maInput); if (in) { PlotLine *ma = getMA(in, maType, maPeriod); ma->setColor(maColor); ma->setType(maLineType); ma->setLabel(maLabel); output->addLine(ma); delete in; } } if (maPeriod2 > 1) { PlotLine *in = data->getInput(maInput2); if (in) { PlotLine *ma = getMA(in, maType2, maPeriod2); ma->setColor(maColor2); ma->setType(maLineType2); ma->setLabel(maLabel2); output->addLine(ma); delete in; } } if (maPeriod3 > 1) { PlotLine *in = data->getInput(maInput3); if (in) { PlotLine *ma = getMA(in, maType3, maPeriod3); ma->setColor(maColor3); ma->setType(maLineType3); ma->setLabel(maLabel3); output->addLine(ma); delete in; } } if (maPeriod4 > 1) { PlotLine *in = data->getInput(maInput4); if (in) { PlotLine *ma = getMA(in, maType4, maPeriod4); ma->setColor(maColor4); ma->setType(maLineType4); ma->setLabel(maLabel4); output->addLine(ma); delete in; } } }
/* Modified/Relative Japanese Candlesticks */ PlotLine * BARS::calculateCandle () { PlotLine *line = new PlotLine; for (int loop = 0; loop < (int) data->count(); loop++) { double O = data->getOpen(loop); double C = data->getClose(loop); QColor color = barNeutralColor; if (loop > 0) { if (C > data->getClose(loop - 1)) color = barUpColor; if (C < data->getClose(loop - 1)) color = barDownColor; } bool fillFlag = C < O ? TRUE : FALSE; line->append(color, O, data->getHigh(loop), data->getLow(loop), C, fillFlag); QDateTime dt; data->getDate(loop, dt); line->append(dt); } line->setType(PlotLine::Candle); line->setLabel(label); return line; }
/* Heiken Ashi Candlesticks */ PlotLine * BARS::calculateHACandle () { PlotLine *line = new PlotLine; double pO, pC, xO; for (int loop = 0; loop < (int) data->count(); loop++) { double O = data->getOpen(loop); double H = data->getHigh(loop); double L = data->getLow(loop); double C = data->getClose(loop); // xClose = (Open + High + Low + Close) / 4 double xC = (O + H + L + C) / 4; QColor color = candleColor; if (loop < 1) // xO[Prev] and xC[Prev] are not available xO = (O + C) / 2; else { // xOpen = (xO[Prev] + xC[Prev]) / 2 xO = (pO + pC) / 2; if (xC > xO) color = barUpColor; if (xC < xO) color = barDownColor; } pO = xO; pC = xC; // xHigh = Max(High, xOpen, xClose) double xH = xO > H ? xO : H; xH = xC > xH ? xC : xH; // xLow = Min(Low, xOpen, xClose) double xL = xO < L ? xO : L; xL = xC < xL ? xC : xL; bool fillFlag = C < O ? TRUE : FALSE; line->append(color, xO, xH, xL, xC, fillFlag); QDateTime dt; data->getDate(loop, dt); line->append(dt); } line->setType(PlotLine::Candle); line->setLabel(label); return line; }
void CUS::createPlot (QString &d, QDict<PlotLine> &lines, Indicator *output) { if (! d.contains("plot")) return; QStringList l = QStringList::split("(", d, FALSE); if (l.count() != 2) { qDebug("CUS::createPlot: bad plot format: %s", d.ascii()); return; } QString parms = l[1]; parms.truncate(parms.find(")", -1, TRUE)); l = QStringList::split(",", parms, FALSE); if (l.count() != 4) { qDebug("CUS::createPlot: missing plot parms: %s",d.ascii()); return; } // 1.var name l[0] = l[0].stripWhiteSpace(); PlotLine *pl = lines.find(l[0]); if (! pl) { qDebug("CUS::createPlot: bad plot parm 1: %s",d.ascii()); return; } // 2.color l[1] = l[1].stripWhiteSpace(); pl->setColor(l[1]); // 3.label l[2] = l[2].stripWhiteSpace(); pl->setLabel(l[2]); // 4.linetype l[3] = l[3].stripWhiteSpace(); pl->setType(l[3]); PlotLine *tline = new PlotLine; tline->copy(pl); output->addLine(tline); }
Indicator * LOWPASS::calculate () { Indicator *output = new Indicator; output->setDateFlag(dateFlag); output->setLogScale(logScale); PlotLine *in = data->getInput(input); if (! in) { qDebug("LOWPASS::calculate: no input"); return output; } PlotLine *line = getLowpass(in, freq, width); line->setColor(color); line->setType(lineType); line->setLabel(label); output->addLine(line); delete in; return output; }
/* Pont and Figure */ PlotLine * BARS::calculatePF () { PlotLine *line = new PlotLine; // determine start either x or o if (data->count() < 2) return line; getPFSettings(); bool XOFlag = FALSE; if (data->getHigh(1) > data->getHigh(0)) XOFlag = TRUE; // prices rising, we start with x's double high = 0; double d = data->getHigh(0) / pfBoxSize; int t = (int) d; if (t * pfBoxSize <= data->getHigh(0)) high = (t + 1) * pfBoxSize; else high = t * pfBoxSize; double low = 0; t = (int) (data->getLow(0) / pfBoxSize); low = t * pfBoxSize; int loop; for (loop = 1; loop < (int) data->count(); loop++) { if (XOFlag) { if (data->getHigh(loop) > high) { // new high d = data->getHigh(loop) / pfBoxSize; t = (int) d; if (t * pfBoxSize <= data->getHigh(loop)) high = (t + 1) * pfBoxSize; else high = t * pfBoxSize; } double reversal = high - (pfBoxSize * pfReversal); if (data->getLow(loop) < reversal) { // reversal to O's line->append(pfXColor, pfBoxSize, high, low, low, XOFlag); high = high - pfBoxSize; // lower high 1 box t = (int) (data->getLow(loop) / pfBoxSize); low = t * pfBoxSize; XOFlag = FALSE; } } else { if (data->getLow(loop) < low) { // new low t = (int) (data->getLow(loop) / pfBoxSize); low = t * pfBoxSize; } double reversal = low + (pfBoxSize * pfReversal); if (data->getHigh(loop) > reversal) { // reversal to X's line->append(pfOColor, pfBoxSize, high, low, low, XOFlag); low = low + pfBoxSize; // raise low 1 box d = data->getHigh(loop) / pfBoxSize; t = (int) d; if (t * pfBoxSize <= data->getHigh(loop)) high = (t + 1) * pfBoxSize; else high = t * pfBoxSize; XOFlag = TRUE; } } } if (XOFlag) line->append(pfXColor, pfBoxSize, high, low, low, XOFlag); else line->append(pfOColor, pfBoxSize, high, low, low, XOFlag); line->setType(PlotLine::PF); line->setLabel(label); return line; }
Indicator * TALIB::calculate () { Indicator *output = new Indicator; output->setDateFlag(dateFlag); output->setLogScale(logScale); // open a TALIB handle const TA_FuncHandle *handle; QString ts = "method"; QString ts2; parms.getData(ts, ts2); TA_RetCode retCode = TA_GetFuncHandle(ts2, &handle); if (retCode != TA_SUCCESS) { qDebug("TALIB::calculate:can't open handle"); return output; } // get info on the function const TA_FuncInfo *theInfo; retCode = TA_GetFuncInfo(handle, &theInfo); if (retCode != TA_SUCCESS) { qDebug("TALIB::calculate:can't get function info"); return output; } // create parm holder TA_ParamHolder *parmHolder; retCode = TA_ParamHolderAlloc(handle, &parmHolder); if (retCode != TA_SUCCESS) { qDebug("TALIB::calculate:can't create parm holder"); return output; } // create and populate the input arrays int loop = data->count(); TA_Real open[loop]; TA_Real high[loop]; TA_Real low[loop]; TA_Real close[loop]; TA_Real volume[loop]; TA_Real oi[loop]; for (loop = 0; loop < data->count(); loop++) { open[loop] = (TA_Real) data->getOpen(loop); high[loop] = (TA_Real) data->getHigh(loop); low[loop] = (TA_Real) data->getLow(loop); close[loop] = (TA_Real) data->getClose(loop); volume[loop] = (TA_Real) data->getVolume(loop); oi[loop] = (TA_Real) data->getOI(loop); } // setup the input arrays const TA_InputParameterInfo *inputParms; for (loop = 0; loop < (int) theInfo->nbInput; loop++ ) { TA_GetInputParameterInfo(theInfo->handle, loop, &inputParms); QString s; int tint = 3; switch (inputParms->type) { case TA_Input_Price: retCode = TA_SetInputParamPricePtr(parmHolder, loop, &open[0], &high[0], &low[0], &close[0], &volume[0], &oi[0]); if (retCode != TA_SUCCESS) qDebug("TALIB::calculate:cannot set input prices"); break; case TA_Input_Real: s = QObject::tr("input") + QString::number(loop + 1); tint = parms.getInt(s); switch (tint) { case 0: retCode = TA_SetInputParamRealPtr(parmHolder, loop, &open[0]); if (retCode != TA_SUCCESS) qDebug("TALIB::calculate:cannot set real price"); break; case 1: retCode = TA_SetInputParamRealPtr(parmHolder, loop, &high[0]); if (retCode != TA_SUCCESS) qDebug("TALIB::calculate:cannot set real price"); break; case 2: retCode = TA_SetInputParamRealPtr(parmHolder, loop, &low[0]); if (retCode != TA_SUCCESS) qDebug("TALIB::calculate:cannot set real price"); break; case 3: retCode = TA_SetInputParamRealPtr(parmHolder, loop, &close[0]); if (retCode != TA_SUCCESS) qDebug("TALIB::calculate:cannot set real price"); break; case 4: retCode = TA_SetInputParamRealPtr(parmHolder, loop, &volume[0]); if (retCode != TA_SUCCESS) qDebug("TALIB::calculate:cannot set integer price"); break; case 5: retCode = TA_SetInputParamRealPtr(parmHolder, loop, &oi[0]); if (retCode != TA_SUCCESS) qDebug("TALIB::calculate:cannot set integer price"); break; default: break; } break; case TA_Input_Integer: break; default: break; } } // setup the optinput parms const TA_OptInputParameterInfo *optInfo; for (loop = 0; loop < (int) theInfo->nbOptInput; loop++ ) { TA_GetOptInputParameterInfo(theInfo->handle, loop, &optInfo); QString s = optInfo->displayName; switch (optInfo->type) { case TA_OptInput_RealRange: retCode = TA_SetOptInputParamReal(parmHolder, loop, (TA_Real) parms.getDouble(s)); if (retCode != TA_SUCCESS) qDebug("TALIB::calculate:cannot set inputopt real"); break; case TA_OptInput_IntegerRange: retCode = TA_SetOptInputParamInteger(parmHolder, loop, (TA_Integer) parms.getInt(s)); if (retCode != TA_SUCCESS) qDebug("TALIB::calculate:cannot set inputopt integer"); break; case TA_OptInput_IntegerList: retCode = TA_SetOptInputParamInteger(parmHolder, loop, (TA_Integer) parms.getInt(s)); if (retCode != TA_SUCCESS) qDebug("TALIB::calculate:cannot set inputopt integerlist"); break; default: break; } } // setup the output arrays TA_Real out1[data->count()]; TA_Real out2[data->count()]; TA_Real out3[data->count()]; TA_Integer out4[data->count()]; const TA_OutputParameterInfo *outInfo; for (loop = 0; loop < (int) theInfo->nbOutput; loop++) { retCode = TA_GetOutputParameterInfo(handle, loop, &outInfo); if (retCode != TA_SUCCESS) { qDebug("TALIB::calculate:cannot get output info"); continue; } switch (loop) { case 0: if (outInfo->type == TA_Output_Integer) { retCode = TA_SetOutputParamIntegerPtr(parmHolder, loop, &out4[0]); if (retCode != TA_SUCCESS) qDebug("TALIB::calculate:cannot set output4"); } else { retCode = TA_SetOutputParamRealPtr(parmHolder, loop, &out1[0]); if (retCode != TA_SUCCESS) qDebug("TALIB::calculate:cannot set output1"); } break; case 1: retCode = TA_SetOutputParamRealPtr(parmHolder, loop, &out2[0]); if (retCode != TA_SUCCESS) qDebug("TALIB::calculate:cannot set output2"); break; case 2: retCode = TA_SetOutputParamRealPtr(parmHolder, loop, &out3[0]); if (retCode != TA_SUCCESS) qDebug("TALIB::calculate:cannot set output3"); break; default: break; } } // call the function TA_Integer start = 0; TA_Integer end = data->count() - 1; TA_Integer outstart; TA_Integer count; retCode = TA_CallFunc(parmHolder, start, end, &outstart, &count); if (retCode != TA_SUCCESS) qDebug("TALIB::calculate:call function failed"); else { // create the plotlines const TA_OutputParameterInfo *outInfo; for (loop = 0; loop < (int) theInfo->nbOutput; loop++ ) { TA_GetOutputParameterInfo(theInfo->handle, loop, &outInfo); QString base = outInfo->paramName; base = base.right(base.length() - 3); if (! base.left(4).compare("Real")) base = base.right(base.length() - 4); if (! base.left(7).compare("Integer")) base = base.right(base.length() - 7); if (! base.length()) base = QObject::tr("Plot"); PlotLine *line = new PlotLine; QString s = base + " " + QObject::tr("Color"); parms.getData(s, ts); QColor color(ts); line->setColor(color); s = base + " " + QObject::tr("Label"); parms.getData(s, ts); line->setLabel(ts); s = base + " " + QObject::tr("Line Type"); line->setType((PlotLine::LineType)parms.getInt(s)); retCode = TA_GetOutputParameterInfo(handle, loop, &outInfo); if (retCode != TA_SUCCESS) { qDebug("TALIB::calculate:cannot get output info"); delete line; continue; } int loop2; switch (loop) { case 0: if (outInfo->type == TA_Output_Integer) { for (loop2 = 0; loop2 < count; loop2++) line->append((double) out4[loop2]); } else { for (loop2 = 0; loop2 < count; loop2++) line->append((double) out1[loop2]); } break; case 1: for (loop2 = 0; loop2 < count; loop2++) line->append((double) out2[loop2]); break; case 2: for (loop2 = 0; loop2 < count; loop2++) line->append((double) out3[loop2]); break; default: break; } if (line->getType() == PlotLine::Histogram || line->getType() == PlotLine::HistogramBar) output->prependLine(line); else output->addLine(line); } } retCode = TA_ParamHolderFree(parmHolder); if (retCode != TA_SUCCESS) qDebug("TALIB::calculate:can't delete parm holder"); return output; }
PlotLine * ExScript::doScript () { if (proc) { delete proc; proc = 0; } PlotLine *line = new PlotLine(); if (! scriptPath.length()) { qDebug("ExScript::calculate: no script path"); return line; } proc = new QProcess(this); connect(proc, SIGNAL(readyReadStdout()), this, SLOT(readFromStdout())); proc->setCommunication(QProcess::Stdin|QProcess::Stdout|QProcess::Stderr); proc->addArgument(scriptPath); QStringList l = QStringList::split(" ", comlineParms, FALSE); int loop; for (loop = 0; loop < (int) l.count(); loop++) proc->addArgument(l[loop]); buffer.truncate(0); QString s; if (dateFlag || openFlag || highFlag || lowFlag || closeFlag || volumeFlag || oiFlag) getInput(s); QByteArray ba(s.length()); if (s.length()) { for (loop = 0; loop < (int) s.length(); loop++) ba[loop] = s.at(loop).latin1(); } if (! proc->launch(ba, NULL)) { qDebug("ExScript::calculate: error starting script"); delete proc; proc = 0; return line; } timer->start(seconds * 1000, FALSE); wakeup(); while (proc->isRunning()) { usleep(100); wakeup(); } timer->stop(); if (proc) { delete proc; proc = 0; } if (! buffer.length()) { qDebug("ExScript::createOutput: output buffer empty"); return line; } l = QStringList::split(",", buffer, FALSE); for (loop = 0; loop < (int) l.count(); loop++) line->append(l[loop].toDouble()); line->setColor(color); line->setType(lineType); line->setLabel(label); return line; }
void THERM::getTHERM (QPtrList<PlotLine> &pll) { PlotLine *therm = new PlotLine(); int loop; double thermometer = 0; for (loop = 1; loop < (int) data->count(); loop++) { double high = fabs(data->getHigh(loop) - data->getHigh(loop - 1)); double lo = fabs(data->getLow(loop - 1) - data->getLow(loop)); if (high > lo) thermometer = high; else thermometer = lo; therm->append(thermometer); } if (smoothing > 1) { PlotLine *ma = getMA(therm, smoothType, smoothing); pll.append(ma); delete therm; therm = ma; } else pll.append(therm); PlotLine *therm_ma = getMA(therm, maType, maPeriod); therm_ma->setColor(maColor); therm_ma->setType(maLineType); therm_ma->setLabel(maLabel); pll.append(therm_ma); // assign the therm colors therm->setColorFlag(TRUE); therm->setType(lineType); therm->setLabel(label); int thermLoop = therm->getSize() - 1; int maLoop = therm_ma->getSize() - 1; while (thermLoop > -1) { if (maLoop > -1) { double thrm = therm->getData(thermLoop); double thrmma = therm_ma->getData(maLoop); if (thrm > (thrmma * threshold)) therm->setColorBar(thermLoop, threshColor); else { if (thrm > thrmma) therm->setColorBar(thermLoop, upColor); else therm->setColorBar(thermLoop, downColor); } } else therm->setColorBar(thermLoop, downColor); thermLoop--; maLoop--; } }
void PP::getPP (QPtrList<PlotLine> &pll) { double high = data->getHigh(data->count() - 1); double low = data->getLow(data->count() - 1); double close = data->getClose(data->count() - 1); PlotLine *fr = new PlotLine(); fr->setColor(resColor); fr->setType(resLineType); fr->setLabel(resLabel); double pp = (high + low + close) / 3; double t = (2 * pp) - low; fr->append(t); PlotLine *sr = new PlotLine(); sr->setColor(resColor); sr->setType(resLineType); sr->setLabel(resLabel2); pp = (high + low + close) / 3; t = pp + (high - low); sr->append(t); PlotLine *thr = new PlotLine(); thr->setColor(resColor); thr->setType(resLineType); thr->setLabel(resLabel3); pp = (high + low + close) / 3; t = (2 * pp) + (high - (2 * low)); thr->append(t); PlotLine *fs = new PlotLine(); fs->setColor(supColor); fs->setType(supLineType); fs->setLabel(supLabel); pp = (high + low + close) / 3; t = (2 * pp) - high; fs->append(t); PlotLine *ss = new PlotLine(); ss->setColor(supColor); ss->setType(supLineType); ss->setLabel(supLabel2); pp = (high + low + close) / 3; t = pp - (high - low); ss->append(t); PlotLine *ts = new PlotLine(); ts->setColor(supColor); ts->setType(supLineType); ts->setLabel(supLabel3); pp = (high + low + close) / 3; t = (2 * pp) - ((2 * high) - low); ts->append(t); pll.append(fr); pll.append(sr); pll.append(thr); pll.append(fs); pll.append(ss); pll.append(ts); }