2015-04-28 14 views
6

Próbuję zbudować klasę do stworzenia serii SAR. Ale wygląda na to, że nie rozumiem dobrze tych kroków. Nie jestem pewien co do początkowych wartości obliczeń.Analiza techniczna - Parabolic Stop and Reverse Indicator

Oto moja pierwsza próba:

public class SAR : IndicatorCalculatorBase 
{ 
    public override List<Ohlc> OhlcList { get; set; } 
    public double AccelerationFactor = 0.02; 
    public double MaximumAccelerationFactor = 0.2; 

    public override IIndicatorSerie Calculate() 
    { 
     SingleDoubleSerie sarSerie = new SingleDoubleSerie(); 

     bool trendUp = false, trendChanged = false; 
     double instantFactor = AccelerationFactor; 

     for (int i = 1; i < OhlcList.Count; i++) 
     { 
      if (OhlcList[i].Low > OhlcList[i - 1].Low) // uptrend 
      { 
       if (!trendUp) 
       { 
        trendUp = true; 
        trendChanged = true; 
        instantFactor = AccelerationFactor; 
       } 
       else 
       { 
        if (instantFactor + AccelerationFactor <= MaximumAccelerationFactor) 
        { 
         instantFactor += AccelerationFactor; 
        } 
       } 
      } 
      else if (OhlcList[i].Low < OhlcList[i - 1].Low) // downtrend 
      { 
       if (trendUp) 
       { 
        trendUp = false; 
        trendChanged = true; 
        instantFactor = AccelerationFactor; 
       } 
       else 
       { 
        if (instantFactor + AccelerationFactor <= MaximumAccelerationFactor) 
        { 
         instantFactor += AccelerationFactor; 
        } 
       } 
      } 
      else 
      { 
       // ? 
      } 
     } 

     return sarSerie; 
    } 
} 

Czy ktoś próbował zrobić tego wcześniej?

Oto plik CSV używam:

https://drive.google.com/file/d/0Bwv_-8Q17wGaRDVCa2FhMWlyRUk/view

Korzystanie z funkcji SAR w pakiecie TTR dla R:

table <- read.csv("table.csv", header = TRUE, sep = ",") 
sar <- SAR(table[,c("High","Low")]) 
sar 

uzyskać następujące wyniki:

