public MovingAverage(WeSecPrices wsp, long secInterval, long secBound) { if (wsp == null) { throw null; } if (secInterval < 1L) { throw new Exception("MAインターバル=0"); } if (secBound < secInterval) { throw new Exception("MAインターバル長過ぎ!(期間より長い!)"); } if (secBound % secInterval != 0) { throw new Exception("MA期間はインターバルの倍数にしてね!"); } if (Consts.SAMPLING_MAX < secBound / secInterval) { throw new Exception("MAインターバル刻み過ぎ!"); } if (Consts.SEC_BOUND_MAX < secBound) { throw new Exception("MA期間長過ぎ!"); } //secBound /= secInterval; //secBound *= secInterval; // <-- check prms this.WSP = wsp; this.SecInterval = secInterval; this.SecBound = secBound; // ---- this.Denom = this.SecBound / this.SecInterval; }
private void executeArgs(bool keepAxY = false) { string args = this.Args.Text; try { args = StringTools.tokenize(args, "#")[0]; // ---- args -> vars ---- Queue <string> argq = new Queue <string>(StringTools.tokenize(args, ":")); CurrencyPair cPair = CurrencyPairs.All[CurrencyPairs.IndexOf(argq.Dequeue())]; long dateTime = long.Parse(argq.Dequeue()); if (DateTimeToSec.isFairDateTime(dateTime) == false) { throw new Exception("Bad dateTime"); } long secStart = DateTimeToSec.toSec(dateTime); long secInterval = StringToSec(argq.Dequeue()); long secBound = StringToSec(argq.Dequeue()); string sVisHigLow = argq.Dequeue(); long secMvAvgInterval = -1L; if (1 <= argq.Count) // 省略可能につき { secMvAvgInterval = StringToSec(argq.Dequeue()); } List <long> secMvAvgs = new List <long>(); while (1 <= argq.Count) // 省略可能につき { secMvAvgs.Add(StringToSec(argq.Dequeue())); } argq = null; if (secInterval < 1L) { throw new Exception("interval < 1"); } if (secBound < secInterval) { throw new Exception("bound < interval"); } if (secBound % secInterval != 0) { throw new Exception("期間はインターバルの倍数にしてね!"); } if (Consts.SAMPLING_MAX < secBound / secInterval) { throw new Exception("インターバル刻みすぎ!"); } if (Consts.SEC_BOUND_MAX < secBound) { throw new Exception("期間長過ぎ!"); } bool visHigLow; switch (sVisHigLow) { case "T": visHigLow = true; break; case "F": visHigLow = false; break; default: throw new Exception("Bad sVisHigLow: " + sVisHigLow); } //secBound /= secInterval; //secBound *= secInterval; // secMvAvgInterval ここでチェックしない。MovingAverage ctor に任せる。 // ---- //CurrencyPairs.FxCollect(); this.MChart.Series.Clear(); //this.MChart.Legends.Clear(); this.MChart.ChartAreas.Clear(); // ここから sec -> weSec に切り替えていく。 secStart = WeSec.SecToWeSec(secStart); double minMid = double.MaxValue; double maxMid = double.MinValue; WeSecPrices wsp = new WeSecPrices(cPair); List <MovingAverage> mvAvgs = new List <MovingAverage>(); foreach (long secMvAvg in secMvAvgs) { mvAvgs.Add(new MovingAverage(wsp, secMvAvgInterval, secMvAvg)); } if (visHigLow) { // 高値 { Series srs = new Series(); srs.ChartType = SeriesChartType.Line; srs.Color = Color.LightGray; for (long sec = 0; sec <= secBound; sec += secInterval) { double hig = wsp.GetPrice(secStart - sec).High; minMid = Math.Min(minMid, hig); maxMid = Math.Max(maxMid, hig); srs.Points.AddXY(-sec / 86400.0, hig); } this.MChart.Series.Add(srs); } // 安値 { Series srs = new Series(); srs.ChartType = SeriesChartType.Line; srs.Color = Color.Gray; for (long sec = 0; sec <= secBound; sec += secInterval) { double low = wsp.GetPrice(secStart - sec).Low; minMid = Math.Min(minMid, low); maxMid = Math.Max(maxMid, low); srs.Points.AddXY(-sec / 86400.0, low); } this.MChart.Series.Add(srs); } } // Mid { Series srs = new Series(); srs.ChartType = SeriesChartType.Line; srs.Color = Color.Green; for (long sec = 0; sec <= secBound; sec += secInterval) { double mid = wsp.GetPrice(secStart - sec).Mid; //double mid = cPair.GetPrice(DateTimeToSec.toDateTime(secStart - sec)).Mid; minMid = Math.Min(minMid, mid); maxMid = Math.Max(maxMid, mid); srs.Points.AddXY(-sec / 86400.0, mid); } this.MChart.Series.Add(srs); } Color[] MVAVG_COLORS = new Color[] { Color.Red, Color.Blue, Color.Purple, Color.DarkCyan, Color.DarkOrange, Color.DarkGray, }; for (int index = 0; index < mvAvgs.Count; index++) { MovingAverage mvAvg = mvAvgs[index]; Series srs = new Series(); srs.ChartType = SeriesChartType.Line; srs.Color = MVAVG_COLORS[index % MVAVG_COLORS.Length]; for (long sec = 0; ; sec += secMvAvgInterval) { double mid = mvAvg.GetMid(secStart - sec); //double mid = cPair.GetPrice(DateTimeToSec.toDateTime(secStart - sec)).Mid; minMid = Math.Min(minMid, mid); maxMid = Math.Max(maxMid, mid); srs.Points.AddXY(-sec / 86400.0, mid); if (secBound <= sec) { break; } } this.MChart.Series.Add(srs); } if (keepAxY) { minMid = LastAxYMin; maxMid = LastAxYMax; } else { LastAxYMin = minMid; LastAxYMax = maxMid; } LastStartWeSec = secStart; ChartArea ca = new ChartArea(); { double METER_SCALE = 1000.0; minMid = (long)(minMid * METER_SCALE) / METER_SCALE; maxMid = ((long)(maxMid * METER_SCALE) + 1) / METER_SCALE; } double axInterval; if (secBound < 86400L) { axInterval = 1.0 / 24.0; } else if (secBound < 86400L * 3) { axInterval = 1.0 / 2.0; } else if (secBound < 86400L * 25) { axInterval = 1.0; } else if (secBound < 86400L * 100) { axInterval = 5.0; } else if (secBound < 86400L * 250) { axInterval = 25.0; } else if (secBound < 86400L * 500) { axInterval = 50.0; } else { axInterval = 100.0; } ca.AxisX.Minimum = -secBound / 86400.0; ca.AxisX.Maximum = 0.0; ca.AxisX.Interval = axInterval; ca.AxisY.Minimum = minMid; ca.AxisY.Maximum = maxMid; this.MChart.ChartAreas.Add(ca); // ---- // 成功 this.Args.ForeColor = Color.Black; this.Args.Text = args; this.Args.SelectAll(); } catch (Exception e) { // 失敗 this.TTip.SetToolTip(this.Args, "" + e); this.Args.ForeColor = Color.Red; this.Args.Text = args + "#" + e.Message; this.Args.SelectionStart = 0; this.Args.SelectionLength = args.Length; } GC.Collect(); // 2bs }