#include "sierrachart.h"

SCDLLName("Delta Price Divergence") 
// Copyright mike.gaunt5@ntlworld.com
SCSFExport scsf_DeltaPriceDivergence(SCStudyInterfaceRef sc)
{
	SCSubgraphRef DPdivergence = sc.Subgraph[0];
	SCSubgraphRef PeriodHigh   = sc.Subgraph[1];
	SCSubgraphRef PeriodLow	   = sc.Subgraph[2];
	SCSubgraphRef ATR          = sc.Subgraph[3];
	SCFloatArrayRef TrueRange    = ATR.Arrays[0];
	SCFloatArrayRef AvgTrueRange = ATR.Arrays[1];
	SCInputRef T1Receiver = sc.Input[0];
	SCInputRef MuteAlert = sc.Input[1];
	if (sc.SetDefaults)
	{
		sc.GraphName = "Delta Price divergence";
		sc.StudyDescription = "Highlights divgence between Delta and Price. Audio alarm if near HOD or LOD";
		sc.FreeDLL = 0; // Set to 0 when study finalised
		sc.AutoLoop = 1; 
		sc.AlertOnlyOncePerBar = true; 
		sc.GraphRegion = 0;
		DPdivergence.Name = "DP divergence";
		DPdivergence.DrawStyle = DRAWSTYLE_STAR;
		DPdivergence.PrimaryColor = RGB(255,32,32);
		DPdivergence.SecondaryColor = RGB(32, 255, 32) ;
		T1Receiver.Name = "Trader Receiver (ID:1)";
		T1Receiver.SetChartStudyValues(1,3);
		MuteAlert.Name = "Mute alert sound";
		MuteAlert.SetYesNo(false);
		sc.GlobalDisplayStudyNameSubgraphNamesAndValues = 0;
		return;
	}
	if(sc.Index < sc.ArraySize -2) return;
	int Index = sc.Index;	
	float CurTcks = sc.BaseData[SC_NUM_TRADES][sc.Index];
	float PrevTcks = sc.BaseData[SC_NUM_TRADES][sc.Index-1];
	float TcksTopDec = PrevTcks * 0.9;
	DPdivergence[sc.Index] = 0;
	int& AlarmIndex = sc.GetPersistentInt(1);
	float& DailyHigh = sc.GetPersistentFloat(2);
	float& DailyLow = sc.GetPersistentFloat(3);
	float CbRange = ((sc.High[Index] - sc.Low[Index])/sc.TickSize)+1;
	s_UseTool Tool;
	
	Tool.Clear(); // reset tool structure for our next use
	Tool.ChartNumber = sc.ChartNumber;
	Tool.DrawingType = DRAWING_TEXT;
	Tool.LineNumber = 13375143+ (sc.StudyGraphInstanceID);
	Tool.BeginDateTime = sc.BaseDateTimeIn[sc.Index];
	Tool.Region = sc.GraphRegion;	
	Tool.BeginValue = sc.High[Index] + sc.TickSize*3;
	Tool.Color = RGB(0,0,0);
	Tool.FontBackColor = RGB(150,150,150);
	SCString RangeText;
	RangeText.Format("%.0f t", CbRange);
	Tool.Text = RangeText;
	Tool.FontSize = 12;
	Tool.AddMethod = UTAM_ADD_OR_ADJUST;
	sc.UseTool(Tool);

	if(CurTcks < TcksTopDec) return;
	
	DailyHigh = sc.GetStudyPersistentFloatFromChart(T1Receiver.GetChartNumber(), T1Receiver.GetStudyID(), 3);
	DailyLow = sc.GetStudyPersistentFloatFromChart(T1Receiver.GetChartNumber(), T1Receiver.GetStudyID(), 4);
	
	sc.ATR(sc.BaseDataIn, TrueRange, AvgTrueRange, Index, 3, MOVAVGTYPE_SIMPLE);
	float RngLevel = 2*AvgTrueRange[Index]; 
	float tTarget = AvgTrueRange[Index] / sc.TickSize;
	float deltaPrice = sc.Close[Index] - sc.Open[Index];
	float deltaVol  = 100*(sc.BaseDataIn[SC_ASKVOL][Index] - sc.BaseDataIn[SC_BIDVOL][Index])/sc.BaseDataIn[SC_VOLUME][Index];
	float offset = 3*sc.TickSize;
	
	if( deltaVol > 5 && deltaPrice < 0 )
	{
	DPdivergence[Index] = sc.High[Index] + offset;
	DPdivergence.DataColor[Index] = DPdivergence.PrimaryColor;
	
	if((DailyHigh - RngLevel ) < sc.High[Index] && tTarget >4 
	&& sc.GetBarHasClosedStatus()==BHCS_BAR_HAS_NOT_CLOSED && !MuteAlert.GetYesNo() && AlarmIndex != Index)
	{
	sc.SetAlert(15,Index, "Divergence Short Alert"); 
	AlarmIndex = Index;
	}
	}
	else if( deltaVol < -5 && deltaPrice > 0)
	{
	DPdivergence[Index] = sc.Low[Index] - offset;
	DPdivergence.DataColor[Index] = DPdivergence.SecondaryColor;
	
	if((DailyLow + RngLevel) > sc.Low[Index] && tTarget >=4 
	&& sc.GetBarHasClosedStatus()==BHCS_BAR_HAS_NOT_CLOSED && !MuteAlert.GetYesNo() && AlarmIndex != Index) 
	{
	sc.SetAlert(15, Index, "Divergence Long Alert"); 
	AlarmIndex = Index;
	}
	}
	
	Tool.DrawingType = DRAWING_HORIZONTALLINE;
	Tool.Text = "Daily High";
	Tool.DisplayHorizontalLineValue = 1;
	Tool.LineStyle = LINESTYLE_DOT;
	Tool.LineNumber =  14567890+ (sc.StudyGraphInstanceID);
	Tool.BeginValue = DailyHigh;
	Tool.Color = RGB(0,151,0);  
	Tool.LineWidth = 2;
	sc.UseTool(Tool);
	
	Tool.Text = "Daily Low";
	Tool.LineNumber =  14567891+ (sc.StudyGraphInstanceID);
	Tool.BeginValue = DailyLow;
	Tool.Color = RGB(164,0,0);  
	sc.UseTool(Tool);
	
}