[1] 160.03441 160.17173 160.30629 160.43817 160.71224 161.26890 162.04099 
[8] 162.75131 170.92000 170.92000 170.54080 170.17677 169.62316 168.76051 
[15] 167.58446 166.21112 165.00259 163.93908 163.00319 156.14000 156.14000 
[22] 156.60440 157.34394 158.03910 158.69255 159.54515 160.32954 161.05117 
[29] 161.71508 162.62857 163.70634 171.61000 171.61000 171.16840 170.74446 
[36] 170.11000 169.51360 168.95298 167.99674 166.85007 165.58046 164.46320 
[43] 163.48002 162.27322 160.96710 159.14602 157.44882 156.69000 156.69000 
[50] 155.45000 154.37200 153.53116 152.69088 152.33000 150.57720 148.81404 
[57] 148.50000 147.15600 146.69000 142.54000 142.54000 142.77480 143.00021 
[64] 143.45320 144.34254 145.16074 145.91348 146.60600 147.24312 147.82927 
[71] 148.51634 154.70000 154.70000 154.32640 153.71582 152.72495 151.29746 
[78] 149.67776 147.73347 146.06139 145.16000 135.79000 135.79000 136.17800 
[85] 136.91732 137.88153 139.05938 140.36506 141.51405 142.52516 143.63464 
[92] 144.74750 146.05295 147.79636 149.64516 151.08722 152.31909 157.25000 
[99] 157.25000 157.01640 156.64342 155.92234 155.00811 154.18530 153.10826 
[106] 151.91291 150.97000 150.97000 149.73000 141.55000 152.00000 152.00000 
[113] 151.42600 150.87496 149.98426 148.75272 147.23345 145.41384 143.40570 
[120] 141.21119 139.10317 137.37460 129.50000 129.50000 129.95600 130.39376 
[127] 130.81401 131.21745 131.60475 131.97656 132.33350 132.67616 133.00511 
[134] 140.90000 140.90000 140.51600 140.14736 131.30000 131.30000 131.88280 
[141] 132.44229 132.97940 133.78463 134.54155 135.25306 146.40000 146.40000 
[148] 145.91200 145.44352 144.99378 144.56203 144.30000 144.30000 134.20000 
[155] 134.20000 134.77000 135.31720 136.19217 137.01464 137.78776 138.86234 
[162] 140.21110 141.42499 142.75400 145.31544 147.51827 149.41272 151.04194 
[169] 152.44307 153.97217 155.62238 166.71000 155.00000 155.00000 156.25640 
[176] 157.46254 158.62044 159.73202 160.79914 161.82358 162.80703 163.75115 
[183] 164.65751 165.52761 166.36290 167.16479 167.93460 168.67361 169.38307 
[190] 170.06414 170.71798 171.34566 171.94823 172.52670 173.08204 186.41000 
[197] 186.41000 185.76880 185.15325 184.17625 182.88215 181.33994 179.37915 
[204] 176.40146 173.33403 170.37770 167.53616 164.83541 162.31171 160.39370 
[211] 160.21000 158.79640 157.72206 154.32000 154.32000 158.19000 158.19000 
[218] 157.90800 157.63728 157.15804 156.70756 156.08056 148.87000 148.87000 
[225] 149.21000 159.94000 159.94000 159.45480 158.98901 158.54185 147.81000 
[232] 147.81000 148.73760 149.62810 150.48297 151.30365 152.09151 152.84785 
[239] 153.57393 154.86310 156.66845 158.87660 160.86394 162.65255 164.26229 
[246] 178.75000 178.75000 178.12840 177.53166 176.95880 176.40885 175.88089 
[253] 175.37406 174.46361 173.60780 172.80333 172.04713 171.33630 170.66812 
[260] 170.04004 169.44963 168.89466 168.37298 160.20000 160.20000 160.55840 
[267] 161.20470 161.81221 162.38328 163.16062 163.87577 164.85119 165.72907 
[274] 166.98558 168.45060 170.01851 171.70358 173.08533 174.75427 175.32000 
[281] 181.43000 181.43000 181.01280 180.30463 179.40186 178.33568 177.62000 
[288] 165.30000 165.30000 165.83120 166.68733 167.94834 169.64251 171.16726 
[295] 172.88719 174.93998 176.70538 178.45652 180.68915 183.27132 185.10000 
[302] 186.80000 187.61000 193.60000 193.60000 193.24000 192.47860 191.12831 
[309] 189.88605 188.74316 187.69171 186.72437 185.83442 175.60000 175.60000 
[316] 176.09600 176.57216 177.02927 188.00000 188.00000 187.49840 186.63810 
[323] 185.82941 184.57346 182.83211 180.69826 177.99090 175.04036 171.99829 
[330] 169.50380 167.45832 166.25000 158.14000 158.14000 158.47080 158.78837 
[337] 159.09323 166.41000 166.41000 166.07360 165.54118 165.49000 165.49000 
[344] 164.99260 164.52504 157.20000 157.20000 157.74960 158.27722 158.78373 
[351] 159.26998 159.73678 170.94000 170.94000 170.41840 169.91766 169.43696 
[358] 168.97548 168.27735 167.37676 166.54822 165.44540 164.04915 162.17047 
[365] 159.91599 157.24012 154.03209 151.14523 147.32558 146.97000 146.46000 
[372] 135.23000 135.23000 135.81280 136.37229 136.90940 137.42502 137.60000 
[379] 149.80000 149.80000 149.28840 148.79726 148.32577 147.87314 147.43862 
[386] 137.01000 137.01000 137.52920 138.32485 139.07276 140.04054 140.74000 
[393] 140.74000 141.57440 151.17000 151.17000 150.69480 150.23861 149.30089 
[400] 148.41944 147.25948 146.19232 145.21054 144.30730 143.09657 141.39778 
[407] 139.53049 138.96000 128.06000 128.06000 128.60000 129.11840 141.56000 
[414] 141.56000 140.94400 139.99816 138.52631 136.65368 134.57604 132.74771 
[421] 130.71243 128.65284 125.90373 123.64946 113.38000 113.38000 113.57000 
[428] 114.21020 115.57498 131.27000 131.27000 130.51920 129.79843 129.10649 
[435] 128.44223 126.97210 125.01273 122.55746 120.34771 118.35894 116.56905 
[442] 115.65000 114.13100 111.84728 109.83761 108.06909 105.89642 104.02792 
[449] 102.42101 100.46245 97.78361 93.64689 89.05617 85.70000 72.78000 
[456] 72.78000 73.42240 74.42966 75.94568 77.75112 79.37600 79.79000 
[463] 94.00000 94.00000 93.41080 92.84517 79.27000 79.27000 80.01840 
[470] 80.73686 81.42659 82.46059 83.43256 83.45000 98.66000 98.66000 
[477] 97.85640 97.08494 96.34435 95.63337 94.38157 92.65264 90.09938 
[484] 87.15105 83.80491 79.85692 76.54061 59.13000 59.13000 59.92000 
[491] 61.35040 63.39197 65.27021 67.52819 70.48881 73.09415 75.38685 
[498] 76.31000 92.20000 92.20000 91.51320 90.85387 90.22092 89.30106 
[505] 88.43640 87.62361 86.54493 84.74443 82.38830 80.31490 78.49032 
[512] 77.87000 65.11000 78.53000 78.53000 77.98960 77.03742 75.80000 
[519] 60.22000 60.22000 61.05880 81.19000 81.19000 79.83880 78.54165 
[526] 77.29638 76.10093 74.95329 73.85156 73.64000 47.41000 47.41000 
[533] 48.68240 50.67246 53.72266 57.82139 62.28283 66.89823 70.86748 
[540] 75.72868 80.58532 82.22000 85.90820 89.72656 95.50672 101.43070 
[547] 107.19992 123.80000 123.80000 123.00800 104.00000 128.00000 128.00000 
[554] 125.84000 123.76640 74.00000 74.00000 76.14040 80.09198 83.80646 
[561] 87.29807 90.58019 93.66537 96.56545 99.29153 101.85403 104.26279 
[568] 106.52702 144.98000 144.98000 142.63320 86.31000 86.31000 89.32840 
[575] 92.22606 95.00782 99.41015 105.25334 110.62907 115.57475 120.12477 
[582] 124.31079 128.16192 131.70497 134.96457 137.96341 140.72233 143.26055 
[589] 145.59570 147.74405 149.72052 151.53888 153.21177 154.75083 156.16676 
[596] 157.89809 160.93432 163.60620 165.95745 168.02656 169.84737 171.44969 
[603] 173.48673 175.50005 186.83000 186.83000 186.24600 172.23000 172.23000 
[610] 172.94240 173.62630 174.28285 174.85000 190.04000 190.04000 188.52840 
[617] 187.07726 185.68417 184.34681 183.06293 181.91000 152.25000 152.25000 
[624] 153.46560 154.63258 155.75287 156.82836 157.86082 159.60977 161.25379 
[631] 162.79916 164.25181 165.61730 166.90086 168.10741 169.24157 187.01000 
[638] 187.01000 185.97800 184.98728 184.03619 183.12314 182.24662 181.40515 
[645] 180.59734 179.82185 179.50000 179.50000 178.76840 178.06606 161.21000 
[652] 161.21000 162.10800 163.47552 165.54308 167.94977 170.57180 173.64035 
[659] 176.73789 179.33983 181.52546 183.36138 186.07553 188.71043 191.44053 
[666] 203.39000 203.39000 202.84720 201.97137 201.14809 200.37420 198.69306 
[673] 196.62376 194.76138 193.08524 191.14421 187.77802 184.27914 180.21130 
[680] 176.87566 174.14044 161.68000 161.68000 162.47280 163.62943 164.71667 
[687] 165.73867 166.69935 181.75000 181.75000 180.99400 180.26824 162.85000 
[694] 162.85000 163.71680 164.54893 184.52000 184.52000 182.75000 181.05080 
[701] 179.41957 177.85359 176.35024 174.90703 173.52155 172.19149 170.91463 
[708] 169.68884 140.27000 140.27000 141.87040 144.23498 146.45768 148.54702 
[715] 150.51100 152.35714 154.09251 156.27471 158.28233 160.12934 162.28941 
[722] 165.16468 168.64163 172.16137 176.05092 179.24035 182.85428 188.38634 
[729] 193.28082 193.40000 193.40000 208.78000 208.78000 208.02520 207.30059 
[736] 205.93796 203.49652 201.25040 175.42000 175.42000 176.47440 178.01914 
[743] 179.47119 180.83612 182.11915 183.32520 184.45889 186.02218 188.32396 
[750] 191.53108 195.06733 198.10851 201.25915 203.90568 205.02000 217.80000 
[757] 217.80000 217.11360 215.90078 215.20000 215.20000 196.90000 196.90000 
[764] 198.12200 199.29512 200.42132 201.50246 202.54036 203.53675 205.08554 
[771] 207.41630 209.56060 234.22000 234.22000 233.06800 231.96208 230.90040 
[778] 229.88118 229.57000 205.42000 205.42000 206.80520 208.13499 240.05000 
[785] 240.05000 238.51080 237.03317 235.61464 201.57000 201.57000 203.28360 
[792] 206.12858 208.80287 211.31670 213.67970 215.80000 215.80000 250.70000 
[799] 250.70000 249.19200 247.74432 246.35455 245.02037 243.73955 242.50997 
[806] 241.32957 240.19639 239.70000 238.63200 237.60672 236.62245 235.67755 
[813] 234.77045 233.89963 233.06365 232.26110 230.97344 229.20036 227.05132 
[820] 224.22877 221.31834 218.38740 212.81147 207.51718 202.69320 198.13963 
[827] 193.86533 190.70234 187.28569 183.59998 181.01999 175.00000 183.70000 
[834] 183.70000 183.14360 182.23018 181.37157 180.56448 167.92000 167.92000 
[841] 168.43840 168.93606 169.41382 180.88000 180.88000 179.94000 157.38000 
[848] 157.38000 158.57480 160.49931 163.53937 166.33622 168.90932 171.27657 
[855] 173.45445 175.45809 177.81128 179.92916 181.83524 184.00181 186.76656 
[862] 189.61351 192.90148 196.71518 201.28784 205.42356 209.76463 213.59654 
[869] 216.35551 223.45000 223.45000 214.65000 214.65000 215.09480 215.52181 
[876] 215.93174 225.77000 225.77000 225.28680 224.52319 223.80540 212.56000 
[883] 212.56000 213.13360 214.16538 215.13526 216.04695 216.90393 217.70949 
[890] 218.98393 220.15642 233.64000 233.64000 233.04440 232.47262 231.92372 
[897] 218.75000 218.75000 219.35880 219.94325 220.50432 221.04295 221.56003 
[904] 222.05643 222.53297 222.99045 223.42963 223.85125 224.25600 224.26000 
[911] 233.97000 233.97000 233.52920 233.10603 232.69979 232.30980 231.65701 
[918] 230.60845 229.29261 227.61949 226.14715 215.35000 215.35000 215.80040 
[925] 216.23278 216.64787 226.61000 226.61000 226.10440 225.35054 223.97209 
[932] 222.13588 220.12638 218.35801 216.80185 215.43243 214.22734 213.16686 
[939] 212.23363 210.98153 209.90471 208.97865 203.29000 203.29000 203.64720 
[946] 203.99011 204.16000 212.22000 212.22000 211.74880 210.94007 210.17987 
[953] 209.16868 208.56000 207.67840 206.86733 206.12114 205.05903 203.69594 
[960] 201.75751 189.85000 189.85000 190.41000 191.60940 193.75025 196.35522 
[967] 199.52260 202.30988 204.76270 206.92117 208.82063 210.47000 222.75000 
[974] 222.75000 222.23480 221.48931 220.78855 220.12984 219.51065 218.92861 
[981] 218.19272 217.10245 216.12120 215.23808 207.29000 207.29000 207.81880 
[988] 208.32645 208.81379 208.84000 209.10000 209.55640 209.99454 220.51000 
[995] 220.51000 219.74960 219.01962 217.76444 216.17528 214.71326 

