<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SPY &#8211; The Financial Hacker</title>
	<atom:link href="https://financial-hacker.com/tag/spy/feed/" rel="self" type="application/rss+xml" />
	<link>https://financial-hacker.com</link>
	<description>A new view on algorithmic trading</description>
	<lastBuildDate>Fri, 17 May 2024 10:12:15 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://financial-hacker.com/wp-content/uploads/2017/07/cropped-mask-32x32.jpg</url>
	<title>SPY &#8211; The Financial Hacker</title>
	<link>https://financial-hacker.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Undersampling</title>
		<link>https://financial-hacker.com/undersampling/</link>
					<comments>https://financial-hacker.com/undersampling/#comments</comments>
		
		<dc:creator><![CDATA[Petra Volkova]]></dc:creator>
		<pubDate>Sat, 08 Apr 2023 13:09:31 +0000</pubDate>
				<category><![CDATA[Indicators]]></category>
		<category><![CDATA[Petra on Programming]]></category>
		<category><![CDATA[Ehlers]]></category>
		<category><![CDATA[SPY]]></category>
		<guid isPermaLink="false">https://financial-hacker.com/?p=4673</guid>

					<description><![CDATA[All the popular &#8216;smoothing&#8217; indicators, like SMA or lowpass filters, exchange more lag for more smoothing. In TASC 4/2023, John Ehlers suggested the undersampling of price curves for achieving a better compromise between smoothness and lag. We will check that by applying a Hann filter to the original price curve and to a 5-fold undersampled &#8230; <a href="https://financial-hacker.com/undersampling/" class="more-link">Continue reading<span class="screen-reader-text"> "Undersampling"</span></a>]]></description>
										<content:encoded><![CDATA[<p><em>All the popular &#8216;smoothing&#8217; indicators, like SMA or lowpass filters, exchange more lag for more smoothing. In TASC 4/2023, John Ehlers suggested the undersampling of price curves for achieving a better compromise between smoothness and lag. We will check that by applying a Hann filter to the original price curve and to a 5-fold undersampled curve.</em><span id="more-4673"></span></p>
<p>The C code of the used Hann filter, straight from Ehler&#8217;s article:</p>
<pre class="prettyprint">var Hann(vars Data,int Length)
{
  var Filt = 0, Coeff = 0;
  int i; for(i=1; i&lt;=Length; i++) {
    Filt += (1-cos(2*PI*i/(Length+1)))*Data[i-1];
    Coeff += 1-cos(2*PI*i/(Length+1));
  }
  return Filt/fix0(Coeff);
}
</pre>
<p>The <strong>fix0</strong> function in the denominator is a convenience function for fixing division by zero issues.</p>
<p>We will now apply this Hann filter to the undersampled SPY price curve. Undersampling means: Take only every n-th price, and throw the rest away. We use the modulo operator to detect every 5th bar:</p>
<pre class="prettyprint">void run()
{
 StartDate = 20220101;
 EndDate = 20221231;
 BarPeriod = 1440;
 set(PLOTNOW);
 asset("SPY");
 vars Samples = series();
 if(Init || Bar%5 == 0) // sample only every 5th bar
   Samples[0] = priceC(0);
 else
   Samples[0] = Samples[1];
 plot("Hann6",Hann(Samples,6),LINE,MAGENTA);
 plot("Hann12",Hann(Samples,12),LINE,BLUE);
 plot("Hann",Hann(seriesC(),12),0,DARKGREEN);
}
</pre>
<p>The resulting chart:</p>
<p><img decoding="async" src="https://financial-hacker.com/wp-content/uploads/2023/04/040823_1254_Undersampli1.png" alt="" /></p>
<p>The blue line is the Hann filter of the undersampled curve with period 12, the magenta line with period 6. For comparison I&#8217;ve added the Hann filter output from the original curve (thin green line). We can see that the green line has less lag, but is also less smooth. Will using undersampled data improve a trading system? Well&#8230; I guess it depends on the system.</p>
<p>The Hann indicator and undersampling test script can be downloaded from the 2022 script repository.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://financial-hacker.com/undersampling/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>The Linear Regression-Adjusted Exponential Moving Average</title>
		<link>https://financial-hacker.com/the-linear-regression-adjusted-exponential-moving-average/</link>
					<comments>https://financial-hacker.com/the-linear-regression-adjusted-exponential-moving-average/#comments</comments>
		
		<dc:creator><![CDATA[Petra Volkova]]></dc:creator>
		<pubDate>Sat, 17 Sep 2022 11:51:05 +0000</pubDate>
				<category><![CDATA[Petra on Programming]]></category>
		<category><![CDATA[Indicator]]></category>
		<category><![CDATA[SPY]]></category>
		<guid isPermaLink="false">https://financial-hacker.com/?p=4496</guid>

					<description><![CDATA[There are already uncounted variants of moving averages. Vitali Apirine invented another one in his article in the Stocks&#38;Commodities September issue. The LREMA is an EMA with a variable period derived from the distance of the current price and a linear regression line. This ensures an optimal EMA period at any point &#8211; at least &#8230; <a href="https://financial-hacker.com/the-linear-regression-adjusted-exponential-moving-average/" class="more-link">Continue reading<span class="screen-reader-text"> "The Linear Regression-Adjusted Exponential Moving Average"</span></a>]]></description>
										<content:encoded><![CDATA[<p style="margin-top: 0pt; margin-bottom: 10pt;"><em>There are already uncounted variants of moving averages. <span style="font-weight: bold;">Vitali Apirine</span> invented another one in his article in the Stocks&amp;Commodities September issue. The LREMA is an EMA with a variable period derived from the distance of the current price and a linear regression line. This ensures an optimal EMA period at any point &#8211; at least in theory. Will this complex EMA variant beat the standard EMA for detecting trend changes? </em></p>
<p><span id="more-4496"></span></p>
<p style="margin-top: 0pt; margin-bottom: 10pt;">The LR_EMA indicator can be directly converted from Apirine&#8217;s MetaStock to C:</p>
<pre class="prettyprint">var LREMA(int Periods,int Pds,var Mltp)
{
  var Mltp1 = 2./(Periods+1);
  var LR = LinearReg(seriesC(),Pds);
  vars Dists = series(abs(LR-priceC()));
  var ST = (Dists[0]-MinVal(Dists,Pds))/
<span style="-aw-import: spaces;">     </span>max(MaxVal(Dists,Pds)-MinVal(Dists,Pds),0.01);
  var Rate = min(1.,Mltp1*(1+ST*Mltp));
  return EMA(priceC(),Rate);
}</pre>
<p style="margin-top: 0pt; margin-bottom: 0pt;"><span style="-aw-import: ignore;"> </span>The <span style="font-weight: bold;">max</span> and <span style="font-weight: bold;">min</span> functions prevent divisions by zero and EMA alpha parameters (<strong>Rate</strong>) above 1. This can otherwise happen at the begin of the backtest when price series are still flat.</p>
<p style="margin-top: 0pt; margin-bottom: 10pt;">The LREMA(20,20,5) and EMA(20) applied on SPY replicates the chart in Apirine&#8217;s article:</p>
<p style="margin-top: 0pt; margin-bottom: 10pt;"><img fetchpriority="high" decoding="async" style="-aw-left-pos: 0pt; -aw-rel-hpos: column; -aw-rel-vpos: paragraph; -aw-top-pos: 0pt; -aw-wrap-type: inline;" src="data:image/png;base64,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" alt="" width="628" height="363" /></p>
<p style="margin-top: 0pt; margin-bottom: 10pt;"><span style="-aw-import: ignore;"> </span>We can see that the LREMA (blue line) follows the price more closely than the EMA (red line). Which is not really surprising, because LREMA period is smaller at most places. But how good can the LREMA identify trend changes in a real trading system?</p>
<p style="margin-top: 0pt; margin-bottom: 10pt;">For testing this, we write a simple SPY system that concurrently trades with EMA, and with LREMA. A single position is entered when the faster EMA crosses over a slower EMA, and closed when it crosses back. The LREMA is used likewise. For not comparing apples with oranges, we optimize all time periods and test with walk-forward analysis. The code of this trading system in C:</p>
<pre class="prettyprint">void run()
{
 BarPeriod = 1440;
 LookBack = 200;
 StartDate = 2005;
 EndDate = 2022;
 assetList("AssetsIB");
 asset("SPY");
// walk-forward optimization setup
 set(PARAMETERS,TESTNOW,PLOTNOW);
 NumWFOCycles = 8;
// run a loop over the two algos
 while(algo(loop("LR_EMA","EMA")))
 {
  vars Signals1, Signals2;
  int Color;
// optimize time periods
  int Period1 = optimize(20,10,50,10);
  int Period2 = Period1*optimize(2.5,1.5,3,0.5);
  if(Algo == "LR_EMA") {
   Signals1 = series(LREMA(Period1,Period1,5));
   Signals2 = series(LREMA(Period2,Period2,5));
   Color = BLUE;
  } else if(Algo == "EMA") {
   Signals1 = series(EMA(seriesC(),Period1));
   Signals2 = series(EMA(seriesC(),Period2));
   Color = GREY;
  }
// trade on fast/slow crossovers
  if(crossOver(Signals1,Signals2)) enterLong();
  if(crossUnder(Signals1,Signals2)) exitLong();
// plot equity curve
  plot(Algo,ProfitOpen+ProfitClosed,LINE+AXIS2,Color);
 }
}</pre>
<p style="margin-top: 0pt; margin-bottom: 10pt;"><span style="-aw-import: ignore;">This script trades two different algos and compares the resulting equity curves.  </span>The fast and slow periods are optimized separately for both algorithms. The slow period is the fast period multiplied with a factor. This guarantees that the slow period is always bigger than the fast period during the optimization. The system must be first trained by clicking the [Train] button on the Zorro panel. After training, it automatically starts a backtest with walk-forward analysis.</p>
<p style="margin-top: 0pt; margin-bottom: 10pt;">Training and analysis take about 2 seconds. The resulting equity curve is plotted in a blue line for the LR_EMA algo, and in a grey line for the standard EMA algo:</p>
<p style="margin-top: 0pt; margin-bottom: 10pt;"><img decoding="async" style="-aw-left-pos: 0pt; -aw-rel-hpos: column; -aw-rel-vpos: paragraph; -aw-top-pos: 0pt; -aw-wrap-type: inline;" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnAAAAFpCAYAAAAcIhVtAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBD6fLggAAIABJREFUeJzs3Xl8VPW9//HX7Fsy2RcCJGyCIIuggCggiyiKerFuaKvi0uV2tZv310Xb3tp7H1qt9d6LdrEuaK1W26IoVkQWCfsi+04IAUIISSaT2WfO8vvjMEMCwQImTJbP8/HgkeTMmZnPSWaSN9/VpOu6jhBCCCGE6DTM6S5ACCGEEKIjUhSF8vJyrr32WsrKypg1axb79+8nHo8zbdo0evXqRZ8+fbj//vupqKhg48aNTJs2jdLSUm6++WYOHz7cbrUZAU7XSYQbqNi8hk+WLmfd9oM0RhX0poMsXbqUpUuXsmz5KrbuP0p97SEOVh8jnDAa7pT6PWw52ITabiUKIYQQQlx40WiUyspK7rrrLhYuXIjZbGbTpk3U19cTDodZtWoVlZWVvPTSSxQXFzN37lymT5/O2rVr6dWrF3PnzkXTtHapzQqAFuXwtg957oWPqIuAJbOYGx76GjOif+aWH6zh34bmoGsaGf1HM2lEBlWVZiZ94QuM7K2z+ZVn+Wvf7/HLMi+WdilRCCGEEOLCy8jI4Etf+hLV1dUsWLCAQCBAQUEBVVVVNDY2snDhQjIzMxk+fDhut5tgMMikSZMoKiritttu48UXXyQWi+Fyudq8NiPAKTHqqw8RHXQXv3pwDNGdyznqMkMEet3xS17+4VDCh9fz53kL8OVOYUzTUtZs30+P+m38vWkqX7+hP/Y2L611R44c4cCBAxfo2YQQQgjR1VVUVFBRUdHi2M9//vPU59FolFAohNvtprq6mmHDhnHfffdRU1PDypUr2bBhA9OmTcNisWC3G4nI6/USjUZRFKVdajYCnM1N7yHjGHVwFS8+tRSKRjHz9ixsfjj810eZvSMbNJ2sQRO4o19/Lh8YYOcLf+Axf2/u+Pb3KHO0S22tqq6uprq6mh49ely4Jz1HiUQCk8mE1WpNdyntKhaLYbPZMJu7/lDKcDiM2+1OdxntLhKJtMv/FDsaTdNQFCX1i7YrUlUVVVW79DUmxeNxLBYLFkvX7wfqLu/RC/07d+nSpZjNZsaPH9/q7f369eMb3/gGLpeL8vJybr75Zn74wx+iaRqbNm3i1Vdf5fDhw2iaRjweB6CpqQmXy9VuWcB4VLONgn6jueWOEg5X13Jk0yLeXVlKr1yNnMtuZvZd/TFZHOT3GkC/Hk4c5lFM6vMn1iduYHLvC5jeTsjLy2PAgAEX/HnPViQSwWw243Bc+O/NhRQMBnE6nV0+qAI0NjaSnZ2d7jLand/vJysrK91ltLtEIkE8Hsfj8aS7lHYTj8dRFKVb/McjHA5jtVq7RVjtLu9Rn89HTk7OBXu+3Nxchg4dyuzZs1scb2xs5K9//Stut5vJkyeze/duvF4v8+fPZ9WqVfzoRz+ipqaGQCBA79698Xg8LFmyhJ49e/L2228zaNCgdssCZgAlVEf5X37B3C0m+lwygmGlTvyhGAlVx9N/NJMmTeLqCeO4pG8BLgtgsuPNzqKwKA9bu5QlhBBCCJFeHo+HsrIyfv/73zNu3Dj27NnDrFmzmDBhAvv372f06NH89Kc/ZezYsVxxxRV88Ytf5P3332fMmDFUVlZy3333tVsvlRnA6sriouGXsfvxKRS5crnyl1VcOfIicjydozm6pKTkjP/8fv/JE4OVvPOnP/Gnd7cTanb/0K4Xubn5/QZcwYP/+xE1wTP1Wzex9o9fZeIlze5TOpjp3/ob2/cs4pcP3cS35nzMkdST6PzzsclMu/UV9p04Ulv+P8yY/B3e3Oc7q2tsOriCPzzyDBuDxtdq3Ubm/Ps0Lirryfivv0FFDNRgNR89/3UmDS5h4Pgv8Yel+wk1nx6sBdj+zpPNrvV+Xt9WQ3v0zj/22GNn/Jk8/PDDLU8+/j73nXLOJXc8woIdO3n/RzcwZPLjbEueqwfY9t6vufWeh3lzU+2Jg1W8fEsJ459YSeyzitIVGiqW8l93XcWAkv6Mu/NxluxvQDmxEmLs+Hp+983/Yk3A+Dp88BOefPBqBpb14fpvv8yucIsHw7/7Ax67exz9e5cwZPojfHxU5mILIURXYrPZuO6661i+fDlVVVXMnz+f4cOHU1JSwvz586mqquLTTz/lK1/5Ch6Ph9GjR7NkyRKqqqpYsGABvXv3brfaTnSh2ukx4jaeW34bz7W4+cdsvaL1Oxbf+BSPt1tZ5yoLaGzl+KVnd3ezg/5Tn+TZV79EX12haf9HPPFoOcsnDuWW4T2wmlq7Ux6znniPL147iqxmrfZNexaRX2xn7eEj1NQHKPFkQmQlqyr7MOLEObpyhLUrNC4fsoMlK6u4dUAOVnSUaJhwSMeVk4EtFdhV6jf/gyd++Ru2a7dzOYDuY9Wbb1E/+ocsffwSdj//IP/91kh+MbKSPYdzefitjQw5/Aa/3bSeKUNLGJBvjJfQoxGO61lcNWcRb90yhPbu4J01axYXX3xxi2OVlZWEw+HTTy79IYtWf5chLQ7W8D59GJ7xCe+vjzP0chtqUwP1tceozy07cY5ObMv7vN7rAaaUv8uKh8YyJc8CKIQbQmguN26nDbMJtFiQ3Vs+xTfjN6x+voytr/+Ufy7bwPAek2DvOzzz30+ysn4mIwG0WjYs2EHB9Cco/00fVjxxF09/cAd/vLXEeFqlmrXvHKTfzP9h9R8GUP/3H3P70x+x4qnpeNv6GymEEEKcouuPPj9HOmacxT0ps2nEggpn3qciQW3FVtauXsnKlStZtWY9u44ZwcTRbzDDAg0cPVZHTNPxL/8A/4SplJ54hkjlFjbYs5l6x31Ely1lR1gHEtTt28iiuSs4mmj+PAF2rDnC+O/9gpk9TxwK17DnaH/GXDqEgryeTLnrDhIrttLk9uJxR6naspEtB5rIyc7GaTs5Pk2JhWmo3Yuv4RCbV29g58E6oopGh9iKI1rF5pXG93LlytVs23eEYALAw+SbxlE+fy1hXcdf30DQZ2LAwALjflqA1fOWMHLm95hx0xE+XlxJTAdoYOPr/2TV1hriJy7Q7Mxm3Mzv8usvjSXfm02vXoNwuhzoJ77HV/zHr5lVeqIecyET/v1r3H/TAI7v2MzOOhf9ijJP1mvtybRHvsbsO0ZTkJFJj0EDuETVaPGjE0IIIdpJ1x99fjZ0lcDRjSx400a+rhCs3c+WnB7c2TMDc6utbwAxDqxfRO2+T7GbweT0csm/9eSOPMBWzPChIXYeOcaVl7hZtjDK1V8s5tA/j4AWYt+G3WR6+1B66WhueethXlp+F09fV0jx0Al8Yeipz5PNhK98h6aaNbyVPBSN4M9y0NdpNxJ4bj5FNTVELH0xx1S2ffwuW0w2Cic4wKyjAyZAM9vJz8rAu3ctb288RizzEu74yl1c0Tcbyxmv8wIJbePDv+oY0wSs9Bt7PbcUXQKAc/hkJn04j42+kRTXH+S4bRi9TzRzKbVreGvzCO7+Xi59s6cQeukD9lz3dYZ5Cxn/zTtbfSpdjVCzawVLt5kYNa0PGY4cJnzlO8SCm5h76snBQ6xY/Al7lX4MCTcQJRNniweLU79nBW98cIgr77iP3Db9pgghhBCtkwAHgE4i4uNoVSW1R3aw+qCZaQ/dwoiSrM8INhmMvWN2K12o2wErPYcN5eDKw9T0reBj2/X8IE/nEKD6q9iwcTfrDlcSqt9HsKGS955/j29PeYC+ZzsjxGbDHVVIKIrRehYM4Pfa8FVsp8oyjod/PYMevuU8/cwO9l81jB6ZeVgAR1YJE+/8ORN1jXjwEB888zjr90/l8rJs0j77Pu8GHvnt6V2oWwDsFzF9ymFeLT/EzbF9eIaPw3PoAJDg0IoPWBH1UfT7p1kS2E/Vnho+3nwbQyYUt7qwtJYIcvDTZXz0yW48o6cy/pISHJ+VXvNH8pWfDGf60qf45m8Xc/u199MneZsa5MC6D/mgfB/q6C9z/xX5pDsHCyGE6B6kCxXAZCW33zQe/MEP+I8f/5hv3zQI/+FKjofi5929aC0ayuVs5c25H1Nww+gTLUsK9Qd3cMxmZtj40Qws682of7ufa4/9ifd3hP7FIzbjKaSv+wg7dx+gMVDH5g8XErlsEPmahhIIE00oqPEEETS0VKLQCTfsZfFbc/hkXxPxeJimRidOe7qT29mwMfDaqdT841XK9+UzvO+JpR8iB1n2YYTp145nYK9eDBg4lqvGllH58Tpq4q08jBajZvtyFny4n4JxM7h+/HBy3dbWQ1fiOOv+8R4LV+zFHwnSUFNHwOtpNm4wRtXa93l/zWGKxt3KA9cNJlPSmxBCiAuki7TABYFJrRzfd/oh3zb+/upbzH/FY7TQTPouf7zuxG0mC+7Ci5gy4zpqn/sDry8q4QczR+KytZZz/Sz+/Y/48MWME5McnPS++BbunXVirTBrPqPHuHjiD314+jIv1AFxPxU7Y1jypjHrvpvp4zaDHmWkbylf/1s5Uy1udn4U5vKvX0fpZ80wsOQxevpINr3we772egPW4qv56k8vpS+ZDCr/Pb/5xt+I2IoZduNsLi7ysucv97Kk7xy+PDQDe6yGl3/2EE8lnPS59Ca+dnExrV5eG1i8eDGrV69ucSwajTJx4sTTTz72Bt+/tZzUilVlV/LQQ9em9ti19b2OsbZZ7C/9En2cxlzTpj0rWZs7im/cOYtLiz3oWoKjmzJ55e2lbK4cyoGFa4mMuZIJl/fGaYZE2M+ad5/lT39vonD9Ul6zmiiZ/g1+8cWJ5LpPeStYPOTnhlnw51/wx6f96JmDeeD715DZcIAli1/H1O8G9r8zj9eWHCZ38VJet5pxXfJlnvrP6RS36XdRCCGEOJ1J1888TL8jWrduHU1NTQwZcrKz7dChQ2c8v2fPnifXYNEUwk2N+AIRUlvLuvMo8Wr4GyGzIMNY105XCPt9RCyZ5GQ4MJtObVrRiAUaaGiKoKQeyITN7iU7x0bAH8Dh9pJhiVPTBAWFXixKhGB9HJPbhKbbyMh0pbpn1XA9xyIO8jwmYqfNQj3xjGqMUGMUe04WDjPoaowmn49AJIHFlUN+XgZWXSESaMQfjKCaHGRmZ5PpspFoqiZkKybHZSIRCdDYGCCmWXB5s8nJcGI2m86r6++zFvL1+XwEg8FW7+fxeMjNbTZaTA1zvLqeaPOTbC6yczKxhENo7iwyHCaCDTXEnYXkODSaInFMWoKYZiM704PNYgJ01ESUYCiE1e3FFIy0mIWqawqhxmP4Qic3FrZm5FKY5cZiNqFrcYINYey52TjMOloigr/RTyiqEIzp9O1bio04kZAfbJkoYT+B8MlWWpMjh+LCjE79v6LuskioLOTbtchCvl3PhV7I9+mnn251Id+OrDP/rUk563VWzFbc2fm4W1lQP7eg2RcmK+7sAtyH3+WLlz3MkmDzaJHJlK/+gh9/axZDep76KAY9A8xmE2aHl5LkiHerC29R69ufWNx5lJz4HetwtnoKZouDzLyTzXImi4Os/GJavI1NVtxZ+bhPeW87snqmuv7s7iwKTz2hHeTk5Jz9m8/ipqD3Gf7INFvBOiO3JPV5VkZrv6hNWGwusrJPfJ9zW55jMlvJyO1JxhlmGpjMdjLzk/cxYba5ySlwk4OxGrfDAmDH4z3xYnE5ycr7VxcnhBBCtL1OGeDMZvOF2fOu7Bbe2H/LOd/NbDZfuBrTyGQydZv9B5PX2tV1l+vUNK3Lv0ctFguapnXpa0xK/iy7w7V2l/fohb5O02k9bR1fpwxwGRkZFBYWpruMM/L5fFitVjIzM//1yZ2Ypmnk5OR0+T1fweii6civubYSjUa7xXVGIhECgUCXvtZQKEQkEiE/Pz/dpbS7uro6XC5Xl+4ST+ou79FgMHhBr7MzvnZkFqoQQgghRCcjAU4IIYQQopORACeEEEII0cl0yjFwHV1GRkanHBAphBBCiM5BAlw7sNnOdk8sIYQQQohzJ12oQgghhBCdTNcNcMc+5KtDenPbC3tbHG749A3um9SHnMKelPXtS9/SYvqNe4A3dwRP7s5wipWPj8DuyKVnn7707Wv8m/3k2xzc+DrXluRiMnn52Scx9Eg1//z1bPqZTFz98O/ZXXdiI6jEbn5+pYWew/+NuVsire6vGji8kt98fSYvrKvj0Ko/892ZlzOoXxmlvQcy4YE5fNoY4dD6l5g1wEVOcS/69OlNYZ9RPDBnJeH6Bcy+qITLv/EalVGVRN0Gnr3nGobe+J98+Op3uei2OeyPdaoNN4QQQgjxGbpugPsMOiP5+v+8x5Z9FezZ/FduCr7Jfz6/mIYz3sNOr0EPM2/nAQ4cMP69/MhtlHkBbGRlaXy8egtB/3F2Vm6nxuVqtum5TmDtK7y1NpdE7ADvL1pPk3rq46vsX/giC2tuYGKfY3zw2qtsz76d15ZtY8v7jzGw4i0Wbmo0Tu17Jf/+h4/ZvWs9c2fnMP+n/8si+w18/2c3El/xW155fwtrF73Dwr1W7nrwC4z7wr3cs+23PPHh8TMGVCGEEEJ0Lt0ywDVnshdQXKCjBSPEz3iWStC3ifdee5mXX36Zl1/+J+v31mE0auUydeo4KhetZFPNAQ7X+xg6cCCFyXY2rY6Pfv8Kx0bM5sGpeRxZuogtx099pqMsnvc+nhvG0c/hJCMvi1j9Dj5ZtooK52SeXbSE/5jUcs8mk9VDYXEBFnucaBQGzPgOX73MwT9//RP++8+rcV19O1+YcBGZnqFc+0ULb760kNo2/c4JIYQQIl266SSGwyz/2+/RdhZhCVSxhenceecYCj7jHkqikaMHD2K2ga5DzxExtAzjtiHTb+T4o39jcfkNBPwDGNbPRrKRTan8J8+8U824J+5mVk8PG361kpUbqhg9YwCpbU9jO6n41Mbwh3tjzXQx5Y4v49PfYsX8F1jzvoeeQ8Yz66E7KQGoP0D5G//HL9da2bv+ICNu+RpjcsFJf2bcey+Lv/pT1lpu5vEv3ED/PAcmoN/gsaj/u4WKOBR3/b2ehRBCiC6vmwY4B1n5ReRygFefm4dj9u+4b1Jfzjx31EJ24SS+/JPHGN18P/p9J269eCITi/6Dv/zBysUDRzOquIIKAGJsf/clVgRMDJv3NL+yVbJ330Hc5Wu4dWJ/BmSeWGokHiYaN5HpcYPJTvHQKTzYexjTKnaza+sSfv/TH/OL3KE8OxawOckq7EmfAcVcNOJahl5xFX0sxjUVDhjNmNFD8VlGcumgYuwnHt7tyYJ4hHgCkAAnhBBCdHrdNMAVMHziv3H/9UWMywjxxed+y2ufTOLH15ZwXlvn2gcz/Mo8/vtvxxhx93BKGyqoiAPBLfzt1R1c8q25PHtLL9Ca2D7odf6yZgWbKq6j34h8ow/bnUuWV8PXFCB6pJIXn3+NQz2n85W7rmZqXi1vNNWy/uiJMXDeHgybcgv33jzolMBpwmKx4XB6seHCbj25Dp2/vgZTwTCynAghhBCiC+jyY+A++tGU1MzR8V94kPl7Tow/M5mwZfZk3Dee5Icjq3j50f9i4aHEGR4lzuHdv2Xm4JOzUG/4f39iV2osm5NhoyeSlZPJqBEDONGzyvE17/FGVRl3z76TSZMmMWny9cy4aQI9A+tZvX4fjcqJEy2XMniizpo9lZgL+nDFqJ4cfP0HTBt5MUOu/A/2THqMOV8Zx/ltGR9j99ZPcE0fzaDzSqdCCCGE6GhMuq53qvUl1q1bB8Do0aPTXEnbOvjOT/n6cwU88d53GNqW6wDHV/LDnl8n74P1/L/L27bBtaamhpycHByO84uWnUllZSV9+vRJdxntrqqqitLS0nSX0e4ikQiBQIDCwsJ0l9JuQqEQkUiE/Pz8dJfS7urq6nC5XHg8nnSX0u66y3u0oqKCfv36XbDn+/nPf06fPn2YPXv2BXvOz6vLt8CdLcV/iLd/eWuqhS35r8+tf+TgBXj+gvF3cvuYlWzaHmrTx21aU86ye3/Ol9s4vAkhhBAifeSv+gnWrN7c9ujfuO3R9Dy/O28Ys3/5Zps/rnfCI6yd0OYPK4QQQog0kha4dhCLxUgkzjSeTgghhBDi85EA1w7C4TDRaDTdZQghhBCii5IAJ4QQQgjRyUiAE0IIIYToZCTACSGEEEJ0MhLghBBCCCE6GQlwQgghhBCtUFWV1atXM2XKFHJzc5k1axaVlZXE43F+9rOfkZeXx2WXXcb8+fNRFIXt27czZcoUsrOzuemmm6itrW232iTACSGEEEK0IhwOs337dm6//XZWrlyJ2Wxmw4YNrF69mg8++IDFixfz7W9/m4ULF7Jv3z5eeOEFrr32Wnbs2EFRUREvvfQSmqa1S20S4IQQQgghWpGZmcmDDz7IrbfeyqeffkooFCIvL48NGzYwYcIERowYwejRo8nIyGDr1q0EAgGuueYaiouLueuuu9i2bRuxWKxdauuUOzFEo1H8fn+6yzijaDSK2Wxut9TdUSQSCYLBYLdY807X9Q79mmsrmqZ1i+tMJBIkEokufa3xeLzLX2NSPB5H13UURUl3Ke2uu7xHgQt6nbFYjIULF9LY2Jg69vDDD6c+b2xspKKiAqvVSkNDA7W1tRQVFQHgcDiw2Ww0NDRgsVhwOByYTCaysrKIRCLt9rqUFjghhBBCiM8wcOBAHnnkEaZOncrSpUtxu934fD7A+A+EqqpkZWWhaVpqJ6ZAIIDT6cRqbZ+2sk7ZAud0OsnKykp3GWekaRpWq5XMzMx0l9KuIpEIGRkZOByOdJfS7nw+X4d+zbUVv9/fLa4zEomgaVqXvtZQKEQkEunS15iUSCRwuVx4PJ50l9Luust7tL6+/oJep8Ph4Nprr2X27Nktjjc1NTFv3jxcLhfjx4+nqqoKt9vNZZddxpNPPsnOnTvZsmULgUCAIUOGsGrVKsrLy+nVqxfvvPMOF110EXa7vV1qlhY4IYQQQohWOJ1OcnNzef7555k2bRo7duzgtttuY8KECQwbNoxbb72VOXPmMG7cOAYOHMjtt9/O/PnzmTJlCnv37uVLX/oSFoulXWrrlC1wQgghhBDtzWazMX36dK6++mpUVcVqteJyuTCbzTz55JPEYjHMZjMulwur1cq4ceP4+9//njrX7Xa3W20S4IQQQgghWmEymc44JMrlcuFyuVocs1gsF2z4lHShCiGEEEJ0MhLghBBCCCE6GQlwQgghhBCdjAQ4IYQQQohORgKcEEIIIUQnIwFOCCGEEKKTkQAnhBBCCNHJSIATQgghhOhkJMAJIYQQQnQyEuCEEEIIIToZCXBCCCGEEJ2MBDghhBBCiE5GApwQQgghRCcjAU4IIYQQopORACeEEEII0clIgBNCCCGE6GQkwAkhhBBCdDIS4IQQQgghOhkJcEIIIYQQnYwEOCGEEEKITsaa7gKEEEIIIRRFYdmyZRw/fhybzUZZWRkWiyXdZXVYEuCEEEIIkXZNTU3s27ePxsZGFEVhz549DB48ON1ldVjShSqEEEKItIvFYqiqSnZ2NoqisGXLlnSX1KFJgBNCCCFE2oVCIRRFITs7G4BgMJjmijo2CXBCCCGESLt4PI6maXi9XsxmM4FAAFVV011WhyUBTgghhBBpFw6HURSFnJwcMjIy0DSNQCCQ7rI6LAlwQgghhLigdF0nGo22OBaNRlFVFY/Hkwpw0o16ZhLghBBCCHHB+P1+6uvrWb58OZFIJHU8Go2iKAoZGRnk5OSgKArHjx9PY6UdmwQ4IYQQQlwQjY2NfPjhh3zwwQds2LCB9evXp25r3gLXs2dPEokEVVVVaay2Y5N14IQQQgjR7g4dOsSyZcuoqKjAbDYzZMgQVq1ahclkYsyYMUSjURwOBw6Hg6ysLDIzM6mpqeH48eMUFBSku/wOR1rghBBCCNHu6urqOHr0KGPHjuWee+6htLQUTdPYvHkzc+bMYc+ePWRmZmI2m3E4HMyYMYPa2lrKy8sJh8PpLr/DkQAnhBBCiHYXDAZRVZUePXpQWlpKVlYWiUQCv99PMBhEURQcDgcmkwmTyURhYSEWiwVN07Db7WmpWVVVysvLueyyy7BYLIwfP54dO3agKArXXXddqtYZM2awZ88e9u7dy8SJEzGbzdx00000Nja2W20S4IQQQgjR7pIhLScnB5PJRGZmJpqmkUgksNlsWK1WYrEYuq4DYDKZcDgcqKpKIpFIS81NTU2sWbOG++67j4MHDzJy5EjeeustamtrCQaDVFZWous677//PqWlpfzud79j2rRpVFVVkZOTwwsvvJC6nrYmY+CEEEII0a5UVSUYDKLrOllZWQCprtJYLIbL5UJRFJqamlLLi5hMJux2O4qioChKWurOycnh+9//PgCJRIIBAwYQCoU4dOgQwWCQXbt2ceTIEcrKytB1Hb/fz6xZsygpKeGee+5h7ty5RKNRXC5Xm9fWKQNcLBbr0Iv7xWKxtL3YLiRFUQiHw8Tj8XSX0u50Xe/Qr7m20l0WzozH4yQSiS59rbFYrMtfY1KydUbTtDRX0v4663s0FAoRCARwOBzE43ECgQDRaBS3200sFiMrKwuv10soFMLn82G1WgmFQlitVuLxeLt2RYLxO6G8vLzFsdmzZ6c+j8VirFq1ih07dnD33XdjtVqZMGEC//jHPzh27BjDhw9n6tSpWCwWnE4nJpOJnJwcIpFIu+WBThngNE3r0AEp+UukI9fYFnRd7/LX2Fx3udbucJ2qqnb516+qqh3+d2Vb0TQNVVW7xbVCx3yPhkIhTCYTTqcTs/n00VmBQIB4PE5ubm7qdanrOi6XC5/PR0FBAWPHjsVisQDg8/nQNA2Xy0U8HiccDpORkdFu9WuaRl1dHZWVla1e2+LFi1m0aBFTpkzh8ssvx+12M2rUKFRVZd26dbz22mscOHAg1SWcvJ/D4UhdU1vrlAHO5XKRk5OT7jI+k9VqJTMzM91ltKtYLIbX68XhcKS7lHbn9/s7/GuuLQQCgW5xnZFIpMtfaygUIhKJdOlrTFJVFZfLhcfjSXcp7a7A8d7SAAAgAElEQVSjvW51XefAgQNs2LABTdO47rrrUpvRN9fY2IimaeTl5ZGTk4PNZsNisaR+ZhkZGeTn56fO9/l85OTk4PV6OX78OE6ns12v2+l0MnPmzBatbmC0zH3yySd89NFHXH/99UycOBG3282SJUtYu3YtDz30EKFQCEVRKCoqwuVysWbNGkpLS1mwYAH9+/dvt7+RnTLACSGEECL9fD4f69ev59ChQ8TjcebNm8fdd9992qzR5HAbr9eLyWQCjDFuFosFs9ncaitVcgxcOltX6+vrmTt3LsuWLWP9+vXY7XamTZvGzJkzWb58Oe+++y5Op5Obb76ZsWPHYrfb+fWvf82rr75KTk4OTz31lLTACSGEEKLjUFWVqqoq9uzZw5AhQ6irq6OpqanVWZdNTU2psW7JAAdGSDObza12u3aEWagFBQU888wzLfZt9Xg85Obm8uKLLxKJRLBarWRnZ+PxeBg/fjyDBw9OTcxo3qrY1iTACSGEEOKcRaNRDh48SE5ODkOGDGHjxo3U1dW1GuCCwSCxWIyCgoJUWEu2wOm63up9krNU0zkL1Wq1Ulxc3OptRUVFpx2z2+306NGjvcsCZB04IYQQQpyjRCJBbW0tlZWVFBYWUlxcjNlsJpFI8MQTT9DU1AQYY+R2797Nzp078Xq9eDyeVAucpmmpdd9am0HcEVrgOjIJcEIIIYQ4Jzt37mTu3Lk0NjbicDgIhUKEQqHU7Q0NDYAR9I4cOUIwGGTatGnk5uamztE0jWg0mpq5eWqI6wjrwHVk0oUqhBBCiHOyYcOG1OdWqxWHw0G/fv2IRqPU1dWxZ8+e1LIf1dXVlJSUkJ+f32KsW/OWt0QigaIoLSY/SAvcZ5MAJ4QQQoizVltbS3V1NS6Xi0gkgq7rZGdnM3nyZCKRCA0NDaxZswaTycTFF19MY2MjZWVlpy3z4na7GTt2LPX19fTu3fu02ZrJdeV0XScej6NpWquTHborCXBCCCGE+JfC4TArV67k8OHD6LrOgAED2Lp1K9FolGg0SkZGRqqrU9M0ampq6N+/f2orKZvN1uLxHA4Hw4YNO+PzmUym1B6p8XgcVVUlwDUjAU4IIYQQn6mpqYmlS5eydetWFEXhuuuuSy2t0TzAAakZpZFIBFVVicfj2O3281oPzWw2Y7fbU12sp4bA7kyirBBCCCE+UyQSoba2lvz8fCZMmMDIkSNTG7Q3X4hXVdXUsUQikdoSy+l0nneAs9lsKIqSemxhkBY4IYQQQnymSCRCIpGgsLCQCRMmYLPZGDt2LGPHjm1xXrIL1WQykUgkaGxsxGq1YrPZWizge7YsFkuqBU4CXEvSAieEEEKIz+T3+4lGo2RnZ39mEEtOajCbzTQ1NbFx40YSicR5zyI9tQtVnCQtcEIIIYRolaIoNDY2Ul1dTSwWO20pkOaSs0XBaDlTVRWn00mvXr3OuJvBv2K1WnG73am9VMVJEuCEEEII0arGxkY+/PBD9u3bB3DaXqbN6bpO//79yc/PJyMjg1AoxMCBA8nPz6egoOC8nt9iseB0OmlsbJS14E4hAU4IIYQQLei6TmNjIytWrODIkSOp406n84wBzmw2M3ny5NT9k8uHfB42mw2Px0MkEpEWuFNIgBNCCCFEC7quc/DgQTZt2tTieDQaRdf1fzkhwWQyfe7wBkYXajLAxWKxz/14XYkEOCGEEEK0oGka9fX1px1PTlI4nxml58NiseByuVBVlaNHj+JyuXA6nZjNZjRNIx6P43Q6SSQSmEwmMjIy8Hq93WLBXwlwQgghhGhB13Xq6urIy8tj0qRJ9OrVCzC2v7pQ4Q1IPZeqqqxbt45PP/20xfOfGibNZjM33ngjAwcOvGA1pkvXj6hCCCGEOCe6ruP3+3G73ZSUlJCdnU12djZ2u/2CBjgAr9dLXl4eLpcLh8NBbm4u+fn55Obm4nK5UpMmvF4v8Xicv/zlL1RUVFzQGtNBWuCEEEII0UIsFqOhoYHS0lLcbndaa+nXrx/f/OY3z+rchQsXsm7dutR2Xl2ZtMAJIYQQooUdO3YAUFZWhtPpTHM1Zy8/Px+LxdJi5mxXJQFOCCGEEC3s3bsXl8tFaWlpuks5JwUFBVit1m4R4KQLVQghhBAA7Ny5k9raWo4ePYrH4yE/Pz/dJZ2TnJwczGYzx44dS3cp7U4CnBBCCCE4evQoy5cvp6GhgVgsRmZmZpus5XYhuVwu7HY7Pp+PSCTS6eo/F9KFKoQQQnQzDQ0NvPzyy/zjH/9IdTfu3r2b+vp6LrroIoBONfYtyWKxkJmZiaZpNDY2prucdiUtcEIIIUQ3U1lZycGDB3E6nfTo0YOioiJqamrQdZ2pU6dy9dVXd8oAB1BYWEhlZSUVFRXE43ESiUTqWiKRCA6HA7PZTDgcTs2wbWpqSmfJ50UCnBBCCNGNfPTRR6xcuRIARVE4fvw4f//739m9e3eq29ThcKS5yvOXk5MDwKJFi876Pp9++inDhw9vr5LahQQ4IYQQoovTdZ1QKMSRI0dYt24dVqsVRVFQVZXt27ej6zoZGRmYzWb27dvHJZdcku6Sz1v//v3JysoiNzcXu91OIpFIjYULhUK4XC7MZjOBQIDMzEwAtm/fns6Sz4sEOCGEEKKLi8fjvPPOO+zbtw8wxrcpioKu68RiMQoKCrj55ptTW2Z1ZgUFBTz88MPndJ9t27a1UzXtRyYxCCGEEF2cz+cjHA6TnZ3N0KFDUVW1xe09evTA6/WmqTpxPqQFTgghhOjimpqaiEajXHTRRVxzzTV4PB7C4TDbtm0jMzOTAQMG4PF40l2mOAfSAieEEEJ0cQ0NDUQiEQoLC7FYLEyfPp0rr7wSk8lEQUEBxcXFWCyWdJcpzoEEOCGEEKILU1WVxsZGEokERUVFmM0n//Truo7FYpHw1glJgBNCCCG6sFAoRDAYxOv14na7MZlMqdt0XU9jZeLzkAAnhBBCdGFNTU0Eg0Fyc3Ox2WyAEdyCwSBAajkRcTpN01i1ahWTJk0iNzeX6dOns2vXLlRV5amnnqKoqIhx48axaNEiNE1j//793HDDDeTm5jJr1iz8fn+71SYBTgghhOiidF2noaEBv99PTk4OVqs1dTwSiQBGF6uiKOkss8NqbGxk8eLFzJgxg02bNtGvXz/efPNN1qxZw6uvvsr8+fOZPXs28+bNo7Kykueff57LL7+cTZs2oes6L774Yru1csosVCGEEKKLikQiVFVVEYvF6NevX2pLKV3XCQQCqc+lK7V1ubm5/OQnPwGMlspLLrkEn8+XapUbM2YMbrebyspKNm3ahM/n484776RXr148+OCDvPbaa8RisXbZlqxTBrh4PE4oFEp3GWcUj8dRVbXFQNGuSFVVIpFIt/ifW3IV865O07RucZ3xeBxFUbr0tcZisS5/jUmKohCLxdJdxgVxru/R2tpaamtrKSgowOVytWh1i0ajqc8jkUiHe61cyHoSiQQbN24kOzs7dWzmzJmpz+PxOBs2bGDz5s3ceeedfPzxx/Ts2RMAl8uFzWbj+PHjWK1WnE4nJpOJ3NxcwuFwi71Y21KnDHCKoqRehB2RoihompbuMtqdqqqpP4RdXfPuhq6su1ynqqqpP1pdlaIoHf53ZVtJ/g7qDr93z/U9GgqFiEajeL1eNE1rcd+SkhLGjh1LVlYWTqezw71WLmQ9iUSCXbt2tWh4SQa4cDhMeXk5CxYsYPz48YwZM4Z169alWjATiQSappGRkYGu66nXYzgcxm63t9sM304Z4NxuN/n5+eku44x8Ph9WqzW1x1pXVVNTQ1ZWVqfe9PhsBYPBDv2aayvhcLhbXGckEiEQCHTpaw2FQkQikS59jUl1dXW4XK5usRDtub5HkxMVPB4PeXl5LXZbyM/P5+KLL27zGttCU1PTBX3tut1u7r77bmbPnt3ieDweZ+XKlbz//vtMmjSJa665hoyMDEaMGMGzzz5LRUUFu3btIhgMMmjQIFavXs2GDRsoKyvjo48+om/fvtjt9napuVMGOCGEEEL8a4qikEgk2rUlqCtraGhg7ty5LF++nN27d/PKK69w9dVXc/fdd9OzZ08eeugh3G43t9xyC4MHD2bGjBnMmTOHt99+G6vVyq9+9avUxJG2JgFOCCGE6KKSM0xtNpsEuPOQm5vLY489lmrJBMjJySE/P5/HH3+c2tpaHA4HJSUluN1uJk2aRL9+/QiHw2RmZlJWVtZutUmAE0IIIbqoeDxONBpNDbQX58ZutzNgwIBWb+vRowc9evRocczpdDJw4MALUZqsAyeEEEJ0RbquSwtcFyYtcEIIIUQXEwqF8Pv91NfXY7Va220clkgf+YkKIYQQXUx5eTmrV68GjG49CXBdj3ShCiGEEF1ILBZj69atqU3rnU5nt1juqbuRACeEEEJ0IUeOHCEajZKfn4/ZbJYA10VJgBNCCCG6kKNHj2K1WunRowd2ux1N07rFLhXdjXSKCyGEEJ1UPB5n3bp17NmzB0VRUFUVr9eL2WzG6/Wi6zqxWKzb7BXbnUiAE0IIITqpY8eOsX37dmpqatB1HTC2FnM6nTidThKJBKqq4vP5UFVVlhLpQiTACSGEEJ2QqqpUV1dTU1OD1WpNjXfz+/1YLBZGjBjBVVddle4yTxMMwuHD8Oqr8NhjIMPzzo8EOCGEEKITCoVCHD58mMLCQm644QZKS0tZuHAhq1atwmKxkJGRke4ST3PgANxzD2zeDDk5Rnj7yleguBhUFfbvh3gcKivtlJWBNBiemQQ4IYQQopPRNA2fz0dNTQ1FRUV4vV6A1NIhHXHW6fHjcP/9sHcvXHkl9OwJzz5rhLSf/MS4/Z57oKoKamp6sXYtjB6d7qo7LpmFKoQQQnQy+/btY926dYRCIVwuVyqwJQNcR1y4t7wc9uyB66+Hl16Cq68GXYfkBNmjRyEchrw84+uXX05frZ1Bx/sJCyGEEOKMysvL2bx5M3V1dZhMJtxudyrAJScymM0dr33m4EGIRmHsWKPLtLDQ+NrnM273+SAWg4sugu3bje5UcWYd7ycshBBCiDPauHEj9fX1uN1uLBYLDoejQwa2Ux09agS0fv3AZIKiIqMFrr7eGPfW0GDcPnCgcf7Bg+mtt6Pr+D9xIYQQQgCQSCTw+/2YzWbcbjc2m63FeDdVVVt87EhqaloGOIcDPB6j2zQSAb/fCHLFxVBQoBAMQl1duqvuuCTACSGEEJ1EOBxG0zTyTgwUs1gsLca7KYrS4mNHEYkYLW1OJxQUGMesVvB6obra6C6tqzO6VHv3hrIyBUWBI0fSW3dHJgFOCCGE6AQSiQTr1q0DjMV6w+EwZrO5RfdpRw1wdXUQCkGvXieXBolG4dAhWLnSWA9u/XpIJIzlRfr2jROPyzi4zyIBTgghhOgEli1bxtGjR/F4PJSWlhIOh1FVtUVYi0ajgBHgkhMaOoK6OmMB39JSSObNoiJ46CHo3x8WLYJ584xQV1oKkyeHCYfhk0/SW3dHJrNQhRBCiE4gMzMTs9nMVVddRf/+/Vm8eDFOp5OsrKzUOQNPzADweDxomtZhts46dswIcKNGnQxwxcXw/PNGC9y3vgUbN0JWFmRmwoQJETweWLXKuG9RUXrr74gkwAkhhBCdQHV1NYqiUFxcTGFhIbNmzTrtnFGjRjFq1KgLXlssZnSNnmn5uepqY5LCwIGn765QWgqDBxsBLjfXuN3t1vnud+GZZ+CPf4Svf924TZwkXahCCCFEB7dt2zYqKyvRNI3CwsJ0l9NCTQ387nfwyivQ1NT6ObW1Rgtc796nB7jCQmPtN7vdGP+WvP2ee4xZqatXG5MgREvSAieEEEJ0YDU1Naxbt47s7GwGDRqEx+NJd0kphw/Db38Lc+caAWzvXvj5z43ZpkmxmNECFwq1HAOXZLcb3akZGca6cElWK5SUXJjr6IykBU4IIYTowGpra/H5fJSVlTFgwIB0l9PC3r3wxhswYgS43bBkCTSfAKso8Oqr8Prr8N3vwqBBxhpwp/J6jTXh9u8/uTODzWbsl9rUZCzyK1qSACeEEEJ0QKqqsn79eubPn08gEKCgoAC73Z7uslL8fli82Gg1mzkTysqMFrnk3qZgzD5ds8YIdzfcANnZrT9WaanRldrUBFu3GsfMZuP8WMxovRMtSYATQgghOhhFUfD7/Rw9ejS1TEgsFuswS4MoClRWwoIFRuvbNdcYLWjV1cZM0mSL2ZEjsGkTXHEF9O3beusbwFVXGevA6TrccYdxzGYzulCrq2HtWuMxO8jldwgyBk4IIYToYMrLy1m2bFmLY7W1tS2WDEmnDz+EG280Pr/nHqPVLRg8efuBA8as0XjcaD3LzgaX69yew2YzWuYOH4bvfMcIgvffDwMGQI8ebXctnZW0wAkhhBAdiKZpbNq0KfW1y+WipKSE3NzcDrNp/Z//fPLzzExjwsHAgUY3qslkhC4wwltdHeTlGS1058Juh7FjYcoUY+zc3LkwcSI8/njbXUdn1jFeCUIIIYQAwO/309TUhNvtxmKxUFBQwI033sgVV1yBzWZLd3k0NBg7JCSX+7BYjA3qn3sOHnjAaDnz+YxWuUDAGNeWn3/uLXAWixHYPv4Y/v3fT95/w4a2vZ7OSgKcEEII0YEcPHgQq9VKWVkZGRkZBAIBwuFwussCYN8+ePppY3eE0aONY8HgyUkGWVlGC5zPB6oKjY1GEEu20rWFWKxtHqezkzFwQgghRAeyb98+bDYbQ4cOZcSIESiKQkFBQVprisdhzhz44ANjYd377jO6RVevNkJaY6OxFEjzAJdIQH29sb5bRsbne/7mkxcaGz/fY3UVEuCEEEKIDiIej7Nv3z4cDgcDBgzoMMuG1NTAO+8YLXClpfCzn8Fbb51+ntd7MsDFYnD0qBHqzrR8yNlKJE6uLycBziBdqEIIIUQH0dTURCwWIy8vr8OEN4CqKiOUDRsG774LvXrBQw8Zs01/97uTOyY0b4FTFGOtOLfb+Pd5NA9wqvr5Hut8hMNh5syZw7x584jFYqiqyr333kufPn3o06cP999/PwcOHKCyspI77riDfv368eCDD9J0pr3F2oAEOCGEEKID2LNnDy+++CIA7s+beNrY8ePGWLehQ43dEUwmo7WtTx9jAd7k+LZkgGtsNLpdjx0zjn2e1U/icWMiRDLABQKf/3rORUNDA0888QS//OUvOXr0KLquEwgEqKioYMmSJVRWVvLSSy/Rs2dP5syZQ//+/VmyZAkNDQ28/PLL7VaXBDghhBCiA9i3bx/xeByAaDSa5moMqmosA7JnjxGcevc+fS/T5nr1MiYtLFtmrBO3aZPRffp5ApyqGpMgysqMj3D+W2spChw6ZCxzcujQv27N0zSNiooKnE4nM2fOJPNEAUeOHCEajRIOhzl06BBNTU3U19fT0NDALbfcQu/evfnqV7/Khg0b2u1n2SnHwCmKQiQSSXcZZ5RIJNA0rUPX2BZUVSUWi6E13zeli9J1vcv/PKH7XGc8HkdV1S59rd3hGpNUVSUej3eYNdLOl9/vT/0+jUQirf7sLvR7tKrKzKOP2njrLeN7W1AQIxbTWux32pzbDYMHm6mtNVFdbaa21soVV6iYzQkikXPbRqH5dX7ve8a/e++1849/mKmtjeFynfu2DFu3Wrn5ZivFxRo1NWbee0/hkksUFEVh165dLF26NHXupEmTMJvNXH755QwbNoxnnnkmdZvf76dnz5488sgjBINBpk+fzuTJk7FarbhcLkwmE/n5+YRCIRKJBE6n85xr/Vc6ZYCLRqMELnQb6jmIx+OYTCbUdHTUX0CKohAOhzv9L82zkWwy7+o0TesW16mqKolEoktfq6IoqKrapa8xKRlWE4lEuks5b6qqthgvFQ6H8fv9p/1+bav3qN8P8+YZ3aBjxhjdoqc6dgz+8Acbn3ySCZgxmyEzM0IoFD/jllgAzz9vpbraxqZNVh591Mrx4wqHDoVwu8/tb2Lr1+nFZHLg84XIzT23x9M0eP55Nz6fhbvvTvD88w5eeSXOo4+GiMVirFq1ipqamtT5kyZNOuNjXXnllcybNw9FUVixYgWvv/46JSUl6Lqe+tsfjUax2+1YkgvmtbFOGeAyMjIoLCxMdxln5PP5sFqtqabWrqqmpoacnBwcDke6S2l34XC4Q7/m2kpVVVW3uM5IJEIgEOjS1xoKhYhEIuTn56e7lHZXV1eHy+XCc65L/XcQqqqybds2QqEQFosFRVHQNA2v13vaWLi2eo9u2ACPPGIEt1/9CkaOPLUmWLEC/u//Th4zmaCwMJvCwjPvaQrGmLhLLzUW7/3pTyEYdGAyOTiXsoPBYKvXWVBgdOGaTHktHu/AAWN7r5oaY7utsrLTH1NVja7TeByuvtrJc8+BxeKhsNCDx+PhoYceYvbs2WdV37p169i+fTszZ87EarVit9vJzc3FbrezefNmysrKWLJkCWVlZe02GaVTBjghhBCiqwiHw+zYsYNAIIDJZOKqq66iR48e7bbrwl//Cr/5jfF5Y+PJba+aU1VjyZBTjzU2GmuyfVaASyorg5deMvZEHTDg89cNxhg4i+X0MXCffAK/+IUR4Pr0gdZymMVycj25/Hzj8/Mdnmaz2XjzzTdZsGABiqIwevRoRo8eja7rvPTSS7z33ntEIhF+9rOfYW2rFYxPIQFOCCGESKN4PE4ikaCgoIApU6bQp0+fdhkzBbB7Nzz6KFRUJJ8bWtvkQVWNc/v2NTaSHzHCOD5s2NmFN5MJiotbD1KfRzLTnpjrkXLsmLF0CcDBg63fNxo11qZzuYx9WXWdM47lO/15bdx99904HA7sdjtDhw7lySefpL6+HqfTSZ8+fSgqKmLq1Kn06tWLpqYmcnNzGTx48Pld6FmQACeEEEK0sXg8zpo1a9iwYQPDhw/nyiuvPGMoSyQSqKpKZmYmvXv3bpfwpijwta/BggVGK5XXa4yDSyRaD3CaBpWVRkvV1VcbXaIdgdttdKGeurxaJHJyi63WWhTB2O5LUYxZsV6vEeCSW4D9K2azmdLS0hZfDxs27LTzPB4Po0aNOrsH/Zy6/uhzIYQQ4gKLxWJ8+umn+P1+qqurP3PiQTQaJRaLkZmZ2W4D3isrYdcuY2eE5l2gJtPJlqnmVNVYvNfl+vy7KLSlZN3NQ2c8bgQ4u90Id2dqgQuFjMCanW1066rqhV9Tri1JgBNCCCHaWCAQwOfzYTKZSCQSKM366nRdJxwO09jYmFpmQlVVHA4HprPpnzwPBw8aXYz33Wd8zMoydk8wmYxAp5+yIseqVUaAGzbMGFPWUVxzjRG+/ud/To5fCwSMa8rJAYfjzGvEBYNGC1xW1sm17DrzKljShSqEEEK0sZqaGmw2G06nk2g0mlqgF+DYsWMsWrSIyspKBg4cyIABA1AUBafT2W4BrrLSCDlDhxrdkJWVsGMHTJ1qBKFoFJr33P7tb0YgmjixXco5b6NHw9ix8PbbRsicPNloPYxEjG7RSOSzu1ATCejR42QXamvdx52FBDghhBCijR07dgy73U5WVhbhcLhFC9wnn3xCZWUlWVlZhEIhjh07Rjwex+PxtMu6mqpqTFpoajJa1JKTIq1WyMg4GeAAPv0Utm6FRYuMlqoxY9q8nM8tJ8f4mFz2LxIxWte8XqM1LrmN16mrdzQfAwfG9Z/LRIaORgKcEEII0cbq6uqw2+1kZ2fj8/laBLjkAuher5f6+vpUF2t7daH6fEarVFYWlJae7D60WIwAF4sZAa62Fv7zP42JDqpqzDxNblLfkSSXHk2O2wuHjXCam2t8ffy4EVgvvrjl/ZqPgQNjfJ+qnj6jtbOQMXBCCCFEG6urq8PpdJKXl5daJiQpEAig6zqxWIxAIMCxY8dIJBLtFuCOHDFmnl50kdF9mmSxGOuqJVvgPvwQVq6Eyy4zgo3JdHorVkeQ3Fe1sdH4mOxCzc6GwYONmrdtO/1+zcfAgdFlrGmnT+DoLKQFTgghhGhDwWCQYDBIjx49yM7ORtO01L7RZrOZSCSCoigcP34cILX/qd1ub5cAV1UF1dVw+eVGq1NSsgs1EjEC3PLlRmvdr35lrAHX2m4GHUGyBS0Z4BobjVa34cONnSVsNmMHiE2bjHAWDhvdrnv2GC11BQXG/ex2I8B11l0vJcAJIYQQbaihoQGTyYTX68Vms2G1WonH4y0CXGZmJg888AB79+5l0aJFqKqKxWJp8wAXCkF5ubGEyMMPt1wSxGQ6uavBd78L69YZQefSS+HKK43bOqJTA5zfD3V1RuDMyDCua/duY7eJ5Axbs9kIa/H4yTXtMjKM8BaJpOc6Pi8JcEIIIUQbqq6uxmKxkJ+fj8PhwOl0EgqFUBQltdG5y+UiOzubrKwsHA4H8Xi8XSYwVFQY+56OHm10jTbvErVYjB0Jtmw5eSwUgp07jQDXUSUDnN9vfEwuI+J0wuuvG8dnzICHHjJaFkMh47Y5c4yZq8kxdGZz60uodBYS4IQQQog2VF9fj8Viwev1po6tWLGCUCjEyBO7xidvs9ls2O12FEU579a3ZICx2YyN5Ju3nIXDxu15eS27T8EY/3bVVbB6NRQVwTPPdOzgltR8DFwgYGxkn5MDvXsbY/has2vXyWVS/vlPGD/emLUajXbepURkEoMQQgjRhg4fPozFYiEvL6/F8QMHDnDgwAGAVGubxWJJbVqvn0dTUCQCzz1ndAtefz3Mnw+HDp28PTnAPze35QQGMFrfvvUtY024NWs6R3iDll2o4bCxu0RR0cnlRVrj8cDIkca2YEVFxrHk5vYyBk4IIYTo5vbu3UttbS05OTlkZmbi8/lSkxTC4TBLly4FjFmqjY2NWCwWLBbLeYU3MLo733/faInasgVuvRXuuANeeMEILckA53af3Ai+s2se4JqajBa44uKTy4i0pndvePrplsc8HuMxznY/1I5GWvhBl3YAACAASURBVOCEEEKINrJo0SI0TeOqq67C6XSiKEpqF4bmS4mEQiEOHDiAyWTCbDafV4CLx42Fd/fsgVtugcceM1rR3ngDNm48eU4ywHXEJUHORzLA7d9vBNWdO43Zp8nZpWfL4ejc68BJC5wQQgjxOYXDYdatW4fP58PpdKbGuimKQiKRwGQyoes6FouFG2+8EbPZTI8ePVKhTtf1cw5xdXXG0h+F/5+99w6P6j7z9u/pTb0iJFSQEAiLamwMBuOGsWN7bcd9k7hk3zjJbrKbOMlmf7vJxnHKvtl11k7i3byJndhOsVPcu8GAsemmCyQESAj10aiPps+c+f3xMCMJJIyEJBB87+uaa6TR0ZnvmXY+85TPkwVf+YqMvXK7peu0qUm28XgkSuVwnD8CLlYDV18Pv/iF1LHl5kJGxsj3o3zgFAqFQqG4gHE6nVRUVBAKhdA0DZfLRVpaGn6/H03TMBqNRCIRTCYT82M+FkBTUxOapsXTrCOhu1uK80tKRMCACDXoFyWxMVMpKSc3MUxWzGb44x/FnLivT2rali7t7y4dyX6UD5xCoVAoFBcw7e3tBI6rpkgkQl1dHRkZGcybN4/S0lIqKirYunXrSZ2mscibpmkjisBVVcHvficiZu7c/qhUXp5cNzbK1AGvV2rfHI5z19dtNNx5pxyfpokhsXEUasZsliaGAZntSYUScAqFQqE4L/F6vfj9ftJOVd0+RnR0dBAIBLj99tspLy+P326xWLBYLCQlJQ3ZrKDT6dDpdPFpDdFo9LTsRGbP7v85LU0sMWI/g8wz/c535Ofk5H4LjfMFk+nMmzKsVom+TVYBp5oYFAqFQnHeoWkahw8f5tVXX6Wurm7QMPnxuK++vj4ikQhZWVnDbjNUhC0cDsfXFhu39Uno9RJNy86W5oSsrP76tlgkbu9emUgAEn07X9KnY0lyskTx+vrO9kpGhxJwCoVCoTjv6O3tZceOHTQ0NPDWW29x8ODBQV2gY0lfXx8ejwe73Y51mFBXbEzWUAItJuxOR2QGgzrsdqn3ysiQ64HiLNah6fdLV6ZeLwLvBEs6BfJYhULKRkShUCgUinMCTdNob2+no6ODhIQEent72b9/P75xGnrZ3t5OX18fU6dOxThMMVYsLRo4oeUxJSWFOXPmMG/ePDIzMz8xfdrYaMTjEfGmaRJ5G6gZYwLOZoPFiyX6ptfLRTGYlBSJwE1WAadq4BQKhUJxXuHz+di8eTMJCQmUlJRQXV1NWlpafOLBWBEKhTh27Bi7du3C7XYzZ86cYe8j1p0aiUTw+/3xSF1ycjLLli07rftzu+GFF6TYLRiUi14/uIA/JuAsFpk8sHGjpAgnq0gZT1QETqFQKBSKcwiPx0NdXR3Z2dkUFBSg1+vjQ+THErfbzc6dO6mqqiIQCDBlyhQMx1s9/X7485/hgQekWzQYNMbHZwVH6RxbWQmvvupg7ly47DLo6JAauISE/m1iNXBWK5SWio2I0ym+cKNwKjmvmew1cCoCp1AoFIrzCrfbjdFoJCkpCbPZjMFgIBwOj8pr7VT09fXhdDoBmW1qsVjiIq2nR4bDb9smP3//+yXcdVca4XAYR8ysbYTs3y/+brfeKsLwn/5JBFxxcf82sWiSwQBXXy2D23U6KCzsb2pQCAMjcJOxyUMJOIVCoVBMerq7u3nxxRfp6uoiHA7HBdVAm47REAgE2LBhA5WVlcyZM4cVK1bE69x8Ph/d3d1Afyeqpmno9XpcLti5M7Y20DQ7eXn24e7mtNi2TSJql18ORUVyOZGkJJkNajDIfNCcnDO6y/OagTVwI53icC6gUqgKhUKhmPRUV1fT2tqKyWTC4/FgMBhISEjAaDRiMBgIhUKjmjfq8Xjo6Oigp6eHysrKeCo2GAzidDoxGo3xujefzxcXivv3S21aZqaIrjOdt7lrF2zZIvspLR1+O4NBom3TpqmI2ydhNEqTRyAgKe/JhorAKRQKhWJSE41GcTqdhMNh5syZw/r169HpdPH0qdFoJBgMjioKN9Cn7cTb+/r6SElJYdWqVRQPzGMCFRUiDnJzJQLndo/68Ni5E/7xH2VofUFBiMLCsW3GuFDR66V+0O+fnI0MKgKnUCgUiklNZ2cn7e3t5Obmctlll8U7PCORSNyWYzTRN5AUqv94eMbv98f3E4lEcLvdWK3WIb3fKiqkPi0nR8TBaCI80agMrN+wQQa3f/GL8OabLaM6DsXwHDrUn+6eTCgBp1AoFIpJSSQSoa2tjcOHD+PxeJg5c2Y8dRoMBmlvb8dgMMSbGEYj4gZG4GJGwJqm4XQ6aWtrw2q1YhuiAr6mBlJTZeRVT8/JEZ5du+DVV2HHjuGHqQcC8Oyz8I1vyGzTOXPOv5FYZ5PYHNQjR2RyxWRDpVAVCoVCMSnp7e1l/fr1HDx4EICMjAz0ej0Oh4OOjg46OjqIRCLo9fpR18CFw+F43VssBRsOh/nggw/o7OwkISHhJHPe3l5pJFi2TDpEg0ERcJomabv33oPvfU+idKtWwVNPnTwpoboaXn4Z1q7tv81mU3VtY0lKCvz7v4sdy2SMwCkBp1AoFIpJRzgc5tixY9TX16PX69E0Da/XSzQaZenSpcyaNYvk5GSMRiNGoxG32z2qGrhgMBj3bYsJuY6ODlpaWigoKGDhwoXY7YO7S48ckahaQYEMlzeZJAoXConB7m9+A3v2iLhrbxePthMF3DPPwE9+Mvi2lhbpmlSMDYmJYsUC8MgjZ3cto0EJOIVCoVBMOjweD/v27SM1NZWSkhJSU1PJz89Hp9NROqBNs7e394xsREKhEMFgEIPBQCQSIRgM0tDQgNlsZubMmcydO/ek/9m7V0RbcbE0MiQlQWenpEQtFujqkm7RzEzZ9re/hYcfhvz8/n289Vb/zwsWwIMPSrRujIdJKE4Tv9/Pm2++SWZmJkuWLMFoNPLSSy/xl7/8hZycHB544AEWLFhAS0sLTz75JFVVVSxatIivfe1ro/b9+yRUDZxCoVAoJhXRaJSOjg4aGxvJy8ujrKwsLuJOnCWq1+vjNiJn0oWq1+vR6XT8/ve/p7a2FpPJRMYw5mFVVTKjtKBAatYSEiStGrMSOXZMInTd3XJ57TWZshCjuVkK6xMS5P+Tk2H5crEPOT7oQTGB9PT08Jvf/IZHHnmE6upqNE3j0KFD/OxnP+Pmm28mIyODv/71r7S0tPC73/2Ovr4+HnroIT7++GNefvnlcVuXEnAKhUKhmFRomkZjYyNms5nMzMz4+KqhiBn5jqb+LTa3FEQ0RqNR2tvbaWpqik96GIqdO8VjLDdX0nQpKeBy9XeiulxSQB/7vbVVInQxNm4UoXbxxVL3duyYjMNSTDyaplFZWUlDQwMXX3xxvGFl06ZNlJWV8bd/+7fcdNNNaJrGnj17OHz4MHfddRcrV67k/vvvZ8OGDSfVSI4VkzKFGo1Gx2Wu3VihaVp8aPH5TDQavSCOE87919xYcaEcp6Zp5/2xns/HGAqFqK+vJyEhgczMzFN+Fun1evR6PcFgkEgkMqLHIxAI4PF4sNvtRCKReDeqx+MhLS0Nk8l00v68Xj1bt+pIT48yY4ZGS4sOm01HWxt4PFEikSjd3QYKC6McOKDx8ss6HnpIR2Oj/N1qjfLaa3psNlixIkpvb5QjR0TEBQIXznsUmNDjjEajeL3e+GQNgJSUFPR6PUuWLGHhwoU8/vjj8QhvXV0dM2bMwGg0kpycjNlspqGhIf67wWBg2rRpdHV1EQwGsVgsY77mSSngent7aWk5d71wYi8695k4N04CQqEQ7e3tJ6Uszkei0eg5/ZobKyKRyAVxnLEvWefzscaOcby+/Z9NWlpaqK2tpbi4mGg0isfjwefz0dPTc9K2kUiEQCAQn5wQswI5HTweD+3t7ZjN5vjj6HA48Hg8RKNR3G43Xq930P/ceGMmXq+FG24IEYm04fcbsduTaWzUU1XVRXt7BMjFbg/T0uIkFLKSlJRCTY2Po0fd2O0aa9ZMwWbTcdNNLr7whf6uBZfrwnmPAhN6nG63m2eeeYZf//rX8dv27Nkz7PZGo3GQrQyAyWSKf5kASb8bjcb4fNyxZlIKuOTkZPLy8s72Moalq6sLo9FIYmLi2V7KuNLa2kpqauq4fLM416irqzunX3NjRX19/QVxnD6fD7fbTVZW1tleyrgREzXD1WlNZiorK7Hb7ZSXl1NQUEB7ezs2m23IYvFIJBL/LLZYLHHT3Vgky2g0xmvcYifaYDCI2WzG5/MRDAZJSkqit7c3PnnB4/Fgs9koKCiI34/XC9u3S6eo1Qq/+50Zuz0Pk0nMfDduhD/9aQqxhtWsLBN5eXkUFUFWFvh8iaSmJhIMilBbsgQuuWTKScdzobxHa2trJ/Q4k5KSePTRR3nggQdOa/uysjJeeumleC2mz+ejuLiYjz/+mKNHj1JSUsKuXbvIycnBbDaPy5onpYBTKBQKxYXLsWPHMJvNZGdnf+K2BoMBvV5PJBJh06ZN8S+ckUiEUCiE1WolEAjER26BiF+Hw4HP56OtrY2SkpJ4pC0lJYWmpqaTGiKqqmTclcslTQc9PTKJIdaF6vXKMPqYDYjXKw0MDods39kp81O3bJG/n4e6+7xiyZIl/PGPf+SHP/whXq+XkpISysvLufTSS3nppZfYvXs3u3fv5h/+4R/is3LHGiXgFAqFQnHO09bWRkVFRbx0IyMjg5SUlBHto6GhgaKiolM2PQyF3W6Pl8SkHzdsO9H7raJCBBmIeNuwAe65R0TcnXeKpUhenjQ4/PCHUFcHBw/KtAabTQTcc8/B66/LPi6QMrdJg9Fo5JprriEhIQGj0UheXh7f/va32bFjBykpKSxfvpy0tDRuueUW7HY7ra2tfP7zn2fFihXjt6Zx27NCoVAoFGPE/v372bp1K+FwGIPBwMyZM087NWUwGNDpdEybNo2VK1fGa5U+KYUaCoXo6+tDp9PR1tYGgNls5u677z6pA7W+XqYtPPywWH6Ul8vtej0sXSoXkGjbD38opr61tXDFFRKhq62VTtNYZ+qAWnrFOYDBYOCSSy4ZdNvSpUtZGntij5OWlsbdd989IWtSAk6hUCgU40Ys1TjaQu5AIMCGDRvYs2dPvAvUYDBQWlp62vuMpVETEhLIyMgYcUqrra0tfhyapjFr1qyTtjl6FPr64O674dJLh9/XpZfC7t1iEzJ1qtiJJCSA2y2RuxhD9GMoFINQAk6hUCgU40IwGKSqqio+JWE0VFdXs3//fnw+HwDLli3j8ssvH1FheMwLbrSEQqG4u8BQXb2dnWK+azTCJ5XlORwwf37/7263pFDdbom+WSxSH+d2iyBMSBj1shXnOUrAKRQKhWJYIpEIhw8fxuVyMXfuXJKTk0+5fWxygaZp7N27l9WrV1NWVkZycvIn/u9AotEodXV1fPTRR/h8Pu655x5mzJgxqkheTLyNNgposViw2+1YLJYhO5cPHYK2Nli0SMTYyPYt/xNLmSYkSCfrMB7BCkUcJeAUCoVCMSSaplFRUcH69etxu92sW7eO73znO0M2AcSmFOzfv58PP/wQIN7Z2dHRgd/vH5GACwaDHDt2jJ6eHlatWkVxcfGoBVhsikKsy3SkZGRk8LnPfe6k28NhqVvbvFmG0l977cgFnNksUTmDQSY2TJ0K778Pn/70qJaquIBQAk6hUCgUQ9LX10dtbS0gxdldXV24XC6mTDnZnywQCPCHP/yB3t7e+G3p6elYrVY6OjpGZKALYqxaV1dHbm4ueXl5oxZfQHyM1mjGaZ2Ktjb47nfhmWdAp5PRV8dt5ka4Prl89rPw6KMq+qY4PZSAUygUCsUgIpEIHR0d1NbWcvToUcrKyohGo/T29uJ0OocUcJ2dnUQiEVJTUyktLSUajZKRkYHL5aKxsZFgMEg0Gj3tWjS/3097ezszZ84cdubo6RKLwI21gGtsFFsQkAhaTg6M1PJL06QjVdOgsFAicgrF6aAEnEKhUCgG4fP5eO+99+jq6sJsNjNjxgz6+vrYv38/nQOnrg+gq6uLSCRCcXExq1atIhqNotfr2bhxIzqdDr/ff9oCzufzsWXLlrihrnU0Ya0BxObCjjQKKGuBV16RKQtLl8Jtt/WLtPZ2qKmJ3Qf09op/2wht5rj+ekhLk2sl4BSnixJwCoXigsXtdrNjxw6cTifLli27IEYUfRLBYJA333yT2tpacnNzueKKK5g2bRrNzc3o9fqTBJzH42HHjh0cPHiQYDBIVlbWoK5Pm82G2WzG6/WiadpJdWyx7s6BdXVNTU0cOnSI8vJyysvLx2yWZCgUGnEUrr0dXnoJXn4ZPv4YPvUpEXA+Hxw5InVwFosMmu/qGrmAO9EnTqE4XZSAUygUFyxHjx5l9+7duN1uUlJSzhkB5/P52LZtGwcPHgRgxowZLFmy5CT3//HA5XJx+PBh8vPzWblyJTk5ORgMBpKSktDr9Rw+fJhnn32W5cuXU1xcTFtbG1VVVTidTgAyMzMH7c9isWA2m+nt7R00fkrTNAKBAHV1dSQnJzN16tT4344dO4bdbqe0tPSk/Y2GWAQu5iM3Evr65AIi5mL6z++XaQp5efCtb8HixTBtmliJKBQTgXqpKRSKC5JQKERLSwterxedTkdTU9PZXhIejwe73U5TUxMbN26MR6fa29spKCiguLj4jPzMTodDhw5hNBqZNWsWubm58ftLTExEr9cTCATwer2sWbMGs9mMx+PBHxsfAPFZozFiKdCOjo748QA0Njby/PPPE4lEMJvN3HvvvXEBXVdXh9VqJTMz84yPN2ZrAkN7uH0SPT2SGgURcjEBFwiI3Ud6OsydO9jbTaGYCJSAUygUFyRut5vOzk6ysrLo6enB6XQOmeKbCCKRCI2Njfzxj38kJyeH+vp6jEZjXAyFQiEqKyspKCgYl8HY0WiU3bt388477xAOh3E4HOTl5Q0ST2azOf7YpKen09LSgtvtxufzEQgEMJlM6PX6k+rMEhMTsdvtuFyuuJDq7e3llVdeIRQKYbfbCYVCtLa2Eo1G+e1vf4tOp2P69OmkpKSMqPFhKCKRSPx+R7Mfv79/vJWm9XeMdnWJ/1tGhozHUigmGiXgFArFBYnH46G3t5fs7GxsNht1dXU4nU5ycnImfC2HDx/m7bffxmq1Ul9fj91uZ8WKFcyfP59QKMQbb7zBgQMHWL58OampqWN+/93d3WzevDku0AwGA2lpaYO28fv98RRoWloatbW1cdHl9/u58847mTVr1kkCODExMf74trW1kZiYSGtrK729vcycOZOioiK2bdtGfX09XV1dAHHhVldXR0lJyRlZiOj1elJSUsjOzqaoqGjEAn2ggOvpEfHm88G//ivs2iWNByNtWlAoxoKJ/6qpUCgU5wC9vb10dXWRlpZGamoqer0er9d7VtbS1tZGIBDgiiuuwGAwYDAY4jVjDoeDkpISDAYD+/fvH5f7r6urw+fzxevNYo0HA3G73XEBF4sC1tTU0NDQQFpaGjqdbsgGAYvFwpQpU3A4HLz44ov4/X6OHDlCQkICs2fPpri4mOTkZA4fPkxdXR0At9xyC5/73OeYNWvWGYm32FpXrFjBl770Ja699toR78/rlQuIcANJnb7+OhQXw8yZEAye0RIVilGhInAKheKCIxgM0tHRgU6nIyMjI55iG5j+6+vro66ujr6+PkpKSkhPTx/z+rOWlhZ6enpoaGggFAqRmprKJZdcgsPhwGAwEAwGsVqt2O12DAYDHo9nTO9f0zS8Xi81NTUYDAbmzp3LtGnThhz4HvNxA+J1a83NzWRkZHDVVVfFReZQLFiwALfbze7du9m0aRMNDQ1YrVYyMjJITk6muLiYlpYWWltbAUnRniu43XIxGCSFGgjARx/JyKsHHoDvfOdsr1BxoaIEnEKhuKCIRCI0NTXR1NTEzJkzyc3NxeVyodPpBgm45uZmVq9eHa/zGukA9VOhaRotLS2sWbOG7u5uAoEApaWlZGdnU1xcfNL2sfqzgc0CZ0p3dzcVFRW43W6am5vJyspi/vz5wx5jamoqV111FaFQCKvVis/nIzExkUsuuYTS0tJT1uYlJCRQVlbGgQMH2Lx5M9FolLy8PFJTUzEYDJSWllJRUUFraysOh4OEc2iCeyDQP2Te75fUqabJ+KuLLjrbq1NcyCgBp1AoLigikQhOp5NQKERBQQHJyclYLBZ0Oh2+4zmySCRCd3c3Pp8PvV5PXV0dl1566ZgIuGg0GjfFbWlpASS6VVpaOqxNiN1uR6/XDxpTdSb09vby3nvvcfToUTRNIxKJMH369FPWhzkcDi6++GJA6gfvuOOO+HD303lccnNz+dSnPkV7eztWq5X09PR4k4bJZIpHNz99Dg0BDYelA1XTJAIXjcJvfwulpTIyKz//bK9QcSGjBJxCobigCIfDOJ1OEhMT44X6ZrM5LuC6u7v505/+hNfrxWq1EolEaG5uHpWL/1D09fXxhz/8AY/HQ3Z2NkuXLiUlJYXk5ORhU7RWq3XMUqjhcJidO3fS2NhIUVERfX19NDc3x73STgeHw8GsWbNGdL9ms5mysjJCoRB6vX5QutXn88UtRnJzc0e03/HE6xXvN6u13z4EoKFBPN9U96nibKKaGBQKxQVFKBSirq6OlJSUeNH+wAhcU1MTTqcTt9tNUlISRUVFmEwmjh49Oib3//zzz+NyufB6vaSlpVFYWMiUKVOw2WzDCjij0YhOp8PlcvHEE0+c8Ro8Hg8Wi4X58+dTWFgYH3U13uj1eiwWS9xyZOB6YnWI3d3d476O0yUYBI9HvN5iwdHMTGlmMJshO/vsrk9xYaMEnEKhuKA4duwYkUiE9PT0eMoyJuBqa2t58cUXAfEMM5lMFBUV4XA42Ldv34ju58Th6ZFIhB07dtDa2orFYiEpKYkpU6ac1pzP3t5ewuEw0WgUn89HS0sL4XCYUChEKBSKm9UGg8FBt8c80AZuFwwGaWxsxOFwkJmZSSQSQdM0PB7PmA97P11MJhMWiwWLxXJWfPiGw+ORCFxGRn8ULjasw+GAxMSzuz7FhY1KoSoUiguK2traeA1WjNjszpgPGYgAMxgMpKSkxEdBgTQg9PX14fV6sdvtJCYmnhQ5C4VC8bRrXl4eVquVyspK3nrrLXJycvjMZz6Dw+E47TW3t7cTPO5VEQqFePPNN5k6dWp8skCslqynp4fk5GQikQh9fX1YLBasVisejyeeho1EInR2dlJcXIzD4cBms5GVlRWfYXo2yM/P56GHHjor9x0jGJTB9IEA5ORIdC0m4JKTIRYYzMqS67OkdRWKOErAKRSKCwa3201jYyMmk2lQp2OsBi4cDmO1WklOTo5PZjAajYM6QF0uF2vXrqWmpoYFCxZwzTXXYLPZ4vsKhULs2rWLDz/8kGAwyOLFi7nssss4fPgwAMuXLx+ReAOpm4vViGVnZ+PxeKirqztpEHwwGKSrqwtN0wiHw3FPuVAohMFgiDdCaJpGQkICFouF5cuXs3z58tE/qOcJR47ALbfI9d//PfzP/8joLJcLpk+XLlSAGTPgvfckhapQnE2UgFMoFBcELS0tbN++nc7OTjIyMgaJqFgKFSAnJ4crr7ySyspKMjIy4ia/sWjX1q1bOXbsGImJiTQ0NHDw4EFmz54dj4LV1NSwYcMGsrKyCIVCbNmyBYPBQF1dHYWFhRQUFIx47bm5uVxyySWEQiHKy8vp6urCZrPFGytiFh6xqKCmabjdbnQ6HUlJSYNGXe3atYuDBw/i9/uJRCLDerddaDQ09E9ceP99ufZ6obMTZs3qn7ZQUABf/7qafao4+ygBp1AoznsOHjzI9u3bcTqdgPiSDXTkHyjgUlNTyc/PJ3+AR4TVakXTNHw+HzU1NRiNRhISEmhqauKjjz4iIyMjPjv0yJEjGI1GFixYQEJCAqtXr2bHjh34fD7uuuuuYa1CTkVRURFFRUXx32ND30+Fx+PB5/ORkZEx6HabzUZ+fj4pKSkjXsf5TEcHhEJgNMqcU59PrtvbJdoWe7mEQvDf/31216pQgBJwCoXiPKe5uZnNmzfj9/u5/fbbCYVCJ/mWnSjgTiTWIXrs2DG8Xi+pqamEQiF0Oh3d3d0cOHCArKwsLBYLTqczPmUgOzubvLw8du/ejcPhOCtzVk8kNzf3nLLqGE86OmR+6fTpn7xtV5eIM7td6uBcLhmZZTJJs0Ks5m2Mh2EoFKNGCTiFQnFeU11dTWtrK1dccQXTj5/JfT4fbrc7vs3AzsfkIcy9YjVytbW1GAwGpkyZQnNzc7xrc8+ePdTX16NpGu3t7eTm5pKdnY3RaMRms8WHw6t05cSycyc8+ST8+7/DokWn3tblkkYGk0lE3/XXy3V2thj27twp210g2lcxCVACTqFQnLfs2LGDHTt2EAqFmDlz5rDbmUymuLgaaqpALEK3d+9ejEYjc+fOZeXKlWiaRmtrK/v27ePw4cOEw2F0Oh1WqzWeog2FQmiaNqrUqWL01NXBo4/C9u1y+elP4c47h28+6O2FSETq3qJRid61tcHChSL+7rtPInPn0JhWxQWOEnAKheK8pLa2ll27dpGZmcmVV14Zn7owFDqd7pT+YzEBFwwGMRqNcR83gJSUFEwmE8eOHUOv1w8a+h6L9GmadsGkLc8V3G7YvRtiT/v+/XDTTcMLuL4+GZ0VG5uVmSkCbtYsmDtXflcoziWUgFMoFOcN0Wg07uhfX1+P0+nkuuuuIy8v75Tpy4H/5/V6B/0tEolQU1NDKBTC4XBgNBrZvHkzGRkZ8ahacXEx3/rWt3j11VfZu3cvXq8Xj8eDw+HgrrvuGqejVQyH2w2/+pVEy5YskfSnpg3v3aZpItbCYUmXxuae2u0wc6YSb4pzEyXgFArFeUMwGGT79u1kZmZSX1/P1KlTycvLG9RxOtz/xaJmJ84bjY28Rm91BAAAIABJREFUikajXHvttafsAM3JyaG7u/ukzk/FxLJ/vwi4u++Gu+6CigrpKtW0obfv65P0aGoq7NsnadQ5c8T7TU1bUJyrKAGnUCjOCyKRCLt27WLDhg0kJSURCoWYO3fuoIkLJ9LRAdu2QWOjDpttNkVFPqZNmzZom8TERG6++ebTWsPixYtZvHjxGR2HYnSEQvDaa9JNGo1KM0JOjkTRDIb+9OhQdHWJaMvJAb1eOk1vuknSr5deOrHHoVCcLkrAKRSKSU19fT319fX4/X62bNlCTk4Ora2t2Gw20tPTTzlr9MMP4ZvfhNpaM9/97iq+9KUJXLhiTKmthW99S8ZhzZ8vvm0JCTLD1GqVtOrxwRWDaGuDV16Bo0f7U6UlJfDssxO7foVipCgBp1AoJi319fV88MEHtLa24vP5sNvtlJeX097eDvQPgR8qherxwNatYhVhMsGaNdK1qJicfPSRRNKmT4dduyR6lp4uQs5gkAjdUDVwW7fCz38ukxiO96UoFHGi0ShHjhzhmWeeobm5GYC77rqLlStX8s477/D666+TnZ3N3XffzZw5cyZ0nvDwbVcKhUJxDtPR0cH27dtpbW0lFAqRlZWFpmnk5eVx7733ctdddzF37txhu0ubmqCyEkpL5WS/b5/UQikmJ9u3ixi/5x753WSSmjaTSS5+/8kROL9f6uWamyV1GrMQUShiaJpGTU0N7e3t3H777TzwwAOUl5dz9OhRHn/8cRYuXAjAiy++SEdHx4SuTUXgFArFpKOxsZF33nmHQCDA9ddfz7Rp0zAajUQiERITE0/LMLelRdJmy5dDRga8+66IuKVLJ+AAFGPKwYMWDhwwcPHF8JWvwM9+JkJM00SY6fVDp0/b2+HgQWlW0Omk0UEJOMVAwuEw7e3tTJ06lWuuuSbeef7ss89SWFjI5z//eSoqKvjrX//KsWPHJrSBSUXgFArFpCEajeL1eqmtraW9vZ3LL7+cuXPnkpqaSmJiIikpKac97cDlgsZGKC4Ws1azGQ4dGucDUIwLFRVmmpuN/M3fSNQtL0+iaYcOiTizWCRlfqKICwSkNs5kEpHX2qoEnGIwPp+P6upqnnzySTIyMliyZAl79+7lyJEjlJWVYbVaSUtLw2Kx0NXVNaFrm5QRuO7uburr68/2MoZFO97qNNFP5kQTiUQIBAITmvM/W2iadk6/5saKcDh8Th9nfX09mzdvRtM0srOzMZlMo1pvV5eO3bsTMZk0rNYudDowGFL5+GM3V1/dMw4rn3g0TYsL3vMVl0vPY48l8ac/SfHa9OlOWloCaFoOHo+R3bu9XHNND5qWSmennoaGDiAc//8jR0w0NaWSlmbEZNLh8Riorm4iJ2eIcN05wrn+Hh1LJvI4e3p6+OY3v8kjjzwSv62uro6UlBR+8IMf8Oijj9Ld3c1PfvITfvOb32Cz2eLekbFz/qnMwMeDSSngUlJSyM/PP9vLGJauri6MRiOJ57mBUGtrK6mpqVgslrO9lHGnrq7unH7NjRX19fXn7HHW19ezdu1a7HY7oVCIgoICysvLR7yfSAQOHIjy0ktR7rtPz2c+k86+fRKlqahIprk5mbw8ieJMZjweDz6f77z1pAuFpO5t/XppUohEwOPJJjdX/N82bIDSUgcJCQ4cDujuhpycqQx8ebe1SZr10kvhP/4DxEHm3J6YcS6/R8eS2traCT3O5ORkHnvsMR544IFBtweDQerr6zEajWRnZzN//nw2bNjAvHnzWLduHT09PbS2tuL3+0857WU8mJQCTqFQnH90dnYSDAZxuVzx4e+ZmZkYDAZCoRB/+tOfsFgsXHnllXR0dFBcXDyq+wkGoaJCh82mY9EiSbmVlkoKdetW8f9atQpuu006GLu74fLLpbtRzaI/d3C54Pnn5flbscKPyWQkNVVOad//fv92jY39TQwn+sAFAjIDNSlJBLxCcSI+n48333yTiooKysrK2LlzJ9dddx3Lly/npZde4rHHHqOnp4cpU6ZMuLBWAk6hUJx1jhw5wq5du/B6vTQ1NWEwGJgyZQpz586ltLSUY8eOEQqFyMnJ4ZJLLjmj+/J4xHIiN1f8vgCysuDLX5aTfWcnfPABvP22nPhdLviXf4F/+zfxFVOcfaJRGVb/wQdw773wjW/0kZ1tw+E4+ZRmMIgQDwZPFnA+nwj05GSw2SZo8YpJRWJiIrfeeitWqxWn08kNN9zAjTfeSGpqKt/85jfZtGkTM2fOZOXKlaSmpk7o2pSAUygUZxWXy8VHH31Ed3c36enpLF68GJPJxOHDh/nggw84dOgQHR0dhMNh5s+ff8b319kJW7ZEue46KCuT+k2DAR5+WE7obW3wyCPw5z+DwyEmsGvXwte+pgTcuUIoBFu2iMCeM+fU/m2n8oELBqXZweEYfsi94sJGr9dTWFjIl4Zw+b766qu5+uqrz8KqBCXgFArFhBGNRmlsbGTt2rVMmzaNhQsXsmfPHlpaWrjmmmsoKSnBbrfHO0k/+OADqqurmTdvHkuXLqWsrOyM17BuHUQiGvPmhUlO7s+b2WxysdvhsstEwGVni71EVRXU18vvirNPKCTGy1OmwEUXnXrb4XzgIhHpQA2HJQJnMo3vmhWKsUYJOIVCMSEEg0F++ctfotfr6ezspKmpiUAgQEtLCwAXXXQRCcdDXD6fD5/PB0B+fj6XX345aWlpp20Rcio+/BBSUjTKyoLAyYVPFku/KEhPh7IyeOcdEQxnmL1VjBH798vzeNNN0oDgdg+/7XCjtCIRqX8zmUS0T3ADoUJxxqiXrEKhGHecTic//elP6e7upq+vj7KyMqZOncrHH39MY2Mj6enpmAaEQAKBAH3HxyKkpaUNisqdKXv2QGKiRkFBaMi/63T90bi0NLjhBon0vPbamNy9Ygx44QVJe65a9cnNBzqdXE5Mn0YiMnkjJvAUismGisApFIoxJxqN4vf78fl8mEwm1q1bRzQaZeHChRQVFVFeXs6OHTtobm4mHA7HI28xUlJSuOOOO7jjjjvGbE3bt8NXvyrp0MWLNXJywkNuF41KLVwwKCf+1FQRCT0TaA8XDkutXszCzW4XMTnESNcLkooKqXtbsOCTt40Z+Xq98vzPnSvRtlgXa26u6kBVTE7Ux4FCoRhTIpEI3d3d7N+/n+3bt2O1WnG73SxYsIAbbrghvl1JSQmdnZ00NzcTCoXw+/3j4ikYDsuIrL/5G0hMlPq2UzmQ+P0iECIREW0Gg6TZJmLModstkaWqKvjHf5QuS4AVK+CXv4RZs0RUXoh0dMjYq1AItm2D2bMlvX06mM3yPO7bJ92rIK+L2AQGlT5VTEaUgFMoFCMmFAoRjUYxn9C6Fxv8vGPHDjo7O0lISKCrqwtN01i8ePGgbVNSUrjuuuvGfa07d8KDD0JmJvz0p3DxxTIDczgMBpg5E+6/XwTTjBkSAWtvl6jceHUr1tZKRKioSOayxsSbTiemtG++KcLzfOuWDAREQJ2qiWDjRnjpJXj6aUl7mkySPj1d648VK0Qcl5TI46vXywD7H//4whXEismPEnAKheK0OXDgAO3t7YTDYUKhEPn5+eTn5+Pz+UhNTcXpdLJu3TrC4TBz587FYrGwZcsWPB5PfAj0RNLXB7/7nYij//5viOlFu334wnezGW68US4xkpLkpN/ZKfVwY83OnfDEE/CnP/VHi+6+WwRkOAx/+Qv8/vciRM+XwQqhkEQ4d+2SNOZw3aTt7SK8X31Vfk9PF9H36U+f/n2d+HyCzEl94gmJuKr5p4rJiBJwCoXitKiurmbt2rUEg0ECgQAOh4OGhgb27dtHIBAgMTERi8VCb28vy5YtY968edTW1hKNRgmHw3i9XqwTWC3ucsEf/whvvCF1bFdcMfp9JSaKqBovAReLsN17L7zyitRkXX01PPSQCDi9XsTGu+/CZz879vc/nvj9sv4TI4fV1fDd74o9S2Ym/OxnEvk8kfXrpfEkxsqV0n1aWHjma9PrJVV+4pB7hWIyoAScQqH4RKqqqli9ejXhcJjrr7+eDRs2oNfr8Xg8NDc3x7ez2WxYrVZKSkpwOBwUFRVxxx13EIlETmpUGG+2b4ennoL58+Ef/kFSoaNlYARuPDh4UCZEfOEL8MUvSkSooED+ZjSKsLHb4cCB8bn/8aK7WwTprFmwZEn/7S4XfP3r8P77Io6rq2HHDhlXNjCVumWLRN8aGuBHP5L6xYKCU9cwjgRN678oFJMNJeAUCsUp8fv9rF+/nu7ubh588EFyc3PJz8/n0KFDbNq0CYDi4mIsFguVlZUkJSWRnp4OQEJCwoQKt2hUUnN+P2zeLHVO//IvcO21ZzbHNDFx5ALO5ZJUX17e8Nv89rdiGHzokIzzmjZt6MhSVpZEsBobR772iWbPHrj1VhFZ8+fLMV53HUyd2i9Ka2rEx+1Tn4Irr5Tatu3b4eab+wWcxyORyepqic49+KDUvI1VzVo0KsLN75eLQjHZUAJOoVCckn379tHT08PixYvjw5qTkpJYtGgRixYtim9XW1tLVVUVKSkpY+bZNlLcbrjnHvjbv5XU27x5MmrpTJczdapEwnbskP1ZrZCTM/z2O3bA7bdLBOrpp+HOOwf/3eeD556T+asxnntueLGXlCTHcPSoiI61a0UUlZZKanVAc+9Z55FH4NgxuaxbJ7ft3QtdXf0C7q23pJbtzjslJbphA/z85xKVi43Fam6W47z4Ykl/j3UJpaaJwA4GRfQrFJMN1Tyt+ETa22H3bvif/xmf/YfD4scVjUbp7u5m586d1NfXx28PBoM0NTXFjV0VE0cwGGT//v1EIhGWL19+ym2nT5/O/fffzz333DNBq5MoSl+feHx1dUnh/+rV8LnPidXEsmViN3GmpKWJgPrRjyQVu3ChvB+Geknu3y8dkn19Ei267z4Rk7FCeb8fXn9dGhZycqR4v6Dg1N2lU6ZIXVxHh4iNjz6S2w8fFsuR8U4B1teLCIv50g2F1yvHMdDweO5c6QBta5OIWuwx6OqS40lLkwaGL35RukNjQjQalW1qaiQiOR51h7Fordcrz5VqZFBMNlQETnFKdu+G73wHtm6VQvDly+WEeDqGooFAAIPBgMFgQDdE3iMQCKBpGlVVVcyYMYNQKMTWrVvZtWsXGRkZXHrppRQUFFBZWcm6devIy8vj5ptvJisraxyOVDEUhw8fpqenh4KCAhwOxyduXxALsUwAmiaeXr/7nYiBigqJ2KxYIZGf7GwRBWNhu3HppXDVVVLsbjZLJOw//kOiN1/+8mAn/1/9SrZ59FHZ/rvflVFcc+ZIB+mbb0qUEOCOO+Dxx0+dZoX+FGpNDbS0SM2c2SwXl0vEUWLimR/nUNTXw5e+JMfwi1/A5z8/dDSspkYej+xsqXkDWLxYmjC2bJHUakqKRL0OH5Z0aGy2bGEhJCTIZwxId+pbb0nt2/Tp0uQw1iQlwfXXy2soJ0cEnLIUUUwmlIA7zwgE5KQxFumGykqJZHR1wdKl8gF9//1yYsrPlw/g2AfuifT19XHgwAGi0ShlZWUkJycP+nt3dzcHDhzA4/Gwa9cuGhoaCIVCHD16lDlz5uDz+diwYQNpaWk0NjaSk5NDa2sra9as4a677ho0dklx5vh8PmzHTbVCoRCtra10dHSwe/duent7ueyyy87yCk+mvl4iYq++KqnKxERJnT78sFiGZGeLaBoLSkrg5Zf7f9+7Fz7zGamzu/VWEYox6upkLSUlsGiRRAIff1y6SrOz5T1UWCipwaVLT52KjWGzSQ2e1wvf+54IVJtN7qe7W1Ky4yHg+vok0rh9u6Q8/+mf5DiGimoeOSIC7t574ckn+2//yU/k+oknpCu4rU0EWn6+CFOQa5ut32R32zYRyJddJpfxIC8Pnn12fPatUEwESsCdR0SjUntz8KDUlsRqSUZKOCyRjF/8QkTbo4/KifGdd+Dv/x6+8Q358Fu82MrDD+tP+nbc0dHBzp072bdvX7xLcenSpTidTiKRCDk5OWzbto3q6mr8fj9z585lz5496PV6ioqKWLlyJS6Xi3fffZe645/ohYWFRKNRent76ejoYMp45FQuULq6uti+fTurVq1iz549HDlyhCNHjsSHzOfl5VFaWnqWVzmY6moxYT14EP7u70S8pKWJOEpIGP8Ts90uwquiQlKGn/sctLbCX/8q0eriYhGPiYlSyP/GGxKZ6+qSqNkPfiDpQq/39OvzCgvl/rZulVRqbq5Epnp6xr4IP1bgv2+fdIouXCjrfv99EWADBVx3t0QVX3xRIoHl5YP3VVYGt93Wv0aTST5XcnL6U9BpafJY7d0r223aJNHK//N/RDAqFIqTUQLuPOGf/knSMY89Jh+CPp/4RaWkjGw/4bA4wH/3uxLJu/deOSlmZka59lqNBx804HRCTY2XZ56xEAwa+dGP+lNIvb29bN++nZqaGhYuXEhPTw/79+/HYDBQU1NDJBIhPT0dl8tFeXk5CQkJzJs3j4MHDxKJREhNTcVut5OVlcUVV1zBmjVr6Ovro6qqipkzZ1JRUcGePXuYMWMGU6dOjUeNRkswGMRkMg2Z4j2X0TSNaDR6xs0C7e3tbNy4kf379+P3++NCWtM0CgsLmT17Nrm5uaSM9IV0hmiaiIgTDy8SkRqzV1+VFNvXvy4WIRO8PDRN6qeqq+G//ks6Kjs7pRhfp5PIW8xwd9kyqeGKGdHecIPU6plMEtU6Xf6//0/Ma3NzJbXo84kw3LRJUpTZ2WM309Ptlija6tUiGn/wA7n9ww9F1F15Zf+2VVXSJbpjh/x+ooC75hppJok1CrS2SilGZ6d8Vs2ZI4+F1SoRvIcflghjerrU0CkUiqFRAm4S09MjLfrvvy+X996Tb/jRqKSWPB6pXUlOlm/6//Zvku5ZsQKamiRScUJmM35CstnkhDFvHiQlBXG5unE663n00UXs3n2QtWu3cODAFJ5/fjk2WwI//KE0Ixw9epR9+/YxZ84cLrvsMpxOJ1VVVVRVVRGNRklPT6ehoYH09HTKysrIy8sjEAgQDoeJRqP09PSgaRo2m42ZM2eSkpJCKBRC0zSCwSDbt29n7969HDp0iOTkZK6++mpyc3PRj2KYYW1tLR9//DGf+tSnSExMRNM0Ojs7yTjHrO67urpISkrCYDDQ1NTEunXrMBqNpKSkYDKZcDqd3HLLLSO266ipqWHz5s04nU40TWPPnj0kJiZy4403Eo1GcTgcTJ06dcI6St97T2qj3nhD0oW33CJfQgYe1rZtUnPW2SlRodtum3jxBiKeWltlnS0tYrA7MAo28OVYXi6dqLfeCk6npH6bm/s7Mk+XxYvlEqOtTcTUO+/I+//qq8emViwYlLrC//ovEVXf/rY8Dzt3itCqrBy8fVPT4NFkJ74MHQ65xCgokKYOk2lw6tnnk8+u3/xGHr8HHuivpVMoFCejBNwk5gtfkBNHrIOquhquvtrPTTdFePppRzwSl5ws9Sf/7//JB2dBgXwY33uveGTFogCx6Mb69fCv/ypCz2gM8dRTT+Pz+TCbzfT2dlFRsYeEBC8LFzaTlOTmySdv48tfNpGZqdHb2wsQj45NmzYNo9FIKBTi2muvJRgM0tLSQklJCbm5uZjNZoxGI1/96lcBBjU86PV6cgYUCPX09JCWlhav13I6nfz5z39mxYoVXHLJJSN67Kqrq1m/fj1tbW309vbyhS98gaqqKnbu3Ml99903Bs/O2BCJRHjjjTcoKCjg2LFjtLW14fF40Ol06PV6dDod4XCYX//61zz88MOnvd/e3l72799PS0sL1113HS0tLWzfvp1oNEpiYmI8RT0aYTwavvtdETleb/+Iq82b5TX50ENysv/v/4b//E/5u9crguhsZHajUREsNTX93Z/XXitRqh/8QGZ2dnWJyExLk6jY4sXw8cdyPAZDf/H+mZCeLqUNu3aJMAwGz3yfIEL0F7+Q1Ogtt8BXvyrCsLVVnofDhwdv39IiKd0Yxz8ChsVkGhzBi/GrX8lxPP64RBW//OXTn3WqUFyIKAE3yXC7pSv05z/vv23hQjnZ1dRE8fkO8NFHNUybdj01NUn4fNLF1dQU4r77NlBVdRGvv56DzeblZz8zsmmTmdWr5VtzX590imVlSdRAp/Pz1FO/xeVyYbPZ8Pl8bN68mYyMDDTtIgKBGsrKqsjObuXpp7twOBwUFBSQkpJyPHKmw2g0xgWZ2Wxm3rx55ObmkpycjOV4vkev159Wii45OZmvfOUrAHg8Ht544w2qq6t5++23qays5P777z/tx7Grq4vOzk6i0SjNzc38+Mc/JhQKYbFY2LhxI8uWLYtv29vbS/QseAy43W5efvll6urqOHr0KAB2u517772X1NRU9uzZg9VqpbW1lYMHD/L9738fvV4ff2xXrVrFlClT6OjoIDs7G+OA1mGn0xlvGCktLWX+/PnccMMN1NfXM3Xq1Ak9zjfekEhyVpYYud50k6Qcv/99+MpXpFHm7rulrs3rFQuNri7Z5nS6occanU4EWywl6PFIfZjJJH5x0G9PkZbW/z/Tpo3tOgwGub+srLEVcG+8IVHCb35TonAxcnPl8a6pGbx9R4d8Lq1fP7QwO11KSuRy+eWj34dCcSGhBNwkoqdHImnPPisFwGZzlOee8zN/fpCf//zXLFu2jI8//pje3m4SE/Xs3LmC4uJ0TKYQn/70TqZN24zZfISsrGmUlVWxZcvF7Nx5MU88kciXv6zD5RIBl5urkZLi469/fRmXy8Xtt99OWVkZ27ZtY82aNeh0OiyWCAaDhqbpSE3tIhQy4vF4OHjwIBddNI/u7kzuuw/y8nxkZSVQVBTBYDBgtVqZPn36sMeoaf1RilMFf6LRKDabjYSEBHQ6HXV1dTz77LN89rOfHSRUhvq/trY2Dh06RE5ODtdffz1/+ctf6O7ujne2fvjhh2zevBmfz0diYiJer5cbbriBooH5nnGmq6uLd999l6amJgoLC7FarbS0tFBUVBRvKFixYgV6vZ4tW7Zw+PBhotEoer2enp4ejEYjL7/8MuFwGJ/Px+c//3mmTZuGpmmEQiFcLhder5eUlBTMY+GzcRqEwyIMNmwQK4orrxTT1//5H4nivPDC4HmlK1ZI3diWLRIVOnJEvqwsXDghyz1tBqYHf/7zwV+uxpukJImw79snHeifRF+f1Kvt2iW/9/ZKN+iDD0o00+uVlKzdfrKQmjJFInF79kh0MTVVxNy+fbIGp1OEq2oQVygmBiXgJgmRiBQJ/+UvUgT9wx+CxdLI1q1b+fWv6/B6vaxevZrk5GTy8vIwmQ6TkGDhwIFLSE/fx+zZ25g5cxbp6S6ys3ficDhYuXIreXmNPP30chobrVgsUFmpcdNNfdTWbsPjaWfq1KnMmDEDg8FAcXEx69evR6/XU1gYQdMi8fRtIJCO0egkKSmN3t6L+OpXHTQ3w5EjNlpbv8y+fScXN8fw+6XWRtOkOHvzZum4mzdveDuUhIQEbrnlFlwuFxaLhaeffhqn00l1dTVlZWUA8aiZTqcjGo2i0+nQNI2GhgYaGhq45ppryMzMxOFw0N3dTVFRESkpKWzfvp3Q8fBKX18f0WiUt99+mwULFoxrSjEYDMbFVEdHBx0dHcyZM4drrrkG+xAPhNlsRtMkba1pGtnZ2RQVFdHX10dSUhI7duwgEolgtVr5/e9/z3333Yfb7aajo4O1a9ei1+uxWCwTkibt7pbO5jvukG7DKVOkgP2RR2Q8VEaGPN8DKS2Vy//+r4gCg0FSrYp+7Ha59PRAba2YDJ+qZPFXv5LHMC9P/i8SEUH23HPSbPHxxyLicnKGfr8WFsr2x47J+/XJJyXd+X//r0ROlXhTKCYOJeAmCbt2SfQtGo1w/fWt9PW5ePfdjXR0dGCz2Zg7dy5+v5/p06eTmZnJBx98QHa2m5tu2kJl5X6Kioq47bbb4hYRubm57Nmzh2CwlpycFrxeO5oGd9wRJinJQyiUwlVXXcX06dPjokKv12M2m4lGo6Qdzw3Fmgs6O2fgdL5FV5eRd96x0NsrQ6gPHpST9IsvnnxC8HolyvbcczITMTFRLEueeQYWLJAGjDvuGN5rDiDzeNX21VdfzWuvvca6devwHreL1zQNnU6HTqcjEpEIoKZp1NXVYbVaSU1NxWg0kp+fT0ZGBunp6RgMBgoLC+P2JTqdDpvNhtfrpbe3d9y6MWM1aUuXLiUSieByuejr6yM/Pz+eah6KSCRCYmIi5eXllJSUUF5eTjQapaWlhXA4jF6vx2q1smXLFl544QW8Xi8GgyGeEm9qamLGjBnxSOZYEonItcEAf/iDpORKSkQE3HuvnPh/+1vZZtmyk4XHnDliETJ/vkS5bDaZcKDoJ2bm29Mj7x2/XzpVhyIUkukPSUnSrT51qrwH16+XqP6GDSIADx+Wx7uk5OR9xBovXnxR0qlPPildwHffPTgSqVAoxh8l4MaQaDSKy9VNa6uTgoIc9uzZQzRqZcGCoVupAgH5xjowAOLxyIkvGJS6NKtVBM0f/gA7dmjcdFMjbvc6XnutHoD58+eTl5fHggUL8Hq9JCQk4Ha7SUpKor6+nq6uKDk5OaxcuRKTycSsWbOYOXMmAF6vl/z8fNra2uIRHk3TMBgMzJw5k+Li4pMMc2NiKCcnh9LSUlJTUwmHw9TUhHjllSgdHWGam4Pcc4/MapwxQzpi164VIRejoUE8s1pa4KmnxJ4gM1Pqb77wBUnH/Od/ymP0d3/3ycXM5eXlOJ1Odu3axdtvvx0XazEBp2kaer2eaDSKpmkkJSXFBct1110X308kEsFut8cFnKZpZGVlUV9fT3Nz86gFnMvliovNEzl27Bi7d++msrKSrKwssrKyaG1txW63k5qaesouUJPJxBUD847IczR16tR4LVusi7e7u5va2lrMZjOLFi3C7/cPehzGkkhEGmXWrpWgvPJCAAAgAElEQVT02i9/KdG0mAn0woVShL9unZi3ulxS1zawgzExURoYFEMTDkvTUaypYNs26TQfTsAdOiRfqObPh7vu6r/dahVLltbW/ro+na6/lGEgsV6hxx+X66Ii6X491ZcshUIxPigBN4b09HjYsGE7TmcdWVmp1NfXA2bc7nauuGLZoG3fekvqe378Y0llvPACbNwogmXJEulyO3JEvl2/+66kNJYu7WPBgp0YDD6uvPJKkpOTKSkpidtHxK6tVit2u52+vj6ysrJYuXIl2cfb3mKCBkT8Wa1Wuru7sR43cosJHbvdflJqLVY/ZTAY4ilGAIfDQX6+j7q6W9i61YLRmEFZmRxXcbFE03btknmHiYkiTuvqpLapvV3qb555Rk4WN94ogq+xUbrfHntMCqSrqyX1U1w89GNvNBq56qqryMvLIxwOD0qbDhRwXq833n3Z2dlJKBQaJFI1TcN/3A8iNzeX2bNno9PpaGxspKmpidmjHKy5Zs0aLr74Ysxm86BausrKSrZs2UJTUxMAu3fvpqioiKNHj1JYWHjSBIvRYDKZWLp0KcFgkObmZnQ6HdOnTx83e5DeXnjlFXHd/+gjEQh9ffIl5NZb+7dbvlyEXWur/K4iOCNDpxMLlS9+USKaP/6xfDHyeocuPdi1S0Tf/PmDb09Lk+1tNvjnf5br4Z6L666TL1YxCgsH1y0qFIqJQwm4McLj8fD6629QXd2J3x+go6OVYNCEyeRh7dq9LFq0LP6h+tZbEo3au1dqSUwm+Sbd2iriZvNmSYW0tfXv/0c/CmE0VtPVVc+sWXNZvHhxXHSdiMFgYNGiRRQXF2O328nNzR1yu5jgO13fs2g0SigUiqdRB2K325gzZz7PPisf8seDfFitYsx5223i72Q2S+1MYaFMdAgGJf3y6qty4ikqknqo5GQ5mXzta5I6bmuTKM2//ZuMHxoKs9nMRRdddMpjCIVCTJs27XhnaTrf/raef/mX/pE+BoOB0tJSUlJSSExMjEffdDod7pi/xQh5//33qampoaurC6vVyuLFiykvL+fIkSNs2rQJt9vNbbfdxquvvkpdXR0tLS3xaOlIvd2Gw2w2Yzabx32igt8vo5NeeEEibH/zN5KiMxpP7lBMS5NZlIrRYTDI+yX2feCdd6QO7siRoQ1wGxrkvXfid5CCAhFlvb2Soj5VHVtmpkxjiWE0jp15sEKhGBlKwJ0Br7/+OsuWLSMtLY2XX67m0KE6bLZ5JCcn0tm5GYtF2sKi0U4sFkmPtrbKKBzp9pSpB6GQCJ2bb5Z06l//Kl16N90k1gNGI3g8+9m+fSMpKSlcdNFFw4o3kFq1WCpuLElPT+ehhx5Cr9eTlJREd3d3/G8mk6RlqqpEpA2sn7n+ejmJu1z9kYEpU8SkU9Mk6uh2ywkppgtNJhGCjz8uj1d9vfhrlZYOL+BOB5PJxNSpU/F4pvLoo7LP9HQRhiCPXVpaWrzGDyAxMXFUAq62than00lFRQW5ubkYDAZ8Ph/vvfceGzduJBKJ0NPTw6pVq5g9ezYvv/wyXq8Xr9dLUVFRvCZvMvHWW1Iov3Ch1Ly1tsoczY4OdaIfb6ZPl8+PnTsHC7gdO6TJYONG+ayJfbmKkZg4siiaipQqFOcGSsCNAp/Px+rVH7Bv334OHDiATqcjEDBhNCZRWjqXioopPPHEJeh0cO+9f6Gg4CjPPddOR0cGP/iBRJ3CYbj44iCdnSaysnREIjIWaNMmL++8EyEhIcjllzvIzLTywgvPc/ToUcxmM7Nnzx5zYXa6mEymYWeQ6nQiSB95RDoOBzpTWK1yghgYtNPp+mv/HA4RdzD4/ywWSamuWiVC7+BBKbQ+cAA+IdD2iWzdKvVZPp+Yrx47Br/+9dDbxurEurq6Tnv/VVVVrF69GrfbTSQSYcmSJcybN4/t27fzwQcf0Hd8CKTFYiEvL29QSlqn02EwGCadeAOZC2qzyWv5mmvg+eflta5pkgYfOElAMbaUlcmXoBONdj/8UF7rse9bp3DxUSgUk4gLTsANtJYY6f+FQhG83j7WrFlDZWUlwaAJTdOh00UxmTykpORz9dV5rFzZxT//sxGbzc5jj2kEAlBZ+RzPPfcAoVA6N98c5sYbt9Hauon//d/7cTgcvPfee7z//n4AVq2aQ3d3H7/85dH4/c+cOZPMzEwWn8NnwJiIGypjeyqnCr1++HFIBkN/IfWCBTKbcd8+sUGIRkXkmc3y8+mauh47JpEim02ind/4htQZDudhZbVa0el0+P3+eGPEcGiaRldXF1VVVYTDYQwGA5FIBL1ej8lkInCCWVcoFCIajWK1Wvne976H0+nkqaeeIhKJoMVs/s8RNE1q2drbpcP4f/9X0uNf/7p0NoKMdEpNlVmgBoMMef/c587uui8U8vPlMa+tHXz7/9/enYdHXd2LH3/PJJmsk3Um+0r2EELCvguIVhAVlXrdxVZbep9WqbVX2972Zxf79Ln19vq0Vlu70WpVEBBlB6Oy75CwZCX7vk62yezz/f1xnIgtKiBh+Ibzeh6fyIRMPoeZ+c5nzvmcz+noELP/IL6fmnr1Y5Mk6cq77hK4wcEhXC43YWH6i+5/5Xa7qa1t5PDhM5hMjbS3mwkIMHLs2DI6OuKZOvUgfn5niYjIxmAQu+kASkqaMRphaCgcu93C4sU1zJihJybmJNXVe3E6nfzhD38APmlXYbfbmTDhNMHBwQQERI00pV2wYMHIRoTr1Q03iEL4//5vURvX3S2OErrnHvEmdeedX3w4uKKIJb333xfF34sWwU03ifq8TZs+ewdfYGAgQ0NDVFZWEhAQMPLc8WyOALGDtbu7m23btgEi6TaZTHR2dtLb24tGo0Gv13/qcczKyhrZqODZIev5z+Xpw3GNOHRIFMtbLKKRa1iYSOLKy0VS7esrlkyzs6/MmZzSpUlNFR+GSko+ua2vTzwmkZGizvMST5yTJOkadl0kcIqiMDg4iNls5syZSvr7+ykoGE9qago63Rd3nqysbGTt2jew2TRYrQFoNDcwZcoEnnwyEL0eentn8uSTU4iP//R9TZmSwpQpK6irq+Of//wnN91UybhxDpqbm7Hb7cTGxtLV1TVypuXEiRNpb2+nvr6eoqIiCgsLiYiIuGrnUV7rZswQNXDnzolloOBgkdC9/rr4/tmzoifVhfpXedhsop7OsxsvPPyT5dizZ0Xd3YX2DTidThwOB2+//TbwyQzu+TO6nhmz4OBgEhISSExMJCwsjIiICPR6PT4+PsycOZOZM2d+ZnxWq3Vks8j5y6retnu32EHq7y82KezYIWba3n9fFM8XFYmELiUFnnjC29Fen1JTRblCS4uogzObtbS1+dLUJGpO16//7F3ckiSpz3WRwHV2dnLw4EG6u7vp6elheNhGQ0MDU6cWMWvWzM89eqmjo4N3390B+KPV5uPjo2fx4kLmzNGN1GtFRsJrr312IhgbG4uiKNTW1lJXV0dYWBh5eXmkp6fT09NDQEAADoeDgoICTp06RX19PW63+4KtPK5nycni2KUPPxSF1++9J3bOLVoklj5feUUkaJ4eVW63WNbVaETCpihiFmnbNrHT1bNs6zkBYMMGMYOxfPm/F3onJSWNJGGeI6vE7/h0s2BFUTAajRQWFl5yDZsncYNPt3vxtpYW0VTZ11fsQHzoIXHI+e9/Lzaf6HRix/CcOWKJNefCbQ+lq8DPT8yOrlwJNpsO8KWxUcxSe5a5JUkaG8Z8AldTU8P+/Qc4c6Ydu11HRISVvr5sBgaGGB7eS3Z2PjExn92Fcvv2/VitXYSFzWPOnMn4+LiZNOnSzo4MDAzklltuwe12Y7PZ0Ov1ZGZm/luC5nQ6SU9PJzAwkLi4uM9NLK9HOp1IEubMEQ2AY2JEbc+tt4o3LrNZFNF7Nkucn8C5XOL20lJxXFBkpGhN4nR+ksCVlIhmp+Xloi6uqOiT311UVETG503tXQEajQaj0chXvvIVQkNDP7UT1pveflskcd/+NvzkJ+K2wEDRrzA+XiTN06aJ2sdrJOe8bt1/v5ihdjphcFAhONjNpEnw2GPiOS9J0qVRFIXu7m42bdrE2bNnKSws5Pbbbx+1JuiXYsxnCNu3H6Szs5GensV0dUVhsw1x//1GWlrKGR7u4vjxFpYsEQmc3W6ntraF4OBgkpKiOXOmhYaGGvr743n44amkpARyuXXlUz8uPvEUrV/oAHHPsU7JycmXPd7rRVycqMdyOkVhtkYDzz4rzol99VWR7Hk6yWu1oj+ZTie+LlgglvkmTBDfi4oSjWcdDtF89sABUU93fgJ3NZJpjUZDREQEM2bMGPXfdbEGBsSMpdv96aXRwEAx8yldW559VtS9uVwwMGAHbMTF+WMwfP4ZqZIkXZjdbmf37t3s27eP3Nxctm7dSmxsLAsXLvR6p4AxncD19vbS39+KxRLJt741gfBwP5xOhYQEWLeunbo6P0pLd9LWdpibb76Zzs5Odu/eQ3BwKLfeegtHjhxGUSxERMxk3DhxltOXfbz+9Wgq6cs5P68qLBQtExwOkZgpyqdn4Pbsge9/X8y4nX8iAIg/OxxiM8T+/WIWrq5O1HVdgcMQVGvjRtFkevZsUUclXduioj7ZyGM2K1gsLi6yT7ckSRcwNDREVVUVM2bM4IEHHuDVV1/l2LFjzJs3TyZwl2Pbtv28994xAHQ6C3Z7IBqNG19fBw6H6Bbq52cDXCiKhba2eeTn+yF634opz+hof1patNjtgzQ3D/Laa6+hKAr9/To0GhNvvrkFq7WX9vZU/u//si8ciHRN0ek+vz/c+PGiFuiz9gb4+EB+vmg6+4tfiO70Go04uPvLFn8fPCiWHK9VBw58ukHyG2+Ieje7Xcxavvii92KTJEnyFpvNxuDgIJMmTSI4OJj09HTef//9a6JLgCoTOD8/K76+FkDMsgQG2kbqns6/HUCr9efJJ+Npb6//1H2MH+/PyZMreOklPQ888DKBgRYGBuIwm2eQlHQKs7kCjcaNj08k7e2NlxSfZ2diT0/Plxjltc/tdmOxWLxeB3A56usvfLvb7UdqaiwDA1r0ejeDgxpuuUXL738fyC23fMYPfQGzGb7ylWS++91ewsPdLFkyfMFTCT6rD53LJWYUNRqxlOk5EEKrFTOQiiJ2H17OfheHA7ZuDeT//T8DEydamTQphOHhPtau1dPfLz5dzp07THp6N/X111Zfui9DURQURWF4eNjboYwazxg9TaPHMrfbzeDgoCqvRZfK7XZT/1kXsDHmao6zr6+P//zP/2TVqlWfus3zOjrftbK5UJUJXGHhHDIyROX5wICd0FAdLpcbm81NUJAY0vCwE39/LVFRARiNFz7D57//W/QWW7jwSTQaF4sX2/jVr4Kork7k0CEHOl014eGdpF5i50uTyYSvry96vf7LDfQa197eTkREBP5j6Iyk1NTzG6H6UFICd98NL7wQwcqVX9yHT1FEUuSZ5XM4RL85pxP+538MhISIurKnn/70kUTd3WIX7De+8e/3+f774vxKh0OcRnHffeL8y9RUsRvXahX1aXPnXtpYe3pEa4nf/lYsj+7ZE8zevcEEBYn7NBpFrWFubhBpaclEfPZeH9WxWCwMDg567VSTq8FsNmOxWC76rGM16+7uJjAwkODr4JyvxsbG66JOura29pLfe7+M8PBwXn75ZVasWPGp2wMCAggLC6OpqQmz2UxNTQ0xMTFeXz4FlSZwBoM/mZlXJjmaOxceeACcTh/uuSeI3FzIzg6mpCSPM2d0WK0xWK3wOUePSmNYTo7Y7XrwoI6aGvE8UBTRhuRfnxOKInrM7djxSTNnkwlOnBDHSqWkiNq6118XdXi33SaWbY8fhz/9SdxeVPTpZquHD8Pjj4uNF7W1YqkzO1v87mPHxIzd4KBoQtzRcfH1ekNDou3KSy+J461+9zv41rdAqx2moCCI5mZx+Pz998szTCVJun6FhISQkZHBli1bMJlMnDhxgkcfffSa6BLh/QiuAatXf/rPigJxcYX09hYCog5IJnDXp4AAcTD40aNiA0RoqFjGnDlTJGCJiZ/83bo6+NnP4M03xS5NRREzWXa7mMW77z7YuhX+4z9g82axMaC0VMwEHz0q7uOXvxQ7Yp1O0Tx31Sqx3Lt+vZi5i4kRyVZUlEjmgoLEfW7YIO7rYg8lP3tWxDB+vKj3S0wU7UK6u7uvi0/3kiRJF0On0zFv3jz6+vqoqKhg8eLFTJ8+/ZpYRpUJ3AX4+IhZD0kCcTrDP/4hkqyQEDHTtX27WM586ikxs3bqlOiRtm2bOJrr7rtheBj++Ec4fVrMePn7Q2amSO6Ki0XLh6NHxe2/+pVohnvypLifrCxYs0Ykcj/6kTh5YmBAbNSYP1/ElZ4u6t56esTZrm+8cXEJnNMpYi8rE/3uPEcwBQWN7r+jJEmS2mg0GmJiYnj8GkwKZAInSV9g0SJ46aVOxo2LRqcTDYBfew3eegtuv13Upn3nO2K50+USmw1uvFF8EFi3TtxHTY34mpICf/ubWC5dvVrM0q1ZI85g/a//Ekuwv/kNJCWJpdH77hOHxUdGivs9fwetJ+GaPVv8/5tviu//+tef3bTV4YAPPhC/w+US8cjETZIkSX1kAidJXyA0FBYuHMZTT+tyiZMgdu0SCVd9PRw5Ag8+KE4rCAoSB4drtaKpsNn8SW8uvV4cQ5WTI5oOBwSIGTuTSfz9jAxR11ZeLn7v7NnizFHP5roL7VItKBCHyv/udyKJa2wUmxx+8APx9XxbtogND01N4veVl4uZvbG0QUGSJOl6IBM4SbpEPj5iE4NeL44tqqkRy5K33SaaCZ8vM/PCP5+TI76n0Yg/K4pYCu3uhh/+UNSopaeL2rQvKrXw9xdJYXy8qM0rLhb32dgoDp73HBUGYlNCYKA4heL0adi3T4xh8uTLa0MiSZIkeYdM4CTpMkRHiw0FTU1iFylcWqNerfbTCZNGA+HhYkZu4UJRS7dokZiRuxg+PjBjhkjW3G6RSG7c+Mk5sdHR4qxXRRG7XDdskEunkiRJaiYTOEm6DAaDWBbdsEHsNL35ZpEkfVkBAWIpdvp08TvCwy/t50tKxFeTSSyfvvWW2AXb0yNm8+67T+w6lSRJktRNJnCSdBlSU0XSVlIiatweeODK3XdIiOgH92VERIi2Jw89BF1dommw0wmTJl2ZGCVJkiTvkgmcJF2G4GBYuVJ8raoS9W/XmpAQsQR7scuwkiRJknrIBE6SLpNeLw58lyRJkqSrTe47kyRJkiRJUhmZwEmSJEmSJKmMTOAkSZIkSZJURiZwkiRJkiRJKiMTOEmSJEmSJJWRCZwkSZIkSZLKyAROkiRJkiRJZWQCJ0mSJEmSpDIygZMkSZIkSVIZmcBJkiRJkiSpjEzgJEmSJEmSVEYmcJIkSZIkSSojEzhJkiRJkiSVkQmcJEmSJEmSysgETpIkSZIkSWVkAidJkiRJkqQyMoGTJEmSJElSGZnASZIkSZIkqYxM4CRJkiRJklRGJnCSJEmSJEkqIxM4SZIkSZIklZEJnCRJkiRJksrIBE6SJEmSJEllfL0dgCRJkiRJkhqYzWbefPNNWlpaAEhKSuLee++ltraW4uJiLBYLixcvZsKECWi1oztHJmfgJEmSJEmSLkJzczObNm3CaDSSkpJCXFwcnZ2drFu3jrq6Ojo6OnjllVfo7+8f9VjkDJwkSZIkSdJFaGhoICYmhocffpiQkBAUReHQoUP09/fz8MMPYzQaWbVqFTU1NUyZMmVUY5EzcJIkSZIkSRehoqKC48ePU1RURGFhIRs2bKCvrw9/f3/i4+OJiYkhMjJyZIl1NKlyBu6DDz7ggw8+8HYYkiRJkiSNAfv37+enP/0pjz766MhtiqL829974okneOKJJ3C5XGzcuJEXXniB++67DwCNRoNGo8HHx+eCP3ulqS6Bmzp1KlOnTvV2GJ/rueeeIzU1lRUrVng7lFG1bNkynnvuOQoLC70dyqgLDw+nr6/P22GMutTUVOrr670dxqj76KOPWL16NatXr/Z2KKNm48aNfPTRR7z44oveDmXUrVq1ivnz57Ns2TJvhzLqrpfXqEajuSpJkMczzzxzwdubm5tZtWoVx44dY/ny5Tz22GMYjUbCw8OZPXs269evx+Vy4XQ66enpwcfHh56eHmJjY0c9ZtUlcGqQmpp6VR48b/G8qPLz8wkJCfFyNKPLM9Y5c+Z4OZLR5Xa70Wq1zJgxw9uhjDpFUQgPDycnJ8fboYwqg8FARkaGt8O4KjIyMjAYDN4OY1S53W40Gs2Yf416rrk33HCDlyMREhMTWbduHQAul4uXX36ZkydPcscdd1BaWopGo2H27NmsW7eOt956C51Oh06nuyqvPY1yNVPcMczpdNHf309UVKS3QxlVfX19NDU1kZCQQGTk2B6rydSH3W4jKioKX9+x+1nnzJmz9PR0XzMXzNHU2tpKSEgIoaGh3g5l1HR2dhEcHERwcLC3QxlVDoeDgYEBQkJC8Pf393Y4o2poaIiOjg4MBiOhoXo0Go23QxoVvb292O0OjEYDPj4+3g7ngjo7O1m9ejUVFRXo9XoeffRR8vPzOXLkCOvXr2d4eJj777+fWbNmjfoYZAJ3BSiKwsmTJRQXf8CDD95PXFyct0O64hRFoa2tjXXr1qPT6bjrrruIjjZ6O6xR4XK5OHv2LLt2vY/L5eLOO5eRnp4+6j19rja73c6hQ4d49dU/ERgYyG9+87/o9XpvhzUqrFYr27Zt48SJk2RlZTFnzhzS0lK9HdYVZbFY2Lx5Mw0NjSQkxDNx4kTy8vK8Hdao6O/vZ8OGDfT29pKdnc3kyVOIixu7qx4nT55k69ZtTJkyhQUL5qPT6bwd0hXldDopLS3l/feLcTqdTJ06hZtvvtnbYV3zxtY7kheVlpby+uuv8/e//wOTaezVSplMJl599U+0tbVx8803ERDgT09PD06n09uhXVGKotDQ0Mj69Rswm4dITU3BarUyMDDg7dCuqKGhITZseIe1a98mKyuL7u5uTCaTt8MaFXa7nU2bNvPee5tITExkz549lJaWYLfbvR3aFWOz2Vi79m02b95CbGwMHR2d/OlPf6asrNzboV1xdrud11//JwcOHCQwMIgjR46yfv16Ojs7vR3aqHA4HFRVVXHs2DEOHDjAqVOnvR3SFeV0OikpKWHNmjW43W7CwkLZtGkz1dXV3g7tmicTuCvEaDQyZcoU6uvr2bZtK62trVitVm+HdcUMDAwwODhIQUEBnZ1d/PrXL/DjH/+ErVu3jakkTlEUent7GBwcZObMWfj7B/CXv/yVX/zieY4cOert8K4It9tNW1s73d3d3HHHHSxbtoy4uDjsdvtVLRq+Wux2O2VlZcTHxzNjxgyGhoZYs2Ytf/vbapqamrwd3hVhsVg4ePAg+fn5LF26lPz88VRUVPDqq3+itbXV2+FdMU6nE7vdztmzZ5kyZQrLl9/N0qW3Ul1dzXvvbcJsNns7xCumq6uL3t5erFYrer2eyZMnY7fb2bdvH2VlZd4O74pQFAWr1UpNTQ0ajZY771zGokWLsNlsDA9bxuT16Eryee65557zdhBq1N7egd1ux9/fH41GQ3d3F21tbcyaNYtNmzazfv0GCgsnEh0drep6hYaGRnx8tISGhtLe3sHOnTspKSnBYDCQlJTEyy+/zKRJk4mPj/d2qF/auXPnCAoKwuVycfjwEU6fPk1FRQV5eXkEBQXxwgsvsGjRTYSHh3s71MvmcDhobm7BYIiioGACWVmZGAxRFBd/gNVqoaioSNXP1/OZTCb6+vrR60MYHh7mww8/ZMeOHWg0GhYsWMDx48epqqqmqGgSAQEB3g73sphMJgYGBgkODqKjo4NDhw6RkZFBSUkpzc3NaLVaFMVNVlYWfn5+3g73S9m7dx91dXUMDZkZGhqitLSUO+9cRkxMDMHBwWzbto2EhHgSEhJU/xx+//1innzySaqrz2E2DzN16jQKCwsZN24chw8fpqenB6PRSEREhLdDvWx2u4OtW7diMokeatOnTycnJwer1UpxcTEFBRNJTExU/WM5mmQCdxnOnath/fr1NDQ0kJ2djU6no7r6HIODg+j1IWzatAmDwcjixbcQFRXl7XAv25kzZ3njjTcYGBhg4sSJxMXFUllZyaJFi3jssa+TlJRIQ0MDer2e3NxcVb/Qdu/ew5tvvklAQCDjx48H4MMPP2LixIk89NCDpKQkU11dTXJyMsnJyaod686du9i6dSsGg5Fx49Lw8fHB4XDgcjk5ffoMOTk5Y6LAv7u7m3fffY8TJ06QmJjEtGlTyczMoqysjJUrV3LTTYtwu92YTCYyMzMJDw9X3WPqGWNpaSlpaWlkZmZQXl7Gxo0bOXjwEN///vfRaMDHx4fc3FxVF/q//vo/+c1vfkN5eTmrV6/m/vvvp7GxkZaWFmbMmI7L5aaiooK4uDjS0tJUXa9aXPwB9957Hz/+8Y/R6XScO3eOpKREcnNziI2NJTg4mH379jE0ZCYlJYWgoCBvh3xZvvOdJ1i3bh0nT56kvb2dW29dQmhoKFarlYMHDzF37hz8/Px4/fV/kpubo/oPIKNh7G6tGyWKouBwODhw4CA6nR96vZ7bbltKTEw0u3btQqv14Re/+AU1NTWUlp4iMTFRlZ/uFUXBbrezffsOurq6CA0NZcGC+fzyl89js9lobm6mqamZjo4OQkNDVX3BVBQFi8XC22+/TUBAAEFBQRQUFDB37hwqK6s4fPgIAQEBNDU1ERQUpNqxKopCT08v77zzDoGBgQQFBZKVlUVAQAAJCQnU1NTQ0dFBXFzcNbsD7GIoijKyEeXUqdMEBwdz221Lyc3NwcfHh+LiYnQ6P5qbm3E4HAQEBKgueTt/jBUVFYSEhLBkyWKef/55qqqq0en8GBoy43Q6ccJcQpAAABJDSURBVLlcql2KUhSFo0ePsX//fn7+858RERHJpk2bOHLkCHfccQfvvPMOv//9y2RnZ2MymbBYLN4O+bIoioLb7cbpdFJfX8/Kld/kllu+QmtrK2vXvo3d7kBRFDQaDTNnzsBkMmG321W56cjlcvH3v/+Dnp4e1q9fx6lTpzly5AhlZeVERUVRXi7qNru7e3jmmWf56leXqzZJHW1yBu4iKIrC0NAQDocDrVZLc3MLTqeTkJAQurq6cLncGAwGAgL8+drXHmXatGnk5eWSn5+vqt1CLpdr5KKv0Wioq6sjIMCfwMBA2tra0On8iY42UlFRyZo1a9mw4R0WLJjP8uV3q+4N32azf1wvI97YSkpKiIuLw9fXl97eXoxGI9OnT6e7u4fy8nI2bdrM17/+dW66aZF3A79EVqsVs9k8kqCcOXMGg8GAy+Wiv3+AyMhIQkNDSUxMZGBgkGPHjjN//nzVJTQgNmZYLBZ8fHzo6+uju7ubyMiIkdtjY2MpKChg165dlJSUYDL18eijK0hPT/d26BftQmMMCwtjYGAAu91OcnIS0dHRvPPORrZu3YrFYuGee75KQkKCt0O/JG63e+Sa29/fj8UyTGFhIRkZGezevYfQ0FCWLr2VqKhIDh8+zP79B8jJyeHuu+9SXfsUp9NJW1sblZVVOJ1O/P0DMBoNTJgwgeHhYUpKSomNjSU+Pg6LxYqfnx9ZWVnk5OSo6rprs9lGrkV1dfWEhYUyd+5cnE4nZWVlZGRkkJKSwrlzNWzevJnNm7ewatWT3HPPPd4O/Zol24hchFOnTrNz506io6MpLJyIj48PbrdCSEgwW7duo6enhwUL5lNQUEBYWJi3w70sLpeLY8eOsW/ffhISEpgwYQIulxNfXz+CgoJYs2YNvr6+zJ9/A8nJKbS0tOB2u8jNzSUwMNDb4V+Svr4+du/eQ21tLbm5uWRlZdHT001oaBhWq4WtW7dhNBq54YZ5REdHMzQ0xPCwhcxMdTVF7erq4v33i+no6GDixALS09Pp7OwiLCyUlpZWDhw4QFpaKvPnzycmJgYQBzWnpaV5OfJLV1dXx8aN76LT6Zg2bSrh4eEMDw8TEhLCiRMnqKysYtKkImbOnInFYqGzs4voaKOqajc/e4x6Dh06RG1tLdOmTWP27FkMDg7S2tpKQkKCKpuKHz9+gg8//JC4uFjy8vKIjY3FYDCgKAo//enPSEhIYMWKR0ZmG/39A4iJiVZdY3Gn08np06dZt249vb29jBs3jrS0NG68cSFhYWGUlpaybt16brnlKzQ2NqHX6z/uAqCuVZ3e3l4++OBDmpqaGT8+j5SUZGJiYggNDaW0tJQNG95hyZLFJCYmcfbsWbZs2cKDDz7I9OnTvB36NU3OwH2BlpYWXnzxxZEp63PnaggKCiIvL4+4uDhiY2Oprq6mtbWNhIR4IiMjVTl7UVtbyx/+8EcGBwcZGhqitraWyMgoJkzIx2g0YDQaqKioxGTqIzU1hczMDOLi4lRXl2C12tizZy9btmzB6XTS2tpKQ0MDOTk55OXlEhERgZ+fH5WVlTidTtLS0jAYDERFqetxNZvNbNu2nY8++giAurp6GhubGD9+PFlZWURFRWG326iqqsbX15ekpET8/PxUWRTd3d3NX/7yF86dq0Gn86OqqgqbzUZ+/niSk5OJjo6ms7OT6upqDIYoMjMziYmJVlWt38WMsa2tjerqaoxGA+np6SNvkGrT1NTMb3/7W/r7+7FardTV1eHvryMuLh6tVsP27TvIy8ujpKSUo0ePjhT3q7HGz2weZsuWrXR0dHD77bfjcDgoLy+nu7ubjIx0zp07x759+2lsbKKyspKioiLS0tJUNfNmsVgoLi5m586duN1umpubaWlpJT4+fuTQ97q6eoKCgtm5cyd+fn489tjXycrK8nbo1zyZwH0Gz8RkTU0tv/3t7/jRj37AtGlT6evro7KyCp3Oj7i4OKKiooiLi2N4eJicnByCgoJU9UbvGeeZM2dZv34DTz/9NBMm5NPd3U1FRSVRUVFER0cTGRk1Uuidnj5OtXVDFsswO3bswmq18PjjjxMdHU1TUyNlZeWkpaURGRlJVJQBnU5HWFgYCQkJ+Pn5qWasnsdzYGCAjRs3YjQaeeSRhwkN1VNbW0djY+PIOA0GI4qiEB8fT3S0UXW1fZ6xtrW18fLLr/Dooyu49dYlWK1Wzp07h9VqHflQFRMTw/CwmZycHPR6vWrGejFjTExMJCoqkpiYWAYHB8nLy0OvD1HNGD08Y62uPsdf//pXnnnmGYqKijCZeqmoqPw4GVV48803qaurY3BwgLvuupOsrCxVJTQe1dXn8PX1oaVFlOQsXLiA/PzxWCxWTpw4QXy8+IC8des2QkNDefTRFUyfPl01ZTmex3NoaIjNm7fg7+/P1772NSIjI6ivr6eqqpqkJLE5bMuWrSMfpG+9dQlGo1E111xvkgncBfT391NcXExHRyd2u52+vj5CQkKYOXMmERGRNDQ0YDYPk5ycTHBwMBERESQmJqpu9q2np4etW7cyNDSE1WrDZOrFYIhi2rRp6PV6qqurURSFtLQ0/P39iYqKIiEhntDQUFWNE8RM6nvvbcLtVjCbzQwMDJCdnUVBQQFarQ/Hjx8nKiqKxMREAgPFckxcXKzqEtWamlqKi4txudwft1sYZOLEAvLy8nC7Fc6cOUNMTOxI64W4uDhiYmJUd1SYxWLh6NFjlJWV4XA4GRwcxGKxcMMN84iPj6enp4e2tjZiY+OIiIgYqfNT0xvDxY4xMTGRsLAwwsLCSEpKwmg0qGaMHiaTiR07do6sdPT09BIeHs6MGdMJDw+ntrYWh8NBcnISR48eISIigieeeIK8vDzVJW+KovD8879k27ZtNDQ0oNFoGBoaAjRkZmaQlJTIzp27AMjLyyUjI4M771xGdna2qlY8Ghsb2bZtO263qCEfHBxk/Pg88vPzAQ0lJSVER0fj46OluvocCxYsYPnyuzEY1Pf89RaZwP2LlpZWnn/+l+zevZvjx49jsVgwGAz09PQSHBxMbm4OHR2dnDp1igkT8omIiECj0ahu+r62to5nn/0BZ8+WceDAAdxuN3q9nt7eXiIjI8nOzqKuro4zZ84wf/4N+Pn5odVqVfPp73xHjx7jnnvuxWazcfz48ZGkrL9/gHHj0klLS2X//v20traycOFCNBoNvr6+qktq9u3bz+OPf4P+/j7OnDlDcHAwTqeTgQExK5OcnMTu3bux2WxMnToVjUYz8riqydCQmdWrV/PHP/6Rmpoa2tvbiYyMpK+vD4fDwcSJBbjdbg4fPkJUVCTp6emqe41eyhjj4uJISUlBo9GorjYKxBv9T37yHEePHuXIkSPY7XbCw8Pp7e0lNDSMnJwcmpubOXXqFLNnz2LGjBksWbJElbV9ZrOZ55//JbW1tTzyyMOcPn2GgIAA/P39qaqqQqPREBkZSXt7B83NTSxatIjc3BwiIiJU9To9dOgwDz/8MGazmZKSEoKCgnC73QwMDJCVlUVqagp79+5lcHCQxYsXM2fOHKZNm6a6GkZvkwnceYaGhli7di39/f089dR3ychI58CBg9x7772UlZVRVVXFwMAgJpOJxsZGcnNziYmJUdULC0QR/5///GfCw8P53ve+S0xMDEePHuO2226jrKyMyspK7HY7LS2ttLW1MW3aVFVuVwcx8/aDH/yQFSse4RvfeJzhYQsOh4OMjAzKysooKysjLCyUEydOYrfbmTVrpqre6D3q6+v59re/w5NPPsH9999Hb6+J0NBQDAYD5eXlnD17lpiYaA4fPoy/vz+FhYWqTMZdLhcHDuxn06ZNrFq1ijlzZlNRUcm8efPo7OyksrKSxsYmtFoNZWVlxMbGkZGRrqpk/FLHmJiYSFpaqupmokAs9b/22mtoNBqeeuq7JCUlsXfvXr761a+OXIsslmE6Oztpbm5m6tSppKWlqW7jlIfNZmP9+g0sW7aMefPmYrNZOXLkKEuXLsXtdvPSSy9RVVXNCy/8L0899dTIpjk1aWxs5Kmnvsc3v/lNVqx4hIGBAXx9fUlMTKS8vJyysjIiIyM4evQYPj4+zJkzB6PRqKrX6LVCJnDnEbMyoiv0pEmTSElJYdu27UyePIlZs2bR0dHJ9u3bqaurY+nSpcyePUtVU9oeGo2Grq5uIiMjKSoqJCkpiS1btjB37hwmTZpMXV0dO3fuorm5mZUrV5KVlaXaKW2tVkt9fT0FBQWMHz8el8tFZWUlCxcuICVFzLzt2bOH3t5efv7zn2EwGLwd8mXRarVUVVUzc+ZMcnNz6evro6Ojg0WLbiQ2NoZdu3axb99+QOF733tKtadJaDQa7HYHfX19TJs2lfT0dEpKSomIiGDJksVoNPDee+9RVlZOYeFE7rrrTtW1lbjUMS5bdodqExqNRkNvr4mQkBAmTSoiOTmZd999lzlzZjN9+jSam1vYsWMnDQ2NPPLII0yYkK+6hOZ8Q0NDGAwG5s2bi5+fH01NTfT09LJo0SKysjI/Xl6EZ599hhtvXOjlaC+PVqulpqaWKVOmkJeXh8UyTENDIzfeuJCEhAQ++ugj9u3bh8Vi4Yc//IEqN05dK2QbkfM4HOKiGRAQgF6vp6ysnCeeeIJXXnmZiIgIWltb0el0REREjLRdUCObzUZfXx96vZ6goCBKSkp5+umnefXVPxIYGEhvby8A8fEJRESo843ew2w2YzKZSExMxGaz8c47Gzlx4gSrVj3J0JAZrVbDwMAgkyYVeTvUL2VwUMwMJycnMzg4yGuvvc7Q0BCPPPII3d3dBAYG0NtrYsqUyd4O9UtRFAWTyYTL5cJoNNLU1Mzzzz/P8uV3M3XqNM6dqyY8PBxFUcjIUFfbF4/rYYwenhrj4OBggoODOX36DCtXruQf//j7SJ9NrdaH6Gijaj9cfRabzcbevfuoqKjgppsWcfZsGenp6WRlZao2IQeRpJpMJpKSkhgeHmbNmrU0NDSwcuU36evrw8/Pj76+fiZPnuTtUFVPzlmex8/PD6PRCIhGksPDw2RmZtLe3s5bb60hPj6e5cvvVm2vNw9/f/+RBNTtdmM2m8nMzKSmpoaDBw+Rm5vD4sWLx0Q9gueNAcTSlFarJSoqko8++ojKyipuu20phYWFXo7yy9Pr9ej1+o9PCnESEBCAoihs3ryZhoYGHnjgftUnb8BIjRCIRMdmsxIbG4vVauOVV/6Aw2Fn5cpvjryO1eh6GKOHTqcjOjoa8FxzxU7hxsZG9u7dx7hx47jjjttVW8Lxeex2OxUVFZw7V01XVxeBgYHMnDlDlXWM5wsJCSEkJARFUXA6nfj5+REWFsaOHTupra3l7rvvoqhI/dfca4G6ireuIs/pC21tbR/3RxtiwYL5qk/e/pWnsLShoZG///0faLVaZs6cOSaSt3/ldDrp7e3l4MFDbN++k+zsbLKzs8dc7YXDYaenp4fi4mL27NnL1KlTSU1N9XZYV5yiKAwPW+js7OS1116nqqqSO+64fUwkNh7Xwxg9FEVhYGCQ1tY2/vznv+JwOJg7d86YTN48bDYbpaWn0ev1PPTQQ8TFxam2XOVCnE4nPT097Nmzhw8++ICCgglkZGSorm78WjW23rmuIK1Wi9PpxGKxcPPNN7F8+VeJjh57F03PYeYOh51FixZx++23jXz6H2u0Wi12u53Q0FAeeuhBZs+eNSbP2NNoNNhsNqKjo3n44YeYPHmyKjdmfBGNRoOiuLFareTl5fLII4+Qmpri7bCuqOthjB6fXHOHmT//Tu68c9mYWzY9n6+vL/n5+SQkJHDjjTdiNI69sYp6TjuRkZE89NBDTJ8+ncBAdc8wXktkDdzn6OrqorOzk3Hjxqm6JuGLtLe3jxzjovbp+8/jOXnB07xWjRtQLobNZqO1tQ2dzk+VPd4uRX9/Px0dHURHRxMWFjamZi88rocxenR0dNDV1UV6evqYvubCJ2U6vr6+Y/a663A4aGlpxcdHS2xs7Ji95nqLTOA+h+efZixfMOH6GyeM7bFeL+OE62Os18MYPa6Xa9H14np67nqDTOAkSZIkSZJURlYSSpIkSZIkqYxM4CRJkiRJklRGJnCSJEmSJEkqIxM4SZIkSZIklZEJnCRJkiRJksrIBE6SJEmSJEllZAInSZIkSZKkMjKBkyRJkiRJUhmZwEmSJEmSJKmMTOAkSZIkSZJURiZwkiRJkiRJKiMTOEmSJEmSJJX5/0X6qIlog3C5AAAAAElFTkSuQmCC" alt="" width="624" height="361" /></p>
<p style="margin-top: 0pt; margin-bottom: 10pt;"><span style="-aw-import: ignore;"> </span>We can see that both algorithms yield a positive result, but the standard EMA a bit more so than the LR_EMA. Not only the profit is smaller, the drawdowns are also worse with the new invented indicator &#8211; which is probably the reason why the article, like almost any article about a new indicator, did not contain an example system or a backtest. But maybe the walk-forward period optimization was simply more effective on the fixed-period EMA, than on the variable-period LR_EMA. If so, then the LR_EMA would fare better with unoptimized systems.</p>
<p style="margin-top: 0pt; margin-bottom: 10pt;">The LREMA indicator and the EMA/LREMA trading system can be downloaded from the 2022 script repository.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://financial-hacker.com/the-linear-regression-adjusted-exponential-moving-average/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Ehlers Loops</title>
		<link>https://financial-hacker.com/ehlers-loops/</link>
					<comments>https://financial-hacker.com/ehlers-loops/#comments</comments>
		
		<dc:creator><![CDATA[Petra Volkova]]></dc:creator>
		<pubDate>Fri, 10 Jun 2022 17:08:46 +0000</pubDate>
				<category><![CDATA[Petra on Programming]]></category>
		<category><![CDATA[System Development]]></category>
		<category><![CDATA[Ehlers]]></category>
		<category><![CDATA[Pairs rotation]]></category>
		<category><![CDATA[SPY]]></category>
		<guid isPermaLink="false">https://financial-hacker.com/?p=4448</guid>

					<description><![CDATA[Price charts normally display price over time. Or in some special cases price over ranges or momentum. In his TASC articles in June and July 2022, John Ehlers proposed a different way of charting. The relation of two parameters, like price over momentum, or price A over price B, is displayed as a 2D curve &#8230; <a href="https://financial-hacker.com/ehlers-loops/" class="more-link">Continue reading<span class="screen-reader-text"> "Ehlers Loops"</span></a>]]></description>
										<content:encoded><![CDATA[<p><em>Price charts normally display price over time. Or in some special cases price over ranges or momentum. In his TASC articles in June and July 2022, John Ehlers proposed a different way of charting. The relation of two parameters, like price over momentum, or price A over price B, is displayed as a 2D curve in a scatter plot. The resulting closed or open loop is supposed to predict the future price development. Of course only if interpreted in the right way.</em></p>
<p><span id="more-4448"></span></p>
<p>For his loop chart, Ehlers filtered the low and high frequencies out of the two data series with a roofing filter. Its code in C for Zorro:</p>
<pre class="prettyprint">var Roofing(var *Data,int HPeriod,int LPeriod)
{
  var f = 1.414*PI/HPeriod;
  var hpa1 = exp(-f);
  var hpc2 = 2*hpa1*cos(f/2);
  var hpc3 = -hpa1*hpa1;
  var hpc1 = (1 + hpc2 - hpc3) / 4;
  f = 1.414*PI/LPeriod;
  var ssa1 = exp(-f);
  var ssc2 = 2*ssa1*cos(f/2);
  var ssc3 = -ssa1*ssa1;
  var ssc1 = 1 - ssc2 - ssc3;

  vars HP = series(0,3);
  HP[0] = hpc1*(Data[0] - 2*Data[1] + Data[2]) + hpc2*HP[1] + hpc3*HP[2];
  vars SS = series(HP[0],3);
  SS[0] = ssc1*(HP[0] + HP[1])/2 + ssc2*SS[1] + ssc3*SS[2];
  var Scaled = EMA(SS[0]*SS[0],.0242);
  return SS[0]/sqrt(Scaled);
}</pre>
<p>For demonstration purposes we apply that filter to the FDX price and volume series. The filtered data points serve as XY coordinates for our curve – the &#8220;Ehlers Loop&#8221;. The following script reads 3 months stock data from an online source and displays it in a scatter plot where the XY points are connected with splines:</p>
<pre class="prettyprint">function run()
{
  StartDate = ymd(wdate(NOW)-90); // 90 days before today
  BarPeriod = 1440;
  asset("FDX");
  var PriceRMS = Roofing(seriesC(),125,20);
  var VolRMS = Roofing(series(marketVol()),125,20);

  if(is(LOOKBACK)) return; // don't plot the lookback period
  plotGraph("Loop",VolRMS,PriceRMS,DOT|GRAPH,BLUE);
  plotGraph("Loops",VolRMS,PriceRMS,SPLINE|GRAPH,TRANSP|GREY);
  if(is(EXITRUN))
    plotGraph("Last",VolRMS,PriceRMS,SQUARE|GRAPH,RED);
}</pre>
<p>The plotGraph function is used to display each coordinate with a blue dot. The last day is marked with a red square.</p>
<p><img decoding="async" src="https://financial-hacker.com/wp-content/uploads/2022/06/061022_1641_EhlersLoops1.png" alt="" /></p>
<p>Ehlers intended his loops for discretionary trading, but it can of course also be automated. For instance, the last N coordinates could be used as inputs for Zorro&#8217;s neural net, which can then be trained to predict tomorrow&#8217;s price. Or even simpler, the slope of a polynomial regression through the last points could trigger a buy order when positive, or a sell order when negative. You can use Zorro&#8217;s polyfit function and filter with the regression error. I leave this trading system as an exercise to the reader.</p>
<p>The same method can be used to compare a stock with an index for a pairs rotation strategy. We&#8217;re using RTX and SPY:</p>
<pre class="prettyprint">function run()
{
  BarPeriod = 1440;
  LookBack = 300;
  StartDate = 20210801;
  EndDate = 20211130;

  assetAdd("RTX","YAHOO:*");
  asset("RTX");
  var Y = Roofing(seriesC(),125,20);
  assetAdd("SPY","YAHOO:*");
  asset("SPY");
  var X = Roofing(seriesC(),125,20);

  if(is(LOOKBACK)) return;
  plotGraph("Loop",X,Y,DOT|GRAPH,BLUE);
  plotGraph("Loops",X,Y,SPLINE|GRAPH,TRANSP|GREY);
  if(is(EXITRUN))
    plotGraph("Last",X,Y,SQUARE|GRAPH,RED);
}</pre>
<p>The resulting chart for the period from August to November 2021:</p>
<p><img decoding="async" src="https://financial-hacker.com/wp-content/uploads/2022/06/061022_1641_EhlersLoops2.png" alt="" /></p>
<p>I found that Ehlers&#8217; roofing filter is sensitive to the lookback period. It needs some time to &#8216;swing in&#8217;. A too short lookback period, like Zorro&#8217;s default 80 bars, produces a visibly different loop. With 300 bars we&#8217;re on the safe side.</p>
<p>What can you now do with this loop chart? Ehlers proposed to switch between stock and index depending on the loop rotation and angle quadrant. Our example above, with the SPY index on the Y axis and the stock on the X axis, has a clockwise rotating loop. On clockwise rotations, buy the stock and sell the index from 5 to 10 on the clock face. Sell the stock and buy the index from 11 to 4. Be out of the market between 4 and 5, and have both positions between 10 and 11.<img decoding="async" class="aligncenter" src="https://financial-hacker.com/wp-content/uploads/2022/06/Clock.png" alt="" width="211" height="198" /></p>
<p>On a counter clockwise rotation, do just the opposite. This was intended for discretionary trading, but can of course be automated with a script. Which I also gracefully leave to the reader.</p>
<p>The Roofing indicator and the Ehlers Loop scripts can be downloaded from the 2022 script repository. The Zorro software can be downloaded from <a href="https://zorro-project.com/download.php">https://zorro-project.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://financial-hacker.com/ehlers-loops/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>Never Sell in May!</title>
		<link>https://financial-hacker.com/never-sell-in-may/</link>
					<comments>https://financial-hacker.com/never-sell-in-may/#comments</comments>
		
		<dc:creator><![CDATA[Petra Volkova]]></dc:creator>
		<pubDate>Wed, 13 Apr 2022 17:55:03 +0000</pubDate>
				<category><![CDATA[Indicators]]></category>
		<category><![CDATA[Petra on Programming]]></category>
		<category><![CDATA[Seasonality]]></category>
		<category><![CDATA[SPY]]></category>
		<guid isPermaLink="false">https://financial-hacker.com/?p=4411</guid>

					<description><![CDATA[&#8220;Sell in May and go away&#8221; is an old stock trader&#8217;s wisdom. But in his TASC May 2022 article, Markos Katsanos examined that rule in detail and found that it should rather be &#8220;Sell in August and buy back in October&#8221;. Can trading be really this easy? Let&#8217;s have a look at the simple seasonal &#8230; <a href="https://financial-hacker.com/never-sell-in-may/" class="more-link">Continue reading<span class="screen-reader-text"> "Never Sell in May!"</span></a>]]></description>
										<content:encoded><![CDATA[<p><em><span style="font-size: revert;">&#8220;Sell in May and go away&#8221; is an old stock trader&#8217;s wisdom. But in his TASC May 2022 article, <strong>Markos Katsanos</strong> examined that rule in detail and found that it should rather be &#8220;Sell in August and buy back in October&#8221;. Can trading be really this easy? Let&#8217;s have a look at the simple seasonal trading rule and a far more complex application of it.</span></em></p>
<p><span id="more-4411"></span></p>
<p>The trading algorithm &#8220;Sell in August and buy back in October&#8221; could have been realized with the <a href="https://zorro-project.com" target="_blank" rel="noopener">Zorro software</a> in just 5 lines of C:</p>
<pre class="prettyprint">asset("SPY");<br />if(month() == 8 &amp;&amp; tdm() == 1) // sell 1st trading day of August<br />  exitLong();<br />else if(month() == 10 &amp;&amp; tdm() == 1) // buy back 1st trading day of October<br />  enterLong();</pre>
<p>Alas, this seasonality trading system was apparently way too simplistic for Markos Katsanos. His version is a veritable monster with many, many trade entry and exit conditions. The trading script below is a 1:1 translation from his AmiBroker code to C for the Zorro platform. I only moved his <strong>VFI indicator</strong> &#8211; a variant of the On Balance Volume, but with a lot more signals &#8211; in a separate indicator function because I didn&#8217;t like trading logic cluttered with indicator code.</p>
<pre class="prettyprint">var priceAvg(int Offset) {<br />  return (priceC(Offset)+priceH(Offset)+priceL(Offset))/3;<br />}<br /><br />var VFI(var Period,var Coef, var VCoef)<br />{<br />  vars Inters = series(log(priceAvg(0))-log(priceAvg(1)));<br />  var Vinter = StdDev(Inters,30);<br />  var Cutoff = Coef * Vinter * priceC();<br />  vars Volumes = series(marketVol());<br />  var Vave = SMA(Volumes+1,Period);<br />  var Vmax = Vave * VCoef;<br />  var VC = min(Volumes[0],Vmax);<br />  var MF = priceAvg(0)-priceAvg(1);<br />  vars VCPs = series(ifelse(MF &gt; Cutoff,VC,ifelse(MF &lt; -Cutoff,-VC,0)));<br />  var VFI1 = Sum(VCPs,Period)/Vave;<br />  return EMA(VFI1,3);<br />}<br /><br />function run()<br />{<br />  StartDate = 2006;<br />  EndDate = 2022;<br />  BarPeriod = 1440; // 1 day<br />  LookBack = 150;<br /><br />  assetList("AssetsIB");<br />  MaxLong = 1;<br />  Capital = 100000;<br />  Margin = Equity; // invest all you have<br />  Leverage = 1;<br />  BarZone = EST;<br />  Fill = 3; // enter/exit at next day open<br />  set(PARAMETERS,TESTNOW,PLOTNOW);<br /><br />  asset("VIX");<br />  var VIXdn = (priceC(0)/HH(25,0)-1)*100;<br />  var VIXup = (priceC(0)/LL(25,0)-1)*100;<br /><br />  asset("SPY");<br />  int SellMonth = optimize(8,5,8,1);<br />  var VIXupMax = optimize(60,50,60,10);<br />  var Crit = -optimize(20,15,20,5); //VFI SELL<br />  var K = optimize(1.5,1.3,1.7,.2); // ATR/VIX RATIO<br />  vars ATRs = series(ATR(15));<br />  var ATRDn = (ATRs[0]/MaxVal(ATRs,25)-1)*100;<br />  var ATRUp = (ATRs[0]/MinVal(ATRs,25)-1)*100;<br />  vars VFIs = series(VFI(130,0.2,2.5));<br />  vars SMAVFIs = series(SMA(VFIs,10));<br />  bool VolCondition = (VIXup &lt; VIXupMax || ATRUp &lt; K*VIXupMax ) &amp;&amp; VFIs[0] &gt; Crit;<br />  bool Buy = (month() &gt;= 10 || month() &lt; SellMonth) &amp;&amp; ref(VolCondition,1) != 0;<br />  bool SellSeasonal = month() == SellMonth ; //SEASONAL<br />  bool SellVolatility = VIXup &gt; 2*VIXupMax ; //VOLATILITY EXIT<br />  bool SellMF = crossUnder(VFIs,Crit) &amp;&amp; SMAVFIs[0] &lt; SMAVFIs[1] ;<br />  bool Sell = SellSeasonal || ref(SellVolatility,1) != 0 || ref(SellMF,1) != 0;<br /><br />  if(Sell)<br />    exitLong();<br />  else if(Buy)<br />    enterLong();<br />}</pre>
<p>Phew. And who said that you need at least 30 historical trades per optimized parameter? We&#8217;re optimizing the heck out of sell month, threshold, ratio, and other parameters, and won&#8217;t care that this strategy trades only once per year. All is in-sample of course, since the low number of trades prevents <a href="https://zorro-project.com/manual/en/numwfocycles.htm" target="_blank" rel="noopener">walk-forward optimization</a>. As can be expected, our reward is a splendid backtest:</p>
<p><img decoding="async" src="https://financial-hacker.com/wp-content/uploads/2022/04/041322_1736_NeverSellin1.png" alt="" /></p>
<p>We can see that the system managed to avoid the 2008 market drop, since it doubtlessly knew it in advance due to the in-sample optimization. So take the result with a grain &#8211; or better, a bag &#8211; of salt. For the audacious experimenter, the VFI indicator and the seasonality trading system can be downloaded from the 2022 script repository. You need Zorro S 2.47 or above for supporting volume and for the <a href="https://zorro-project.com/manual/en/series.htm" target="_blank" rel="noopener">ref</a> macro. And since the question recently came up: you can find the script repositories under &#8220;Links &amp; Download&#8221; on the right side of this page.</p>

]]></content:encoded>
					
					<wfw:commentRss>https://financial-hacker.com/never-sell-in-may/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Why 90% of Backtests Fail</title>
		<link>https://financial-hacker.com/why-90-of-backtests-fail/</link>
					<comments>https://financial-hacker.com/why-90-of-backtests-fail/#comments</comments>
		
		<dc:creator><![CDATA[jcl]]></dc:creator>
		<pubDate>Mon, 04 Apr 2022 15:55:47 +0000</pubDate>
				<category><![CDATA[System Development]]></category>
		<category><![CDATA[System Evaluation]]></category>
		<category><![CDATA[Backtest]]></category>
		<category><![CDATA[Montecarlo Methods]]></category>
		<category><![CDATA[SPY]]></category>
		<category><![CDATA[Walk forward analysis]]></category>
		<category><![CDATA[White's reality check]]></category>
		<guid isPermaLink="false">https://financial-hacker.com/?p=4373</guid>

					<description><![CDATA[About 9 out of 10 backtests produce wrong or misleading results. This is the number one reason why carefully developed algorithmic trading systems often fail in live trading. Even with out-of-sample data and even with cross-validation or walk-forward analysis, backtest results are often way off to the optimistic side. The majority of trading systems with &#8230; <a href="https://financial-hacker.com/why-90-of-backtests-fail/" class="more-link">Continue reading<span class="screen-reader-text"> "Why 90% of Backtests Fail"</span></a>]]></description>
										<content:encoded><![CDATA[<p>About 9 out of 10 backtests produce wrong or misleading results. This is the number one reason why carefully developed algorithmic trading systems often fail in live trading. Even with out-of-sample data and even with cross-validation or walk-forward analysis, backtest results are often way off to the optimistic side. The majority of trading systems with a positive backtest are in fact unprofitable. In this article I&#8217;ll discuss the cause of this phenomenon, and how to fix it.<span id="more-4373"></span></p>
<p>Suppose you&#8217;re developing an <a href="https://zorro-project.com/algotrading.php" target="_blank" rel="noopener">algorithmic trading strategy</a>, following all rules of proper <a href="https://financial-hacker.com/build-better-strategies-part-3-the-development-process/">system development</a>. But you are not aware that your trading algorithm has no statistical edge. The strategy is worthless, the trading rules equivalent to random trading, the profit expectancy – aside from transaction costs – is zero. The problem: you will rarely get a zero result in a backtest. A random trading strategy will in 50% of cases produce a negative backtest result, in 50% a positive result. But if the result is negative, you&#8217;re normally tempted to tweak the code or select assets and time frames until you finally got a profitable backtest. Which will happen relatively soon even when applying random modifications to the system. That&#8217;s why there are so many unprofitable strategies around, with nevertheless great backtest performances.</p>
<p>Does this mean that backtests are worthless? Not at all. But it is essential to know whether you can trust the test, or not.</p>
<h3><strong>The test-the-backtest experiment<br />
</strong></h3>
<p>There are several methods for verifying a backtest. None of them is perfect, but all give insights from different viewpoints. We&#8217;ll use the <a href="https://zorro-project.com" target="_blank" rel="noopener">Zorro algo trading software</a>, and run our experiments with the following test system that is optimized and backtested with walk-forward analysis:</p>
<pre class="prettyprint">function run()
{
  set(PARAMETERS,TESTNOW,PLOTNOW,LOGFILE);
  BarPeriod = 1440;
  LookBack = 100;
  StartDate = 2012;
  NumWFOCycles = 10;

  assetList("AssetsIB");
  asset("SPY");

  vars Signals = series(LowPass(seriesC(),optimize(10,2,20,2)));
  vars MMIFast = series(MMI(seriesC(),optimize(50,40,60,5)));
  vars MMISlow = series(LowPass(MMIFast,100));

  MaxLong = 1;
  if(falling(MMISlow)) {
    if(valley(Signals))
      enterLong();
    else if(peak(Signals))
      exitLong();
  }
}</pre>
<p>This is a classic trend following algorithm. It uses a lowpass filter for trading at the peaks and valleys of the smoothed price curve, and a MMI filter (<a href="https://financial-hacker.com/the-market-meanness-index/">Market Meanness Index</a>) for distinguishing trending from non-trending market periods. It only trades when the market has switched to rend regime, which is essential for profitable trend following systems. It opens only long positions. Lowpass and MMI filter periods are <a href="https://zorro-project.com/manual/en/optimize.htm" target="_blank" rel="noopener">optimized</a>, and the backtest is a <a href="https://zorro-project.com/manual/en/numwfocycles.htm" target="_blank" rel="noopener">walk-forward analysis</a> with 10 cycles.</p>
<h3><strong>The placebo trading system<br />
</strong></h3>
<p>It is standard for experiments to compare the real stuff with a placebo. For this we&#8217;re using a trading system that has obviously no edge, but was tweaked with the evil intention to appear profitable in a walk-forward analysis. This is our placebo system:</p>
<pre class="prettyprint">void run()
{
  set(PARAMETERS,TESTNOW,PLOTNOW,LOGFILE);
  BarPeriod = 1440;
  StartDate = 2012;
  setf(TrainMode,BRUTE);
  NumWFOCycles = 9;

  assetList("AssetsIB");
  asset("SPY");

  int Pause = optimize(5,1,15,1);
  LifeTime = optimize(5,1,15,1);

// trade after a pause...
  static int NextEntry;
  if(Init) NextEntry = 0;
  if(NextEntry-- &lt;= 0) {
    NextEntry = LifeTime+Pause;
    enterLong();
  }
}</pre>
<p>This system opens a position, keeps it a while, then closes it and pauses for a while. The trade and pause durations are walk-forward optimized between 1 day and 3 weeks. <a href="https://zorro-project.com/manual/en/timewait.ht" target="_blank" rel="noopener">LifeTime</a> is a predefined variable that closes the position after the given time. If you don&#8217;t believe in lucky trade patterns, you can rightfully assume that this system is equivalent to random trading. Let&#8217;s see how it fares in comparison to the trend trading system.</p>
<h3><strong>Trend trading vs. placebo trading<br />
</strong></h3>
<p>This is the equity curve with the trend trading system from a walk forward analysis from 2012 up to 3/2022:</p>
<p><img decoding="async" src="https://financial-hacker.com/wp-content/uploads/2022/04/040422_1441_Why90ofBack1.png" alt="" /></p>
<p>The plot begins 2015 because the preceding 3 years are used for the training and lookback periods. SPY follows the S&amp;P500 index and rises in the long term, so we could expect anyway some profit with a long-only system. But this system, with profit factor 3 and R2 coefficient 0.65 appears a lot better than random trading. Let&#8217;s compare it with the placebo system:</p>
<p><img decoding="async" src="https://financial-hacker.com/wp-content/uploads/2022/04/040422_1441_Why90ofBack2.png" alt="" /></p>
<p>The placebo system produced profit factor 2 and R2 coefficient 0.77. Slightly less than the real system, but in the same performance range. And this result was also from a walk-forward analysis, although with 9 cycles &#8211; therefore the later start of the test period. Aside from that, it seems impossible to determine solely from the equity curve and performance data which system is for real, and which is a placebo.</p>
<h3><strong>Checking the reality<br />
</strong></h3>
<p>Methods to verify backtest results are named &#8216;reality check&#8217;. They are specific to the asset and algorithm; in a multi-asset, multi-algo portfolio, you need to enable only the component you want to test. Let&#8217;s first see how the WFO split affects the backtest. In this way we can find out whether our backtest result was just due to lucky trading in a particular WFO cycle. We&#8217;re going to plot a <strong>WFO profile</strong> that displays the effect of the number of walk-forward cycles on the result. For this we outcomment the <strong>NumWFOCycles = …</strong> line in the code, and run it in training mode with the <strong>WFOProfile.c</strong> script:</p>
<pre class="prettyprint">#define run strategy
#include "trend.c" // &lt;= your script
#undef run
#define CYCLES 20 // max WFO cycles

function run()
{
  set(TESTNOW);
  NumTotalCycles = CYCLES-1;
  NumWFOCycles = TotalCycle+1;
  strategy();
}

function evaluate()
{
  var Perf = ifelse(LossTotal &gt; 0,WinTotal/LossTotal,10);
  if(Perf &gt; 1)
    plotBar("WFO+",NumWFOCycles,NumWFOCycles,Perf,BARS,BLACK);
  else
    plotBar("WFO-",NumWFOCycles,NumWFOCycles,Perf,BARS,RED);
}</pre>
<p>We&#8217;re redefining the <strong>run</strong> function to a different name. This allows us to just include the tested script and train it with WFO cycles from 2 up to the number defined by CYCLES. A backtest is executed after training. If an <strong>evaluate</strong> function is present, Zorro runs it automatically after any backtest. It plots a histogram bar of the profit factor (y axis) from each number of WFO cycles. First, the WFO profile of the trend trading system:</p>
<p><img decoding="async" src="https://financial-hacker.com/wp-content/uploads/2022/04/040422_1441_Why90ofBack3.png" alt="" /></p>
<p>We can see that the performance rises with the number of cycles. This is typical for a system that adapts to the market. All results are positive with a profit factor &gt; 1. Our arbitrary choice of 10 cycles produced a less than average result. So we can at least be sure that this backtest result was not caused by a particularly lucky number of WFO cycles.</p>
<p>The WFO profile of the placebo system:</p>
<p><img decoding="async" src="https://financial-hacker.com/wp-content/uploads/2022/04/040422_1441_Why90ofBack4.png" alt="" /></p>
<p>This time the number of WFO cycles had a strong random effect on the performance. And it is now obvious why I used 9 WFO cycles for that system. For the same reason I used brute force optimization, since it increases WFO variance and thus the chance to get lucky WFO cycle numbers. That&#8217;s the opposite of what we normally do when developing algorithmic trading strategies.</p>
<p>WFO profiles give insight into WFO cycle dependency, but not into randomness or overfitting by other means. For this, more in-depth tests are required. Zorro supports two methods, the Montecarlo Reality Check (MRC) with randomized price curves, and <a href="https://financial-hacker.com/whites-reality-check/">White&#8217;s Reality Check</a> (WRC) with detrended and bootstrapped equity curves of strategy variants. Both methods have their advantages and disadvantages. But since strategy variants from optimizing can only be created without walk-forward analysis, we&#8217;re using the MRC here.</p>
<h3><strong>The Montecarlo Reality Check<br />
</strong></h3>
<p>First we test both systems with random price curves. Randomizing removes short-term price correlations and market inefficiencies, but keeps the long-term trend. Then we compare our original backtest result with the randomized results. This yields a <strong>p-value</strong>, a metric of the probability that our test result was caused by randomness. The lower the p-Value, the more confidence we can have in the backtest result. In statistics we normally consider a result significant when its p-Value is below 5%.</p>
<p>The basic algorithm of the Montecarlo Reality Check (MRC):</p>
<ol>
<li>Train your system and run a backtest. Store the profit factor (or any other <a href="https://zorro-project.com/manual/en/performance.htm" target="_blank" rel="noopener">performance metric</a> that you want to compare).</li>
<li><a href="https://zorro-project.com/manual/en/detrend.htm" target="_blank" rel="noopener">Randomize</a> the price curve by randomly swapping price changes (shuffle without replacement).</li>
<li>Train your system again with the randomized data and run a backtest. Store the performance metric.</li>
<li>Repeat steps 2 and 3 1000 times.</li>
<li>Determine the number N of randomized tests that have a better result than the original test. The p-Value is N/1000.</li>
</ol>
<p>If our backtest result was affected by an overall upwards trending price curve, which is certainly the case for this SPY system, the randomized tests will be likewise affected. The MRC code:</p>
<pre class="prettyprint">#define run strategy
#include "trend.c" // &lt;= your script
#undef run
#define CYCLES 1000

function run()
{
  set(PRELOAD,TESTNOW);
  NumTotalCycles = CYCLES;
  if(TotalCycle == 1) // first cycle = original
    seed(12345); // always same random sequence
  else
    Detrend = SHUFFLE;
  strategy();
  set(LOGFILE|OFF); // don't export files
}

function evaluate()
{
  static var OriginalProfit, Probability;
  var PF = ifelse(LossTotal &gt; 0,WinTotal/LossTotal,10);
  if(TotalCycle == 1) {
    OriginalProfit = PF;
    Probability = 0;
  } else {
    if(PF &lt; 2*OriginalProfit) // clip image at double range
      plotHistogram("Random",PF,OriginalProfit/50,1,RED);
    if(PF &gt; OriginalProfit)
      Probability += 100./NumTotalCycles;
  }
  if(TotalCycle == NumTotalCycles) { // last cycle
    plotHistogram("Original",
     OriginalProfit,OriginalProfit/50,sqrt(NumTotalCycles),BLACK);
    printf("\n-------------------------------------------");
    printf("\nP-Value %.1f%%",Probability);
    printf("\nResult is ");
    if(Probability &lt;= 1)
      printf("highly significant") ;
    else if(Probability &lt;= 5)
      printf("significant");
    else if(Probability &lt;= 15)
      printf("maybe significant");
    else
      printf("statistically insignificant");
    printf("\n-------------------------------------------");
  }
}</pre>
<p>This code sets up the Zorro platform to train and test the system 1000 times. The <a href="https://zorro-project.com/manual/en/random.htm" target="_blank" rel="noopener"><strong>seed</strong></a> setting ensures that you get the same result on any MRC run. From the second cycle on, the historical data is shuffled without replacement. For calculating the p-value and plotting a histogram of the MRC, we use the <strong>evaluate</strong> function again. It calculates the p-value by counting the backtests resulting in higher profit factors than the original system. Depending on the system, training and testing the strategy a thousand times will take several minutes with Zorro. The resulting MRC histogram of the trend following system:</p>
<p><img decoding="async" src="https://financial-hacker.com/wp-content/uploads/2022/04/040422_1441_Why90ofBack5.png" alt="" /></p>
<p>The height of a red bar represents the number of shuffled backtests that ended at the profit factor shown on the x axis. The black bar on the right (height is irrelevant, only the x axis position matters) is the profit factor with the original price curve. We can see that most shuffled tests came out positive, due to the long-term upwards trend of the SPY price. But our test system came out even more positive. The p-Value is below 1%, meaning a high significance of our backtest. This gives us some confidence that the simple trend follower can achieve a similar result in real trading.</p>
<p>This cannot be said from the MRC histogram of the placebo system:</p>
<p><img decoding="async" src="https://financial-hacker.com/wp-content/uploads/2022/04/040422_1441_Why90ofBack6.png" alt="" /></p>
<p>The backtest profit factors now extend over a wider range, and many were more profitable than the original system. The backtest with the real price curve is indistinguishable from the randomized tests, with a p-value in the 40% area. The original backtest result of the placebo system, even though achieved with walk-forward analysis, is therefore meaningless.</p>
<p>It should be mentioned that the MRC cannot detect all invalid backtests. A system that was explicitly fitted to a particular price curve, for instance by knowing in advance its peaks and valleys, would get a low p-value by the MRC. No reality check could distinguish such a system from a system with a real edge. Therefore, neither MRC nor WRC can give absolute guarantee that a system works when it passes the check. But when it does not pass, you&#8217;re advised to better not trade it with real money.</p>
<p>I have uploaded the strategies to the 2022 script repository. The MRC and WFOProfile scripts are included in Zorro version 2.47.4 and above. You will need Zorro S for the brute force optimization of the placebo system.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://financial-hacker.com/why-90-of-backtests-fail/feed/</wfw:commentRss>
			<slash:comments>22</slash:comments>
		
		
			</item>
		<item>
		<title>The Relative Vix Strength Exponential Moving Average</title>
		<link>https://financial-hacker.com/the-relative-strength-exponential-moving-average/</link>
					<comments>https://financial-hacker.com/the-relative-strength-exponential-moving-average/#comments</comments>
		
		<dc:creator><![CDATA[Petra Volkova]]></dc:creator>
		<pubDate>Tue, 08 Mar 2022 16:28:49 +0000</pubDate>
				<category><![CDATA[Indicators]]></category>
		<category><![CDATA[Petra on Programming]]></category>
		<category><![CDATA[EMA]]></category>
		<category><![CDATA[Experiment]]></category>
		<category><![CDATA[RSI]]></category>
		<category><![CDATA[SPY]]></category>
		<guid isPermaLink="false">https://financial-hacker.com/?p=4325</guid>

					<description><![CDATA[The exponential moving average (EMA) and the Relative Strength Indicator (RSI) are both very popular and useful indicators for algorithmic trading. So why no glue both together to get an even better indicator? That was the basic idea of Vitali Apirine&#8217;s TASC 3/2022 article. We&#8217;re measuring the relative strength of a volatility index (VIX), and &#8230; <a href="https://financial-hacker.com/the-relative-strength-exponential-moving-average/" class="more-link">Continue reading<span class="screen-reader-text"> "The Relative Vix Strength Exponential Moving Average"</span></a>]]></description>
										<content:encoded><![CDATA[<p><em>The exponential moving average (EMA) and the Relative Strength Indicator (RSI) are both very popular and useful indicators for algorithmic trading. So why no glue both together to get an even better indicator? That was the basic idea of Vitali Apirine&#8217;s TASC 3/2022 article. We&#8217;re measuring the relative strength of a volatility index (VIX), and use the result as an EMA time period. Do we now have the ultimate indicator to beat them all?</em></p>
<p><span id="more-4325"></span></p>
<p>The algorithm from Vitali&#8217;s article, slightly reformulated for clarity:</p>
<p><strong>RSEMA[0] = Alpha * Price + (1-Alpha) * RSEMA[1]</strong></p>
<p>This is a classical EMA, but with a volatility dependent alpha factor:</p>
<p><strong>Alpha = 2/(TimePeriod+1) * (1 + 10*abs(EMAUp-EMADn)/(EMAUp+EMADn))</strong></p>
<p><strong>EMAUp</strong> and <strong>EMADn</strong> are the VIX EMA of days with positive returns and the VIX EMA of days with negative returns. The separation into positive and negative days resembles the RSI. And we have a double EMA in this formula, which will hopefully render the result twice as good. The factor <strong>10</strong> is inserted for getting an even better result.</p>
<p>VIX historical data is not available via API from free online sources as far as I know, but it can be downloaded from most brokers with the Zorro Download script. The resulting RSEMA code in C for Zorro:</p>
<pre class="prettyprint">var RSEMA(int Periods, int PdsEMA, var Mltp)
{
  asset("VIX");
  var VolatC = priceC();
  asset(AssetPrev); // re-select asset
  var VolatUp = series(ifelse(RET(1)&gt;0,VolatC,0)),
    VolatDn = series(ifelse(RET(1)&lt;0,VolatC,0));
  var EMAUp = EMA(VolatUp,PdsEMA), EMADn = EMA(VolatDn,PdsEMA);
  var RS = abs(EMAUp-EMADn)/(EMAUp+EMADn+0.00001)*Mltp;
  var Rate = 2./(Periods+1)*(RS+1);
  return EMA(priceC(),Rate);
}
</pre>
<p><strong>AssetPrev</strong> is the asset that was selected when the <strong>RSEMA</strong> function is called. Adding <strong>0.00001</strong> to the divisor prevents a crash by division by zero. Note that the often used EMA is available in two versions, to be called with a data series or with a single variable. I&#8217;m using the variable version here.</p>
<p>The RSEMA(10,10,10) applied on a SPX500 chart replicates the chart in the TASC article:</p>
<p><img decoding="async" src="https://financial-hacker.com/wp-content/uploads/2022/03/030822_1611_TheRelative1.png" alt=""></p>
<p>We can see that the RSEMA (blue) has noticeably less lag than the EMA (red), which is not really surprising because the higher alpha rate is equivalent to a smaller EMA time period. The author believed that EMA crossovers of this indicator can be used as entry points for long trades. But with the caveat that they <em>&#8220;produce lots of whipsaws […] and should be used in conjunction with price analysis&#8221;</em>.</p>
<p>He&#8217;s certainly right. A long-only SPY trading system with RSEMA-EMA crossovers at default parameter values produced a positive end result, as seen in the chart below. But with large drawdowns and, sadly, far less profitable than buy-and-hold. So, be sure to use it only in conjunction with price analysis. Whatever that means. And better not on a real money account.</p>
<p><img decoding="async" src="https://financial-hacker.com/wp-content/uploads/2022/03/030822_1611_TheRelative2.png" alt=""></p>
<p>For your own experiments, the RSEMA indicator and the SPY trading system can be downloaded from the 2022 script repository.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://financial-hacker.com/the-relative-strength-exponential-moving-average/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>Petra on Programming: Get Rid of Noise</title>
		<link>https://financial-hacker.com/petra-on-programming-get-rid-of-noise/</link>
					<comments>https://financial-hacker.com/petra-on-programming-get-rid-of-noise/#comments</comments>
		
		<dc:creator><![CDATA[Petra Volkova]]></dc:creator>
		<pubDate>Fri, 27 Nov 2020 14:54:48 +0000</pubDate>
				<category><![CDATA[Indicators]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ehlers]]></category>
		<category><![CDATA[RSI]]></category>
		<category><![CDATA[SPY]]></category>
		<guid isPermaLink="false">https://financial-hacker.com/?p=3742</guid>

					<description><![CDATA[A major problem of indicator-based strategies is that most indicators produce more or less noisy output, resulting in false signals. The faster the indicator reacts on market situations, the noisier is it usually. In the S&#38;C December issue, John Ehlers proposed a de-noising technology based on correlation. Compared with a lowpass filter, this method does &#8230; <a href="https://financial-hacker.com/petra-on-programming-get-rid-of-noise/" class="more-link">Continue reading<span class="screen-reader-text"> "Petra on Programming: Get Rid of Noise"</span></a>]]></description>
										<content:encoded><![CDATA[<p><em>A major problem of indicator-based strategies is that most indicators produce more or less noisy output, resulting in false signals. The faster the indicator reacts on market situations, the noisier is it usually. In the S&amp;C December issue, <strong>John Ehlers</strong> proposed a de-noising technology based on correlation. Compared with a lowpass filter, this method does not delay the signal. As an example, we will apply the noise elimination to Ehlers&#8217; <strong>MyRSI</strong> indicator, a RSI variant that he presented in an earlier article.</em><span id="more-3742"></span></p>
<p>The MyRSI indicator sums up positive and negative changes in a data series, and returns their normalized difference. The C version for Zorro:</p>
<pre class="prettyprint">var MyRSI(vars Data,int Period)<br />{<br /> var CU = SumUp(Data,Period+1);<br /> var CD = -SumDn(Data,Period+1);<br /> return ifelse(CU+CD != 0,(CU-CD)/(CU+CD),0);<br />}<span style="color: #2e74b5"><br /></span></pre>
<p>For eliminating noise, the function below (<strong>NET</strong> = <strong>N</strong>oise <strong>E</strong>limination <strong>T</strong>echnology) calculates the <strong>Kendall Correlation</strong> of a data series with a rising slope. This is supposed to remove all components that are not following the main trend of the indicator output. The code:</p>
<pre class="prettyprint">var NET(vars Data,int Period)<br />{<br /> int i,k;<br /> var Num = 0;<br /> for(i=1; i&lt;Period; i++)<br />   for(k=0; k&lt;i; k++)<br />     Num -= sign(Data[i]-Data[k]);<br /> var Denom = .5*Period*(Period-1);<br /> return Num/Denom;<br />}</pre>
<p>For making the effect of the denoising visible, we produce a SPY chart from 2019-2020. The red line is the original MyRSI, the blue line the de-noised version:</p>
<p><img decoding="async" src="https://financial-hacker.com/wp-content/uploads/2020/11/112720_1424_PetraonProg1.png" alt="" /></p>
<p>The technology appears to work well in this example for removing the noise. But the NET function is not meant as a replacement of a lowpass or smoothing filter: its output is always in the -1 .. +1 range, so it can be used for de-noising oscillators, but not, for instance, to generate a smoothed version of the price curve.</p>
<p>One might be tempted to use the blue line in the above chart for trade signals. RSI-based signals usually trigger a long trade when the indicator crosses below a lower threshold, and a short trade when it crosses above an upper threshold. But alas, neither is strategy development this easy nor is the de-noised MyRSI the holy grail of indicators. I tested several methods to use it for generating SPY trade signals, but neither was a strong improvement over a simple lowpass filter strategy or even to buy-and-hold. Maybe a reader can find a more convincing solution?</p>
<p>The MyRSI and NET functions and the script for generating the chart can be downloaded from the 2020 script repository. You need Zorro 2.33 or above.</p>

]]></content:encoded>
					
					<wfw:commentRss>https://financial-hacker.com/petra-on-programming-get-rid-of-noise/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>The Mechanical Turk</title>
		<link>https://financial-hacker.com/the-mechanical-turk/</link>
					<comments>https://financial-hacker.com/the-mechanical-turk/#comments</comments>
		
		<dc:creator><![CDATA[jcl]]></dc:creator>
		<pubDate>Mon, 10 Dec 2018 07:17:27 +0000</pubDate>
				<category><![CDATA[Indicators]]></category>
		<category><![CDATA[System Development]]></category>
		<category><![CDATA[Options]]></category>
		<category><![CDATA[Price distribution]]></category>
		<category><![CDATA[Sentiment]]></category>
		<category><![CDATA[SPY]]></category>
		<guid isPermaLink="false">http://www.financial-hacker.com/?p=2974</guid>

					<description><![CDATA[We can see thinking machines taking over more and more human tasks, such as car driving, Go playing, or financial trading. But sometimes it&#8217;s the other way around: humans take over jobs supposedly assigned to thinking machines. Such a job is commonly referred to as a Mechanical Turk in reminiscence to Kempelen&#8217;s famous chess machine &#8230; <a href="https://financial-hacker.com/the-mechanical-turk/" class="more-link">Continue reading<span class="screen-reader-text"> "The Mechanical Turk"</span></a>]]></description>
										<content:encoded><![CDATA[<p>We can see thinking machines taking over more and more human tasks, such as car driving, Go playing, or financial trading. But sometimes it&#8217;s the other way around: humans take over jobs supposedly assigned to thinking machines. Such a job is commonly referred to as a <strong>Mechanical Turk</strong> in reminiscence to Kempelen&#8217;s famous chess machine from 1768. In our case, a Mechanical Turk is an automated trading algorithm based on human intelligence. <span id="more-2974"></span></p>
<p>Theoretically, many trend trading systems would fall in the Turk category since they are based on following the herd. But here we&#8217;re not looking into trader&#8217;s opinions of the current market situation, but into their expectations of the future. There are several methods. The most usual is evaluating the <strong>Commitment Of Traders</strong> report, for which many platforms, also Zorro, provide easy-to-use indicators. But some publications (1) found that using the COT report for predicting the markets produces mixed results at best.</p>
<p>There&#8217;s a more precise way to get the market&#8217;s expectations. It&#8217;s using <a href="https://www.financial-hacker.com/algorithmic-options-trading/">options premiums</a>. If an option expires in 6 weeks, its current premium reflects what option buyers or sellers think about the underlying price in 6 weeks.</p>
<h3>The price probability distribution</h3>
<p>For deriving the expected underlying price at expiration, we have to take all strike prices in consideration. Here&#8217;s the algorithm in short (I haven&#8217;t invented it, a longer description can be found in (2)). Assume SPY is currently trading at $200. For getting the probability that it will rise to between 210 and 220 in 6 weeks, we&#8217;re looking into the 210 call and the 220 call. Suppose they trade at $14 and $10. So we can buy the 210 call and sell the 220 call and pay $4 difference. If at expiration SPY is under 210, both contracts have no worth and we lose the 4 dollars. If it is above 220, our gain is the $10 strike difference minus $4 premium difference, so we win 6 dollars. If it is between 210 and 220, our win or loss is also inbetween, with an average of (-4+6)/2 = 1 dollar.</p>
<p>When options prices are &#8220;fair&#8221;, i.e. solely determined by probabilities where the price will end up at expiration, summing up over all possible outcomes yields zero profit or loss. So</p>
<p><em><strong>-$4×L + $1×M + $6×H = $0</strong></em></p>
<p>where <em><strong>L</strong></em> is the probability for SPY to end up below 210, <em><strong>M</strong></em> is the probability that it will be between 210 and 220, and <em><strong>H</strong></em> is the probability that it will be above 220. Since one of these three alternatives will always happen, the sum of all 3 probabilities must be 1:</p>
<p><em><strong>L + M + H = 1</strong></em></p>
<p>Now let&#8217;s assume that we know <em><strong>L</strong></em> already. Then we have two equations with two unknowns, which are easily solved:</p>
<p><em><strong>5L &#8211; 5H = 1    =&gt;  H = L &#8211; 0.2<br />
10L + 5M = 6    =&gt;  M = 1.2 -2L </strong></em></p>
<p>Assuming <em><strong>L = 50%</strong></em> yields <em><strong>H = 30%</strong></em> and <em><strong>M = 20%</strong></em>.</p>
<p>How do we now get the value <em><strong>L</strong></em>? We simply take the lowest strike offered at the market, and assume that the probability of SPY ending up even below that is zero. So our first <em><strong>L</strong></em> is 0.  We can now use the method above to calculate the <em><strong>M</strong></em> belonging to the interval between the lowest and the second-lowest strike. That <em><strong>M</strong></em> is then added to <em><strong>L</strong></em> since it&#8217;s the probability of SPY ending up at or below the second-lowest strike. We continue that process with the next interval, getting a specific <em><strong>L</strong></em> and <em><strong>M</strong></em> for any interval until we arrived at the highest strike. If the traders have been consistent with their assumptions, the final <em><strong>L</strong></em> &#8211; the sum over all <em><strong>M</strong></em>s &#8211; should be now at or close to 1.</p>
<p>Here&#8217;s a small script that displays the 6-weeks <em><strong>L</strong></em> distribution of SPY:</p>
<pre class="prettyprint">void main() 
{
	StartDate = 20170601;
	LookBack = 0;

	assetList("AssetsIB");
	asset("SPY"); 

// load today's contract chain
	contractUpdate(0,0,CALL|PUT);
	printf("\n%i contracts",NumContracts);
	if(!NumContracts) return;

// get underlying price
	var Price,Current = priceClose(0);
	printf("\nCurrent price %.2f",Current);

// plot CPD histogram	
	contractCPD(45);	// 6 weeks
	int N = 0;
	for(Price = 0.75*Current; Price &lt; 1.25*Current; N++, Price += 0.01*Current)
		plotBar("CPD",N,floor(Price),cpd(Price),BARS|LBL2,RED);
	printf("\nExpected price %.2f",cpdv(50));

// compare with real future price
	set(PEEK);
	N = timeOffset(UTC,-45,0,0);
	printf("\nFuture price %.2f",priceClose(N));
}</pre>
<p>The result is a histogram of expected probabilities, in percent, that the SPY price will be at or below the price at the x-axis six weeks in the future. I&#8217;ve marked the current price with a black bar.</p>
<p><figure id="attachment_3093" aria-describedby="caption-attachment-3093" style="width: 699px" class="wp-caption alignnone"><a href="https://www.financial-hacker.com/wp-content/uploads/2019/06/cpd.png"><img loading="lazy" decoding="async" class="wp-image-3093 size-full" src="https://www.financial-hacker.com/wp-content/uploads/2019/06/cpd.png" alt="" width="699" height="284" srcset="https://financial-hacker.com/wp-content/uploads/2019/06/cpd.png 699w, https://financial-hacker.com/wp-content/uploads/2019/06/cpd-300x122.png 300w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px" /></a><figcaption id="caption-attachment-3093" class="wp-caption-text">SPY 6 weeks price probability distribution at June 1, 2017</figcaption></figure></p>
<p>The <strong><a href="https://manual.zorro-project.com/contractcpd.htm">contractCPD</a></strong> function generates the distribution with the above described algorithm, <strong>cpd</strong> returns the accumulated probability <em><strong>L</strong></em> (in percent) at a given price, and <strong>cpdv</strong> returns the price at a given <em><strong>L</strong></em>. Therefore, <strong>cpdv(50)</strong> is the median of market expectations. In our case, at June 1 2017, a modest price increase to $245 was expected for mid-July (in fact the price ended up at $245.51, but don&#8217;t get too excited &#8211; often trader&#8217;s expectations fall short by several dollars). We can also see an unusal step at the begin of the histogram: about 10% of traders expected a strong drop to below $200. Maybe Trump twittered something that morning.</p>
<h3>The strategy</h3>
<p>We will now exploit trader&#8217;s expectations for a strategy, and this way check if they have any merit. This is our mechanical Turk:</p>
<pre class="prettyprint">#define Sentiment AssetVar[0]

void run() 
{
	StartDate = 20120102;
	EndDate = 20171231;
	BarPeriod = 1440;

	assetList("AssetsIB");
	asset("SPY");
	MaxLong = MaxShort = 1;

// load today's contract chain
	contractUpdate(0,0,CALL|PUT);
	int N = contractCPD(45);

// increase/decrease market sentiment 
	if(N) {
		var Expect = cpdv(50) - priceClose();
		if(Expect &lt; 0)
			Sentiment = min(Expect,Sentiment+Expect);
		else
			Sentiment = max(Expect,Sentiment+Expect);
	}
	if(Sentiment &gt; 5)
		enterLong();
	else if(Sentiment &lt; -5)
		enterShort();
	
	plot("Sentiment",Sentiment,NEW,RED);
}</pre>
<p>We&#8217;re checking the market expectation every day and add it to a previously defined <strong>Sentiment</strong> asset variable. If the expectation changes sign, so does <strong>Sentiment</strong>. If its amount has accumulated above 5, we buy a long or short position dependent on its sign. This way we&#8217;re only considering the market expectation when it&#8217;s either relatively strong or had the same direction for several days.</p>
<p>The result:</p>
<p><a href="https://www.financial-hacker.com/wp-content/uploads/2019/06/turkresult.png"><img loading="lazy" decoding="async" class="alignnone wp-image-3098 size-full" src="https://www.financial-hacker.com/wp-content/uploads/2019/06/turkresult.png" alt="" width="699" height="359" srcset="https://financial-hacker.com/wp-content/uploads/2019/06/turkresult.png 699w, https://financial-hacker.com/wp-content/uploads/2019/06/turkresult-300x154.png 300w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px" /></a></p>
<p>The system produces about 20% annual return with profit factor 3. The red line in the lower chart is the Sentiment variable &#8211; we can see that it often steadily increases, but sometimes also decreases. Since SPY normally rises, shorting it with this strategy produces less profit than going long, but is still slightly profitable with an 1.16 profit factor.</p>
<h3>Predicting the price in 6 weeks</h3>
<p>What are traders currently thinking of the SPY price in 6 weeks? For this, the first script above needs just be slightly modified so that it does not use historical options data, but connects to IB and downloads the current options chain with all prices:</p>
<pre class="prettyprint">void main() 
{
	StartDate = NOW;
	LookBack = 0;

	assetList("AssetsIB");
	asset("SPY"); 

// load today's contract chain
	contractUpdate(0,0,CALL|PUT);
	printf("\n%i contracts",NumContracts);
	if(!NumContracts) return;

// get underlying price
	var Price,Current = priceClose(0);
	printf("\nCurrent price %.2f",Current);

// plot CPD histogram
	printf("\nWait time approx %i minutes",1+NumContracts/200);
	contractCPD(45);
	int N = 0;
	for(Price = 0.75*Current; Price &lt; 1.25*Current; N++, Price += 0.01*Current)
		plotBar("CPD",N,floor(Price),cpd(Price),BARS|LBL2,RED);
	printf("\nExpected price %.2f",cpdv(50));
}</pre>
<p>This script must be started in Zorro&#8217;s Trade mode with the IB plugin selected. Mind the displayed &#8220;wait time&#8221;. IB sometimes needs up to ten seconds for returning the price of an option contract, so downloading the prices of all 6-weeks contracts can take half an hour or more.</p>
<p>I ran that script today (Dec 11 2018) and the option traders expect the SPY price to rise to $269 in six weeks. So I&#8217;ll check the price by the end of January and post here if they have been right.</p>
<p>I&#8217;ve added the scripts to the 218 repository. You&#8217;ll need Zorro 1.99 or above, and SPY options EOD history for the first 2 scripts. You&#8217;ll really have to buy it this time, the free <a href="https://www.financial-hacker.com/algorithmic-options-trading/">artificial options history</a> won&#8217;t do for market sentiment.</p>
<h3>Conclusions</h3>
<ul>
<li>A Turk can beat a thinking machine.</li>
<li>Option traders tend to underestimate future price changes.</li>
<li>But they are often right in the price direction.</li>
</ul>
<h3>Literature</h3>
<p>(1) <a href="http://www.farmdoc.illinois.edu/nccc134/conf_2007/pdf/confp01-07.pdf">Sanders, Irwin, Merrin: Smart Money? The Forecasting Ability of CFTC Large Traders (2007)</a></p>
<p>(2) <a href="https://www.globalcapital.com/article/k6543wh6f19l/option-prices-imply-a-probability-distribution">Pat Neal, Option Prices Imply a Probability Distribution</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://financial-hacker.com/the-mechanical-turk/feed/</wfw:commentRss>
			<slash:comments>39</slash:comments>
		
		
			</item>
		<item>
		<title>Algorithmic Options Trading 3</title>
		<link>https://financial-hacker.com/algorithmic-options-trading-part-3/</link>
					<comments>https://financial-hacker.com/algorithmic-options-trading-part-3/#comments</comments>
		
		<dc:creator><![CDATA[jcl]]></dc:creator>
		<pubDate>Sun, 26 Nov 2017 07:59:48 +0000</pubDate>
				<category><![CDATA[Introductory]]></category>
		<category><![CDATA[No Math]]></category>
		<category><![CDATA[System Development]]></category>
		<category><![CDATA[Call]]></category>
		<category><![CDATA[Earnings]]></category>
		<category><![CDATA[ETF]]></category>
		<category><![CDATA[Options]]></category>
		<category><![CDATA[Put]]></category>
		<category><![CDATA[SPY]]></category>
		<category><![CDATA[Strangle]]></category>
		<guid isPermaLink="false">http://www.financial-hacker.com/?p=2718</guid>

					<description><![CDATA[In this article we&#8217;ll look into a real options trading strategy, like the strategies that we code for clients. This one however is based on a system from a trading book. As mentioned before, options trading books often contain systems that really work &#8211; which can not be said about day trading or forex trading &#8230; <a href="https://financial-hacker.com/algorithmic-options-trading-part-3/" class="more-link">Continue reading<span class="screen-reader-text"> "Algorithmic Options Trading 3"</span></a>]]></description>
										<content:encoded><![CDATA[<p>In this article we&#8217;ll look into a real options trading strategy, like the strategies that we code for clients. This one however is based on a system from a trading book. As mentioned before, options trading books often contain systems that <strong>really work</strong> &#8211; which can not be said about day trading or forex trading books. The system examined here is indeed able to produce profits. Which is not surprising, since it apparently <strong>never loses</strong>. But it is also obvious that its author has never backtested it. <span id="more-2718"></span></p>
<p>To clarify: I&#8217;ve selected the system not because of high profit expectancy or clever algorithm, but because it is quite simple and does not need any of the additional data normally used for option systems, such as earnings reports, open interest, implied volatility, or greeks. Which means that you don&#8217;t need to call R functions for options math, and you don&#8217;t need to pay for iVolatility options data, Zacks earnings, or any other historical data for backtesting the system. The free <a href="http://www.financial-hacker.com/hackers-tools-zorro-and-r/" target="_blank" rel="noopener">Zorro</a> version is sufficient.</p>
<p>The book cover praises the system inside:  <strong><em>To reduce your investment risk to nearly zero &#8211; Achieve consistent high annual returns in excess of 30% &#8211; It does not require you to learn fundamental and technical analyzes, deltas, thetas, gamas, vegas or other Greek goblethegooks of stocks or options  &#8211; It does not require the ability to predict market direction &#8211; It does not require stock picking skills &#8211; It does not require close monitoring</em></strong>.</p>
<p>All statements with which I, of course, highly sympathize. After all, why would we need Greek goblethegooks when we get annual 30% without them! And here are the (simplified) rules of our strategy:</p>
<ol>
<li>Sell a 6 weeks call and a 6 weeks put of an index ETF. Choose strike prices so that the premiums are in the $1..$2 range.</li>
<li>If the underlying price touches one of our strike prices, thus threatening an <a href="http://www.financial-hacker.com/algorithmic-options-trading/" target="_blank" rel="noopener">in-the-money</a> expiration, buy back that option and immediately sell a new option of the same type, but to a further expiration date, and a premium that covers the loss.</li>
<li>Wait until all options are expired, then go back to 1.</li>
</ol>
<p>If you have a bit experience with options, you&#8217;ll notice that rule 1 describes a <strong>strangle</strong> combo. And you&#8217;ll next notice something strange with rule 2. Right, such a system can never lose, since any loss would apparently be compensated by the premium from the new trade. Have we finally found the <a href="http://www.financial-hacker.com/seventeen-popular-trade-strategies-that-i-dont-really-understand/" target="_blank" rel="noopener">Holy Grail</a>, an ever-winning system? </p>
<h3>Strangle profit</h3>
<p>For getting an impression of the profit and risk, let&#8217;s first check the gain/loss diagram of the 6-week $2 premium strangle. This is the definition of a strangle in the curve plotting script from the <a href="http://www.financial-hacker.com/algorithmic-options-trading-2/" target="_blank" rel="noopener">last article</a>:</p>
<pre class="prettyprint">// Strangle
void combo()
{
	optionAdd(1,SELL|CALL,6);
	optionAdd(1,SELL|PUT,-6);
}</pre>
<p>The $6 strike-spot distances have been chosen for $2 premium from a hypothetical index ETF with $250 price, multiplier 100, and 15% annual volatility. This is the profit/loss diagram:</p>
<p><a href="http://www.financial-hacker.com/wp-content/uploads/2018/08/OptionsCurve_EURUSD_s.png"><img loading="lazy" decoding="async" class="alignnone wp-image-2841 size-full" src="http://www.financial-hacker.com/wp-content/uploads/2018/08/OptionsCurve_EURUSD_s.png" alt="" width="742" height="481" srcset="https://financial-hacker.com/wp-content/uploads/2018/08/OptionsCurve_EURUSD_s.png 742w, https://financial-hacker.com/wp-content/uploads/2018/08/OptionsCurve_EURUSD_s-300x194.png 300w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px" /></a></p>
<p>Our potential gain is about $400 per combo trade, as expected (2 * 100 * $2 premium). But the price of our index ETF should better not move more than $10 in any direction until expiration. Otherwise the loss can quickly reach the thousand dollar zone. This does not really look like &#8220;reduce your investment risk to nearly zero&#8221;. But wait, we have rule 2, which will certainly save the day! Let&#8217;s put that to the backtest. </p>
<h3>The system</h3>
<pre class="prettyprint">// Quite simple options trading system 
#include &lt;contract.c&gt;

#define PREMIUM	2.00
#define WEEKS	6    // expiration

int i;
var Price;

CONTRACT* findCall(int Expiry,var Premium)
{
	for(i=0; i&lt;50; i++) {
		if(!contract(CALL,Expiry,Price+0.5*i)) return 0;
		if(between(ContractBid,0.1,Premium)) return ThisContract;
	}
	return 0;
}

CONTRACT* findPut(int Expiry,var Premium)
{
	for(i=0; i&lt;50; i++) {
		if(!contract(PUT,Expiry,Price-0.5*i)) return 0;
		if(between(ContractBid,0.1,Premium)) return ThisContract;
	}
	return 0;
}

void run() 
{
	StartDate = 20110101;
	EndDate = 20161231;
	BarPeriod = 1440;
	BarZone = ET;
	BarOffset = 15*60+20; // trade at 15:20 ET
	LookBack = 1;

	assetList("AssetsIB");
	asset("SPY"); // unadjusted!
	Multiplier = 100;

// load today's contract chain
	contractUpdate("SPY",0,CALL|PUT);
	Price = priceClose(); 

// check for in-the-money and roll 	
	for(open_trades) {
		var Loss = -TradeProfit/Multiplier;
		if(TradeIsCall &amp;&amp; Price &gt;= TradeStrike) {
			exitTrade(ThisTrade);
			printf("#\nRoll %.1f at %.2f Loss %.2f",
				TradeStrike,Price,TradeProfit);
			CONTRACT* C = findCall(NWEEKS*7,Loss*1.1);
			if(C) {
				MarginCost = 0.15*Price - (C-&gt;fStrike-Price);
				enterShort();
			}
		} else if(TradeIsPut &amp;&amp; Price &lt;= TradeStrike) {
			exitTrade(ThisTrade);
			printf("#\nRoll %.1f at %.2f Loss %.2f",
				TradeStrike,Price,TradeProfit);
			CONTRACT* C = findPut(NWEEKS*7,Loss*1.1);
			if(C) { 
				MarginCost = 0.15*Price - (Price-C-&gt;fStrike);
				enterShort();
			}
		}
	}
	
// all expired? enter new options
	if(!NumOpenShort) { 
		CONTRACT *Call = findCall(NWEEKS*7,PREMIUM); 
		CONTRACT *Put = findPut(NWEEKS*7,PREMIUM); 		
		if(Call &amp;&amp; Put) {
			MarginCost = 0.5*(0.15*Price-
				min(Call-&gt;fStrike-Price,Price-Put-&gt;fStrike));
			contract(Call); enterShort();
			contract(Put); enterShort();
		}
	}
}</pre>
<p>A brief discussion of the code (a more detailed intro in system coding can be found in the Black Book). The <strong>findCall</strong> function gets an expiration time and a premium, and looks through the current option chain for a call contract that matches these two parameters. For this it increases the strike price in 50 steps. If then still no contract is found at or below the desired premium, it returns 0. Otherwise it returns a pointer to the found contract. The <strong>findPut</strong> function does the same for a put contract.</p>
<p>The <strong>run</strong> function sets up the backtest time and other parameters for the backtest as well as for live trading. It&#8217;s a daily script, and the function runs every day at 3:20 pm Eastern Time. It uses two historical data files for the backtest. The <strong>asset</strong> function loads a file with the unadjusted SPY prices (why unadjusted? Because determining the strikes-price distances would not work with dividend adjusted prices). The <strong>contractUpdate</strong> function loads the SPY options chain of that day, either from the broker, or from a file.  Those two files must be present, plus the asset list <strong>AssetsIB.csv</strong> that contains commission, margin, and other parameters for simulating the broker or exchange where we trade.</p>
<p>The next part of the code implements the miraculous rule 2. It calculates the current loss, closes any position that is at or in the money, and immediately opens a new position, with a premium slightly above our loss (<strong>Loss*1.1</strong>). This way we&#8217;re punishing the market for going against us. The <strong>printf</strong> function just stores that event in the log, so that we can go through it and better see the fate of those trades.</p>
<p>The last part of the code is the strangle. Note the <strong>MarginCost</strong> calculation. Margin affects the required capital and thus the backtest performance, so it should reflect your broker&#8217;s margin requirement. By default, the margin of a sold option is the premium plus some fixed percentage of the underlying that&#8217;s set up in the asset list. But brokers often apply a more complex margin formula for option combos. Here we assume that the margin of a sold strangle is the premium (which is automatically added) plus 15% of the underlying price minus the minimum of the two strike differences. We multiply that by half because we have 2 positions, but the margin formula is for the whole strangle.</p>
<p>The backtest from 2011-2016 needs only about 2 seconds. This is the result (assuming we always open 1 contract):</p>
<pre class="prettyprint">Monte Carlo Analysis... Median AR 12%
Win 3699$  MI 51.38$  DD 935$  Capital 5108$
Trades 93  Win 59.1%  Avg +39.8p  Bars 24
AR 12%  PF 1.84  SR 1.08  UI 5%  R2 0.89</pre>
<p>We have won about 60% of all trades, and made 12% annual return based on Montecarlo analysis.  Not too exciting. What about the &#8220;consistent high annual returns in excess of 30%&#8221;? And how can we get a $935 drawdown when we always compensate our loss with a new trade?</p>
<h3>Is rolling over irrational?</h3>
<p>Let&#8217;s try the same strategy without the rule 2. This simplifies the script a bit:</p>
<pre class="prettyprint">// Even simpler options trading system 
#include &lt;contract.c&gt;

#define PREMIUM	2.00
#define WEEKS	6 // expiration

int i;
var Price;

CONTRACT* findCall(int Expiry,var Premium)
{
	for(i=0; i&lt;50; i++) {
		if(!contract(CALL,Expiry,Price+0.5*i)) return 0;
		if(between(ContractBid,0.1,Premium)) return ThisContract;
	}
	return 0;
}

CONTRACT* findPut(int Expiry,var Premium)
{
	for(i=0; i&lt;50; i++) {
		if(!contract(PUT,Expiry,Price-0.5*i)) return 0;
		if(between(ContractBid,0.1,Premium)) return ThisContract;
	}
	return 0;
}

void run() 
{
	StartDate = 20110101;
	EndDate = 20161231;
	BarPeriod = 1440;
	BarZone = ET;
	BarOffset = 15*60+20; // trade at 15:20 ET
	LookBack = 1;
	set(PLOTNOW);
	set(PRELOAD|LOGFILE);

	assetList("AssetsIB");
	asset("SPY"); // unadjusted!
	Multiplier = 100;

// load today's contract chain
	Price = priceClose();
	contractUpdate("SPY",0,CALL|PUT);

// all expired? enter new options
	if(!NumOpenShort) { 
		CONTRACT *Call = findCall(WEEKS*7,PREMIUM); 
		CONTRACT *Put = findPut(WEEKS*7,PREMIUM); 		
		if(Call &amp;&amp; Put) {
			MarginCost = 0.5*(0.15*Price-min(Call-&gt;fStrike-Price,Price-Put-&gt;fStrike));
			contract(Call); enterShort();
			contract(Put); enterShort();
		}
	}
}</pre>
<p>Simply removing the rolling over improved the system remarkably:</p>
<pre class="prettyprint">Monte Carlo Analysis... Median AR 25%
Win 5576$  MI 77.46$  DD 785$  Capital 3388$
Trades 78  Win 80.8%  Avg +71.5p  Bars 35
AR 27%  PF 2.00  SR 0.92  UI 5%  R2 0.92</pre>
<p>The equity curve with no rolling:</p>
<p><a href="http://www.financial-hacker.com/wp-content/uploads/2018/08/Options32_SPY.png"><img loading="lazy" decoding="async" class="alignnone wp-image-2844 size-large" src="http://www.financial-hacker.com/wp-content/uploads/2018/08/Options32_SPY-1024x329.png" alt="" width="840" height="270" srcset="https://financial-hacker.com/wp-content/uploads/2018/08/Options32_SPY-1024x329.png 1024w, https://financial-hacker.com/wp-content/uploads/2018/08/Options32_SPY-300x96.png 300w, https://financial-hacker.com/wp-content/uploads/2018/08/Options32_SPY-768x247.png 768w, https://financial-hacker.com/wp-content/uploads/2018/08/Options32_SPY-1200x386.png 1200w, https://financial-hacker.com/wp-content/uploads/2018/08/Options32_SPY.png 1497w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /></a></p>
<p>Now the 25% annual return are somewhat closer to the promised profit. Of course at cost of higher risk, since no limiting mechanism is in place. We could now test other option combos instead of the strangle, for instance a <strong>condor</strong> for limiting the risk. We can run an optimization for finding out how the profit is affected by different premiums and expirations. I leave that to the reader. The interesting question is why rolling over options, not only with this, but with many option trading systems that we have coded so far, reduces the performance remarkably. Often to the client&#8217;s great surprise.</p>
<p>Rolling over with loss compensation establishes in fact a <a href="http://www.financial-hacker.com/seventeen-popular-trade-strategies-that-i-dont-really-understand/" target="_blank" rel="noopener">Martingale system</a>. And such a system fares no better in option trading than in the casino. In fact, even worse. In the casino you have at least the same chance with every play. In trading, a losing option combo hints that the market starts trending &#8211; and the trend is likely to continue with the rolled over contract. Quite soon you cannot anymore compensate your losses with higher premiums, since you&#8217;ll find no contracts at that value. Ok, you could then start increasing the contract volume. If you really did that, you can calculate under the link above how long your account will survive. Rolling over a losing contract is typical irrational human behavior &#8211;  but the markets tend to punish irrationality.</p>
<h3>Artificial options data</h3>
<p>Since the system does not rely on goblethegooks, we can check whether the artificial options data that we created in the <a href="http://www.financial-hacker.com/algorithmic-options-trading/" target="_blank" rel="noopener">first part</a> of this mini series can be used for testing this system. The backtest results above were with real options data. Here&#8217;s the result with the synthetic data:</p>
<pre class="prettyprint">Monte Carlo Analysis... Median AR 31%
Win 7162$  MI 99.49$  DD 1188$  Capital 3866$
Trades 88  Win 81.8%  Avg +81.4p  Bars 30
AR 31%  PF 2.36  SR 1.12  UI 4%  R2 0.88
</pre>
<p>It&#8217;s similar, but not quite identical to the real data. Artificial data represents a more efficient market situation, since its option premiums are identical to their theoretical values, and fundamentals such as earnings reports play no role. You can use it for confirming the real data backtest. Or for saving money, by backtesting a non-goblethegooks system (yes, I like this word) first with artifical data, and only if it looks good, purchasing real data for the final test.</p>
<p>I&#8217;ve added the full script to the 2017 repository. You&#8217;ll need Zorro version 1.73 or above. You can find the unadjusted SPY data in the History folder of the archive (alternatively, download it with the Zorro command <strong>assetHistory( &#8220;SPY.US&#8221;, FROM_STOOQ | UNADJUSTED)</strong>). If you don&#8217;t want to create the artificial 2011-2016 options history yourself, you can download it from the historical data archives <a href="http://zorro-project.com/download.php" target="_blank" rel="noopener">here</a>. </p>
<h3>Conclusions</h3>
<ul style="list-style-type: square;">
<li>Mind the margin cost in backtests.</li>
<li>Do not roll over losing contracts.</li>
<li>If your system has no goblethegooks, try artificial data.</li>
</ul>
<h3>Literature</h3>
<p>(1) is the book from which I pulled the system. The book is ok &#8211; not better or worse than most other options books, but at only $10, getting it is no mistake. <br />
(2) is a really good introduction into the options trading matter. Even though its author shamelessly plagiarized the title of my blog, and this even years before I started writing it!</p>
<p><strong>(1) Daniel Mollat, $tock option$, BN Publishing 2011<br />
</strong><strong>(2) Philip Z Maymin, Financial Hacking, Wspc 2012</strong></p>
]]></content:encoded>
					
					<wfw:commentRss>https://financial-hacker.com/algorithmic-options-trading-part-3/feed/</wfw:commentRss>
			<slash:comments>46</slash:comments>
		
		
			</item>
		<item>
		<title>Hacking a HFT system</title>
		<link>https://financial-hacker.com/hacking-hft-systems/</link>
					<comments>https://financial-hacker.com/hacking-hft-systems/#comments</comments>
		
		<dc:creator><![CDATA[jcl]]></dc:creator>
		<pubDate>Sat, 08 Jul 2017 13:26:30 +0000</pubDate>
				<category><![CDATA[No Math]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[System Evaluation]]></category>
		<category><![CDATA[Arbitrage]]></category>
		<category><![CDATA[ES]]></category>
		<category><![CDATA[ETF]]></category>
		<category><![CDATA[HFT]]></category>
		<category><![CDATA[Latency]]></category>
		<category><![CDATA[NxCore]]></category>
		<category><![CDATA[SPY]]></category>
		<guid isPermaLink="false">http://www.financial-hacker.com/?p=2359</guid>

					<description><![CDATA[Compared with machine learning or signal processing algorithms of conventional algo trading strategies, High Frequency Trading systems can be surprisingly simple. They need not attempt to predict future prices. They know the future prices already. Or rather, they know the prices that lie in the future for other, slower market participants. Recently we got some &#8230; <a href="https://financial-hacker.com/hacking-hft-systems/" class="more-link">Continue reading<span class="screen-reader-text"> "Hacking a HFT system"</span></a>]]></description>
										<content:encoded><![CDATA[<p>Compared with machine learning or signal processing algorithms of conventional algo trading strategies, <strong>High Frequency Trading</strong> systems can be surprisingly simple. They need not attempt to predict future prices. They know the future prices already. Or rather, they know the prices that lie in the future for other, slower market participants. Recently we got some contracts for simulating HFT systems in order to determine their potential profit and maximum latency. This article is about testing HFT systems the hacker&#8217;s way.<span id="more-2359"></span></p>
<p>The HFT advantage is receiving price quotes earlier and getting orders filled faster than the majority of market participants. Its profit depends on the system&#8217;s <strong>latency</strong>, the delay between price quote and subsequent order execution at the exchange. Latency is the most relevant factor of a HFT system. It can be optimized in two ways: by minimizing the distance to the exchange, and by maximizing the speed of the trading system. The former is more important than the latter.</p>
<h3>The location</h3>
<p>Ideally, a HFT server is located directly at the exchange. And indeed most exchanges are dear selling server space in their cellars &#8211; the closer to the main network hub, the dearer the space. Electrical signals in a shielded wire travel with about 0.7 .. 0.9 times the speed of light (300 km/ms). 1 m closer to the signal source means a whopping 8 nanoseconds round-trip time advantage. How many trade opportunities disappear after 8&nbsp;ns? I don&#8217;t know, but people are willing to pay for any saved nanosecond.</p>
<p>Unfortunately (or fortunately, from a cost perspective), the HFT system that we&#8217;ll examine here can not draw advantage from colocating at the exchange. For reasons that we&#8217;ll see soon, it must trade and receive quotes from the NYSE and the CME simultaneously. There&#8217;s a high speed cable and also a microwave radio link running between both cities. The theoretically ideal location of such a HFT system is <strong>Warren, Ohio</strong>, exactly halfway between New York City and Chicago. I don&#8217;t know whether there&#8217;s a high speed node in Warren, but if it is, the distance of 357 miles to both exchanges would be equivalent to about 4 ms round-trip latency.</p>
<p><figure id="attachment_2392" aria-describedby="caption-attachment-2392" style="width: 840px" class="wp-caption alignnone"><a href="http://www.financial-hacker.com/wp-content/uploads/2017/07/Warren-e1494606853331.jpg"><img loading="lazy" decoding="async" class="wp-image-2392 size-large" src="http://www.financial-hacker.com/wp-content/uploads/2017/07/Warren-e1494606853331-1024x552.jpg" alt="" width="840" height="453" srcset="https://financial-hacker.com/wp-content/uploads/2017/07/Warren-e1494606853331-1024x552.jpg 1024w, https://financial-hacker.com/wp-content/uploads/2017/07/Warren-e1494606853331-300x162.jpg 300w, https://financial-hacker.com/wp-content/uploads/2017/07/Warren-e1494606853331-768x414.jpg 768w, https://financial-hacker.com/wp-content/uploads/2017/07/Warren-e1494606853331.jpg 1065w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /></a><figcaption id="caption-attachment-2392" class="wp-caption-text">Warren, Ohio &#8211; HFT Mecca of the world (image by Jack Pearce / Wikipedia Commons)</figcaption></figure></p>
<p>Without doubt, a server in this pleasant town would come at lower cost than a server in the cellar of the New York Stock Exchange. My today&#8217;s free tip for getting rich: Buy some garage space in Warren, tap into the high speed New York-Chicago cable or radio link, and rent out server racks!</p>
<h3>The software</h3>
<p>When you&#8217;ve already invested money for the optimal location and connection of the HFT system, you&#8217;ll also want an algo trading software that matches the required speed. Commercial trading platforms &#8211; even Zorro &#8211; are normally not fast enough. And you don&#8217;t know what they do behind your back. HFT systems are therefore normally not based on a universal trading platform, but directly coded. Not in R or Python, but in a fast language, usually one of the following:</p>
<ul style="list-style-type: square;">
<li><strong>C or C++.</strong> Good combination of high level and high speed. C is easy to read, but very effective and the fastest language of all &#8211; almost as fast as machine code.</li>
<li><strong>Pentium Assembler.</strong>&nbsp;Write your algorithm in machine instructions. Faster than even C when the algorithm mostly runs in loops that can be manually optimized. There are specialists for optimizing assembler code. Disadvantage: Any programmer has a hard time to understand assembler programs written by another programmer.</li>
<li><strong>CUDA, HLSL, or GPU assembler.</strong>&nbsp;Run your algorithm on the shader pipeline of the PC&#8217;s video card. This makes sense when it is heavily based on vector and matrix operations.</li>
<li><strong>VHDL.</strong> If any software would be too slow and trade success really depends on nanoseconds, the ultimate solution is coding the system in hardware. In VHDL you can define arithmetic units, digital filters, and sequencers on a FPGA (<strong>F</strong>ield <strong>P</strong>rogrammable <strong>G</strong>ate <strong>A</strong>rray) chip with a clock rate up to several 100 MHz. The chip can be directly connected to the network interface.</li>
</ul>
<p>With exception of VHDL, especially programmers of 3D computer games are normally familar with those high-speed languages. But the standard language of HFT systems is plain C/C++. It is also used in this article.</p>
<h3>The trading algorithm</h3>
<p>Many HFT systems prey on traders by using fore-running methods. They catch your quote, buy the same asset some microseconds earlier, and sell it to you with a profit. Some exchanges prevent this in the interest of fair play, while other exchanges encourage this in the interest of earning more fees. For this article we won&#8217;t use fore-running methods, but simply exploit <a href="http://www.financial-hacker.com/build-better-strategies-part-2-model-based-systems/" target="_blank" rel="noopener">arbitrage</a> between ES and SPY. We&#8217;re assuming that our server is located in Warren, Ohio, and has a high speed connection to Chicago and to New York.</p>
<p>ES is a Chicago traded S&amp;P500 future, exposed to supply and demand. SPY is a New York traded ETF, issued by State Street in Boston and following the S&amp;P500 index (minus State Street&#8217;s fees). 1 ES Point is equivalent to 10 SPY cents, so the ES price is about ten times the SPY price. Since both assets are based on the same index, we can expect that their prices are highly correlated. There have been some publications (1) that claim this correlation will break down at low time frames, causing one asset trailing the other. We&#8217;ll check if this is true. Any shortlived ES-SPY price difference that exceeds the bid-ask spreads and trading costs constitutes an arbitrage opportunity. Our arbitrage algorithm would work this way:</p>
<ul style="list-style-type: square;">
<li>Determine the SPY-ES difference.</li>
<li>Determine its deviation from the mean.&nbsp;</li>
<li>If the deviation exceeds the ask-bid spreads plus a threshold, open positions in&nbsp;ES and SPY in opposite directions.</li>
<li>If the deviation reverses its sign and exceeds the ask-bid spreads plus a smaller threshold, close the positions.</li>
</ul>
<p>This is the barebone HFT algorithm in C. If you&#8217;ve never seen HFT code before, it might look a bit strange:</p>
<pre class="prettyprint">#define THRESHOLD  0.4  // Entry/Exit threshold 

// HFT arbitrage algorithm
// returns 0 for closing all positions
// returns 1 for opening ES long, SPY short
// returns 2 for opening ES short, SPY long
// returns -1 otherwise
int tradeHFT(double AskSPY,double BidSPY,double AskES,double BidES)
{
	double SpreadSPY = AskSPY-BidSPY, SpreadES = AskES-BidES;
	double Arbitrage = 0.5*(AskSPY+BidSPY-AskES-BidES);

	static double ArbMean = Arbitrage;	
	ArbMean = 0.999*ArbMean + 0.001*Arbitrage;
	static double Deviation = 0;
	Deviation = 0.75*Deviation + 0.25*(Arbitrage - ArbMean);

	static int Position = 0;	
	if(Position == 0) {
		if(Deviation &gt; SpreadSPY+THRESHOLD)
			return Position = 1;
		if(-Deviation &gt; SpreadES+THRESHOLD)
			return Position = 2;
	} else {
		if(Position == 1 &amp;&amp; -Deviation &gt; SpreadES+THRESHOLD/2)
			return Position = 0;
		if(Position == 2 &amp;&amp; Deviation &gt; SpreadSPY+THRESHOLD/2)
			return Position = 0;
	}
	return -1;	
}
</pre>
<p>The <strong>tradeHFT</strong> function is called from some framework &#8211; not shown here &#8211; that gets the price quotes and sends the trade orders. Parameters are the current best ask and bid prices of ES and SPY from the top of the order book (we assume here that the SPY price is multiplied with 10 so that both assets are on the same scale). The function returns a code that tells the framework whether to open or close opposite positions or to do nothing. The <strong>Arbitrage</strong> variable is the mid price difference of SPY and ES. Its mean (<strong>ArbMean</strong>) is filtered by a slow EMA, and the <strong>Deviation</strong> from the mean is also slightly filtered by a fast EMA to prevent reactions on outlier quotes. The <strong>Position</strong> variable constitutes a tiny state machine with the 3 states long, short, and nothing. The entry/exit <strong>Threshold</strong> is here set to 40 cents, equivalent to a bad SPY spread multiplied with 10. This is the only adjustable parameter of the system. If we wanted to really trade it, we had to optimize the threshold using several months&#8217; ES and SPY data.</p>
<p>This minimalistic system would be quite easy to convert to Pentium assembler or even to a FPGA chip. But it is not really necessary: Even compiled with Zorro&#8217;s lite-C compiler, the <strong>tradeHFT</strong> function executes in just about 750 nanoseconds. A strongly optimizing C compiler, like Microsoft VC++, &nbsp;gets the execution time down to 650 nanoseconds. Since the time span between two ES quotes is normally 10 microseconds or more, the speed of C is largely sufficient.</p>
<p>Our HFT experiment has to answer two questions. First, are those price differences big enough for arbitrage profit? And second, at which maximum latency will the system still work?&nbsp;</p>
<h3>The data</h3>
<p>For backtesting a HFT system, normal price data that you can freely download from brokers won&#8217;t do. You have to buy high resolution order book or BBO data (<strong>B</strong>est <strong>B</strong>id and <strong>O</strong>ffer) that includes the exchange time stamps. Without knowing the exact time when the price quote was received at the exchange, it is not possible to determine the maximum latency.</p>
<p>Some companies are recording all quotes from all exchanges and are selling this data. Any one has its specific data format, so the first challenge is to convert this to lean data files that we then evaluate with our simulation software. We&#8217;re using this very simple target format for price quotes:</p>
<pre class="prettyprint">typedef struct T1    // single tick
{
	double time; // time stamp, OLE DATE format
	float fVal;  // positive = ask price, negative = bid price	
} T1;</pre>
<p>The company watching the Chicago Mercantile Exchange delivers its data in a specific CSV format with many additional fields, of which most we don&#8217;t need here (f.i. the trade volume or the quote arrival time). Every day&#8217;s quotes are stored in one CSV file. This is the Zorro script for pulling the ES December 2016 contract out of it and converting it to a dataset of T1 price quotes:</p>
<pre class="prettyprint">//////////////////////////////////////////////////////
// Convert price history from Nanotick BBO to .t1
//////////////////////////////////////////////////////

#define STARTDAY 20161004
#define ENDDAY   20161014

string InName = "History\\CME.%08d-%08d.E.BBO-C.310.ES.csv";  // name of a day file
string OutName = "History\\ES_201610.t1";
string Code = "ESZ";	// December contract symbol

string Format = "2,,%Y%m%d,%H:%M:%S,,,s,,,s,i,,";  // Nanotick csv format
void main()
{
	int N,Row,Record,Records;
	for(N = STARTDAY; N &lt;= ENDDAY; N++)
	{
		string FileName = strf(InName,N,N+1);
		if(!file_date(FileName)) continue;
		Records = dataParse(1,Format,FileName);  // read BBO data
		printf("\n%d rows read",Records);
		dataNew(2,Records,2);  // create T1 dataset
		for(Record = 0,Row = 0; Record &lt; Records; Record++)
		{
			if(!strstr(Code,dataStr(1,Record,1))) continue; // select only records with correct symbol
			T1* t1 = dataStr(2,Row,0);  // store record in T1 format
			float Price = 0.01 * dataInt(1,Record,3);  // price in cents
			if(Price &lt; 1000) continue;  // no valid price
			string AskBid = dataStr(1,Record,2);
			if(AskBid[0] == 'B')  // negative price for Bid
				Price = -Price;
			t1-&gt;fVal = Price;
			t1-&gt;time = dataVar(1,Record,0) + 1./24.;  // add 1 hour Chicago-NY time difference
			Row++;
		}
		printf(", %d stored",Row);
		dataAppend(3,2,0,Row);  // append dataset
		if(!wait(0)) return;
	}
	dataSave(3,OutName);  // store complete dataset
}</pre>
<p>We&#8217;re converting here 10 days in October 2016 for our backtest. The script first parses the CSV file into an intermediary binary dataset, which is then converted to the T1 target format. Since the time stamps are in Chicago local time, we have to add one hour to convert them to NY time.</p>
<p>The company watching the New York Stock exchange delivers data in a highly compressed specific format named &#8220;NxCore Tape&#8221;. We&#8217;re using the Zorro NxCore plugin for converting this to another T1 list:</p>
<pre class="prettyprint">//////////////////////////////////////////////////////
// Convert price history from Nanex .nx2 to .t1
//////////////////////////////////////////////////////

#define STARTDAY 20161004
#define ENDDAY 	 20161014
#define BUFFER	 10000

string InName = "History\\%8d.GS.nx2";  // name of a single day tape
string OutName = "History\\SPY_201610.t1";
string Code = "eSPY";

int Row,Rows;

typedef struct QUOTE {
	char	Name[24];
	var	Time,Price,Size;
} QUOTE;

int callback(QUOTE *Quote)
{
	if(!strstr(Quote-&gt;Name,Code)) return 1;
	T1* t1 = dataStr(1,Row,0);  // store record in T1 format
	t1-&gt;time = Quote-&gt;Time;
	t1-&gt;fVal = Quote-&gt;Price;
	Row++; Rows++;
	if(Row &gt;= BUFFER)	{   // dataset full?
		Row = 0;
		dataAppend(2,1);    // append to dataset 2
	}
	return 1;
}


void main()
{
	dataNew(1,BUFFER,2); // create a small dataset
	login(1);            // open the NxCore plugin
	
	int N;
	for(N = STARTDAY; N &lt;= ENDDAY; N++) {
		string FileName = strf(InName,N);
		if(!file_date(FileName)) continue;
		printf("\n%s..",FileName);
		Row = Rows = 0;  // initialize global variables
		brokerCommand(SET_HISTORY,FileName); // parse the tape
		dataAppend(2,1,0,Row);  // append the rest to dataset 2
		printf("\n%d rows stored",Rows);
		if(!wait(0)) return;  // abort when [Stop] was hit
	}
	dataSave(2,OutName); // store complete dataset
}
</pre>
<p>The <strong>callback</strong> function is called by any quote in the tape file. We don&#8217;t need most of the data, so we filter out only the SPY quotes (&#8220;eSPY&#8221;).</p>
<h3>Verifying the inefficiency</h3>
<p>With data from both sources, we can now compare the ES and SPY prices in high resolution. Here&#8217;s a typical 10 seconds sample from the price curves:</p>
<p><figure id="attachment_2599" aria-describedby="caption-attachment-2599" style="width: 1701px" class="wp-caption alignnone"><a href="http://www.financial-hacker.com/wp-content/uploads/2017/08/HFTChart_SPY.png"><img loading="lazy" decoding="async" class="wp-image-2599 size-full" src="http://www.financial-hacker.com/wp-content/uploads/2017/08/HFTChart_SPY.png" alt="" width="1701" height="401" srcset="https://financial-hacker.com/wp-content/uploads/2017/08/HFTChart_SPY.png 1701w, https://financial-hacker.com/wp-content/uploads/2017/08/HFTChart_SPY-300x71.png 300w, https://financial-hacker.com/wp-content/uploads/2017/08/HFTChart_SPY-768x181.png 768w, https://financial-hacker.com/wp-content/uploads/2017/08/HFTChart_SPY-1024x241.png 1024w, https://financial-hacker.com/wp-content/uploads/2017/08/HFTChart_SPY-1200x283.png 1200w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /></a><figcaption id="caption-attachment-2599" class="wp-caption-text">SPY (black) vs. ES (red), October 5, 2017, 10:01:25 &#8211; 10:01.35</figcaption></figure></p>
<p>The resolution is 1 ms. ES is plotted in $ units, SPY in 10 cents units, with a small offset so that the curves lie over each other. The prices shown are ask prices. We can see that ES moves in steps of 25 cents, SPY in steps of 1 cent. The prices are still well correlated even on a millisecond scale. ES appears to trail a tiny bit.</p>
<p>We can also see an arbitrage opportunity at the steep price step in the center at about 10:01:30. ES reacted a bit slower, but stronger on some event, probably a moderate price jump of one of the stocks of the S&amp;P 500. This event also triggered a fast sequence of oscillating SPY quotes, most likely from other HFT systems, until the situation calmed down again a few 100 ms later (the scale is not linear since time periods with no quotes are skipped). For several milliseconds the ES-SPY difference exceeded the ask-bid spread of both assets (usually 25 cents for ES and 1..4 cents for SPY). We would here ideally sell ES and buy SPY immediately after the ES price step. So we have verified that the theoretized inefficiency does really exist, at least in this sample.&nbsp;</p>
<p>The script for displaying high resolution charts:<!--?prettify linenums=true?--></p>
<pre class="prettyprint">#define ES_HISTORY	"ES_201610.t1"
#define SPY_HISTORY	"SPY_201610.t1"
#define TIMEFORMAT	"%Y%m%d %H:%M:%S"
#define FACTOR		10
#define OFFSET		3.575

void main()
{
	var StartTime = wdatef(TIMEFORMAT,"20161005 10:01:25"),
		EndTime = wdatef(TIMEFORMAT,"20161005 10:01:35");
	MaxBars = 10000;
	BarPeriod = 0.001/60.;	// 1 ms plot resolution
	Outlier = 1.002;  // filter out 0.2% outliers

	assetList("HFT.csv");
	dataLoad(1,ES_HISTORY,2);
	dataLoad(2,SPY_HISTORY,2);
	int RowES=0, RowSPY=0;
	
	while(Bar &lt; MaxBars)
	{
		var TimeES = dataVar(1,RowES,0), 
			PriceES = dataVar(1,RowES,1), 
			TimeSPY = dataVar(2,RowSPY,0), 
			PriceSPY = dataVar(2,RowSPY,1);

		if(TimeES &lt; TimeSPY) RowES++;
		else RowSPY++;

		if(min(TimeES,TimeSPY) &lt; StartTime) continue;
		if(max(TimeES,TimeSPY) &gt; EndTime) break;

		if(TimeES &lt; TimeSPY) {
			asset("ES");
			priceQuote(TimeES,PriceES);
		} else {
			asset("SPY");
			priceQuote(TimeSPY,PriceSPY);
		}
		
		asset("ES");
		if(AssetBar &gt; 0) plot("ES",AskPrice+OFFSET,LINE,RED);
		asset("SPY");
		if(AssetBar &gt; 0) plot("SPY",FACTOR*AskPrice,LINE,BLACK);
	}
}
</pre>
<p>The script first reads the two historical data files that we&#8217;ve created above, and then parses them row by row. For keeping the ES and SPY quotes in sync, we always read the quote with the smaller timestamp from the datasets (the quotes are stored in ascending timestamp order). The <strong>priceQuote</strong> function checks the prices for outliers, stores the ask price in the <strong>AskPrice</strong> variable and the ask-bid difference in <strong>Spread</strong>, and&nbsp;increases the <strong>Bar</strong> count for plotting the price curves. A bar of the curve is equivalent to 1 ms. The <strong>AssetBar</strong> variable is the last bar with a price quote of that asset, and is used here to prevent plotting before the first quote arrived.&nbsp;</p>
<h3>Testing the system</h3>
<p>For backtesting our HFT system, we only need to modify the script above a bit, and call the <strong>tradeHFT</strong> function in the loop:</p>
<pre class="prettyprint">#define LATENCY		4.0	// milliseconds

function main()
{
	var StartTime = wdatef(TIMEFORMAT,"20161005 09:30:00"),
		EndTime = wdatef(TIMEFORMAT,"20161005 15:30:00");
	MaxBars = 200000;
	BarPeriod = 0.1/60.;	// 100 ms bars 
	Outlier = 1.002;

	assetList("HFT.csv");
	dataLoad(1,ES_HISTORY,2);
	dataLoad(2,SPY_HISTORY,2);
	int RowES=0, RowSPY=0;
	
	EntryDelay = LATENCY/1000.;
	Hedge = 2;
	Fill = 8; // HFT fill mode;
	Slippage = 0;
	Lots = 100;
		
	while(Bar &lt; MaxBars)
	{
		var TimeES = dataVar(1,RowES,0), 
			PriceES = dataVar(1,RowES,1),
			TimeSPY = dataVar(2,RowSPY,0),
			PriceSPY = dataVar(2,RowSPY,1);

		if(TimeES &lt; TimeSPY) RowES++;
		else RowSPY++;

		if(min(TimeES,TimeSPY) &lt; StartTime) continue;
		if(max(TimeES,TimeSPY) &gt; EndTime) break;

		if(TimeES &lt; TimeSPY) {
			asset("ES");
			priceQuote(TimeES,PriceES);
		} else {
			asset("SPY");
			priceQuote(TimeSPY,FACTOR*PriceSPY);
		}
		
		asset("ES");
		if(!AssetBar) continue;
		var AskES = AskPrice, BidES = AskPrice-Spread;
		asset("SPY");
		if(!AssetBar) continue;
		var AskSPY = AskPrice, BidSPY = AskPrice-Spread;

		int Order = tradeHFT(AskSPY,BidSPY,AskES,BidES);	
		switch(Order) {
			case 1: 
			asset("ES"); enterLong();
			asset("SPY"); enterShort();
			break;
		
			case 2: 
			asset("ES"); enterShort();
			asset("SPY"); enterLong();
			break;
		
			case 0:
			asset("ES"); exitLong(); exitShort();
			asset("SPY"); exitLong(); exitShort();
			break;
		}
	}
	printf("\nProfit %.2f at NY Time %s",
		Equity,strdate(TIMEFORMAT,dataVar(1,RowES,0)));
}
</pre>
<p>This script runs a HFT backtest of one trading day, from 9:30 until 15:30 New York time. We can see that it just calls the HFT function with the ES and SPY prices, then executes the returned code in the switch-case statement. It opens 100 units of each asset (equivalent to 2 ES and 1000 SPY contracts). The round-trip latency is set up with the <strong>EntryDelay</strong> variable. In HFT mode (<strong>Fill = 8</strong>), a trade is filled at the most recent price quote after the given delay. This ensures a realistic latency simulation when price quotes are entered with their exchange time stamps.</p>
<p>Here&#8217;s the HFT profit at the end of the day with different round-trip latency values:</p>
<table style="background-color: #e8e6e6;">
<tbody>
<tr>
<td><strong><span style="font-family: arial, helvetica, sans-serif;">LATENCY</span></strong></td>
<td><strong><span style="font-family: arial, helvetica, sans-serif;">0.5 ms</span></strong></td>
<td><strong><span style="font-family: arial, helvetica, sans-serif;">4.0 ms</span></strong></td>
<td><strong><span style="font-family: arial, helvetica, sans-serif;">6.0 ms</span></strong></td>
<td><strong><span style="font-family: arial, helvetica, sans-serif;">10&nbsp;ms</span></strong></td>
</tr>
<tr>
<td><strong><span style="font-family: arial, helvetica, sans-serif;">Profit / day</span></strong></td>
<td><strong><span style="font-family: arial, helvetica, sans-serif;">+ $793</span></strong></td>
<td><strong><span style="font-family: arial, helvetica, sans-serif;">+ $273</span></strong></td>
<td><strong><span style="font-family: arial, helvetica, sans-serif;">+ $205</span></strong></td>
<td><strong><span style="font-family: arial, helvetica, sans-serif;">&#8211; $15</span></strong></td>
</tr>
</tbody>
</table>
<p>The ES-SPY HFT arbitrage system makes about $800 each day with an unrealistic small latency of 500 microseconds. Unfortunately, due to the 700 miles between the NYSE and the CME, you&#8217;d need a time machine for that (or some faster-than-light method of quantum teleportation). A HFT server in Warren, Ohio, at 4 ms latency would generate about $300 per day. A server slightly off the direct NY-Chicago line can still grind out $200 daily. But the system deteriorates quickly when located further away, as with a server in Nashville, Tennessee, at around 10 ms latency. This is a strong hint that some high-speed systems in the proximity of both exchanges are already busy with exploiting ES-SPY arbitrage.</p>
<p>Still, $300 per day result in a decent $75,000 annual income. However, what needed you to invest for that, aside from hardware and software? With SPY at $250, the 100 units translate to 100*$2500 + 100*10*$250 = half a million dollars trade volume. So you would get only 15% annual return on your investment. But you can improve this by adding more pairs of NY ETFs and their equivalent CME futures to the arbitrage strategy. And you can improve it further when you find a broker or similar service that can receive your orders directly at the exchanges. Due to the ETF/future hedging the position is almost without risk. So you could probably negotiate a large leverage. And also a flat monthly fee, since broker commissions were not included in the test.</p>
<h3>Conclusion&nbsp;</h3>
<ul style="list-style-type: square;">
<li>When systems react fast enough, profits can be achieved with very primitive methods, such as arbitrage between highly correlated assets.</li>
<li>Location has a large impact on HFT profits.</li>
<li>ES-SPY arbitrage cannot be traded by everyone from everywhere. You&#8217;re competing with people that are doing this already. Possibly in Warren, Ohio.</li>
</ul>
<p>I&#8217;ve added the scripts and the asset list to the 2017 script archive in the &#8220;HFT&#8221; and &#8220;History&#8221; folders. Unfortunately I could not add the ES / SPY price history files, since I do not own the data. For reproducing the results, get BBO history from Nanex<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" /> or Nanotick<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" /> &#8211; their data can be read with the scripts above. You&#8217;ll also need Zorro S version 1.60 or above, which supports HFT fill mode.</p>
<h3>References</h3>
<p>(1)&nbsp;<a href="http://jaredbernsteinblog.com/trading-in-milliseconds-when-correlations-break-down/" target="_blank" rel="noopener">When Correlations Break Down</a> (Jared Bernstein 2014)</p>
<p>(2) <a href="http://www.automatedtrader.net" target="_blank" rel="noopener">Financial Programming Greatly Accelerated</a> (Cousin/Weston, Automated Trader 42/2017)</p>
<p>&nbsp;</p>
<hr>
<p><strong>Addendum.</strong> I have been asked how the profit would be affected when the server is located in New York, with 0.25 ms signal delay to the NYSE and 4.8 ms signal delay to the CME. For simulating this, modify the script:</p>
<pre class="prettyprint">var TimeES = dataVar(1,RowES,0)+4.8/(1000*60*60*24),
&nbsp; TimeSPY = dataVar(2,RowSPY,0)+0.25/(1000*60*60*24),
...
switch(Order) {
	case 1: 
		EntryDelay = 4.8/1000;
		asset("ES"); enterLong();
		EntryDelay = 0.25/1000;
		asset("SPY"); enterShort();
		break;
		
	case 2: 
		EntryDelay = 4.8/1000;
		asset("ES"); enterShort();
		EntryDelay = 0.25/1000;
		asset("SPY"); enterLong();
		break;
		
	case 0:
		EntryDelay = 4.8/1000;
		asset("ES"); exitLong(); exitShort();
		EntryDelay = 0.25/1000;
		asset("SPY"); exitLong(); exitShort();
		break;
}</pre>
<p>The first line simulates the price quote arrivals with 4.8 and 0.25 ms delay, the other lines establish the different order delays for SPY and ES. Alternatively, you could artificially delay the incoming SPY quotes by another 4.55 ms, so that their time stamps again match the ES quotes. In both cases the system returns about $240 per day, almost as much as in Warren. However a similar system located in Aurora, close to Chicago (swap the delays in the script), would produce zero profit. The asymmetry is caused by the relatively long constant periods of ES, making the SPY latency more relevant for the money at the end of the day.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://financial-hacker.com/hacking-hft-systems/feed/</wfw:commentRss>
			<slash:comments>102</slash:comments>
		
		
			</item>
	</channel>
</rss>
