public override List<ApiTicker> getTicker(List<string> pair) { List<ApiTicker> ret = new List<ApiTicker>(); ApiTicker demotick = new ApiTicker(); demotick.Ask = 202; demotick.Bid = 200; demotick.High = 204; demotick.Last = 201; demotick.Low = 199; demotick.NumberOfTrades = 1000; demotick.Volume = 10; demotick.VolumeWeight = 100; demotick.CorrectData = true; ret.Add(demotick); return ret; }
public void addToAllNewTicker(ApiTicker tick, DateTime dt) { Lib.Performance.setWatch("addallticks", true); if (dt < Lib.Const.NULL_DATE) { Logging.log("Skip addToAllNewTicker because Date < NULL_DATE", LogPrior.Warning); Lib.Performance.setWatch("addallticks", false); return; } else if (!tick.CorrectData) { Logging.log("Skip tick because correctData is not set true! " + tick.ToString(), LogPrior.Warning); Lib.Performance.setWatch("addallticks", false); return; } Logging.log("AddTickToAll: bid=" + tick.Bid + " ask=" + tick.Ask, LogPrior.Debug); foreach (KeyValuePair<int, CandleList> entry in candllist) { entry.Value.AddTick(tick, dt); } Lib.Performance.setWatch("addallticks", false); }
private void TickTimer_Tick(object sender, EventArgs e) { try { if (timercounter % 60 == 0 || timercounter % 60 == tryagain) { try { ApiTicker tp = kh.getTicker("XXBTZEUR"); if (tp == null) { List<ApiTrade> trds = kh.getRecentTrades("XXBTZEUR"); if (trds != null) { foreach (ApiTrade tr in trds) { ApiTicker tick = new ApiTicker(); tick.Last = (double)tr.price; tick.Volume = (double)tr.vol; tick.NumberOfTrades = 1; cm.archiveTick(tick); cm.addToAllNewTicker(tick, DateTime.Now); } } } else { cm.archiveTick(tp); cm.addToAllNewTicker(tp, DateTime.Now); } tryagain = -1; } catch (Exception ex) { Logging.logException("Failed to getTicker:", ex); if (tryagain == -1) tryagain = 5; } refreshTraderStatus(); } if (timercounter % 120 == 2) { kh.refreshPortfolio(); } if (timercounter % 600 == 5) { cm.saveToFile(Settings.getString(SettKeys.DATA_FILE)); } if (timercounter % 900 == 30) { ApiTradeHistory trd = kh.getTrades(); dgvTradeHistory.DataSource = trd.getDataTable(); dgvTradeHistory.Refresh(); } if (tabControl1.SelectedTab == tabDebug) { dgvDebugWatch.DataSource = Lib.Performance.getTable(); } else if (tabControl1.SelectedTab == tabHelp) { refreshMemoryStats(); } else if (tabControl1.SelectedTab == tabStats) { refreshPortfolio(); } if (Settings.HasChange) Settings.save(); } catch (Exception ex) { Logging.logException("Failed at Timercounter: " + timercounter, ex); } finally { timercounter++; } }
public void mergeNewTick(ApiTicker newapi) { this.Ask = mergeDoubleAvarage(this.Ask, newapi.Ask); this.Bid = mergeDoubleAvarage(this.Bid, newapi.Bid); this.Last = mergeDoubleAvarage(this.Last, newapi.Last); this.Volume = mergeDoubleAvarage(this.Volume, newapi.Volume); this.VolumeWeight = mergeDoubleAvarage(this.VolumeWeight, newapi.VolumeWeight); this.NumberOfTrades = (int)mergeDoubleAvarage(this.NumberOfTrades, newapi.NumberOfTrades); this.Low = mergeDoubleMin(this.Low, newapi.Low); this.High = mergeDoubleMax(this.High, newapi.High); if(newapi.Last > 0){ if (this.Low > newapi.Last || this.Low < 0) this.Low = newapi.Last; if (this.High < newapi.Last) this.High = newapi.Last; } if (this.Open < 0) this.Open = newapi.Last; this.Close = newapi.Last; _countMerged++; }
public ApiTicker clone() { ApiTicker ret = new ApiTicker(); ret.Ask = this.Ask; ret.Bid = this.Bid; ret.last = this.last; ret.Volume = this.Volume; ret.VolumeWeight = this.VolumeWeight; ret.NumberOfTrades = this.NumberOfTrades; ret.Low = this.Low; ret.High = this.High; ret._countMerged = this._countMerged; ret.Open = this.Open; ret.Close = this.Close; return ret; }
public Candle(DateTime dt, ApiTicker tick) { this.dt = new DateTime(dt.Ticks); this.value = tick.clone(); }
public Candle() { this.dt = DateTime.MinValue; this.value = null; }
public void AddTick(ApiTicker tick, DateTime dt) { if (dt < Lib.Const.NULL_DATE) { Logging.log("Skip addToAllNewTicker because dt < NULL_DATE", LogPrior.Warning); return; } DateTime normDate = getIntDate(dt); _lastTick = new Candle(dt, tick.clone()); for (int i = 0; i < _candls.Count; i++) { if (_candls[i].dt < normDate) { onNewCandle(_lastCandle); _lastCandle = new Candle(normDate, tick.clone()); _candls.Insert(i, _lastCandle); checkCandleCount(); return; } if (_candls[i].dt.Equals(normDate)) { _candls[i].value.mergeNewTick(tick); return; } } if (MaxCandels - 1 > _candls.Count) { _lastCandle = new Candle(normDate, tick.clone()); _candls.Add(_lastCandle); } }
public void archiveTick(ApiTicker tick) { string filename = string.Format("archiv\\ticks_{0:yyyyMM}.csv", DateTime.Now); string folder = Path.GetDirectoryName(filename); if (!Directory.Exists(folder)) { Directory.CreateDirectory(folder); } StreamWriter fout = new StreamWriter(filename, true); Candle c = new Candle(DateTime.Now, tick); fout.WriteLine(c.getCSVLine(1)); fout.Close(); }
public bool loadFromBitcoinChart(string filename, bool merge) { if (!File.Exists(filename)) return false; Logging.log("Start importing Bitcoinchart candledata from: " + filename, LogPrior.Debug); int countcandles = 0; StreamReader fin = new StreamReader(filename); if (!merge || candllist.Count <= 0) { this.generateNew(); } Logging.setForceLogPrior(LogPrior.Warning); while (!fin.EndOfStream) { countcandles++; string line = fin.ReadLine(); if (countcandles <= 1) continue; string[] csvs = line.Split(','); DateTime dt = Lib.Converter.toDateTime(csvs[0], DateTime.MinValue, "1970"); ApiTicker tick = new ApiTicker(); tick.Last = Lib.Converter.toDouble(csvs[1]); tick.Volume = Lib.Converter.toDouble(csvs[2]); tick.CorrectData = true; this.addToAllNewTicker(tick, dt); } Logging.releaseForceLogPrior(); fin.Close(); Logging.log(String.Format("Import Bitcoinchart Candledata finished ({0} candleListes and {1} candles)", candllist.Count, countcandles), LogPrior.Info); return true; }
public bool loadFromFile(string filename, bool merge) { if (!File.Exists(filename)) { Logging.log("loadFromFile, File not exist:" + filename, LogPrior.Warning); return false; } Lib.Performance.setWatch("loadFormFile", true); Logging.log("Start importing candledata from: " + filename, LogPrior.Info); int countcandles = 0; if (!merge || candllist.Count <= 0) { this.generateNew(); } StreamReader fin = new StreamReader(filename); Logging.setForceLogPrior(LogPrior.Warning); while (!fin.EndOfStream) { string line = fin.ReadLine(); string[] csvs = line.Split(Lib.Const.CSV_DEL); if (csvs.Length <= 3) continue; int key = Lib.Converter.toInt(csvs[1]); switch (csvs[0]) { case Lib.Const.IDS.CANDLE_LIST: if (candllist.ContainsKey(key)) continue; TimeSpan ts = new TimeSpan(Lib.Converter.toLong(csvs[2])); DateTime dt = new DateTime(Lib.Converter.toLong(csvs[3])); candllist.Add(key, new CandleList(ts, dt)); break; case Lib.Const.IDS.CANDLE_ITEM: dt = Lib.Converter.toDateTime(csvs[2]); if (dt < Lib.Const.NULL_DATE) continue; if (!candllist.ContainsKey(key)) { ts = new TimeSpan(0, 0, key); candllist.Add(key, new CandleList(ts, dt)); } ApiTicker tick = new ApiTicker(); tick.Ask = Lib.Converter.toDouble(csvs[3]); tick.Bid = Lib.Converter.toDouble(csvs[4]); tick.Last = Lib.Converter.toDouble(csvs[5]); tick.Volume = Lib.Converter.toDouble(csvs[6]); tick.VolumeWeight = Lib.Converter.toDouble(csvs[7]); tick.NumberOfTrades = Lib.Converter.toInt(csvs[8]); tick.Low = Lib.Converter.toDouble(csvs[9]); tick.High = Lib.Converter.toDouble(csvs[10]); tick.CountMerged = Lib.Converter.toInt(csvs[11]); if (csvs.Length > 13) { tick.Open = Lib.Converter.toDouble(csvs[12]); tick.Close = Lib.Converter.toDouble(csvs[13]); } else { tick.Close = tick.Open = tick.Last; } tick.CorrectData = true; candllist[key].AddTick(tick, dt); countcandles++; break; } } Logging.releaseForceLogPrior(); fin.Close(); Logging.log(String.Format("Import Candledata finished ({0} candleListes and {1} candles)", candllist.Count, countcandles), LogPrior.Info); Lib.Performance.setWatch("loadFormFile", false); return true; }