先月は8万の損。
何だよクソが、人生始まってから負けてばかりじゃねぇかよ。
先月なんて事実上安値で売ったようなもんだ。クソが。
でもいい。
いや、よくないんだけど、それ以上にいいことがあったかもしれない。
そう、俺は遂に、遂に、
優良な新しいアルゴリズムの作成に成功したからだ!!
・
・
・
・
・
by 専業トレーダーになって1000万損した男の末路
考えることは同じだね・・・・。
そして時代は繰り返す。
現在のシステムトレード挑戦は人生で3回目(VBS→C言語→Protra・OmegaChart)です。
年毎の取引回数と総合利益を表示する
マネックス証券のトレードステーションでの自動売買が主流になりつつあります。
10年前は多くのソフトが存在しました。
- トレードステーション(日本語版)
- 最適分散投資の「イザナミ」
- Tactico (タクティコ)
- シストレ魂
- システムトレードの達人
- MultiCharts (マルチチャート)
- 株式投資ソフト「パイロン」
- Alpha Chart
- OmegaChart (提供中止)
- Fchart’s (エフチャート)
- Protra
- ストックナビ 2008
過去にはオープンソフトも存在していましたが、最近は存在しなくなってきました。
 
10年前から保守のみ継続のオープンソフト「protra」は機能が足りなすぎます。
バックテスト用と割りきっても、かゆいところに手が届きません。
たとえば、バックテスト結果に対して毎年の利益と取引回数が知りたいです。
資産が10年で10倍になる手法でも、資産の2倍負ける年があればシステムトレードを引退してしまう可能性があるためです。
今回はprotra自体を修正して使ってみます。
修正したソースコード
C#を読んで思い通りに修正するのは初めてです。
組み込み関数等はググれば分かります。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | --- ./Performance.cs	2017-06-25 17:15:56.994185200 +0900 +++ "protra-protra_trunk-r534/PtSim/Performance.cs"	2017-06-25 13:57:13.806673400 +0900 @@ -20,6 +20,7 @@  using System;  using System.ComponentModel; +using System.Collections.Generic;  using Protra.Lib.Config;  using Protra.Lib.Data;  using Protra.Lib.Lang.Builtins; @@ -47,6 +48,8 @@          private float _bookMaxPosition; // 時価の最大ポジション          private float _marketMaxPosition; // 簿価の最大ポジション          private float _totalProfit; // 総利益 +        private Dictionary<int, float> _allTradesYear;   // 各年のトレード数 +        private Dictionary<int, float> _totalProfitYear; // 各年の総利益          private float _winTotalProfit; // 勝ちトレード総利益          private float _winMaxProfit; // 勝ちトレード最大利益          private float _loseMaxLoss; // 負けトレード最大損失 @@ -67,6 +70,8 @@              _name = name;              _brandList = brandList;              _timeFrame = timeFrame; +            _allTradesYear = new Dictionary<int, float>(); +            _totalProfitYear = new Dictionary<int, float>();          }          ///  @@ -183,7 +188,7 @@                              realTotalBuy -= (totalBuy = (float)position * log.Price);                          else if (position < 0)                              realTotalSell -= (totalSell = (float)-position * log.Price); -                        EvaluateTrade(log.Order == Order.Sell, (log.Date - startDate).Days, realTotalBuy, realTotalSell); +                        EvaluateTrade(log.Order == Order.Sell, (log.Date - startDate).Days, realTotalBuy, realTotalSell, log.Date.Year);                      }                      if (position != 0)                          _runningTrades++; @@ -198,7 +203,7 @@              return realProfits;          } -        private void EvaluateTrade(bool isLong, int term, float totalBuy, float totalSell) +        private void EvaluateTrade(bool isLong, int term, float totalBuy, float totalSell, int year)          {              _allTrades++;              var ratio = isLong ? totalSell / totalBuy - 1 : 1 - totalBuy / totalSell; // 空売りは売りポジションが分母 @@ -206,6 +211,14 @@              _allTerm += term;              var profit = totalSell - totalBuy;              _totalProfit += profit; +            // 年度別のトータル資金 +            if(_totalProfitYear.ContainsKey(year) == true){ +               _totalProfitYear[year] += profit; +               _allTradesYear[year] ++; +            } else { +               _totalProfitYear.Add(year, profit); +               _allTradesYear.Add(year, 1); +            }              if (totalSell > totalBuy) // 勝ち              {                  _winTrades++; @@ -314,6 +327,19 @@                  _winTotalProfit / -loseTotalLoss,                  _bookMaxDrowDown, _marketMaxDrowDown,                  _runningTrades)); + + +            appendText(string.Format( +                "----------------------------------------\n" + +                "各毎の利益額\n")); +            // Dictionaryの内容をコピーして、List +            List<KeyValuePair<int, float>> list  = new List<KeyValuePair<int, float>>(_allTradesYear); +            list.Sort((a, b) => a.Key - b.Key);  //昇順 + +            foreach (KeyValuePair<int, float> pair in list) +            { +                appendText(string.Format("{0}年\t{1}\t{2:c}\n", pair.Key, pair.Value, _totalProfitYear[pair.Key])); +            }          }      }  } | 
実際の画面はこんな感じです。
やりたいことは実現できました。
少しずつテクニカル指標に対する理解も深まってきたので、いつか聖杯を発見したい!

 
  
  
  
  
