19.01.2022
0
2
96
100

QQE-Quantitative Qualitative Estimation


Quantitative Qualitative Estimation (QQE) göstergesi, eğilimi ve yanları belirlemek için momentum tabanlı bir göstergedir.


QQE göstergesi, popüler Relative Strength Index (RSI) göstergesinin daha yumuşak bir versiyonu gibi çalışır.

QQE, iki volatilite tabanlı takip eden durma çizgisi ekleyerek RSI'yi genişletir.

Bu takip eden durma çizgileri, hızlı ve yavaş hareket eden bir Average True Range (ATR) oluşur.

Bu ATR çizgileri, bu göstergeyi kısa vadeli oynaklığa daha az duyarlı hale getirmek için yumuşatılmıştır.


QQE kullanmanın en yaygın yöntemi, QQE çizgisinin aşırı alım veya aşırı satım koşullarını yansıttığı dönemlerde hızlı ve yavaş hareket eden takip eden durma çizgilerinin kesişimlerini aramaktır.


QQE iki yönde kullanılabilir:


1. Eğilimi belirleyin, yani çizgi 50 seviyesinin üzerindeyse, eğilim yükseliyor, altındaysa - azalıyor;

2.QQE FAST (bordo) ve QQE SLOW (mavi) çizgilerini geçtiği anda sinyalleri arayın.



QQE'nin kendisinin, QQE HIZLI'nın QQE YAVAŞ'ın üzerinde olması durumunda genellikle bir yukarı trendi ve QQE YAVAŞ'ın altında olması durumunda bir düşüş eğilimini gösterdiği kabul edilir.

Genellikle 40 ile 60 arasında bir orta aralık belirlenir ve gösterge bu aralıktaysa, piyasanın yanlara doğru takip ettiği veya trend olmadığı kabul edilir.


Göstergeden aşağıdakiler gibi çeşitli sinyaller oluşturulabilir:

-QQE FAST, QQE SLOW'un 50 seviyesinin altına düştüğünde veya sadece QQE çizgileri 50 seviyesinin üzerine çıktığında satın alın.

-QQE FAST, QQE SLOW'un 50 seviyesinin altına düştüğünde veya sadece QQE çizgileri 50 seviyesinin altına düştüğünde satış yapın.



UYARI: QQE, AYRIŞMALAR SIRASINDA YANLIŞ SİNYALLERİ TETİKLEYEBİLMEK İÇİN RSI BAZLI BİR GÖSTERGEDİR!

using System;
using System.Collections.Generic;
using System.Linq;
using System.ComponentModel;
using Matriks.Data.Identifiers;
using Matriks.Data.Symbol;
using Matriks.Engines;
using Matriks.Indicators;
using Matriks.Symbols;
using Matriks.AlgoTrader;
using Matriks.Trader.Core;
using Matriks.Trader.Core.Fields;
using Matriks.Trader.Core.TraderModels;
using Matriks.Lean.Algotrader.AlgoBase;
using Matriks.Lean.Algotrader.Models;
using Matriks.Lean.Algotrader.Trading;

/*
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © KivancOzbilgic

//@version=4
study("Quantitative Qualitative Estimation", shorttitle="QQE",precision=4, resolution="")
src=input(close)
length = input(14,"RSI Length", minval=1)
SSF=input(5, "SF RSI SMoothing Factor", minval=1)
showsignals = input(title="Show Crossing Signals?", type=input.bool, defval=true)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
RSII=ema(rsi(src,length),SSF)
TR=abs(RSII-RSII[1])
wwalpha = 1/ length
WWMA = 0.0
WWMA := wwalpha*TR + (1-wwalpha)*nz(WWMA[1])
ATRRSI=0.0
ATRRSI := wwalpha*WWMA + (1-wwalpha)*nz(ATRRSI[1])
QQEF=ema(rsi(src,length),SSF)
QUP=QQEF+ATRRSI*4.236
QDN=QQEF-ATRRSI*4.236
QQES=0.0
QQES:=QUP<nz(QQES[1]) ? QUP : QQEF>nz(QQES[1]) and QQEF[1]<nz(QQES[1]) ? QDN :  QDN>nz(QQES[1]) ? QDN : QQEF<nz(QQES[1]) and QQEF[1]>nz(QQES[1]) ? QUP : nz(QQES[1])
QQF=plot(QQEF,"FAST",color.maroon,2)
QQS=plot(QQES,"SLOW",color=color.blue, linewidth=1)
plot(50,color=color.gray,style=6)
longFillColor = highlighting ? (QQEF>QQES ? color.green : na) : na
shortFillColor = highlighting ? (QQEF<QQES ? color.red : na) : na
fill(QQF, QQS, title="UpTrend Highligter", color=longFillColor)
fill(QQF, QQS, title="DownTrend Highligter", color=shortFillColor)
buySignalr = crossover(QQEF, QQES)
plotshape(buySignalr and showsignals ? QQES*0.995 : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
sellSignallr = crossunder(QQEF, QQES)
plotshape(sellSignallr and showsignals ? QQES*1.005 : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)
alertcondition(cross(QQEF, QQES), title="Cross Alert", message="QQE Crossing Signal!")
alertcondition(crossover(QQEF, QQES), title="Crossover Alarm", message="QQE BUY SIGNAL!")
alertcondition(crossunder(QQEF, QQES), title="Crossunder Alarm", message="QQE SELL SIGNAL!")
alertcondition(crossover(QQEF, 50), title="Cross 50 Up Alert", message="QQE FAST Crossing 50 UP!")
alertcondition(crossunder(QQEF, 50), title="Cross 50 Down Alert", message="QQE FAST Crossing 50 DOWN!")

*/
namespace Matriks.Lean.Algotrader
{
	//Ilk parametre indikatörün adı, sınıfın adıyla aynı olmalıdır.
	//Ikinci parametre indikatörün Dataserisinin üzerine mi yeni pencereye mi ekleneceğini belirtir. Yeni pencere için ->IndicatorDrawingArea.NewWindow , Data Serisi için IndicatorDrawingArea.OnDataSeries
	[IndicatorInformationAttribute("QQEKripex", IndicatorDrawingArea.NewWindow)]
	//Indikatörün çizgilerinin isimleri
	[IndicatorLineInformationAttribute(new []
		{
			"QQF(0,1)", "QQS"
		}
	)]

