private void peak( kdata k, Func <kdatapoint, kdatapoint, kdatapoint, bool> cmp, Func <kdatapoint, sValue <double> > ret, crosstype confirmcross, PEAK_TYPE type, int distance, bool reconfirm) { var count = k.Count; for (var i = distance + 1; i < count - distance; ++i) { var j = 1; for (; j <= distance; ++j) { if (!cmp(k[i], k[i - j], k[i + j])) { break; } } if (j > distance) { Add(ret(k[i])); } } if (reconfirm) { confirm(k, confirmcross, type); } }
public PEAK(kdata data, Func <kdatapoint, double> f, PEAK_TYPE type, int distance = 5, bool reconfirm = true) { switch (type) { case PEAK_TYPE.low: { peak(data, (a, prev, next) => f(a) <= f(prev) && f(a) <= f(next), p => new sValue <double>(p.date, f(p)), crosstype.gold, type, distance, reconfirm); break; } case PEAK_TYPE.high: { peak(data, (a, prev, next) => f(a) >= f(prev) && f(a) >= f(next), p => new sValue <double>(p.date, f(p)), crosstype.dead, type, distance, reconfirm); break; } default: break; } }
public PEAK(kdata data, PEAK_TYPE type, int distance = 5, bool reconfirm = true) { switch (type) { case PEAK_TYPE.low: { peak(data, (a, prev, next) => a.low <= prev.low && a.low <= next.low, p => new sValue <double>(p.date, p.low), crosstype.gold, type, distance, reconfirm); break; } case PEAK_TYPE.high: { peak(data, (a, prev, next) => a.high >= prev.high && a.high >= next.high, p => new sValue <double>(p.date, p.high), crosstype.dead, type, distance, reconfirm); break; } default: break; } }
void confirm(kdata k, crosstype confirmcross, PEAK_TYPE type) { var crosses = new MACD(k.close()).cross(); var list = new List <sValue <double> >(); DateTime?lastcrossdate = null; foreach (var peak in this) { var cross = crosses.FirstOrDefault(p => p.value.Date >= peak.Date); if (cross != null) { if (cross.type != confirmcross) { cross = crosses.FirstOrDefault(p => p.value.Date > peak.Date); } if (cross.type == confirmcross) { if (lastcrossdate == cross.value.Date) { switch (type) { case PEAK_TYPE.high: if (peak.Value > list[list.Count - 1].Value) { list.RemoveAt(list.Count - 1); list.Add(peak); } break; case PEAK_TYPE.low: if (peak.Value < list[list.Count - 1].Value) { list.RemoveAt(list.Count - 1); list.Add(peak); } break; } } else { list.Add(peak); } lastcrossdate = cross.value.Date; } } } Clear(); AddRange(list); }