Oto kod źródłowy, który wykonuje obliczenia:

https://github.com/joshuaulrich/TTR/blob/master/R/SAR.R https://github.com/joshuaulrich/TTR/blob/master/src/sar.c

Każdy może pomóc mi tłumaczenia obliczenia do C#?

Dzięki z góry,

+0

mogłeś wywołaj kod R z C# za pomocą r.net – pm100

+1

@ pm100 Chcę zaimplementować obliczenia w języku C#, aby poznać algorytm. – anilca

Odpowiedz

7

Oto moje tłumaczenie:

public class SAR : IndicatorCalculatorBase 
{ 
    protected override List<Ohlc> OhlcList { get; set; } 
    public double AccelerationFactor = 0.02; 
    public double MaximumAccelerationFactor = 0.2; 

    public SAR() 
    { 

    } 

    public SAR(double accelerationFactor, double maximumAccelerationFactor) 
    { 
     this.AccelerationFactor = accelerationFactor; 
     this.MaximumAccelerationFactor = maximumAccelerationFactor; 
    } 

    public override IIndicatorSerie Calculate() 
    { 
     SingleDoubleSerie sarSerie = new SingleDoubleSerie(); 

     // Difference of High and Low 
     List<double> differences = new List<double>(); 
     for (int i = 0; i < OhlcList.Count; i++) 
     { 
      double difference = OhlcList[i].High - OhlcList[i].Low; 
      differences.Add(difference); 
     } 

     // STDEV of differences 
     double stDev = Statistics.StandardDeviation(differences); 

     double?[] sarArr = new double?[OhlcList.Count]; 

     double[] highList = OhlcList.Select(x => x.High).ToArray(); 
     double[] lowList = OhlcList.Select(x => x.Low).ToArray(); 

     /* Find first non-NA value */ 
     int beg = 1; 
     for (int i = 0; i < OhlcList.Count; i++) 
     { 
      if (OhlcList[i].High == 0 || OhlcList[i].Low == 0) 
      { 
       sarArr[i] = 0; 
       beg++; 
      } 
      else 
      { 
       break; 
      } 
     } 

     /* Initialize values needed by the routine */ 
     int sig0 = 1, sig1 = 0; 
     double xpt0 = highList[beg - 1], xpt1 = 0; 
     double af0 = AccelerationFactor, af1 = 0; 
     double lmin, lmax; 
     sarArr[beg - 1] = lowList[beg - 1] - stDev; 

     for (int i = beg; i < OhlcList.Count; i++) 
     { 
      /* Increment signal, extreme point, and acceleration factor */ 
      sig1 = sig0; 
      xpt1 = xpt0; 
      af1 = af0; 

      /* Local extrema */ 
      lmin = (lowList[i - 1] > lowList[i]) ? lowList[i] : lowList[i - 1]; 
      lmax = (highList[i - 1] > highList[i]) ? highList[i - 1] : highList[i]; 
      /* Create signal and extreme price vectors */ 
      if (sig1 == 1) 
      { /* Previous buy signal */ 
       sig0 = (lowList[i] > sarArr[i - 1]) ? 1 : -1; /* New signal */ 
       xpt0 = (lmax > xpt1) ? lmax : xpt1;    /* New extreme price */ 
      } 
      else 
      {   /* Previous sell signal */ 
       sig0 = (highList[i] < sarArr[i - 1]) ? -1 : 1; /* New signal */ 
       xpt0 = (lmin > xpt1) ? xpt1 : lmin;    /* New extreme price */ 
      } 

      /* 
       * Calculate acceleration factor (af) 
       * and stop-and-reverse (sar) vector 
      */ 

      /* No signal change */ 
      if (sig0 == sig1) 
      { 
       /* Initial calculations */ 
       sarArr[i] = sarArr[i - 1] + (xpt1 - sarArr[i - 1]) * af1; 
       af0 = (af1 == MaximumAccelerationFactor) ? MaximumAccelerationFactor : (AccelerationFactor + af1); 
       /* Current buy signal */ 
       if (sig0 == 1) 
       { 
        af0 = (xpt0 > xpt1) ? af0 : af1; /* Update acceleration factor */ 
        sarArr[i] = (sarArr[i] > lmin) ? lmin : sarArr[i]; /* Determine sar value */ 
       } 
       /* Current sell signal */ 
       else 
       { 
        af0 = (xpt0 < xpt1) ? af0 : af1; /* Update acceleration factor */ 
        sarArr[i] = (sarArr[i] > lmax) ? sarArr[i] : lmax; /* Determine sar value */ 
       } 
      } 
      else /* New signal */ 
      { 
       af0 = AccelerationFactor; /* reset acceleration factor */ 
       sarArr[i] = xpt0; /* set sar value */ 
      } 
     } 

     sarSerie.Values = sarArr.ToList(); 

     return sarSerie; 
    } 
}