思维导图
sardine
  分支主题 1
  分支主题 2
  分支主题 3
  分支主题 4
  订阅redis
    core.TICKERINFO_PUBLISH
    core.ALLCANDLES_PUBLISH
    core.ALLMAX_PUBLISH
    core.ALLSERIESINFO_PUBLISH
  handler
    LoopMakeMaX
  main
  LoopSubscribe()
  allCandle
  allMaXAdd
  allTickerInfo
  allSeriesInfo
  CandlesProcessChan
  MaXProcessChan
  TickerInforocessChan
  SeriesChan
  LoopMakeMaX
  candle := <-cr.MakeMaXsChan
  candle.MakeMaX(cr, 7)
  candle.MakeMaX(cr, 30)
  candleList =cr.GetRangeCandleSortedSet(setName, count, lastTime)
  cr.MaXProcessChan <- &mx
    制作好了的maX对象扔进 maXProcessChan
  使用candleList 制造 mx
  candleList =cr.GetRangeCandleSortedSet(setName, count, lastTime)
  cr.MaXProcessChan <- &mx
    制作好了的maX对象扔进 maXProcessChan
  使用candleList 制造 mx
  CandlesProcess
  candle := <-cr.CandlesProcessChan
  candle.Process(cr)
  candle.SetToKey(cr)
  cr.MakeMaXsChan <- candle
    扔进制作maX的队列
  candle.InsertIntoPlate(cr)
    把这个candle存进“盘子”里
  cr.Mu.Unlock()
    解锁 cr
  pl, _ := LoadPlate(cr, cd.InstID)
    从redis取出当前盘子
  cr.PlateMap[cd.InstID] = pl
    更新本地盘子，此机制是为了防止程序死机造成的信息丢失
  Core
  PlateMap
    map[string]*Plate
  TrayMap
    map[string]*Tray
  Plate
  InstID
  Scale
  Count
  CoasterMap
    map[string]Coaster
  Coaster
  InstID
  Period
  Count
  LastUpdateTime
  UpdateNickName
  CandleList
    蜡烛图列表
  Ma7List
    Ma7列表
  Ma30List
    类似上面的
  Count
  LastUpdateTime
  Candle
    核心对象，蜡烛图节点
  List
    []*Candle
  Count
  LastUpdateTime
  MaX
    核心对象，MA节点
  List
    []*MaX
  if 盘子里没有垫纸(coaster)，那就初始化一个
    pl.MakeCoaster(cr, cd.Period)
      通过读取特定币种特定周期的sortedSet，可以初始化一个coaster对象
  如果redis里没有就初始化一个新的
  redisLocalCli.Set(keyName, dt, extt)
  if candle从rest请求来的
    这里的逻辑我没看懂，怀疑是无效代码
  po.RPushSample
    把sample推到coaster
  cr.SaveUniKey(cl.Period, keyName, extt, tsi)
  如果 这个candle key是第一次被设置
  把这个candle对象的key加到同InstID同Period的sortedSet里按照时间戳为score
  redis
    candle key
      "candle" + cl.Period + "|" + cl.InstID + "|ts:" + tss
      candle_refer key
        keyName + "|refer"
        用来判定对应的candle 是不是第一次创建
    candleData key
      cl.InstID + "|" + cl.Period + "|candleData"
      这个不知道有啥用
    candleList SortedSet
      "candle" + cl.Period + "|" + cl.InstID +|sortedSet
    allCandles|publish channel
    instId + "|plate"
    maX key
      "ma" + cstr + "|candle" + mx.Period + "|" + mx.InstID + "|ts:" + tss
      refer： keyName + "|refer"
    max SortedSet
      "maX" + ma.Period + "|" + ma.InstID +|sortedSet
    ALLMAX_PUBLISH channel
    ALLCANDLES_PUBLISH+suffix
    tickerInfo key
      ti.InstId + "|tickerInfo"
      ti.InstId + "|tickerInfo|snapShot|ts:" + tms
      fmt.Sprint(ti.InstId + "|tickerInfo|snapShot|last")
  MaXsProcess
  mx := <-cr.MaXProcessChan
  mx.Process(cr)
  mx.SetToKey(cr)
  cli.Set(keyName, dj, extt).Result()
  cr.SaveUniKey(mx.Period, keyName, extt, mx.Ts)
  mx.InsertIntoPlate(cr)
  cr.Mu.Unlock()
    解锁 cr
  pl, _ := LoadPlate(cr, cd.InstID)
    从redis取出当前盘子
  cr.PlateMap[cd.InstID] = pl
    更新本地盘子，此机制是为了防止程序死机造成的信息丢失
  if 盘子里没有垫纸(coaster)，那就初始化一个
    pl.MakeCoaster(cr, cd.Period)
      通过读取特定币种特定周期的sortedSet，可以初始化一个coaster对象
  如果redis里没有就初始化一个新的
  po.RPushSample
    这里的逻辑没看懂，怀疑是无效代码
  cr.AddToGeneralMaXChnl(mx)
    maX对象发布到redis channel，给可能的订阅者
  TickerInfoProcess
  ti := <-cr.TickerInforocessChan
  ti.Process(cr)
  cr.AddToGeneralTickerChnl(ti)
    发布到 redis channel，給可能的订阅者
  cd := ti.ConvertToCandle(cr, "1m")
    转化成1分钟维度的Candle对象
  cr.CandlesProcessChan <- cd
    对象扔进队列
  ti.SetToKey(cr)
  ti.MakeSnapShot(cr *Core)
    存到redis，当作snapshot，给后面计算做准备，可能没用
    发到writeLog队列
  CoasterProcess(&cr)
    coaster 是 盘子上的 垫纸，就像麦当劳餐盘里的垫纸一样，上面放置各种食品
  coa := <-cr.CoasterChan
  coa.Process(cr)
  代码的以下部分我觉得暂时可以不用解读了，我在一个新的迷你版sardine上实现上面的功能就足够了
  if cad.Period == "1m" && makeSoft
    cr.MakeSoftCandles(cad)
  cr.AddToGeneralCandleChnl(cad)
    发布到candles 的channel
      給可能的订阅者，不过sardine已经是订阅者了，下面没打算在进行二阶的订阅，所以这个意义不大
以当前candle的时间戳为起点倒推count个周期，取得所需candle用于计算maX
以当前candle的时间戳为起点倒推count个周期，取得所需candle用于计算maX
每个币种一个plate