<?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>MQLmagazine.com</title>
	<atom:link href="http://mqlmagazine.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://mqlmagazine.com</link>
	<description>All things MetaTrader</description>
	<lastBuildDate>Sat, 10 Jul 2010 14:57:57 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Guidelines for writing portfolio expert advisors in MQL5</title>
		<link>http://mqlmagazine.com/mql-programming/guidelines-for-writing-portfolio-expert-advisors-in-mql5/</link>
		<comments>http://mqlmagazine.com/mql-programming/guidelines-for-writing-portfolio-expert-advisors-in-mql5/#comments</comments>
		<pubDate>Mon, 24 May 2010 21:29:43 +0000</pubDate>
		<dc:creator>Bogdan Caramalac, MQLmagazine sr.editor</dc:creator>
				<category><![CDATA[MQL programming]]></category>

		<guid isPermaLink="false">http://mqlmagazine.com/?p=2298</guid>
		<description><![CDATA[[Versiunea romaneasca] [MQLmagazine.com in romana] [English edition]
Portfolio expert advisors, as well as the more complex multiasset expert advisors, were awaited by the retail trading community ever since limitations of the MT4 backtester became obvious, that is, about 4 &#8211; 5 years ago. The difference between multiasset and portfolio EAs is that multiasset EAs have an [...]]]></description>
			<content:encoded><![CDATA[<p><a title="[Versiunea romaneasca]" href="http://mqlmagazine.com/ro/programarea-in-mql/linii-directoare-pentru-scrierea-expertilor-de-portofoliu-in-mql5" target="_top">[Versiunea romaneasca]</a> <a title="[MQLmagazine.com in romana]" href="http://mqlmagazine.com/ro" target="_top">[MQLmagazine.com in romana]</a> <a title="[English edition]" href="http://mqlmagazine.com" target="_top">[English edition]</a></p>
<p>Portfolio expert advisors, as well as the more complex multiasset expert advisors, were awaited by the retail trading community ever since limitations of the MT4 backtester became obvious, that is, about 4 &#8211; 5 years ago. The difference between <em>multiasset</em> and <em>portfolio</em> EAs is that <em>multiasset EAs have an integrated strategy where each asset is a component</em>, whether <em>portfolio EAs replicate same strategy, with just some parameter differences, over more instruments</em>. Of course, in the MT4 context, normal EAs could have been run on separate instruments and obtain <em>portfolio effects</em>, however backtesting could never have covered these portfolio effects because it was not possible to backtest on more than one instrument.</p>
<p>The main advantage of portfolying is the <strong>yield averaging</strong> while <strong>spreading the risk</strong>. The degree up to which this happens, is dependant on the overall portfolio correlation. The lesser overall correlated, the lesser nonsysthematic risk left uncovered. However, if you don&#8217;t pick the portfolio right, instead to balance your overall trading system, it will add extra instability.</p>
<p>A portfolio trading system must be able to:<br />
- apply similar trading logics to a large number of assets;<br />
- differentiate trading logics from one instrument to another;<br />
- control exposure.</p>
<p>It requires a pretty large data structure to take make things manageable.</p>
<p>For instance, this one:</p>

<div class="wp_codebox"><table width="100%" ><tr id="p229811"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="code" id="p2298code11"><pre class="mql5" style="font-family:monospace;"><span style="color: #0000ff;">input</span> <span style="color: #0000ff;">double</span> MarginUsagePerPosition<span style="color: #000080;">=</span><span style="color:#800080;">0.5</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> SymbolsCount<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">struct</span> IndicatorHandlersStruct
  <span style="color: #008000;">&#123;</span>
   <span style="color: #808080;">//...</span>
  <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">struct</span> SystemParametersStruct
  <span style="color: #008000;">&#123;</span>
   <span style="color: #808080;">//...</span>
  <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">struct</span> SymbolData
  <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">string</span> <span style="color: #8a2be2;">Symbol</span><span style="color: #008080;">;</span>
    IndicatorHandlersStruct IndicatorHandlers<span style="color: #008080;">;</span>
    SystemParametersStruct SystemParameters<span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
SymbolData SymbolsTable<span style="color: #008000;">&#91;</span>300<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>The first variable, MarginUsagePerPosition is a sort of asset allocation parameter, by controlling the maximal volume of each position. SymbolsCount tells how many symbols are used and it can be used for enumeration, while the big SymbolsTable[] will contain all the needed data, from symbols to handlers. For instance, the following structure will be set up to calculate 4 moving averages (two on M5 and two on H1) per each symbol:</p>

<div class="wp_codebox"><table width="100%" ><tr id="p229812"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code" id="p2298code12"><pre class="mql5" style="font-family:monospace;"><span style="color: #0000ff;">struct</span> IndicatorHandlersStruct
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">int</span> MovingAveragesHandlers14<span style="color: #008000;">&#91;</span>2<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">int</span> MovingAveragesHandlers9<span style="color: #008000;">&#91;</span>2<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">struct</span> SymbolData
  <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">string</span> <span style="color: #8a2be2;">Symbol</span><span style="color: #008080;">;</span>
    IndicatorHandlersStruct IndicatorHandlers<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">datetime</span> LastBarTime<span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
SymbolData SymbolsTable<span style="color: #008000;">&#91;</span>300<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>Before OnInit() we have to write a procedure to fill in the SymbolsTable[] with the indicator handlers. MakeIndicatorHandlers() is being called from OnInit() to separate the symbols setup from the indicators setup. While you can easily alter OnInit() to change the list, by adding, deleting or making an automated instrument selector, the MakeIndicatorHandlers() will remain static, with the purpose to fill the structure with the needed indicator handlers.</p>

<div class="wp_codebox"><table width="100%" ><tr id="p229813"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p2298code13"><pre class="mql5" style="font-family:monospace;"><span style="color: #0000ff;">void</span> MakeIndicatorHandlers<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">datetime</span> lastbar<span style="color: #008000;">&#91;</span>1<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;</span>SymbolsCount<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
      <span style="color: #008000;">&#123;</span>
       SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">IndicatorHandlers</span>.<span style="color: #007788;">MovingAverageHandlers14</span><span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #008000;">iTEMA</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">PERIOD_M5</span>,14,0,<span style="color: #333399;">PRICE_OPEN</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
       SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">IndicatorHandlers</span>.<span style="color: #007788;">MovingAverageHandlers9</span><span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #008000;">iTEMA</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">PERIOD_M5</span>,9,0,<span style="color: #333399;">PRICE_OPEN</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
       SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">IndicatorHandlers</span>.<span style="color: #007788;">MovingAverageHandlers14</span><span style="color: #008000;">&#91;</span>1<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #008000;">iTEMA</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">PERIOD_H1</span>,14,0,<span style="color: #333399;">PRICE_OPEN</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
       SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">IndicatorHandlers</span>.<span style="color: #007788;">MovingAverageHandlers9</span><span style="color: #008000;">&#91;</span>1<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #008000;">iTEMA</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">PERIOD_H1</span>,9,0,<span style="color: #333399;">PRICE_OPEN</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>  
      <span style="color: #008000;">&#125;</span>
   <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>Within OnInit(), we set up the symbols table. For instance, we are making it to work on 3 forex pairs: EURUSD, USDCHF, GBPJPY:</p>

<div class="wp_codebox"><table width="100%" ><tr id="p229814"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code" id="p2298code14"><pre class="mql5" style="font-family:monospace;"><span style="color: #0000ff;">int</span> OnInit<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   SymbolsTable<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span><span style="color: #000080;">=</span><span style="color: #008080;">&quot;EURUSD&quot;</span><span style="color: #008080;">;</span>
   SymbolsTable<span style="color: #008000;">&#91;</span>1<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span><span style="color: #000080;">=</span><span style="color: #008080;">&quot;USDCHF&quot;</span><span style="color: #008080;">;</span>
   SymbolsTable<span style="color: #008000;">&#91;</span>2<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span><span style="color: #000080;">=</span><span style="color: #008080;">&quot;GBPJPY&quot;</span><span style="color: #008080;">;</span>
   SymbolsCount<span style="color: #000080;">=</span><span style="color: #008000;">3</span><span style="color: #008080;">;</span>
   MakeIndicatorHandlers<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>And now OnTick():</p>

<div class="wp_codebox"><table width="100%" ><tr id="p229815"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code" id="p2298code15"><pre class="mql5" style="font-family:monospace;"><span style="color: #0000ff;">void</span> OnTick<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">datetime</span> datetime_array<span style="color: #008000;">&#91;</span>1<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;</span>SymbolsCount<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
      <span style="color: #008000;">&#123;</span>
       <span style="color: #8a2be2;">CopyTime</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">PERIOD_M5</span>,0,1,datetime_array<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
       <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>datetime_array<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span>SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">LastBarTime</span><span style="color: #008000;">&#41;</span>
         <span style="color: #008000;">&#123;</span>               
          TradeLogics<span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
          LastBarTime<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>datetime_array<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>    
         <span style="color: #008000;">&#125;</span><span style="color: #808080;">//if (datetime_array[0]!=SymbolsTable[i].LastBarTime)</span>
      <span style="color: #008000;">&#125;</span><span style="color: #808080;">//for (int i=0;i&lt;SymbolsCount;i++)</span>
   <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>Now all the pieces are complete. OnTick() will check for each instrument if a new bar appeared and will call TradeLogics() for every instrument in the array, which will implement decision and trading. </p>
<p>We will not stop on TradeLogics() in this article, because TradeLogics() is EA specific. But a few principles should be guides while writing the TradeLogics(). The first division of the TradeLogics() is the asset class that it deals with. It can&#8217;t deal with equities the same way it deals with forex. Equities don&#8217;t run 24 hours a day 5 days a week. They have specific trading sessions and gaps from a day to another, not mentioning from a week to another. So this is the first division, the asset class. The second, is that it is better to separate the trading functions from the TradeLogics(). For instance, the TradeLogics() could just command how to adjust the position on a given instrument, and leave the trading function to a ManagePosition() procedure.<br />
Of course, TradeLogics() can be in practice triggered by OnTrade() or OnChartEvent(), or even a CEP engine&#8217;s <a title="EventsCallback()" href="http://mqlmagazine.com/financial-modelling/anatomy-of-a-simple-cep-engine/" target="_top">EventsCallback()</a>.</p>

<div class="wp_codebox"><table width="100%" ><tr id="p229816"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td class="code" id="p2298code16"><pre class="mql5" style="font-family:monospace;"><span style="color: #0000ff;">double</span> UnitsToLots<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">double</span> units,<span style="color: #0000ff;">string</span> symbol<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
  <span style="color: #0000ff;">double</span> dlotsize<span style="color: #000080;">=</span><span style="color: #8a2be2;">SymbolInfoDouble</span><span style="color: #008000;">&#40;</span>symbol,<span style="color: #333399;">SYMBOL_TRADE_CONTRACT_SIZE</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">double</span> mag<span style="color: #000080;">=</span><span style="color: #8a2be2;">SymbolInfoDouble</span><span style="color: #008000;">&#40;</span>symbol,<span style="color: #333399;">SYMBOL_VOLUME_STEP</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">double</span> mini<span style="color: #000080;">=</span><span style="color: #8a2be2;">SymbolInfoDouble</span><span style="color: #008000;">&#40;</span>symbol,<span style="color: #333399;">SYMBOL_VOLUME_MIN</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #0000ff;">double</span> big<span style="color: #000080;">=</span>1<span style="color: #000040;">/</span>mag<span style="color: #008080;">;</span>    
  <span style="color: #0000ff;">double</span> size<span style="color: #000080;">=</span>dlotsize<span style="color: #000040;">/</span>big<span style="color: #008080;">;</span>
  <span style="color: #0000ff;">double</span> dlots0,dlots1,back0,back1<span style="color: #008080;">;</span>
  dlots0<span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span>units<span style="color: #000040;">/</span>size,0<span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span>mag<span style="color: #008080;">;</span>
  dlots1<span style="color: #000080;">=</span>dlots0<span style="color: #000040;">+</span>mag<span style="color: #008080;">;</span>
  back0<span style="color: #000080;">=</span>dlots0<span style="color: #000040;">*</span>big<span style="color: #000040;">*</span>size<span style="color: #008080;">;</span>
  back1<span style="color: #000080;">=</span>dlots1<span style="color: #000040;">*</span>big<span style="color: #000040;">*</span>size<span style="color: #008080;">;</span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>back1<span style="color: #000040;">-</span>units<span style="color: #000080;">&lt;</span>units<span style="color: #000040;">-</span>back0<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
     <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>dlots1<span style="color: #000080;">&lt;</span>mini<span style="color: #008000;">&#41;</span>
       <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>mini<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>  
     else  
       <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>dlots1<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
  else
    <span style="color: #008000;">&#123;</span>
     <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>dlots0<span style="color: #000080;">==</span>0<span style="color: #008000;">&#41;</span>
        <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>mini<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
     else
       <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>dlots0<span style="color: #000080;">&lt;</span>mini<span style="color: #008000;">&#41;</span>
          <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>mini<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        else
          <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>dlots0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
       <span style="color: #008000;">&#125;</span><span style="color: #808080;">//else if (dlots0==0)</span>
    <span style="color: #008000;">&#125;</span><span style="color: #808080;">//else if if (back1-units&lt;units-back0)</span>
  <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>UnitsToLots() is a port of a function that I wrote in MQL4 times, and it was working at that time with MarketInfo(). UnitsToLots() will return the appropriate number of lots correspondant to a volume given in units. For instance it may answer 1.0 for 100000 units of EURUSD.</p>

<div class="wp_codebox"><table width="100%" ><tr id="p229817"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="code" id="p2298code17"><pre class="mql5" style="font-family:monospace;"><span style="color: #339900;">#define FLAT        0</span>
<span style="color: #339900;">#define LONG        1</span>
<span style="color: #339900;">#define SHORT       2</span>
&nbsp;
<span style="color: #0000ff;">int</span> GetPositionType<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> asset_index<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">string</span> symbol<span style="color: #000080;">=</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">bool</span> sel<span style="color: #000080;">=</span><span style="color: #8a2be2;">PositionSelect</span><span style="color: #008000;">&#40;</span>symbol<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>sel<span style="color: #000080;">==</span><span style="color: #333399;">false</span><span style="color: #008000;">&#41;</span>
     <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>FLAT<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   else
    <span style="color: #008000;">&#123;</span>
     <span style="color: #0000ff;">long</span> p<span style="color: #000080;">=</span><span style="color: #8a2be2;">PositionGetInteger</span><span style="color: #008000;">&#40;</span><span style="color: #333399;">POSITION_TYPE</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
     <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>p<span style="color: #000080;">==</span><span style="color: #333399;">POSITION_TYPE_BUY</span><span style="color: #008000;">&#41;</span>
       <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>LONG<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
     else
       <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>SHORT<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
  <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>This function is a simple proxy to get a straight position type value. The value for POSITION_TYPE_BUY is 0 in MQL5, and PositionInfoInteger() will answer 0 even if the position was not previously selected.</p>

<div class="wp_codebox"><table width="100%" ><tr id="p229818"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
</pre></td><td class="code" id="p2298code18"><pre class="mql5" style="font-family:monospace;"><span style="color: #0000ff;">void</span> ManagePosition<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> asset_index,<span style="color: #0000ff;">int</span> operation,<span style="color: #0000ff;">double</span> forcevolume<span style="color: #000080;">=</span>0.00<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>   
   MqlTradeRequest request<span style="color: #008080;">;</span>
   MqlTradeResult result<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">int</span> p<span style="color: #000080;">=</span>GetPositionType<span style="color: #008000;">&#40;</span>asset_index<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">double</span> now_volume<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">double</span> current_volume,v0<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">PositionSelect</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span><span style="color: #008000;">&#41;</span><span style="color: #000080;">==</span><span style="color: #333399;">true</span><span style="color: #008000;">&#41;</span>
     current_volume<span style="color: #000080;">=</span><span style="color: #8a2be2;">PositionGetDouble</span><span style="color: #008000;">&#40;</span><span style="color: #333399;">POSITION_VOLUME</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   else
     current_volume<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>
   v0<span style="color: #000080;">=</span>current_volume<span style="color: #008080;">;</span>   
   request.<span style="color: #007788;">action</span><span style="color: #000080;">=</span><span style="color: #333399;">TRADE_ACTION_DEAL</span><span style="color: #008080;">;</span>
   request.<span style="color: #007788;">symbol</span><span style="color: #000080;">=</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span><span style="color: #008080;">;</span> 
   request.<span style="color: #007788;">deviation</span><span style="color: #000080;">=</span>Slippage<span style="color: #008080;">;</span>
   request.<span style="color: #007788;">type_filling</span><span style="color: #000080;">=</span><span style="color: #333399;">ORDER_FILLING_AON</span><span style="color: #008080;">;</span>
   request.<span style="color: #007788;">type_time</span><span style="color: #000080;">=</span><span style="color: #333399;">ORDER_TIME_GTC</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>p<span style="color: #000080;">==</span>FLAT<span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">DoubleToString</span><span style="color: #008000;">&#40;</span>forcevolume,<span style="color: #008000;">2</span><span style="color: #008000;">&#41;</span><span style="color: #000080;">==</span><span style="color: #008080;">&quot;0.00&quot;</span><span style="color: #008000;">&#41;</span>
        request.<span style="color: #007788;">volume</span><span style="color: #000080;">=</span>UnitsToLots<span style="color: #008000;">&#40;</span> <span style="color: #008000;">&#40;</span>MarginUsagePerPosition<span style="color: #000040;">/</span>100<span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span><span style="color: #8a2be2;">AccountInfoDouble</span><span style="color: #008000;">&#40;</span><span style="color: #333399;">ACCOUNT_EQUITY</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span><span style="color: #8a2be2;">AccountInfoInteger</span><span style="color: #008000;">&#40;</span><span style="color: #333399;">ACCOUNT_LEVERAGE</span><span style="color: #008000;">&#41;</span>,SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span> <span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      else
        request.<span style="color: #007788;">volume</span><span style="color: #000080;">=</span>forcevolume<span style="color: #008080;">;</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>operation<span style="color: #000080;">==</span>LONG<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
         request.<span style="color: #007788;">type</span><span style="color: #000080;">=</span><span style="color: #333399;">ORDER_TYPE_BUY</span><span style="color: #008080;">;</span>
         request.<span style="color: #007788;">price</span><span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">SymbolInfoDouble</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_ASK</span><span style="color: #008000;">&#41;</span>,<span style="color: #8a2be2;">SymbolInfoInteger</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_DIGITS</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>operation<span style="color: #000080;">==</span>SHORT<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
         request.<span style="color: #007788;">type</span><span style="color: #000080;">=</span><span style="color: #333399;">ORDER_TYPE_SELL</span><span style="color: #008080;">;</span>
         request.<span style="color: #007788;">price</span><span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">SymbolInfoDouble</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_BID</span><span style="color: #008000;">&#41;</span>,<span style="color: #8a2be2;">SymbolInfoInteger</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_DIGITS</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>operation<span style="color: #000080;">==</span>FLAT<span style="color: #008000;">&#41;</span>
        <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
     <span style="color: #008000;">&#125;</span>
   else<span style="color: #808080;">//if (p==FLAT)</span>
     <span style="color: #008000;">&#123;</span>     
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>p<span style="color: #000080;">==</span>LONG<span style="color: #000040;">&amp;&amp;</span>operation<span style="color: #000080;">==</span>SHORT<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
         <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">DoubleToString</span><span style="color: #008000;">&#40;</span>forcevolume,<span style="color: #008000;">2</span><span style="color: #008000;">&#41;</span><span style="color: #000080;">==</span><span style="color: #008080;">&quot;0.00&quot;</span><span style="color: #008000;">&#41;</span>
           request.<span style="color: #007788;">volume</span><span style="color: #000080;">=</span>current_volume<span style="color: #000040;">+</span>UnitsToLots<span style="color: #008000;">&#40;</span> <span style="color: #008000;">&#40;</span>MarginUsagePerPosition<span style="color: #000040;">/</span>100<span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span><span style="color: #8a2be2;">AccountInfoDouble</span><span style="color: #008000;">&#40;</span><span style="color: #333399;">ACCOUNT_EQUITY</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span><span style="color: #8a2be2;">AccountInfoInteger</span><span style="color: #008000;">&#40;</span><span style="color: #333399;">ACCOUNT_LEVERAGE</span><span style="color: #008000;">&#41;</span>,SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span> <span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
         else
           request.<span style="color: #007788;">volume</span><span style="color: #000080;">=</span>current_volume<span style="color: #000040;">+</span>forcevolume<span style="color: #008080;">;</span>
         request.<span style="color: #007788;">type</span><span style="color: #000080;">=</span><span style="color: #333399;">ORDER_TYPE_SELL</span><span style="color: #008080;">;</span>         
         request.<span style="color: #007788;">price</span><span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">SymbolInfoDouble</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_BID</span><span style="color: #008000;">&#41;</span>,<span style="color: #8a2be2;">SymbolInfoInteger</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_DIGITS</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>         
        <span style="color: #008000;">&#125;</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>p<span style="color: #000080;">==</span>SHORT<span style="color: #000040;">&amp;&amp;</span>operation<span style="color: #000080;">==</span>LONG<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
         <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">DoubleToString</span><span style="color: #008000;">&#40;</span>forcevolume,<span style="color: #008000;">2</span><span style="color: #008000;">&#41;</span><span style="color: #000080;">==</span><span style="color: #008080;">&quot;0.00&quot;</span><span style="color: #008000;">&#41;</span>         
           request.<span style="color: #007788;">volume</span><span style="color: #000080;">=</span>current_volume<span style="color: #000040;">+</span>UnitsToLots<span style="color: #008000;">&#40;</span> <span style="color: #008000;">&#40;</span>MarginUsagePerPosition<span style="color: #000040;">/</span>100<span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span><span style="color: #8a2be2;">AccountInfoDouble</span><span style="color: #008000;">&#40;</span><span style="color: #333399;">ACCOUNT_EQUITY</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span><span style="color: #8a2be2;">AccountInfoInteger</span><span style="color: #008000;">&#40;</span><span style="color: #333399;">ACCOUNT_LEVERAGE</span><span style="color: #008000;">&#41;</span>,SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span> <span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
         else
           request.<span style="color: #007788;">volume</span><span style="color: #000080;">=</span>current_volume<span style="color: #000040;">+</span>forcevolume<span style="color: #008080;">;</span>
         request.<span style="color: #007788;">type</span><span style="color: #000080;">=</span><span style="color: #333399;">ORDER_TYPE_BUY</span><span style="color: #008080;">;</span>
         request.<span style="color: #007788;">price</span><span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">SymbolInfoDouble</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_ASK</span><span style="color: #008000;">&#41;</span>,<span style="color: #8a2be2;">SymbolInfoInteger</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_DIGITS</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>p<span style="color: #000080;">==</span>LONG<span style="color: #000040;">&amp;&amp;</span>operation<span style="color: #000080;">==</span>FLAT<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>       
         <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">DoubleToString</span><span style="color: #008000;">&#40;</span>forcevolume,<span style="color: #008000;">2</span><span style="color: #008000;">&#41;</span><span style="color: #000080;">==</span><span style="color: #008080;">&quot;0.00&quot;</span><span style="color: #008000;">&#41;</span>
           request.<span style="color: #007788;">volume</span><span style="color: #000080;">=</span>current_volume<span style="color: #008080;">;</span>
         else
           request.<span style="color: #007788;">volume</span><span style="color: #000080;">=</span>forcevolume<span style="color: #008080;">;</span>
         request.<span style="color: #007788;">type</span><span style="color: #000080;">=</span><span style="color: #333399;">ORDER_TYPE_SELL</span><span style="color: #008080;">;</span>         
         request.<span style="color: #007788;">price</span><span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">SymbolInfoDouble</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_BID</span><span style="color: #008000;">&#41;</span>,<span style="color: #8a2be2;">SymbolInfoInteger</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_DIGITS</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>         
        <span style="color: #008000;">&#125;</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>p<span style="color: #000080;">==</span>SHORT<span style="color: #000040;">&amp;&amp;</span>operation<span style="color: #000080;">==</span>FLAT<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
         <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">DoubleToString</span><span style="color: #008000;">&#40;</span>forcevolume,<span style="color: #008000;">2</span><span style="color: #008000;">&#41;</span><span style="color: #000080;">==</span><span style="color: #008080;">&quot;0.00&quot;</span><span style="color: #008000;">&#41;</span>           
           request.<span style="color: #007788;">volume</span><span style="color: #000080;">=</span>current_volume<span style="color: #008080;">;</span>
         else
           request.<span style="color: #007788;">volume</span><span style="color: #000080;">=</span>forcevolume<span style="color: #008080;">;</span>
         request.<span style="color: #007788;">type</span><span style="color: #000080;">=</span><span style="color: #333399;">ORDER_TYPE_BUY</span><span style="color: #008080;">;</span>         
         request.<span style="color: #007788;">price</span><span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">SymbolInfoDouble</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_ASK</span><span style="color: #008000;">&#41;</span>,<span style="color: #8a2be2;">SymbolInfoInteger</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_DIGITS</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>         
        <span style="color: #008000;">&#125;</span> 
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>p<span style="color: #000080;">==</span>LONG<span style="color: #000040;">&amp;&amp;</span>operation<span style="color: #000080;">==</span>LONG<span style="color: #008000;">&#41;</span><span style="color: #808080;">//adjustment of the present LONG position</span>
        <span style="color: #008000;">&#123;</span>
         <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">DoubleToString</span><span style="color: #008000;">&#40;</span>forcevolume,<span style="color: #008000;">2</span><span style="color: #008000;">&#41;</span><span style="color: #000080;">==</span><span style="color: #008080;">&quot;0.00&quot;</span><span style="color: #008000;">&#41;</span>
           request.<span style="color: #007788;">volume</span><span style="color: #000080;">=</span>UnitsToLots<span style="color: #008000;">&#40;</span> <span style="color: #008000;">&#40;</span>MarginUsagePerPosition<span style="color: #000040;">/</span>100<span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span><span style="color: #8a2be2;">AccountInfoDouble</span><span style="color: #008000;">&#40;</span><span style="color: #333399;">ACCOUNT_EQUITY</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span><span style="color: #8a2be2;">AccountInfoInteger</span><span style="color: #008000;">&#40;</span><span style="color: #333399;">ACCOUNT_LEVERAGE</span><span style="color: #008000;">&#41;</span>,SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span> <span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span>current_volume<span style="color: #008080;">;</span>
         else
           request.<span style="color: #007788;">volume</span><span style="color: #000080;">=</span>forcevolume<span style="color: #000040;">-</span>current_volume<span style="color: #008080;">;</span>
         <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span>request.<span style="color: #007788;">volume</span>,2<span style="color: #008000;">&#41;</span><span style="color: #000080;">&gt;</span>0.00<span style="color: #008000;">&#41;</span>
           <span style="color: #008000;">&#123;</span>         
            request.<span style="color: #007788;">type</span><span style="color: #000080;">=</span><span style="color: #333399;">ORDER_TYPE_BUY</span><span style="color: #008080;">;</span>
            request.<span style="color: #007788;">price</span><span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">SymbolInfoDouble</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_ASK</span><span style="color: #008000;">&#41;</span>,<span style="color: #8a2be2;">SymbolInfoInteger</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_DIGITS</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
           <span style="color: #008000;">&#125;</span>
         else <span style="color: #808080;">//we close the difference</span>
           <span style="color: #008000;">&#123;</span>
            request.<span style="color: #007788;">volume</span><span style="color: #000080;">=</span><span style="color: #8a2be2;">MathAbs</span><span style="color: #008000;">&#40;</span>request.<span style="color: #007788;">volume</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            request.<span style="color: #007788;">type</span><span style="color: #000080;">=</span><span style="color: #333399;">ORDER_TYPE_SELL</span><span style="color: #008080;">;</span>         
            request.<span style="color: #007788;">price</span><span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">SymbolInfoDouble</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_BID</span><span style="color: #008000;">&#41;</span>,<span style="color: #8a2be2;">SymbolInfoInteger</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_DIGITS</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>         
           <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>        
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>p<span style="color: #000080;">==</span>SHORT<span style="color: #000040;">&amp;&amp;</span>operation<span style="color: #000080;">==</span>SHORT<span style="color: #008000;">&#41;</span><span style="color: #808080;">//adjustment of the present SHORT position</span>
        <span style="color: #008000;">&#123;</span>
         <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">DoubleToString</span><span style="color: #008000;">&#40;</span>forcevolume,<span style="color: #008000;">2</span><span style="color: #008000;">&#41;</span><span style="color: #000080;">==</span><span style="color: #008080;">&quot;0.00&quot;</span><span style="color: #008000;">&#41;</span>
           request.<span style="color: #007788;">volume</span><span style="color: #000080;">=</span>UnitsToLots<span style="color: #008000;">&#40;</span> <span style="color: #008000;">&#40;</span>MarginUsagePerPosition<span style="color: #000040;">/</span>100<span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span><span style="color: #8a2be2;">AccountInfoDouble</span><span style="color: #008000;">&#40;</span><span style="color: #333399;">ACCOUNT_EQUITY</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span><span style="color: #8a2be2;">AccountInfoInteger</span><span style="color: #008000;">&#40;</span><span style="color: #333399;">ACCOUNT_LEVERAGE</span><span style="color: #008000;">&#41;</span>,SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span> <span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span>current_volume<span style="color: #008080;">;</span>
         else
           request.<span style="color: #007788;">volume</span><span style="color: #000080;">=</span>forcevolume<span style="color: #000040;">-</span>current_volume<span style="color: #008080;">;</span>
         <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span>request.<span style="color: #007788;">volume</span>,2<span style="color: #008000;">&#41;</span><span style="color: #000080;">&gt;</span>0.00<span style="color: #008000;">&#41;</span>
           <span style="color: #008000;">&#123;</span>
            request.<span style="color: #007788;">type</span><span style="color: #000080;">=</span><span style="color: #333399;">ORDER_TYPE_SELL</span><span style="color: #008080;">;</span>         
            request.<span style="color: #007788;">price</span><span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">SymbolInfoDouble</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_BID</span><span style="color: #008000;">&#41;</span>,<span style="color: #8a2be2;">SymbolInfoInteger</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_DIGITS</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>                  
           <span style="color: #008000;">&#125;</span>
         else
           <span style="color: #008000;">&#123;</span>
            request.<span style="color: #007788;">volume</span><span style="color: #000080;">=</span><span style="color: #8a2be2;">MathAbs</span><span style="color: #008000;">&#40;</span>request.<span style="color: #007788;">volume</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            request.<span style="color: #007788;">type</span><span style="color: #000080;">=</span><span style="color: #333399;">ORDER_TYPE_BUY</span><span style="color: #008080;">;</span>
            request.<span style="color: #007788;">price</span><span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">SymbolInfoDouble</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_ASK</span><span style="color: #008000;">&#41;</span>,<span style="color: #8a2be2;">SymbolInfoInteger</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_DIGITS</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>            
           <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>        
     <span style="color: #008000;">&#125;</span><span style="color: #808080;">//if (p==FLAT)]  </span>
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">DoubleToString</span><span style="color: #008000;">&#40;</span>request.<span style="color: #007788;">volume</span>,<span style="color: #008000;">2</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #008080;">&quot;0.00&quot;</span><span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
      <span style="color: #8a2be2;">OrderSend</span><span style="color: #008000;">&#40;</span>request,result<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>     
      PositionSetSLTP<span style="color: #008000;">&#40;</span>StopLoss,TakeProfit<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
     <span style="color: #008000;">&#125;</span>     
  <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>What does ManagePosition() do ? It opens a position on the given asset by index, upon request, if it is flattened before ; or it reverts the current position, by recalculating the new lot size (calculates new lot size with the formula, adds to current volume and reverses operation). It can also add or cut from the current position. The forcevolume parameter can be used to force a given volume into a trade, bypassing calculus.<br />
How about setting a stop loss ? Nothing easier:</p>

<div class="wp_codebox"><table width="100%" ><tr id="p229819"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
</pre></td><td class="code" id="p2298code19"><pre class="mql5" style="font-family:monospace;"><span style="color: #0000ff;">void</span> PositionSetSLTP<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> asset_index,<span style="color: #0000ff;">int</span> sl,<span style="color: #0000ff;">int</span> tp<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">bool</span> todosl, todotp<span style="color: #008080;">;</span>
   MqlTradeRequest request<span style="color: #008080;">;</span>
   MqlTradeResult result<span style="color: #008080;">;</span>   
   <span style="color: #0000ff;">double</span> price<span style="color: #000080;">=</span><span style="color:#800080;">0.00</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">int</span> p<span style="color: #000080;">=</span>GetPositionType<span style="color: #008000;">&#40;</span>asset_index<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>p<span style="color: #000080;">==</span>LONG<span style="color: #000040;">||</span>p<span style="color: #000080;">==</span>SHORT<span style="color: #008000;">&#41;</span>
     price<span style="color: #000080;">=</span><span style="color: #8a2be2;">PositionGetDouble</span><span style="color: #008000;">&#40;</span><span style="color: #333399;">POSITION_PRICE_OPEN</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   request.<span style="color: #007788;">action</span><span style="color: #000080;">=</span><span style="color: #333399;">TRADE_ACTION_SLTP</span><span style="color: #008080;">;</span>
   request.<span style="color: #007788;">symbol</span><span style="color: #000080;">=</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span><span style="color: #008080;">;</span>   
   todosl<span style="color: #000080;">=</span><span style="color: #333399;">false</span><span style="color: #008080;">;</span>
   todotp<span style="color: #000080;">=</span><span style="color: #333399;">false</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">DoubleToString</span><span style="color: #008000;">&#40;</span>sl,<span style="color: #008000;">4</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #008080;">&quot;0.0000&quot;</span><span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
      todosl<span style="color: #000080;">=</span><span style="color: #333399;">true</span><span style="color: #008080;">;</span>      
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>p<span style="color: #000080;">==</span>LONG<span style="color: #008000;">&#41;</span>
        request.<span style="color: #007788;">sl</span><span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span>price<span style="color: #000040;">-</span>sl<span style="color: #000040;">*</span><span style="color: #8a2be2;">SymbolInfoDouble</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_POINT</span><span style="color: #008000;">&#41;</span>,<span style="color: #8a2be2;">SymbolInfoInteger</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_DIGITS</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>p<span style="color: #000080;">==</span>SHORT<span style="color: #008000;">&#41;</span>
        request.<span style="color: #007788;">sl</span><span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span>price<span style="color: #000040;">+</span>sl<span style="color: #000040;">*</span><span style="color: #8a2be2;">SymbolInfoDouble</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_POINT</span><span style="color: #008000;">&#41;</span>,<span style="color: #8a2be2;">SymbolInfoInteger</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_DIGITS</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
     <span style="color: #008000;">&#125;</span>
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">DoubleToString</span><span style="color: #008000;">&#40;</span>tp,<span style="color: #008000;">4</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #008080;">&quot;0.0000&quot;</span><span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>      
      todotp<span style="color: #000080;">=</span><span style="color: #333399;">true</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>p<span style="color: #000080;">==</span>LONG<span style="color: #008000;">&#41;</span>
        request.<span style="color: #007788;">tp</span><span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span>price<span style="color: #000040;">+</span>tp<span style="color: #000040;">*</span><span style="color: #8a2be2;">SymbolInfoDouble</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_POINT</span><span style="color: #008000;">&#41;</span>,<span style="color: #8a2be2;">SymbolInfoInteger</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_DIGITS</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>p<span style="color: #000080;">==</span>SHORT<span style="color: #008000;">&#41;</span>
        request.<span style="color: #007788;">tp</span><span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span>price<span style="color: #000040;">-</span>tp<span style="color: #000040;">*</span><span style="color: #8a2be2;">SymbolInfoDouble</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_POINT</span><span style="color: #008000;">&#41;</span>,<span style="color: #8a2be2;">SymbolInfoInteger</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_DIGITS</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
     <span style="color: #008000;">&#125;</span>
   request.<span style="color: #007788;">deviation</span><span style="color: #000080;">=</span>Slippage<span style="color: #008080;">;</span>   
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>todosl<span style="color: #000080;">==</span><span style="color: #333399;">true</span><span style="color: #000040;">||</span>todotp<span style="color: #000080;">==</span><span style="color: #333399;">true</span><span style="color: #008000;">&#41;</span>
     <span style="color: #8a2be2;">OrderSend</span><span style="color: #008000;">&#40;</span>request,result<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>Note that the OrderSend() calls are not followed by an analysis of the result. We didn&#8217;t dwelve into retcodes because some of them are not completely clear to us.</p>
<p>And finally OnDeinit(), which destroys the indicator handlers.</p>

<div class="wp_codebox"><table width="100%" ><tr id="p229820"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code" id="p2298code20"><pre class="mql5" style="font-family:monospace;"><span style="color: #0000ff;">void</span> OnDeinit<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> reason<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;</span>SymbolsCount<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
      <span style="color: #008000;">&#123;</span>   
       <span style="color: #8a2be2;">IndicatorRelease</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">IndicatorHandlers</span>.<span style="color: #007788;">MovingAverageHandlers14</span><span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
       <span style="color: #8a2be2;">IndicatorRelease</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">IndicatorHandlers</span>.<span style="color: #007788;">MovingAverageHandlers9</span><span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
       <span style="color: #8a2be2;">IndicatorRelease</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">IndicatorHandlers</span>.<span style="color: #007788;">MovingAverageHandlers14</span><span style="color: #008000;">&#91;</span>1<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
       <span style="color: #8a2be2;">IndicatorRelease</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">IndicatorHandlers</span>.<span style="color: #007788;">MovingAverageHandlers9</span><span style="color: #008000;">&#91;</span>1<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #008000;">&#125;</span>
   <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://mqlmagazine.com/mql-programming/guidelines-for-writing-portfolio-expert-advisors-in-mql5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MQL5 : A portfolio moving average sample expert</title>
		<link>http://mqlmagazine.com/mql-programming/mql5-a-portfolio-moving-average-sample-expert/</link>
		<comments>http://mqlmagazine.com/mql-programming/mql5-a-portfolio-moving-average-sample-expert/#comments</comments>
		<pubDate>Mon, 24 May 2010 21:29:26 +0000</pubDate>
		<dc:creator>Bogdan Caramalac, MQLmagazine sr.editor</dc:creator>
				<category><![CDATA[MQL programming]]></category>

		<guid isPermaLink="false">http://mqlmagazine.com/?p=2374</guid>
		<description><![CDATA[[Versiunea romaneasca] [MQLmagazine.com in romana] [English edition]
I wrote this expert advisor to as a full demonstration on writing portfolio expert advisors, following the principles presented in Guidelines for writing portfolio expert advisors in MQL5.
The expert will work on the chosen timeframe, only when a new bar forms up on every participating instrument. Upon checking moving [...]]]></description>
			<content:encoded><![CDATA[<p><a title="[Versiunea romaneasca]" href="http://mqlmagazine.com/ro/programarea-in-mql/mql5-un-expert-demonstrativ-de-portofoliu-folosind-medii-mobile" target="_top">[Versiunea romaneasca]</a> <a title="[MQLmagazine.com in romana]" href="http://mqlmagazine.com/ro" target="_top">[MQLmagazine.com in romana]</a> <a title="[English edition]" href="http://mqlmagazine.com" target="_top">[English edition]</a></p>
<p>I wrote this expert advisor to as a full demonstration on writing portfolio expert advisors, following the principles presented in <a href="http://mqlmagazine.com/mql-programming/guidelines-for-writing-portfolio-expert-advisors-in-mql5" target="_top">Guidelines for writing portfolio expert advisors in MQL5</a>.</p>
<p>The expert will work on the chosen timeframe, only when a new bar forms up on every participating instrument. Upon checking moving average intersections, it will manage positions. There is also the option to filter by volatility (I repaired the BBoverSTD indicator from the <a title="Volatility analysis : bridging the gap from volatility forecasting to price forecasting" href="http://mqlmagazine.com/mql-programming/volatility-analysis-bridging-the-gap-from-volatility-forecasting-to-price-forecasting/" target="_top">Volatility analysis : bridging the gap from volatility forecasting to price forecasting</a> article).</p>

<div class="wp_codebox"><table width="100%" ><tr id="p237429"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="code" id="p2374code29"><pre class="mql5" style="font-family:monospace;"><span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #808080;">//|                                                  PortfolioMA.mq5 |</span>
<span style="color: #808080;">//|                                       Copyright Bogdan Caramalac |</span>
<span style="color: #808080;">//|                                           http://mqlmagazine.com |</span>
<span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #339900;">#property copyright &quot;Copyright Bogdan Caramalac&quot;</span>
<span style="color: #339900;">#property link      &quot;http://mqlmagazine.com&quot;</span>
<span style="color: #339900;">#property version   &quot;1.00&quot;</span>
&nbsp;
<span style="color: #339900;">#define FLAT        0</span>
<span style="color: #339900;">#define LONG        1</span>
<span style="color: #339900;">#define SHORT       2</span>
&nbsp;
<span style="color: #0000ff;">input</span> <span style="color: #0000ff;">int</span> Slippage<span style="color: #000080;">=</span><span style="color: #008000;">30</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">input</span> <span style="color: #0000ff;">double</span> MarginUsagePerPosition<span style="color: #000080;">=</span><span style="color:#800080;">0.5</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">input</span> <span style="color: #0000ff;">bool</span> VolatilityFilter<span style="color: #000080;">=</span><span style="color: #333399;">false</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">input</span> <span style="color: #0000ff;">int</span> StopLoss<span style="color: #000080;">=</span><span style="color: #008000;">300</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">input</span> <span style="color: #0000ff;">int</span> TakeProfit<span style="color: #000080;">=</span><span style="color: #008000;">1000</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">input</span> <span style="color: #0000ff;">int</span> SlowMALength<span style="color: #000080;">=</span><span style="color: #008000;">14</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">input</span> <span style="color: #0000ff;">int</span> FastMALength<span style="color: #000080;">=</span><span style="color: #008000;">9</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>This section defines the constants for working with positions (FLAT,LONG,SHORT) and the parameters of the system.</p>

<div class="wp_codebox"><table width="100%" ><tr id="p237430"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code" id="p2374code30"><pre class="mql5" style="font-family:monospace;"><span style="color: #0000ff;">int</span> SymbolsCount<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">struct</span> IndicatorHandlersStruct
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">int</span> SlowMovingAverageHandler<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">int</span> FastMovingAverageHandler<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">int</span> BBoverSTDHandler<span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">struct</span> SymbolData
  <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">string</span> <span style="color: #8a2be2;">Symbol</span><span style="color: #008080;">;</span>
    IndicatorHandlersStruct IndicatorHandlers<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">datetime</span> LastBarTime<span style="color: #008080;">;</span>    
  <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
SymbolData SymbolsTable<span style="color: #008000;">&#91;</span>30<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>This section defines the data structure holding the symbols and indicator handlers.</p>

<div class="wp_codebox"><table width="100%" ><tr id="p237431"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
</pre></td><td class="code" id="p2374code31"><pre class="mql5" style="font-family:monospace;"><span style="color: #0000ff;">void</span> MakeIndicatorHandlers<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">datetime</span> datetime_array<span style="color: #008000;">&#91;</span>1<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">int</span> error1,error2,error3<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;</span>SymbolsCount<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
      <span style="color: #008000;">&#123;</span>
       error1<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>
       error2<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>
       error3<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>
       SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">IndicatorHandlers</span>.<span style="color: #007788;">SlowMovingAverageHandler</span><span style="color: #000080;">=</span><span style="color: #008000;">iMA</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #8a2be2;">Period</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>,SlowMALength,0,<span style="color: #333399;">MODE_SMA</span>,<span style="color: #333399;">PRICE_OPEN</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
       <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;SymbolsTable[&quot;</span>,i,<span style="color: #008080;">&quot;].IndicatorHandlers.SlowMovingAverageHandler=&quot;</span>,SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">IndicatorHandlers</span>.<span style="color: #007788;">SlowMovingAverageHandler</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
       <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">IndicatorHandlers</span>.<span style="color: #007788;">SlowMovingAverageHandler</span><span style="color: #000080;">&lt;</span>0<span style="color: #008000;">&#41;</span>
         <span style="color: #008000;">&#123;</span> 
          <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;Invalid handle.&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
          error1<span style="color: #000080;">=</span><span style="color: #8a2be2;">GetLastError</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
          <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;Error &quot;</span>,error1,<span style="color: #008080;">&quot; while initializing iMA(&quot;</span>,SlowMALength,<span style="color: #008080;">&quot;) for &quot;</span>,SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
         <span style="color: #008000;">&#125;</span>
       SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">IndicatorHandlers</span>.<span style="color: #007788;">FastMovingAverageHandler</span><span style="color: #000080;">=</span><span style="color: #008000;">iMA</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #8a2be2;">Period</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>,FastMALength,0,<span style="color: #333399;">MODE_SMA</span>,<span style="color: #333399;">PRICE_OPEN</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
       <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;SymbolsTable[&quot;</span>,i,<span style="color: #008080;">&quot;].IndicatorHandlers.FastMovingAverageHandler=&quot;</span>,SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">IndicatorHandlers</span>.<span style="color: #007788;">FastMovingAverageHandler</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
       <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">IndicatorHandlers</span>.<span style="color: #007788;">FastMovingAverageHandler</span><span style="color: #000080;">&lt;</span>0<span style="color: #008000;">&#41;</span>
         <span style="color: #008000;">&#123;</span>
          <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;Invalid handle.&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
          error2<span style="color: #000080;">=</span><span style="color: #8a2be2;">GetLastError</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
          <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;Error &quot;</span>,error2,<span style="color: #008080;">&quot; while initializing iMA(&quot;</span>,FastMALength,<span style="color: #008080;">&quot;) for &quot;</span>,SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
         <span style="color: #008000;">&#125;</span>
       SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">IndicatorHandlers</span>.<span style="color: #007788;">BBoverSTDHandler</span><span style="color: #000080;">=</span><span style="color: #008000;">iCustom</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #8a2be2;">Period</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>,<span style="color: #008080;">&quot;BBoverSTD&quot;</span>,<span style="color: #008000;">20</span>,<span style="color: #008000;">10</span>,<span style="color:#800080;">1.5</span>,<span style="color: #008080;">&quot;SMA&quot;</span>,2,0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
       <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;SymbolsTable[&quot;</span>,i,<span style="color: #008080;">&quot;].IndicatorHandlers.BBoverSTDHandler=&quot;</span>,SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">IndicatorHandlers</span>.<span style="color: #007788;">BBoverSTDHandler</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
       <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">IndicatorHandlers</span>.<span style="color: #007788;">BBoverSTDHandler</span><span style="color: #000080;">&lt;</span>0<span style="color: #008000;">&#41;</span>
         <span style="color: #008000;">&#123;</span> 
          <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;Invalid handle.&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
          error3<span style="color: #000080;">=</span><span style="color: #8a2be2;">GetLastError</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
          <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;Error &quot;</span>,error3,<span style="color: #008080;">&quot; while initializing BBoverSTD for &quot;</span>,SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
         <span style="color: #008000;">&#125;</span>                   
      <span style="color: #008000;">&#125;</span>
   <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>This is the MakeIndicatorHandlers() routine tailored for this EA.</p>
<p>Now follow UnitsToLots(), GetPositionType(), PositionSetSLTP() and ManagePosition() that are the ones presented in the <a href="http://mqlmagazine.com/mql-programming/guidelines-for-writing-portfolio-expert-advisors-in-mql5" target="_top">Guidelines for writing portfolio expert advisors in MQL5</a>.</p>

<div class="wp_codebox"><table width="100%" ><tr id="p237432"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
</pre></td><td class="code" id="p2374code32"><pre class="mql5" style="font-family:monospace;"><span style="color: #0000ff;">string</span> MASignal<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> asset_index<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">double</span> maslowarray<span style="color: #008000;">&#91;</span>1<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">double</span> mafastarray<span style="color: #008000;">&#91;</span>1<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">double</span> mafast,maslow<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">datetime</span> t<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">int</span> copycount1,copycount2<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">int</span> error1<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">int</span> error2<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">string</span> signal<span style="color: #008080;">;</span>
   copycount1<span style="color: #000080;">=</span><span style="color: #8a2be2;">CopyBuffer</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">IndicatorHandlers</span>.<span style="color: #007788;">SlowMovingAverageHandler</span>,0,0,1,maslowarray<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>copycount1<span style="color: #000080;">==</span><span style="color: #000040;">-</span>1<span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
      <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;Nothing copied (1). Retrieving error.&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      error1<span style="color: #000080;">=</span><span style="color: #8a2be2;">GetLastError</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
     <span style="color: #008000;">&#125;</span>
   copycount2<span style="color: #000080;">=</span><span style="color: #8a2be2;">CopyBuffer</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">IndicatorHandlers</span>.<span style="color: #007788;">FastMovingAverageHandler</span>,0,0,1,mafastarray<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>copycount2<span style="color: #000080;">==</span><span style="color: #000040;">-</span>1<span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
      <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;Nothing copied (2). Retrieving error.&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      error2<span style="color: #000080;">=</span><span style="color: #8a2be2;">GetLastError</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
     <span style="color: #008000;">&#125;</span>
   maslow<span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span>maslowarray<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span>,<span style="color: #8a2be2;">SymbolInfoInteger</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_DIGITS</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   mafast<span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span>mafastarray<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span>,<span style="color: #8a2be2;">SymbolInfoInteger</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_DIGITS</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
   t<span style="color: #000080;">=</span><span style="color: #8a2be2;">TimeCurrent</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>maslow<span style="color: #000080;">&lt;</span>mafast<span style="color: #008000;">&#41;</span>
     signal<span style="color: #000080;">=</span><span style="color: #008080;">&quot;L&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>maslow<span style="color: #000080;">==</span>mafast<span style="color: #008000;">&#41;</span>
     signal<span style="color: #000080;">=</span><span style="color: #008080;">&quot;-&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>maslow<span style="color: #000080;">&gt;</span>mafast<span style="color: #008000;">&#41;</span>
     signal<span style="color: #000080;">=</span><span style="color: #008080;">&quot;S&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>signal<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>This returns the moving average signal for the requested asset. Signal can be &#8220;L&#8221;, &#8220;S&#8221; or &#8220;-&#8221; .</p>

<div class="wp_codebox"><table width="100%" ><tr id="p237433"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
</pre></td><td class="code" id="p2374code33"><pre class="mql5" style="font-family:monospace;"><span style="color: #0000ff;">void</span> TradeLogics<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> asset_index<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">string</span> s<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">double</span> stddev<span style="color: #008000;">&#91;</span>1<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">double</span> bbhi<span style="color: #008000;">&#91;</span>1<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">double</span> bblo<span style="color: #008000;">&#91;</span>1<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">int</span> copycount<span style="color: #008080;">;</span>
   s<span style="color: #000080;">=</span>MASignal<span style="color: #008000;">&#40;</span>asset_index<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>VolatilityFilter<span style="color: #000080;">==</span><span style="color: #333399;">true</span><span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
      copycount<span style="color: #000080;">=</span><span style="color: #8a2be2;">CopyBuffer</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">IndicatorHandlers</span>.<span style="color: #007788;">BBoverSTDHandler</span>,0,0,1,stddev<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      copycount<span style="color: #000080;">=</span><span style="color: #8a2be2;">CopyBuffer</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">IndicatorHandlers</span>.<span style="color: #007788;">BBoverSTDHandler</span>,2,0,1,bbhi<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
     <span style="color: #008000;">&#125;</span>
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>GetPositionType<span style="color: #008000;">&#40;</span>asset_index<span style="color: #008000;">&#41;</span><span style="color: #000080;">==</span>FLAT<span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>      
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>s<span style="color: #000080;">==</span><span style="color: #008080;">&quot;L&quot;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
         <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>VolatilityFilter<span style="color: #000080;">==</span><span style="color: #333399;">true</span><span style="color: #008000;">&#41;</span>
           <span style="color: #008000;">&#123;</span>
            <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>stddev<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span><span style="color: #000080;">&gt;</span>bbhi<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
              ManagePosition<span style="color: #008000;">&#40;</span>asset_index,LONG<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
           <span style="color: #008000;">&#125;</span>
         else
           ManagePosition<span style="color: #008000;">&#40;</span>asset_index,LONG<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>s<span style="color: #000080;">==</span><span style="color: #008080;">&quot;S&quot;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
         <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>VolatilityFilter<span style="color: #000080;">==</span><span style="color: #333399;">true</span><span style="color: #008000;">&#41;</span>
           <span style="color: #008000;">&#123;</span>
            <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>stddev<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span><span style="color: #000080;">&gt;</span>bbhi<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
              ManagePosition<span style="color: #008000;">&#40;</span>asset_index,SHORT<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
           <span style="color: #008000;">&#125;</span>
         else
           ManagePosition<span style="color: #008000;">&#40;</span>asset_index,SHORT<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
     <span style="color: #008000;">&#125;</span><span style="color: #808080;">//else if (GetPositionType(asset_index)==FLAT)</span>
   else<span style="color: #808080;">//position is not flat</span>
     <span style="color: #008000;">&#123;</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>GetPositionType<span style="color: #008000;">&#40;</span>asset_index<span style="color: #008000;">&#41;</span><span style="color: #000080;">==</span>LONG<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
         <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>VolatilityFilter<span style="color: #000080;">==</span><span style="color: #333399;">true</span><span style="color: #008000;">&#41;</span>
           <span style="color: #008000;">&#123;</span>
            <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>s<span style="color: #000080;">==</span><span style="color: #008080;">&quot;S&quot;</span><span style="color: #000040;">||</span>stddev<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span><span style="color: #000080;">&lt;</span>bbhi<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
              ManagePosition<span style="color: #008000;">&#40;</span>asset_index,FLAT<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
           <span style="color: #008000;">&#125;</span>           
         else
           <span style="color: #008000;">&#123;</span>
            <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>s<span style="color: #000080;">==</span><span style="color: #008080;">&quot;S&quot;</span><span style="color: #008000;">&#41;</span>
              ManagePosition<span style="color: #008000;">&#40;</span>asset_index,FLAT<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>           
           <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>GetPositionType<span style="color: #008000;">&#40;</span>asset_index<span style="color: #008000;">&#41;</span><span style="color: #000080;">==</span>SHORT<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
         <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>VolatilityFilter<span style="color: #000080;">==</span><span style="color: #333399;">true</span><span style="color: #008000;">&#41;</span>
           <span style="color: #008000;">&#123;</span>
            <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>s<span style="color: #000080;">==</span><span style="color: #008080;">&quot;L&quot;</span><span style="color: #000040;">||</span>stddev<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span><span style="color: #000080;">&lt;</span>bbhi<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
              ManagePosition<span style="color: #008000;">&#40;</span>asset_index,FLAT<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
           <span style="color: #008000;">&#125;</span>
         else
           <span style="color: #008000;">&#123;</span>
            <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>s<span style="color: #000080;">==</span><span style="color: #008080;">&quot;L&quot;</span><span style="color: #008000;">&#41;</span>
              ManagePosition<span style="color: #008000;">&#40;</span>asset_index,FLAT<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>           
           <span style="color: #008000;">&#125;</span>        
        <span style="color: #008000;">&#125;</span>
     <span style="color: #008000;">&#125;</span>           
   <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>This is the TradeLogics(). First it checks if VolatilityFilter is enabled, and only in this case calls the BBoverSTD indicator, to save time for the situation the filter is disabled. Then it tests if position is flat.<br />
If it is, goes long or short according to the MASignal() , eventually filtered by the BBoverSTD values, if VolatilityFilter is enabled. If the position is long or short already, it checks only for contrarian signals (of course, same filtering). If contrarian signal comes, position is flattened, otherwise there is no adaptation of position to the new equity size (although the ManagePosition() is able to do it, but not asked to do so).</p>

<div class="wp_codebox"><table width="100%" ><tr id="p237434"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code" id="p2374code34"><pre class="mql5" style="font-family:monospace;"><span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #808080;">//| Expert initialization function                                   |</span>
<span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #0000ff;">int</span> OnInit<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">string</span> crtsymbol<span style="color: #008080;">;</span>
   SymbolsTable<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span><span style="color: #000080;">=</span><span style="color: #008080;">&quot;EURUSD&quot;</span><span style="color: #008080;">;</span>
   SymbolsTable<span style="color: #008000;">&#91;</span>1<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span><span style="color: #000080;">=</span><span style="color: #008080;">&quot;USDJPY&quot;</span><span style="color: #008080;">;</span>
   SymbolsTable<span style="color: #008000;">&#91;</span>2<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span><span style="color: #000080;">=</span><span style="color: #008080;">&quot;GBPUSD&quot;</span><span style="color: #008080;">;</span>
   SymbolsTable<span style="color: #008000;">&#91;</span>3<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span><span style="color: #000080;">=</span><span style="color: #008080;">&quot;USDCHF&quot;</span><span style="color: #008080;">;</span>
   SymbolsCount<span style="color: #000080;">=</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>
   MakeIndicatorHandlers<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>This is the OnInit(). It is already preset to work with four currency pairs. If SymbolsCount remains 1 , only EURUSD will be traded. If you set it to 4, all four pairs will be traded. You can alter the SymbolsTable[] however you wish (problems may arise however at the lot calculus while trading CFDs). OnInit() must end with a call to MakeIndicatorHandlers() to get the indicator handlers ready for usage.</p>

<div class="wp_codebox"><table width="100%" ><tr id="p237435"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="code" id="p2374code35"><pre class="mql5" style="font-family:monospace;"><span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #808080;">//| Expert tick function                                             |</span>
<span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #0000ff;">void</span> OnTick<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">datetime</span> datetime_array<span style="color: #008000;">&#91;</span>1<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;</span>SymbolsCount<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
      <span style="color: #008000;">&#123;</span>
       <span style="color: #8a2be2;">CopyTime</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #8a2be2;">Period</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>,0,1,datetime_array<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
       <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>datetime_array<span style="color: #008000;">&#91;</span><span style="color: #008000;">0</span><span style="color: #008000;">&#93;</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span>SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">LastBarTime</span><span style="color: #008000;">&#41;</span>
         <span style="color: #008000;">&#123;</span>
          <span style="color: #808080;">//Print(SymbolsTable[i].Symbol,&quot; :: &quot;,TimeToString(SymbolsTable[i].LastBarTime,TIME_DATE),&quot; &quot;,TimeToString(SymbolsTable[i].LastBarTime,TIME_MINUTES),&quot;  vs. &quot;,TimeToString(datetime_array[0],TIME_DATE),&quot; &quot;,TimeToString(datetime_array[0],TIME_SECONDS) );</span>
          TradeLogics<span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
          SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">LastBarTime</span><span style="color: #000080;">=</span>datetime_array<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>          
         <span style="color: #008000;">&#125;</span><span style="color: #808080;">//if (datetime_array[0]!=LastBarOccurred[i])</span>
      <span style="color: #008000;">&#125;</span><span style="color: #808080;">//for (int i=0;i&lt;SymbolsCount;i++)</span>
   <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>This is the OnTick(). The OnTick() contains the symbol loop, and requires the time of the last bar of the given timeframe on the current symbol given by the cycle. If this time is different than remembered time, it means a new bar appeared on that symbol chart. Then TradeLogics() is called for decision and subsequent call to ManagePosition().</p>

<div class="wp_codebox"><table width="100%" ><tr id="p237436"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code" id="p2374code36"><pre class="mql5" style="font-family:monospace;"><span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #808080;">//| Expert deinitialization function                                 |</span>
<span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #0000ff;">void</span> OnDeinit<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> reason<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;</span>SymbolsCount<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
      <span style="color: #008000;">&#123;</span>   
       <span style="color: #8a2be2;">IndicatorRelease</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">IndicatorHandlers</span>.<span style="color: #007788;">SlowMovingAverageHandler</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
       <span style="color: #8a2be2;">IndicatorRelease</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">IndicatorHandlers</span>.<span style="color: #007788;">FastMovingAverageHandler</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
       <span style="color: #8a2be2;">IndicatorRelease</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">IndicatorHandlers</span>.<span style="color: #007788;">BBoverSTDHandler</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #008000;">&#125;</span>
   <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>This is the OnDeinit(). It releases indicator handlers. Should OnInit() be run again, it will make other handlers. It is not completely necessary to do this, however wasting memory with new handlers every time OnInit() runs is not clean programming.</p>
<p>The following backtests were made with no StopLoss and TakeProfit set, also with VolatilityFilter disabled.</p>
<p><a href="http://mqlmagazine.com/mql-programming/mql5-a-portfolio-moving-average-sample-expert/attachment/portfolioma-runs/" rel="attachment wp-att-2384"><img src="http://mqlmagazine.com/wp-content/uploads/2010/05/PortfolioMA-runs.jpg" alt="" title="PortfolioMA runs" width="945" height="660" class="alignnone size-full wp-image-2384" /></a></p>
<p>As we can see, portfolying was not a good choice. It added extra instability and deeper drawdowns. However, now we are dealing with trading systems, while <em>portfolio management theory supposes a generally long or out strategy</em>. This why, in financial theory, negative correlations would drive risks down, because pluses on some assets would compensate with minuses on other assets. But, what we have now is a <strong>portfolio of trading systems</strong>. We can think a trading system as an equity function of instruments:
<pre> equity = trading system (instrument) </pre>
<p> On two perfectly negatively correlated assets, the trading system function would output two positively correlated equity series. A rigorous approach would ask that a Markowitz or CAPM selection over trading systems to be done with based on trading system outputs rather than market data.</p>
<p>See also the article about <a href="http://mqlmagazine.com/mql-programming/trading-systems-virtualization-to-achieve-equity-line-fitting-a-myth" target="_top">trading systems virtualization</a> article, which is analysing the problem from another point of view.</p>
<p>File link:<br />
<a title="PortfolioMA.mq5" href="http://mqlmagazine.com/wp-content/uploads/editions/may2010/PortfolioMA.mq5" target="_top">PortfolioMA.mq5</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mqlmagazine.com/mql-programming/mql5-a-portfolio-moving-average-sample-expert/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Trading systems virtualization to achieve equity line fitting &#8211; a myth ?</title>
		<link>http://mqlmagazine.com/mql-programming/trading-systems-virtualization-to-achieve-equity-line-fitting-a-myth/</link>
		<comments>http://mqlmagazine.com/mql-programming/trading-systems-virtualization-to-achieve-equity-line-fitting-a-myth/#comments</comments>
		<pubDate>Mon, 24 May 2010 21:29:07 +0000</pubDate>
		<dc:creator>Bogdan Caramalac, MQLmagazine sr.editor</dc:creator>
				<category><![CDATA[MQL programming]]></category>

		<guid isPermaLink="false">http://mqlmagazine.com/?p=2358</guid>
		<description><![CDATA[[Versiunea romaneasca] [MQLmagazine.com in romana] [English edition]
Did you ever think that you&#8217;d like to have a moving average over the equity of a trading system, so you can turn it on and off ? This would be called equity line fitting.
The frustrating aspect is that once you start doing this from the trading system that [...]]]></description>
			<content:encoded><![CDATA[<p><a title="[Versiunea romaneasca]" href="http://mqlmagazine.com/ro/programarea-in-mql/virtualizarea-sistemelor-de-trading-pentru-ajustarea-liniei-de-equity-un-mit" target="_top">[Versiunea romaneasca]</a> <a title="[MQLmagazine.com in romana]" href="http://mqlmagazine.com/ro" target="_top">[MQLmagazine.com in romana]</a> <a title="[English edition]" href="http://mqlmagazine.com" target="_top">[English edition]</a></p>
<p>Did you ever think that you&#8217;d like to have a moving average over the equity of a trading system, so you can turn it on and off ? This would be called <strong>equity line fitting</strong>.</p>
<p>The frustrating aspect is that once you start doing this from the trading system that you want to curve it its equity line, you cannot control the process anymore, as the indicators of the equity line will report differently once you hit the switch.</p>
<p>So, what you have to do is to let the system paper trade somehow in parallel to your main trading system, and copy the trades in your main trading system when the switch is on, ignore paper trades when the switch is off.</p>
<p>This can be done by <strong>virtualization</strong>. Meaningly, you have to write a paper trade position management system, like a <strong>virtual account</strong> and output its &#8220;equity&#8221; to the main trading system, which will curve-fit this equity and decide whether to replicate or not the paper system&#8217;s trades.</p>
<p>Thus, we begin writing such a system, in file which we&#8217;ll call <strong>TradeVirtualization.mqh</strong> .</p>

<div class="wp_codebox"><table width="100%" ><tr id="p235850"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
</pre></td><td class="code" id="p2358code50"><pre class="mql5" style="font-family:monospace;"><span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #808080;">//|                                          TradeVirtualization.mqh |</span>
<span style="color: #808080;">//|                                       Copyright Bogdan Caramalac |</span>
<span style="color: #808080;">//|                                           http://mqlmagazine.com |</span>
<span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #339900;">#property copyright &quot;Copyright Bogdan Caramalac&quot;</span>
<span style="color: #339900;">#property link      &quot;http://mqlmagazine.com&quot;</span>
<span style="color: #339900;">#property version &quot;1.0&quot;</span>
&nbsp;
<span style="color: #339900;">#define FLAT        0</span>
<span style="color: #339900;">#define LONG        1</span>
<span style="color: #339900;">#define SHORT       2</span>
&nbsp;
<span style="color: #0000ff;">struct</span> VirtualSymbolData
  <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">string</span> <span style="color: #8a2be2;">Symbol</span><span style="color: #008080;">;</span>    
    <span style="color: #0000ff;">double</span> position<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">double</span> price<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">double</span> sl<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">double</span> tp<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">double</span> marked_price<span style="color: #008080;">;</span>    
  <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">struct</span> VirtualEquityData
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">datetime</span> opentime,closetime<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">double</span> open,high,low,close<span style="color: #008080;">;</span>  
  <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>We begin with the regular defines for position management, followed by two structures. The first is intended to store symbol data in, providing symbol, position (positive &#8211; long, negative &#8211; short), price (price of initiation for the position), marked price (last price at which the position was marked to market). The second is the intended to store virtual equity data : open and close times of an equity bar ; open, high, low, close for the equity within interval. Now it&#8217;s time for the VirtualAccount class.</p>

<div class="wp_codebox"><table width="100%" ><tr id="p235851"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
</pre></td><td class="code" id="p2358code51"><pre class="mql5" style="font-family:monospace;"><span style="color: #0000ff;">class</span> VirtualAccount
  <span style="color: #008000;">&#123;</span>   
   <span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
   <span style="color: #0000ff;">int</span> VirtualSymbolsCount<span style="color: #008080;">;</span>    
   VirtualSymbolData VirtualSymbolsTable<span style="color: #008000;">&#91;</span>30<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span> 
   VirtualEquityData VirtualEquity<span style="color: #008000;">&#91;</span>500<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">double</span> VirtualLastAccountEquity<span style="color: #008080;">;</span>  
   <span style="color: #0000ff;">int</span> VirtualLastEquityPos<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">uint</span> VirtualEquityBarSpan<span style="color: #008080;">;</span>
&nbsp;
   <span style="color: #0000ff;">void</span> VirtualAccountSet<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">double</span> Equity,<span style="color: #0000ff;">uint</span> TimeSpan<span style="color: #008000;">&#41;</span>   
       <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">datetime</span> tc<span style="color: #000080;">=</span><span style="color: #8a2be2;">TimeCurrent</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        VirtualEquity<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">opentime</span><span style="color: #000080;">=</span>tc<span style="color: #008080;">;</span>
        VirtualEquity<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">open</span><span style="color: #000080;">=</span>Equity<span style="color: #008080;">;</span>
        VirtualEquity<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">high</span><span style="color: #000080;">=</span>Equity<span style="color: #008080;">;</span>
        VirtualEquity<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">low</span><span style="color: #000080;">=</span>Equity<span style="color: #008080;">;</span>
        VirtualEquity<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">close</span><span style="color: #000080;">=</span>Equity<span style="color: #008080;">;</span>
        VirtualEquity<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">closetime</span><span style="color: #000080;">=</span>tc<span style="color: #008080;">;</span>
        VirtualLastAccountEquity<span style="color: #000080;">=</span>VirtualEquity<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">close</span><span style="color: #008080;">;</span>
        VirtualEquityBarSpan<span style="color: #000080;">=</span>TimeSpan<span style="color: #008080;">;</span>
        VirtualLastEquityPos<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
       <span style="color: #008000;">&#125;</span>  
&nbsp;
    <span style="color: #0000ff;">int</span> VirtualGetPositionType<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> asset_index<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> 
    <span style="color: #0000ff;">double</span> VirtualGetPositionSize<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> asset_index<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">void</span> VirtualPositionSetSL<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">double</span> asset_index,<span style="color: #0000ff;">double</span> sl<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">void</span> VirtualPositionSetTP<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">double</span> asset_index,<span style="color: #0000ff;">double</span> tp<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">void</span> VirtualMarkToMarket<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> asset_index<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">void</span> VirtualChangePosition<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> asset_index,<span style="color: #0000ff;">int</span> direction,<span style="color: #0000ff;">double</span> price,<span style="color: #0000ff;">double</span> lotsize<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
    <span style="color: #0000ff;">void</span> VirtualAddNewEquity<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">double</span> equity<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
    VirtualAccount<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> 
       <span style="color: #008000;">&#123;</span>
        VirtualAccountSet<span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">AccountInfoDouble</span><span style="color: #008000;">&#40;</span><span style="color: #333399;">ACCOUNT_EQUITY</span><span style="color: #008000;">&#41;</span>,0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
       <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>      
  <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>The class contains an array of VirtualSymbolsData and its count, and an array with VirtualEquityData. Other key parameters are VirtualLastEquityPos and VirtualEquityBarSpan (the time interval of a bar, in seconds). VirtualLastAccountEquity is just a proxy for retrieving last recorded equity.</p>

<div class="wp_codebox"><table width="100%" ><tr id="p235852"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
</pre></td><td class="code" id="p2358code52"><pre class="mql5" style="font-family:monospace;"><span style="color: #0000ff;">int</span> VirtualAccount<span style="color: #008080;">::</span><span style="color: #007788;">VirtualGetPositionType</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> asset_index<span style="color: #008000;">&#41;</span>     
   <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">DoubleToString</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span>,<span style="color: #008000;">2</span><span style="color: #008000;">&#41;</span>,<span style="color: #008000;">2</span><span style="color: #008000;">&#41;</span><span style="color: #000080;">==</span><span style="color: #008080;">&quot;0.00&quot;</span><span style="color: #008000;">&#41;</span>
      <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>FLAT<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span><span style="color: #000080;">&gt;</span>0.00<span style="color: #008000;">&#41;</span>
      <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>LONG<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span><span style="color: #000080;">&lt;</span>0.00<span style="color: #008000;">&#41;</span>
      <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>SHORT<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> 
    <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>       
   <span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">double</span> VirtualAccount<span style="color: #008080;">::</span><span style="color: #007788;">VirtualGetPositionSize</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> asset_index<span style="color: #008000;">&#41;</span>     
   <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">DoubleToString</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span>,<span style="color: #008000;">2</span><span style="color: #008000;">&#41;</span>,<span style="color: #008000;">2</span><span style="color: #008000;">&#41;</span><span style="color: #000080;">==</span><span style="color: #008080;">&quot;0.00&quot;</span><span style="color: #008000;">&#41;</span>
      <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>0.00<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">MathAbs</span><span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span><span style="color: #008000;">&#41;</span>,2<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>       
   <span style="color: #008000;">&#125;</span>       
&nbsp;
 <span style="color: #0000ff;">void</span> VirtualAccount<span style="color: #008080;">::</span><span style="color: #007788;">VirtualPositionSetSL</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">double</span> asset_index,<span style="color: #0000ff;">double</span> sl<span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
      VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">sl</span><span style="color: #000080;">=</span>sl<span style="color: #008080;">;</span>
     <span style="color: #008000;">&#125;</span>
&nbsp;
 <span style="color: #0000ff;">void</span> VirtualAccount<span style="color: #008080;">::</span><span style="color: #007788;">VirtualPositionSetTP</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">double</span> asset_index,<span style="color: #0000ff;">double</span> tp<span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
      VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">tp</span><span style="color: #000080;">=</span>tp<span style="color: #008080;">;</span>
     <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>VirtualGetPositionType() and VirtualGetPositionSize() are pure informational. The position size is always positive, like the POSITION_VOLUME requests to MQL5&#8217;s PositionInfoDouble(). The other two functions do what their name says they do.</p>

<div class="wp_codebox"><table width="100%" ><tr id="p235853"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
</pre></td><td class="code" id="p2358code53"><pre class="mql5" style="font-family:monospace;"><span style="color: #0000ff;">void</span> VirtualAccount<span style="color: #008080;">::</span><span style="color: #007788;">VirtualAddNewEquity</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">double</span> equity<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
     <span style="color: #0000ff;">datetime</span> tc<span style="color: #000080;">=</span><span style="color: #8a2be2;">TimeCurrent</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
     <span style="color: #0000ff;">uint</span> diff<span style="color: #008080;">;</span>
     diff<span style="color: #000080;">=</span>tc<span style="color: #000040;">-</span>VirtualEquity<span style="color: #008000;">&#91;</span>VirtualLastEquityPos<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">opentime</span><span style="color: #008080;">;</span>
     <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>diff<span style="color: #000080;">&lt;=</span>VirtualEquityBarSpan<span style="color: #008000;">&#41;</span>
       <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>VirtualEquity<span style="color: #008000;">&#91;</span>VirtualLastEquityPos<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">high</span><span style="color: #000080;">&lt;</span>equity<span style="color: #008000;">&#41;</span>
          VirtualEquity<span style="color: #008000;">&#91;</span>VirtualLastEquityPos<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">high</span><span style="color: #000080;">=</span>equity<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>VirtualEquity<span style="color: #008000;">&#91;</span>VirtualLastEquityPos<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">low</span><span style="color: #000080;">&gt;</span>equity<span style="color: #008000;">&#41;</span>
          VirtualEquity<span style="color: #008000;">&#91;</span>VirtualLastEquityPos<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">low</span><span style="color: #000080;">=</span>equity<span style="color: #008080;">;</span>
        VirtualEquity<span style="color: #008000;">&#91;</span>VirtualLastEquityPos<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">close</span><span style="color: #000080;">=</span>equity<span style="color: #008080;">;</span>
        diff<span style="color: #000080;">=</span>tc<span style="color: #000040;">-</span>VirtualEquity<span style="color: #008000;">&#91;</span>VirtualLastEquityPos<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">closetime</span><span style="color: #008080;">;</span>           
        VirtualEquity<span style="color: #008000;">&#91;</span>VirtualLastEquityPos<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">closetime</span><span style="color: #000080;">=</span>tc<span style="color: #008080;">;</span>           
        VirtualLastAccountEquity<span style="color: #000080;">=</span>equity<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
       <span style="color: #008000;">&#125;</span>
     <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>VirtualLastEquityPos<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #8a2be2;">ArrayRange</span><span style="color: #008000;">&#40;</span>VirtualEquity,0<span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span>1<span style="color: #008000;">&#41;</span>
       <span style="color: #008000;">&#123;</span>           
        VirtualLastEquityPos<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
        VirtualEquity<span style="color: #008000;">&#91;</span>VirtualLastEquityPos<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">opentime</span><span style="color: #000080;">=</span>tc<span style="color: #008080;">;</span>
        VirtualEquity<span style="color: #008000;">&#91;</span>VirtualLastEquityPos<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">open</span><span style="color: #000080;">=</span>equity<span style="color: #008080;">;</span>
        VirtualEquity<span style="color: #008000;">&#91;</span>VirtualLastEquityPos<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">high</span><span style="color: #000080;">=</span>equity<span style="color: #008080;">;</span>
        VirtualEquity<span style="color: #008000;">&#91;</span>VirtualLastEquityPos<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">low</span><span style="color: #000080;">=</span>equity<span style="color: #008080;">;</span>
        VirtualEquity<span style="color: #008000;">&#91;</span>VirtualLastEquityPos<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">close</span><span style="color: #000080;">=</span>equity<span style="color: #008080;">;</span>           
        VirtualEquity<span style="color: #008000;">&#91;</span>VirtualLastEquityPos<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">closetime</span><span style="color: #000080;">=</span>tc<span style="color: #008080;">;</span>
        VirtualLastAccountEquity<span style="color: #000080;">=</span>equity<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
       <span style="color: #008000;">&#125;</span>
     else
       <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;</span><span style="color: #8a2be2;">ArrayRange</span><span style="color: #008000;">&#40;</span>VirtualEquity,0<span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
           VirtualEquity<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>VirtualEquity<span style="color: #008000;">&#91;</span>i<span style="color: #000040;">+</span>1<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>                  
        VirtualEquity<span style="color: #008000;">&#91;</span>VirtualLastEquityPos<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">opentime</span><span style="color: #000080;">=</span>tc<span style="color: #008080;">;</span>
        VirtualEquity<span style="color: #008000;">&#91;</span>VirtualLastEquityPos<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">open</span><span style="color: #000080;">=</span>equity<span style="color: #008080;">;</span>
        VirtualEquity<span style="color: #008000;">&#91;</span>VirtualLastEquityPos<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">high</span><span style="color: #000080;">=</span>equity<span style="color: #008080;">;</span>
        VirtualEquity<span style="color: #008000;">&#91;</span>VirtualLastEquityPos<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">low</span><span style="color: #000080;">=</span>equity<span style="color: #008080;">;</span>
        VirtualEquity<span style="color: #008000;">&#91;</span>VirtualLastEquityPos<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">close</span><span style="color: #000080;">=</span>equity<span style="color: #008080;">;</span>           
        VirtualEquity<span style="color: #008000;">&#91;</span>VirtualLastEquityPos<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">closetime</span><span style="color: #000080;">=</span>tc<span style="color: #008080;">;</span>
        VirtualLastAccountEquity<span style="color: #000080;">=</span>equity<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
       <span style="color: #008000;">&#125;</span>        
    <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>At the beginning, the class is automatically set up with an equity equal to the account equity it runs on and a timespan of 0. The user may set the account to have a different startup equity and timespan. At every tick, VirtualMarkToMarket(-1) has to be called to ensure that all positions are marked to market with the new tick data. After each mark to market (either individual, with a positive parameter, or overall, with a negative parameter), a new equity value is calculated. Now the recording in the VirtualEquity[] begins from 0. If the timespan is not 0, and the new tick comes within the timespan from last equity bar opening time, the new tick is recorded on that bar, on the close field, stamping also the closetime field. High and low per equity bar is recalculated. If the timespan is 0, or if the new equity comes too late, it enters on the following bar, and so on, up to the maximum subscript (499). When it is to enter on 500, array is slided to the left one position and bar 499 starts to be recorded again. VirtualAddNewEquity() is called only from this class. Thus, it was designated to be a private method.</p>

<div class="wp_codebox"><table width="100%" ><tr id="p235854"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
</pre></td><td class="code" id="p2358code54"><pre class="mql5" style="font-family:monospace;"><span style="color: #0000ff;">void</span> VirtualAccount<span style="color: #008080;">::</span><span style="color: #007788;">VirtualMarkToMarket</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> asset_index<span style="color: #008000;">&#41;</span> <span style="color: #808080;">//marks a new equity value</span>
    <span style="color: #008000;">&#123;</span>
     <span style="color: #0000ff;">double</span> fluctuation<span style="color: #000080;">=</span><span style="color:#800080;">0.00</span><span style="color: #008080;">;</span>
     <span style="color: #0000ff;">double</span> rprice,new_equity<span style="color: #008080;">;</span>
     <span style="color: #0000ff;">int</span> p<span style="color: #008080;">;</span>
     <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>asset_index<span style="color: #000080;">&lt;</span><span style="color: #008000;">0</span><span style="color: #008000;">&#41;</span><span style="color: #808080;">//mark all</span>
       <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;</span>VirtualSymbolsCount<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
           <span style="color: #008000;">&#123;</span>
            <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">DoubleToString</span><span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span>,<span style="color: #008000;">2</span><span style="color: #008000;">&#41;</span><span style="color: #000080;">==</span><span style="color: #008080;">&quot;0.00&quot;</span><span style="color: #008000;">&#41;</span>
              <span style="color: #0000ff;">continue</span><span style="color: #008080;">;</span>
            <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span>,2<span style="color: #008000;">&#41;</span><span style="color: #000080;">&gt;</span>0.00<span style="color: #008000;">&#41;</span>
              rprice<span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">SymbolInfoDouble</span><span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_BID</span><span style="color: #008000;">&#41;</span>,<span style="color: #8a2be2;">SymbolInfoInteger</span><span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_DIGITS</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span>,2<span style="color: #008000;">&#41;</span><span style="color: #000080;">&lt;</span>0.00<span style="color: #008000;">&#41;</span>
              rprice<span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">SymbolInfoDouble</span><span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_ASK</span><span style="color: #008000;">&#41;</span>,<span style="color: #8a2be2;">SymbolInfoInteger</span><span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_DIGITS</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>                
            fluctuation<span style="color: #000080;">=</span>fluctuation<span style="color: #000040;">+</span><span style="color: #8a2be2;">MathAbs</span><span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span><span style="color: #8a2be2;">SymbolInfoDouble</span><span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_TRADE_CONTRACT_SIZE</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span>rprice<span style="color: #000040;">-</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">marked_price</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>               
            VirtualSymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">marked_price</span><span style="color: #000080;">=</span>rprice<span style="color: #008080;">;</span>
            <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">DoubleToString</span><span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">sl</span>,<span style="color: #008000;">5</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #008080;">&quot;0.00000&quot;</span><span style="color: #008000;">&#41;</span>
              <span style="color: #008000;">&#123;</span>
               <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span><span style="color: #000080;">&gt;</span>0.00<span style="color: #000040;">&amp;&amp;</span>rprice<span style="color: #000080;">&lt;=</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">sl</span><span style="color: #008000;">&#41;</span>
                 <span style="color: #008000;">&#123;</span>
                  VirtualSymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span><span style="color: #000080;">=</span><span style="color:#800080;">0.00</span><span style="color: #008080;">;</span>                     
                  VirtualSymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">tp</span><span style="color: #000080;">=</span><span style="color:#800080;">0.00</span><span style="color: #008080;">;</span>
                  VirtualSymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">sl</span><span style="color: #000080;">=</span><span style="color:#800080;">0.00</span><span style="color: #008080;">;</span>
                 <span style="color: #008000;">&#125;</span>
               <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span><span style="color: #000080;">&lt;</span>0.00<span style="color: #000040;">&amp;&amp;</span>rprice<span style="color: #000080;">&gt;=</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">sl</span><span style="color: #008000;">&#41;</span>
                 <span style="color: #008000;">&#123;</span>
                  VirtualSymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span><span style="color: #000080;">=</span><span style="color:#800080;">0.00</span><span style="color: #008080;">;</span>                     
                  VirtualSymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">tp</span><span style="color: #000080;">=</span><span style="color:#800080;">0.00</span><span style="color: #008080;">;</span>
                  VirtualSymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">sl</span><span style="color: #000080;">=</span><span style="color:#800080;">0.00</span><span style="color: #008080;">;</span>
                 <span style="color: #008000;">&#125;</span>                    
              <span style="color: #008000;">&#125;</span>
            <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">DoubleToString</span><span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">tp</span>,<span style="color: #008000;">5</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #008080;">&quot;0.00000&quot;</span><span style="color: #008000;">&#41;</span>
              <span style="color: #008000;">&#123;</span>
               <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span><span style="color: #000080;">&gt;</span>0.00<span style="color: #000040;">&amp;&amp;</span>rprice<span style="color: #000080;">&gt;=</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">tp</span><span style="color: #008000;">&#41;</span>
                 <span style="color: #008000;">&#123;</span>
                  VirtualSymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span><span style="color: #000080;">=</span><span style="color:#800080;">0.00</span><span style="color: #008080;">;</span>                     
                  VirtualSymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">tp</span><span style="color: #000080;">=</span><span style="color:#800080;">0.00</span><span style="color: #008080;">;</span>
                  VirtualSymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">sl</span><span style="color: #000080;">=</span><span style="color:#800080;">0.00</span><span style="color: #008080;">;</span>
                 <span style="color: #008000;">&#125;</span>
               <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span><span style="color: #000080;">&lt;</span>0.00<span style="color: #000040;">&amp;&amp;</span>rprice<span style="color: #000080;">&lt;=</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">tp</span><span style="color: #008000;">&#41;</span>
                 <span style="color: #008000;">&#123;</span>
                  VirtualSymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span><span style="color: #000080;">=</span><span style="color:#800080;">0.00</span><span style="color: #008080;">;</span>                     
                  VirtualSymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">tp</span><span style="color: #000080;">=</span><span style="color:#800080;">0.00</span><span style="color: #008080;">;</span>
                  VirtualSymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">sl</span><span style="color: #000080;">=</span><span style="color:#800080;">0.00</span><span style="color: #008080;">;</span>
                 <span style="color: #008000;">&#125;</span>                    
              <span style="color: #008000;">&#125;</span>                         
           <span style="color: #008000;">&#125;</span>
        new_equity<span style="color: #000080;">=</span>VirtualEquity<span style="color: #008000;">&#91;</span>VirtualLastEquityPos<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">close</span><span style="color: #000040;">+</span>fluctuation<span style="color: #008080;">;</span>
        VirtualAddNewEquity<span style="color: #008000;">&#40;</span>new_equity<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>  
       <span style="color: #008000;">&#125;</span>                      
     else
       <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">DoubleToString</span><span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span>,<span style="color: #008000;">2</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #008080;">&quot;0.00&quot;</span><span style="color: #008000;">&#41;</span>
          <span style="color: #008000;">&#123;</span>
           <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span>,2<span style="color: #008000;">&#41;</span><span style="color: #000080;">&gt;</span>0.00<span style="color: #008000;">&#41;</span>
             <span style="color: #008000;">&#123;</span>
              p<span style="color: #000080;">=</span>LONG<span style="color: #008080;">;</span>
              rprice<span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">SymbolInfoDouble</span><span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_BID</span><span style="color: #008000;">&#41;</span>,<span style="color: #8a2be2;">SymbolInfoInteger</span><span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_DIGITS</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
             <span style="color: #008000;">&#125;</span>
           <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span>,2<span style="color: #008000;">&#41;</span><span style="color: #000080;">&lt;</span>0.00<span style="color: #008000;">&#41;</span>
             <span style="color: #008000;">&#123;</span>
              p<span style="color: #000080;">=</span>SHORT<span style="color: #008080;">;</span>
              rprice<span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">SymbolInfoDouble</span><span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_ASK</span><span style="color: #008000;">&#41;</span>,<span style="color: #8a2be2;">SymbolInfoInteger</span><span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_DIGITS</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>                
             <span style="color: #008000;">&#125;</span>
           <span style="color: #808080;">//if (p==LONG)</span>
           <span style="color: #808080;">//  Print(&quot;Market marking @ &quot;,DoubleToString(rprice,SymbolInfoInteger(VirtualSymbolsTable[asset_index].Symbol,SYMBOL_DIGITS)),&quot; for &quot;,VirtualSymbolsTable[asset_index].Symbol,&quot; &quot;,DoubleToString(VirtualSymbolsTable[asset_index].position,2),&quot; LONG @ &quot;,DoubleToString(VirtualSymbolsTable[asset_index].price,SymbolInfoInteger(VirtualSymbolsTable[asset_index].Symbol,SYMBOL_DIGITS)),&quot;last mark @ &quot;,DoubleToString(VirtualSymbolsTable[asset_index].marked_price,SymbolInfoInteger(VirtualSymbolsTable[asset_index].Symbol,SYMBOL_DIGITS)),&quot; -&gt; &quot;,DoubleToString(new_equity,2),&quot; by fl. &quot;,DoubleToString(fluctuation,2));</span>
           <span style="color: #808080;">//if (p==SHORT)</span>
           <span style="color: #808080;">//  Print(&quot;Market marking @ &quot;,DoubleToString(rprice,SymbolInfoInteger(VirtualSymbolsTable[asset_index].Symbol,SYMBOL_DIGITS)),&quot; for &quot;,VirtualSymbolsTable[asset_index].Symbol,&quot; &quot;,DoubleToString(VirtualSymbolsTable[asset_index].position,2),&quot; SHORT @ &quot;,DoubleToString(VirtualSymbolsTable[asset_index].price,SymbolInfoInteger(VirtualSymbolsTable[asset_index].Symbol,SYMBOL_DIGITS)),&quot;last mark @ &quot;,DoubleToString(VirtualSymbolsTable[asset_index].marked_price,SymbolInfoInteger(VirtualSymbolsTable[asset_index].Symbol,SYMBOL_DIGITS)),&quot; -&gt; &quot;,DoubleToString(new_equity,2),&quot; by fl. &quot;,DoubleToString(fluctuation,2));                </span>
           fluctuation<span style="color: #000080;">=</span>fluctuation<span style="color: #000040;">+</span><span style="color: #8a2be2;">MathAbs</span><span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span><span style="color: #8a2be2;">SymbolInfoDouble</span><span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_TRADE_CONTRACT_SIZE</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span>rprice<span style="color: #000040;">-</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">marked_price</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>               
           VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">marked_price</span><span style="color: #000080;">=</span>rprice<span style="color: #008080;">;</span>
           <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">DoubleToString</span><span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">sl</span>,<span style="color: #008000;">5</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #008080;">&quot;0.00000&quot;</span><span style="color: #008000;">&#41;</span>
             <span style="color: #008000;">&#123;</span>
              <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span><span style="color: #000080;">&gt;</span>0.00<span style="color: #000040;">&amp;&amp;</span>rprice<span style="color: #000080;">&lt;=</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">sl</span><span style="color: #008000;">&#41;</span>
                <span style="color: #008000;">&#123;</span>
                 VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span><span style="color: #000080;">=</span><span style="color:#800080;">0.00</span><span style="color: #008080;">;</span>                     
                 VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">tp</span><span style="color: #000080;">=</span><span style="color:#800080;">0.00</span><span style="color: #008080;">;</span>
                 VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">sl</span><span style="color: #000080;">=</span><span style="color:#800080;">0.00</span><span style="color: #008080;">;</span>
                <span style="color: #008000;">&#125;</span>
              <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span><span style="color: #000080;">&lt;</span>0.00<span style="color: #000040;">&amp;&amp;</span>rprice<span style="color: #000080;">&gt;=</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">sl</span><span style="color: #008000;">&#41;</span>
                <span style="color: #008000;">&#123;</span>
                 VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span><span style="color: #000080;">=</span><span style="color:#800080;">0.00</span><span style="color: #008080;">;</span>                     
                 VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">tp</span><span style="color: #000080;">=</span><span style="color:#800080;">0.00</span><span style="color: #008080;">;</span>
                 VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">sl</span><span style="color: #000080;">=</span><span style="color:#800080;">0.00</span><span style="color: #008080;">;</span>
                <span style="color: #008000;">&#125;</span>                    
             <span style="color: #008000;">&#125;</span>
           <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">DoubleToString</span><span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">tp</span>,<span style="color: #008000;">5</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #008080;">&quot;0.00000&quot;</span><span style="color: #008000;">&#41;</span>
             <span style="color: #008000;">&#123;</span>
              <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span><span style="color: #000080;">&gt;</span>0.00<span style="color: #000040;">&amp;&amp;</span>rprice<span style="color: #000080;">&gt;=</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">tp</span><span style="color: #008000;">&#41;</span>
                <span style="color: #008000;">&#123;</span>
                 VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span><span style="color: #000080;">=</span><span style="color:#800080;">0.00</span><span style="color: #008080;">;</span>                     
                 VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">tp</span><span style="color: #000080;">=</span><span style="color:#800080;">0.00</span><span style="color: #008080;">;</span>
                 VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">sl</span><span style="color: #000080;">=</span><span style="color:#800080;">0.00</span><span style="color: #008080;">;</span>
                <span style="color: #008000;">&#125;</span>
              <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span><span style="color: #000080;">&lt;</span>0.00<span style="color: #000040;">&amp;&amp;</span>rprice<span style="color: #000080;">&lt;=</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">tp</span><span style="color: #008000;">&#41;</span>
                <span style="color: #008000;">&#123;</span>
                 VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span><span style="color: #000080;">=</span><span style="color:#800080;">0.00</span><span style="color: #008080;">;</span>                     
                 VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">tp</span><span style="color: #000080;">=</span><span style="color:#800080;">0.00</span><span style="color: #008080;">;</span>
                 VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">sl</span><span style="color: #000080;">=</span><span style="color:#800080;">0.00</span><span style="color: #008080;">;</span>
                <span style="color: #008000;">&#125;</span>                    
             <span style="color: #008000;">&#125;</span>                                       
          <span style="color: #008000;">&#125;</span>
        new_equity<span style="color: #000080;">=</span>VirtualEquity<span style="color: #008000;">&#91;</span>VirtualLastEquityPos<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">close</span><span style="color: #000040;">+</span>fluctuation<span style="color: #008080;">;</span>
        VirtualAddNewEquity<span style="color: #008000;">&#40;</span>new_equity<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>             
       <span style="color: #008000;">&#125;</span>
     <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>VirtualMarkToMarket() is the heart of the entire class. It can be called for a position or for all positions. It marks positions to the market, calculating the account equity. For each position it calculates the fluctuation in equity from the last marked price to the current market price, which becomes marked price. For the same position, the procedure may clear the stop loss and take profits once these are taken. The user has to call VirtualMarkToMarket(-1) at every tick to mark positions to market.</p>

<div class="wp_codebox"><table width="100%" ><tr id="p235855"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
</pre></td><td class="code" id="p2358code55"><pre class="mql5" style="font-family:monospace;"><span style="color: #0000ff;">void</span> VirtualAccount<span style="color: #008080;">::</span><span style="color: #007788;">VirtualChangePosition</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> asset_index,<span style="color: #0000ff;">int</span> direction,<span style="color: #0000ff;">double</span> price,<span style="color: #0000ff;">double</span> lotsize<span style="color: #008000;">&#41;</span> <span style="color: #808080;">//direction is ORDER_TYPE_BUY or ORDER_TYPE_SELL</span>
    <span style="color: #008000;">&#123;</span>
     <span style="color: #0000ff;">int</span> p<span style="color: #000080;">=</span>VirtualGetPositionType<span style="color: #008000;">&#40;</span>asset_index<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
     <span style="color: #0000ff;">double</span> rprice,fluctuation,new_equity<span style="color: #008080;">;</span>
     <span style="color: #0000ff;">double</span> oldposition<span style="color: #008080;">;</span>            
     <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>p<span style="color: #000080;">==</span>FLAT<span style="color: #008000;">&#41;</span>
       <span style="color: #008000;">&#123;</span>
        VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">price</span><span style="color: #000080;">=</span>price<span style="color: #008080;">;</span>
        VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">marked_price</span><span style="color: #000080;">=</span>price<span style="color: #008080;">;</span>
        VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">sl</span><span style="color: #000080;">=</span><span style="color:#800080;">0.00000</span><span style="color: #008080;">;</span>
        VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">tp</span><span style="color: #000080;">=</span><span style="color:#800080;">0.00000</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>direction<span style="color: #000080;">==</span><span style="color: #333399;">ORDER_TYPE_BUY</span><span style="color: #008000;">&#41;</span>             
          VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span><span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span>lotsize,2<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>direction<span style="color: #000080;">==</span><span style="color: #333399;">ORDER_TYPE_SELL</span><span style="color: #008000;">&#41;</span>
          VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span><span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span>lotsize,2<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #808080;">//Print(&quot;Position set to &quot;,VirtualSymbolsTable[asset_index].position,&quot; @ price &quot;,DoubleToString(VirtualSymbolsTable[asset_index].price,SymbolInfoInteger(VirtualSymbolsTable[asset_index].Symbol,SYMBOL_DIGITS) ) );</span>
       <span style="color: #008000;">&#125;</span>
     else
       <span style="color: #008000;">&#123;</span>
        oldposition<span style="color: #000080;">=</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span><span style="color: #008080;">;</span>
        <span style="color: #808080;">//local mark to market</span>
        VirtualMarkToMarket<span style="color: #008000;">&#40;</span>asset_index<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>           
        <span style="color: #808080;">//position update</span>
        VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">price</span><span style="color: #000080;">=</span>price<span style="color: #008080;">;</span>           
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>direction<span style="color: #000080;">==</span><span style="color: #333399;">ORDER_TYPE_BUY</span><span style="color: #008000;">&#41;</span>
          <span style="color: #008000;">&#123;</span>
           VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span><span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span><span style="color: #000040;">+</span>lotsize,2<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
           <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>oldposition<span style="color: #000080;">&lt;</span>0.00<span style="color: #000040;">&amp;&amp;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span><span style="color: #000080;">&gt;</span><span style="color:#800080;">0.00</span><span style="color: #000040;">||</span><span style="color: #8a2be2;">DoubleToString</span><span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span>,<span style="color: #008000;">5</span><span style="color: #008000;">&#41;</span><span style="color: #000080;">==</span><span style="color: #008080;">&quot;0.00000&quot;</span><span style="color: #008000;">&#41;</span>
             <span style="color: #008000;">&#123;</span>
              VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">sl</span><span style="color: #000080;">=</span><span style="color:#800080;">0.00000</span><span style="color: #008080;">;</span>
              VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">tp</span><span style="color: #000080;">=</span><span style="color:#800080;">0.00000</span><span style="color: #008080;">;</span>
             <span style="color: #008000;">&#125;</span>
          <span style="color: #008000;">&#125;</span>
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>direction<span style="color: #000080;">==</span><span style="color: #333399;">ORDER_TYPE_SELL</span><span style="color: #008000;">&#41;</span>
          <span style="color: #008000;">&#123;</span>
           VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span><span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span><span style="color: #000040;">-</span>lotsize,2<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
           <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>oldposition<span style="color: #000080;">&gt;</span>0.00<span style="color: #000040;">&amp;&amp;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span><span style="color: #000080;">&lt;</span><span style="color:#800080;">0.00</span><span style="color: #000040;">||</span><span style="color: #8a2be2;">DoubleToString</span><span style="color: #008000;">&#40;</span>VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">position</span>,<span style="color: #008000;">5</span><span style="color: #008000;">&#41;</span><span style="color: #000080;">==</span><span style="color: #008080;">&quot;0.00000&quot;</span><span style="color: #008000;">&#41;</span>
             <span style="color: #008000;">&#123;</span>
              VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">sl</span><span style="color: #000080;">=</span><span style="color:#800080;">0.00000</span><span style="color: #008080;">;</span>
              VirtualSymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">tp</span><span style="color: #000080;">=</span><span style="color:#800080;">0.00000</span><span style="color: #008080;">;</span>
             <span style="color: #008000;">&#125;</span>
          <span style="color: #008000;">&#125;</span>              
        <span style="color: #808080;">//Print(&quot;Position set to &quot;,VirtualSymbolsTable[asset_index].position,&quot; @ price &quot;,DoubleToString(VirtualSymbolsTable[asset_index].price,SymbolInfoInteger(VirtualSymbolsTable[asset_index].Symbol,SYMBOL_DIGITS) ) );</span>
       <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
   <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>To make a trade, you have to use VirtualChangePosition() which will open a position with the given direction , price and lot size on the specified asset index. This opening is similar to a deal. Thus, only ORDER_TYPE_BUY and ORDER_TYPE_SELL are supported for operation. No pending or StopLimit orders. The function only sets or modifies positions. It also clears the previous stop loss and take profit if a position reverses sign.</p>
<p>Now that the class is done, we can <strong>virtualize</strong> the portfolio moving average expert from the <a href="http://mqlmagazine.com/mql-programming/mql5-a-portfolio-moving-average-sample-expert/" target="_top">MQL5 : A portfolio moving average sample expert</a> article in a new file, called <strong>VirtualPortfolioMA.mq5</strong> .</p>

<div class="wp_codebox"><table width="100%" ><tr id="p235856"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="code" id="p2358code56"><pre class="mql5" style="font-family:monospace;"><span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #808080;">//|                                           VirtualPortfolioMA.mq5 |</span>
<span style="color: #808080;">//|                                       Copyright Bogdan Caramalac |</span>
<span style="color: #808080;">//|                                           http://mqlmagazine.com |</span>
<span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #339900;">#property copyright &quot;Copyright Bogdan Caramalac&quot;</span>
<span style="color: #339900;">#property link      &quot;http://mqlmagazine.com&quot;</span>
<span style="color: #339900;">#property version   &quot;1.00&quot;</span>
&nbsp;
<span style="color: #339900;">#define FLAT        0</span>
<span style="color: #339900;">#define LONG        1</span>
<span style="color: #339900;">#define SHORT       2</span>
&nbsp;
<span style="color: #0000ff;">input</span> <span style="color: #0000ff;">int</span> Slippage<span style="color: #000080;">=</span><span style="color: #008000;">30</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">input</span> <span style="color: #0000ff;">double</span> MarginUsagePerPosition<span style="color: #000080;">=</span><span style="color:#800080;">0.5</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">input</span> <span style="color: #0000ff;">bool</span> VolatilityFilter<span style="color: #000080;">=</span><span style="color: #333399;">false</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">input</span> <span style="color: #0000ff;">int</span> VirtualStopLoss<span style="color: #000080;">=</span><span style="color: #008000;">300</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">input</span> <span style="color: #0000ff;">int</span> VirtualTakeProfit<span style="color: #000080;">=</span><span style="color: #008000;">1000</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">input</span> <span style="color: #0000ff;">int</span> SlowMALength<span style="color: #000080;">=</span><span style="color: #008000;">14</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">input</span> <span style="color: #0000ff;">int</span> FastMALength<span style="color: #000080;">=</span><span style="color: #008000;">9</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">input</span> <span style="color: #0000ff;">int</span> EquitySlowMAPeriod<span style="color: #000080;">=</span><span style="color: #008000;">14</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">input</span> <span style="color: #0000ff;">int</span> EquityFastMAPeriod<span style="color: #000080;">=</span><span style="color: #008000;">9</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">input</span> <span style="color: #0000ff;">int</span> RealStopLoss<span style="color: #000080;">=</span><span style="color: #008000;">300</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">input</span> <span style="color: #0000ff;">int</span> RealTakeProfit<span style="color: #000080;">=</span><span style="color: #008000;">1000</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>The variables are quite the same, with the distinction that now stop loss , take profit and moving average periods are split in two : for the virtual account and for the account the system runs on.</p>

<div class="wp_codebox"><table width="100%" ><tr id="p235857"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="code" id="p2358code57"><pre class="mql5" style="font-family:monospace;"><span style="color: #339900;">#include &lt;TradeVirtualization.mqh&gt;</span>
<span style="color: #339900;">#include &lt;MovingAverages.mqh&gt;</span>
&nbsp;
<span style="color: #0000ff;">int</span> SymbolsCount<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">struct</span> IndicatorHandlersStruct
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">int</span> SlowMovingAverageHandler<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">int</span> FastMovingAverageHandler<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">int</span> BBoverSTDHandler<span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">struct</span> SymbolData
  <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">string</span> <span style="color: #8a2be2;">Symbol</span><span style="color: #008080;">;</span>
    IndicatorHandlersStruct IndicatorHandlers<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">datetime</span> LastBarTime<span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
SymbolData SymbolsTable<span style="color: #008000;">&#91;</span>30<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
&nbsp;
VirtualAccount VirtualSystem<span style="color: #008080;">;</span>    
&nbsp;
<span style="color: #0000ff;">datetime</span> VirtualLastBarTime<span style="color: #008080;">;</span>
<span style="color: #0000ff;">string</span> RealTrading<span style="color: #000080;">=</span><span style="color: #008080;">&quot;FORBIDDEN&quot;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>The structures are quite similar. The class is instanced in the VirtualSystem object. A VirtualLastBarTime is added to record the open time of the last equity bar from the virtual account. The RealTrading variable will record the trading state with respect to copying trades from the virtual account, that is, &#8220;STRAIGHT&#8221;, &#8220;REVERSED&#8221;, or &#8220;FORBIDDEN&#8221; (only &#8220;STRAIGHT&#8221; and &#8220;FORBIDDEN&#8221; are actually used).</p>
<p>The VirtualMakeIndicatorHanders() takes place of the former MakeIndicatorHandlers(). The code is the same, only the name is changed.</p>

<div class="wp_codebox"><table width="100%" ><tr id="p235858"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
</pre></td><td class="code" id="p2358code58"><pre class="mql5" style="font-family:monospace;"><span style="color: #0000ff;">void</span> VirtualPositionSetSLTP<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> asset_index,<span style="color: #0000ff;">int</span> sl,<span style="color: #0000ff;">int</span> tp<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   VirtualSystem.<span style="color: #007788;">VirtualPositionSetSL</span><span style="color: #008000;">&#40;</span>asset_index,sl<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   VirtualSystem.<span style="color: #007788;">VirtualPositionSetSL</span><span style="color: #008000;">&#40;</span>asset_index,tp<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>  
&nbsp;
<span style="color: #0000ff;">void</span> VirtualManagePosition<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> asset_index,<span style="color: #0000ff;">int</span> operation<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   MqlTradeRequest request<span style="color: #008080;">;</span>
   MqlTradeResult result<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">int</span> p<span style="color: #008080;">;</span>
   p<span style="color: #000080;">=</span>VirtualSystem.<span style="color: #007788;">VirtualGetPositionType</span><span style="color: #008000;">&#40;</span>asset_index<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">double</span> now_volume<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">double</span> current_volume,v0<span style="color: #008080;">;</span>
   current_volume<span style="color: #000080;">=</span>VirtualSystem.<span style="color: #007788;">VirtualGetPositionSize</span><span style="color: #008000;">&#40;</span>asset_index<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   v0<span style="color: #000080;">=</span>current_volume<span style="color: #008080;">;</span>   
   request.<span style="color: #007788;">action</span><span style="color: #000080;">=</span><span style="color: #333399;">TRADE_ACTION_DEAL</span><span style="color: #008080;">;</span>
   request.<span style="color: #007788;">symbol</span><span style="color: #000080;">=</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span><span style="color: #008080;">;</span> 
   request.<span style="color: #007788;">deviation</span><span style="color: #000080;">=</span>Slippage<span style="color: #008080;">;</span>
   request.<span style="color: #007788;">type_filling</span><span style="color: #000080;">=</span><span style="color: #333399;">ORDER_FILLING_AON</span><span style="color: #008080;">;</span>
   request.<span style="color: #007788;">type_time</span><span style="color: #000080;">=</span><span style="color: #333399;">ORDER_TIME_GTC</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>p<span style="color: #000080;">==</span>FLAT<span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
      request.<span style="color: #007788;">volume</span><span style="color: #000080;">=</span>UnitsToLots<span style="color: #008000;">&#40;</span> <span style="color: #008000;">&#40;</span>MarginUsagePerPosition<span style="color: #000040;">/</span>100<span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span>VirtualSystem.<span style="color: #007788;">VirtualLastAccountEquity</span><span style="color: #000040;">*</span><span style="color: #8a2be2;">AccountInfoInteger</span><span style="color: #008000;">&#40;</span><span style="color: #333399;">ACCOUNT_LEVERAGE</span><span style="color: #008000;">&#41;</span>,SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span> <span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>operation<span style="color: #000080;">==</span>LONG<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
         request.<span style="color: #007788;">type</span><span style="color: #000080;">=</span><span style="color: #333399;">ORDER_TYPE_BUY</span><span style="color: #008080;">;</span>
         request.<span style="color: #007788;">price</span><span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">SymbolInfoDouble</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_ASK</span><span style="color: #008000;">&#41;</span>,<span style="color: #8a2be2;">SymbolInfoInteger</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_DIGITS</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>operation<span style="color: #000080;">==</span>SHORT<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
         request.<span style="color: #007788;">type</span><span style="color: #000080;">=</span><span style="color: #333399;">ORDER_TYPE_SELL</span><span style="color: #008080;">;</span>
         request.<span style="color: #007788;">price</span><span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">SymbolInfoDouble</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_BID</span><span style="color: #008000;">&#41;</span>,<span style="color: #8a2be2;">SymbolInfoInteger</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_DIGITS</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
     <span style="color: #008000;">&#125;</span>
   else<span style="color: #808080;">//if (p==FLAT)</span>
     <span style="color: #008000;">&#123;</span>      
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>p<span style="color: #000080;">==</span>LONG<span style="color: #000040;">&amp;&amp;</span>operation<span style="color: #000080;">==</span>SHORT<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
         request.<span style="color: #007788;">volume</span><span style="color: #000080;">=</span>current_volume<span style="color: #000040;">+</span>UnitsToLots<span style="color: #008000;">&#40;</span> <span style="color: #008000;">&#40;</span>MarginUsagePerPosition<span style="color: #000040;">/</span>100<span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span>VirtualSystem.<span style="color: #007788;">VirtualLastAccountEquity</span><span style="color: #000040;">*</span><span style="color: #8a2be2;">AccountInfoInteger</span><span style="color: #008000;">&#40;</span><span style="color: #333399;">ACCOUNT_LEVERAGE</span><span style="color: #008000;">&#41;</span>,SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span> <span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
         request.<span style="color: #007788;">type</span><span style="color: #000080;">=</span><span style="color: #333399;">ORDER_TYPE_SELL</span><span style="color: #008080;">;</span>         
         request.<span style="color: #007788;">price</span><span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">SymbolInfoDouble</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_BID</span><span style="color: #008000;">&#41;</span>,<span style="color: #8a2be2;">SymbolInfoInteger</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_DIGITS</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>         
        <span style="color: #008000;">&#125;</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>p<span style="color: #000080;">==</span>SHORT<span style="color: #000040;">&amp;&amp;</span>operation<span style="color: #000080;">==</span>LONG<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
         request.<span style="color: #007788;">volume</span><span style="color: #000080;">=</span>current_volume<span style="color: #000040;">+</span>UnitsToLots<span style="color: #008000;">&#40;</span> <span style="color: #008000;">&#40;</span>MarginUsagePerPosition<span style="color: #000040;">/</span>100<span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span>VirtualSystem.<span style="color: #007788;">VirtualLastAccountEquity</span><span style="color: #000040;">*</span><span style="color: #8a2be2;">AccountInfoInteger</span><span style="color: #008000;">&#40;</span><span style="color: #333399;">ACCOUNT_LEVERAGE</span><span style="color: #008000;">&#41;</span>,SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span> <span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
         request.<span style="color: #007788;">type</span><span style="color: #000080;">=</span><span style="color: #333399;">ORDER_TYPE_BUY</span><span style="color: #008080;">;</span>
         request.<span style="color: #007788;">price</span><span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">SymbolInfoDouble</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_ASK</span><span style="color: #008000;">&#41;</span>,<span style="color: #8a2be2;">SymbolInfoInteger</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_DIGITS</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>p<span style="color: #000080;">==</span>LONG<span style="color: #000040;">&amp;&amp;</span>operation<span style="color: #000080;">==</span>FLAT<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
         request.<span style="color: #007788;">volume</span><span style="color: #000080;">=</span>current_volume<span style="color: #008080;">;</span>
         request.<span style="color: #007788;">type</span><span style="color: #000080;">=</span><span style="color: #333399;">ORDER_TYPE_SELL</span><span style="color: #008080;">;</span>         
         request.<span style="color: #007788;">price</span><span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">SymbolInfoDouble</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_BID</span><span style="color: #008000;">&#41;</span>,<span style="color: #8a2be2;">SymbolInfoInteger</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_DIGITS</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>         
        <span style="color: #008000;">&#125;</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>p<span style="color: #000080;">==</span>SHORT<span style="color: #000040;">&amp;&amp;</span>operation<span style="color: #000080;">==</span>FLAT<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
         request.<span style="color: #007788;">volume</span><span style="color: #000080;">=</span>current_volume<span style="color: #008080;">;</span>
         request.<span style="color: #007788;">type</span><span style="color: #000080;">=</span><span style="color: #333399;">ORDER_TYPE_BUY</span><span style="color: #008080;">;</span>         
         request.<span style="color: #007788;">price</span><span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">SymbolInfoDouble</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_ASK</span><span style="color: #008000;">&#41;</span>,<span style="color: #8a2be2;">SymbolInfoInteger</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_DIGITS</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>         
        <span style="color: #008000;">&#125;</span> 
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>p<span style="color: #000080;">==</span>LONG<span style="color: #000040;">&amp;&amp;</span>operation<span style="color: #000080;">==</span>LONG<span style="color: #008000;">&#41;</span><span style="color: #808080;">//adjustment of the present LONG position</span>
        <span style="color: #008000;">&#123;</span>
         request.<span style="color: #007788;">volume</span><span style="color: #000080;">=</span>UnitsToLots<span style="color: #008000;">&#40;</span> <span style="color: #008000;">&#40;</span>MarginUsagePerPosition<span style="color: #000040;">/</span>100<span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span>VirtualSystem.<span style="color: #007788;">VirtualLastAccountEquity</span><span style="color: #000040;">*</span><span style="color: #8a2be2;">AccountInfoInteger</span><span style="color: #008000;">&#40;</span><span style="color: #333399;">ACCOUNT_LEVERAGE</span><span style="color: #008000;">&#41;</span>,SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span> <span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span>current_volume<span style="color: #008080;">;</span>
         <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span>request.<span style="color: #007788;">volume</span>,2<span style="color: #008000;">&#41;</span><span style="color: #000080;">&gt;</span>0.00<span style="color: #008000;">&#41;</span>
           <span style="color: #008000;">&#123;</span>         
            request.<span style="color: #007788;">type</span><span style="color: #000080;">=</span><span style="color: #333399;">ORDER_TYPE_BUY</span><span style="color: #008080;">;</span>
            request.<span style="color: #007788;">price</span><span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">SymbolInfoDouble</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_ASK</span><span style="color: #008000;">&#41;</span>,<span style="color: #8a2be2;">SymbolInfoInteger</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_DIGITS</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
           <span style="color: #008000;">&#125;</span>
         else <span style="color: #808080;">//we close the difference</span>
           <span style="color: #008000;">&#123;</span>
            request.<span style="color: #007788;">volume</span><span style="color: #000080;">=</span><span style="color: #8a2be2;">MathAbs</span><span style="color: #008000;">&#40;</span>request.<span style="color: #007788;">volume</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            request.<span style="color: #007788;">type</span><span style="color: #000080;">=</span><span style="color: #333399;">ORDER_TYPE_SELL</span><span style="color: #008080;">;</span>         
            request.<span style="color: #007788;">price</span><span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">SymbolInfoDouble</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_BID</span><span style="color: #008000;">&#41;</span>,<span style="color: #8a2be2;">SymbolInfoInteger</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_DIGITS</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>         
           <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>        
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>p<span style="color: #000080;">==</span>SHORT<span style="color: #000040;">&amp;&amp;</span>operation<span style="color: #000080;">==</span>SHORT<span style="color: #008000;">&#41;</span><span style="color: #808080;">//adjustment of the present SHORT position</span>
        <span style="color: #008000;">&#123;</span>
         request.<span style="color: #007788;">volume</span><span style="color: #000080;">=</span>UnitsToLots<span style="color: #008000;">&#40;</span> <span style="color: #008000;">&#40;</span>MarginUsagePerPosition<span style="color: #000040;">/</span>100<span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span>VirtualSystem.<span style="color: #007788;">VirtualLastAccountEquity</span><span style="color: #000040;">*</span><span style="color: #8a2be2;">AccountInfoInteger</span><span style="color: #008000;">&#40;</span><span style="color: #333399;">ACCOUNT_LEVERAGE</span><span style="color: #008000;">&#41;</span>,SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span> <span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span>current_volume<span style="color: #008080;">;</span>
         <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span>request.<span style="color: #007788;">volume</span>,2<span style="color: #008000;">&#41;</span><span style="color: #000080;">&gt;</span>0.00<span style="color: #008000;">&#41;</span>
           <span style="color: #008000;">&#123;</span>
            request.<span style="color: #007788;">type</span><span style="color: #000080;">=</span><span style="color: #333399;">ORDER_TYPE_SELL</span><span style="color: #008080;">;</span>         
            request.<span style="color: #007788;">price</span><span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">SymbolInfoDouble</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_BID</span><span style="color: #008000;">&#41;</span>,<span style="color: #8a2be2;">SymbolInfoInteger</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_DIGITS</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>                  
           <span style="color: #008000;">&#125;</span>
         else
           <span style="color: #008000;">&#123;</span>
            request.<span style="color: #007788;">volume</span><span style="color: #000080;">=</span><span style="color: #8a2be2;">MathAbs</span><span style="color: #008000;">&#40;</span>request.<span style="color: #007788;">volume</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            request.<span style="color: #007788;">type</span><span style="color: #000080;">=</span><span style="color: #333399;">ORDER_TYPE_BUY</span><span style="color: #008080;">;</span>
            request.<span style="color: #007788;">price</span><span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">SymbolInfoDouble</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_ASK</span><span style="color: #008000;">&#41;</span>,<span style="color: #8a2be2;">SymbolInfoInteger</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_DIGITS</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>            
           <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>        
     <span style="color: #008000;">&#125;</span><span style="color: #808080;">//if (p==FLAT)</span>
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>request.<span style="color: #007788;">volume</span><span style="color: #000080;">&gt;</span>0.00<span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>       
      VirtualSystem.<span style="color: #007788;">VirtualChangePosition</span><span style="color: #008000;">&#40;</span>asset_index,request.<span style="color: #007788;">type</span>,request.<span style="color: #007788;">price</span>,request.<span style="color: #007788;">volume</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      VirtualPositionSetSLTP<span style="color: #008000;">&#40;</span>asset_index,VirtualStopLoss,VirtualTakeProfit<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>      
     <span style="color: #008000;">&#125;</span>
   <span style="color: #808080;">//deciding to replicate , stay out or reverse signals on real portfolio</span>
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>RealTrading<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #008080;">&quot;FORBIDDEN&quot;</span><span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>RealTrading<span style="color: #000080;">==</span><span style="color: #008080;">&quot;STRAIGHT&quot;</span><span style="color: #008000;">&#41;</span>
        ManagePosition<span style="color: #008000;">&#40;</span>asset_index,operation<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      else
        <span style="color: #008000;">&#123;</span>
         <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>operation<span style="color: #000080;">==</span>LONG<span style="color: #008000;">&#41;</span>
           ManagePosition<span style="color: #008000;">&#40;</span>asset_index,SHORT<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
         <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>operation<span style="color: #000080;">==</span>SHORT<span style="color: #008000;">&#41;</span>
           ManagePosition<span style="color: #008000;">&#40;</span>asset_index,LONG<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
         <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>operation<span style="color: #000080;">==</span>FLAT<span style="color: #008000;">&#41;</span>
           ManagePosition<span style="color: #008000;">&#40;</span>asset_index,FLAT<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
     <span style="color: #008000;">&#125;</span>
   <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>     
  <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>This is the VirtualManagePosition(). It operates like ManagePosition() however its requests are directed towards the virtual account. At the end, after analysing the RealTrading variable, it decides whether to do nothing, to copy or to reverse virtual operations on the actual trading account.</p>
<p>The MASignal(), PositionSetSLTP(), and ManagePosition() remain the same as in the original expert.</p>

<div class="wp_codebox"><table width="100%" ><tr id="p235859"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
</pre></td><td class="code" id="p2358code59"><pre class="mql5" style="font-family:monospace;"><span style="color: #0000ff;">void</span> VirtualTradeLogics<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> asset_index<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">string</span> s<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">double</span> stddev<span style="color: #008000;">&#91;</span>1<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">double</span> bbhi<span style="color: #008000;">&#91;</span>1<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">double</span> bblo<span style="color: #008000;">&#91;</span>1<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">int</span> copycount<span style="color: #008080;">;</span>
   s<span style="color: #000080;">=</span>MASignal<span style="color: #008000;">&#40;</span>asset_index<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>    
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>VolatilityFilter<span style="color: #000080;">==</span><span style="color: #333399;">true</span><span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
      copycount<span style="color: #000080;">=</span><span style="color: #8a2be2;">CopyBuffer</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">IndicatorHandlers</span>.<span style="color: #007788;">BBoverSTDHandler</span>,0,0,1,stddev<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      copycount<span style="color: #000080;">=</span><span style="color: #8a2be2;">CopyBuffer</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>asset_index<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">IndicatorHandlers</span>.<span style="color: #007788;">BBoverSTDHandler</span>,2,0,1,bbhi<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
     <span style="color: #008000;">&#125;</span>
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>VirtualSystem.<span style="color: #007788;">VirtualGetPositionType</span><span style="color: #008000;">&#40;</span>asset_index<span style="color: #008000;">&#41;</span><span style="color: #000080;">==</span>FLAT<span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>      
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>s<span style="color: #000080;">==</span><span style="color: #008080;">&quot;L&quot;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
         <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>VolatilityFilter<span style="color: #000080;">==</span><span style="color: #333399;">true</span><span style="color: #008000;">&#41;</span>
           <span style="color: #008000;">&#123;</span>
            <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>stddev<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span><span style="color: #000080;">&gt;</span>bbhi<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
              VirtualManagePosition<span style="color: #008000;">&#40;</span>asset_index,LONG<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
           <span style="color: #008000;">&#125;</span>
         else
           VirtualManagePosition<span style="color: #008000;">&#40;</span>asset_index,LONG<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>s<span style="color: #000080;">==</span><span style="color: #008080;">&quot;S&quot;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
         <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>VolatilityFilter<span style="color: #000080;">==</span><span style="color: #333399;">true</span><span style="color: #008000;">&#41;</span>
           <span style="color: #008000;">&#123;</span>
            <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>stddev<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span><span style="color: #000080;">&gt;</span>bbhi<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
              VirtualManagePosition<span style="color: #008000;">&#40;</span>asset_index,SHORT<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
           <span style="color: #008000;">&#125;</span>
         else
           VirtualManagePosition<span style="color: #008000;">&#40;</span>asset_index,SHORT<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
     <span style="color: #008000;">&#125;</span><span style="color: #808080;">//else if (GetPositionType(asset_index)==FLAT)</span>
   else<span style="color: #808080;">//position is not flat</span>
     <span style="color: #008000;">&#123;</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>VirtualSystem.<span style="color: #007788;">VirtualGetPositionType</span><span style="color: #008000;">&#40;</span>asset_index<span style="color: #008000;">&#41;</span><span style="color: #000080;">==</span>LONG<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>        
         <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>VolatilityFilter<span style="color: #000080;">==</span><span style="color: #333399;">true</span><span style="color: #008000;">&#41;</span>
           <span style="color: #008000;">&#123;</span>
            <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>s<span style="color: #000080;">==</span><span style="color: #008080;">&quot;S&quot;</span><span style="color: #000040;">||</span>stddev<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span><span style="color: #000080;">&lt;</span>bbhi<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
              VirtualManagePosition<span style="color: #008000;">&#40;</span>asset_index,FLAT<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
           <span style="color: #008000;">&#125;</span>           
         else
           <span style="color: #008000;">&#123;</span>            
            <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>s<span style="color: #000080;">==</span><span style="color: #008080;">&quot;S&quot;</span><span style="color: #008000;">&#41;</span>
              <span style="color: #008000;">&#123;</span>               
               VirtualManagePosition<span style="color: #008000;">&#40;</span>asset_index,FLAT<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>           
              <span style="color: #008000;">&#125;</span>
           <span style="color: #008000;">&#125;</span><span style="color: #808080;">//if (VolatilityFilter==true)</span>
        <span style="color: #008000;">&#125;</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>VirtualSystem.<span style="color: #007788;">VirtualGetPositionType</span><span style="color: #008000;">&#40;</span>asset_index<span style="color: #008000;">&#41;</span><span style="color: #000080;">==</span>SHORT<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>         
         <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>VolatilityFilter<span style="color: #000080;">==</span><span style="color: #333399;">true</span><span style="color: #008000;">&#41;</span>
           <span style="color: #008000;">&#123;</span>
            <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>s<span style="color: #000080;">==</span><span style="color: #008080;">&quot;L&quot;</span><span style="color: #000040;">||</span>stddev<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span><span style="color: #000080;">&lt;</span>bbhi<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
              VirtualManagePosition<span style="color: #008000;">&#40;</span>asset_index,FLAT<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
           <span style="color: #008000;">&#125;</span>
         else
           <span style="color: #008000;">&#123;</span>            
            <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>s<span style="color: #000080;">==</span><span style="color: #008080;">&quot;L&quot;</span><span style="color: #008000;">&#41;</span>
              <span style="color: #008000;">&#123;</span>               
               VirtualManagePosition<span style="color: #008000;">&#40;</span>asset_index,FLAT<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>           
              <span style="color: #008000;">&#125;</span>
           <span style="color: #008000;">&#125;</span><span style="color: #808080;">//if (VolatilityFilter==true)        </span>
        <span style="color: #008000;">&#125;</span><span style="color: #808080;">//if (VirtualSystem.VirtualGetPositionType(asset_index)==SHORT)</span>
     <span style="color: #008000;">&#125;</span>           
   <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>This is the former TradeLogics() , but modified in order to operate on the virtual account.</p>

<div class="wp_codebox"><table width="100%" ><tr id="p235860"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
</pre></td><td class="code" id="p2358code60"><pre class="mql5" style="font-family:monospace;"><span style="color: #0000ff;">int</span> PeriodToMinutes<span style="color: #008000;">&#40;</span><span style="color: #333399;">ENUM_TIMEFRAMES</span> p<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">switch</span><span style="color: #008000;">&#40;</span>p<span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
      <span style="color: #0000ff;">case</span> <span style="color: #333399;">PERIOD_M1</span><span style="color: #008080;">:</span><span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>1<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">case</span> <span style="color: #333399;">PERIOD_M2</span><span style="color: #008080;">:</span><span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>2<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">case</span> <span style="color: #333399;">PERIOD_M3</span><span style="color: #008080;">:</span><span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>3<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">case</span> <span style="color: #333399;">PERIOD_M4</span><span style="color: #008080;">:</span><span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>4<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">case</span> <span style="color: #333399;">PERIOD_M5</span><span style="color: #008080;">:</span><span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>5<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">case</span> <span style="color: #333399;">PERIOD_M6</span><span style="color: #008080;">:</span><span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>6<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">case</span> <span style="color: #333399;">PERIOD_M10</span><span style="color: #008080;">:</span><span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>10<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">case</span> <span style="color: #333399;">PERIOD_M12</span><span style="color: #008080;">:</span><span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>12<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">case</span> <span style="color: #333399;">PERIOD_M15</span><span style="color: #008080;">:</span><span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>15<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">case</span> <span style="color: #333399;">PERIOD_M20</span><span style="color: #008080;">:</span><span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>20<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">case</span> <span style="color: #333399;">PERIOD_M30</span><span style="color: #008080;">:</span><span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>30<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">case</span> <span style="color: #333399;">PERIOD_H1</span><span style="color: #008080;">:</span><span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>60<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">case</span> <span style="color: #333399;">PERIOD_H2</span><span style="color: #008080;">:</span><span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>60<span style="color: #000040;">*</span>2<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">case</span> <span style="color: #333399;">PERIOD_H3</span><span style="color: #008080;">:</span><span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>60<span style="color: #000040;">*</span>3<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">case</span> <span style="color: #333399;">PERIOD_H4</span><span style="color: #008080;">:</span><span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>60<span style="color: #000040;">*</span>4<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">case</span> <span style="color: #333399;">PERIOD_H6</span><span style="color: #008080;">:</span><span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>60<span style="color: #000040;">*</span>6<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">case</span> <span style="color: #333399;">PERIOD_H8</span><span style="color: #008080;">:</span><span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>60<span style="color: #000040;">*</span>8<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">case</span> <span style="color: #333399;">PERIOD_H12</span><span style="color: #008080;">:</span><span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>60<span style="color: #000040;">*</span>12<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">case</span> <span style="color: #333399;">PERIOD_D1</span><span style="color: #008080;">:</span><span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>60<span style="color: #000040;">*</span>24<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">case</span> <span style="color: #333399;">PERIOD_W1</span><span style="color: #008080;">:</span><span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>60<span style="color: #000040;">*</span>24<span style="color: #000040;">*</span>7<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">case</span> <span style="color: #333399;">PERIOD_MN1</span><span style="color: #008080;">:</span><span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>60<span style="color: #000040;">*</span>24<span style="color: #000040;">*</span>30<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      default<span style="color: #008080;">:</span> <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
     <span style="color: #008000;">&#125;</span>
  <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>This function is used in OnInit() to setup the virtual account&#8217;s bar timespan , and it converts periods into minutes.</p>

<div class="wp_codebox"><table width="100%" ><tr id="p235861"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code" id="p2358code61"><pre class="mql5" style="font-family:monospace;"><span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #808080;">//| Expert initialization function                                   |</span>
<span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #0000ff;">int</span> OnInit<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   SymbolsTable<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span><span style="color: #000080;">=</span><span style="color: #008080;">&quot;EURUSD&quot;</span><span style="color: #008080;">;</span>
   SymbolsTable<span style="color: #008000;">&#91;</span>1<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span><span style="color: #000080;">=</span><span style="color: #008080;">&quot;USDJPY&quot;</span><span style="color: #008080;">;</span>
   SymbolsTable<span style="color: #008000;">&#91;</span>2<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span><span style="color: #000080;">=</span><span style="color: #008080;">&quot;GBPUSD&quot;</span><span style="color: #008080;">;</span>
   SymbolsTable<span style="color: #008000;">&#91;</span>3<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span><span style="color: #000080;">=</span><span style="color: #008080;">&quot;USDCHF&quot;</span><span style="color: #008080;">;</span>
   SymbolsCount<span style="color: #000080;">=</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>
&nbsp;
   VirtualSystem.<span style="color: #007788;">VirtualAccountSet</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">AccountInfoDouble</span><span style="color: #008000;">&#40;</span><span style="color: #333399;">ACCOUNT_EQUITY</span><span style="color: #008000;">&#41;</span>,PeriodToMinutes<span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">Period</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span>60<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>  
   VirtualSystem.<span style="color: #007788;">VirtualSymbolsCount</span><span style="color: #000080;">=</span>SymbolsCount<span style="color: #008080;">;</span>      
   <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;</span>SymbolsCount<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
      VirtualSystem.<span style="color: #007788;">VirtualSymbolsTable</span><span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span><span style="color: #000080;">=</span>SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span><span style="color: #008080;">;</span>
   VirtualMakeIndicatorHandlers<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   VirtualLastBarTime<span style="color: #000080;">=</span>VirtualSystem.<span style="color: #007788;">VirtualEquity</span><span style="color: #008000;">&#91;</span>VirtualSystem.<span style="color: #007788;">VirtualLastEquityPos</span><span style="color: #008000;">&#93;</span>.<span style="color: #007788;">opentime</span><span style="color: #008080;">;</span>
   RealTrading<span style="color: #000080;">=</span><span style="color: #008080;">&quot;FORBIDDEN&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>This is OnInit(). It prepares symbols like former OnInit() then copies symbols to the virtual account. Sets up virtual account and makes sure RealTrading is set to &#8220;FORBIDDEN&#8221;.</p>

<div class="wp_codebox"><table width="100%" ><tr id="p235862"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
</pre></td><td class="code" id="p2358code62"><pre class="mql5" style="font-family:monospace;"><span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #808080;">//| Expert tick function                                             |</span>
<span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #0000ff;">void</span> OnTick<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>   
   <span style="color: #0000ff;">double</span> loweq<span style="color: #008080;">;</span>         
   <span style="color: #0000ff;">double</span> fast_ma_now,slow_ma_now,fast_ma_old,slow_ma_old<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">double</span> EquityCloseBuffer<span style="color: #008000;">&#91;</span>31<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">datetime</span> datetime_array<span style="color: #008000;">&#91;</span>1<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>   
   <span style="color: #808080;">//marking to market virtual positions</span>
   VirtualSystem.<span style="color: #007788;">VirtualMarkToMarket</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span>1<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #808080;">//looping symbols to apply logics</span>
   <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;</span>SymbolsCount<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
      <span style="color: #008000;">&#123;</span>
       <span style="color: #8a2be2;">CopyTime</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #8a2be2;">Period</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>,0,1,datetime_array<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
       <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>datetime_array<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span>SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">LastBarTime</span><span style="color: #008000;">&#41;</span>
         <span style="color: #008000;">&#123;</span>                  
          VirtualTradeLogics<span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
          SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">LastBarTime</span><span style="color: #000080;">=</span>datetime_array<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
         <span style="color: #008000;">&#125;</span><span style="color: #808080;">//if (datetime_array[0]!=LastBarOccurred[i])</span>
      <span style="color: #008000;">&#125;</span><span style="color: #808080;">//for (int i=0;i&lt;SymbolsCount;i++)   </span>
&nbsp;
   <span style="color: #808080;">//now we check if we have enough equity bars ; if true, we analyse to see whether we activate or not live trading</span>
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>VirtualSystem.<span style="color: #007788;">VirtualEquity</span><span style="color: #008000;">&#91;</span>VirtualSystem.<span style="color: #007788;">VirtualLastEquityPos</span><span style="color: #008000;">&#93;</span>.<span style="color: #007788;">opentime</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span>VirtualLastBarTime<span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>VirtualSystem.<span style="color: #007788;">VirtualLastEquityPos</span><span style="color: #000080;">&gt;</span><span style="color: #8a2be2;">ArrayRange</span><span style="color: #008000;">&#40;</span>EquityCloseBuffer,0<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>  
        <span style="color: #008000;">&#123;</span>
         <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span><span style="color: #8a2be2;">ArrayRange</span><span style="color: #008000;">&#40;</span>EquityCloseBuffer,0<span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>         
             EquityCloseBuffer<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #8a2be2;">StringToDouble</span><span style="color: #008000;">&#40;</span> <span style="color: #8a2be2;">DoubleToString</span><span style="color: #008000;">&#40;</span>VirtualSystem.<span style="color: #007788;">VirtualEquity</span><span style="color: #008000;">&#91;</span>VirtualSystem.<span style="color: #007788;">VirtualLastEquityPos</span><span style="color: #000040;">-</span><span style="color: #8a2be2;">ArrayRange</span><span style="color: #008000;">&#40;</span>EquityCloseBuffer,0<span style="color: #008000;">&#41;</span><span style="color: #000040;">+</span>1<span style="color: #000040;">+</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">close</span>,2<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>             
             loweq<span style="color: #000080;">=</span><span style="color: #8a2be2;">StringToDouble</span><span style="color: #008000;">&#40;</span> <span style="color: #8a2be2;">DoubleToString</span><span style="color: #008000;">&#40;</span>VirtualSystem.<span style="color: #007788;">VirtualEquity</span><span style="color: #008000;">&#91;</span>VirtualSystem.<span style="color: #007788;">VirtualLastEquityPos</span><span style="color: #000040;">-</span><span style="color: #8a2be2;">ArrayRange</span><span style="color: #008000;">&#40;</span>EquityCloseBuffer,0<span style="color: #008000;">&#41;</span><span style="color: #000040;">+</span>1<span style="color: #000040;">+</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">low</span>,2<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>                
            <span style="color: #008000;">&#125;</span>                                    
        <span style="color: #008000;">&#125;</span>
      fast_ma_now<span style="color: #000080;">=</span>SimpleMA<span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">ArrayRange</span><span style="color: #008000;">&#40;</span>EquityCloseBuffer,0<span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span>1,EquityFastMAPeriod,EquityCloseBuffer<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      slow_ma_now<span style="color: #000080;">=</span>SimpleMA<span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">ArrayRange</span><span style="color: #008000;">&#40;</span>EquityCloseBuffer,0<span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span>1,EquitySlowMAPeriod,EquityCloseBuffer<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      fast_ma_old<span style="color: #000080;">=</span>SimpleMA<span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">ArrayRange</span><span style="color: #008000;">&#40;</span>EquityCloseBuffer,0<span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span>2,EquityFastMAPeriod,EquityCloseBuffer<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      slow_ma_old<span style="color: #000080;">=</span>SimpleMA<span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">ArrayRange</span><span style="color: #008000;">&#40;</span>EquityCloseBuffer,0<span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span>2,EquitySlowMAPeriod,EquityCloseBuffer<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #808080;">//bullish ma cross on virtual system's equity line      </span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>fast_ma_now<span style="color: #000080;">&gt;</span>slow_ma_now<span style="color: #000040;">&amp;&amp;</span>fast_ma_old<span style="color: #000080;">&lt;</span>slow_ma_old<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>          
         RealTrading<span style="color: #000080;">=</span><span style="color: #008080;">&quot;STRAIGHT&quot;</span><span style="color: #008080;">;</span>
         <span style="color: #808080;">//replicating virtual portfolio into real</span>
         <span style="color: #808080;">//position sizes are calculated to be proportional with the real account equity</span>
         <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;</span>SymbolsCount<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
            ManagePosition<span style="color: #008000;">&#40;</span>i,VirtualSystem.<span style="color: #007788;">VirtualGetPositionType</span><span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span>, 
                    UnitsToLots<span style="color: #008000;">&#40;</span>
                     <span style="color: #008000;">&#40;</span>VirtualSystem.<span style="color: #007788;">VirtualGetPositionSize</span><span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span>
                      <span style="color: #8a2be2;">AccountInfoDouble</span><span style="color: #008000;">&#40;</span><span style="color: #333399;">ACCOUNT_EQUITY</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">/</span>
                      VirtualSystem.<span style="color: #007788;">VirtualLastAccountEquity</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span>
                      <span style="color: #8a2be2;">SymbolInfoDouble</span><span style="color: #008000;">&#40;</span>SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span>,<span style="color: #333399;">SYMBOL_TRADE_CONTRACT_SIZE</span><span style="color: #008000;">&#41;</span>
                      ,SymbolsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #8a2be2;">Symbol</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
      <span style="color: #808080;">//bearish ma cross on virtual system's equity line        </span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>fast_ma_now<span style="color: #000080;">&lt;</span>slow_ma_now<span style="color: #000040;">&amp;&amp;</span>fast_ma_old<span style="color: #000080;">&gt;</span>slow_ma_old<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
         RealTrading<span style="color: #000080;">=</span><span style="color: #008080;">&quot;FORBIDDEN&quot;</span><span style="color: #008080;">;</span>
         <span style="color: #808080;">//closing real positions</span>
         <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;</span>SymbolsCount<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
            ManagePosition<span style="color: #008000;">&#40;</span>i,FLAT<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>         
        <span style="color: #008000;">&#125;</span>             
      VirtualLastBarTime<span style="color: #000080;">=</span>VirtualSystem.<span style="color: #007788;">VirtualEquity</span><span style="color: #008000;">&#91;</span>VirtualSystem.<span style="color: #007788;">VirtualLastEquityPos</span><span style="color: #008000;">&#93;</span>.<span style="color: #007788;">opentime</span><span style="color: #008080;">;</span>
     <span style="color: #008000;">&#125;</span>
   <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>This is the OnTick(). Like former OnTick(), it has a symbol loop and applies the logics for each symbol, on the virtual account this time. It declares the EquityCloseBuffer[] where last values of virtual acount equity bars are copied, after each loop is finished. When this buffer contains enough values, a moving average cross on the virtual account equity line is calculated. When these moving average yield a bullish signal, RealTrading is set to &#8220;STRAIGHT&#8221;. Portfolio is being replicated from the virtual account on the actual account, proportional to the size of actual account. Of course, the VirtualManagePosition() will have subsequent calls to ManagePosition() and from this time on both accounts will work in the same time. When the moving average cross becomes bearish, RealTrading is set to &#8220;FORBIDDEN&#8221; and actual account positions are closed.</p>
<p>The OnDeinit() is exactly the same, as the indicator handlers are residing in the same SymbolsTable[].</p>
<p><a href="http://mqlmagazine.com/mql-programming/trading-systems-virtualization-to-achieve-equity-line-fitting-a-myth/attachment/virtualportfolioma-runs/" rel="attachment wp-att-2404"><img src="http://mqlmagazine.com/wp-content/uploads/2010/05/VirtualPortfolioMA-runs.jpg" alt="" title="VirtualPortfolioMA runs" width="945" height="660" class="alignnone size-full wp-image-2404" /></a></p>
<p>Surprised? The portfolio run is more unstable than one pair run, as it was for the main trading system. The extra volatility translated into range movements on the equity line, which in turn translated into false positive signals given by moving averages on the equity line, making the virtualization to be a fiasco. There are at least three points to consider:</p>
<p>1. Sampling frequency<br />
What is the optimal sampling frequency for the equity moving average? After all, we don&#8217;t know exactly how MetaTrader compresses equity data on bars so we don&#8217;t know its own sampling interval. Then, how to sample for the average ?</p>
<p>2. Optimal trading system for the equity line<br />
Nobody said that moving averages over equity are the best way to fit. Other criterias may apply, same as in regular trading.</p>
<p>3. Should you trade all the instruments in the same virtual account, or trade in separate virtual accounts and fit each one&#8217;s equity ?</p>
<p>The main conclusion that yields is that trading systems are not to be based on cold, pure application of indicators. Indicators, as their name says, are <strong>indicating</strong> some of the actions that have to be taken, as counselors that give advices, influencing positively the results of trading systems, but their place is not at the core of trading systems. Rather, <strong>sound statistics and arbitrage relationships are at the base of effective trading systems</strong>.</p>
<p>File links:<br />
<a title="TradeVirtualization.mqh" href="http://mqlmagazine.com/wp-content/uploads/editions/may2010/TradeVirtualization.mqh" target="_top">TradeVirtualization.mqh</a><br />
<a title="VirtualPortfolioMA.mq5" href="http://mqlmagazine.com/wp-content/uploads/editions/may2010/VirtualPortfolioMA.mq5" target="_top">VirtualPortfolioMA.mq5</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mqlmagazine.com/mql-programming/trading-systems-virtualization-to-achieve-equity-line-fitting-a-myth/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>MQL5 : Implementation of a simple CEP engine</title>
		<link>http://mqlmagazine.com/mql-programming/mql5-implementation-of-a-simple-cep-engine/</link>
		<comments>http://mqlmagazine.com/mql-programming/mql5-implementation-of-a-simple-cep-engine/#comments</comments>
		<pubDate>Mon, 24 May 2010 21:28:51 +0000</pubDate>
		<dc:creator>Bogdan Caramalac, MQLmagazine sr.editor</dc:creator>
				<category><![CDATA[MQL programming]]></category>
		<category><![CDATA[cep]]></category>
		<category><![CDATA[complex]]></category>
		<category><![CDATA[events]]></category>
		<category><![CDATA[mql5]]></category>
		<category><![CDATA[processing]]></category>

		<guid isPermaLink="false">http://mqlmagazine.com/?p=1988</guid>
		<description><![CDATA[[Versiunea romaneasca] [MQLmagazine.com in romana] [English edition]
This edition was harder to make than any of the previous editions. The late release of Strategy Tester and the large number of bugs that surged while making the CEP engine took a lot of time. From this moment, magazine issues will not be monthly anymore, because they will [...]]]></description>
			<content:encoded><![CDATA[<p><a title="[Versiunea romaneasca]" href="http://mqlmagazine.com/ro/programarea-in-mql/mql5-implementarea-unui-motor-cep-simplu" target="_top">[Versiunea romaneasca]</a> <a title="[MQLmagazine.com in romana]" href="http://mqlmagazine.com/ro" target="_top">[MQLmagazine.com in romana]</a> <a title="[English edition]" href="http://mqlmagazine.com" target="_top">[English edition]</a></p>
<p>This edition was harder to make than any of the previous editions. The late release of Strategy Tester and the large number of bugs that surged while making the CEP engine took a lot of time. From this moment, magazine issues will not be monthly anymore, because they will contain a lot of work and updates of past works. This is why, this time we are adding the <a href="http://forum.mqlmagazine.com/" target="_top">Forum</a> to the Magazine.</p>
<p>Now back to the CEP engine. </p>
<p>The CEP engine was some of the hardest stuff possible to write in MQL5. It was hard not only for me as programmer, but it had implications over MT5 as well, because the spaghetti data structure that it uses put MetaTrader to the test ; it needed a lot of bug filtering, especially on objects and memory allocations. The code managed to run with minor issues barely on build 270 (<strong>yes, already in May</strong>), and completely clean on build 271. It&#8217;s a long hard code, and I&#8217;ll chop it to pieces for commenting. I also left inline comments and Print lines intact to be better understood by readers. The algorithm is quite modified, not the same as the one presented in <a title="Anatomy of a Simple CEP Engine" href="http://mqlmagazine.com/financial-modelling/anatomy-of-a-simple-cep-engine/" target="_top">Anatomy of a Simple CEP Engine</a> .</p>
<p>The following file it&#8217;s gonna be called <strong>CEPEngine.mqh</strong> :</p>

<div class="wp_codebox"><table width="100%" ><tr id="p198878"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
</pre></td><td class="code" id="p1988code78"><pre class="mql5" style="font-family:monospace;"><span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #808080;">//|                                                    CEPEngine.mqh |</span>
<span style="color: #808080;">//|                                       Copyright Bogdan Caramalac |</span>
<span style="color: #808080;">//|                                           http://mqlmagazine.com |</span>
<span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #339900;">#property copyright &quot;Bogdan Caramalac&quot;</span>
<span style="color: #339900;">#property link      &quot;http://mqlmagazine.com&quot;</span>
&nbsp;
<span style="color: #339900;">#property version &quot;1.0&quot;;</span>
&nbsp;
<span style="color: #808080;">//*******************************************</span>
&nbsp;
<span style="color: #0000ff;">string</span> Replicate<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">string</span> s,<span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span>
   <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">string</span> res<span style="color: #000080;">=</span><span style="color: #008080;">&quot;&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">int</span> k<span style="color: #000080;">=</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>n<span style="color: #000080;">&lt;</span>1<span style="color: #008000;">&#41;</span>
      <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>res<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>                    
   <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>k<span style="color: #000080;">=</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>k<span style="color: #000080;">&lt;=</span>n<span style="color: #008080;">;</span>k<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> 
       <span style="color: #008000;">&#123;</span>
        <span style="color: #8a2be2;">StringConcatenate</span><span style="color: #008000;">&#40;</span>res,res,s<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
       <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>res<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #008000;">&#125;</span>          
&nbsp;
<span style="color: #0000ff;">string</span> BoolToString<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">bool</span> b<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>b<span style="color: #000080;">==</span><span style="color: #333399;">true</span><span style="color: #008000;">&#41;</span>
     <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;.T.&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   else
     <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;.F.&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
  <span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #808080;">//*******************************************</span></pre></td></tr></table></div>

<p>These are very simple string functions, that are needed for the larger functions that translate structures into string messages, descriptions of several CEP structures. The first function will replicate a string, and the second one will return a string for a boolean , in a FoxPro-ish style.</p>

<div class="wp_codebox"><table width="100%" ><tr id="p198879"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
</pre></td><td class="code" id="p1988code79"><pre class="mql5" style="font-family:monospace;"><span style="color: #0000ff;">struct</span> SimpleEvent
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
   <span style="color: #0000ff;">uint</span> EventID<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">uint</span> EventTime<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">uint</span> Reserved<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">ushort</span> BindCount<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">uint</span> Binds<span style="color: #008000;">&#91;</span>100<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
   <span style="color: #0000ff;">bool</span> BindEvent<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">uint</span> eventid,SimpleEvent<span style="color: #000040;">&amp;</span> s<span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
      <span style="color: #0000ff;">bool</span> fd<span style="color: #008080;">;</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>s.<span style="color: #007788;">BindCount</span><span style="color: #000080;">==</span>0<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
         s.<span style="color: #007788;">Binds</span><span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>eventid<span style="color: #008080;">;</span>
         s.<span style="color: #007788;">BindCount</span><span style="color: #000040;">++</span><span style="color: #008080;">;</span>
         <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span><span style="color: #333399;">true</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
      else
        <span style="color: #008000;">&#123;</span>
         fd<span style="color: #000080;">=</span><span style="color: #333399;">false</span><span style="color: #008080;">;</span>
         <span style="color: #808080;">//checking previous bind</span>
         <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;</span>s.<span style="color: #007788;">BindCount</span><span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
             <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>s.<span style="color: #007788;">Binds</span><span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">==</span>eventid<span style="color: #008000;">&#41;</span>
               <span style="color: #008000;">&#123;</span>
                fd<span style="color: #000080;">=</span><span style="color: #333399;">true</span><span style="color: #008080;">;</span>
                <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
               <span style="color: #008000;">&#125;</span>
            <span style="color: #008000;">&#125;</span><span style="color: #808080;">//for (int i=0;i&lt;s.BindCount;i++)</span>
         <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>fd<span style="color: #000080;">==</span><span style="color: #333399;">false</span><span style="color: #008000;">&#41;</span>
           <span style="color: #008000;">&#123;</span>
            <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>s.<span style="color: #007788;">BindCount</span><span style="color: #000080;">&lt;</span><span style="color: #8a2be2;">ArrayRange</span><span style="color: #008000;">&#40;</span>s.<span style="color: #007788;">Binds</span>,0<span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span>1<span style="color: #008000;">&#41;</span>
              <span style="color: #008000;">&#123;</span>
               s.<span style="color: #007788;">Binds</span><span style="color: #008000;">&#91;</span>s.<span style="color: #007788;">BindCount</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>eventid<span style="color: #008080;">;</span>
               s.<span style="color: #007788;">BindCount</span><span style="color: #000040;">++</span><span style="color: #008080;">;</span>
               <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span><span style="color: #333399;">true</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
              <span style="color: #008000;">&#125;</span>
            else
              <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span><span style="color: #333399;">false</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
           <span style="color: #008000;">&#125;</span>
         else
           <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span><span style="color: #333399;">false</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span><span style="color: #808080;">//else if (s.BindCount!=0)</span>
     <span style="color: #008000;">&#125;</span>
&nbsp;
   <span style="color: #0000ff;">int</span> FindBind<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">uint</span> eventid,SimpleEvent<span style="color: #000040;">&amp;</span> s<span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
      <span style="color: #0000ff;">bool</span> fd<span style="color: #008080;">;</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>s.<span style="color: #007788;">BindCount</span><span style="color: #000080;">==</span>0<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
         <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span>1<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
      else
        <span style="color: #008000;">&#123;</span>
         fd<span style="color: #000080;">=</span><span style="color: #333399;">false</span><span style="color: #008080;">;</span>
         <span style="color: #808080;">//checking previous bind</span>
         <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;</span>s.<span style="color: #007788;">BindCount</span><span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
             <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>s.<span style="color: #007788;">Binds</span><span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">==</span>eventid<span style="color: #008000;">&#41;</span>
               <span style="color: #008000;">&#123;</span>
                <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
               <span style="color: #008000;">&#125;</span>
            <span style="color: #008000;">&#125;</span><span style="color: #808080;">//for (int i=0;i&lt;s.BindCount;i++)</span>
         <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span>1<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
     <span style="color: #008000;">&#125;</span>     
&nbsp;
   <span style="color: #0000ff;">bool</span> UnbindEvent<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">uint</span> eventid,SimpleEvent<span style="color: #000040;">&amp;</span> s<span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>s.<span style="color: #007788;">BindCount</span><span style="color: #000080;">==</span>0<span style="color: #008000;">&#41;</span>
        <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span><span style="color: #333399;">false</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">int</span> fd<span style="color: #008080;">;</span>
      fd<span style="color: #000080;">=</span><span style="color: #000040;">-</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;</span>s.<span style="color: #007788;">BindCount</span><span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
         <span style="color: #008000;">&#123;</span>
          <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>s.<span style="color: #007788;">Binds</span><span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">==</span>eventid<span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
             fd<span style="color: #000080;">=</span>i<span style="color: #008080;">;</span>
             <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
            <span style="color: #008000;">&#125;</span>
         <span style="color: #008000;">&#125;</span><span style="color: #808080;">//for (int i=0;i&lt;s.BindCount;i++)</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>fd<span style="color: #000080;">==</span>0<span style="color: #008000;">&#41;</span>
        <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span><span style="color: #333399;">false</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      else
        <span style="color: #008000;">&#123;</span>
         <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j<span style="color: #000080;">=</span>fd<span style="color: #000040;">+</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>j<span style="color: #000080;">&lt;</span>s.<span style="color: #007788;">BindCount</span><span style="color: #008080;">;</span>j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
             s.<span style="color: #007788;">Binds</span><span style="color: #008000;">&#91;</span>j<span style="color: #000040;">-</span>1<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>s.<span style="color: #007788;">Binds</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
            <span style="color: #008000;">&#125;</span>
         s.<span style="color: #007788;">Binds</span><span style="color: #008000;">&#91;</span>s.<span style="color: #007788;">BindCount</span><span style="color: #000040;">-</span>1<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>
         s.<span style="color: #007788;">BindCount</span><span style="color: #000040;">--</span><span style="color: #008080;">;</span>
         <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span><span style="color: #333399;">true</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span><span style="color: #808080;">//if (fd==0)</span>
     <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>The SimpleEvent structure is at the core of the engine. The events queue that I described in my previous article it is made by tiny SimpleEvent structures. EventID plays the ID, EventTime is the time (in ticks &#8211; milliseconds since Windows start &#8211; not datetime format), BindCount tells to how many complex events the simple event is binded, and the Binds[] contains these events. The BindEvent(), FindBind() and UnbindEvent() functions are to work with this structure. Normally, I could have opted for a class instead of a structure, but what you gain in class functionality you lose in data maneuvrability : you cannot copy objects, but field by field, otherwise you get <strong>Structure have objects and cannot be copied</strong>.</p>

<div class="wp_codebox"><table width="100%" ><tr id="p198880"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code" id="p1988code80"><pre class="mql5" style="font-family:monospace;"><span style="color: #0000ff;">struct</span> SimpleEventArrangement
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">int</span> EventCount<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">uint</span> EventArray<span style="color: #008000;">&#91;</span>100<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">int</span> Prebinds<span style="color: #008000;">&#91;</span>100<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">int</span> NegationsCount<span style="color: #008000;">&#91;</span>100<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span> <span style="color: #808080;">//how many negation events before each event from the array</span>
   <span style="color: #0000ff;">uint</span> NegationsArray<span style="color: #008000;">&#91;</span>10<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>100<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span> <span style="color: #808080;">//store negation events before each event from the array</span>
   <span style="color: #0000ff;">bool</span> NegationsChecked<span style="color: #008000;">&#91;</span>100<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span><span style="color: #808080;">//checks of the first negations that match</span>
  <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">struct</span> ComplexEvent
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">uint</span> ComplexID<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">uint</span> TimeConstraint<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">ushort</span> ArrangementsCount<span style="color: #008080;">;</span>
   SimpleEventArrangement ArrangementsArray<span style="color: #008000;">&#91;</span>100<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>The ComplexEvent structure is the base unit of the complex events table. Remember the pic from the previous article? That is quite what can be found in the ComplexEvent structure. Thus, we have the ID , time constraint, arrangements count (number of rows) , or versions of event queues that make up the same complex event, and finally an arrangements array, made up by SimpleEventArrangement(s). </p>
<p>The SimpleEventArrangement structure describes what can be called to be a row of that matrix. Thus we have a count, and the row (meaningly, the EventArray[]) , which contains the required simple events. The Prebinds[] will note down of course, the prebinds of these events, meaningly the position in the event queue for each simple event that is found. The NegationsCount[] will contain how many negation events are required <strong>not to appear</strong> before every simple event that is required. Thus, one count per each required simple event. The NegationsArray[] will contain these events required not to appear, <strong>on columns</strong>, rather than on lines. The NegationsChecked[] array is a sort of shortened prebind array. Instead of storing where the negations appear, a simple negation flag is raised in this array, thus the array is unidimensional.</p>

<div class="wp_codebox"><table width="100%" ><tr id="p198881"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
</pre></td><td class="code" id="p1988code81"><pre class="mql5" style="font-family:monospace;"><span style="color: #0000ff;">void</span> MakeSimpleEventArrangement<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">string</span> s,SimpleEventArrangement<span style="color: #000040;">&amp;</span> arrg<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">int</span> len<span style="color: #000080;">=</span><span style="color: #8a2be2;">StringLen</span><span style="color: #008000;">&#40;</span>s<span style="color: #000040;">+</span><span style="color: #008080;">&quot; &quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">string</span> rdnow<span style="color: #000080;">=</span><span style="color: #008080;">&quot;&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">string</span> c<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">uint</span> number,swap<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">int</span> normcount<span style="color: #008080;">;</span>
   arrg.<span style="color: #007788;">EventCount</span><span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">string</span> first<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">int</span> intg,d,crt<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">double</span> dbl<span style="color: #008080;">;</span>
   s<span style="color: #000080;">=</span>s<span style="color: #000040;">+</span><span style="color: #008080;">&quot; &quot;</span><span style="color: #008080;">;</span><span style="color: #808080;">//to make sure it registers last word</span>
   <span style="color: #8a2be2;">ArrayInitialize</span><span style="color: #008000;">&#40;</span>arrg.<span style="color: #007788;">EventArray</span>,0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #8a2be2;">ArrayInitialize</span><span style="color: #008000;">&#40;</span>arrg.<span style="color: #007788;">NegationsCount</span>,0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #8a2be2;">ArrayInitialize</span><span style="color: #008000;">&#40;</span>arrg.<span style="color: #007788;">NegationsArray</span>,0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #8a2be2;">ArrayInitialize</span><span style="color: #008000;">&#40;</span>arrg.<span style="color: #007788;">Prebinds</span>,<span style="color: #000040;">-</span>1<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #8a2be2;">ArrayInitialize</span><span style="color: #008000;">&#40;</span>arrg.<span style="color: #007788;">NegationsChecked</span>,<span style="color: #333399;">false</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   normcount<span style="color: #000080;">=</span><span style="color: #000040;">-</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>len<span style="color: #000040;">!</span><span style="color: #000080;">=</span>0<span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
      <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;</span>len<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
         <span style="color: #008000;">&#123;</span>
          c<span style="color: #000080;">=</span><span style="color: #8a2be2;">StringSubstr</span><span style="color: #008000;">&#40;</span>s,i,1<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
          <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>c<span style="color: #000080;">==</span><span style="color: #008080;">&quot; &quot;</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
             <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>rdnow<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #008080;">&quot;&quot;</span><span style="color: #008000;">&#41;</span>
               <span style="color: #008000;">&#123;</span>
                first<span style="color: #000080;">=</span><span style="color: #8a2be2;">StringSubstr</span><span style="color: #008000;">&#40;</span>rdnow,0,1<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>first<span style="color: #000080;">==</span><span style="color: #008080;">&quot;-&quot;</span><span style="color: #000040;">||</span>first<span style="color: #000080;">==</span><span style="color: #008080;">&quot;!&quot;</span><span style="color: #000040;">||</span>first<span style="color: #000080;">==</span><span style="color: #008080;">&quot;n&quot;</span><span style="color: #000040;">||</span>first<span style="color: #000080;">==</span><span style="color: #008080;">&quot;N&quot;</span><span style="color: #008000;">&#41;</span>
                  <span style="color: #008000;">&#123;</span>
                   number<span style="color: #000080;">=</span><span style="color: #8a2be2;">StringToInteger</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">StringSubstr</span><span style="color: #008000;">&#40;</span>rdnow,1,<span style="color: #8a2be2;">StringLen</span><span style="color: #008000;">&#40;</span>rdnow<span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span>1<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>normcount<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #000040;">-</span>1<span style="color: #008000;">&#41;</span>   
                     <span style="color: #008000;">&#123;</span>
                      arrg.<span style="color: #007788;">NegationsArray</span><span style="color: #008000;">&#91;</span>normcount<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>arrg.<span style="color: #007788;">NegationsCount</span><span style="color: #008000;">&#91;</span>normcount<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>number<span style="color: #008080;">;</span>
                      arrg.<span style="color: #007788;">NegationsCount</span><span style="color: #008000;">&#91;</span>normcount<span style="color: #008000;">&#93;</span><span style="color: #000040;">++</span><span style="color: #008080;">;</span>
                     <span style="color: #008000;">&#125;</span>                  
                  <span style="color: #008000;">&#125;</span>
                else
                  <span style="color: #008000;">&#123;</span>
                   normcount<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
                   number<span style="color: #000080;">=</span><span style="color: #8a2be2;">StringToInteger</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">StringSubstr</span><span style="color: #008000;">&#40;</span>rdnow,0,<span style="color: #8a2be2;">StringLen</span><span style="color: #008000;">&#40;</span>rdnow<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                   arrg.<span style="color: #007788;">EventArray</span><span style="color: #008000;">&#91;</span>normcount<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>number<span style="color: #008080;">;</span>
                   arrg.<span style="color: #007788;">EventCount</span><span style="color: #000080;">=</span>normcount<span style="color: #000040;">+</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>
                  <span style="color: #008000;">&#125;</span>
                rdnow<span style="color: #000080;">=</span><span style="color: #008080;">&quot;&quot;</span><span style="color: #008080;">;</span>
               <span style="color: #008000;">&#125;</span><span style="color: #808080;">//if (rdnow!=&quot;&quot;)                </span>
            <span style="color: #008000;">&#125;</span><span style="color: #808080;">//if (c==&quot; &quot;)</span>
          else
            <span style="color: #008000;">&#123;</span>
             <span style="color: #8a2be2;">StringConcatenate</span><span style="color: #008000;">&#40;</span>rdnow,rdnow,c<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            <span style="color: #008000;">&#125;</span>
         <span style="color: #008000;">&#125;</span><span style="color: #808080;">//for (int i=0;i&lt;len;i++)</span>
       <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>rdnow<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #008080;">&quot;&quot;</span><span style="color: #008000;">&#41;</span>
         <span style="color: #008000;">&#123;</span>
          first<span style="color: #000080;">=</span><span style="color: #8a2be2;">StringSubstr</span><span style="color: #008000;">&#40;</span>rdnow,0,1<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
          <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>first<span style="color: #000080;">==</span><span style="color: #008080;">&quot;-&quot;</span><span style="color: #000040;">||</span>first<span style="color: #000080;">==</span><span style="color: #008080;">&quot;!&quot;</span><span style="color: #000040;">||</span>first<span style="color: #000080;">==</span><span style="color: #008080;">&quot;n&quot;</span><span style="color: #000040;">||</span>first<span style="color: #000080;">==</span><span style="color: #008080;">&quot;N&quot;</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
             number<span style="color: #000080;">=</span><span style="color: #8a2be2;">StringToInteger</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">StringSubstr</span><span style="color: #008000;">&#40;</span>rdnow,1,<span style="color: #8a2be2;">StringLen</span><span style="color: #008000;">&#40;</span>rdnow<span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span>1<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
             <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>normcount<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #000040;">-</span>1<span style="color: #008000;">&#41;</span>   
               <span style="color: #008000;">&#123;</span>
                arrg.<span style="color: #007788;">NegationsArray</span><span style="color: #008000;">&#91;</span>normcount<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>arrg.<span style="color: #007788;">NegationsCount</span><span style="color: #008000;">&#91;</span>normcount<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>number<span style="color: #008080;">;</span>
                arrg.<span style="color: #007788;">NegationsCount</span><span style="color: #008000;">&#91;</span>normcount<span style="color: #008000;">&#93;</span><span style="color: #000040;">++</span><span style="color: #008080;">;</span>
               <span style="color: #008000;">&#125;</span>                  
            <span style="color: #008000;">&#125;</span>
          else
            <span style="color: #008000;">&#123;</span>
             normcount<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
             number<span style="color: #000080;">=</span><span style="color: #8a2be2;">StringToInteger</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">StringSubstr</span><span style="color: #008000;">&#40;</span>rdnow,0,<span style="color: #8a2be2;">StringLen</span><span style="color: #008000;">&#40;</span>rdnow<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
             arrg.<span style="color: #007788;">EventArray</span><span style="color: #008000;">&#91;</span>normcount<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>number<span style="color: #008080;">;</span>
             arrg.<span style="color: #007788;">EventCount</span><span style="color: #000080;">=</span>normcount<span style="color: #000040;">+</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>
            <span style="color: #008000;">&#125;</span>
          rdnow<span style="color: #000080;">=</span><span style="color: #008080;">&quot;&quot;</span><span style="color: #008080;">;</span>
         <span style="color: #008000;">&#125;</span><span style="color: #808080;">//if (rdnow!=&quot;&quot;)</span>
&nbsp;
      <span style="color: #808080;">//reversing event order</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>arrg.<span style="color: #007788;">EventCount</span><span style="color: #000080;">&gt;</span>0<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
         dbl<span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span>arrg.<span style="color: #007788;">EventCount</span><span style="color: #000040;">/</span>2,0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
         intg<span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">MathRound</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span>arrg.<span style="color: #007788;">EventCount</span>,0<span style="color: #008000;">&#41;</span><span style="color: #000040;">/</span>2<span style="color: #008000;">&#41;</span>,0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
         <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>dbl<span style="color: #000080;">==</span>intg<span style="color: #008000;">&#41;</span>
           d<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>
         else
           d<span style="color: #000080;">=</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>           
         crt<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>         
         <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>intg<span style="color: #000040;">-</span>1<span style="color: #000040;">-</span>d<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>             
             swap<span style="color: #000080;">=</span>arrg.<span style="color: #007788;">EventArray</span><span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
             arrg.<span style="color: #007788;">EventArray</span><span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>arrg.<span style="color: #007788;">EventArray</span><span style="color: #008000;">&#91;</span>arrg.<span style="color: #007788;">EventCount</span><span style="color: #000040;">-</span>1<span style="color: #000040;">-</span>crt<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
             arrg.<span style="color: #007788;">EventArray</span><span style="color: #008000;">&#91;</span>arrg.<span style="color: #007788;">EventCount</span><span style="color: #000040;">-</span>1<span style="color: #000040;">-</span>crt<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>swap<span style="color: #008080;">;</span>             
             <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> l<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>l<span style="color: #000080;">&lt;</span><span style="color: #8a2be2;">ArrayRange</span><span style="color: #008000;">&#40;</span>arrg.<span style="color: #007788;">NegationsArray</span>,0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>l<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
                <span style="color: #008000;">&#123;</span>                 
                 swap<span style="color: #000080;">=</span>arrg.<span style="color: #007788;">NegationsArray</span><span style="color: #008000;">&#91;</span>l<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
                 arrg.<span style="color: #007788;">NegationsArray</span><span style="color: #008000;">&#91;</span>l<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>arrg.<span style="color: #007788;">NegationsArray</span><span style="color: #008000;">&#91;</span>l<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>arrg.<span style="color: #007788;">EventCount</span><span style="color: #000040;">-</span>1<span style="color: #000040;">-</span>crt<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
                 arrg.<span style="color: #007788;">NegationsArray</span><span style="color: #008000;">&#91;</span>l<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>arrg.<span style="color: #007788;">EventCount</span><span style="color: #000040;">-</span>1<span style="color: #000040;">-</span>crt<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>swap<span style="color: #008080;">;</span>
                <span style="color: #008000;">&#125;</span>
             crt<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
            <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
     <span style="color: #008000;">&#125;</span><span style="color: #808080;">//if (len!=0)</span>
   <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>The MakeSimpleArrangement() function will build a simple arrangement, from a string, as instructed by the user. For instance, &#8220;10 !6 11&#8243; means &#8220;10, followed by 11, with a 6 that has not to appear before 11&#8243;. Spacebar is separator, and negation flag can be &#8220;-&#8221;,&#8221;!&#8221;,&#8221;n&#8221; or &#8220;N&#8221;. Note that at the end of the function, data is reversed, from last to first, as I said in the previous article, that complex event arrangements will start from the nearby events going to the older events. This function has not to be called by the user, rather it is called by MakeComplexEvent().</p>

<div class="wp_codebox"><table width="100%" ><tr id="p198882"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
</pre></td><td class="code" id="p1988code82"><pre class="mql5" style="font-family:monospace;"><span style="color: #0000ff;">void</span> MakeComplexEvent<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">string</span> s,<span style="color: #0000ff;">uint</span> eventid,<span style="color: #0000ff;">uint</span> time,ComplexEvent <span style="color: #000040;">&amp;</span>cplx<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">int</span> len<span style="color: #000080;">=</span><span style="color: #8a2be2;">StringLen</span><span style="color: #008000;">&#40;</span>s<span style="color: #000040;">+</span><span style="color: #008080;">&quot; &quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">string</span> rdnow<span style="color: #000080;">=</span><span style="color: #008080;">&quot;&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">string</span> c<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">string</span> arrg<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">ushort</span> cnt<span style="color: #008080;">;</span>
   s<span style="color: #000080;">=</span>s<span style="color: #000040;">+</span><span style="color: #008080;">&quot; &quot;</span><span style="color: #008080;">;</span>
   cplx.<span style="color: #007788;">ComplexID</span><span style="color: #000080;">=</span>eventid<span style="color: #008080;">;</span>
   cplx.<span style="color: #007788;">TimeConstraint</span><span style="color: #000080;">=</span>time<span style="color: #008080;">;</span>
   cplx.<span style="color: #007788;">ArrangementsCount</span><span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>len<span style="color: #000040;">!</span><span style="color: #000080;">=</span>0<span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
      <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;</span>len<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
         <span style="color: #008000;">&#123;</span>
          c<span style="color: #000080;">=</span><span style="color: #8a2be2;">StringSubstr</span><span style="color: #008000;">&#40;</span>s,i,1<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
          <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>c<span style="color: #000080;">==</span><span style="color: #008080;">&quot;;&quot;</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
             <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>rdnow<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #008080;">&quot;&quot;</span><span style="color: #008000;">&#41;</span>
               <span style="color: #008000;">&#123;</span>
                MakeSimpleEventArrangement<span style="color: #008000;">&#40;</span>rdnow,cplx.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>cplx.<span style="color: #007788;">ArrangementsCount</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                cplx.<span style="color: #007788;">ArrangementsCount</span><span style="color: #000040;">++</span><span style="color: #008080;">;</span>
                rdnow<span style="color: #000080;">=</span><span style="color: #008080;">&quot;&quot;</span><span style="color: #008080;">;</span>
               <span style="color: #008000;">&#125;</span><span style="color: #808080;">//if (rdnow!=&quot;&quot;)</span>
            <span style="color: #008000;">&#125;</span><span style="color: #808080;">//if (c==&quot; &quot;)</span>
          else
            <span style="color: #8a2be2;">StringConcatenate</span><span style="color: #008000;">&#40;</span>rdnow,rdnow,c<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
         <span style="color: #008000;">&#125;</span><span style="color: #808080;">//for (int i=0;i&lt;len;i++)</span>
      <span style="color: #808080;">//for last word</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>rdnow<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #008080;">&quot;&quot;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
         MakeSimpleEventArrangement<span style="color: #008000;">&#40;</span>rdnow,cplx.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>cplx.<span style="color: #007788;">ArrangementsCount</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
         cplx.<span style="color: #007788;">ArrangementsCount</span><span style="color: #000040;">++</span><span style="color: #008080;">;</span>
         rdnow<span style="color: #000080;">=</span><span style="color: #008080;">&quot;&quot;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span><span style="color: #808080;">//if (rdnow!=&quot;&quot;)</span>
     <span style="color: #008000;">&#125;</span><span style="color: #808080;">//if (len!=0)</span>
   <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>The MakeComplexEvent() function is to be called by user when telling the engine how the complex events look like. The definition is a big string with more simple event arrangements, separated by semicolon. The other parameters are the complex event ID, the time constraint and a complex event variable to store the result in.</p>

<div class="wp_codebox"><table width="100%" ><tr id="p198883"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre></td><td class="code" id="p1988code83"><pre class="mql5" style="font-family:monospace;"><span style="color: #0000ff;">string</span> ComplexEventToString<span style="color: #008000;">&#40;</span>ComplexEvent<span style="color: #000040;">&amp;</span> c<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">string</span> res<span style="color: #000080;">=</span><span style="color: #008080;">&quot;&quot;</span><span style="color: #008080;">;</span>
   res<span style="color: #000080;">=</span>res<span style="color: #000040;">+</span><span style="color: #008080;">&quot;ComplexID &quot;</span><span style="color: #000040;">+</span><span style="color: #8a2be2;">DoubleToString</span><span style="color: #008000;">&#40;</span>c.<span style="color: #007788;">ComplexID</span>,<span style="color: #008000;">0</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">+</span><span style="color: #008080;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008080;">;</span>
   res<span style="color: #000080;">=</span>res<span style="color: #000040;">+</span><span style="color: #008080;">&quot;Arrangements &quot;</span><span style="color: #000040;">+</span><span style="color: #8a2be2;">DoubleToString</span><span style="color: #008000;">&#40;</span>c.<span style="color: #007788;">ArrangementsCount</span>,<span style="color: #008000;">0</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">+</span><span style="color: #008080;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;</span>c.<span style="color: #007788;">ArrangementsCount</span><span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
      <span style="color: #008000;">&#123;</span>
       res<span style="color: #000080;">=</span>res<span style="color: #000040;">+</span><span style="color: #008080;">&quot;Events: &quot;</span><span style="color: #000040;">+</span><span style="color: #8a2be2;">DoubleToString</span><span style="color: #008000;">&#40;</span>c.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventCount</span>,<span style="color: #008000;">0</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">+</span><span style="color: #008080;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008080;">;</span>
       <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>j<span style="color: #000080;">&lt;</span>c.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventCount</span><span style="color: #008080;">;</span>j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
          <span style="color: #008000;">&#123;</span>
           res<span style="color: #000080;">=</span>res<span style="color: #000040;">+</span><span style="color: #008080;">&quot; &quot;</span><span style="color: #000040;">+</span><span style="color: #8a2be2;">DoubleToString</span><span style="color: #008000;">&#40;</span>c.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventArray</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span>,0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
          <span style="color: #008000;">&#125;</span>
       res<span style="color: #000080;">=</span>res<span style="color: #000040;">+</span><span style="color: #008080;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008080;">;</span>       
       res<span style="color: #000080;">=</span>res<span style="color: #000040;">+</span><span style="color: #008080;">&quot;Negations:<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008080;">;</span>
       <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>j<span style="color: #000080;">&lt;</span><span style="color: #008000;">10</span><span style="color: #008080;">;</span>j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
          <span style="color: #008000;">&#123;</span>
           <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> k<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>k<span style="color: #000080;">&lt;</span>c.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventCount</span><span style="color: #008080;">;</span>k<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
              <span style="color: #008000;">&#123;</span>
               res<span style="color: #000080;">=</span>res<span style="color: #000040;">+</span><span style="color: #008080;">&quot; &quot;</span><span style="color: #000040;">+</span><span style="color: #8a2be2;">DoubleToString</span><span style="color: #008000;">&#40;</span>c.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">NegationsArray</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span>,0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
              <span style="color: #008000;">&#125;</span>
           res<span style="color: #000080;">=</span>res<span style="color: #000040;">+</span><span style="color: #008080;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008080;">;</span>
          <span style="color: #008000;">&#125;</span>
       res<span style="color: #000080;">=</span>res<span style="color: #000040;">+</span><span style="color: #008080;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008080;">;</span>
      <span style="color: #008000;">&#125;</span>
   <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>res<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>This function was made for commenting reasons only. The function describes a complex event in a string form. You can output the resulting string with Comment().</p>

<div class="wp_codebox"><table width="100%" ><tr id="p198884"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="code" id="p1988code84"><pre class="mql5" style="font-family:monospace;"><span style="color: #0000ff;">class</span> CEPEngine
  <span style="color: #008000;">&#123;</span>
   <span style="color: #808080;">//setup elements</span>
   <span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
   <span style="color: #0000ff;">uint</span> QueueTimeConstraint<span style="color: #008080;">;</span>
   ComplexEvent ComplexEventsTable<span style="color: #008000;">&#91;</span>30<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">ushort</span> ComplexEventsCount<span style="color: #008080;">;</span>
   <span style="color: #808080;">//data</span>
   SimpleEvent EventsQueue<span style="color: #008000;">&#91;</span>1000<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>    
   <span style="color: #0000ff;">int</span> OldestIndex<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">uint</span> OldestTime<span style="color: #008080;">;</span>
&nbsp;
   <span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
   <span style="color: #0000ff;">void</span> CEPEngine<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #808080;">//constructor</span>
   <span style="color: #0000ff;">void</span> ClearEvents<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #808080;">//cleans event table</span>
   <span style="color: #0000ff;">void</span> AddComplexEvent<span style="color: #008000;">&#40;</span>ComplexEvent <span style="color: #000040;">&amp;</span>c<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
   <span style="color: #0000ff;">virtual</span> <span style="color: #0000ff;">void</span> EventsCallback<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">uint</span> EventID<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #808080;">//here you treat raised events from the CEP Engine</span>
   <span style="color: #0000ff;">void</span> SetupEngineMilliseconds<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">uint</span> ms<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">void</span> RaiseEvent<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">uint</span> EventID<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">void</span> EngineRun<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">string</span> StatusString<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>Finally, we got to the CEP engine class.<br />
QueueTimeConstraint is an important variable, which tells which is the length in time for which the engine will look in the queue. Incoming simple events, that are found in the EventsQueue[] , and go past this &#8220;event horizon&#8221; are overwritten. The OldestIndex is the end of the array ; it is a dynamic end, calculated at every new RaiseEvent() call from the outside, abiding the QueueTimeConstraint, and it has the time , in ticks, in OldestTime.</p>
<p>Now the small stuff:</p>

<div class="wp_codebox"><table width="100%" ><tr id="p198885"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
</pre></td><td class="code" id="p1988code85"><pre class="mql5" style="font-family:monospace;">   <span style="color: #0000ff;">void</span> CEPEngine<span style="color: #008080;">::</span><span style="color: #007788;">ClearEvents</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>  <span style="color: #808080;">//cleans event table</span>
     <span style="color: #008000;">&#123;</span>
      <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;</span><span style="color: #8a2be2;">ArrayRange</span><span style="color: #008000;">&#40;</span>ComplexEventsTable,0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
         <span style="color: #008000;">&#123;</span>
          ComplexEventsTable<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsCount</span><span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>
         <span style="color: #008000;">&#125;</span>
      <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;</span><span style="color: #8a2be2;">ArrayRange</span><span style="color: #008000;">&#40;</span>EventsQueue,0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
          <span style="color: #008000;">&#123;</span>
           EventsQueue<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventID</span><span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>
           EventsQueue<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventTime</span><span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>
           EventsQueue<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">BindCount</span><span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>
           <span style="color: #8a2be2;">ArrayInitialize</span><span style="color: #008000;">&#40;</span>EventsQueue<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">Binds</span>,0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
          <span style="color: #008000;">&#125;</span>
      OldestIndex<span style="color: #000080;">=</span><span style="color: #000040;">-</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>
      OldestTime<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>
      ComplexEventsCount<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>
     <span style="color: #008000;">&#125;</span>  
&nbsp;
   <span style="color: #0000ff;">void</span> CEPEngine<span style="color: #008080;">::</span><span style="color: #007788;">CEPEngine</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
      ClearEvents<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
     <span style="color: #008000;">&#125;</span>
&nbsp;
   <span style="color: #0000ff;">void</span> CEPEngine<span style="color: #008080;">::</span><span style="color: #007788;">AddComplexEvent</span><span style="color: #008000;">&#40;</span>ComplexEvent <span style="color: #000040;">&amp;</span>c<span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
      ComplexEventsTable<span style="color: #008000;">&#91;</span>ComplexEventsCount<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>c<span style="color: #008080;">;</span>
      ComplexEventsCount<span style="color: #000080;">=</span>ComplexEventsCount<span style="color: #000040;">+</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>
     <span style="color: #008000;">&#125;</span>
&nbsp;
&nbsp;
   <span style="color: #0000ff;">void</span> CEPEngine<span style="color: #008080;">::</span><span style="color: #007788;">SetupEngineMilliseconds</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">uint</span> ms<span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
      QueueTimeConstraint<span style="color: #000080;">=</span>ms<span style="color: #008080;">;</span>
      <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
     <span style="color: #008000;">&#125;</span>
&nbsp;
&nbsp;
   <span style="color: #0000ff;">void</span> CEPEngine<span style="color: #008080;">::</span><span style="color: #007788;">EventsCallback</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">uint</span> EventID<span style="color: #008000;">&#41;</span><span style="color: #808080;">//here you treat raised events from the CEP Engine</span>
     <span style="color: #008000;">&#123;</span>
     <span style="color: #008000;">&#125;</span>   
&nbsp;
    <span style="color: #0000ff;">string</span> CEPEngine<span style="color: #008080;">::</span><span style="color: #007788;">StatusString</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
       <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">string</span> res<span style="color: #000080;">=</span><span style="color: #008080;">&quot;&quot;</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">string</span> eventtext<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">int</span> etl<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>ComplexEventsCount<span style="color: #000040;">!</span><span style="color: #000080;">=</span>0<span style="color: #008000;">&#41;</span>
          <span style="color: #008000;">&#123;</span>
           <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> c<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>c<span style="color: #000080;">&lt;</span>ComplexEventsCount<span style="color: #008080;">;</span>c<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
              <span style="color: #008000;">&#123;</span>
               eventtext<span style="color: #000080;">=</span><span style="color: #008080;">&quot;[&quot;</span><span style="color: #000040;">+</span><span style="color: #8a2be2;">DoubleToString</span><span style="color: #008000;">&#40;</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ComplexID</span>,<span style="color: #008000;">0</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">+</span><span style="color: #008080;">&quot;]::&quot;</span><span style="color: #008080;">;</span>
               etl<span style="color: #000080;">=</span><span style="color: #8a2be2;">StringLen</span><span style="color: #008000;">&#40;</span>eventtext<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
               res<span style="color: #000080;">=</span>res<span style="color: #000040;">+</span>eventtext<span style="color: #008080;">;</span>
               <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsCount</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span>0<span style="color: #008000;">&#41;</span>
                 <span style="color: #008000;">&#123;</span>
                  <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> a<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>a<span style="color: #000080;">&lt;</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsCount</span><span style="color: #008080;">;</span>a<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
                     <span style="color: #008000;">&#123;</span>                     
                      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventCount</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span>0<span style="color: #008000;">&#41;</span>
                        <span style="color: #008000;">&#123;</span>                         
                         <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> e<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>e<span style="color: #000080;">&lt;</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventCount</span><span style="color: #008080;">;</span>e<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
                            <span style="color: #008000;">&#123;</span>
                             res<span style="color: #000080;">=</span>res<span style="color: #000040;">+</span><span style="color: #8a2be2;">DoubleToString</span><span style="color: #008000;">&#40;</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">Prebinds</span><span style="color: #008000;">&#91;</span>e<span style="color: #008000;">&#93;</span>,<span style="color: #008000;">0</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">+</span><span style="color: #008080;">&quot;  &quot;</span><span style="color: #008080;">;</span>
                            <span style="color: #008000;">&#125;</span>
                         res<span style="color: #000080;">=</span>res<span style="color: #000040;">+</span><span style="color: #008080;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #000040;">+</span>Replicate<span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot; &quot;</span>,etl<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                         <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> e<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>e<span style="color: #000080;">&lt;</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventCount</span><span style="color: #008080;">;</span>e<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
                            <span style="color: #008000;">&#123;</span>
                             res<span style="color: #000080;">=</span>res<span style="color: #000040;">+</span>BoolToString<span style="color: #008000;">&#40;</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">NegationsChecked</span><span style="color: #008000;">&#91;</span>e<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">+</span><span style="color: #008080;">&quot;  &quot;</span><span style="color: #008080;">;</span>
                            <span style="color: #008000;">&#125;</span>
                         res<span style="color: #000080;">=</span>res<span style="color: #000040;">+</span><span style="color: #008080;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008080;">;</span>
                         <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>a<span style="color: #000040;">!</span><span style="color: #000080;">=</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsCount</span><span style="color: #000040;">-</span><span style="color: #008000;">1</span><span style="color: #008000;">&#41;</span>
                           <span style="color: #008000;">&#123;</span>
                            res<span style="color: #000080;">=</span>res<span style="color: #000040;">+</span>Replicate<span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot; &quot;</span>,etl<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                           <span style="color: #008000;">&#125;</span>                      
                        <span style="color: #008000;">&#125;</span><span style="color: #808080;">//if (ComplexEventsTable[c].ArrangementsArray[a].EventCount!=0)                   </span>
                     <span style="color: #008000;">&#125;</span><span style="color: #808080;">//for (int a=0;a&lt;ComplexEventsTable[c].ArrangementsCount;a++)</span>
                 <span style="color: #008000;">&#125;</span><span style="color: #808080;">//if (ComplexEventsTable[c].ArrangementsCount!=0)</span>
              <span style="color: #008000;">&#125;</span><span style="color: #808080;">//for (int c=0;c&lt;ComplexEventsCount;c++)           </span>
          <span style="color: #008000;">&#125;</span><span style="color: #808080;">//if (ComplexEventsCount!=0) </span>
        <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>res<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
       <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>So, the ClearEvents() clears the simple events queue. This is the reason for which it is called from the CEPEngine() constructor. The AddComplexEvent() adds a complex event to the table. It has to be called by user, after making complex events with MakeComplexEvent(). The engine is ready to work after its time constraint is set up by the user with SetupEngineMilliseconds(). And finally, the EventsCallback() is the virtual method that has to be overridden by the user, being called when the CEP engine raises a complex event.<br />
The StatusString() function produces a comment version of the engine status.</p>
<p>Now some <em>average</em> complicated stuff: <strong>RaiseEvent() : when the user raises a simple event</strong></p>

<div class="wp_codebox"><table width="100%" ><tr id="p198886"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
</pre></td><td class="code" id="p1988code86"><pre class="mql5" style="font-family:monospace;">    <span style="color: #0000ff;">void</span> CEPEngine<span style="color: #008080;">::</span><span style="color: #007788;">RaiseEvent</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">uint</span> EventID<span style="color: #008000;">&#41;</span>
      <span style="color: #008000;">&#123;</span>
       <span style="color: #0000ff;">long</span> time<span style="color: #000080;">=</span><span style="color: #8a2be2;">GetTickCount</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
       <span style="color: #0000ff;">bool</span> isforbidden<span style="color: #000080;">=</span><span style="color: #333399;">true</span><span style="color: #008080;">;</span>
       <span style="color: #0000ff;">uint</span> opposite<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>
       <span style="color: #0000ff;">uint</span> difft<span style="color: #008080;">;</span>
       <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>OldestIndex<span style="color: #000080;">&gt;</span>0<span style="color: #008000;">&#41;</span>
         <span style="color: #008000;">&#123;</span>
          <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;</span><span style="color: #8a2be2;">ArrayRange</span><span style="color: #008000;">&#40;</span>EventsQueue,0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
             <span style="color: #008000;">&#123;</span>
              <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>EventsQueue<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventTime</span><span style="color: #000080;">==</span>0<span style="color: #008000;">&#41;</span>
                <span style="color: #008000;">&#123;</span>
                 OldestIndex<span style="color: #000080;">=</span>i<span style="color: #000040;">-</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>
                 OldestTime<span style="color: #000080;">=</span>EventsQueue<span style="color: #008000;">&#91;</span>i<span style="color: #000040;">-</span>1<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventTime</span><span style="color: #008080;">;</span>
                 <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
                <span style="color: #008000;">&#125;</span>
              <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>time<span style="color: #000040;">-</span>EventsQueue<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventTime</span><span style="color: #000080;">&gt;</span>QueueTimeConstraint<span style="color: #008000;">&#41;</span>
                <span style="color: #008000;">&#123;</span>
                 OldestIndex<span style="color: #000080;">=</span>i<span style="color: #000040;">-</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>
                 OldestTime<span style="color: #000080;">=</span>EventsQueue<span style="color: #008000;">&#91;</span>i<span style="color: #000040;">-</span>1<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventTime</span><span style="color: #008080;">;</span>
                 <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
                <span style="color: #008000;">&#125;</span><span style="color: #808080;">//if (time-EventsQueue[i].EventTime&gt;QueueTimeConstraint)  </span>
             <span style="color: #008000;">&#125;</span><span style="color: #808080;">//for (int i=0;i&lt;OldestIndex+1;i++)</span>
         <span style="color: #008000;">&#125;</span><span style="color: #808080;">//if (OldestIndex!=0)</span>
       else
         <span style="color: #008000;">&#123;</span>
          <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>OldestIndex<span style="color: #000080;">&lt;=</span>0<span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
             OldestIndex<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>
             OldestTime<span style="color: #000080;">=</span>time<span style="color: #008080;">;</span>
            <span style="color: #008000;">&#125;</span>
         <span style="color: #008000;">&#125;</span>
       <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j<span style="color: #000080;">=</span>OldestIndex<span style="color: #000040;">+</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>j<span style="color: #000080;">&gt;</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>j<span style="color: #000040;">--</span><span style="color: #008000;">&#41;</span>
          <span style="color: #008000;">&#123;</span>
           EventsQueue<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventID</span><span style="color: #000080;">=</span>EventsQueue<span style="color: #008000;">&#91;</span>j<span style="color: #000040;">-</span>1<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventID</span><span style="color: #008080;">;</span>
           EventsQueue<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventTime</span><span style="color: #000080;">=</span>EventsQueue<span style="color: #008000;">&#91;</span>j<span style="color: #000040;">-</span>1<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventTime</span><span style="color: #008080;">;</span>
           EventsQueue<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">BindCount</span><span style="color: #000080;">=</span>EventsQueue<span style="color: #008000;">&#91;</span>j<span style="color: #000040;">-</span>1<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">BindCount</span><span style="color: #008080;">;</span>
          <span style="color: #008000;">&#125;</span>
       <span style="color: #8a2be2;">ArrayInitialize</span><span style="color: #008000;">&#40;</span>EventsQueue<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">Binds</span>,0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
       EventsQueue<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventID</span><span style="color: #000080;">=</span>EventID<span style="color: #008080;">;</span>
       EventsQueue<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventTime</span><span style="color: #000080;">=</span>time<span style="color: #008080;">;</span>
       EventsQueue<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">BindCount</span><span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>
       OldestIndex<span style="color: #000080;">=</span>OldestIndex<span style="color: #000040;">+</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>
&nbsp;
       <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>ComplexEventsCount<span style="color: #000040;">!</span><span style="color: #000080;">=</span>0<span style="color: #008000;">&#41;</span>
         <span style="color: #008000;">&#123;</span>
          EngineRun<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
         <span style="color: #008000;">&#125;</span>         
       <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
      <span style="color: #008000;">&#125;</span><span style="color: #808080;">//raise event ends</span></pre></td></tr></table></div>

<p>The function has a moderate degree of complexity.<br />
Lines 7 &#8211; 32 establish the event horizon within the queue. That is, which is the oldest event within the queue, abiding the time constraint of the whole queue.<br />
Lines 33 &#8211; 38 move the queue one step lower , making room for a new simple event.<br />
Lines 39 &#8211; 43 insert the new simple event coming from the user program.<br />
Lines 45 &#8211; 48 call the EngineRun() method is to process the new data, if at least one complex event is registered in the table.</p>
<p><strong>At the heart of the CEP engine lies the EngineRun() method. </strong>It is the most complicated piece of code of the entire class. But, there would be no car without the engine, right?</p>

<div class="wp_codebox"><table width="100%" ><tr id="p198887"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
</pre></td><td class="code" id="p1988code87"><pre class="mql5" style="font-family:monospace;">   <span style="color: #0000ff;">void</span> CEPEngine<span style="color: #008080;">::</span><span style="color: #007788;">EngineRun</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
      <span style="color: #0000ff;">long</span> time<span style="color: #000080;">=</span><span style="color: #8a2be2;">GetTickCount</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">bool</span> any_binded<span style="color: #008080;">;</span>
      <span style="color: #0000ff;">int</span> CrtColumn<span style="color: #008000;">&#91;</span>100<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>100<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span><span style="color: #808080;">//address CrtColumn as CrtColumn(event,arrangement)</span>
      <span style="color: #0000ff;">bool</span> bypass<span style="color: #000080;">=</span><span style="color: #333399;">false</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">int</span> q,p<span style="color: #008080;">;</span>
      <span style="color: #0000ff;">int</span> j,lastj<span style="color: #008080;">;</span>
      <span style="color: #0000ff;">int</span> test<span style="color: #008080;">;</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>ComplexEventsCount<span style="color: #000080;">==</span>0<span style="color: #008000;">&#41;</span>
        <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
      <span style="color: #8a2be2;">ArrayInitialize</span><span style="color: #008000;">&#40;</span>CrtColumn,0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> c<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>c<span style="color: #000080;">&lt;</span>ComplexEventsCount<span style="color: #008080;">;</span>c<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
         <span style="color: #008000;">&#123;</span>
          <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;Arrangements in complex event &quot;</span>,c,<span style="color: #008080;">&quot; are &quot;</span>,ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsCount</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
          <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsCount</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span>0<span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>                          
             <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> a<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>a<span style="color: #000080;">&lt;</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsCount</span><span style="color: #008080;">;</span>a<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
                <span style="color: #008000;">&#123;</span>      
                 <span style="color: #808080;">//Check if the current simple event within arrangement within current complex event is to be binded</span>
                 <span style="color: #808080;">//by checking with simple events from the queue</span>
                 p<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>                                       
                 <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>time<span style="color: #000040;">-</span>EventsQueue<span style="color: #008000;">&#91;</span>p<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventTime</span><span style="color: #000080;">&lt;=</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">TimeConstraint</span><span style="color: #008000;">&#41;</span>
                   <span style="color: #008000;">&#123;</span>
                    <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;Looking on entry &quot;</span>,p,<span style="color: #008080;">&quot; where is simple event &quot;</span>,EventsQueue<span style="color: #008000;">&#91;</span>p<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventID</span>,<span style="color: #008080;">&quot; comparing with &quot;</span>,ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventArray</span><span style="color: #008000;">&#91;</span>CrtColumn<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#93;</span>,<span style="color: #008080;">&quot; on complex event &quot;</span>,c,<span style="color: #008080;">&quot;, arrg. &quot;</span>,a,<span style="color: #008080;">&quot; (column &quot;</span>,CrtColumn<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>,<span style="color: #008080;">&quot;) vs count &quot;</span>,ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventCount</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>                       
                    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>EventsQueue<span style="color: #008000;">&#91;</span>p<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventID</span><span style="color: #000080;">==</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventArray</span><span style="color: #008000;">&#91;</span>CrtColumn<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
                      <span style="color: #008000;">&#123;</span>
                       <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;Found simple event &quot;</span>,EventsQueue<span style="color: #008000;">&#91;</span>p<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventID</span>,<span style="color: #008080;">&quot; for column &quot;</span>,CrtColumn<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>,<span style="color: #008080;">&quot; of arrangement &quot;</span>,a,<span style="color: #008080;">&quot; of event &quot;</span>,c,<span style="color: #008080;">&quot; meaningly id=&quot;</span>,ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ComplexID</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> 
                       ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">Prebinds</span><span style="color: #008000;">&#91;</span>CrtColumn<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>p<span style="color: #008080;">;</span>
                       CrtColumn<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span><span style="color: #000040;">++</span><span style="color: #008080;">;</span>                                                                                        
                       bypass<span style="color: #000080;">=</span><span style="color: #333399;">false</span><span style="color: #008080;">;</span>
                       <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>CrtColumn<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span><span style="color: #000080;">&gt;</span>1<span style="color: #008000;">&#41;</span>
                         <span style="color: #008000;">&#123;</span>
                          q<span style="color: #000080;">=</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">Prebinds</span><span style="color: #008000;">&#91;</span>CrtColumn<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span><span style="color: #000040;">-</span>2<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
                          <span style="color: #808080;">//-2 instead of -1 because we already incremented the CrtColumn by ++</span>
                          <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;Checking negations from previous bind, &quot;</span>,q,<span style="color: #008080;">&quot; to current element &quot;</span>,p<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                          q<span style="color: #000080;">=</span>q<span style="color: #000040;">+</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>
                          <span style="color: #808080;">//Checking negations; if test passes, simple event is prebinded;                                                          </span>
                          <span style="color: #808080;">//q is an older event than the current one, p, so q&gt;p</span>
                          <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">NegationsCount</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span>0<span style="color: #008000;">&#41;</span>
                            <span style="color: #008000;">&#123;</span>                                                
                             <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>q<span style="color: #000080;">&lt;</span>p<span style="color: #008000;">&#41;</span>
                               <span style="color: #008000;">&#123;</span>
                                <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>j<span style="color: #000080;">&lt;</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">NegationsCount</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
                                   <span style="color: #008000;">&#123;</span>
                                    lastj<span style="color: #000080;">=</span>j<span style="color: #008080;">;</span>
                                    <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;Comparing event on &quot;</span>,q,<span style="color: #008080;">&quot; meaningly &quot;</span>,EventsQueue<span style="color: #008000;">&#91;</span>q<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventID</span>,<span style="color: #008080;">&quot; with negation &quot;</span>,ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">NegationsArray</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>CrtColumn<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span><span style="color: #000040;">-</span>2<span style="color: #000040;">+</span>1<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                                    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>EventsQueue<span style="color: #008000;">&#91;</span>q<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventID</span><span style="color: #000080;">==</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">NegationsArray</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>CrtColumn<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span><span style="color: #000040;">-</span>2<span style="color: #000040;">+</span>1<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
                                      <span style="color: #008000;">&#123;</span>
                                       ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">NegationsChecked</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #333399;">true</span><span style="color: #008080;">;</span>
                                       <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
                                      <span style="color: #008000;">&#125;</span>
                                   <span style="color: #008000;">&#125;</span>
                                 <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">NegationsChecked</span><span style="color: #008000;">&#91;</span>lastj<span style="color: #008000;">&#93;</span><span style="color: #000080;">==</span><span style="color: #333399;">true</span><span style="color: #008000;">&#41;</span>
                                   <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
                                 q<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
                                <span style="color: #008000;">&#125;</span>
                            <span style="color: #008000;">&#125;</span><span style="color: #808080;">//if (ComplexEventsTable[c].ArrangementsArray[a].NegationsCount!=0)</span>
                          <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">NegationsChecked</span><span style="color: #008000;">&#91;</span>lastj<span style="color: #008000;">&#93;</span><span style="color: #000080;">==</span><span style="color: #333399;">true</span><span style="color: #008000;">&#41;</span>
                            <span style="color: #008000;">&#123;</span>
                             <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;Erasing last bind on &quot;</span>,CrtColumn<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span><span style="color: #000040;">-</span><span style="color: #008000;">1</span>,<span style="color: #008080;">&quot;. Decreasing current column for complex &quot;</span>,c,<span style="color: #008080;">&quot;, arrangement &quot;</span>,a<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                             ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">Prebinds</span><span style="color: #008000;">&#91;</span>CrtColumn<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span><span style="color: #000040;">-</span>1<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #000040;">-</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span><span style="color: #808080;">//erase prebind;                                  </span>
                             CrtColumn<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span><span style="color: #000040;">--</span><span style="color: #008080;">;</span>
                             bypass<span style="color: #000080;">=</span><span style="color: #333399;">true</span><span style="color: #008080;">;</span>
                             <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
                            <span style="color: #008000;">&#125;</span> 
                         <span style="color: #008000;">&#125;</span><span style="color: #808080;">//if (CrtColumn[c,a]&gt;1)                            </span>
                       <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>bypass<span style="color: #000080;">==</span><span style="color: #333399;">false</span><span style="color: #008000;">&#41;</span><span style="color: #808080;">//meaning,if no negations are checked                          </span>
                         <span style="color: #008000;">&#123;</span>
                          <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventCount</span><span style="color: #000080;">==</span>CrtColumn<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #808080;">//all prebinds are done</span>
                            <span style="color: #008000;">&#123;</span>
                             <span style="color: #808080;">//checking time constraint again</span>
                             <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">GetTickCount</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span>EventsQueue<span style="color: #008000;">&#91;</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">Prebinds</span><span style="color: #008000;">&#91;</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventCount</span><span style="color: #000040;">-</span><span style="color: #008000;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventTime</span><span style="color: #000080;">&lt;=</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">TimeConstraint</span><span style="color: #008000;">&#41;</span>
                               <span style="color: #008000;">&#123;</span>
                                <span style="color: #808080;">//before binding, will check if any of these events is previously binded to the same event</span>
                                any_binded<span style="color: #000080;">=</span><span style="color: #333399;">false</span><span style="color: #008080;">;</span>
                                <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> e<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>e<span style="color: #000080;">&lt;</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventCount</span><span style="color: #008080;">;</span>e<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
                                   <span style="color: #008000;">&#123;</span>
                                    <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;Prebind&quot;</span>,ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">Prebinds</span><span style="color: #008000;">&#91;</span>e<span style="color: #008000;">&#93;</span>,<span style="color: #008080;">&quot; bind location of complex event id &quot;</span>,ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ComplexID</span>,<span style="color: #008080;">&quot; : &quot;</span>,FindBind<span style="color: #008000;">&#40;</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ComplexID</span>,EventsQueue<span style="color: #008000;">&#91;</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">Prebinds</span><span style="color: #008000;">&#91;</span>e<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                                    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>FindBind<span style="color: #008000;">&#40;</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ComplexID</span>,EventsQueue<span style="color: #008000;">&#91;</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">Prebinds</span><span style="color: #008000;">&#91;</span>e<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #000040;">-</span>1<span style="color: #008000;">&#41;</span>
                                      <span style="color: #008000;">&#123;</span>
                                       any_binded<span style="color: #000080;">=</span><span style="color: #333399;">true</span><span style="color: #008080;">;</span>
                                       <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;One event is already binded to complex event &quot;</span>,ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ComplexID</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                                       <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
                                      <span style="color: #008000;">&#125;</span>
                                   <span style="color: #008000;">&#125;</span>
                                <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>any_binded<span style="color: #000080;">==</span><span style="color: #333399;">false</span><span style="color: #008000;">&#41;</span>
                                  <span style="color: #008000;">&#123;</span>
                                   <span style="color: #808080;">//binding event</span>
                                   <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> e<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>e<span style="color: #000080;">&lt;</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventCount</span><span style="color: #008080;">;</span>e<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
                                      <span style="color: #008000;">&#123;</span>
                                       <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;Binding simple event on &quot;</span>,ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">Prebinds</span><span style="color: #008000;">&#91;</span>e<span style="color: #008000;">&#93;</span>,<span style="color: #008080;">&quot; to &quot;</span>,ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ComplexID</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                                       BindEvent<span style="color: #008000;">&#40;</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ComplexID</span>,EventsQueue<span style="color: #008000;">&#91;</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">Prebinds</span><span style="color: #008000;">&#91;</span>e<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                                      <span style="color: #008000;">&#125;</span>                       
                                   EventsCallback<span style="color: #008000;">&#40;</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ComplexID</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #808080;">//raise complex event for user to handle                                   </span>
                                  <span style="color: #008000;">&#125;</span><span style="color: #808080;">//if (any_binded==false)                                </span>
                                <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span><span style="color: #808080;">//search exhausted for current arrangement of current complex event</span>
                                      <span style="color: #808080;">//it's either complete, so pointless to look forward</span>
                                      <span style="color: #808080;">//or one of the simple events is binded to the same complex event, again pointless</span>
                               <span style="color: #008000;">&#125;</span><span style="color: #808080;">//if (GetTickCount()-EventsQueue[ComplexEventsTable[c].ArrangementArray[a].Prebinds[...]].EventTime&lt;=ComplexEventsTable[c].TimeConstraint)</span>
                             else<span style="color: #808080;">//it's a flop: completed too late; deleting binds</span>
                               <span style="color: #008000;">&#123;</span>                                      
                                <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> f<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>f<span style="color: #000080;">&lt;</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventCount</span><span style="color: #008080;">;</span>f<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
                                   <span style="color: #008000;">&#123;</span>
                                    <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;Unbinding simple event from &quot;</span>,ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">Prebinds</span><span style="color: #008000;">&#91;</span>f<span style="color: #008000;">&#93;</span>,<span style="color: #008080;">&quot; to &quot;</span>,ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ComplexID</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                                    UnbindEvent<span style="color: #008000;">&#40;</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ComplexID</span>,EventsQueue<span style="color: #008000;">&#91;</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">Prebinds</span><span style="color: #008000;">&#91;</span>f<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                                    ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">Prebinds</span><span style="color: #008000;">&#91;</span>f<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #000040;">-</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>
                                    ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">NegationsChecked</span><span style="color: #008000;">&#91;</span>f<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #333399;">false</span><span style="color: #008080;">;</span>
                                   <span style="color: #008000;">&#125;</span><span style="color: #808080;">//for (int f=0;f&lt;ComplexEventsTable[c].ArrangementsArray[a].EventCount;f++)</span>
                                 <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span><span style="color: #808080;">//no point to look forward , time`s up already</span>
                               <span style="color: #008000;">&#125;</span><span style="color: #808080;">//else if (GetTickCount()-EventsQueue[ComplexEventsTable[c].ArrangementArray[a].Prebinds[...]].EventTime&lt;=ComplexEventsTable[c].TimeConstraint)</span>
                            <span style="color: #008000;">&#125;</span><span style="color: #808080;">//if (ComplexEventsTable[c].ArrangementsArray[a].EventCount==CrtColumn[c][a])</span>
                         <span style="color: #008000;">&#125;</span><span style="color: #808080;">//else if (bypass==true)                                                                                                 </span>
                      <span style="color: #008000;">&#125;</span><span style="color: #808080;">//if (EventsQueue[p].EventID==ComplexEventsTable[c].ArrangementsArray[a].EventArray[CrtColumn[c,a]])</span>
                    p<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
                   <span style="color: #008000;">&#125;</span><span style="color: #808080;">//while (time-EventsQueue[p].EventTime&lt;=ComplexEventsTable[c].TimeConstraint)</span>
                <span style="color: #008000;">&#125;</span><span style="color: #808080;">//for (int a=0;a&lt;ComplexEventsTable[c].ArrangementsCount;a++)</span>
            <span style="color: #008000;">&#125;</span><span style="color: #808080;">//if (ComplexEventsTable[c].ArrangementsCount!=0)</span>
         <span style="color: #008000;">&#125;</span><span style="color: #808080;">//for (int c=0;c&lt;ComplexEventsCount;c++)       </span>
&nbsp;
      <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> c<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>c<span style="color: #000080;">&lt;</span>ComplexEventsCount<span style="color: #008080;">;</span>c<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
         <span style="color: #008000;">&#123;</span>          
          <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsCount</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span>0<span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
             <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> a<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>a<span style="color: #000080;">&lt;</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsCount</span><span style="color: #008080;">;</span>a<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
                <span style="color: #008000;">&#123;</span>                     
                 <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventCount</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span>0<span style="color: #008000;">&#41;</span>
                   <span style="color: #008000;">&#123;</span> 
                    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>CrtColumn<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span><span style="color: #000080;">&lt;</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventCount</span><span style="color: #008000;">&#41;</span>
                      <span style="color: #008000;">&#123;</span>
                       <span style="color: #808080;">//removing prebinds</span>
                       <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> f<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>f<span style="color: #000080;">&lt;</span>ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">EventCount</span><span style="color: #008080;">;</span>f<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
                          <span style="color: #008000;">&#123;</span>
                           ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">Prebinds</span><span style="color: #008000;">&#91;</span>f<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #000040;">-</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>
                           ComplexEventsTable<span style="color: #008000;">&#91;</span>c<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ArrangementsArray</span><span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">NegationsChecked</span><span style="color: #008000;">&#91;</span>f<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #333399;">false</span><span style="color: #008080;">;</span>
                          <span style="color: #008000;">&#125;</span><span style="color: #808080;">//for (int f=0;f&lt;ComplexEventsTable[c].ArrangementsArray[a].EventCount;f++)                         </span>
                      <span style="color: #008000;">&#125;</span><span style="color: #808080;">//if (CrtColumn[c][a]&lt;ComplexEventsTable[c].ArrangementsArray[a].EventCount)</span>
                   <span style="color: #008000;">&#125;</span><span style="color: #808080;">//if (ComplexEventsTable[c].ArrangementsArray[a].EventCount!=0)                       </span>
                <span style="color: #008000;">&#125;</span><span style="color: #808080;">//for (int a=0;a&lt;ComplexEventsTable[c].ArrangementsCount;a++)</span>
            <span style="color: #008000;">&#125;</span><span style="color: #808080;">//if (ComplexEventsTable[c].ArrangementsCount!=0)</span>
         <span style="color: #008000;">&#125;</span><span style="color: #808080;">//for (int c=0;c&lt;ComplexEventsCount;c++)          </span>
      <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
     <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>The function contains two loops. One is the main loop, lines 13 &#8211; 117 , and the second loop is 120 &#8211; 140. The second loop has a cleanup role to be explained below.</p>
<p>The main loop will go thru the ComplexEventsTable, to check which appear. For each complex event within this table, the arrangements will be checked, and for each arrangement, a series of procedures will be performed.<br />
Inside this loop, another while loop will pass thru the EventsQueue[], (lines 23 &#8211; 115) from the first to the last, looking for events that match the time constraint of the current complex event. One of the most important variables inside this method is the CrtColumn[] array. This one stores the current pointer (current column in the unidimensional EventArray[]). Thus, the procedure checks the current required simple event from the table with the one found in the queue (line 26) , prebinds it and increases the CrtColumn[] value for the current complex event arrangement (lines 29 &#8211; 31). Since CrtColumn[] is initialized with zeros, if it finds first event, it is increased to 1. Now, if the CrtColumn[] is higher than one (meaning that the second event was found, and preparing to find the third) it is necessary to check if between the previous two events (e.g. first and the second, in this case) there are negation events (the ones that are forbidden from appearing), only if the NegationsCount[] for that specific simple event is nonzero (lines 40 &#8211; 59). If one negation event appears, it will break the search &#8211; pointless for the current arrangement. It also sets the bypass variable to true, for the following code, however that is just a programming technique to make the listing look better &#8211; the following code will be executed only if no negations appear in the meanwhile. Since events array is zero based, the maximum event that can be binded is EventCount-1, and, if CrtColumn[] for the current arrangement is equal to EventCount, then all events were prebinded. The complex event is like already done. What follows happens only if the oldest event still matches the time constraint. It will check if at least one of the pre-binded events of this pass was binded for real to the analysed complex event, already. In this case, will raise the any_binded flag to be true, and break. If the flag is not raised, then the complex event is considered completed in this arrangement, simple events are binded to the complex event , EventsCallback() is called to notify the user and current search is breaked (lines 90-96) . Otherwise, pre-binding is failed &#8211; happens too late. Events are unbinded, negations and prebinds are erased, search it&#8217;s breaked &#8211; no point to look forward if it&#8217;s too late already.</p>
<p>Then what comes is a secondary loop, lines 121 &#8211; 141. Since events are mapped from the nearest to the oldest, they are reported to the user creating incomplete complex events whose &#8220;shadowing&#8221; that manifests into future prohibiting same complex event from being reported, should it appear again, but made by other simple events. All the prebinds are removed, only definitive binds remain valid. Note, however, that the same complex event, conceptually, may be triggered more times than once, by different arrangements, if these contain completely different simple event streaks (e.g. 15 and 16  or  11 and 10 , if all four appear , meaning the same event, both arrangements will be reported as complex events with the same ID, but distinct) because the engine will not be able know if the event appeared again or these mean the same one.</p>
<p>You may question about negations, as you see negations are event specific, each event having its own negation events before it and the previous event. The current engine does not support global negations. However, if you want some events to be global negations, they have to be set up between every two consecutive simple events. The first event in the queue may have negations assigned, however these will not be checked, because there would be no known timeframe where to check for them. Negations are valid only between consecutive simple events.</p>
<p>This is a script example using the CEP engine in a test. The test consist in passing abstract events to the CEP engine. Let&#8217;s call it <strong>ceptest.mq5</strong> .</p>

<div class="wp_codebox"><table width="100%" ><tr id="p198888"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
</pre></td><td class="code" id="p1988code88"><pre class="mql5" style="font-family:monospace;"><span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #808080;">//|                                                      ceptest.mq5 |</span>
<span style="color: #808080;">//|                                        Copyright Bogdan Caramalac|</span>
<span style="color: #808080;">//|                                           http://mqlmagazine.com |</span>
<span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #339900;">#property copyright &quot;Copyright 2010, MetaQuotes Software Corp.&quot;</span>
<span style="color: #339900;">#property link      &quot;http://www.mql5.com&quot;</span>
<span style="color: #339900;">#property version   &quot;1.00&quot;</span>
&nbsp;
<span style="color: #339900;">#include &lt;CEPEngine.mqh&gt;</span>
&nbsp;
&nbsp;
<span style="color: #808080;">//our class: we needed it to override EventsCallback;</span>
<span style="color: #0000ff;">class</span> LocalCEPEngine <span style="color: #008080;">:</span> <span style="color: #0000ff;">public</span> CEPEngine
  <span style="color: #008000;">&#123;</span> 
    <span style="color: #0000ff;">void</span> EventsCallback<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">uint</span> EventID<span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
      <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;COMPLEX EVENT RECOGNIZED: &quot;</span>,EventID<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
     <span style="color: #008000;">&#125;</span>   
  <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #808080;">//the CEP engine object</span>
LocalCEPEngine myengine<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #808080;">//| Script program start function                                    |</span>
<span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #0000ff;">void</span> OnStart<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">uint</span> tickstart,tick<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">ulong</span> AbstractEvent<span style="color: #008080;">;</span>
   ComplexEvent c<span style="color: #008080;">;</span>
   <span style="color: #808080;">//setting up engine time span</span>
   myengine.<span style="color: #007788;">SetupEngineMilliseconds</span><span style="color: #008000;">&#40;</span>10000<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #808080;">//creating complex events</span>
   MakeComplexEvent<span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;10 !6 11 ; 10 12 13 ; 10 13 12&quot;</span>,1111,2000,c<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #808080;">//the event for MSFT;  </span>
   myengine.<span style="color: #007788;">AddComplexEvent</span><span style="color: #008000;">&#40;</span>c<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
   <span style="color: #808080;">//note the events with ! are negations</span>
   MakeComplexEvent<span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;5 !7 15 ; 5 !7 16 17 ; 5 !7 17 !7 !9 16&quot;</span>,2222,3000,c<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #808080;">//the event for ^GSPC;</span>
   myengine.<span style="color: #007788;">AddComplexEvent</span><span style="color: #008000;">&#40;</span>c<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> 
&nbsp;
   tickstart<span style="color: #000080;">=</span><span style="color: #8a2be2;">GetTickCount</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   tick<span style="color: #000080;">=</span>tickstart<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #808080;">//alternate tests:</span>
   myengine.<span style="color: #007788;">RaiseEvent</span><span style="color: #008000;">&#40;</span>10<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
   <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;*****************************************************************************************************************&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   myengine.<span style="color: #007788;">RaiseEvent</span><span style="color: #008000;">&#40;</span>6<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
   <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;*****************************************************************************************************************&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
   myengine.<span style="color: #007788;">RaiseEvent</span><span style="color: #008000;">&#40;</span>11<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
   <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;*****************************************************************************************************************&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   myengine.<span style="color: #007788;">RaiseEvent</span><span style="color: #008000;">&#40;</span>10<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;*****************************************************************************************************************&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   myengine.<span style="color: #007788;">RaiseEvent</span><span style="color: #008000;">&#40;</span>11<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
   <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;*****************************************************************************************************************&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>This one generates for instance the following output:</p>
<p><a href="http://mqlmagazine.com/mql-programming/mql5-implementation-of-a-simple-cep-engine/attachment/cep-engine-running/" rel="attachment wp-att-2051"><img src="http://mqlmagazine.com/wp-content/uploads/2010/05/CEP-engine-running.jpg" alt="" title="CEP engine running" width="971" height="775" class="alignnone size-full wp-image-2051" /></a></p>
<p>I invite you to check the logs, look how the system is working. Try other tests:<br />
Like this:</p>

<div class="wp_codebox"><table width="100%" ><tr id="p198889"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p1988code89"><pre class="mql5" style="font-family:monospace;"><span style="color: #808080;">//alternate tests:</span>
   myengine.<span style="color: #007788;">RaiseEvent</span><span style="color: #008000;">&#40;</span>10<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
   <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;*****************************************************************************************************************&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   myengine.<span style="color: #007788;">RaiseEvent</span><span style="color: #008000;">&#40;</span>11<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;*****************************************************************************************************************&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>Or like this:</p>

<div class="wp_codebox"><table width="100%" ><tr id="p198890"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p1988code90"><pre class="mql5" style="font-family:monospace;"><span style="color: #808080;">//alternate tests:</span>
   myengine.<span style="color: #007788;">RaiseEvent</span><span style="color: #008000;">&#40;</span>10<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
   <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;*****************************************************************************************************************&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   myengine.<span style="color: #007788;">RaiseEvent</span><span style="color: #008000;">&#40;</span>6<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
   <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;*****************************************************************************************************************&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
   myengine.<span style="color: #007788;">RaiseEvent</span><span style="color: #008000;">&#40;</span>11<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
   <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;*****************************************************************************************************************&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>Or like this:</p>

<div class="wp_codebox"><table width="100%" ><tr id="p198891"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p1988code91"><pre class="mql5" style="font-family:monospace;"><span style="color: #808080;">//alternate tests:</span>
   myengine.<span style="color: #007788;">RaiseEvent</span><span style="color: #008000;">&#40;</span>10<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
   <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;*****************************************************************************************************************&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   myengine.<span style="color: #007788;">RaiseEvent</span><span style="color: #008000;">&#40;</span>11<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
   <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;*****************************************************************************************************************&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   myengine.<span style="color: #007788;">RaiseEvent</span><span style="color: #008000;">&#40;</span>10<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;*****************************************************************************************************************&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>Or like this:</p>

<div class="wp_codebox"><table width="100%" ><tr id="p198892"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code" id="p1988code92"><pre class="mql5" style="font-family:monospace;"><span style="color: #808080;">//alternate tests:</span>
   myengine.<span style="color: #007788;">RaiseEvent</span><span style="color: #008000;">&#40;</span>10<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
   <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;*****************************************************************************************************************&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   myengine.<span style="color: #007788;">RaiseEvent</span><span style="color: #008000;">&#40;</span>11<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
   <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;*****************************************************************************************************************&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   myengine.<span style="color: #007788;">RaiseEvent</span><span style="color: #008000;">&#40;</span>10<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;*****************************************************************************************************************&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   myengine.<span style="color: #007788;">RaiseEvent</span><span style="color: #008000;">&#40;</span>11<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
   <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;*****************************************************************************************************************&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>Now you gonna ask me how to find out which combinations of simple events have to be wired up into complex events. Which complex events stay at the basis of the mid frequency algos? How to scout for them?</p>
<p>Well, I didn&#8217;t graduate Paul Wilmott&#8217;s CQF. I cannot tell you that. I am a simple romanian finance bachelor, possibly going to be fried very soon in the coming mess to the public sector where I sadly work. I gave a <strong>minor</strong> suggestion about the mechanics of this search, in the article about self-tuning systems. If you got the brains and the power to go forward, and if you believe in the face value of the things, fairness of education and other blah blah stuff &#8211; try getting yourself a Computational Finance masters &#8211; or a Quantitative Finance masters &#8211; should be opening enough. If you can&#8217;t finance one, try Finland. I see <a title="Hanken" href="http://www.hanken.fi/public/en/compfin" target="_top">Hanken</a> is pretty fair &#8211; if you have the nerve to pass thru papers and questions. Otherwise, study alone, implement at home &#8211; with all the limits coming from this!</p>
<p>File links:<br />
<a title="CEPEngine.mqh" href="http://mqlmagazine.com/wp-content/uploads/may2010/CEPEngine.mqh" target="_top">CEPEngine.mqh</a><br />
<a title="ceptest.mq5" href="http://mqlmagazine.com/wp-content/uploads/may2010/ceptest.mq5" target="_top">ceptest.mq5</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mqlmagazine.com/mql-programming/mql5-implementation-of-a-simple-cep-engine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Combinatorics in MQL5</title>
		<link>http://mqlmagazine.com/mql-programming/combinatorics-in-mql5/</link>
		<comments>http://mqlmagazine.com/mql-programming/combinatorics-in-mql5/#comments</comments>
		<pubDate>Mon, 24 May 2010 21:28:41 +0000</pubDate>
		<dc:creator>Bogdan Caramalac, MQLmagazine sr.editor</dc:creator>
				<category><![CDATA[MQL programming]]></category>

		<guid isPermaLink="false">http://mqlmagazine.com/?p=1976</guid>
		<description><![CDATA[[Versiunea romaneasca] [MQLmagazine.com in romana] [English edition]
Long time ago I wrote on my former blog about generation of permutations, however I never dwelved too much into explaining the algorithm and the code. Indeed, there are situations when combinatorics are to be applied &#8211; when scouting for arbitrages or while deploying statistics requiring asset selections as [...]]]></description>
			<content:encoded><![CDATA[<p><a title="[Versiunea romaneasca]" href="http://mqlmagazine.com/ro/programarea-in-mql/combinatorica-in-mql5" target="_top">[Versiunea romaneasca]</a> <a title="[MQLmagazine.com in romana]" href="http://mqlmagazine.com/ro" target="_top">[MQLmagazine.com in romana]</a> <a title="[English edition]" href="http://mqlmagazine.com" target="_top">[English edition]</a></p>
<p>Long time ago I wrote on my former blog about generation of permutations, however I never dwelved too much into explaining the algorithm and the code. Indeed, there are situations when combinatorics are to be applied &#8211; when scouting for arbitrages or while deploying statistics requiring asset selections as prerequisite.</p>
<p><strong>Permutations</strong></p>
<p>Permutations are quite simple to both find and generate, although math manuals quite skip these algorithms. Since permutations are <strong>specific orders</strong> in which elements of a set are arranged, that means while arranging the elements, the possibilities to arrange the remainder elements shrink. For instance if we have 4 elements in a set, after setting the first we have just 3 places left, and so on, until the last element fits automatically to the single place left. Thus, the composition of the number depicting the permutation number is done like when composing a number in another numeration base, except that the base shrinks at every step.</p>
<p>For instance we have to find  this permutation&#8217;s number:</p>
<p>|1|2|3|4|<br />
|1|4|2|3|</p>
<p>At the beginning, the numeration base is 4, and our array is empty:</p>
<p>|1|2|3|4| : mathematical notation of positions<br />
|1|4|2|3| : permutation to decypher</p>
<p>|0|0|0|0| : occupied places in the array<br />
|0|1|2|3| : places in the array (zero-based)<br />
|0|1|2|3| : count array</p>
<p>We look on the first position, 1, and read the first element, &#8220;1&#8243;. For computing reasons we use zero-based arrays.<br />
Permutation number = 1-1 = 0</p>
<p>|1|2|3|4| : mathematical notation of positions<br />
|1|4|2|3| : permutation to decypher</p>
<p>|0|0|0|0| : presently occupied places in the permutation<br />
|1|0|0|0| : occupied places in positions notation after insertion<br />
|0|1|2|3| : count array (conceptual, for counting)<br />
|x|0|1|2| : new count array for remainder elements</p>
<p>Now we look at the second element. The second element reads &#8220;4&#8243;. Then, as we have just 3 seats free, the numeration base is 3. Permutation number = (0 x 3) = 0. To this, we add the position in the count array for the element &#8220;4&#8243;, which is 2 : Permutation number = 0 + 2 = 2</p>
<p>|1|2|3|4| : mathematical notation of positions<br />
|1|4|2|3| : permutation to decypher</p>
<p>|1|0|0|0| : presently occupied places in the notation of positions<br />
|1|0|0|4| : occupied places in positions notation after insertion<br />
|x|0|1|2| : count array<br />
|x|0|1|x| : new count array for remainder elements</p>
<p>Now we look at the third element. The third element reads &#8220;2&#8243;. Then, as we have just 2 seats free, the numeration base is 2. Permutation number = (2 x 2) = 4. To this, we add the position in the count array for the element &#8220;2&#8243;, which is 0 : Permutation number = 4 + 0 = 4</p>
<p>|1|2|3|4| : mathematical notation of positions<br />
|1|4|2|3| : permutation to decypher</p>
<p>|1|0|0|4| : presently occupied places in the notation of positions<br />
|1|2|0|4| : occupied places in positions notation after insertion<br />
|x|0|1|2| : count array<br />
|x|x|0|x| : new count array for remainder elements</p>
<p>Calculation stops. We need only to insert in calculation n-1 elements. The nth element is presumed to be on the leftover place.</p>
<p>Final permutation number = 4</p>
<p>The reverse algorithm, <strong>to generate permutations from permutation numbers</strong>, is the following:<br />
Starting from base 2, we do n-1 steps of dividing the previous result by an increasing base, keeping the remainder.<br />
So we have:<br />
4 / 2 = [2], remainder 0<br />
[2] / 3 = 0, remainder 2<br />
[0] / 4 = 0, remainder 0</p>
<p>Then we start building the permutation back. We read the last remainder, and we find it to be 0. This means our first element is indeed &#8220;1&#8243;, as 0 from the count array stands for 1 in the positions array.</p>
<p>|1|2|3|4| : mathematical notation of positions<br />
|0|1|2|3| : physical subscripts in array variable<br />
|0|1|2|3| : count array<br />
|1|0|0|0| : occupied positions after current element insertion<br />
|x|0|1|2| : new count array for remainder elements<br />
|1|0|0|0| : built permutation</p>
<p>Our base shrinked to 3, as we have 3 seats left. We read the following remainder, in a reversed order, and we find it to be 2. Looking into the new count array, we see that 2 corresponds to element &#8220;4&#8243; from the mathematical notation.</p>
<p>|1|2|3|4| : mathematical notation of positions<br />
|0|1|2|3| : physical subscripts in array variable<br />
|x|0|1|2| : count array<br />
|1|0|0|4| : occupied positions after current element insertion<br />
|x|0|1|x| : new count array for remainder elements<br />
|1|4|0|0| : built permutation</p>
<p>Our base shrinked to 2, as we have 2 seats left. We read the following remainder, in a reversed order, and we find it to be 0. Looking into the new count array, we see that position 0 corresponds to element &#8220;2&#8243; from the mathematical notation.</p>
<p>|1|2|3|4| : mathematical notation of positions<br />
|0|1|2|3| : physical subscripts in array variable<br />
|x|0|1|x| : count array<br />
|1|2|0|4| : occupied positions after current element insertion<br />
|x|x|0|x| : new count array for remainder elements<br />
|1|4|0|2| : built permutation</p>
<p>We have only last element to be determined, and that is &#8220;3&#8243;, on the single free seat unoccupied.</p>
<p>|1|2|3|4| : mathematical notation of positions<br />
|0|1|2|3| : physical subscripts in array variable<br />
|x|x|0|x| : count array<br />
|1|2|3|4| : occupied positions after current element insertion<br />
|x|x|x|x| : new count array for remainder elements<br />
|1|4|3|2| : built permutation</p>
<p>Because both algorithms are quite straight, they can be implemented straight into functions. Thus, we are starting to write the <strong>Combinatorics.mqh</strong>.</p>

<div class="wp_codebox"><table width="100%" ><tr id="p197698"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
</pre></td><td class="code" id="p1976code98"><pre class="mql5" style="font-family:monospace;"><span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #808080;">//|                                                Combinatorics.mqh |</span>
<span style="color: #808080;">//|                                       Copyright Bogdan Caramalac |</span>
<span style="color: #808080;">//|                                           http://mqlmagazine.com |</span>
<span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #339900;">#property copyright &quot;Copyright Bogdan Caramalac&quot;</span>
<span style="color: #339900;">#property link      &quot;http://mqlmagazine.com&quot;</span>
&nbsp;
<span style="color: #808080;">//*************************************************</span>
&nbsp;
 <span style="color: #0000ff;">string</span> Replicate<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">string</span> s, <span style="color: #0000ff;">int</span> count<span style="color: #008000;">&#41;</span>
   <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">string</span> res<span style="color: #000080;">=</span><span style="color: #008080;">&quot;&quot;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>count<span style="color: #000080;">&lt;=</span>0<span style="color: #008000;">&#41;</span>
      <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>res<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>count<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
      <span style="color: #8a2be2;">StringConcatenate</span><span style="color: #008000;">&#40;</span>res,res,s<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>res<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #008000;">&#125;</span>
&nbsp;
 <span style="color: #0000ff;">int</span> MathDiv<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> a,<span style="color: #0000ff;">int</span> b<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
     <span style="color: #0000ff;">int</span> res<span style="color: #008080;">;</span>
     res<span style="color: #000080;">=</span>a<span style="color: #000040;">-</span><span style="color: #8a2be2;">MathRound</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">MathMod</span><span style="color: #008000;">&#40;</span>a,b<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
     res<span style="color: #000080;">=</span><span style="color: #8a2be2;">MathRound</span><span style="color: #008000;">&#40;</span>res<span style="color: #000040;">/</span>b<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
     <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>res<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
 <span style="color: #0000ff;">int</span> Round<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">double</span> a<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
     <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">MathRound</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span>a,0<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #808080;">//*************************************************</span></pre></td></tr></table></div>

<p>Usual stuff that we don&#8217;t insist on, we go forward to Permutations:</p>

<div class="wp_codebox"><table width="100%" ><tr id="p197699"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
</pre></td><td class="code" id="p1976code99"><pre class="mql5" style="font-family:monospace;"><span style="color: #808080;">//********************************************************************</span>
<span style="color: #808080;">//</span>
<span style="color: #808080;">//</span>
<span style="color: #808080;">//                             Permutations</span>
<span style="color: #808080;">//</span>
<span style="color: #808080;">//</span>
<span style="color: #808080;">//********************************************************************</span>
&nbsp;
 <span style="color: #0000ff;">long</span> Factorial<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">ushort</span> n<span style="color: #008000;">&#41;</span>
   <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">long</span> res<span style="color: #000080;">=</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #008000;">2</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>n<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
       res<span style="color: #000080;">=</span>res<span style="color: #000040;">*</span>i<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>res<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #008000;">&#125;</span>
&nbsp;
 <span style="color: #0000ff;">int</span> FindPermutation<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">ushort</span> elem, <span style="color: #0000ff;">int</span><span style="color: #000040;">&amp;</span> perm<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
     <span style="color: #0000ff;">int</span> res<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>
     <span style="color: #0000ff;">int</span> rr<span style="color: #008080;">;</span>
     <span style="color: #0000ff;">int</span> positions<span style="color: #008000;">&#91;</span>30<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
     <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;</span><span style="color: #8a2be2;">ArrayRange</span><span style="color: #008000;">&#40;</span>positions,0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
        positions<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>i<span style="color: #000040;">+</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>
     <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> e<span style="color: #000080;">=</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>e<span style="color: #000080;">&lt;</span>elem<span style="color: #008080;">;</span>e<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span><span style="color: #808080;">//we don`t look for the last element , there is one seat left</span>
        <span style="color: #008000;">&#123;</span>
         rr<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>
         <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;</span>elem<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
             <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>perm<span style="color: #008000;">&#91;</span>e<span style="color: #000040;">-</span>1<span style="color: #008000;">&#93;</span><span style="color: #000080;">==</span>i<span style="color: #000040;">+</span>1<span style="color: #008000;">&#41;</span>
               <span style="color: #008000;">&#123;</span>
                res<span style="color: #000080;">=</span>res<span style="color: #000040;">+</span>rr<span style="color: #008080;">;</span><span style="color: #808080;">//has already -1, it`s zero-based</span>
                <span style="color: #808080;">//Print(&quot;Found element &quot;,perm[e-1],&quot; to be on perm[&quot;,i,&quot;]. Adding &quot;,rr, &quot; to res, equals &quot;,res);</span>
                <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>e<span style="color: #000040;">!</span><span style="color: #000080;">=</span>elem<span style="color: #000040;">-</span>1<span style="color: #008000;">&#41;</span>
                  res<span style="color: #000080;">=</span>res<span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span>elem<span style="color: #000040;">-</span>e<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                <span style="color: #808080;">//Print(&quot;Multiplicating by elem-e (&quot;,elem-e,&quot;) = &quot;,res);                </span>
                positions<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #000040;">-</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>
               <span style="color: #008000;">&#125;</span>
             else
               <span style="color: #008000;">&#123;</span> <span style="color: #808080;">//if the searched element is not on current element,</span>
                 <span style="color: #808080;">//increment place counter only current position was not previously used;</span>
                <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>positions<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #000040;">-</span>1<span style="color: #008000;">&#41;</span>
                  rr<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
               <span style="color: #008000;">&#125;</span>
            <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span><span style="color: #808080;">//for (int e=1;i&lt;=elem;i++)</span>
      <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>res<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>  
    <span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> GeneratePermutation<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> number,<span style="color: #0000ff;">int</span> elem,<span style="color: #0000ff;">int</span> <span style="color: #000040;">&amp;</span>perm<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>    
    <span style="color: #0000ff;">string</span> elemallow<span style="color: #008080;">;</span> 
    <span style="color: #0000ff;">int</span> stoppoint,crtpoint<span style="color: #008080;">;</span>       
    <span style="color: #0000ff;">ushort</span> AscX<span style="color: #000080;">=</span><span style="color: #8a2be2;">StringGetCharacter</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;X&quot;</span>,0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> i,j,base<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> nnow<span style="color: #008080;">;</span>
    elemallow<span style="color: #000080;">=</span>Replicate<span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;a&quot;</span>,20<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    base<span style="color: #000080;">=</span><span style="color: #008000;">2</span><span style="color: #008080;">;</span>    
    nnow<span style="color: #000080;">=</span>number<span style="color: #008080;">;</span>    
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span>elem<span style="color: #000040;">-</span><span style="color: #008000;">2</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&gt;=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>i<span style="color: #000040;">--</span><span style="color: #008000;">&#41;</span>
       <span style="color: #008000;">&#123;</span>
       perm<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>Round<span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">MathMod</span><span style="color: #008000;">&#40;</span>nnow,base<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>       
       nnow<span style="color: #000080;">=</span>MathDiv<span style="color: #008000;">&#40;</span>nnow,base<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
       base<span style="color: #000080;">=</span>base<span style="color: #000040;">+</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>        
       <span style="color: #008000;">&#125;</span>
    perm<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>perm<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span><span style="color: #000040;">+</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span><span style="color: #808080;">//because first element is from 1 to elem, not 0 to elem-1    </span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>elem<span style="color: #000040;">-</span><span style="color: #008000;">2</span><span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
       <span style="color: #008000;">&#123;</span>
       <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">==</span>0<span style="color: #008000;">&#41;</span>
         <span style="color: #008000;">&#123;</span>
          <span style="color: #8a2be2;">StringSetCharacter</span><span style="color: #008000;">&#40;</span>elemallow,perm<span style="color: #008000;">&#91;</span>0<span style="color: #008000;">&#93;</span><span style="color: #000040;">-</span>1,AscX<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
         <span style="color: #008000;">&#125;</span>             
       else
          <span style="color: #008000;">&#123;</span>
          stoppoint<span style="color: #000080;">=</span>perm<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000040;">+</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>          
          crtpoint<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>
          <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>j<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>j<span style="color: #000080;">&lt;</span>elem<span style="color: #008080;">;</span>j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
             <span style="color: #008000;">&#123;</span>             
             <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">StringGetCharacter</span><span style="color: #008000;">&#40;</span>elemallow,j<span style="color: #008000;">&#41;</span><span style="color: #000080;">==</span>AscX<span style="color: #008000;">&#41;</span>
                <span style="color: #0000ff;">continue</span><span style="color: #008080;">;</span>
             else
                <span style="color: #008000;">&#123;</span>
                crtpoint<span style="color: #000080;">=</span>crtpoint<span style="color: #000040;">+</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>
                <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>crtpoint<span style="color: #000080;">==</span>stoppoint<span style="color: #008000;">&#41;</span>
                   <span style="color: #008000;">&#123;</span>
                   perm<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>j<span style="color: #000040;">+</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span><span style="color: #808080;">//write new perm[i]</span>
                   <span style="color: #8a2be2;">StringSetCharacter</span><span style="color: #008000;">&#40;</span>elemallow,j,AscX<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
                   <span style="color: #008000;">&#125;</span>                   
                <span style="color: #008000;">&#125;</span>
             <span style="color: #008000;">&#125;</span><span style="color: #808080;">//for (j=0;j&lt;elem;j++);</span>
          <span style="color: #008000;">&#125;</span><span style="color: #808080;">//else if (i=0)    </span>
        <span style="color: #008000;">&#125;</span><span style="color: #808080;">//for (i=0;i&lt;elem-2;i++)</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>elem<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
       <span style="color: #008000;">&#123;</span>
       <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">StringGetCharacter</span><span style="color: #008000;">&#40;</span>elemallow,i<span style="color: #000040;">-</span>1<span style="color: #008000;">&#41;</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span>AscX<span style="color: #008000;">&#41;</span>
          <span style="color: #008000;">&#123;</span>          
          perm<span style="color: #008000;">&#91;</span>elem<span style="color: #000040;">-</span>1<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>i<span style="color: #008080;">;</span>          
          <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
          <span style="color: #008000;">&#125;</span>
       <span style="color: #008000;">&#125;</span>        
    <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>  
    <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>This time we got lucky. Just two simple functions to call. Won&#8217;t be the case for Combinations.</p>
<p><strong>Combinations</strong></p>
<p>The combinations algorithm is way harder to understand than the permutations algorithm. The most used algorithm is the one that generates combinations in a recursive manner.</p>
<p>Let&#8217;s look at a simple combination queue: C(5,3) </p>
<p>1, 2, 3<br />
1, 2, 4<br />
1, 2, 5<br />
1, 3, 4<br />
1, 3, 5<br />
1, 4, 5</p>
<p>First of all, every element has a different freedom degree. For instance, first can&#8217;t be beyond n-k+1.<br />
Another thing, is that after you generate the first element, what you have to do then are C(n-1,k-1).<br />
For instance, C(4,2) are:</p>
<p>1, 2<br />
1, 3<br />
1, 4<br />
2, 3<br />
2, 4<br />
3, 4 </p>
<p>For each instance of these , C(3,1) are:</p>
<p>1<br />
2<br />
3</p>
<p>Now you can see how it integrates:</p>
<p>When the procedure is called to generate C(5,3) it starts enumerating the first element, from 1 to 3. Thus, it has:</p>
<p>1,(1+x)</p>
<p>Then it calls itself to generate C(4,2) , starts enumerating from 1 to 2.<br />
1,(1+1),(2+x)</p>
<p>Finally calls itself to generate C(3,1) , and completes:<br />
1,2,(2+1) = 1,2,3<br />
1,2,(2+2) = 1,2,4<br />
1,2,(2+3) = 1,2,5</p>
<p>Returns to the previous cycle and continues with C(4,2) with the following element, 2:<br />
1,(1+2),(1+2+x)</p>
<p>Starts calling C(3,1)  and completes<br />
1,3,4<br />
1,3,5</p>
<p>Then turns back to continue C(5,3) with the following element, 2.</p>
<p>The algorithm continues until first function call ends the enumeration loop.</p>
<p>The implementation of the algorithm is quite murky. This time we opted for a class. Because, since direct generation is not possible, it&#8217;s not feasible to generate all the combinations every time you want a certain combination, in the case when you may want some from a list. So, a class is needed, to provide an inner loop generating the combinations while calling a callback function to pass the user the found combinations, with the option of early terminating.</p>

<div class="wp_codebox"><table width="100%" ><tr id="p1976100"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
</pre></td><td class="code" id="p1976code100"><pre class="mql5" style="font-family:monospace;"><span style="color: #808080;">//********************************************************************</span>
<span style="color: #808080;">//</span>
<span style="color: #808080;">//</span>
<span style="color: #808080;">//                             Combinations</span>
<span style="color: #808080;">//</span>
<span style="color: #808080;">//</span>
<span style="color: #808080;">//********************************************************************</span>
&nbsp;
&nbsp;
<span style="color: #0000ff;">long</span> CombinationsTotal<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">ushort</span> n,<span style="color: #0000ff;">ushort</span> k<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>Factorial<span style="color: #008000;">&#40;</span>n<span style="color: #008000;">&#41;</span><span style="color: #000040;">/</span><span style="color: #008000;">&#40;</span>Factorial<span style="color: #008000;">&#40;</span>k<span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span>Factorial<span style="color: #008000;">&#40;</span>n<span style="color: #000040;">-</span>k<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">class</span> CombinationObject
  <span style="color: #008000;">&#123;</span>   
   <span style="color: #0000ff;">protected</span><span style="color: #008080;">:</span> 
   <span style="color: #0000ff;">long</span> counter<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">ushort</span> n,k<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">bool</span> terminate<span style="color: #008080;">;</span>   
   <span style="color: #0000ff;">ushort</span> current_combination<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
   <span style="color: #0000ff;">ushort</span> last_combination<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">bool</span> found<span style="color: #008080;">;</span>
&nbsp;
   <span style="color: #0000ff;">long</span> CombinationsTotal<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">ushort</span> n,<span style="color: #0000ff;">ushort</span> k<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">string</span> CombImage<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">ushort</span> <span style="color: #000040;">&amp;</span>ccomb<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span>,<span style="color: #0000ff;">ushort</span> n<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">void</span> GenCombinationsRec<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">ushort</span> depth,<span style="color: #0000ff;">ushort</span> nn,<span style="color: #0000ff;">ushort</span> kk<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
   <span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
   <span style="color: #0000ff;">void</span> SetupCombinationObject<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">ushort</span> nn,<span style="color: #0000ff;">ushort</span> kk<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> 
   <span style="color: #0000ff;">void</span> LoopCombinations<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">virtual</span> <span style="color: #0000ff;">void</span> CombinationsCallback<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   CombinationObject<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>SetupCombinationObject<span style="color: #008000;">&#40;</span>6,3<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>   
  <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">void</span> CombinationObject<span style="color: #008080;">::</span><span style="color: #007788;">CombinationsCallback</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span>CombImage<span style="color: #008000;">&#40;</span>current_combination,k<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> CombinationObject<span style="color: #008080;">::</span><span style="color: #007788;">SetupCombinationObject</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">ushort</span> nn,<span style="color: #0000ff;">ushort</span> kk<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   n<span style="color: #000080;">=</span>nn<span style="color: #008080;">;</span>
   k<span style="color: #000080;">=</span>kk<span style="color: #008080;">;</span>
   terminate<span style="color: #000080;">=</span><span style="color: #333399;">false</span><span style="color: #008080;">;</span>
   <span style="color: #8a2be2;">ArrayInitialize</span><span style="color: #008000;">&#40;</span>current_combination,0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #8a2be2;">ArrayInitialize</span><span style="color: #008000;">&#40;</span>last_combination,0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #8a2be2;">ArrayResize</span><span style="color: #008000;">&#40;</span>current_combination,n<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #8a2be2;">ArrayResize</span><span style="color: #008000;">&#40;</span>last_combination,n<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   counter<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">string</span> CombinationObject<span style="color: #008080;">::</span><span style="color: #007788;">CombImage</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">ushort</span> <span style="color: #000040;">&amp;</span>ccomb<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span>,<span style="color: #0000ff;">ushort</span> n<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">string</span> res<span style="color: #000080;">=</span><span style="color: #008080;">&quot;&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;</span>n<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
      res<span style="color: #000080;">=</span>res<span style="color: #000040;">+</span><span style="color: #8a2be2;">DoubleToString</span><span style="color: #008000;">&#40;</span>ccomb<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>,<span style="color: #008000;">0</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">+</span><span style="color: #008080;">&quot; &quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>res<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> CombinationObject<span style="color: #008080;">::</span><span style="color: #007788;">GenCombinationsRec</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">ushort</span> depth,<span style="color: #0000ff;">ushort</span> nn, <span style="color: #0000ff;">ushort</span> kk<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">bool</span> okay,r<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>terminate<span style="color: #000080;">==</span><span style="color: #333399;">true</span><span style="color: #008000;">&#41;</span>
     <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
&nbsp;
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>depth<span style="color: #000080;">==</span>k<span style="color: #008000;">&#41;</span>
     <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>  
&nbsp;
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>kk<span style="color: #000080;">==</span>0<span style="color: #008000;">&#41;</span>
     <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
&nbsp;
   <span style="color: #0000ff;">int</span> allows<span style="color: #000080;">=</span>nn<span style="color: #000040;">-</span>kk<span style="color: #000040;">+</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span> 
   <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">ushort</span> i<span style="color: #000080;">=</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>allows<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
      <span style="color: #008000;">&#123;</span>
       <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>terminate<span style="color: #000080;">==</span><span style="color: #333399;">true</span><span style="color: #008000;">&#41;</span>
          <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
       <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>depth<span style="color: #000080;">==</span>0<span style="color: #008000;">&#41;</span>
         current_combination<span style="color: #008000;">&#91;</span>depth<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>i<span style="color: #008080;">;</span>
       else
         current_combination<span style="color: #008000;">&#91;</span>depth<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>current_combination<span style="color: #008000;">&#91;</span>depth<span style="color: #000040;">-</span>1<span style="color: #008000;">&#93;</span><span style="color: #000040;">+</span>i<span style="color: #008080;">;</span>
&nbsp;
       GenCombinationsRec<span style="color: #008000;">&#40;</span>depth<span style="color: #000040;">+</span>1,nn<span style="color: #000040;">-</span>i,kk<span style="color: #000040;">-</span>1<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
       okay<span style="color: #000080;">=</span><span style="color: #333399;">false</span><span style="color: #008080;">;</span><span style="color: #808080;">//checking for identical combination</span>
       <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j<span style="color: #000080;">=</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>j<span style="color: #000080;">&lt;=</span>k<span style="color: #008080;">;</span>j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
          <span style="color: #008000;">&#123;</span>
           <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>current_combination<span style="color: #008000;">&#91;</span>j<span style="color: #000040;">-</span>1<span style="color: #008000;">&#93;</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span>last_combination<span style="color: #008000;">&#91;</span>j<span style="color: #000040;">-</span>1<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
             okay<span style="color: #000080;">=</span><span style="color: #333399;">true</span><span style="color: #008080;">;</span><span style="color: #808080;">//okay, new one</span>
          <span style="color: #008000;">&#125;</span>
       <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>okay<span style="color: #000080;">==</span><span style="color: #333399;">false</span><span style="color: #008000;">&#41;</span>
         <span style="color: #0000ff;">continue</span><span style="color: #008080;">;</span>
       else
         <span style="color: #008000;">&#123;</span> <span style="color: #808080;">//copying current to last</span>
          <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j<span style="color: #000080;">=</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>j<span style="color: #000080;">&lt;=</span>k<span style="color: #008080;">;</span>j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
             last_combination<span style="color: #008000;">&#91;</span>j<span style="color: #000040;">-</span>1<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>current_combination<span style="color: #008000;">&#91;</span>j<span style="color: #000040;">-</span>1<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
         <span style="color: #008000;">&#125;</span>
&nbsp;
       CombinationsCallback<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
       <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>terminate<span style="color: #000080;">==</span><span style="color: #333399;">true</span><span style="color: #008000;">&#41;</span>
         <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>      
       counter<span style="color: #000080;">=</span>counter<span style="color: #000040;">+</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>
&nbsp;
      <span style="color: #008000;">&#125;</span><span style="color: #808080;">//for (int i=1;i&lt;=allows;i++)</span>
   <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> CombinationObject<span style="color: #008080;">::</span><span style="color: #007788;">LoopCombinations</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   GenCombinationsRec<span style="color: #008000;">&#40;</span>0,n,k<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>This is a way tougher nut to crack. The interesting function here, the engine itself, is GenCombinationsRec(). The depth parameter tells the function on which level it starts generating the combinations. When depth is depleted, that is, at every end of subsequent call queue, a new combination is generated in current_combination[] and counter is increased. What the user has to do, is to inherit this class in a custom class and override the CombinationsCallback(). Also, the terminate variable is available, if that is set to true, once the CombinationsCallback() ends, all GenCombinationsRec() calls will be early terminated and program will resume execution.</p>
<p><strong>Arrangements</strong></p>
<p>Since arrangements are <strong>permutated combinations</strong>, there is no point in overcomplicating the issue. The class is almost a carbon copy of the CombinationObject class, with the difference that the recursive method here, GenArrangementsRec(), which is quite like GenCombinationsRec(), generates combinations, and then, when every one of them is ready, permutates it and serves every arrangement (permutated combination) to the ArrangementsCallback(). Simple and convenient, yet results are not in the sorted manner like with Permutations and Combinations:</p>

<div class="wp_codebox"><table width="100%" ><tr id="p1976101"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
</pre></td><td class="code" id="p1976code101"><pre class="mql5" style="font-family:monospace;"><span style="color: #808080;">//********************************************************************</span>
<span style="color: #808080;">//</span>
<span style="color: #808080;">//</span>
<span style="color: #808080;">//                             Arrangements</span>
<span style="color: #808080;">//</span>
<span style="color: #808080;">//</span>
<span style="color: #808080;">//********************************************************************  </span>
&nbsp;
<span style="color: #0000ff;">long</span> ArrangementsTotal<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">ushort</span> n,<span style="color: #0000ff;">ushort</span> k<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>Factorial<span style="color: #008000;">&#40;</span>n<span style="color: #008000;">&#41;</span><span style="color: #000040;">/</span>Factorial<span style="color: #008000;">&#40;</span>n<span style="color: #000040;">-</span>k<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">class</span> ArrangementObject
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">protected</span><span style="color: #008080;">:</span> 
   <span style="color: #0000ff;">long</span> counter<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">ushort</span> n,k<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">ushort</span> current_arrangement<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">bool</span> terminate<span style="color: #008080;">;</span>  
   <span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
   <span style="color: #0000ff;">ushort</span> current_combination<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>  
   <span style="color: #0000ff;">ushort</span> last_combination<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>     
   <span style="color: #0000ff;">bool</span> found<span style="color: #008080;">;</span>
&nbsp;
   <span style="color: #0000ff;">long</span> ArrangementsTotal<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">ushort</span> n,<span style="color: #0000ff;">ushort</span> k<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">string</span> ArrgImage<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">ushort</span> <span style="color: #000040;">&amp;</span>ccomb<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span>,<span style="color: #0000ff;">ushort</span> n<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">void</span> GenArrangementsRec<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">ushort</span> depth,<span style="color: #0000ff;">ushort</span> nn,<span style="color: #0000ff;">ushort</span> kk<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
&nbsp;
   <span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
   <span style="color: #0000ff;">void</span> SetupArrangementObject<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">ushort</span> nn,<span style="color: #0000ff;">ushort</span> kk<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> 
   <span style="color: #0000ff;">void</span> LoopArrangements<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">virtual</span> <span style="color: #0000ff;">void</span> ArrangementsCallback<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   ArrangementObject<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>SetupArrangementObject<span style="color: #008000;">&#40;</span>6,3<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>   
  <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">void</span> ArrangementObject<span style="color: #008080;">::</span><span style="color: #007788;">ArrangementsCallback</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span>ArrgImage<span style="color: #008000;">&#40;</span>current_arrangement,k<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> ArrangementObject<span style="color: #008080;">::</span><span style="color: #007788;">SetupArrangementObject</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">ushort</span> nn,<span style="color: #0000ff;">ushort</span> kk<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   n<span style="color: #000080;">=</span>nn<span style="color: #008080;">;</span>
   k<span style="color: #000080;">=</span>kk<span style="color: #008080;">;</span>
   terminate<span style="color: #000080;">=</span><span style="color: #333399;">false</span><span style="color: #008080;">;</span>   
   <span style="color: #8a2be2;">ArrayInitialize</span><span style="color: #008000;">&#40;</span>current_arrangement,0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #8a2be2;">ArrayInitialize</span><span style="color: #008000;">&#40;</span>current_combination,0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #8a2be2;">ArrayInitialize</span><span style="color: #008000;">&#40;</span>last_combination,0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #8a2be2;">ArrayResize</span><span style="color: #008000;">&#40;</span>current_combination,n<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #8a2be2;">ArrayResize</span><span style="color: #008000;">&#40;</span>current_arrangement,n<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #8a2be2;">ArrayResize</span><span style="color: #008000;">&#40;</span>last_combination,n<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>   
   counter<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
&nbsp;
&nbsp;
&nbsp;
<span style="color: #0000ff;">string</span> ArrangementObject<span style="color: #008080;">::</span><span style="color: #007788;">ArrgImage</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">ushort</span> <span style="color: #000040;">&amp;</span>ccomb<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span>,<span style="color: #0000ff;">ushort</span> n<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">string</span> res<span style="color: #000080;">=</span><span style="color: #008080;">&quot;&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;</span>n<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
      res<span style="color: #000080;">=</span>res<span style="color: #000040;">+</span><span style="color: #8a2be2;">DoubleToString</span><span style="color: #008000;">&#40;</span>ccomb<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>,<span style="color: #008000;">0</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">+</span><span style="color: #008080;">&quot; &quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>res<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> ArrangementObject<span style="color: #008080;">::</span><span style="color: #007788;">GenArrangementsRec</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">ushort</span> depth,<span style="color: #0000ff;">ushort</span> nn, <span style="color: #0000ff;">ushort</span> kk<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">int</span> perm<span style="color: #008000;">&#91;</span>30<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">bool</span> okay,r<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>terminate<span style="color: #000080;">==</span><span style="color: #333399;">true</span><span style="color: #008000;">&#41;</span>
     <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
&nbsp;
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>depth<span style="color: #000080;">==</span>k<span style="color: #008000;">&#41;</span>
     <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>  
&nbsp;
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>kk<span style="color: #000080;">==</span>0<span style="color: #008000;">&#41;</span>
     <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
&nbsp;
   <span style="color: #0000ff;">int</span> allows<span style="color: #000080;">=</span>nn<span style="color: #000040;">-</span>kk<span style="color: #000040;">+</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span> 
   <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">ushort</span> i<span style="color: #000080;">=</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>allows<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
      <span style="color: #008000;">&#123;</span>
       <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>terminate<span style="color: #000080;">==</span><span style="color: #333399;">true</span><span style="color: #008000;">&#41;</span>
          <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
       <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>depth<span style="color: #000080;">==</span>0<span style="color: #008000;">&#41;</span>
         current_combination<span style="color: #008000;">&#91;</span>depth<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>i<span style="color: #008080;">;</span>
       else
         current_combination<span style="color: #008000;">&#91;</span>depth<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>current_combination<span style="color: #008000;">&#91;</span>depth<span style="color: #000040;">-</span>1<span style="color: #008000;">&#93;</span><span style="color: #000040;">+</span>i<span style="color: #008080;">;</span>
&nbsp;
       GenArrangementsRec<span style="color: #008000;">&#40;</span>depth<span style="color: #000040;">+</span>1,nn<span style="color: #000040;">-</span>i,kk<span style="color: #000040;">-</span>1<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
       okay<span style="color: #000080;">=</span><span style="color: #333399;">false</span><span style="color: #008080;">;</span><span style="color: #808080;">//checking for identical combination</span>
       <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j<span style="color: #000080;">=</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>j<span style="color: #000080;">&lt;=</span>k<span style="color: #008080;">;</span>j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
          <span style="color: #008000;">&#123;</span>
           <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>current_combination<span style="color: #008000;">&#91;</span>j<span style="color: #000040;">-</span>1<span style="color: #008000;">&#93;</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span>last_combination<span style="color: #008000;">&#91;</span>j<span style="color: #000040;">-</span>1<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
             okay<span style="color: #000080;">=</span><span style="color: #333399;">true</span><span style="color: #008080;">;</span><span style="color: #808080;">//okay, new one</span>
          <span style="color: #008000;">&#125;</span>
       <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>okay<span style="color: #000080;">==</span><span style="color: #333399;">false</span><span style="color: #008000;">&#41;</span>
         <span style="color: #0000ff;">continue</span><span style="color: #008080;">;</span>
       else
         <span style="color: #008000;">&#123;</span> <span style="color: #808080;">//copying current to last</span>
          <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j<span style="color: #000080;">=</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>j<span style="color: #000080;">&lt;=</span>k<span style="color: #008080;">;</span>j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
             last_combination<span style="color: #008000;">&#91;</span>j<span style="color: #000040;">-</span>1<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>current_combination<span style="color: #008000;">&#91;</span>j<span style="color: #000040;">-</span>1<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
         <span style="color: #008000;">&#125;</span>
&nbsp;
&nbsp;
       <span style="color: #808080;">//here combination is final and arrangements are generated       </span>
       <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> iperm<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>iperm<span style="color: #000080;">&lt;</span>Factorial<span style="color: #008000;">&#40;</span>k<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>iperm<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
          <span style="color: #008000;">&#123;</span>
           GeneratePermutation<span style="color: #008000;">&#40;</span>iperm,k,perm<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>           
           <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> jperm<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>jperm<span style="color: #000080;">&lt;</span>k<span style="color: #008080;">;</span>jperm<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
              <span style="color: #008000;">&#123;</span>
               current_arrangement<span style="color: #008000;">&#91;</span>jperm<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>current_combination<span style="color: #008000;">&#91;</span>perm<span style="color: #008000;">&#91;</span>jperm<span style="color: #008000;">&#93;</span><span style="color: #000040;">-</span>1<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>                              
              <span style="color: #008000;">&#125;</span>                      
           ArrangementsCallback<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>                        
           <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>terminate<span style="color: #000080;">==</span><span style="color: #333399;">true</span><span style="color: #008000;">&#41;</span>
             <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>      
           counter<span style="color: #000080;">=</span>counter<span style="color: #000040;">+</span><span style="color: #008000;">1</span><span style="color: #008080;">;</span>   
          <span style="color: #008000;">&#125;</span>   
&nbsp;
       <span style="color: #008000;">&#125;</span><span style="color: #808080;">//for (int i=1;i&lt;=allows;i++)</span>
   <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>                   
  <span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> ArrangementObject<span style="color: #008080;">::</span><span style="color: #007788;">LoopArrangements</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   GenArrangementsRec<span style="color: #008000;">&#40;</span>0,n,k<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>And now a sample script (<strong>combtest.mq5</strong>). The script will display arrangements of n forex pairs taken as k, with a rising k, from 3 to n. Forex pairs are extracted at the beginning, by interogating each tradeable instrument about its calculation mode and retaining only the ones answering SYMBOL_CALC_MODE_FOREX , with the specification that symbol has to have 6 or more letters (two forex pairs and a suffix). Pairs are extracted and added to an array. Then a customized arrangements engine is called to display arrangements:</p>

<div class="wp_codebox"><table width="100%" ><tr id="p1976102"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
</pre></td><td class="code" id="p1976code102"><pre class="mql5" style="font-family:monospace;"><span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #808080;">//|                                                     combtest.mq5 |</span>
<span style="color: #808080;">//|                                       Copyright Bogdan Caramalac |</span>
<span style="color: #808080;">//|                                           http://mqlmagazine.com |</span>
<span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #339900;">#property copyright &quot;Copyright Bogdan Caramalac&quot;</span>
<span style="color: #339900;">#property link      &quot;http://mqlmagazine.com&quot;</span>
<span style="color: #339900;">#property version   &quot;1.00&quot;</span>
&nbsp;
&nbsp;
<span style="color: #339900;">#include &lt;Combinatorics.mqh&gt;</span>
&nbsp;
<span style="color: #0000ff;">int</span> CurrenciesCount<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> PairsCount<span style="color: #008080;">;</span>
<span style="color: #0000ff;">string</span> ForexPairs<span style="color: #008000;">&#91;</span>100<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #808080;">//our class: we needed it to override ArrangementsCallback;</span>
<span style="color: #0000ff;">class</span> LocalArrgClass <span style="color: #008080;">:</span> <span style="color: #0000ff;">public</span> ArrangementObject
  <span style="color: #008000;">&#123;</span> 
    <span style="color: #0000ff;">void</span> ArrangementsCallback<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
      <span style="color: #0000ff;">string</span> image<span style="color: #000080;">=</span><span style="color: #008080;">&quot;&quot;</span><span style="color: #008080;">;</span>
      image<span style="color: #000080;">=</span><span style="color: #8a2be2;">DoubleToString</span><span style="color: #008000;">&#40;</span>counter,<span style="color: #008000;">0</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">+</span><span style="color: #008080;">&quot; :&quot;</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;</span>k<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>         
         image<span style="color: #000080;">=</span>image<span style="color: #000040;">+</span><span style="color: #008080;">&quot; &quot;</span><span style="color: #000040;">+</span>ForexPairs<span style="color: #008000;">&#91;</span>current_arrangement<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000040;">-</span>1<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
      <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span>image<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>      
     <span style="color: #008000;">&#125;</span>   
  <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #808080;">//the arrangment object</span>
LocalArrgClass myarrg<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #808080;">//| Script program start function                                    |</span>
<span style="color: #808080;">//+------------------------------------------------------------------+</span>
&nbsp;
<span style="color: #0000ff;">void</span> CheckAndAddPair<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">string</span> pair<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">bool</span> found<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>PairsCount<span style="color: #000080;">==</span>0<span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
      ForexPairs<span style="color: #008000;">&#91;</span>PairsCount<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>pair<span style="color: #008080;">;</span>
      PairsCount<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
     <span style="color: #008000;">&#125;</span>
   else
     <span style="color: #008000;">&#123;</span>
      found<span style="color: #000080;">=</span><span style="color: #333399;">false</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;</span>PairsCount<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
         <span style="color: #008000;">&#123;</span>
          <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>ForexPairs<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">==</span>pair<span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
             found<span style="color: #000080;">=</span><span style="color: #333399;">true</span><span style="color: #008080;">;</span>
             <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
            <span style="color: #008000;">&#125;</span>          
         <span style="color: #008000;">&#125;</span>
      <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>found<span style="color: #000080;">==</span><span style="color: #333399;">false</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
         ForexPairs<span style="color: #008000;">&#91;</span>PairsCount<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>pair<span style="color: #008080;">;</span>
         PairsCount<span style="color: #000040;">++</span><span style="color: #008080;">;</span>               
        <span style="color: #008000;">&#125;</span> 
     <span style="color: #008000;">&#125;</span> 
   <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> OnStart<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>  
   <span style="color: #0000ff;">string</span> crtsymbol,pair1,pair2<span style="color: #008080;">;</span>
   CurrenciesCount<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>
   PairsCount<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;</span><span style="color: #8a2be2;">SymbolsTotal</span><span style="color: #008000;">&#40;</span><span style="color: #333399;">false</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
      <span style="color: #008000;">&#123;</span>
       crtsymbol<span style="color: #000080;">=</span><span style="color: #8a2be2;">SymbolName</span><span style="color: #008000;">&#40;</span>i,<span style="color: #333399;">false</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
       <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">SymbolInfoInteger</span><span style="color: #008000;">&#40;</span>crtsymbol,<span style="color: #333399;">SYMBOL_TRADE_CALC_MODE</span><span style="color: #008000;">&#41;</span><span style="color: #000080;">==</span><span style="color: #333399;">SYMBOL_CALC_MODE_FOREX</span><span style="color: #000040;">&amp;&amp;</span><span style="color: #8a2be2;">StringLen</span><span style="color: #008000;">&#40;</span>crtsymbol<span style="color: #008000;">&#41;</span><span style="color: #000080;">&gt;=</span>6<span style="color: #008000;">&#41;</span>
         <span style="color: #008000;">&#123;</span>          
          pair1<span style="color: #000080;">=</span><span style="color: #8a2be2;">StringSubstr</span><span style="color: #008000;">&#40;</span>crtsymbol,0,3<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>          
          CheckAndAddPair<span style="color: #008000;">&#40;</span>pair1<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
          pair2<span style="color: #000080;">=</span><span style="color: #8a2be2;">StringSubstr</span><span style="color: #008000;">&#40;</span>crtsymbol,3,3<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>         
          CheckAndAddPair<span style="color: #008000;">&#40;</span>pair2<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
         <span style="color: #008000;">&#125;</span>
      <span style="color: #008000;">&#125;</span><span style="color: #808080;">//for (int i=0;i&lt;SymbolsTotal(false);i++)        </span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> iarrg<span style="color: #000080;">=</span><span style="color: #008000;">3</span><span style="color: #008080;">;</span>iarrg<span style="color: #000080;">&lt;=</span>PairsCount<span style="color: #008080;">;</span>iarrg<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
       <span style="color: #008000;">&#123;</span>
        myarrg.<span style="color: #007788;">SetupArrangementObject</span><span style="color: #008000;">&#40;</span>PairsCount,iarrg<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        myarrg.<span style="color: #007788;">LoopArrangements</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>      
       <span style="color: #008000;">&#125;</span>
  <span style="color: #008000;">&#125;</span>
<span style="color: #808080;">//+------------------------------------------------------------------+</span></pre></td></tr></table></div>

<p>Here&#8217;s a peek on how it looks (though you have to stop it using terminate &#8211; otherwise it will jump some of the log):</p>
<p><a href="http://mqlmagazine.com/mql-programming/combinatorics-in-mql5/attachment/combinatorics-script-while-running/" rel="attachment wp-att-2065"><img src="http://mqlmagazine.com/wp-content/uploads/2010/05/Combinatorics-script-while-running.jpg" alt="" title="Combinatorics script while running" width="485" height="359" class="alignnone size-full wp-image-2065" /></a></p>
<p>You might ask why did we opted for permutations to use <strong>int</strong> instead of <strong>uint</strong> or <strong>long</strong>. The answer is the MathMod() and MathRound() issue. These functions don&#8217;t work with integer types. Even if they expect and return an <em>integers as meaning</em> they still work with <strong>double</strong> as type. So any convertions have to rely on a force cast of a double, which is a signed real type, as int is a signed integer type. Using unsigned integers or even longer long types that span over 8 bytes instead of just 6 like double would have overcomplicated the issue. I think these functions have to be re-engineered by MetaQuotes, to work only with integer types and to <strong>abide</strong> the received integer types that play the operands, just as <strong>div</strong> and <strong>mod</strong> work in Pascal implementations. And as for <strong>MathRound()</strong> , this must be a real rounding function that returns in the integer type that is to receive the result, or in a generic integer type, if it is used in expressions.</p>
<p>File links:<br />
<a title="Combinatorics.mqh" href="http://mqlmagazine.com/wp-content/uploads/editions/may2010/Combinatorics.mqh" target="_top">Combinatorics.mqh</a><br />
<a title="combtest.mq5" href="http://mqlmagazine.com/wp-content/uploads/editions/may2010/combtest.mq5" target="_top">combtest.mq5</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mqlmagazine.com/mql-programming/combinatorics-in-mql5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Statistical Method for Self-Tuning Trading Systems</title>
		<link>http://mqlmagazine.com/financial-modelling/a-statistical-method-for-self-tuning-trading-systems/</link>
		<comments>http://mqlmagazine.com/financial-modelling/a-statistical-method-for-self-tuning-trading-systems/#comments</comments>
		<pubDate>Mon, 24 May 2010 21:28:30 +0000</pubDate>
		<dc:creator>Bogdan Caramalac, MQLmagazine sr.editor</dc:creator>
				<category><![CDATA[Financial modelling]]></category>

		<guid isPermaLink="false">http://mqlmagazine.com/?p=1910</guid>
		<description><![CDATA[[Versiunea romaneasca] [MQLmagazine.com in romana] [English edition]
I am starting to write this article in the idea that it might become useful in a not too far time horizon. I have been thinking at this for some time. The autotuning is an idea that is out there for some while, however the extreme complexity of retail [...]]]></description>
			<content:encoded><![CDATA[<p><a title="[Versiunea romaneasca]" href="http://mqlmagazine.com/ro/modelare-financiara/o-metoda-statistica-pentru-autoreglarea-sistemelor-de-trading" target="_top">[Versiunea romaneasca]</a> <a title="[MQLmagazine.com in romana]" href="http://mqlmagazine.com/ro" target="_top">[MQLmagazine.com in romana]</a> <a title="[English edition]" href="http://mqlmagazine.com" target="_top">[English edition]</a></p>
<p>I am starting to write this article in the idea that it might become useful in a not too far time horizon. I have been thinking at this for some time. The autotuning is an idea that is out there for some while, however the extreme complexity of retail trading systems approach made it quite inapplicable. However, HFT trading systems are generally simple, and quite similar rules are applied to hundreds of equities, in a parametrized fashion. Thus, if rules are simple and can be written in &#8220;<strong>when</strong> this, <strong>do</strong> that , <strong>resulting</strong> this&#8221; instead of maze-like logics of retail systems, then a set of optimal statistics on the entry data (spanning over an array of quotes, orderbook data and so on) is the premise for simple operations like quoting, getting filled, taking profit or stop loss in just a few ticks away. As seen in the previous Progress Apama article, these algorithms are highly unstable, therefore there is a constant run for newer algorithms. </p>
<p>Now you may ask, why would we attempt autotuning of trading systems if the institutionals do not (at least on the HFT level). Thing is, some of their algos are so fast that <strong>they might not even have time enough to record the data in a database</strong>, so automatic tuning, that requires extra analysis, might be a complete waste of time, with a too small improvement brought to the algos compared to the extra latency that is forming up. <strong>What will be coming in these articles has therefore an experimental nature and doesn&#8217;t have to be taken as a solution, rather an attempt &#8211; I cannot tell for sure if there is any point in attempting to find, with regular statistics, recurring parameters of a stochastic process.</strong> </p>
<p>So, let&#8217;s presume that an array of parameters (such as individual volatilities, moving averages, executions volume, etc.), is to be fed to a database or to an inner storing array. We have to take into account the fact that a trading signal may exist permanently, at every tick. Supposing the volume to be constant, then same signal can be wired into two actions: either buy or sell. Each signal will therefore have two results, one for buying, one for selling. We could however create separate rules for selling.</p>
<p>For instance, a signal comprised of a volatility and the distance between mid quote and mid quotes moving average comes with: 0.03 stddev &#038; 2 ticks. To twist it a bit, we introduce quoting, and we note 0 for no fill. Wired into a buy with a 3 tick take profit and 2 tick stop loss, at a given time, makes 2 ticks profit, wired into a sell it is not filled. So the buys database will be added a (0.03 ; 2 ; 2) and the sells (0.03 ; 2 ; 0). </p>
<p>And now the things become interesting. At the end, after the data is gathered for a mass of signals that make up the &#8220;big number&#8221; for the statistics, we have to look thru the database. First, a simple watch will group the database by action and result. In this case, we have six final states:</p>
<p>1. BUY: quote, get filled, take profit (BQFT)<br />
2. BUY: quote, get filled, stop loss (BQFS)<br />
3. BUY: quote, don&#8217;t get filled, cancel order (BQC)<br />
4. SELL: quote, get filled, take profit (SQFT)<br />
5. SELL: quote, get filled, stop loss (SQFS)<br />
6. SELL: quote, don&#8217;t get filled, cancel order (SQC)</p>
<p>So we have six cases. Analysing BUY with quote, get filled, take profit, is just one of the six states and will comprise a large part of data, the same as the other states. The purpose of the statistical analysis is to have a statistic prepaired per each case. For instance, our case should look, in the end, like:</p>
<p>0.03, 2 :  45% BQFT, 35% BQSL, 20% BQC ; 30% SQFT, 30% SQSL, 40% SQC</p>
<p>After the intial mass of signals along with results is collected, statistics have to be deployed for each combination of the parameters. Having real numbers as parameters, with lots of digits , will lead to the fact that you may have actually a number of cases equal to the number of signals that were the input, rendering statistics impossible. So, there has to be applied some data aggregation. For instance, for each parameter set, can be calculated the quartiles then the number of bins with the Freedman-Diaconis formula (this is an example, other methods can be applied). This will yield up a different number of bins for each of the parameters. Then a new array will be created, where each case will have a sticker denoting its number of bins. For instance the 0.03 stddev is labeled as &#8220;Bin 1&#8243; on the stddev scale and the 2 tick distance is labeled as &#8220;Bin 2&#8243; on the tick distance scale. The total number of cases may be smaller or equal than the product of bins count per each criteria. If you have 3 criterias and 10 bins each, that may be even 1000 number of cases. More likely, a core number of cases will have a lot of situations recorded, while others will barely have one situation recorded. However, the more platykurtic the repartition of situations per cases, the more enforced the need for a &#8220;bigger number&#8221; of situations. After applying the statistics, our database statistics will look like:</p>
<p>Bin 1, Bin 2 :  45% BQFT, 35% BQSL, 20% BQC ; 30% SQFT, 30% SQSL, 40% SQC</p>
<p>What is important is that <strong>relevant statistics</strong> is to be extracted. If this is the current case, what would be the trading decision? Go for a buy with a chance of take profit in 45% of the situations this case appears? Only that it has to stand to 35% stop losses&#8230; Because on the sell side it&#8217;s even worse, with stop losses situations roughly equal to take profit ones. This case has to be decided as a <strong>buy</strong> case, although <strong>with reserves</strong>. Unless the profits are relevant enough, there is no decision to be taken. Nevertheless, <strong>it is mandatory for the algo to have a decision module that picks only relevant cases for trading</strong>. But <strong>how fast can the machine be</strong>, because after the initial data is gathered, each new signal, (that can be even a new tick, in a HFT-like algo), will trigger a massive recalculation of bin sizes on the entire database, <strong>to update the statistics, and at the same time to allow the delivering and execution of the trading decision in real time?</strong></p>
<p><em>Remember my article about the CEP engine. The CEP is visioned there as a recognition &#8211; trigger module, but what if the CEP is first used as a recording device ? What if the CEP is wired to the statistics engine? How much latency would this add to the calculus? Can we still talk about real time?</em></p>
]]></content:encoded>
			<wfw:commentRss>http://mqlmagazine.com/financial-modelling/a-statistical-method-for-self-tuning-trading-systems/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Progress Apama : How Deep Does HFT&#8217;s Rabbit Hole Go ?</title>
		<link>http://mqlmagazine.com/other-platforms/progress-apama-how-deep-does-hft-rabbit-hole-go/</link>
		<comments>http://mqlmagazine.com/other-platforms/progress-apama-how-deep-does-hft-rabbit-hole-go/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 19:34:46 +0000</pubDate>
		<dc:creator>Bogdan Caramalac, MQLmagazine sr.editor</dc:creator>
				<category><![CDATA[Other platforms]]></category>
		<category><![CDATA[apama]]></category>
		<category><![CDATA[hft]]></category>
		<category><![CDATA[platform]]></category>
		<category><![CDATA[progress]]></category>
		<category><![CDATA[studio]]></category>

		<guid isPermaLink="false">http://mqlmagazine.com/?p=1319</guid>
		<description><![CDATA[[Versiunea romaneasca] [MQLmagazine.com in romana] [English edition]
This month, while waiting for the new Strategy Tester, I felt myself pretty void of ideas. I realised that the content that we produce is effectively drying out. The backtest is the creed of the trader, what gives him confidence in the trading strategies that he attempts.
By the mid [...]]]></description>
			<content:encoded><![CDATA[<p><a title="[Versiunea romaneasca]" href="http://mqlmagazine.com/ro/alte-platforme/progress-apama-cat-de-adanca-e-gaura-de-iepure-a-hft/" target="_top">[Versiunea romaneasca]</a> <a title="[MQLmagazine.com in romana]" href="http://mqlmagazine.com/ro" target="_top">[MQLmagazine.com in romana]</a> <a title="[English edition]" href="http://mqlmagazine.com" target="_top">[English edition]</a></p>
<p>This month, while waiting for the new Strategy Tester, I felt myself pretty void of ideas. I realised that the content that we produce is effectively drying out. The backtest is the <strong>creed</strong> of the trader, what gives him <strong>confidence</strong> in the trading strategies that he attempts.</p>
<p>By the mid of march I stumble upon some Progress Apama recorded webinars entitled <strong>&#8220;Build Quickly, Run Fast&#8221;</strong> and <strong>&#8220;From Concept to Profit in No Time Flat&#8221;</strong>. Sure, our study objective is not the Progress Apama platform. That is an institutional, high frequency platform, that we&#8217;ll never put our hands on, however it&#8217;s interesting to see more of their approach on HFT, as well as some of their concepts in both building and running. Not even big market players use it, but a very tiny elite of them, <em>la crème de la crème</em>, since they have about 120 clients globally.</p>
<p>Problem, is HFT is becoming mainstream in institutional trading. And when the institutionals are doing something, better open the ears wider, cause they&#8217;re always getting all the money and they&#8217;re probably right!According to a Tabb Group research, <strong>HFT firms in US are just 2% of 20K trading firms, and make up 73% of the total equity volume traded.</strong> It&#8217;s looking like the entire equity market is under a &#8220;hostile takeover&#8221; from HFT, and the process will not stop. More and more trading firms are getting new trading technologies, or, if not possible, at least new HFT-like algos to run on their own platforms, so this trend will not stop. It is important that the retail environment remains aware of what is out there, so it would not have the market perception completely distorted by paradigms too old to fit the current developments.</p>
<p>It seems that , from the beginning of markets, traders always struggled for latency, to be the first in getting a certain trade. The first example that comes in my mind is Nathan Rothschild, that found out the first that Napoleon was defeated at Waterloo and lead the entire market into believing that Napoleon was victorious to crash it enough for him to buy it a pound for a penny. Another example more close to our days is the character from <strong>&#8220;Reminiscences of a stock operator&#8221;</strong> who loses his grip on the market and cuts his latency by using the newly technology of the time, the telex. With every major innovation in telecom and computing, a new layer was added, and what it was in years before the known <strong>level II markets</strong>, where human traders were manually placing and executing trades, is now the realm of high frequency trading machines. At first, it was all about seconds &#8211; as it is the case for fellow MetaTrader folks &#8211; then they started going deeper and deeper to milliseconds, microseconds, and even nanoseconds, that they think about right now. <strong>This happened because HFT technologies adapted, and modified market behaviours on every time layer : when milliseconds started to become available, the algos running on slower stations to become faulty, now, when it is microseconds time, the current millisecond-based stations are in the process of upgrading, and tomorrow, nanosecond-based stations will replace the ones working on millisecond level.</strong> </p>
<p><em>Let me be sarcastic here a bit: a microsecond is 10^-6 of a second, and a nanosecond is 10^-9. There is a very long technology road towards the Planck time, which is supposed to be the minimum amount of time: 5.4 × 10^-44 s. At the current rate, we should expect latency being cut by 2 powers of 10 by year, unless something really happens to change the curvature of latency cut.</em></p>
<p>What happens to algorithms due to improvements in execution and expansion of HFT desks? As Louis Lovas, Chief Architect for Progress Apama, explains <strong> &#8220;it becomes either obsolete , reverse engineered, or the spreads become so tight that is no longer profitable&#8221;</strong></p>
<p>Dan Hubscher, Principal Product Marketing Manager &#8211; Capital Markets for Progress Apama citing an AITE Group research, says that <strong>&#8220;even in a relatively stable environment, the lifespan of an algorithm can be as short as three months&#8221;</strong>. This was the reason for developing the Progress Apama Studio, a rapid strategy development environment. Because if the lifetime of an algo is limited, it&#8217;s logical that if you cut it&#8217;s development time you get extra profits by running that system for a longer time, with the extra time gained when others are struggling to replicate it on other platforms with worser development environments.</p>
<p>The following is an example from their demo. The strategy is a Statistical Arbitrage between two stocks. A mean is calculated , along with Bollinger Bands at 1.8 standard deviations. The following screen depicts the strategy running in one selected instance (Bank of America vs Citigroup) , and the Scenario Instances window below shows what is the algo doing on each instance (first line is Caterpillar vs Chevron, second is Bank of America vs Citigroup). It is a predefined strategy, it comes as a template with the station, there is nothing secretive and important about it.</p>
<p><a href="http://mqlmagazine.com/other-platforms/progress-apama-how-deep-does-hft-rabbit-hole-go/attachment/apama-algorithmic-trading-accelerator/" rel="attachment wp-att-1338"><img src="http://mqlmagazine.com/wp-content/uploads/2010/03/Apama-Algorithmic-Trading-Accelerator.jpg" alt="" title="Apama Algorithmic Trading Accelerator" width="660" height="718" class="alignnone size-full wp-image-1338" /></a></p>
<p><strong>A few notes about the strategy.<br />
1. As you can see, only one spread was set up to be displayed &#8211; and you&#8217;ll see below, strangely, they picked the spread between mid prices. Normally, if the strategy would be based on market executions, you have at least two spreads to monitor, and the exit criteria would use the spread which is opposite to the one taken ; if the strategy would be based on quoting, there are four spreads to monitor.<br />
2. The quantities are predetermined, as parameters, first is 10, second is 20. The algo doesn&#8217;t adjust them by hedge ratios.<br />
3. I can see no tick count or time span of ticks used for average and Bollinger Band calculus.<br />
4. The max quantity fields are used for position control. Yes, that hated position that MT5 has too now. If you look at Scenario Instances, in the Current Position fields, you can see that they are not 10 and 20, it&#8217;s not having only these quantities at a time, rather positions are bulked up with new and new orders of 10 and 20, until closed or touch the max quantity parameter. Such order bulking may appear if one of the Bollinger Bars is crossed repeatedly without the touch of the other bar.<br />
5. The order timeout seems to have the role of a position decay, positions being flattened after 20 sec. It can&#8217;t be an execution timeout because a second is a century now in HFT, and waiting 20 sec for an order confirmation doesn&#8217;t sound to me HFT at all. Or was I wrong about HFT ? See the article about MetaTrader , <a href="http://mqlmagazine.com/metatrader5/tick-data-charting-why-not-a-level-ii-metatrader/" target="_top">Tick Data &#038; Charting : Why Not a Level II MetaTrader ?</a> !<br />
6. Note the time scale of the chart. There are 12 seconds between time labels, and there seem to be from 3 to 7 executions per interval. Know any EA trading like that?</strong></p>
<p>What is interesting in Progress Apama is how strategies are built. Strategies can be built even without coding , but unlike environments in other fields, that attempt building without coding, Progress Apama comes with a complex, yet simple to use concept. As Dan Hubscher says, <strong>&#8220;according to AITE Group, the amount of time it takes to develop a new algorithm, from data acquisition and analysis, to strategy deployment, and thru to production is typically 10 to 28 weeks&#8221;</strong>. So it was quite natural to come with rapid application environment, because this is the problem that hits other direct competitors on the institutional platform market, and put Progress Apama into a more favorable position. In their development system, all variables that have to be either directly watched, or calculated, originate from smart blocks, in a block diagram. Each block takes data , either from the market or from another block, and outputs it as an input for another block, generating at the same time internal variables (which you can see in the green panel on the right). </p>
<p><a href="http://mqlmagazine.com/other-platforms/progress-apama-how-deep-does-hft-rabbit-hole-go/attachment/apama-event-modeler/" rel="attachment wp-att-1322"><img src="http://mqlmagazine.com/wp-content/uploads/2010/03/Apama-Event-Modeler.jpg" alt="" title="Apama Event Modeler" width="949" height="711" class="alignnone size-full wp-image-1322" /></a></p>
<p>Then the strategy is designed on a workflow basis, kinda similar to the diagrams used when learning algorithmics. Each block contains conditions and commands written in <strong>plain english</strong>, all conditions , commands and variables being selectable from a menu appearing upon right clicking.</p>
<p><a href="http://mqlmagazine.com/other-platforms/progress-apama-how-deep-does-hft-rabbit-hole-go/attachment/apama-event-modeler-diagrams/" rel="attachment wp-att-1331"><img src="http://mqlmagazine.com/wp-content/uploads/2010/03/Apama-Event-Modeler-Diagrams.jpg" alt="" title="Apama Event Modeler - Diagrams" width="950" height="709" class="alignnone size-full wp-image-1331" /></a></p>
<p>As you can see, it has a pretty fancy development environment, that has to answer quick to the ever expanding ideas and complexity degree of trading algorithms, but the real power of the station unleashes when running the strategies. This is what makes it a top notch platform.</p>
<p><strong>The Statistical Arbitrage example is quite simple</strong>, as it follows the spread as its driver. But real HFT strategies are more complicated, each strategy may be following asynchronous events that happen on multiple assets:</p>
<p><a href="http://mqlmagazine.com/other-platforms/progress-apama-how-deep-does-hft-rabbit-hole-go/attachment/progress-apama-algorithmic-trading-rule/" rel="attachment wp-att-1365"><img src="http://mqlmagazine.com/wp-content/uploads/2010/03/Progress-Apama-Algorithmic-Trading-Rule.jpg" alt="" title="Progress Apama - Algorithmic Trading Rule" width="973" height="729" class="alignnone size-full wp-image-1365" /></a></p>
<p><strong>When did we ever have such an approach ? When did it matter the <strong>time restraint</strong> in which the signals were supposed to come? Oh, I forgot, we didn&#8217;t even have the backtester&#8230;</strong><br />
An interesting thing to note about their view, is the <strong>WHEN</strong> approach. Repeated times, Dan Hubscher and Louis Lovas explain that <strong>WHEN is not the same as IF</strong>. No comment.</p>
<p>To make this kind of conditions usable for the strategy designer, Progress Apama comes with a smart thing called Complex Event Processing:</p>
<p><a href="http://mqlmagazine.com/other-platforms/progress-apama-how-deep-does-hft-rabbit-hole-go/attachment/progress-apama-complex-event-processing/" rel="attachment wp-att-1372"><img src="http://mqlmagazine.com/wp-content/uploads/2010/03/Progress-Apama-Complex-Event-Processing.jpg" alt="" title="Progress Apama - Complex Event Processing" width="973" height="729" class="alignnone size-full wp-image-1372" /></a></p>
<p>Dan Hubscher defines Complex Event Processing as <strong>&#8220;the ability to relate two or more events, even if these events occur in a span of time, and then determining meaning from that relationship immediately, such as detecting a trading signal, or an alpha-generating profit opportunity&#8221;.</strong></p>
<p><strong>But we don&#8217;t even have OnNews(), ain&#8217;t that right?</strong>&#8230;</p>
<p>It&#8217;s clear, that <strong>&#8220;immediately&#8221;</strong> word there means that you must have the lowest possible latency. I believe that the CEP can be translated into MetaTrader, by starting from OnChart() and OnTrade() implementations, like the ones from my past articles, and transforming these methods into Complex Event Processors, that translate tick and trade events into intelligible events, such as &#8220;MSFT above 10-second Bollinger Band&#8221;, followed by a time stamp, and put into a queue. The queue might be then taken over by another procedure, that applies the time constraints, generates signals, and passes them to decision modules. Check our article <a href="http://mqlmagazine.com/financial-modelling/anatomy-of-a-simple-cep-engine/" target="_top">Anatomy of a simple CEP engine</a>.</p>
<p>However, the thing that makes Progress Apama the million buck machine is none of these things, because these are simple tools, that can be used by retail stations too, if their developers would include such facilities. Sure, the rapid development tools matter only when compared with competitors. However, it is the ability to run these strategies in hundredths of instancies, taking advantage of multicore infrastructures, without losing the latency advantage. And this is done by Event Correlator(s).</p>
<p><a href="http://mqlmagazine.com/other-platforms/progress-apama-how-deep-does-hft-rabbit-hole-go/attachment/progress-apama-scalability-features/" rel="attachment wp-att-1398"><img src="http://mqlmagazine.com/wp-content/uploads/2010/03/Progress-Apama-Scalability-Features.jpg" alt="" title="Progress Apama - Scalability Features" width="974" height="730" class="alignnone size-full wp-image-1398" /></a></p>
<p>Progress Apama has also a programming feature. They come with the proprietary Monitor Script language, a Java-like language, although simpler, side by side with a full Java implementation:</p>
<p><a href="http://mqlmagazine.com/other-platforms/progress-apama-how-deep-does-hft-rabbit-hole-go/attachment/progress-apama-programming-languages/" rel="attachment wp-att-1534"><img src="http://mqlmagazine.com/wp-content/uploads/2010/03/Progress-Apama-Programming-Languages.jpg" alt="" title="Progress Apama - Programming Languages" width="973" height="730" class="alignnone size-full wp-image-1534" /></a></p>
<p>As I said above, I include below parts of the Statistical Arbitrage code , the ones that explain the core of the strategy, found in the webinar:</p>
<p><a href="http://mqlmagazine.com/other-platforms/progress-apama-how-deep-does-hft-rabbit-hole-go/attachment/progress-apama-statistical-arbitrage-begintrading-action/" rel="attachment wp-att-1573"><img src="http://mqlmagazine.com/wp-content/uploads/2010/03/Progress-Apama-Statistical-Arbitrage-beginTrading-action.jpg" alt="" title="Progress Apama - Statistical Arbitrage beginTrading action" width="690" height="507" class="alignnone size-full wp-image-1573" /></a></p>
<p>This is the beginTrading() action, that quite shows the candies of MonitorScript. As you can see, the <em>route</em> in this case, are getting the data from the market. Bust most important here, is the <em>on</em> statement. This statement defines <strong>listeners</strong>, having a syntax like:</p>

<div class="wp_codebox"><table width="100%" ><tr id="p1319104"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1319code104"><pre class="mql5" style="font-family:monospace;">on <span style="color: #008000;">&#91;</span>all<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&lt;</span>event expression<span style="color: #000080;">&gt;</span> <span style="color: #000080;">&lt;</span>action part<span style="color: #000080;">&gt;</span></pre></td></tr></table></div>

<p>The first <em>on</em> that you see checks for the destruction of the instance by the user (in a similar manner to WM_CLOSE being sent to WindowProc() ), then it removes the variables and closes the instance. The secondary <em>on</em> is more interesting. Here, the second and the third one are written in a quite redundant manner, because the first condition which is an <em>and</em> is replicated inside the code, with an <em>or</em>. As Louis Lovas notes in the comment , <em>&#8220;Make sure we have at least one tick from each before moving on&#8221;</em> it might appear that the Depth() event is triggered by a new tick, but it actually seems that the Depth() event is triggered when the <em>structure of the orderbook changes</em>, meaningly when at least one volume changes on either the Bid or the Ask side, not only when a tick comes (change in core Bid/Ask). Depth() seems to trigger similarly to the OnBookEvent() that was not yet completed by MetaQuotes, which I explained in other articles that should trigger way more frequent than OnTick(). Leaving this comparison aside and continuing with the code, see the second condition, which is written by Louis just to show how flexible is the syntax, and then, what it triggers, the processNextSpread() action.<br />
An interesting thing is to be remarked about listeners. By looking at the listeners we see a very advanced syntax, way beyond the rigidity of the event-driven system that MetaQuotes is struggling to produce, and which exists in other stations. First, the <strong>listeners apply to every kind of event</strong> that is linked to subscribed data. Beyond this, the event description appears in the listener condition, and it can be anything. Even if you would like to get a tick on another instrument in MT5 you need to run a separate EA (daca nu cumva va deveni posibil prin OnBookEvent() ) because OnTick() answers only to current instrument. At the same time, <strong>each listener is event condition &#8211; action implementation</strong>, deployable quite everywhere inside the code, giving a high degree of freedom to the programmer, whereas in the event driven model, the treating for every event type is confined within a single code body, where it analyses all the possible events of that type, which, if translated in MonitorScript, would mean that all listeners working with a certain event type would have to reside in a single code body.</p>
<p><a href="http://mqlmagazine.com/other-platforms/progress-apama-how-deep-does-hft-rabbit-hole-go/attachment/progress-apama-statistical-arbitrage-monitor-core/" rel="attachment wp-att-1547"><img src="http://mqlmagazine.com/wp-content/uploads/2010/03/Progress-Apama-Statistical-Arbitrage-Monitor-Core.jpg" alt="" title="Progress Apama - Statistical Arbitrage Monitor Core" width="614" height="512" class="alignnone size-full wp-image-1547" /></a></p>
<p>As you can see, the spread is really calculated with the mid prices. What&#8217;s more important, is that the method incapsulates all the strategy itself, and you can see how it sends orders, without checking previous orders, thus demonstrating once again the positional system.</p>
<p><a href="http://mqlmagazine.com/other-platforms/progress-apama-how-deep-does-hft-rabbit-hole-go/attachment/progress-apama-statistical-arbitrage-submit-order-action/" rel="attachment wp-att-1548"><img src="http://mqlmagazine.com/wp-content/uploads/2010/03/Progress-Apama-Statistical-Arbitrage-Submit-Order-Action.jpg" alt="" title="Progress Apama - Statistical Arbitrage Submit Order Action" width="526" height="476" class="alignnone size-full wp-image-1548" /></a></p>
<p>Seems the entire SubmitOrder() action has been written with the purpose of updating strategy variables. Probably the entire code could have rested inside processNextSpread(). Strangely, the position variables are calculated , by adding or subtracting volume, instead of simply using a function to retrieve the position per each instrument, in the parts of the code where this is necessary. What is not clear in the code is where the maximum position constraints apply, as well as the order timeout.</p>
<p>What is essential about Progress Apama is that it can <strong>run millions rules concurrently</strong> and <strong>make use of multiple cores environments</strong>.</p>
<p>Here you can see a strategy with simulated data running in 500 instances on a quad core machine:</p>
<p><a href="http://mqlmagazine.com/other-platforms/progress-apama-how-deep-does-hft-rabbit-hole-go/attachment/progress-apama-500-instances/" rel="attachment wp-att-1397"><img src="http://mqlmagazine.com/wp-content/uploads/2010/03/Progress-Apama-500-instances.jpg" alt="" title="Progress Apama - 500 instances" width="1063" height="523" class="alignnone size-full wp-image-1397" /></a></p>
<p>So , if Louis Lovas says that it works on a quad core machine, and we don&#8217;t have any reason not to believe it, means that Irene Aldridge was right, and <strong>gamers ever increasing requirements pushed the hardware to the point that machines able to run HFT are in every home</strong> ; but , <strong>which broker will give you low latency for your poor retail account</strong> and where will you get from a platform that mustn&#8217;t <strong>waste</strong> processor resources?</p>
<p>Of course, we will never be able to do that. MetaTrader folks don&#8217;t even have the cash to meet the margin requirements of running portfolios that rebuild indexes with required weights, so low latency trading is out of discussion. MetaTrader will never ever have low latency. However, some high frequency trading elements, such as algos and complex event processing for low scaled strategies, that span on a very limited number of assets, can be ported there. The purpose of this article was to introduce readers in the HFT world and its specific issues.</p>
]]></content:encoded>
			<wfw:commentRss>http://mqlmagazine.com/other-platforms/progress-apama-how-deep-does-hft-rabbit-hole-go/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tick Data &amp; Charting : Why Not a Level II MetaTrader ?</title>
		<link>http://mqlmagazine.com/metatrader5/tick-data-charting-why-not-a-level-ii-metatrader/</link>
		<comments>http://mqlmagazine.com/metatrader5/tick-data-charting-why-not-a-level-ii-metatrader/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 19:34:35 +0000</pubDate>
		<dc:creator>Bogdan Caramalac, MQLmagazine sr.editor</dc:creator>
				<category><![CDATA[MetaTrader5]]></category>

		<guid isPermaLink="false">http://mqlmagazine.com/?p=1482</guid>
		<description><![CDATA[[Versiunea romaneasca] [MQLmagazine.com in romana] [English edition]
You should view this article as a continuation of the one about Progress Apama, because it brings institutional issues to MetaTrader5. If you look at that Statistical Arbitrage strategy, you&#8217;ll see it doesn&#8217;t have but an execution at 1-2 seconds at most. So, that doesn&#8217;t seem HFT at all. [...]]]></description>
			<content:encoded><![CDATA[<p><a title="[Versiunea romaneasca]" href="http://mqlmagazine.com/ro/metatrader5/tick-data-charting-de-ce-nu-un-metatrader-de-nivel-ii/" target="_top">[Versiunea romaneasca]</a> <a title="[MQLmagazine.com in romana]" href="http://mqlmagazine.com/ro" target="_top">[MQLmagazine.com in romana]</a> <a title="[English edition]" href="http://mqlmagazine.com" target="_top">[English edition]</a></p>
<p>You should view this article as a continuation of the one about Progress Apama, because it brings institutional issues to MetaTrader5. If you look at that Statistical Arbitrage strategy, you&#8217;ll see it doesn&#8217;t have but an execution at 1-2 seconds at most. So, that doesn&#8217;t seem HFT at all. But becomes HFT in the context of running this in 500 instances &#8211; because it will have hundreds of executions per second. However, if you keep up to 10-20 instances, is something that <strong>MetaTrader5 can handle</strong>.</p>
<p>That strategy inspired me to think about an indicator that draws tick charts. Sure, you can view a tick chart, but in the Market Watch, by clicking on &#8220;Tick Chart&#8221; near &#8220;Symbols&#8221;. But what if you want to see more than one at a time? So I wrote an indicator to do it. However I did it quite poor, and Rosh (Rashid Umarov) came to the rescue. This is the indicator body, modified after inserting levels:</p>

<div class="wp_codebox"><table width="100%" ><tr id="p1482106"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
</pre></td><td class="code" id="p1482code106"><pre class="mql5" style="font-family:monospace;"><span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #808080;">//|                                                        Ticks.mq5 |</span>
<span style="color: #808080;">//|                        Copyright 2010, MetaQuotes Software Corp. |</span>
<span style="color: #808080;">//|                                              http://www.mql5.com |</span>
<span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #339900;">#property copyright &quot;2010, MetaQuotes Software Corp.&quot;</span>
<span style="color: #339900;">#property link      &quot;http://www.mql5.com&quot;</span>
<span style="color: #339900;">#property version   &quot;1.00&quot;</span>
<span style="color: #339900;">#property indicator_separate_window</span>
<span style="color: #339900;">#property indicator_buffers 2</span>
<span style="color: #339900;">#property indicator_plots   2</span>
<span style="color: #808080;">//--- plot Bid</span>
<span style="color: #339900;">#property indicator_label1  &quot;Bid&quot;</span>
<span style="color: #339900;">#property indicator_type1   DRAW_LINE</span>
<span style="color: #339900;">#property indicator_color1  Blue</span>
<span style="color: #339900;">#property indicator_style1  STYLE_SOLID</span>
<span style="color: #339900;">#property indicator_width1  1</span>
<span style="color: #808080;">//--- plot Ask</span>
<span style="color: #339900;">#property indicator_label2  &quot;Ask&quot;</span>
<span style="color: #339900;">#property indicator_type2   DRAW_LINE</span>
<span style="color: #339900;">#property indicator_color2  Red</span>
<span style="color: #339900;">#property indicator_style2  STYLE_SOLID</span>
<span style="color: #339900;">#property indicator_width2  1</span>
<span style="color: #339900;">#property indicator_level0  0.00</span>
<span style="color: #339900;">#property indicator_level1  0.00</span>
<span style="color: #339900;">#property indicator_level2  0.00</span>
<span style="color: #339900;">#property indicator_level3  0.00</span>
<span style="color: #339900;">#property indicator_level4  0.00</span>
<span style="color: #339900;">#property indicator_level5  0.00</span>
<span style="color: #339900;">#property indicator_level6  0.00</span>
<span style="color: #339900;">#property indicator_level7  0.00</span>
<span style="color: #339900;">#property indicator_level8  0.00</span>
<span style="color: #339900;">#property indicator_level9  0.00</span>
<span style="color: #339900;">#property indicator_level10  0.00</span>
<span style="color: #339900;">#property indicator_level11  0.00</span>
<span style="color: #339900;">#property indicator_level12  0.00</span>
<span style="color: #339900;">#property indicator_level13  0.00</span>
<span style="color: #339900;">#property indicator_level14  0.00</span>
<span style="color: #339900;">#property indicator_level15  0.00</span>
<span style="color: #808080;">//--- input parameters</span>
<span style="color: #0000ff;">input</span> <span style="color: #0000ff;">int</span>      number_of_ticks<span style="color: #000080;">=</span><span style="color: #008000;">1000</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">input</span> <span style="color: #0000ff;">int</span>      points_indent<span style="color: #000080;">=</span><span style="color: #008000;">10</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">input</span> <span style="color: #0000ff;">int</span>      LevelsCount<span style="color: #000080;">=</span><span style="color: #008000;">7</span><span style="color: #008080;">;</span>
<span style="color: #808080;">//--- indicator buffers</span>
<span style="color: #0000ff;">double</span>         BidBuffer<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">double</span>         AskBuffer<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #808080;">//| Custom indicator initialization function                         |</span>
<span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #0000ff;">int</span> OnInit<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
<span style="color: #808080;">//--- indicator buffers mapping</span>
   <span style="color: #8a2be2;">SetIndexBuffer</span><span style="color: #008000;">&#40;</span>0,BidBuffer,<span style="color: #333399;">INDICATOR_DATA</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #8a2be2;">SetIndexBuffer</span><span style="color: #008000;">&#40;</span>1,AskBuffer,<span style="color: #333399;">INDICATOR_DATA</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #8a2be2;">PlotIndexSetDouble</span><span style="color: #008000;">&#40;</span>0,PLOT_EMPTY_VALUE,0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #8a2be2;">PlotIndexSetDouble</span><span style="color: #008000;">&#40;</span>1,PLOT_EMPTY_VALUE,0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #8a2be2;">IndicatorSetString</span><span style="color: #008000;">&#40;</span><span style="color: #333399;">INDICATOR_SHORTNAME</span>,<span style="color: #8a2be2;">Symbol</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">+</span><span style="color: #008080;">&quot; Tick Chart&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #808080;">//---</span>
   <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
<span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #808080;">//| Custom indicator iteration function                              |</span>
<span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #0000ff;">int</span> OnCalculate<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> rates_total,
                <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> prev_calculated,
                <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">datetime</span> <span style="color: #000040;">&amp;</span>time<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span>,
                <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">double</span> <span style="color: #000040;">&amp;</span>open<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span>,
                <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">double</span> <span style="color: #000040;">&amp;</span>high<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span>,
                <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">double</span> <span style="color: #000040;">&amp;</span>low<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span>,
                <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">double</span> <span style="color: #000040;">&amp;</span>close<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span>,
                <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">long</span> <span style="color: #000040;">&amp;</span>tick_volume<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span>,
                <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">long</span> <span style="color: #000040;">&amp;</span>volume<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span>,
                <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> <span style="color: #000040;">&amp;</span>spread<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">int</span> ticks<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>
<span style="color: #808080;">//---</span>
   <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>ticks<span style="color: #000080;">==</span>0<span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
      <span style="color: #8a2be2;">ArrayInitialize</span><span style="color: #008000;">&#40;</span>AskBuffer,0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #8a2be2;">ArrayInitialize</span><span style="color: #008000;">&#40;</span>BidBuffer,0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
     <span style="color: #008000;">&#125;</span>
   setMaxMinPrice<span style="color: #008000;">&#40;</span>ticks,points_indent<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #808080;">//--- CopyRates</span>
   MqlTick last_tick<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">SymbolInfoTick</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">Symbol</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>,last_tick<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
      BidBuffer<span style="color: #008000;">&#91;</span>ticks<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>last_tick.<span style="color: #007788;">bid</span><span style="color: #008080;">;</span>
      AskBuffer<span style="color: #008000;">&#91;</span>ticks<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>last_tick.<span style="color: #007788;">ask</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">int</span> shift<span style="color: #000080;">=</span>rates_total<span style="color: #000040;">-</span>1<span style="color: #000040;">-</span>ticks<span style="color: #008080;">;</span>
      ticks<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
      BidBuffer<span style="color: #008000;">&#91;</span>rates_total<span style="color: #000040;">-</span>1<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>last_tick.<span style="color: #007788;">bid</span><span style="color: #008080;">;</span>
      AskBuffer<span style="color: #008000;">&#91;</span>rates_total<span style="color: #000040;">-</span>1<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>last_tick.<span style="color: #007788;">ask</span><span style="color: #008080;">;</span>
      <span style="color: #8a2be2;">PlotIndexSetInteger</span><span style="color: #008000;">&#40;</span>0,<span style="color: #333399;">PLOT_SHIFT</span>,shift<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #8a2be2;">PlotIndexSetInteger</span><span style="color: #008000;">&#40;</span>1,<span style="color: #333399;">PLOT_SHIFT</span>,shift<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #8a2be2;">Comment</span><span style="color: #008000;">&#40;</span><span style="color: #008080;">&quot;Bid =&quot;</span>,last_tick.<span style="color: #007788;">bid</span>,<span style="color: #008080;">&quot;   Ask =&quot;</span>,last_tick.<span style="color: #007788;">ask</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
     <span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #808080;">//--- return value of prev_calculated for next call</span>
   <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>rates_total<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
<span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #808080;">//| set Maximum and Minimum for an indicator window based on last values</span>
<span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #0000ff;">void</span> setMaxMinPrice<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> last_values,<span style="color: #0000ff;">int</span> indent<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">int</span> dgs<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">double</span> dist<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">int</span> visiblebars<span style="color: #000080;">=</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span><span style="color: #8a2be2;">ChartGetInteger</span><span style="color: #008000;">&#40;</span>0,<span style="color: #333399;">CHART_VISIBLE_BARS</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">int</span> depth<span style="color: #000080;">=</span><span style="color: #8a2be2;">MathMin</span><span style="color: #008000;">&#40;</span>last_values,visiblebars<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">int</span> startindex<span style="color: #000080;">=</span>last_values<span style="color: #000040;">-</span>depth<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>startindex<span style="color: #000080;">&lt;</span>0<span style="color: #008000;">&#41;</span> startindex<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">int</span> max_index<span style="color: #000080;">=</span><span style="color: #8a2be2;">ArrayMaximum</span><span style="color: #008000;">&#40;</span>AskBuffer,startindex,depth<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   max_index<span style="color: #000080;">=</span>max_index<span style="color: #000080;">&gt;=</span>0<span style="color: #008080;">?</span>max_index<span style="color: #008080;">:</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">int</span> min_index<span style="color: #000080;">=</span><span style="color: #8a2be2;">ArrayMinimum</span><span style="color: #008000;">&#40;</span>BidBuffer,startindex,depth<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   min_index<span style="color: #000080;">=</span>min_index<span style="color: #000080;">&gt;=</span>0<span style="color: #008080;">?</span>min_index<span style="color: #008080;">:</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">double</span> MaxPrice<span style="color: #000080;">=</span>AskBuffer<span style="color: #008000;">&#91;</span>max_index<span style="color: #008000;">&#93;</span><span style="color: #000040;">+</span>indent<span style="color: #000040;">*</span><span style="color: #ff00ff;">_Point</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">double</span> MinPrice<span style="color: #000080;">=</span>BidBuffer<span style="color: #008000;">&#91;</span>min_index<span style="color: #008000;">&#93;</span><span style="color: #000040;">-</span>indent<span style="color: #000040;">*</span><span style="color: #ff00ff;">_Point</span><span style="color: #008080;">;</span>
   <span style="color: #8a2be2;">IndicatorSetDouble</span><span style="color: #008000;">&#40;</span><span style="color: #333399;">INDICATOR_MAXIMUM</span>,MaxPrice<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #8a2be2;">IndicatorSetDouble</span><span style="color: #008000;">&#40;</span><span style="color: #333399;">INDICATOR_MINIMUM</span>,MinPrice<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   dgs<span style="color: #000080;">=</span><span style="color: #8a2be2;">SymbolInfoInteger</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">Symbol</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>,<span style="color: #333399;">SYMBOL_DIGITS</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   dist<span style="color: #000080;">=</span><span style="color: #8a2be2;">NormalizeDouble</span><span style="color: #008000;">&#40;</span> <span style="color: #008000;">&#40;</span>MaxPrice<span style="color: #000040;">-</span>MinPrice<span style="color: #008000;">&#41;</span><span style="color: #000040;">/</span><span style="color: #008000;">&#40;</span>LevelsCount<span style="color: #000040;">+</span>1<span style="color: #008000;">&#41;</span>, dgs<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;</span>LevelsCount<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
      <span style="color: #008000;">&#123;</span>
       <span style="color: #8a2be2;">IndicatorSetDouble</span><span style="color: #008000;">&#40;</span><span style="color: #333399;">INDICATOR_LEVELVALUE</span>,i,MinPrice<span style="color: #000040;">+</span>dist<span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span>i<span style="color: #000040;">+</span>1<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
      <span style="color: #008000;">&#125;</span> 
  <span style="color: #008000;">&#125;</span>
<span style="color: #808080;">//+------------------------------------------------------------------+</span></pre></td></tr></table></div>

<p>As a tick indicator, it looks okay. But what if you want to put something else on it, like Moving Averages, Bollinger Bands, or even monitoring spreads, like in the Progress Apama strategy window? That means you have to write over and over again, newer and newer indicators, just to show you what you need. Sure, tick calculations are easy from inside an EA &#8211; they will happen mostly in the OnTick() event &#8211; but you need indicators to help you visualize the strategy, even if their practical application will be most of the time unnecesary, due to separate calculus in the EA. But keep in mind that <strong>there is no tick history. Such indicators draw from scratch.</strong> So if you want to see something longer, at least now, when the Strategy Tester is not available to run the indicator on, you have to give it time to display, it&#8217;s not instant as for other indicators.</p>
<p>So, <strong>if tick data would be available, meaning PERIOD_TICK also,</strong> then some good things for us might appear, as:<br />
a. No need to write special indicators for tick level.<br />
b. Tick level charts appear rightaway and span for entire history.<br />
c. Tick history will make the backtester more accurate, because the backtester doesn&#8217;t have to invent ticks to cover such ares.<br />
d. <em>(drawback):</em> <strong>Huge hard drive space occupied by history, larger memory requirements.</strong></p>
<p>What does it mean for MetaQuotes:<br />
a. Change in history and data aggregation, starting from tick to make the rest, not from M1, keeping M1 as a data source for old history, where tick data was not available;<br />
b. Light modification to data access functions (fields such as openbid, openask, closebid, closeask in MqlRates etc).<br />
c. Light modifications to the backtester;<br />
d. <strong>MetaTrader branded as a near institutional platform.</strong></p>
<p>Why should we want this? Well, why the big boys don&#8217;t use bar charts? After all, <strong>there are no surprises on tick charts</strong> &#8211; and we will investigate this some other time &#8211; so you won&#8217;t fear that a spider leg bar will touch your stop loss in a middle of good looking trend. </p>
<p>Thing is, if you have Level II available, and if you automate it, you are very close to the HFT realm. In fact, what is being blamed today is not the entire algorithmic trading &#8211; because they never think about users of MetaTrader, E-Signal or even NeoTicker &#8211; but the institutional , unfair (to be read &#8220;colocated&#8221;) trading. At the surface, the discussion is about computerized vs manual trading. But these , both sides of the conflict, act on the Level II, with the possibility to quote and be filled (i.e. buy at bid, sell at ask), and pay tiny fees for these trades. Thing is, if we&#8217;d benefit Level II plus MetaTrader automation, with lower brokerage fees, some forms of HFT would become applicable. This is a thing that probably remained hidden, the fact that <strong>low latency trading</strong> seems to be not the same thing as <strong>high frequency trading</strong>, even if the terms are used interchangeably. I believe that algorithmic Level II trading can be designed to be HFT even if it doesn&#8217;t benefit from low latency execution. Problem is, traders were indoctrinated so much with Level I, that is very hard to make Level II trading accepted. Because <strong>Level I trading has a &#8220;buy or sell now, and see later if you were right&#8221; mentality</strong>, whether <strong>Level II has a &#8220;see this, quote it, if get filled, close later&#8221; mentality</strong>. The same &#8220;later&#8221; has different meanings, Level I &#8220;later&#8221; means from minutes to up, usually hours, whether Level II later means &#8220;seconds&#8221; (for normal traders) , or &#8220;milliseconds&#8221; for hedge fund systems. Trailing stop is tighter on Level II, trails pip by pip. And all is meant to make <strong>real time money</strong>. Not in a few hours, and not tomorrow or not next week. But rather, see equity going up a few times per minute. This gives a way higher degree of confort, way higher than in Level I, where you can watch losses accumulating creepy for hours or days. What is most often forgot in trading, is that trading strategies are not for robots that can wait an ethernity to improve their trading styles. <strong>Life happens in real time</strong>. <strong>We are not immortal</strong> and beyond it, <strong>youth is damn short</strong>. This is one of the drivers for cutting down the latency. On one hand, it is the need to be filled before the competition, on other hand, more and more profits per a lesser and lesser time unit means fatter salaries for management&#8230; While this, even the most rational and successful traders that on Level I cannot exceed some limits of the yield. Essentially, the Level II automated systems have this job, to compress the time, and get similar yields as the ones from Level I, but in a hundredth or lesser time. But these yields are relative and small, when looked upon from inside the hedge fund industry. Because, the system&#8217;s results are relative to the average liquidity used. That is, a lot of liquidity will remain unused, but has to return yield. And while diversification is way to use more liquidity, the time span is the other side of the coin, because one trade a second is a thing, and a hundred trades in the same second, spanning lots of microseconds each, is another thing. On another hand, HFT platforms cost shameful amounts of money, and smaller institutions do not afford them, because a lot of the yields from the market go on platform costs and PhD salaries. Now you understand why a Level II MetaTrader, even if not low latency, is important? As Irene Aldridge admits too, <strong>for the buy side, there aren&#8217;t many companies yet selling products</strong>. In fact, if we exclude Strategy Runner, X-Trader and Ninja Trader, I can&#8217;t think at others. X-Trader has the automation pretty institutional in terms of costs, and Strategy Runner is so cryptic that you have to pay lots of cash for development. None of these platforms integrate options, however, and making a market in options, getting filled there, is a great way to make economies, as option spreads can be really high.</p>
<p>After all, if look on the MQL5 forum, you can see that MetaQuotes at least seems to commit to <strong>make MetaTrader 5 the best trading terminal in the world</strong>. If MetaTrader5 becomes <strong>Level II ready</strong> (remember the old motherboards with the <strong>Prescott ready</strong> sticker ?) and by generating an increased awareness about the importance of tick level action in the retail trading community, it might determine changes on brokerage levels.<br />
As brokers will give more access to tight spread ECNs, the spreads will go down, and actually the spread based model might become even extinct, replaced by a commission model &#8211; and I mean small commissions, small enough for the trader to feel that he trades in an ECN not just a retail feed that brands commission instead of spread. This way a lot of strategies from the institutional levels would become portable to MetaTrader and retail world &#8211; which will probably become &#8220;institutional with big latency&#8221;, or, more important for retail traders, <strong>FREE, easy-to-deploy HFT solution that is not low-latency based</strong>. The problem is, that commissions are driven by volume. The larger the volume, the smaller the commissions. However, at least forex traders are heavily leveraged. (Yes, the americans will soon not be able to do this anymore). Being highly leveraged, small losses are still hitting the equity hard. How much could you support commission losses until volume becomes high enough to get rebates and jump to profit? Let&#8217;s not forget, the global economy is in recession, and brokers, as any regular business in this word, live off sales&#8230; Which makes them more open for innovation, offering from low to tiny commissions&#8230;</p>
<p>On another hand, how could MT be used as a Level II platform the way it is? Sure, the OrderSend() can be used in a Level II manner, but without tick data, and with a backtester that just models ticks, instead of using ticks for real? I guess not. Tick data is a must if the station would be rebranded to a Level II station.<br />
However, there are things to do until there, as MetaQuotes still has older homeworks to complete : the Strategy Tester, a better OnTrade() syntax, the Depth Of Market view and of course the OnBookEvent(). When all of these will be completed, MT5 will be so far that you&#8217;ll forget about the old MT4 candies, I&#8217;m sure about that&#8230;</p>
<p><em>But if the retail community won&#8217;t ask for more bang for the buck, nothing will be achieved, cause <strong>automated</strong> Level II is something they are not likely to slip <strong>for free</strong></em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://mqlmagazine.com/metatrader5/tick-data-charting-why-not-a-level-ii-metatrader/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Anatomy of a simple CEP engine</title>
		<link>http://mqlmagazine.com/financial-modelling/anatomy-of-a-simple-cep-engine/</link>
		<comments>http://mqlmagazine.com/financial-modelling/anatomy-of-a-simple-cep-engine/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 19:34:10 +0000</pubDate>
		<dc:creator>Bogdan Caramalac, MQLmagazine sr.editor</dc:creator>
				<category><![CDATA[Financial modelling]]></category>

		<guid isPermaLink="false">http://mqlmagazine.com/?p=1603</guid>
		<description><![CDATA[[Versiunea romaneasca] [MQLmagazine.com in romana] [English edition]
If there wouldn&#8217;t be that CEP abbreviation there you&#8217;d probably ask how that something inherently complex could become simple. Thing is, everything starts by being simple at first then evolving to something more complicated. 
Even if you might have read my Progress Apama article, I remind you here the [...]]]></description>
			<content:encoded><![CDATA[<p><a title="[Versiunea romaneasca]" href="http://mqlmagazine.com/ro/modelare-financiara/anatomia-unui-motor-cep-simplu/" target="_top">[Versiunea romaneasca]</a> <a title="[MQLmagazine.com in romana]" href="http://mqlmagazine.com/ro" target="_top">[MQLmagazine.com in romana]</a> <a title="[English edition]" href="http://mqlmagazine.com" target="_top">[English edition]</a></p>
<p>If there wouldn&#8217;t be that CEP abbreviation there you&#8217;d probably ask how that something inherently complex could become simple. Thing is, everything starts by being simple at first then evolving to something more complicated. </p>
<p>Even if you might have read my <a title="Progress Apama" href="http://mqlmagazine.com/other-platforms/progress-apama-how-deep-does-hft-rabbit-hole-go/" target="_top">Progress Apama</a> article, I remind you here the definition given by Dan Hubscher to CEP : <strong>&#8220;the ability to relate two or more events, even if these events occur in a span of time, and then determining meaning from that relationship immediately, such as detecting a trading signal, or an alpha-generating profit opportunity&#8221;.</strong></p>
<p>So, given that events have to be related, within a time constraint, <strong>there must be an event queue, which stores individual events </strong>, as they are being received. Sure, <strong>storing is not made ad infinitum</strong>, in an ever increasing queue ; the queue size has to be dynamic, but it&#8217;s length in time should not exceed a predetermined amount of time, say 5 minutes. This is why a CEP engine, that is mainly targetted for HFT and Level II trading, doesn&#8217;t have to mixed with Level I trading signals, because these span on a way higher amount of time, lots of minutes to hours or even more, making the event stack not only to grow to an unmanageable size, but also to slow down the engine speed.</p>
<p><strong>The covered amount of time</strong> is the first limitation of the engine. </p>
<p>Second, is the link between simple events. <strong>Simple events are not fully independent</strong>, as the Progress Apama webinar slide might show. For instance, you are considering a cross of higher Bollinger Band as an event, but also the cross of the lower Bollinger Band. These events are completely opposite. Should both happen, at the time the second happens, the first one must elliminated from the queue, as you see in the scheme below that event 4 is deleted. There are two paths that may be chosen, either opposite events are removed from the event queue after some time &#8211; <em>which is diffcult to determine</em>, or before final validation of a complex event there are searched opposite simple events coming after the ones that make up the complex event.</p>
<p>Third, <strong>avoiding event redundancy</strong>. Bad implementations can cause redundancy, meaningly same event to be reported over and over again. For instance, &#8220;MSFT is below 5-minute moving average&#8221;. A parenthesis here &#8211; <em>I don&#8217;t mean the 5 minute chart, rather the moving average of all ticks occurred in last 5 minutes, that&#8217;s why I said MetaTrader should have tick data and tick period enabled.</em>When it happens, it is an event. But the next second, at the next tick, it will be reported again, and the engine has to reject it, because it already is in the queue, as there is the case with the orange event from the scheme, which doesn&#8217;t even gets a number, because it is rejected from the beginning. Such situations should be avoided from start &#8211; the engine mustn&#8217;t lose time for redundancy check, otherwise the engine should be able to filter for these events , but it&#8217;s better that the event stream is cleaned before.</p>
<p><a href="http://mqlmagazine.com/financial-modelling/anatomy-of-a-simple-cep-engine/attachment/simple-cep-engine-schematics/" rel="attachment wp-att-1682"><img src="http://mqlmagazine.com/wp-content/uploads/2010/03/Simple-CEP-Engine-Schematics.jpg" alt="" title="Simple CEP Engine Schematics" width="899" height="532" class="alignnone size-full wp-image-1682" /></a></p>
<p>This is the schematics of the engine. The tick events, or the more complex calculus events originate from an OnChart() event that is triggered by more Tick Event EAs, as they are described in the article <a title="Tick events in MQL5: complicated for now, but functional" href="http://mqlmagazine.com/mql-programming/tick-events-in-mql5-complicated-for-now-but-functional/" target="_top">Tick events in MQL5: complicated for now, but functional</a> .</p>
<p>The first column is event number in the queue, from the most recent to the oldest. Each simple event, that is linked to the data, has a number allocated to it. The same event, happening on a different instrument, has to be given a different number, so same event sequence making up a complex event will be made up of same simple events but with different identfiers. The engine must know <strong>which events are completely opposite</strong>, for instance 1 and 3, also which event is allowed to appear multiple times in the queue, because some may be allowed (for instance execution events (the ones beginning with E in the scheme)). All other events will be forbidden from appearing multiple times &#8211; but however this should not be done by the engine per se, the one that moves the event queue, rather these must be forbidden from the pre-processing phase.</p>
<p>At the same time, the CEP engine must recognize each complex event knowing all simple event arrangements.<br />
For instance, if a complex event for Microsoft (MSFT) is made of  &#8220;10 followed by (11 or (12 and 13))&#8221; within 3 minutes, then the binder will look for, within 3 minutes: 10, 11 ; 10, 12, 13 ; 10, 13, 12 meaning for all alternate paths. If the same event would mapped for SP500 (^GSPC), given that its sub events will have different numbers, the condition might look like &#8220;5 followed by (15 or (16 and 17))&#8221;, having the arrangements: 5, 15 ; 5, 16, 17 ; 5, 17, 16. Such arrangements can be given directly to the engine, written directly inside, or generated inside with an algorithm, transforming the binary expression, with the notable difference that <strong>&#8220;FOLLOWED BY&#8221; is a non commutative AND</strong>. Because the rules are defined as series of events appearing in a certain order, the negation can&#8217;t exist as in a binary expression. It can be implemented only a a interdiction for some events to appear over the entire time constraint or within some sequences, as simple forbidden entries between required events.</p>
<p>You can see that I included in the scheme two bind columns. That is , <strong>one simple event can be binded to more than one complex event</strong>, because otherwise some rules would never trigger. Complex events would have a separate ID set, that is not to intersect with the simple events ID sets. The engine core will send the complex events to be processed by user in the EventsCallback(), but at the same time, the user could <strong>pipeline</strong> these events to another CEP engine.</p>
<p>The matching algorithm begins with the construction of the simple events matrix per each complex event. The simple event matrix will contain on each row an arrangement. Because checking is done backward, from the later events to older events, <strong>arrangements have to be written in the matrix in a reversed manner</strong>. Each complex event will need passing thru the events queue only for as long as the time constraint spans, in a vertical manner : first pass will check events on the first column, and simple events found this way will be pre-binded ; second pass will check the second column only for arrangements that had a pre-bind on the first. When no new pre-binds take place, matching is aborted for that specific complex event. However, to minimize the time needed, each pass will regard all events, before jumping to the next pass. When searches are cancelled for all complex events, algorithm ends.<br />
When an arrangement has all simple-events pre-binded, it&#8217;s time to check for negations. First, there will be an entire period check for global negations &#8211; events forbidden during entire complex event, then for events forbidden between pre-binded events. When all negations are checked,a final check has to be done to ensure they still abide the time constraint, and only in this case, simple events are binded to the complex event, <em>provided that in the bind array of each simple event this bind is not previously done &#8211; to avoid re-binding to same complex event</em>. The resulting complex event is then put in a bind queue and passed to EventsCallback(). <em>Sending events to EventsCallback() must take place after the algo is done, otherwise there might appear recursive engine calls that will not end their execution.</em>For the simple events that are being binded, the current bind array position will be filled with the complex event, the position is then incremented by one.</p>
<p>Here is an example of different complex events in different stages of pre-binding:</p>
<p><a href="http://mqlmagazine.com/financial-modelling/anatomy-of-a-simple-cep-engine/attachment/prebinding-of-simple-events/" rel="attachment wp-att-1700"><img src="http://mqlmagazine.com/wp-content/uploads/2010/03/Prebinding-of-Simple-Events.jpg" alt="" title="Prebinding of Simple Events" width="486" height="469" class="alignnone size-full wp-image-1700" /></a></p>
<p>For the MSFT event, the engine finds event 12 on the first pass, and pre-binds it on the third arrangement. On the second pass, it finds event 13, and pre-binds it to the second arrangement. It finds 12 too, but it can&#8217;t pre-bind it to the second arrangement because it occurred before 13. If on the next pass finds the older 10 event, third arrangement is completed, being no negations there, and if time still abides constraint, provided that complex event 1 was not binded yet, then simple events on the third arrangement are binded to complex event 1, bind counter incremented, event placed in the bind queue. For the ^GSPC event (complex event 2), the engine has completed already the first arrangement. Event 5 does not appear checked for second and third arrangement because events on the previous columns are not checked.</p>
<p>As for the execution events, these are sent by the EnumCallbacks() event of the DealHandler class from the <a title="Distinguishing quasi simultaneous fills - class to report last deals" href="http://mqlmagazine.com/mql-programming/distinguishing-quasi-simultaneous-fills-class-to-report-last-deals/" target="_top">Distinguishing quasi simultaneous fills &#8211; class to report last deals</a> article. Simple execution events can also be mapped in more complex execution events because deals have magic numbers and comments, and if you buy two times in row same 1000 stocks, you will know which buy was part of which complex execution event. This is why such events could be treated either seperately or in combination with market events.</p>
<p>We will come with a coding example in a future article.</p>
]]></content:encoded>
			<wfw:commentRss>http://mqlmagazine.com/financial-modelling/anatomy-of-a-simple-cep-engine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DLL Hell, MQL5 edition : UNICODE vs ANSI</title>
		<link>http://mqlmagazine.com/mql-programming/dll-hell-mql5-edition-unicode-vs-ansi/</link>
		<comments>http://mqlmagazine.com/mql-programming/dll-hell-mql5-edition-unicode-vs-ansi/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 19:33:41 +0000</pubDate>
		<dc:creator>Bogdan Caramalac, MQLmagazine sr.editor</dc:creator>
				<category><![CDATA[MQL programming]]></category>

		<guid isPermaLink="false">http://mqlmagazine.com/?p=1759</guid>
		<description><![CDATA[[Versiunea romaneasca] [MQLmagazine.com in romana] [English edition]
Many many years ago, when we were kids, in the beginning years of the crazy 90s, two languages were in battle in developer world. Pascal, with a down-to-earth, easy to understand syntax, well suited to a high level language, and C++, with a more cryptic, but faster to use [...]]]></description>
			<content:encoded><![CDATA[<p><a title="[Versiunea romaneasca]" href="http://mqlmagazine.com/ro/programarea-in-mql/iadul-dll-editia-mql5-unicode-vs-ansi/" target="_top">[Versiunea romaneasca]</a> <a title="[MQLmagazine.com in romana]" href="http://mqlmagazine.com/ro" target="_top">[MQLmagazine.com in romana]</a> <a title="[English edition]" href="http://mqlmagazine.com" target="_top">[English edition]</a></p>
<p>Many many years ago, when we were kids, in the beginning years of the crazy 90s, two languages were in battle in developer world. Pascal, with a down-to-earth, easy to understand syntax, well suited to a high level language, and C++, with a more cryptic, but faster to use syntax, well suited to its medium level. C++ won the battle, and everything that was done in Windows became compiled in C++ and beared its marks : <strong>null-terminated strings</strong> and what was known at that time as <strong>standard calling convention</strong>.</p>
<p>The <strong>null-terminated strings</strong> were normal strings, known as ANSI strings, but at that time there was no UNICODE yet. Every character was a single byte and the strings had a dynamic lenght, as they were supposed to end with a null (a zero byte). Thus applications were receiving a pointer to indicate were to read these strings from, and knew where the strings end, by looking for a zero byte. As for the <strong>standard calling convention</strong>, on procedure call, C++ compiler was pushing parameters on the stack starting from the last and finishing with the first.</p>
<p><strong>Null-terminated string (ANSI)</strong></p>
<pre>
|---------------|
|c1|c2|....| 0  |
|b1|b2|....|bn+1|
|---------------|
</pre>
<p>Pascal was the absolute reverse of C++ in all these matters. Strings were ANSI too, one byte per each character, but strings had a fixed length of 255 bytes, or compiler defined. They had an extra byte in the front, specifying the logical length of the string (how many bytes were actually used). As for the calling convention, this was perfectly reversed, as in the <strong>pascal calling convention</strong> parameters were pushed on the stack from the first to the last.</p>
<p><strong>Standard Pascal string (ANSI)</strong></p>
<pre>
|------------------|
|ln|c1|c2|....|c255|
|b1|b2|b3|....|b256|
|------------------|
</pre>
<p>This is why Pascal strings could have been sent entirely to functions, without the need to send by reference, which is the unique mode that string sending is possible in C++.</p>
<p>As C++ won the battle, Pascal compiler had to adapt, and calling convention was an easy task. As for the strings, the problem became complicated, as developers had to struggle with PCHAR, a name given to fixed arrays of one byte per element, which were supposed to hold C++ null-terminated strings and were sent by reference.</p>
<p>As these were not enough for developers, <strong>the UNICODE standard came in</strong>.</p>
<p>UNICODE is a complicated standard, and I don&#8217;t know it entirely. The difference from the ANSI is that UNICODE characters are wider, generally they span on two bytes each, but there are also 4-byte character coded strings. In the beginning, UNICODE strings seemed to be something new and awckward. Thus, they were called <strong>wide strings</strong>. Windows API Functions working with wide strings were had a name terminated with W ; pointers to null-terminated ANSI strings were <strong>char*</strong> , thus pointers to null-terminated UNICODE had to be called <strong>wchar_t*</strong> .</p>
<p><strong>Null-terminated strings (UNICODE)</strong></p>
<pre>
|------------------------------------------|
|  c1 |  c2 |....|      cn   |      0      |
|b1|b2|b3|b4|....|b 2n-1|b 2n|b 2n+1|b 2n+2|
|------------------------------------------|
</pre>
<p>MQL5, as most of the programming environments nowadays, is UNICODE. Even simple strings that you use regularly are still UNICODE. They have an ANSI look, but internal representation is UNICODE. This is because ANSI can be packed in UNICODE, filling unneed bytes with 0.</p>
<p><strong>ANSI packaged in UNICODE (MQL5 normal strings)</strong></p>
<pre>
|------------------------------------------|
|  c1 |  c2 |....|      cn   |      0      |
|b1|0 |b3|0 |....|b 2n-1| 0  |b 2n+1|  0   |
|b1|b2|b3|b4|....|b 2n-1|b 2n|b 2n+1|b 2n+2|
|------------------------------------------|
</pre>
<p>So, in a UNICODE-packed ANSI, every even byte is 0.<br />
But what if you have an older C++ DLL, who uses null-terminated <strong>ANSI</strong> strings ?<br />
That means it expects and returns null-terminated ANSI strings.</p>
<p>So, if you are to send an &#8220;ABC&#8221; string to such a DLL, it have mapped in bytes: 65, 0, 66, 0, 67, 0.<br />
The DLL will see the first 0 as the null terminating the string and will understand only &#8220;A&#8221; from the entire string.</p>
<p>If you are to receive an &#8220;ABC&#8221; from this type of DLL, you would receive in bytes:  65, 66, 67, 0.<br />
The UNICODE MQL5 will understand first character as 65 and 66 (making something chinese-like), and the second character as 67 and 0, mapping to &#8220;C&#8221;. Then it will continue reading, if there is no <strong>access violation</strong>, until it finds 0 and 0, making up for the null, resulting in a complete jabber. The access violation might be avoided because MT5 might allocate enough space for string receival.</p>
<p>Sadly, MQL5 doesn&#8217;t have an <strong>ansistring</strong> type to handle conversions automatically. But, for the good part, at least in both cases strings are sent by reference, so it is actually a problem of meaning instead of a conflict in value/reference sending.</p>
<p>This means you have to send UNICODE strings that are to be correctly decoded as ANSI, and receive in ANSI strings that you have to convert to UNICODE for using.</p>
<p>When you are to receive an ANSI string in a UNICODE form, start reading UNICODE characters by typecasting each character to a <strong>unsigned short</strong>, then divide this in the two ANSI, (by modulo 256), add to resulting UNICODE string the modulo (as ANSI code), and the remainder (as ANSI code). So each 2 bytes of the original ANSI map into 4 bytes (2 UNICODE characters). </p>
<p>When you want to pack an ANSI-encoded UNICODE string, like an MQL5 string, as an ANSI, you read every two UNICODE chars in a row, then forcibly typecast them to <strong>unsigned char</strong>, like the size of ANSI characters. Then pack up new UNICODE character with the first read as modulo and second as remainder into a larger <strong>unsigned short</strong>, that you will add as code of the new character to the resulting UNICODE string. </p>
<p>The following is the code of two conversion functions, written as a <strong>include file</strong>. Make sure you make this file to be a include file, in the <strong>include</strong> folder, saving it as <strong>stringlib.mqh</strong>.</p>

<div class="wp_codebox"><table width="100%" ><tr id="p1759110"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
</pre></td><td class="code" id="p1759code110"><pre class="mql5" style="font-family:monospace;"><span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #808080;">//|                                                    stringlib.mqh |</span>
<span style="color: #808080;">//|                                       Copyright Bogdan Caramalac |</span>
<span style="color: #808080;">//|                                           http://mqlmagazine.com |</span>
<span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #339900;">#property library </span>
<span style="color: #339900;">#property copyright &quot;Bogdan Caramalac&quot;</span>
<span style="color: #339900;">#property link      &quot;http://mqlmagazine.com&quot;</span>
<span style="color: #339900;">#property version   &quot;1.00&quot;</span>
&nbsp;
<span style="color: #0000ff;">string</span> ANSI2UNICODE<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">string</span> s<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">ushort</span> mychar<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">long</span> m,d<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">double</span> mm,dd<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">string</span> img<span style="color: #008080;">;</span>    
   <span style="color: #0000ff;">string</span> res<span style="color: #000080;">=</span><span style="color: #008080;">&quot;&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">StringLen</span><span style="color: #008000;">&#40;</span>s<span style="color: #008000;">&#41;</span><span style="color: #000080;">&gt;</span>0<span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>
      <span style="color: #0000ff;">string</span> g<span style="color: #000080;">=</span><span style="color: #008080;">&quot; &quot;</span><span style="color: #008080;">;</span>
      <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;</span><span style="color: #8a2be2;">StringLen</span><span style="color: #008000;">&#40;</span>s<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
         <span style="color: #008000;">&#123;</span>          
          <span style="color: #0000ff;">string</span> f<span style="color: #000080;">=</span><span style="color: #008080;">&quot;  &quot;</span><span style="color: #008080;">;</span>          
          mychar<span style="color: #000080;">=</span><span style="color: #0000ff;">ushort</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">StringGetCharacter</span><span style="color: #008000;">&#40;</span>s,i<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
          mm<span style="color: #000080;">=</span><span style="color: #8a2be2;">MathMod</span><span style="color: #008000;">&#40;</span>mychar,256<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
          img<span style="color: #000080;">=</span><span style="color: #8a2be2;">DoubleToString</span><span style="color: #008000;">&#40;</span>mm,0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
          m<span style="color: #000080;">=</span><span style="color: #8a2be2;">StringToInteger</span><span style="color: #008000;">&#40;</span>img<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
          dd<span style="color: #000080;">=</span><span style="color: #008000;">&#40;</span>mychar<span style="color: #000040;">-</span>m<span style="color: #008000;">&#41;</span><span style="color: #000040;">/</span><span style="color: #008000;">256</span><span style="color: #008080;">;</span>
          img<span style="color: #000080;">=</span><span style="color: #8a2be2;">DoubleToString</span><span style="color: #008000;">&#40;</span>dd,0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
          d<span style="color: #000080;">=</span><span style="color: #8a2be2;">StringToInteger</span><span style="color: #008000;">&#40;</span>img<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
          <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>m<span style="color: #000040;">!</span><span style="color: #000080;">=</span>0<span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
             <span style="color: #8a2be2;">StringSetCharacter</span><span style="color: #008000;">&#40;</span>f,0,<span style="color: #0000ff;">ushort</span><span style="color: #008000;">&#40;</span>m<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
             <span style="color: #8a2be2;">StringSetCharacter</span><span style="color: #008000;">&#40;</span>f,1,<span style="color: #0000ff;">ushort</span><span style="color: #008000;">&#40;</span>d<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
             <span style="color: #8a2be2;">StringConcatenate</span><span style="color: #008000;">&#40;</span>res,res,f<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
            <span style="color: #008000;">&#125;</span><span style="color: #808080;">//if (m!=0)</span>
          else
            <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>                      
         <span style="color: #008000;">&#125;</span><span style="color: #808080;">//for (int i=0;i&lt;StringLen(s);i++)</span>
      <span style="color: #008000;">&#125;</span><span style="color: #808080;">//if (StringLen(s)&gt;0)</span>
   <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>res<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">string</span> UNICODE2ANSI<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">string</span> s<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">int</span> leng,ipos<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">uchar</span> m,d<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">ulong</span> big<span style="color: #008080;">;</span>
   leng<span style="color: #000080;">=</span><span style="color: #8a2be2;">StringLen</span><span style="color: #008000;">&#40;</span>s<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">string</span> unichar<span style="color: #008080;">;</span>
   <span style="color: #0000ff;">string</span> res<span style="color: #000080;">=</span><span style="color: #008080;">&quot;&quot;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>leng<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008000;">&#41;</span>
     <span style="color: #008000;">&#123;</span>    
      unichar<span style="color: #000080;">=</span><span style="color: #008080;">&quot; &quot;</span><span style="color: #008080;">;</span>
      ipos<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>      
      <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>ipos<span style="color: #000080;">&lt;</span>leng<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span> <span style="color: #808080;">//uchar typecasted because each double byte char is actually one byte</span>
         m<span style="color: #000080;">=</span><span style="color: #0000ff;">uchar</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">StringGetCharacter</span><span style="color: #008000;">&#40;</span>s,ipos<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
         <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>ipos<span style="color: #000040;">+</span>1<span style="color: #000080;">&lt;</span>leng<span style="color: #008000;">&#41;</span>
           d<span style="color: #000080;">=</span><span style="color: #0000ff;">uchar</span><span style="color: #008000;">&#40;</span><span style="color: #8a2be2;">StringGetCharacter</span><span style="color: #008000;">&#40;</span>s,ipos<span style="color: #000040;">+</span>1<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
         else
           d<span style="color: #000080;">=</span><span style="color: #008000;">0</span><span style="color: #008080;">;</span>
         big<span style="color: #000080;">=</span>d<span style="color: #000040;">*</span>256<span style="color: #000040;">+</span>m<span style="color: #008080;">;</span>                
         <span style="color: #8a2be2;">StringSetCharacter</span><span style="color: #008000;">&#40;</span>unichar,0,<span style="color: #0000ff;">ushort</span><span style="color: #008000;">&#40;</span>big<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>         
         <span style="color: #8a2be2;">StringConcatenate</span><span style="color: #008000;">&#40;</span>res,res,unichar<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>    
         ipos<span style="color: #000080;">=</span>ipos<span style="color: #000040;">+</span><span style="color: #008000;">2</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
     <span style="color: #008000;">&#125;</span>
   <span style="color: #0000ff;">return</span><span style="color: #008000;">&#40;</span>res<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>When using the include you simply write</p>

<div class="wp_codebox"><table width="100%" ><tr id="p1759111"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1759code111"><pre class="mql5" style="font-family:monospace;"><span style="color: #339900;">#include &lt;stringlib.mqh&gt;</span></pre></td></tr></table></div>

<p> as in the following example:</p>

<div class="wp_codebox"><table width="100%" ><tr id="p1759112"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
</pre></td><td class="code" id="p1759code112"><pre class="mql5" style="font-family:monospace;"><span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #808080;">//|                                                  teststrings.mq5 |</span>
<span style="color: #808080;">//|                                       Copyright Bogdan Caramalac |</span>
<span style="color: #808080;">//|                                           http://mqlmagazine.com |</span>
<span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #339900;">#property copyright &quot;Bogdan Caramalac&quot;</span>
<span style="color: #339900;">#property link      &quot;http://mqlmagazine.com&quot;</span>
<span style="color: #339900;">#property version   &quot;1.00&quot;</span>
&nbsp;
<span style="color: #339900;">#include &lt;stringlib.mqh&gt;</span>
&nbsp;
<span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #808080;">//| Script program start function                                    |</span>
<span style="color: #808080;">//+------------------------------------------------------------------+</span>
<span style="color: #0000ff;">void</span> OnStart<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">string</span> original_unicode,ansi,converted_unicode<span style="color: #008080;">;</span>
   original_unicode<span style="color: #000080;">=</span><span style="color: #008080;">&quot;EvenString&quot;</span><span style="color: #008080;">;</span>
   ansi<span style="color: #000080;">=</span>UNICODE2ANSI<span style="color: #008000;">&#40;</span>original_unicode<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   converted_unicode<span style="color: #000080;">=</span>ANSI2UNICODE<span style="color: #008000;">&#40;</span>ansi<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span>original_unicode,<span style="color: #008080;">&quot; -&gt; &quot;</span>,ansi,<span style="color: #008080;">&quot; -&gt; &quot;</span>,converted_unicode<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   original_unicode<span style="color: #000080;">=</span><span style="color: #008080;">&quot;OddString&quot;</span><span style="color: #008080;">;</span>
   ansi<span style="color: #000080;">=</span>UNICODE2ANSI<span style="color: #008000;">&#40;</span>original_unicode<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   converted_unicode<span style="color: #000080;">=</span>ANSI2UNICODE<span style="color: #008000;">&#40;</span>ansi<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #8a2be2;">Print</span><span style="color: #008000;">&#40;</span>original_unicode,<span style="color: #008080;">&quot; -&gt; &quot;</span>,ansi,<span style="color: #008080;">&quot; -&gt; &quot;</span>,converted_unicode<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
<span style="color: #808080;">//+------------------------------------------------------------------+</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://mqlmagazine.com/mql-programming/dll-hell-mql5-edition-unicode-vs-ansi/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

