<?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 &#187; MQL programming</title>
	<atom:link href="http://mqlmagazine.com/category/mql-programming/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>

<div class='dd_after'><table><tr><td><iframe src='http://digg.com/api/diggthis.php?w=new&amp;u=http://mqlmagazine.com/mql-programming/guidelines-for-writing-portfolio-expert-advisors-in-mql5/&amp;t=Guidelines+for+writing+portfolio+expert+advisors+in+MQL5&amp;s=compact' height='18' width='120' frameborder='0' scrolling='no'></iframe></td><td><iframe src='http://widgets.dzone.com/links/widgets/zoneit.html?url=http://mqlmagazine.com/mql-programming/guidelines-for-writing-portfolio-expert-advisors-in-mql5/&amp;title=Guidelines+for+writing+portfolio+expert+advisors+in+MQL5&amp;t=2' height='18' width='120' frameborder='0' scrolling='no'></iframe></td><td><script type='text/javascript'><!--yahooBuzzArticleHeadline=Guidelines+for+writing+portfolio+expert+advisors+in+MQL5;//--></script><script type='text/javascript' src='http://d.yimg.com/ds/badge2.js' badgetype='small-votes'></script></td><td><iframe src='http://api.tweetmeme.com/button.js?url=http://mqlmagazine.com/mql-programming/guidelines-for-writing-portfolio-expert-advisors-in-mql5/&amp;source=&amp;style=compact' height='20' width='90' frameborder='0' scrolling='no'></iframe></td><td><script type='text/javascript'> var fbShare = {url: 'http://mqlmagazine.com/mql-programming/guidelines-for-writing-portfolio-expert-advisors-in-mql5/',size:'small'}</script> <script type='text/javascript' src='http://widgets.fbshare.me/files/fbshare.js'></script></td></tr></table></div><!-- Generated by Digg Digg plugin, 
    Author : Yong Mook Kim
    Website : http://www.mkyong.com/blog/digg-digg-wordpress-plugin/ -->]]></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>
<div class='dd_after'><table><tr><td><iframe src='http://digg.com/api/diggthis.php?w=new&amp;u=http://mqlmagazine.com/mql-programming/mql5-a-portfolio-moving-average-sample-expert/&amp;t=MQL5+%3A+A+portfolio+moving+average+sample+expert&amp;s=compact' height='18' width='120' frameborder='0' scrolling='no'></iframe></td><td><iframe src='http://widgets.dzone.com/links/widgets/zoneit.html?url=http://mqlmagazine.com/mql-programming/mql5-a-portfolio-moving-average-sample-expert/&amp;title=MQL5+%3A+A+portfolio+moving+average+sample+expert&amp;t=2' height='18' width='120' frameborder='0' scrolling='no'></iframe></td><td><script type='text/javascript'><!--yahooBuzzArticleHeadline=MQL5+%3A+A+portfolio+moving+average+sample+expert;//--></script><script type='text/javascript' src='http://d.yimg.com/ds/badge2.js' badgetype='small-votes'></script></td><td><iframe src='http://api.tweetmeme.com/button.js?url=http://mqlmagazine.com/mql-programming/mql5-a-portfolio-moving-average-sample-expert/&amp;source=&amp;style=compact' height='20' width='90' frameborder='0' scrolling='no'></iframe></td><td><script type='text/javascript'> var fbShare = {url: 'http://mqlmagazine.com/mql-programming/mql5-a-portfolio-moving-average-sample-expert/',size:'small'}</script> <script type='text/javascript' src='http://widgets.fbshare.me/files/fbshare.js'></script></td></tr></table></div><!-- Generated by Digg Digg plugin, 
    Author : Yong Mook Kim
    Website : http://www.mkyong.com/blog/digg-digg-wordpress-plugin/ -->]]></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>