	public class QQEKripex : MatriksIndicator
	{

		//Indicator opsiyon panelinde değerleri değiştirebildiğimiz parametreler. Int, Bool, Decimal ve Enum değerleri alabilir.Tüm değişken tiplerini DefaultValue ile tanımlarız. 
		[DefaultValue(14)]
		public int Period
		{
			get; set;
		}

		[DefaultValue(5)]
		public int SF
		{
			get; set;
		}

		EMA ema;

		RSI rsi;

		public sealed override void OnInit()
		{
			rsi = RSIIndicator(Symbol, SymbolPeriod, OHLCType.Close, Period);
			ema = EMAIndicator(rsi, SF);

		}

		decimal TR, wwalpha, WWMA, ATRRSI, QUP, QDN, QQEF, QQES;
		decimal prevWWMA = 0, prevATRRSI = 0, prevBar = 0;
		private bool lastBarChanged = false;
		private int lastBar;
		Dictionary<int, decimal> prevWWMADict = new Dictionary<int, decimal>();
		Dictionary<int, decimal> prevATRRSIDict = new Dictionary<int, decimal>();
		/// <summary>
		/// Seçilen sembolün bardata'ları güncellendikçe bu fonksiyon tetiklenir. 
		/// </summary>
		/// <param name="currentBar">Güncellenen bardata'nın indexteki sırası</param>
		/// <param name="inputValue">Seçilen OHLC tipine göre gelen bardata'nın o anki değeri</param>
		/// <param name="barDateTime">Bardata'ya gelen güncelleme zamanı</param>
		public override void OnDataUpdate(int currentBar, decimal inputValue, DateTime barDateTime)
		{
			if (!prevWWMADict.ContainsKey(currentBar))
				prevWWMADict.Add(currentBar, 0);
			if (!prevATRRSIDict.ContainsKey(currentBar))
				prevATRRSIDict.Add(currentBar, 0);
			if (currentBar < Period)
			{
				//SetLine fonksiyonu indikatördeki noktaları kuran fonksiyondur
				//Ilk paramatre indicatordeki hangi çizginin güncelleneceği bilgisidir.
				//Ikinci parametre güncellenecek çizginin hangi indexinin güncelleneceği bilgisidir.
				//Ucüncü parametre güncellenecek çizginin indexinin alacağı değerdir.
				SetLine(0, currentBar, 0);
				SetLine(1, currentBar, 0);
				return ;
			}else
			{

				TR = Math.Abs(ema.Value[0][currentBar] - Ref(ema, 1));
				wwalpha = 1m / Period;
				// WWMA := wwalpha*TR + (1-wwalpha)*nz(WWMA[1])
				WWMA = wwalpha * TR + (1 - wwalpha) * prevWWMADict[currentBar -1];
				prevWWMADict[currentBar] = WWMA;

				prevWWMA = prevBar != currentBar ? WWMA : prevWWMA;
				// ATRRSI := wwalpha*WWMA + (1-wwalpha)*nz(ATRRSI[1])
				ATRRSI = wwalpha * WWMA + (1 - wwalpha) * prevATRRSIDict[currentBar -1];
				prevATRRSIDict[currentBar] = ATRRSI;
				Console.WriteLine(prevATRRSI + " " + ATRRSI);
				prevATRRSI = prevBar != currentBar ? ATRRSI : prevATRRSI;
				Console.WriteLine(prevATRRSI + " " + ATRRSI);
				Console.WriteLine(prevBar + " " + currentBar);
				prevBar = prevBar != currentBar ? currentBar:prevBar;

				QQEF = ema.CurrentValue;

				//QUP=QQEF+  ATRRSI * 4.236			
				QUP = QQEF + ATRRSI * 4.236m;
				//QDN=QQEF-  ATRRSI	* 4.236
				QDN = QQEF - ATRRSI * 4.236m;

				//QQES:=QUP<nz(QQES[1]) ? QUP : 
				// 		QQEF>nz(QQES[1]) and QQEF[1]<nz(QQES[1]) ? QDN :  
				//		QDN>nz(QQES[1]) ? QDN : 
				//		QQEF<nz(QQES[1]) and QQEF[1]>nz(QQES[1]) ? QUP : nz(QQES[1])

				if (QUP<Value[1][currentBar -1])
				{
					QQES = QUP;
				}else if (QQEF>Value[1][currentBar -1] && Value[0][currentBar -1] <Value[1][currentBar -1])
				{
					QQES = QDN;
				}else if (QDN>Value[1][currentBar -1])
				{
					QQES = QDN;
				}else if (QQEF<Value[1][currentBar -1] && Value[0][currentBar -1] >Value[1][currentBar -1])
				{
					QQES = QUP;
				}else
				{
					QQES = Value[1][currentBar -1];
				}
			}

			SetLine(0, currentBar, QQEF);
			SetLine(1, currentBar, QQES);
			lastBar = currentBar;
		}
	}
}

0 Yorum