/
OrderFlowBot.DataBar.cs
108 lines (90 loc) · 4.84 KB
/
OrderFlowBot.DataBar.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
using NinjaTrader.Custom.AddOns.OrderFlowBot.DataBar.Dependencies;
using NinjaTrader.NinjaScript.AddOns.OrderFlowBot;
using System;
using System.Collections.Generic;
namespace NinjaTrader.NinjaScript.Strategies
{
public partial class OrderFlowBot : Strategy
{
private OrderFlowBotDataBar GetDataBar(List<OrderFlowBotDataBar> dataBars, int barsAgo)
{
OrderFlowBotDataBar dataBar = new OrderFlowBotDataBar();
NinjaTrader.NinjaScript.BarsTypes.VolumetricBarsType volumetricBar = Bars.BarsSeries.BarsType as NinjaTrader.NinjaScript.BarsTypes.VolumetricBarsType;
if (volumetricBar == null) return dataBar;
PopulateBasic(dataBar, barsAgo);
PopulatePrices(dataBar, barsAgo);
PopulateVolumeAndImbalances(dataBars, dataBar, volumetricBar, barsAgo);
PopulateDeltas(dataBar, volumetricBar, barsAgo);
return dataBar;
}
private void PopulateBasic(OrderFlowBotDataBar dataBar, int barsAgo)
{
dataBar.Time = ToTime(Time[barsAgo]);
dataBar.BarNumber = CurrentBar - barsAgo;
}
private void PopulatePrices(OrderFlowBotDataBar dataBar, int barsAgo)
{
dataBar.Prices.High = High[barsAgo];
dataBar.Prices.Low = Low[barsAgo];
dataBar.Prices.Open = Open[barsAgo];
dataBar.Prices.Close = Close[barsAgo];
dataBar.SetBarType();
}
private void PopulateVolumeAndImbalances(List<OrderFlowBotDataBar> dataBars, OrderFlowBotDataBar dataBar, NinjaTrader.NinjaScript.BarsTypes.VolumetricBarsType volumetricBar, int barsAgo)
{
double high = dataBar.Prices.High;
double low = dataBar.Prices.Low;
dataBar.Volumes.Volume = volumetricBar.Volumes[CurrentBar - barsAgo].TotalVolume;
dataBar.Volumes.BuyingVolume = volumetricBar.Volumes[CurrentBar - barsAgo].TotalBuyingVolume;
dataBar.Volumes.SellingVolume = volumetricBar.Volumes[CurrentBar - barsAgo].TotalSellingVolume;
double pointOfControl;
volumetricBar.Volumes[CurrentBar - barsAgo].GetMaximumVolume(null, out pointOfControl);
dataBar.Volumes.PointOfControl = pointOfControl;
// Get bid/ask volume for each price in bar
List<BidAskVolume> bidAskVolumeList = new List<BidAskVolume>();
while (high >= low)
{
BidAskVolume bidAskVolume = new BidAskVolume
{
Price = high,
BidVolume = volumetricBar.Volumes[CurrentBar - barsAgo].GetBidVolumeForPrice(high),
AskVolume = volumetricBar.Volumes[CurrentBar - barsAgo].GetAskVolumeForPrice(high)
};
bidAskVolumeList.Add(bidAskVolume);
high -= TickSize;
}
dataBar.Volumes.BidAskVolumes = bidAskVolumeList;
dataBar.Volumes.SetVolumeSequencing(bidAskVolumeList, dataBar.BarType, dataBar.Volumes.Volume);
dataBar.Volumes.SetSinglePrints();
dataBar.Volumes.SetBidAskPriceVolumeAndVolumeDelta();
dataBar.Imbalances.SetImbalances(bidAskVolumeList, dataBar.Volumes.ValidBidAskVolumes());
dataBar.Ratios.SetLastRatioPrices(dataBars);
dataBar.Ratios.SetRatios(bidAskVolumeList, dataBar.Volumes.ValidBidAskVolumes(), dataBar.BarType);
}
private void PopulateDeltas(OrderFlowBotDataBar dataBar, NinjaTrader.NinjaScript.BarsTypes.VolumetricBarsType volumetricBar, int barsAgo)
{
long minDelta = volumetricBar.Volumes[CurrentBar - barsAgo].MinSeenDelta;
long maxDelta = volumetricBar.Volumes[CurrentBar - barsAgo].MaxSeenDelta;
dataBar.Deltas.Delta = volumetricBar.Volumes[CurrentBar - barsAgo].BarDelta;
dataBar.Deltas.MinDelta = minDelta;
dataBar.Deltas.MaxDelta = maxDelta;
dataBar.Deltas.CumulativeDelta = volumetricBar.Volumes[CurrentBar - barsAgo].CumulativeDelta;
dataBar.Deltas.DeltaPercentage = Math.Round(volumetricBar.Volumes[CurrentBar - barsAgo].GetDeltaPercent(), 2);
dataBar.Deltas.MinMaxDeltaRatio = CalculateRatio(Math.Abs(minDelta), Math.Abs(maxDelta));
dataBar.Deltas.MaxMinDeltaRatio = CalculateRatio(Math.Abs(maxDelta), Math.Abs(minDelta));
dataBar.Deltas.DeltaChange = volumetricBar.Volumes[CurrentBar - barsAgo].BarDelta - volumetricBar.Volumes[CurrentBar - barsAgo - 1].BarDelta;
}
private double CalculateRatio(double numerator, double denominator)
{
if (numerator == 0 && denominator == 0)
{
return 0;
}
if (denominator == 0)
{
return Math.Round(numerator, 2);
}
return Math.Round(numerator / denominator, 2);
}
}
}