<div class='dd_after'><table><tr><td><iframe src='http://digg.com/api/diggthis.php?w=new&amp;u=http://mqlmagazine.com/mql-programming/trading-systems-virtualization-to-achieve-equity-line-fitting-a-myth/&amp;t=Trading+systems+virtualization+to+achieve+equity+line+fitting+-+a+myth+%3F&amp;s=compact' height='18' width='120' frameborder='0' scrolling='no'></iframe></td><td><iframe src='http://widgets.dzone.com/links/widgets/zoneit.html?url=http://mqlmagazine.com/mql-programming/trading-systems-virtualization-to-achieve-equity-line-fitting-a-myth/&amp;title=Trading+systems+virtualization+to+achieve+equity+line+fitting+-+a+myth+%3F&amp;t=2' height='18' width='120' frameborder='0' scrolling='no'></iframe></td><td><script type='text/javascript'><!--yahooBuzzArticleHeadline=Trading+systems+virtualization+to+achieve+equity+line+fitting+-+a+myth+%3F;//--></script><script type='text/javascript' src='http://d.yimg.com/ds/badge2.js' badgetype='small-votes'></script></td><td><iframe src='http://api.tweetmeme.com/button.js?url=http://mqlmagazine.com/mql-programming/trading-systems-virtualization-to-achieve-equity-line-fitting-a-myth/&amp;source=&amp;style=compact' height='20' width='90' frameborder='0' scrolling='no'></iframe></td><td><script type='text/javascript'> var fbShare = {url: 'http://mqlmagazine.com/mql-programming/trading-systems-virtualization-to-achieve-equity-line-fitting-a-myth/',size:'small'}</script> <script type='text/javascript' src='http://widgets.fbshare.me/files/fbshare.js'></script></td></tr></table></div><!-- Generated by Digg Digg plugin, 
    Author : Yong Mook Kim
    Website : http://www.mkyong.com/blog/digg-digg-wordpress-plugin/ -->]]></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>
<div class='dd_after'><table><tr><td><iframe src='http://digg.com/api/diggthis.php?w=new&amp;u=http://mqlmagazine.com/mql-programming/mql5-implementation-of-a-simple-cep-engine/&amp;t=MQL5+%3A+Implementation+of+a+simple+CEP+engine&amp;s=compact' height='18' width='120' frameborder='0' scrolling='no'></iframe></td><td><iframe src='http://widgets.dzone.com/links/widgets/zoneit.html?url=http://mqlmagazine.com/mql-programming/mql5-implementation-of-a-simple-cep-engine/&amp;title=MQL5+%3A+Implementation+of+a+simple+CEP+engine&amp;t=2' height='18' width='120' frameborder='0' scrolling='no'></iframe></td><td><script type='text/javascript'><!--yahooBuzzArticleHeadline=MQL5+%3A+Implementation+of+a+simple+CEP+engine;//--></script><script type='text/javascript' src='http://d.yimg.com/ds/badge2.js' badgetype='small-votes'></script></td><td><iframe src='http://api.tweetmeme.com/button.js?url=http://mqlmagazine.com/mql-programming/mql5-implementation-of-a-simple-cep-engine/&amp;source=&amp;style=compact' height='20' width='90' frameborder='0' scrolling='no'></iframe></td><td><script type='text/javascript'> var fbShare = {url: 'http://mqlmagazine.com/mql-programming/mql5-implementation-of-a-simple-cep-engine/',size:'small'}</script> <script type='text/javascript' src='http://widgets.fbshare.me/files/fbshare.js'></script></td></tr></table></div><!-- Generated by Digg Digg plugin, 
    Author : Yong Mook Kim
    Website : http://www.mkyong.com/blog/digg-digg-wordpress-plugin/ -->]]></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>
<div class='dd_after'><table><tr><td><iframe src='http://digg.com/api/diggthis.php?w=new&amp;u=http://mqlmagazine.com/mql-programming/combinatorics-in-mql5/&amp;t=Combinatorics+in+MQL5&amp;s=compact' height='18' width='120' frameborder='0' scrolling='no'></iframe></td><td><iframe src='http://widgets.dzone.com/links/widgets/zoneit.html?url=http://mqlmagazine.com/mql-programming/combinatorics-in-mql5/&amp;title=Combinatorics+in+MQL5&amp;t=2' height='18' width='120' frameborder='0' scrolling='no'></iframe></td><td><script type='text/javascript'><!--yahooBuzzArticleHeadline=Combinatorics+in+MQL5;//--></script><script type='text/javascript' src='http://d.yimg.com/ds/badge2.js' badgetype='small-votes'></script></td><td><iframe src='http://api.tweetmeme.com/button.js?url=http://mqlmagazine.com/mql-programming/combinatorics-in-mql5/&amp;source=&amp;style=compact' height='20' width='90' frameborder='0' scrolling='no'></iframe></td><td><script type='text/javascript'> var fbShare = {url: 'http://mqlmagazine.com/mql-programming/combinatorics-in-mql5/',size:'small'}</script> <script type='text/javascript' src='http://widgets.fbshare.me/files/fbshare.js'></script></td></tr></table></div><!-- Generated by Digg Digg plugin, 
    Author : Yong Mook Kim
    Website : http://www.mkyong.com/blog/digg-digg-wordpress-plugin/ -->]]></content:encoded>
			<wfw:commentRss>http://mqlmagazine.com/mql-programming/combinatorics-in-mql5/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 intern
