protected void CalculateSwingStandard(Swings swingHigh, Swings swingLow,
SwingCurrent swingCur, SwingProperties swingProp, BoolSeries upFlip,
List<SwingStruct> swingHighs, BoolSeries dnFlip, List<SwingStruct> swingLows,
int decimalPlaces, bool useCloseValues, DataSeries doubleBottom, DataSeries lowerLow,
DataSeries higherLow, DataSeries doubleTop, DataSeries lowerHigh,
DataSeries higherHigh, DataSeries gannSwing)
{
// Check if high and low values are used or only close values
IDataSeries[] highs;
IDataSeries[] lows;
if (useCloseValues == true)
{
lows = Closes;
highs = Closes;
}
else
{
lows = Lows;
highs = Highs;
}
// For a new swing high in an uptrend, Highs[BarsInProgress][0] must be
// greater than the current swing high
if (swingCur.SwingSlope == 1 && highs[BarsInProgress][0] <= swingHigh.CurPrice)
swingHigh.New = false;
else
swingHigh.New = true;
// For a new swing low in a downtrend, Lows[BarsInProgress][0] must be
// smaller than the current swing low
if (swingCur.SwingSlope == -1 && lows[BarsInProgress][0] >= swingLow.CurPrice)
swingLow.New = false;
else
swingLow.New = true;
// CalculatOnBarClose == true
if (CalculateOnBarClose)
{
// test if Highs[BarsInProgress][0] is higher than the last
// calculationSize highs = new swing high
if (swingHigh.New)
{
for (int i = 1; i < swingProp.SwingSize + 1; i++)
{
if (highs[BarsInProgress][0] <= highs[BarsInProgress][i])
{
swingHigh.New = false;
break;
}
}
}
// test if Lows[BarsInProgress][0] is lower than the last
// calculationSize lows = new swing low
if (swingLow.New)
{
for (int i = 1; i < swingProp.SwingSize + 1; i++)
{
if (lows[BarsInProgress][0] >= lows[BarsInProgress][i])
{
swingLow.New = false;
break;
}
}
}
// New swing high and new swing low
if (swingHigh.New && swingLow.New)
{
// Downtrend - ignore the swing high
if (swingCur.SwingSlope == -1)
swingHigh.New = false;
// Uptrend - ignore the swing low
else
swingLow.New = false;
}
}
// CalculatOnBarClose == false
else
{
// Used to control, that only one swing is set for
// each bar
if (FirstTickOfBar)
swingCur.NewSwing = 0;
// No swing or an up swing is found
if (swingCur.NewSwing != -1)
{
// test if Highs[BarsInProgress][0] is higher than the last
// calculationSize highs = new swing high
if (swingHigh.New)
{
for (int i = 1; i < swingProp.SwingSize + 1; i++)
{
if (highs[BarsInProgress][0] <= highs[BarsInProgress][i])
{
swingHigh.New = false;
break;
}
}
// Found a swing high
if (swingHigh.New)
swingCur.NewSwing = 1;
}
}
// No swing or an down swing is found
if (swingCur.NewSwing != 1)
{
// test if Lows[BarsInProgress][0] is lower than the last
// calculationSize lows = new swing low
if (swingLow.New)
{
for (int i = 1; i < swingProp.SwingSize + 1; i++)
{
if (lows[BarsInProgress][0] >= lows[BarsInProgress][i])
{
swingLow.New = false;
break;
}
}
// Found a swing low
if (swingLow.New)
swingCur.NewSwing = -1;
}
}
// Set newLow back to false
if (swingCur.NewSwing == 1)
swingLow.New = false;
// Set newHigh back to false
if (swingCur.NewSwing == -1)
swingHigh.New = false;
}
// Swing high
if (swingHigh.New)
{
int bar;
double price;
// New swing high
if (swingCur.SwingSlope != 1)
{
bar = CurrentBars[BarsInProgress] -
HighestBar(highs[BarsInProgress], CurrentBars[BarsInProgress] -
swingLow.CurBar);
price = highs[BarsInProgress][HighestBar(highs[BarsInProgress],
CurrentBars[BarsInProgress] - swingLow.CurBar)];
swingHigh.Update = false;
}
// Update swing high
else
{
bar = CurrentBars[BarsInProgress];
price = highs[BarsInProgress][0];
swingHigh.Update = true;
}
CalcUpSwing(bar, price, swingHigh.Update, swingHigh, swingLow, swingCur,
swingProp, upFlip, swingHighs, decimalPlaces, doubleBottom, lowerLow,
higherLow, doubleTop, lowerHigh, higherHigh, gannSwing);
}
// Swing low
else if (swingLow.New)
{
int bar;
double price;
// New swing low
if (swingCur.SwingSlope != -1)
{
bar = CurrentBars[BarsInProgress] - LowestBar(lows[BarsInProgress],
CurrentBars[BarsInProgress] - swingHigh.CurBar);
price = lows[BarsInProgress][LowestBar(lows[BarsInProgress],
CurrentBars[BarsInProgress] - swingHigh.CurBar)];
swingLow.Update = false;
}
// Update swing low
else
{
bar = CurrentBars[BarsInProgress];
price = lows[BarsInProgress][0];
swingLow.Update = true;
}
CalcDnSwing(bar, price, swingLow.Update, swingHigh, swingLow, swingCur,
swingProp, dnFlip, swingLows, decimalPlaces, doubleBottom, lowerLow,
higherLow, doubleTop, lowerHigh, higherHigh, gannSwing);
}
}
//#########################################################################################
#endregion
#region Calculate Swing Gann
//#########################################################################################
protected void CalculateSwingGann(Swings swingHigh, Swings swingLow, SwingCurrent swingCur,
SwingProperties swingProp, BoolSeries upFlip, List<SwingStruct> swingHighs,
BoolSeries dnFlip, List<SwingStruct> swingLows, int decimalPlaces,
DataSeries doubleBottom, DataSeries lowerLow, DataSeries higherLow,
DataSeries doubleTop, DataSeries lowerHigh, DataSeries higherHigh,
DataSeries gannSwing)
{
#region Set bar property
//=================================================================================
// Represents the bar type. -1 = Down | 0 = Inside | 1 = Up | 2 = Outside
int barType = 0;
if (Highs[BarsInProgress][0] > Highs[BarsInProgress][1])
{
if (Lows[BarsInProgress][0] < Lows[BarsInProgress][1])
barType = 2;
else
barType = 1;
}
else
{
if (Lows[BarsInProgress][0] < Lows[BarsInProgress][1])
barType = -1;
else
barType = 0;
}
//=================================================================================
#endregion
#region Up swing
//=================================================================================
if (swingCur.SwingSlope == 1)
{
switch (barType)
{
// Up bar
case 1:
swingCur.ConsecutiveBars = 0;
swingCur.ConsecutiveBarValue = 0.0;
if (Highs[BarsInProgress][0] > swingHigh.CurPrice)
{
swingHigh.New = true;
swingHigh.Update = true;
CalcUpSwing(CurrentBars[BarsInProgress],
Highs[BarsInProgress][0], swingHigh.Update, swingHigh,
swingLow, swingCur, swingProp, upFlip, swingHighs,
decimalPlaces, doubleBottom, lowerLow, higherLow, doubleTop,
lowerHigh, higherHigh, gannSwing);
if ((swingCur.ConsecutiveBars + 1) == swingProp.SwingSize)
swingCur.StopOutsideBarCalc = true;
}
break;
// Down bar
case -1:
if (swingCur.ConsecutiveBarNumber != CurrentBars[BarsInProgress])
{
if (swingCur.ConsecutiveBarValue == 0.0)
{
swingCur.ConsecutiveBars++;
swingCur.ConsecutiveBarNumber = CurrentBars[BarsInProgress];
swingCur.ConsecutiveBarValue = Lows[BarsInProgress][0];
}
else if (Lows[BarsInProgress][0] < swingCur.ConsecutiveBarValue)
{
swingCur.ConsecutiveBars++;
swingCur.ConsecutiveBarNumber = CurrentBars[BarsInProgress];
swingCur.ConsecutiveBarValue = Lows[BarsInProgress][0];
}
}
else if (Lows[BarsInProgress][0] < swingCur.ConsecutiveBarValue)
swingCur.ConsecutiveBarValue = Lows[BarsInProgress][0];
if (swingCur.ConsecutiveBars == swingProp.SwingSize ||
(swingProp.UseBreakouts && Lows[BarsInProgress][0] <
swingLow.CurPrice))
{
swingCur.ConsecutiveBars = 0;
swingCur.ConsecutiveBarValue = 0.0;
swingLow.New = true;
swingLow.Update = false;
int bar = CurrentBars[BarsInProgress] -
LowestBar(Lows[BarsInProgress],
CurrentBars[BarsInProgress] - swingHigh.CurBar);
double price =
Lows[BarsInProgress][LowestBar(Lows[BarsInProgress],
CurrentBars[BarsInProgress] - swingHigh.CurBar)];
CalcDnSwing(bar, price, swingLow.Update, swingHigh, swingLow,
swingCur, swingProp, dnFlip, swingLows, decimalPlaces,
doubleBottom, lowerLow, higherLow, doubleTop, lowerHigh,
higherHigh, gannSwing);
}
break;
// Inside bar
case 0:
if (!swingProp.IgnoreInsideBars)
{
swingCur.ConsecutiveBars = 0;
swingCur.ConsecutiveBarValue = 0.0;
}
break;
// Outside bar
case 2:
if (Highs[BarsInProgress][0] > swingHigh.CurPrice)
{
swingHigh.New = true;
swingHigh.Update = true;
CalcUpSwing(CurrentBars[BarsInProgress],
Highs[BarsInProgress][0], swingHigh.Update, swingHigh,
swingLow, swingCur, swingProp, upFlip, swingHighs,
decimalPlaces, doubleBottom, lowerLow, higherLow, doubleTop,
lowerHigh, higherHigh, gannSwing);
}
else if (!swingCur.StopOutsideBarCalc)
{
if (swingCur.ConsecutiveBarNumber != CurrentBars[BarsInProgress])
{
if (swingCur.ConsecutiveBarValue == 0.0)
{
swingCur.ConsecutiveBars++;
swingCur.ConsecutiveBarNumber =
CurrentBars[BarsInProgress];
swingCur.ConsecutiveBarValue = Lows[BarsInProgress][0];
}
else if (Lows[BarsInProgress][0] <
swingCur.ConsecutiveBarValue)
{
swingCur.ConsecutiveBars++;
swingCur.ConsecutiveBarNumber =
CurrentBars[BarsInProgress];
swingCur.ConsecutiveBarValue = Lows[BarsInProgress][0];
}
}
else if (Lows[BarsInProgress][0] < swingCur.ConsecutiveBarValue)
swingCur.ConsecutiveBarValue = Lows[BarsInProgress][0];
if (swingCur.ConsecutiveBars == swingProp.SwingSize ||
(swingProp.UseBreakouts && Lows[BarsInProgress][0] <
swingLow.CurPrice))
{
swingCur.ConsecutiveBars = 0;
swingCur.ConsecutiveBarValue = 0.0;
swingLow.New = true;
swingLow.Update = false;
int bar = CurrentBars[BarsInProgress] -
LowestBar(Lows[BarsInProgress],
CurrentBars[BarsInProgress] - swingHigh.CurBar);
double price =
Lows[BarsInProgress][LowestBar(Lows[BarsInProgress],
CurrentBars[BarsInProgress] - swingHigh.CurBar)];
CalcDnSwing(bar, price, swingLow.Update, swingHigh, swingLow,
swingCur, swingProp, dnFlip, swingLows, decimalPlaces,
doubleBottom, lowerLow, higherLow, doubleTop, lowerHigh,
higherHigh, gannSwing);
}
}
break;
}
}
|