From 407a205132cd2b52bba86987dcbc3253827b0ee4 Mon Sep 17 00:00:00 2001 From: Nkondog Anselme Date: Sun, 14 Nov 2021 05:36:01 +0100 Subject: [PATCH] Initial commit --- .../EA_Template_1.0/EA_Template_1.0.mq5 | 155 ++++ .../EA_Template_1.0/EA_Template_1.0.mqproj | Bin 0 -> 8356 bytes Experts/Nkanven/Framework EA/EA_Template.mq4 | 21 + Experts/Nkanven/Framework EA/EA_Template.mq5 | 64 ++ Experts/Nkanven/Framework EA/EA_Template.mqh | 182 ++++ .../Nkanven/Framework EA/EA_Template_1.0.ex5 | Bin 0 -> 43702 bytes .../Nkanven/Framework EA/EA_Template_1.0.mq4 | 181 ++++ .../Nkanven/Framework EA/EA_Template_1.0.mq5 | 224 +++++ Experts/Nkanven/Framework EA/Grid/GridEA.ex5 | Bin 0 -> 130602 bytes Experts/Nkanven/Framework EA/Grid/GridEA.mq5 | 281 ++++++ .../MA Crossover ATR TPSL.mq4 | 176 ++++ .../MA Crossover ATR TPSL.mq5 | 221 +++++ .../MA Crossover/MA Crossover.ex5 | Bin 0 -> 48146 bytes .../MA Crossover/MA Crossover.mq4 | 153 ++++ .../MA Crossover/MA Crossover.mq5 | 197 +++++ Experts/Nkanven/GridEA.ex5 | Bin 0 -> 43632 bytes .../Frameworks/Extensions/AllExtensions.mqh | 16 + .../Extensions/AllGridExtensions.mqh | 6 + .../Frameworks/Extensions/AllIndicators.mqh | 16 + .../Frameworks/Extensions/AllSignals.mqh | 17 + .../Nkanven/Frameworks/Extensions/AllTPSL.mqh | 15 + .../Extensions/GlobalEnumDefinitions.mqh | 29 + .../Frameworks/Extensions/GridSignals.mqh | 5 + .../Frameworks/Extensions/GridTPSL.mqh | 4 + .../Extensions/Indicators/IndicatorATR.mqh | 77 ++ .../Extensions/Indicators/IndicatorMA.mqh | 82 ++ .../Indicators/IndicatorTemplate.mqh | 91 ++ .../Extensions/Signals/SignalCombination.mqh | 86 ++ .../Extensions/Signals/SignalCrossover.mqh | 78 ++ .../Extensions/Signals/SignalGrid.mqh | 79 ++ .../Extensions/Signals/SignalTemplate.mqh | 68 ++ .../Frameworks/Extensions/TPSL/GridTPSL.mqh | 57 ++ .../Frameworks/Extensions/TPSL/TPSLSimple.mqh | 62 ++ .../Extensions/TPSL/TPSLTemplate.mqh | 67 ++ Include/Nkanven/Frameworks/Framework.mqh | 21 + .../Frameworks/Framework_1.00/CommonBase.mqh | 71 ++ .../Frameworks/Framework_1.00/ExpertBase.mqh | 193 +++++ .../Frameworks/Framework_1.00/Framework.mqh | 19 + .../Indicators/AllIndicators.mqh | 15 + .../Indicators/Average/IndicatorMA.mqh | 91 ++ .../Indicators/IndicatorBase.mqh | 44 + .../Framework_1.00/Signals/AllSignals.mqh | 15 + .../Signals/Crossover/SignalCrossover.mqh | 78 ++ .../Framework_1.00/Signals/SignalBase.mqh | 85 ++ .../Frameworks/Framework_1.00/Trade/Trade.mqh | 14 + .../Framework_1.00/Trade/Trade_mql4.mqh | 83 ++ .../Framework_1.00/Trade/Trade_mql5.mqh | 44 + .../Frameworks/Framework_2.04/CommonBase.mqh | 78 ++ .../Frameworks/Framework_2.04/ExpertBase.mqh | 380 ++++++++ .../Frameworks/Framework_2.04/Framework.mqh | 36 + .../Framework_2.04/IndicatorBase.mqh | 59 ++ .../Frameworks/Framework_2.04/SignalBase.mqh | 112 +++ .../Frameworks/Framework_2.04/TPSLBase.mqh | 39 + .../Frameworks/Framework_2.04/Trade/Trade.mqh | 16 + .../Framework_2.04/Trade/Trade_mql4.mqh | 123 +++ .../Framework_2.04/Trade/Trade_mql5.mqh | 66 ++ .../Frameworks/Framework_2.04/Updates.txt | 7 + .../Nkanven/Frameworks/GridEA/CommonBase.mqh | 75 ++ .../Nkanven/Frameworks/GridEA/ExpertBase.mqh | 812 ++++++++++++++++++ .../Nkanven/Frameworks/GridEA/Framework.mqh | 35 + .../Frameworks/GridEA/IndicatorBase.mqh | 59 ++ .../Nkanven/Frameworks/GridEA/SignalBase.mqh | 95 ++ .../Nkanven/Frameworks/GridEA/TPSLBase.mqh | 39 + .../Nkanven/Frameworks/GridEA/Trade/Trade.mqh | 16 + .../Frameworks/GridEA/Trade/Trade_mql4.mqh | 123 +++ .../Frameworks/GridEA/Trade/Trade_mql5.mqh | 152 ++++ Include/Nkanven/Frameworks/GridEA/Updates.txt | 7 + Include/Nkanven/Frameworks/GridFramework.mqh | 20 + .../Nkanven/Frameworks/MakeExtensionMQH.bat | 114 +++ 69 files changed, 5946 insertions(+) create mode 100644 Experts/Nkanven/EA Framework/EA_Template_1.0/EA_Template_1.0.mq5 create mode 100644 Experts/Nkanven/EA Framework/EA_Template_1.0/EA_Template_1.0.mqproj create mode 100644 Experts/Nkanven/Framework EA/EA_Template.mq4 create mode 100644 Experts/Nkanven/Framework EA/EA_Template.mq5 create mode 100644 Experts/Nkanven/Framework EA/EA_Template.mqh create mode 100644 Experts/Nkanven/Framework EA/EA_Template_1.0.ex5 create mode 100644 Experts/Nkanven/Framework EA/EA_Template_1.0.mq4 create mode 100644 Experts/Nkanven/Framework EA/EA_Template_1.0.mq5 create mode 100644 Experts/Nkanven/Framework EA/Grid/GridEA.ex5 create mode 100644 Experts/Nkanven/Framework EA/Grid/GridEA.mq5 create mode 100644 Experts/Nkanven/Framework EA/MA Crossover ATR TPSL/MA Crossover ATR TPSL.mq4 create mode 100644 Experts/Nkanven/Framework EA/MA Crossover ATR TPSL/MA Crossover ATR TPSL.mq5 create mode 100644 Experts/Nkanven/Framework EA/MA Crossover/MA Crossover.ex5 create mode 100644 Experts/Nkanven/Framework EA/MA Crossover/MA Crossover.mq4 create mode 100644 Experts/Nkanven/Framework EA/MA Crossover/MA Crossover.mq5 create mode 100644 Experts/Nkanven/GridEA.ex5 create mode 100644 Include/Nkanven/Frameworks/Extensions/AllExtensions.mqh create mode 100644 Include/Nkanven/Frameworks/Extensions/AllGridExtensions.mqh create mode 100644 Include/Nkanven/Frameworks/Extensions/AllIndicators.mqh create mode 100644 Include/Nkanven/Frameworks/Extensions/AllSignals.mqh create mode 100644 Include/Nkanven/Frameworks/Extensions/AllTPSL.mqh create mode 100644 Include/Nkanven/Frameworks/Extensions/GlobalEnumDefinitions.mqh create mode 100644 Include/Nkanven/Frameworks/Extensions/GridSignals.mqh create mode 100644 Include/Nkanven/Frameworks/Extensions/GridTPSL.mqh create mode 100644 Include/Nkanven/Frameworks/Extensions/Indicators/IndicatorATR.mqh create mode 100644 Include/Nkanven/Frameworks/Extensions/Indicators/IndicatorMA.mqh create mode 100644 Include/Nkanven/Frameworks/Extensions/Indicators/IndicatorTemplate.mqh create mode 100644 Include/Nkanven/Frameworks/Extensions/Signals/SignalCombination.mqh create mode 100644 Include/Nkanven/Frameworks/Extensions/Signals/SignalCrossover.mqh create mode 100644 Include/Nkanven/Frameworks/Extensions/Signals/SignalGrid.mqh create mode 100644 Include/Nkanven/Frameworks/Extensions/Signals/SignalTemplate.mqh create mode 100644 Include/Nkanven/Frameworks/Extensions/TPSL/GridTPSL.mqh create mode 100644 Include/Nkanven/Frameworks/Extensions/TPSL/TPSLSimple.mqh create mode 100644 Include/Nkanven/Frameworks/Extensions/TPSL/TPSLTemplate.mqh create mode 100644 Include/Nkanven/Frameworks/Framework.mqh create mode 100644 Include/Nkanven/Frameworks/Framework_1.00/CommonBase.mqh create mode 100644 Include/Nkanven/Frameworks/Framework_1.00/ExpertBase.mqh create mode 100644 Include/Nkanven/Frameworks/Framework_1.00/Framework.mqh create mode 100644 Include/Nkanven/Frameworks/Framework_1.00/Indicators/AllIndicators.mqh create mode 100644 Include/Nkanven/Frameworks/Framework_1.00/Indicators/Average/IndicatorMA.mqh create mode 100644 Include/Nkanven/Frameworks/Framework_1.00/Indicators/IndicatorBase.mqh create mode 100644 Include/Nkanven/Frameworks/Framework_1.00/Signals/AllSignals.mqh create mode 100644 Include/Nkanven/Frameworks/Framework_1.00/Signals/Crossover/SignalCrossover.mqh create mode 100644 Include/Nkanven/Frameworks/Framework_1.00/Signals/SignalBase.mqh create mode 100644 Include/Nkanven/Frameworks/Framework_1.00/Trade/Trade.mqh create mode 100644 Include/Nkanven/Frameworks/Framework_1.00/Trade/Trade_mql4.mqh create mode 100644 Include/Nkanven/Frameworks/Framework_1.00/Trade/Trade_mql5.mqh create mode 100644 Include/Nkanven/Frameworks/Framework_2.04/CommonBase.mqh create mode 100644 Include/Nkanven/Frameworks/Framework_2.04/ExpertBase.mqh create mode 100644 Include/Nkanven/Frameworks/Framework_2.04/Framework.mqh create mode 100644 Include/Nkanven/Frameworks/Framework_2.04/IndicatorBase.mqh create mode 100644 Include/Nkanven/Frameworks/Framework_2.04/SignalBase.mqh create mode 100644 Include/Nkanven/Frameworks/Framework_2.04/TPSLBase.mqh create mode 100644 Include/Nkanven/Frameworks/Framework_2.04/Trade/Trade.mqh create mode 100644 Include/Nkanven/Frameworks/Framework_2.04/Trade/Trade_mql4.mqh create mode 100644 Include/Nkanven/Frameworks/Framework_2.04/Trade/Trade_mql5.mqh create mode 100644 Include/Nkanven/Frameworks/Framework_2.04/Updates.txt create mode 100644 Include/Nkanven/Frameworks/GridEA/CommonBase.mqh create mode 100644 Include/Nkanven/Frameworks/GridEA/ExpertBase.mqh create mode 100644 Include/Nkanven/Frameworks/GridEA/Framework.mqh create mode 100644 Include/Nkanven/Frameworks/GridEA/IndicatorBase.mqh create mode 100644 Include/Nkanven/Frameworks/GridEA/SignalBase.mqh create mode 100644 Include/Nkanven/Frameworks/GridEA/TPSLBase.mqh create mode 100644 Include/Nkanven/Frameworks/GridEA/Trade/Trade.mqh create mode 100644 Include/Nkanven/Frameworks/GridEA/Trade/Trade_mql4.mqh create mode 100644 Include/Nkanven/Frameworks/GridEA/Trade/Trade_mql5.mqh create mode 100644 Include/Nkanven/Frameworks/GridEA/Updates.txt create mode 100644 Include/Nkanven/Frameworks/GridFramework.mqh create mode 100644 Include/Nkanven/Frameworks/MakeExtensionMQH.bat diff --git a/Experts/Nkanven/EA Framework/EA_Template_1.0/EA_Template_1.0.mq5 b/Experts/Nkanven/EA Framework/EA_Template_1.0/EA_Template_1.0.mq5 new file mode 100644 index 0000000..002e70e --- /dev/null +++ b/Experts/Nkanven/EA Framework/EA_Template_1.0/EA_Template_1.0.mq5 @@ -0,0 +1,155 @@ +//+------------------------------------------------------------------+ +//| EA_Template_1.0.mq5 | +//| Copyright 2021, Nkondog Anselme Venceslas | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ + +#include +#include + +//Input section + + + +//Some standard inputs +input double inpVolume = 0.01; //Default order size +input string inpComment = __FILE__; //Default trade comment +input int inpMagicNumber = 12345; //Magic number + + +//Declare the Expert +#define CExpert CExpertBase +CExpert *Expert; + +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { + + //Assign the default values to the expert +Expert = new CExpert(); + +Expert.SetVolume(inpVolume); +Expert.SetTradeComment(__FILE__); +Expert.SetMagic(inpMagicNumber); + + +//--- create timer + EventSetTimer(60); + + int result = Expert.OnInit(); + +//--- + return(result); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- destroy timer + EventKillTimer(); + delete Expert; + return; + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- + Expert.OnTick(); + return; + } +//+------------------------------------------------------------------+ +//| Timer function | +//+------------------------------------------------------------------+ +void OnTimer() + { +//--- + Expert.OnTimer(); + return; + } +//+------------------------------------------------------------------+ +//| Trade function | +//+------------------------------------------------------------------+ +void OnTrade() + { +//--- + Expert.OnTrade(); + return; + } +//+------------------------------------------------------------------+ +//| TradeTransaction function | +//+------------------------------------------------------------------+ +void OnTradeTransaction(const MqlTradeTransaction& trans, + const MqlTradeRequest& request, + const MqlTradeResult& result) + { +//--- + Expert.OnTradeTransaction(trans, request, result); + return; + } +//+------------------------------------------------------------------+ +//| Tester function | +//+------------------------------------------------------------------+ +double OnTester() + { +//--- + //double ret=0.0; +//--- + +//--- + //return(ret); + return(Expert.OnTester()); + } +//+------------------------------------------------------------------+ +//| TesterInit function | +//+------------------------------------------------------------------+ +void OnTesterInit() + { +//--- + Expert.OnTesterInit(); + return; + } +//+------------------------------------------------------------------+ +//| TesterPass function | +//+------------------------------------------------------------------+ +void OnTesterPass() + { +//--- + Expert.OnTesterPass(); + return; + } +//+------------------------------------------------------------------+ +//| TesterDeinit function | +//+------------------------------------------------------------------+ +void OnTesterDeinit() + { +//--- + Expert.OnTesterDeinit(); + return; + } +//+------------------------------------------------------------------+ +//| ChartEvent function | +//+------------------------------------------------------------------+ +void OnChartEvent(const int id, + const long &lparam, + const double &dparam, + const string &sparam) + { +//--- + Expert.OnChartEvent(id, lparam, dparam, sparam); + return; + } +//+------------------------------------------------------------------+ +//| BookEvent function | +//+------------------------------------------------------------------+ +void OnBookEvent(const string &symbol) + { +//--- + Expert.OnBookEvent(); + return; + } +//+------------------------------------------------------------------+ diff --git a/Experts/Nkanven/EA Framework/EA_Template_1.0/EA_Template_1.0.mqproj b/Experts/Nkanven/EA Framework/EA_Template_1.0/EA_Template_1.0.mqproj new file mode 100644 index 0000000000000000000000000000000000000000..2667412f807193fd1378c757d3f948ee65ef2962 GIT binary patch literal 8356 zcmeI1PjAye5XI-rr-(SC(jxW3t$!kc)Dlpta-b+`6Q?!UNw8fYpni4W_jco~olrO+ zA>>6?oY*@vJ8$OA?%4VM?W;Yo9>+slSZ0@2+0^D%Sk4{Y*YT9!IV1agKWfMqNM0j* z$>@mjB{mXdB%j!4cU5q|sWnDtfn;GRx;Jh#%yP6f+OsFN%V&?7d-lTKBQdjyo4IEP z{4SX*!-ItJbIvmxb1og4vNd=A6sR*aTdmh=du zbIxP3ozgJGEDK0%L{oxvPl`&y*dHI#lQ8wa2U|)f^8PeujBUR5P;l=ct>O{yy$Q za0o@0@t?W6s#!2(9nPt>Ir$SuwDNZu{Q#_Wopl-Kkac82^=lpNlkuX{S#5LrfK^nh zly;;l3RbuAzXZE_5$&exlwzpsb_53ST`OD>A@*Z%Yd4NB>(Ai3`ba&yEG;e$DBBb8 ztJn7tDA#@8=KU`3d-ugb>w}&PC!O90??b + +// +// Input Section +// + +// +// Some standard inputs, +// remember to change the default magic for each EA +// +input double InpVolume = 0.01; // Default order size +input string InpComment = __FILE__; // Default trade comment +input int InpMagicNumber = 20202020; // Magic Number + +// +// Declare the expert, use the child class name +// If the base class does everything needed then it's OK to +// just use CExpertBase +// Declare the name CExpert as the actual class name. +// This allows other files to just refer to CExpert +// +#define CExpert CExpertBase +CExpert *Expert; + +// +// Indicators - use the child class name instead of CIndicatorBase +// Remove if not needed +// +CIndicatorBase *Indicator1; + +// +// Signals - use the child class name instead of CSignalBase +// Remove if not needed +// +CSignalBase *EntrySignal; +CSignalBase *ExitSignal; + +// +// TPSL - use child class names instead of CTPSLBase +// Remove if not needed +// +CTPSLBase *TPObject; +CTPSLBase *SLObject; + +// +// Indicators for TPSL - use child class names instead of CIndicatorBase +// Remove if not needed +// +CIndicatorBase *IndicatorTPSL1; +CIndicatorBase *IndicatorTPSL2; + +int OnInit() { + + // + // Instantiate the expert + // Uses the declared class name + // + Expert = new CExpert(); + + // + // Assign the default values to the expert + // + Expert.SetVolume(InpVolume); + Expert.SetTradeComment(InpComment); + Expert.SetMagic(InpMagicNumber); + + // + // Create the indicators - using your child class name + // + Indicator1 = new CIndicatorBase(); + + // + // Set up the signals - using your child class names + // + EntrySignal = new CSignalBase(); + EntrySignal.AddIndicator(Indicator1, 0); // Add as many indicators as you need + + ExitSignal = new CSignalBase(); + ExitSignal.AddIndicator(Indicator1, 0); // Add as many indicators as you need + + // + // Add the signals to the expert + // + Expert.AddEntrySignal(EntrySignal); // repeat for more signals + Expert.AddExitSignal(ExitSignal); + + // + // If using fixed tp and sl set them here in points + // + Expert.SetTakeProfitValue(0); + Expert.SetStopLossValue(0); + + // + // Set up the Take Profit and Stop Loss objects + // Remember to create child class names, not base + // + TPObject = new CTPSLBase(); // Create the object + IndicatorTPSL1 = new CIndicatorBase(); // Create an indicator for the tp object + TPObject.AddIndicator(IndicatorTPSL1, 0); // Add the indicator to tp + // Set any other properties needed + + // And for the SL object + SLObject = new CTPSLBase(); + IndicatorTPSL2 = new CIndicatorBase(); + SLObject.AddIndicator(IndicatorTPSL2, 0); + + Expert.SetTakeProfitObj(TPObject); + Expert.SetStopLossObj(SLObject); + + // + // Finish expert initialisation and check result + // + int result = Expert.OnInit(); + + return(result); + +} + +void OnDeinit(const int reason) { + + EventKillTimer(); + + + // Delete all objects created + delete Expert; + delete ExitSignal; + delete EntrySignal; + delete Indicator1; + delete TPObject; + delete SLObject; + delete IndicatorTPSL1; + delete IndicatorTPSL2; + + return; + +} + +void OnTick() { + + Expert.OnTick(); + return; + +} + +void OnTimer() { + + Expert.OnTimer(); + return; + +} + +double OnTester() { + + return(Expert.OnTester()); + +} + +void OnChartEvent(const int id, + const long &lparam, + const double &dparam, + const string &sparam) { + + Expert.OnChartEvent(id, lparam, dparam, sparam); + return; + +} + diff --git a/Experts/Nkanven/Framework EA/EA_Template_1.0.ex5 b/Experts/Nkanven/Framework EA/EA_Template_1.0.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..ff6bb620bd7edb70f5cfacfb9dc91056752715fc GIT binary patch literal 43702 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 z z;HI2oK3txkWehB0+^)n#0s^`heNCK2h;dB;jmPM5)$6yy!IT07(cV455Po9}P9ElD zq%i2sVVlx5(md>Co&^gLCW>S5U)b1qNXxL;yIRug8on^RR#J#h*x&f&J{p@~BDk%5 zh>d6ziQ-pTzcmL{4YdZCVo z44#_YHH?E(6Ca1QJ*wR?1SW1_AnCEry*f z*PMkUHyBX3lettizv}VYmmR+NNdRlLvsVT59R>ue!$J3M>w0d~?M?gH0MSkt7K?-hs@hn`*r zud!TMo`)dhq=qG$w5-Nj6IUD_M)mOoA_}L@9TxUMHSGqIrbq$Ud{QAPO?6W&Ae)5J z&k#_15L|-DThO|#?)5>jQV{jx>Ikhbx#Amo3G(pa^G$38q3T|Mc5l0z6KMLyPnR$P z@gEx8s?F=tfeQB-#}8W5nGg0f8VF8Onf}*Ye?i87_6$XXg-?CgI(GYkv++!@rA1w$*j@D#xh0e4l zCwG2EXl&zFD=pd@8JB9Bvi>s3{VF0WnX85FJA%MB+?rs0AJ>3>UVL*6d(URl!@5nD zjW6yVb!HD-pYF_{{PEx5V!hCS<3zEWgWM^+v@v=WDkeyZdC;5V!0vPuI?{Bc8eB zNfM%B*+=|K?ut?zcAYSi&Q9ZGDoE#EyOW}L$gV!jA@g6Uos$yKz^XLO{?u`SDPJRj zGcy(}IefnFbmesv(VS-8Q47|n1MMn^R%lCqn97x~wNAuJ$jd|A#hsm6$7)ZebfObY zF8UO6Wb8r_dg`E7=JbGv@mW#XwEb)TL%?kv8XOXNm3}-XSC+)A5PTf%opwQ48S<5e z1(ccHir0lnq+S^sm^y12UDZU!+tp*;+ubszn|0k5p7Kgyx{(d#q_!<+Sy)nWtprkmcAM4q&F*zD~IPqpni`wziNQfa-CreDy#f*LgqD9 zBaF*Pj5*Lv&=>d|2$$Q;rA(LmYH+;?yw#JQ>+D$eo_` zrr0`otI6sC=jts!PXZwj7rae)yR>l+pD~z>puYdaDNvSXUw6IW%HX7Y= zCg7qH!b%WJEcpHPrd^G17ZSK$Ou8y-MRs2ook%bR8Ne>~h=8?^H#C{(s#=3sD#yPl z7!pgSEkiUd#l@LOHH*T|e6>uRe{{Pe2sjYC0UGgR{Y5d68VMW06ATtbTCvl=9N)85 z9cjoXVTM4>$8xmFQjs!NU2@2$u#XA()6rX|6!|rMjw)?V+aHwarg<|?nV^fOJk6D!%5s#850EcB_!JPsh+j>(kN|Fx2qN(RohXLc4H=)nE zx~X}gcM`AdByd2TV1Kv)Lo#w4KLH*3T_u)0U{=fyvY1QX&@k1aFJ{?KtLP*y&$I)M z)WME$@e>zvvIT7*k@#T)1M2jCv8fHrnKO4VeAVZ@G?U#WU77 z({^jMjx8Mv25?n>vYweSam+QxZJH)gQUiyaNM>VeL1?Yh7hR;cZh=&Ts|Dap`Q>s5 zsbPJjtFisX4J_Lyg&M6K_~FTJ-X|c~(Z})ii9i4a%H-!J^*7xnyg%_9&^<3(+FdDf zSgEy9@L={g8gcEENig@Y6nSS)(E%THgA#q9XL1b-$4YFdQ`+W;AO_RK|6wmKO>5#G zh^e!A*OypE`} zgB=$_LJdq8K~Sk69iBjrQzJ{B6p_5go{7R8yc>Tg=72v25TcSgVTGDEs~;;Y!$Qi5zC>@Q*WUxRx*`Y= z1u_BnW_1TuPxH4^NHf!dx`G8=4kCwui)XGoZf>fYE80)g3%a&{U&AUYD^JYkrUn~9 zdjsq$xleH6Sc{kfuH&e1pX_*K2v){l|25NaGVwRNxW!~nKA9AIT1B-{GXU2YZxQ;6 z6j3;KTn%QR4HNlCC2_ z5Wo@mJQG{WehtA04mcqhozJ%IcMC^otZD$vFe7HnBxU!|9d|ocTJ_^#1o_cg2i?V~ z%GC7(h$md964*UmlWV%Rhkk(PUP)dL&DWFIuk~cW>EvE0IRls28y}}MZipza$YG9c z>aH~lx?)P?8`>HUhao!yrT15yacr6{Oeb!B^h5BP>%$ndw0XiZU2_ytN%v*y%H-)a z&g-h8Bk>HcgeiuP;vguOD2W3QF(J5k9ybg|J>shX%}1Wu&+ z0ra4vU50_FGN-yV4t<)wIKL>TZ@!j>{mdex_(i_{Hr=&;>UH}trpWRnZ&vdya3 z%)o&i>>Toj3VRq#HvZp~`N(2RHA0D@>Ypb1c2E~4s!oeaX7RexV0Wc2gLt{NECm%3 z-_XJ~bo&#vRh=@rUSK+Wk+MD=1C=~a0X*Vi9@)Qkt`eOUkRRG$_Es6B1!m;4XeU(D zuWN}fOSUUW5EPDLfZqR(@f*!M+q1PgUv;CxbfL$si|EFhY{L7#k;&1h(+;cyj>9BB zb_pR_vsBzA9gz;)?Z@PY1p5~5rZhcjY;5B+0QEB0xn+t)>}=#$phPk>e-p%wV)=nv z5=agsPl_#C=kEZST1-#|C%E?vuer2ll8Z;#;f~pC;AQq)GT_wYtNAl`IDKSvBzb8^ zYhUA;Iu?Q~4Hjya0~GIa+WaCjrHWc9!#1_Dc=TTMq`kNx^l|-KhX4Uo5v)Xer&RMn z9lLLMt0tfF`qZh;=fPTh^lC*7*(nIrx*ZJHTn>a6 zbKjfClYs`8M=WMVGC3tr`kM-cA;D2JPAn>>e$-@?H3htO!ir*@t9pIoNQ_L9F=4>} zOT`oa5&;yR%_){9Y7X3{y<#Z!Q{+QXTRGpCk*aoLZ!j|$#bZj0sl*Cz+TI3cym7E{ z)UN&*s+2^nJoJPldMlTvr+>8c8>D%sT9=U7HH&Xwpc~NonB#GJV!54?j{{B$4&hZ( zjkPRof!Si*9p{wm#%^FUCYVk)9N(sWX&jLpxK}AfQAvzKH@v@lBgL>Pj4`Dyur`ul z62I<$b~3oD&9A)*KJ-r~ugBHNZo{PGs9}qw{Rox!GOF!Svw8nKC$uP^Roy8?8ZE(P1d?x#dtS5A`Mlvhd`g?6>qD;F_fw)VG;mE`RE93AHbqnXnso|^*(6RDL z2H%yxmgd!nr831<82<+#ydvv;=2tM&t<3lXT8Ka+ogaFNFGuWzf%H{DhHc|y4ucO8>wc+YXK%ajpLC@Hzet>m_CEOIZ!Qt!cd(vo<8X!N>Uht_~co?1_s`5bk{~{$+?W{!=_heS(B0tugA0bVM2W zB<0mW$C!OZuZ)Jhpe}&{BKgQ)n8rOK2=kW`b+I$F2}=v}x+NVcMM8GrsB@sfQ(IuG zS>Zkm3nJhIgHGpEjmxE)gB@6JA;kCJG-bLvtfm#OuyQaY*k}x0A1 z!sUcU&u_%u;Wp$|C(b?!zP*5kxbv{lnW=KVuz?x(2WqcTHd;Ch>-eiq;K;!Rt}E(p zh&-9jpNHlVQwjY)*UTh$XHda4v<2OYtKp}=+*sePMwNW^QU;^=9 z;rCsVXmOIAYY)TR4u;k}I6bAh{;fwpqKKGK1U9sk?Yd@gKtO$IQw7rTdeJzA;uvAS#bSke5#rZNUx<_LV zewUA_>h)iogMv#95ydo}j1l>&{cZdrNFsDnSTc__AykN};ULEyL-(JH8F@2wh0Zk= z4AcKmDa~bD_jSnbX)bCV(o2ai-OV@=Qtnxb0_2;sMRBRV_U;Ow_+UBVlosOn2d)`#=? zI+v^R)s=F8if*&{al<{L>KTh6o-4u-sq$yinH}APgAUl*`fe2?c@Fn$8?WJA^wk{c z;9`1-S}0BPcg8i}VyxM*HqCBM+uzA1q<|-p60n5v&{YIvGs9mj&d(vJ>_?reV?afvU*5+kJ#aw>n-rtI5_;b{gQw{A9dakYIAbarx+d3; zX4cie^>$Bj4D1;+tjqT1r*`k`ICK+UjxS;X54w$&ea`Xo+RP;xy30Zf=D+XQkA2Q! z;xRONfUA@WQB~~_jUmfp@jNgDd3`U9=x_eaz!hD*;Lf@{$e8{C%Hu$#ezQ`hTcj;d5_jkVrmVj>$j07qu)ycg#eAo7*x9a=CPYCSRH$z!jxiRWWRv zp*BC~D1U{?U!2MT z$#ARfNQZ4iV#+%W4D^OvfPgF#a17{8^$1_(1^)D6YUt;Lhh)k68BF*p>|rxmBRiip zRT@Cuz`0_>Yi_U_;o8@`KqDuVlTvXtYWU6pH?ubA*6P>R@}L~-^l~KjD+fQW=i89$ zHHCND)xx}V`;a)EnLlbxh~=d%)bL~C5SdQvbJ56PB67l2jmisFT`1fmtNu8)i7o~e ztGFwU$>Nevac_?lJL!t3)&h?~{O9LTyh|izV~SlV@Id$Pgui_BBk2xG&U(sXil7R; zG3mJKzxvJtfvHYcQJON`bWs_JNWvKdgnQ$C{aiO1vZi*BRJlD^kO8bZ9ev6RvBg(c z7zDe;;LarGQ%{5^7Rp!bPKNh!ZlH^OT4Ny5YHjzM$r8fR@!Erkui9z|!!u|#T%-6T z?0qbNL5T6R-911bY6Itea=cwD-$jJP>I{xvLM;elDGHiVJaQbKBH~dVw))-~zkv)( zK9>kk{Ww^gzEAArSgmzh9+|sG-+`cw|N|~A5r4vC7UAU1f*J7Z7}e^JVAy7 zywE;x;4K9S@yhV4EiEOA{`HdAxpG#EH1sRFvbH1SoL2%dwl(&T;q!Q@Aus+Z`r4y!xsqMwH%)Ed&t;UP5T^9cC4O zCaom&pIu0DkeIyj`5nzZ;HHlPJRNijD*ji5PyJZO;=>%!T)XsZR`>GGxzp^lB65lw zY~j8eU#$K`7OnZ}TM{4@V0>-PrjKR`HXm`fO; ziB8jNu+tibGI`N`VX*Z1KtE{l`~1Pw6%PKVG+lrO{eA=xKe|)vq>~j!U^ul+>D5O}$Ci76{E`#AAZSbwmcszG!B;w)MdO+Xf zaI|4l%p|9C`whp9go_l|b;iw5qG$eHCspmL-EC>&|32NF7wh&J(GzJ&i}eI*YCOwS$K!BWrZWwwV*%Y9h?GTx~ z%yM@ZvUu3%B{LyaYFt#&tp1HU3L0%uT*`lyI17aCJa06V=*v!aEt=M#WQp^4*p z(th5QIkGWIy0&ja1ZEJ&6Nwa*<*9WHoOUEhNcHVqh!LDOEHHxznw*&6x`fYU8!DMr z_EOUi=vGO8|BH$~k+|ZK)RxVwmNkw?q-aCJn(+?l8~X%d#~Mc}aJEqu*j}-d8Jk(}j70ghb z;R@Bn9hq(2^J0Q*f3m$f^d6WHq4}=pcV(PPy5}aq`FfK`66>*bQQNZv4mDb;p7I*N zCtz7?L>*=k>LU_c$-CXRp$uj~*&QFOG^{OTbTxWDB*?c*Zzv8D^i+aAS7qL#{4sYI z666Pc;LA#JPZ~aLE?G-QR-(|;^He(COrCi&pqm6i7}oJSr7h-Y{K#ttO;02v6WZ7f zlFXsJQ_9nE!!z))i~4$w`4wo&gh5E9lQB>@LvDtD*XfC{f>3EFY!p-PQiM-*M9WK~ zRdx@PGrd=CUTpTKj&t;A?Op_gybDRE4v!(%po4wiezCMO~tMvlIr;HbG^D6jOPYVB|$nWPJ^{eNeXQk+3+IfC_T&@=6i2 z*W>Z%7ic;j_?)zpf6>Q>CY6Ow>rXKVq zR|n-~Eyv`G*}kmMhm(VzP4=XO1;8#ED@jt@^HBH{v!kN6_Z^#}@Rb5Z9;*8v9Yn0V z-!}Zg6%)7d;?|8rAe&A7eT3sM&Asfd zqw2-T`<(fJ3cqGyLn0@8mYD)o$j+RiJ_OD%^k(*cc|c$!P-cpD zWA1@ZxHvu7f*BjfBpA84Dy!I%qWZ3w-!OiCx#W(2L_X6)^!UmOwL=6qCNG8&zwCE| z5dMZitqMFL2A%`mgjUYJD?s{%L1m9-3+FNov{gg&voSv7M?gDTG0(g6#UCf%xuu?0 zBTPj4SSOL1l=4S%b;(kwD5zvGlstTbNRxX*>2f#f)3qVT=1~Xg`-4Khth5kz8S3TBq&h! zxj@_wEjJP$s5sKMMb{9v#MQ|6!8{Ox3EoU!kKb|y3-~0x@hEVl9}5+ns)##I8H)1_ zoC*`4&a%~h4P|9*uF}SF$#ZV@3rFX47d=)`O_?fHP1Zd>hnKD)e2#(-}4jgA5SFP zI-xOoyQxzfDM!hOvSAVPX&n?7hq{KnCF9L~3RzplDNY!M9zvH`5Hf;~h|>7*W+@U+ zC&<+;|GHEOYg-WP@FK zp6%RK9cR5t7R|l>}{HNbAF2Q zYqt*sjwzQpv4p8S1 z2rQd&{m5Yi&EEUh*pz@b1<^^{AqrM&!0|$N{qeR&2Vvf89OC%MrBAtW00~=vZRE5< zx~fWDH2lUxUlec^6MBNtXIz+osDZUJPqb72t9c207$}9sJ0gvH0WDWqe8AvYcV6t;3bP zqB+X4_@bx9#d$juLc9yPZV2TO^cCg~Mh;+9jt~@eLtHArSqozd!?5{nJJ4%@pzo_) zZ0-=d38dXKpm007?kt2a*&2L~sAGk5-u9esGswn$9;l~ICSW>dub&4Buw)9o>q}H>*cSh7yyj^c`*4>p zcvk&}$Z_!_wND_}SN*Pvgx@odg{qwfm&H}Io@QQ#9MU@d0@#kYl1eqYNaoP5UJ@)c zNuoKL5KLLUYslNtMD!3xxbGqmEr<6#dd#nfO+B;ei9W)6w1hvPqN%cwkCxT1Q-}~Cm>%DW0ngP&rjHN%TBV)uyddlu*2@fP#9!j>P z-dy4GY)w#Xa*+{hv;NG?ywOj(zD4N{{_tlg>Dk+K!WG=Qhuey$DOoS^Y%H_XrhxFZFX zK5gt;GOCDx_h1SC{?vQKr(q@~I3_Z$1IN&*5`72DR9pV0d4QD~4G_R-$z?0@b@OW;k zfP6M6$^i>zI0v_06I($4A1V(I>60`*Y2J;) z*_bOq{zn7-m;Lo>E1LOCJh3-!0F$=;K@E}}pJ&nth-!@eK9CJ9Lj2nAR|GeI+tM9` znkEpR=G)nqTES)|4!(cV9wC93=94F%wf#VCy-|$(*NZ2lhI6gUA++%{0&+!boXteq zYJa2jeMX6g!pjxfHFQp$ znA3hzo0F$xlK3_43X9|z{G?!jKt>kaq5k?qh=S1vfig|5Q?vOuAmdT#;jl%=#b$gog|H~v#Q>(FRyj^ zM!cp|vA)QWs&g`i_!$AZeL){Abe9P6Iq6PbXp$X1N>}%tX}e`{!p~YpflC2TI8f1P zvBBX45Rj%Ow%o^I3R&Y_u%MX=7B)AzKl0t-SS%SuYS%n15xEUAQL)3ks4MPYbE}Gm z43khf=-8=u`%k;F^P?Xz76TR;tETAQ+jWEP?qXc89ay|5$=afVdu4ZH3k%0cA>&x` z3C;q}fU`m#>|Ak;LxQ>wiy!bNLds#KB7I`C@_qPPxOh6Zx7>g?1bq=!NetL!D!WRj zw&F^43_GGX6Tk+k$p%1vUyP3@e_^<%PD(#LXqmsf#sf1;?A%3Dgmqr|i0gdDDg3=^Hsx`@Af4MeblHBEMp(A0U3{h3ioi4B);#YdzYP1 zW&4+&kF^tpv-YJAU_8H;R0*@*iC9m!eV>Jf3IQn?PT;RxPVQLv04bh0K&rNr)^#U0s*B63s1dB4ej`$#`MKY)?M4eJmBLOZ$!*dGFDr6C?) z)d|Cou-*u9=sJ$h))}TgbiDGaSTyo{G?(W@;XbLqK=L3T*9m>1_1cG&yFMfdtgu!4 zY@dRk&POow3))lrcUfcu+zrt)2+}c``eNup7M?QZma4dK;!KpQ|I>FXkP;F-j52f2rH@MRr%%FC0+wjR`vNBM3FRV2FcuSlip(Y%K2 z-XOYH;qfE8%v(ub?y4GFP3xVTlw@aUkE-+VuiBVkxsx{O-l;61;LX$sk*zo~bG$ug zZ}hzHK-UE@;RlF-If9v_aBgRdZZP%dyNeHbOTErk8Own?y9jm-8#>x~sr3Bs-6RPFTvcMYiYTLM!O?-YetasfD(NaBhk7c3xIP{!4N<7j>d-J|X~ex1{jk$4 zp1>K|hQoUqNeF>_E`9U&1&xTnZ>BG!P7PP!`z;y|qGU#tGr`1#=x;w={B>E*p1-I!`wZP~%gAr)^C*l-O_iPM3C!~7b(T4Pa_ta%)7-XQG0cH#q(j4IxKIDR<3{oOjYXexP9XUrH%1lhmmz_`O!!95d^oBL^zP>WzO z^a~P!K5nVu7|>UF-8}tfGwBuEwwT{s?e<%_+n}DxJ(OFYFRdd01{)xV2)0aNeP2Y047Ol9K|!hU zF7B^c9Z^NCbNN^X@bBBHsmx>b)7xND+>8C?f|eGl5tX&Td9g$R-o_@@i9V|JU zVY%7~GbPo034#w$-YQ>HM#zwO=M={IjQ6qR0nf2W(c*S?7S>(Eu_8gePJ+zjvhVMhNcf(wV~Wd5Q)k_Z6$n6=!pMb#|ibCQTN&ftC! zR&=pHg9KB_WKAGFUg2T#I%BiD?mM%H_$o_Xg-o`UwIG|vts{v$Rewk|3}IB@B;@oL zdvvN&CIpOhI?MZMk8XaDwWC1f_5^*W2KlMSMMpx%L&q&IT^o-ss0>vk)BKw;Z2?gJ zdUA!`EB9%qh?ptA|6d2wq`5s1e#c}*xeI&f5DCF?zHLFAbA2D^l!Z6n>yOL7Uxom0B(AT->$`BKMU?o zNAfta?`(;?3v}rwQdD5F740~XXOi6rD`^%taBb0@sK9F(Anlv+G@ww`gtP z`nNt|sgtZ6X?U$`-F$4Ifx4*Y+&{0=)Vz+JZAB8H=*aM~c`%8%k_1x_q+fy~6JdJ^ zGs)J-gd;Mmq)i>o?skySK)X-N^MwrYAJl+Gva3W2anX{}<(C8R5LW>rUG;Pjv7i*E zi9dMVW0@HwH97VVFvK|6X#7Injpp+^|5)waKZZGP4c#_!#zO>z8rV~7(S&j^u72Q+ z3l)2J7B>V&&y!AHe=*EMr}vm%Rd3caR0nR#Nf_0-ng6-_8G>JCTelt0ag*Gj(m;&;@$U7L!uJu|iWz9OaJt zk#Wnr&?9i7!g)gsc1X{du1EiC|sC9~0_KcoH->}dShSEC4|)6ahtO^@c& zh5WLk5j7rKED%^9TJlIr{pOk9D){lapSLw_9EevPu_7qS*MMA?G;BX4wO(~36A`Vh zlARJp%`DN1Wn!}QkQ6b12Q-ulSQHdC+P5l5_P$nnLDeeaU@P2tg8_K#bX^FnZ>t6v zFxGXuNLh($9**%%zDL<(p=~k!T?Svd!bF3IaD2*%$ z+p@TID05mql2l{Y!#3XonI~CQ)ldIshvbt5tO&U;xODXLQA9xk z8Z05LXKJRYnUF>?#Kys6FJkR3>Bz4*O;ll?hfbY6P|8?o?mZi%cNj=2A+ozQr3$85 zimc};luQ+R;MC0#J1vi6#zpvwVa?JMCOtDmgBdg7)e|-rXSxFOM zzv&#w+5z{8#m0`U_es~&M8BCW7A%h@3|r3EOX|BMeD4b~SJ|Zz#dyTz((WH+vtcxA-dGt&!pML zM(DYb`T4TSyea_nR|Y+Fms*&G9QA)oE%Nrwu|63;=(h(70~IRX{~Ih!XJR0^cW@pM zUj<~v`WO2tcJR_HKfzS30M-+63xRiS7|% zdg!0YQlr)Olw?~rj{A$!84ocQKVN|F5DXW7BCF#eX#jB3cr}^Xku@Tr*Fz9bj;qeq z5)4$gR6yQLab0Fxj0gz1rood8TB+q0G~n>&mIg&DG8m2nL~9;axgyr#x;3L4gC0#l zV*7LU0-|(Z6o2zNe|n;JBmtHTATX}N{3|WIAcIXBE6&OHt-(=rfZ^V6iN@gH%Isq6 zsUhwIPD;lDEgcUI?hcKKu)Uw}0K)NUzk2T@hg+k3EpuRLZ*KdwP|qhanUvPYx#$s_ z2RPC}ebB?p^6EZQc?4LSeK%8_Ys7-Z`I$j5I-HGpki0Q$x}?vKMj1ChVKqS4n4N+- z|HMB_vIBiP#qIKL`uX1Bupu4m<}YB_J3V&!&dIbyk93(gYj zWp9iOI-u8dwHwQ6km&``lCN-j6jjm`gIdmH5;JD$On1;tDg69vctIl5O`P85?rA#2-2{oCvTsv#QjE@e1jtyU! zB|kS$SaX(k#_1O_en|gdw&Cz)y?7VZj$@3v#AJc0+hIO9^P()x0IRWBqJ0s&Hz!%N zdfZSQ8mvvM3Y6nCxvm;%rc`>NfCFuAmqs37YFrPo(QfMM@7v=$2^)7FXpq%aud-+e zqIEUS#4N89uVGAJ4B~nx;jQiCVv=4Yk3<2OR~EA(#pET||=_QU5P zW_90oUGm?|mLOm#p`;sBPBz!XH$Une+(`KR&la!4fvzVz<0Oz8<73v_6>Bw zGd08KG=SDC)`?_bo>UG{WJF*aX?%as=8A_DUn$_hkod_sdf|KVqux3C4aVj$Mj6X~ zcOCn`LI7>Fz#|b;@>QN7A|yIJEZbNURy{O8bl_o829nz*((D@;g4ZNdey2cT^qWNZ z_GP(H?xT@W@*=D;&|}QYZ+B{TQZ?qS5nt#n9qhq%i)BGG<^rvUKcJOI2Rz)TIXJq@ z+14kB+<<1`{~?DG)z+*N<09!ycJHn+_qbw~XwcL`F|LOc9G%rk$=BOeNeFAe_dxQI z{MrlWYvPg{k!B%egKi6-=Xc>jZwCcKQjW>m`KODlT~uC^g@Wt#qD^bnelB=Kucv= zTbm!DxYCMC0J={2?S|9DXjDFY4$WeoBlV4K+arvcu2EZ-kh_{yM8kIxQoWhdo?7eg zq3S&21@l-Jw0>>+1Aty_jJFhNKsHx@zhFoFNchyXVTU+NJ<_=F@v;R#W=e@Vm8=3Z z1~R|$y!-j@#$5zt{bOC*!U0@70Xd-r0rtz<1pPHND?>>z5fvm!9h&oELZ+1gRtIzN zf%vWlqDZy1nPEP_8Yp$i82PC79_pB6;X+JMwi_C61;CDSJ%f}T(gpaslZIC<$ZbDo zxtY&_BcjdWf<5~vG2m&}i>-bvA*7gDW*cPJF8Gi1S6+oxVQzVA6G|1UnuVO@^>_Uc z?v4zd8HQ8qwb^0CcZLmlj^29A&MKL~2Gt#WleYK%uuwVqOXTd$m7u`F$!?I<%%sGg zft1Al`v_$j$G@oBrTqT-PegRMQmtEq-h&E9b}CQ_(IU^Sn|jzM>?Lr$1o?nVL;NvFj!+*+O8#snp8=3 zgZfgLQzbVwoZx0!cjVxRcZ2zMex9T2v`%mfa}X~y4eptc59g`JBAFYYKiWu^f@x^9 zx1Qcm?~9!Hz<5`;ylx*so4^MhNDfy)F(`PxW?#DF5@$@0!stJ1Y5lo&;9-LJz3$d^ zEXsU?)|v7;bF_{FF=NIRqTOl9)) z1hkjl*}TKDl_&D^R-K;R7scgE@ViN3oNDT@kE7ud)n4w455)5RFC0^wg)zXq>fB$af)%uvr_gZVEWDz)UEDs|!A}q5 z&LmC8<9m!-+}Pjm3s3pLK(ZG%kDSsH$wirV;4ix)+=u`iP0BW50xloC0h#)+PW*ES zIG>_!!%pFrE7mF}zI%oHNqYd9w4+s#wvSA>fB%kbvl0SfGmjH55?vY7Mo`}_43Y9# z#P#>WEs>QDpbi8F@J%T@$nw*>(R)a{f{XWDE@nc4W$uA$nh61(VLDw8A?vttr*fa@iY(tu*`3BO`zw9F-{MYBuxE}g zt$yXi4yiCr(aTHb*>tdEr1<+RBt^Y;eyWK^gb>#o=|2EUUzqc#1i?`E#$G|kk>nAL z-cPv;^IuBBCB8*U4Gpp5LMnR4+dATc7vE5oj_y+PfU>VIkawEXdr90Gv}G1E6jwr4 z#m7)y9)K~xYTv3@n0ae92pZ@Rv-IiI)gbj!KsV`VqXKl0p{yI3EC<_6!M!Su4C{Na z96;@ZkDbD5ALAr8JWdB6v&Led?#0KRTif-qe+Yp5-^35fm%xkw?*_%GLw4Ai&_5Wp`fAnge)NAAGU%LXy z?>db0CuzJ=*o`@W?wT2@<(49gv-iw`01n3UVw{Tf)M&(RQ^>31lyBGf2wx4(ann0U zh!?A*Izu_gs%os(M3uElv{dF7mOmc(Ay+JjJR0y8Pa(%eLe$=LUOCm3@r|tg5FW0)l95HQC5;MVM6qGEigiNW;j_mW8 zKIS}Bvur`@1RJjw(3>N_C!8jjxHd*-!3Hp4Y6e}Zlk5uc29tM#EWsmA)`0r7SngqT zDf~S=MiYtrezYAxd>$1#+w<2-ZCY{=*+C84f99n)9L_ybnXz4-FWx9Hbd00Mrr$W(1pDXidXQ~#$* z@=#Wb1}%!iB>=PdS`;gHxCh6x$-1Nhg88iRejfcNvnaN(?mEB0|&DW}hnzy>HuW z%D#Du7A;qZArbj~zKOuFB87lgK}lq5#*2SH$5d{gDdTDrfEAzpM9S`K{SgXyp%nn|?FS%0Hvq#@RkG*GvQs>XSfY$~_LO@< zs94WqtA_(=dGW-S;M`Q}TNjB4?gQIzUjJqrrvQ*kd(+nYKO4_T4;70=Fq_rIfJ8DJ~S3wBuDjyJ(9Mgz^@Sj4&vDQrm+$;UxpHu)?0b3BMQ>L zlPA8FKc;Tzx5ap{3; zBFI@Da|9#6eTyjb9I{hdAP9XxBIAhsM46xr=mEM5}XC$#rS#mFWf}XN+A0Qg3#nvoN*w0J);B%pdr-*k1Z4xns35f@ zW<--Plk*^W9tb+Nb%5ltapiOfX`QBigTlH(IQkRfy=72z795@AzcwXmP)yXFbV`M! zLOxc_QuB2OW-8?9NOo>|Qu>~jF!L~RM@3xt`8}4c(2|Mt znaQOq{l#-Z$ab#ay{cVMYD=K9u^-eWCsUt0QD2vwNh0#T%L1S~tDvPS7^%m^hVunq zukT4|VI+4PKm@cy4fC_V*2ty3*wAV5hWxTb zXdJE5?aw&62)??f@fk&hM2<-LVwjMWT#lf70dN2yDZrP4Mhy}K!U;t#z- z^CW^U!qR9@7?T1c6p1#|>XibqLpn+S!kUd5zw2M0y0CQ396~CjqvG9F#pOSQrXqh# zKjmHu)m{n^ry#Ux2mo5o$l?KN&VQOz8d%pF!Yr^CJbunD0LDHlRkQiOq@b`mP;6s|JAXn8Sj6aS@Ox7EzzV}vJ!g-Gmlj= zw%PR^1&ZP>mOjLf@g56OYOmFXV(>1C86^%#b7?CNRDU?Plup$Kt2Wi#NS{|e zieqo$@-2QWD0=8BzOEa{IwY4PjaC`F`#4Wh^YZVBp{6ap)n&GVEgJco?(fi{$LeBB z!-_+&C!m)47{Yz1G>I#rV!o&Jr{Msy8r7nOn0MCG4w0a$NgRqN-@E3S8Jfg&KEjo}=8;LhQNm>t*ogVKNBOE-$C zz{A#k&kgu`%VcifZ29aKId#5>ZtE&suZWZb38ha$$D<6Fi&i58*CV<{C;f`c{rh!r z)NAXqp=*tAp1HiR@{Nl@w{-gdK-EIxjTNaWOdeKTp0)oKXn3+G=bNN1SfJ+6zykWS zt73C~Cf51mc4Awz|Ha<@8R^_LL`X}pfzQ?6-eGjJPh0YIw{SVOefwBP6`NP)Z~JWp z%6#l|Z{QTw)8gY3fjZ?_X|jP%pd~2mA{>lqt=HxQ24x^aGTS^lPIwOe6t#KSklLaR z(`gf!0WX6rh!Yfz)Nc%2X5^R$i_X8{IEB@-FHtJ0q^e0ox}3XEPw9s$He_sufKx`U zk7)ivHW_2Q0XN#rD3htJjK~y_e44VVQFhwdGW~5H(T*aY?>DP_WTeii08M*DiXW(0 zwC}4rbt0V*wO_?~I( zQ)qM=yWzAvh*iF#u9TJiKnyJr?80jTxeh`r7nUw{;n!h66Lk8ccawP}J2ofop<#O+ z{)%oC#h`27>avm80;uKvQMoS!qnZc7z$U(2rxWPcvD4ouDG}-1?Rr=cua9XHSb>HA zXN;(+FQZ#r5|(3o+{uT~xhd(61LQhC^I*j7ZUwPdWf{1Ev=Wn9Q56bClEd$amk8w1 zpM8*g0>v13sToDxF&)r~i{O+Kj}c9sORsYJSR-_!g^t0X{xLt-9n65UdtbcB@`*F= z*ZVLnSd;(`HB&vH^UIml3tKUlcn=j575W9>GlR*T#44G>OP$84_>0-y5_1EOsiJk4la$9h3U;iH@Wf2R9x&xoGo`7qfIbuNNh-3OKhBSZthjQKVKuQVSE608p z)c-m0k;BL(F>I6~qYngyOd4(J40dtCnr@!w%fijWRVg#h$?$?ry&r`)*LRRK7@wD? z!i`y!G)%H5<0Eem>ivr~81&fzOFHp2`FzD|E_*cbBUsE6ULno6z&zaASoG5r##}nA zA-oT2LZyFWy0ScMWH<%tIml=JJpArh($w3#riCoD@(cV z5_r8O3Ik$;w|L}0;t-MT|B}YsTkM}{R$d^Thq+V%%`257Sz?IINAihLhszW&%`siC z>e_;{CY;;cy_IGMJ?M~TraJalLS(+l?1>7T;~>zbckqxuIY7CZVdm5dlV?I2t?2h# zn-PJ*68_j@gYV1UeLCxVlXFLoOXUM~`lMYppm$m%3UrE2;MPbS+= zvRY+?!=@W#IsI;5%w=?z-hvjRX%q`5kn zBd{&p=Z^KzT5wz%*KjwPHRd*qhuze|4W|Z?sXQ!{Tg71lAIZuZkd%T<+E4w7IFWt8)IXty6sjJP5Bro5P;njC8=Cc zUlw|_R1HfsKT`@uzU0CaZbOpiCN*+Znt$^!vj_-&Ddu6L&cOjlVeG{C&u!G&1!v=& zBqz5VpzgL>@qa1wO;d_^7iPI+pTr}ML_94j3Fx^+ zp9dHa7Q=dWun4sfRSD_V;&f98iyeYcw&);X=GS;mIc=P~vWC8uqg6q682pjS`0Jg` z+>%cReer%fGg~hIXiV%!ZZ$oU>&sky2gkKrp1uD#Biw5B)nF>4f7+li5QCL@XVn3?Q4n8SBP$qOEU z;qawLw)CTDtzkhfo1F_>B1|#r`<TR!l_80= zMQGR)dK&j}w+%dj?f=TyvW$N26Eb=)!~W48`g-!AnJVy;$^7=W!ibru^E`{yw-Vt9 zm-*Kf_c&;s;wHt+-}A?T$_^Tppwm_tMJxVBsv3cZ%slza3H~$fBqCT0ebIqOisz==3b5*4#7sj^YdWkpsWt(KRQ1xCy|2E_ zVf=BM;FNS>ZU5er7N`x|L369@aM(i-7YgCKwb9h*Cwvh;?tB%Ny!Bi?1h6+~1z;Zf zMK^z*%1YU(7kR^YHFFN%SZ%0txCL|2%C^Z0{Le7sp>_K3AbM$vGLa*iY#~|}vz6UJ!lN@#?S6!%f zJgJ+A63VynD86wD)48bKC+>b23%)2Ob7aKW41e%>@^^EVJ zAj+XGw+9t2=NrlU52;m{=I;}(gWNk?D>7@*%tlqPWG_-aPNBm2vkkT8|f@n3y z9-$&MwbCK=$j2#G=R%g@Q>FDlqo-m1pBFYH;2yb(0~k{tW3aQAeB9ep0X$1yci!5!>$?NKhMivU!~HZ?S7 z#1dqzmm>ip+9i7;*e*{rkC;d!Qf1GwZq*i{`u*d*)uA>p{fK%%boJ0_A{Ik#eCkB~ zWagp|h~~t}xm@4Tck8R0K6$u`iYLqVxJ$JW5M~r|i;|2!HCMOwV|3_r>K%k?8Uq_i z(FjbwMryu~R{M$SEGTi;DjyKqDMp7g?1TvzgeD);?qqv`hg%#`J!rW>an7!%(wpNv zM(d#3*K}_G*HyZ@GME#hkZpo-XQ^3`>3iNO&aK|dDvoA5Ui~Jg$-YI#Yw8biRIzHu z$5z^P`t~7&D{I($Jw<^iNiE}z*p6-1+AC$&%fLPZBZ8^|xt%ebh(13S`eQQn>rC?P z*meAyXuzrGEpV2D`T*TtOPObFx~`kr3C90yB3BS0*G3n<5XNI z)m|qtZB0B?#1vKW*tayGU)AyVdOCyeZ;njq_snA@J_`_hGA;$`$-_`Ydoh6Sy~Ljh zld>AIN$wJH(9FG<(c=~0_7hY95@rL;INH;Pq8KkVI}b2tQ-1Gvrv&HVyyhKQDB5wY z`%dBpze=}*3BT>hQ6pb6`cDtDZ?t^4Y?(MYrg|a{z62oJzy#e*XwjIBDZCbPamOTd zGT73Dd!79|sk$z@Fk{NFU`b(*7fxu}Np0e@l*cq`jfv$;`0aj3Do5my)+*<)a}|6r zFQwVvmun0`UWv0i5pF9a04iZ+%Yx=5v-yp&YV~3+p;v`r>AUN`humKOM0RhkqA>UP zWjW-~kKt?RFYQ9t^IRj~gXz2<-peR>Hr&>TYK-hEn5iA99#ObzipUm^w4(19^~! zj9?*Nib|U!Q?QVUaGKE#+>Rw-t^t*yTIEs_Sn(hGgH?rC09Ds}H++`UhO>HinY$ZV)8ts>2s@&PJSD)=Zlu02pTjr_vR7NY z8y60A$Gq;i&+IMP>p$G35womdd+`Vk6zHkm%JoLh{#)BB`P^Qb2)Z_Msr>U7@O!3m zjYAyx;)&0c9G6u1o0aM*tpd2dhl6_HGACIhI#-xXo(-yV-+_8AT+-?9^~s9A zs?{d0-a8u{IGvr@#(00bM3+i#K+91bz;^1!I}K1HiQWaN7hHC;a-U{r)TmQG_esD# zghJA1!z`?!Y5X&f<2mLwm_Atxc9@;p7ALAUg0(CX?A3s-M}DmzjQhaFEJ0zu5>5-eUz!Bx%0!ChDy!zY D0IMox literal 0 HcmV?d00001 diff --git a/Experts/Nkanven/Framework EA/EA_Template_1.0.mq4 b/Experts/Nkanven/Framework EA/EA_Template_1.0.mq4 new file mode 100644 index 0000000..29c3185 --- /dev/null +++ b/Experts/Nkanven/Framework EA/EA_Template_1.0.mq4 @@ -0,0 +1,181 @@ +/* + + EA_Template.mq4 + + Copyright 2013-2020, Orchard Forex + https://www.orchardforex.com + + Description: + +*/ + +#property copyright "Copyright 2013-2020, Orchard Forex" +#property link "https://www.orchardforex.com" +#property version "1.00" +#property strict + +// +// This is where we pull in the framework +// +// Use the following line for the current framework +#include +// Use the following line for a specific framework (replace x.x) +//#include + +// +// Input Section +// + +// +// Some standard inputs, +// remember to change the default magic for each EA +// +input double InpVolume = 0.01; // Default order size +input string InpComment = __FILE__; // Default trade comment +input int InpMagicNumber = 20200701; // Magic Number + +// +// Declare the expert +// +#define CExpert CExpertBase +CExpert *Expert; + +// +// Indicators +// +CIndicatorBase *Indicator1; + +// +// Signals +// +CSignalBase *EntrySignal; +CSignalBase *ExitSignal; + +// +// TPSL - use child class names instead of CTPSLBase +// +CTPSLBase *TPObject; +CTPSLBase *SLObject; + +// +// Indicators for TPSL - use child class names instead of CIndicatorBase +// +CIndicatorBase *IndicatorTPSL1; +CIndicatorBase *IndicatorTPSL2; + + + +int OnInit() { + + // + // Instantiate the expert, use the child class name + // + Expert = new CExpert(); + + // + // Assign the default values to the expert + // + Expert.SetVolume(InpVolume); + Expert.SetTradeComment(InpComment); + Expert.SetMagic(InpMagicNumber); + + // + // Set up the indicators + // + Indicator1 = new CIndicatorBase(); + + // + // Set up the signals + // + EntrySignal = new CSignalBase(); + EntrySignal.AddIndicator(Indicator1, 0); + + ExitSignal = new CSignalBase(); + ExitSignal.AddIndicator(Indicator1, 0); + + // + // Add the signals to the expert + // + Expert.AddEntrySignal(EntrySignal); + Expert.AddExitSignal(ExitSignal); + + // + // If using fixed tp and sl set them here in points + // + Expert.SetTakeProfitValue(0); + Expert.SetStopLossValue(0); + + // + // Set up the Take Profit and Stop Loss objects + // Remember to create child class names, not base + // + TPObject = new CTPSLBase(); // Create the object + IndicatorTPSL1 = new CIndicatorBase(); // Create an indicator for the tp object + TPObject.AddIndicator(IndicatorTPSL1, 0); // Add the indicator to tp + // Set any other properties needed + + // And for the SL object + SLObject = new CTPSLBase(); + IndicatorTPSL2 = new CIndicatorBase(); + SLObject.AddIndicator(IndicatorTPSL2, 0); + + Expert.SetTakeProfitObj(TPObject); + Expert.SetStopLossObj(SLObject); + + // + // Finish expert initialisation and check result + // + int result = Expert.OnInit(); + + return(result); + +} + +void OnDeinit(const int reason) { + + EventKillTimer(); + + delete Expert; + delete ExitSignal; + delete EntrySignal; + delete Indicator1; + delete TPObject; + delete SLObject; + delete IndicatorTPSL1; + delete IndicatorTPSL2; + + return; + +} + +void OnTick() { + + Expert.OnTick(); + return; + +} + +void OnTimer() { + + Expert.OnTimer(); + return; + +} + +double OnTester() { + + return(Expert.OnTester()); + +} + +void OnChartEvent(const int id, + const long &lparam, + const double &dparam, + const string &sparam) { + + Expert.OnChartEvent(id, lparam, dparam, sparam); + return; + +} + + diff --git a/Experts/Nkanven/Framework EA/EA_Template_1.0.mq5 b/Experts/Nkanven/Framework EA/EA_Template_1.0.mq5 new file mode 100644 index 0000000..89eba15 --- /dev/null +++ b/Experts/Nkanven/Framework EA/EA_Template_1.0.mq5 @@ -0,0 +1,224 @@ +/* + + EA_Template.mq5 + + Copyright 2013-2020, Orchard Forex + https://www.orchardforex.com + + Description: + +*/ + +#property copyright "Copyright 2012-2020, Orchard Forex" +#property link "https://www.orchardforex.com" +#property version "1.00" +#property strict + +// +// This is where we pull in the framework +// +// Use the following line for the current framework +#include +// Use the following line for a specific framework (replace x.x) +//#include + +// +// Input Section +// + +// +// Some standard inputs, +// remember to change the default magic for each EA +// +input double InpVolume = 0.01; // Default order size +input string InpComment = __FILE__; // Default trade comment +input int InpMagicNumber = 20200701; // Magic Number + +// +// Declare the expert +// +#define CExpert CExpertBase +CExpert *Expert; + +// +// Indicators +// +CIndicatorBase *Indicator1; + +// +// Signals +// +CSignalBase *EntrySignal; +CSignalBase *ExitSignal; + +// +// TPSL - use child class names instead of CTPSLBase +// +CTPSLBase *TPObject; +CTPSLBase *SLObject; + +// +// Indicators for TPSL - use child class names instead of CIndicatorBase +// +CIndicatorBase *IndicatorTPSL1; +CIndicatorBase *IndicatorTPSL2; + + + +int OnInit() { + + // + // Instantiate the expert, use the child class name + // + Expert = new CExpert(); + + // + // Assign the default values to the expert + // + Expert.SetVolume(InpVolume); + Expert.SetTradeComment(InpComment); + Expert.SetMagic(InpMagicNumber); + + // + // Set up the indicators + // + Indicator1 = new CIndicatorBase(); + + // + // Set up the signals + // + EntrySignal = new CSignalBase(); + EntrySignal.AddIndicator(Indicator1, 0); + + ExitSignal = new CSignalBase(); + ExitSignal.AddIndicator(Indicator1, 0); + + // + // Add the signals to the expert + // + Expert.AddEntrySignal(EntrySignal); + Expert.AddExitSignal(ExitSignal); + + // + // If using fixed tp and sl set them here in points + // + Expert.SetTakeProfitValue(0); + Expert.SetStopLossValue(0); + + // + // Set up the Take Profit and Stop Loss objects + // Remember to create child class names, not base + // + TPObject = new CTPSLBase(); // Create the object + IndicatorTPSL1 = new CIndicatorBase(); // Create an indicator for the tp object + TPObject.AddIndicator(IndicatorTPSL1, 0); // Add the indicator to tp + // Set any other properties needed + + // And for the SL object + SLObject = new CTPSLBase(); + IndicatorTPSL2 = new CIndicatorBase(); + SLObject.AddIndicator(IndicatorTPSL2, 0); + + Expert.SetTakeProfitObj(TPObject); + Expert.SetStopLossObj(SLObject); + + // + // Finish expert initialisation and check result + // + int result = Expert.OnInit(); + + return(result); + +} + +void OnDeinit(const int reason) { + + EventKillTimer(); + + delete Expert; + delete ExitSignal; + delete EntrySignal; + delete Indicator1; + delete TPObject; + delete SLObject; + delete IndicatorTPSL1; + delete IndicatorTPSL2; + + return; + +} + +void OnTick() { + + Expert.OnTick(); + return; + +} + +void OnTimer() { + + Expert.OnTimer(); + return; + +} + +void OnTrade() { + + Expert.OnTrade(); + return; + +} + +void OnTradeTransaction(const MqlTradeTransaction& trans, + const MqlTradeRequest& request, + const MqlTradeResult& result) { + + Expert.OnTradeTransaction(trans, request, result); + return; + +} + +double OnTester() { + + return(Expert.OnTester()); + +} + +void OnTesterInit() { + + Expert.OnTesterInit(); + return; + +} + +void OnTesterPass() { + + Expert.OnTesterPass(); + return; + +} + +void OnTesterDeinit() { + + Expert.OnTesterDeinit(); + return; + +} + +void OnChartEvent(const int id, + const long &lparam, + const double &dparam, + const string &sparam) { + + Expert.OnChartEvent(id, lparam, dparam, sparam); + return; + +} + +void OnBookEvent(const string &symbol) { + + Expert.OnBookEvent(); + return; + +} + diff --git a/Experts/Nkanven/Framework EA/Grid/GridEA.ex5 b/Experts/Nkanven/Framework EA/Grid/GridEA.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..72df996339e1cd99853d8540a1ae10948821bfa5 GIT binary patch literal 130602 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ⅈ zn5MEJ+;0^{fV*5#(Tz`Ha|pmIK9dPYdmQCwu*n;;g7L(2Tq|Jpr$`I<-|Z2lrqgyNbl4 zOU2YUkmme`z>mjwoT^#5Z zK=5C9O%!O(+T~Lbe*<&*CdrkS%a!pT{x-L1O;e*$sH*UGH^Nq5ECh|5e5bpmIk7zY*qc-iF_T2#i00O)mjAD?d$MLI14d-{b4k zt1ZUihh0p`ADhX&X{Ax_BYh*Q#HcbEYR~PiE-e~l@iZV2ZJkbhS|Ba|y`auv zRNPVyU{CaU!)%nE7{p;J=#`l=X*%{!GXduYPa>S1iOvPNQvit`kT z8vG2md%^=U8RaxOnQHvEmoM}2;pVH;zJxZ;fKw>e9-2a*HCfGwmO5$SUG6T3!-8HL z8f^h8^G}uA%Ns8V5RLvw96<|wL-kJ}N+G&I`I#j<&#rmLcW+$`y!y+ra(kZMq&*~< zDk!!=daA+*N2>HjW1kOvBjS|KC1J~`=AHIx){UmI`%L344qLkefbMNJsB$PU0Fhgb zYf*%%XK%kz3*I*%V0q%?X4+g<#q+~+J_>{pCXBm*ZsLxa#}z6KCHXRWTZa^{4g-?| z1AyHNhrgAC!kU!;O)LK+<*P|~V5hGaJ4!1^;aRN+(PTz$=RnhVaMzSnpqnc_!fY}7 zcEz7bnfCLe^ChVqT{C3htjYK#)tQ_CTlseU zriFcC9vE!Xy^D$o+@-P7@oHacX32g`6pkybg`sjem%?k(j+ZpOh4Fl@H6_X_;n?8Hc zpP*T1Zz$iO-j)om`1bkMX?WX`d_*kqWC$|FQUKu&~MzCE)WzT_RAQ@MI>DQ1-iin>n1_GOXnPzT(bSbg z=j-{*{<>A{zs>i?T4|@vV`4-?l6t1+(SANvSo8Syw5*q(T|wvx2~G$r_~-ZzFpVV_ z=62arzKU!Br2eq9L<0Kvan~@C6a3?XqlbYxKX%G+%sMmR!iX6tS!Zo(F!VMXrNj~Ja^JSN+V(767 z=OCa3Ip`>4zh_7kH6s}msD~ttb+k^LaVW~A#OTKzQI42o7aeUcoU_ zaP67MdZsJtrKY|&k=Myq4~mph8O_5+Z61(9@5opSe;}=N_1e88qzRBOn!P07u~^G( z&;hSG!eU){Da$F3IqK%^q}d(q7dedJiLkVsu_O;?2naP1?6QVx`;g@=k&(ifZJtUX z!v7xOXdrdpa9RlxmIc7 zj`fs@>$d3lB+am*q;ttu3bqRicBb)4#KA}BJ^7@^i){@;S#)wrZ(Ii4};nLo9b8w-J_>nMlQWXdXBG<=o#w?xe;IYbXl= ztziuO#(W8A0@yLcGOC$fC^K9{qHXedmVcG~U`kn*#*mb~vc}f) zr&$X~$Kdr&-oWE|)2B_Ia9QlQ1Y^OawkOio73M5)TXt_oMR{z*thPI@fKtd|wuTSP zG{8$}&?`&hgbW-Y=IiIfCl*>3#7wI+Vid|tn6cWv&i&+5&RwTb70g}fr>~BS0D$?0 z>i1p;CoD8JCgKJ#W@xI=irE|_R~+8)l^k-@ZUU_6u#}{Yim@@#pgAqHvn-Ok@@HAR zcCR-f3Qv*>B^3fOrnfM8D3n%}eA&hkO@}*!moq$%1p7}!0-KKXGx2_d8(d^bX3l5( zT&WNeC$>q>?&!9hOU9Pbml$2BkSd#DcjK)5@gz&xkyJMC-<9tAb7nY2OF)o}`*eq9 z?+6$U8Hyv@eF&Y@3%o(9N#cSBWhMCzna$$nZ{<|cSEUwjXPL@qDw!%y?S}NtT(Z8{Ei=HBD>+=w*$2RuohEf#W^P^qJ zWAl*x`3+dh>J(XOiX9$I)gZJ$|9xt*IgToIUHU^LSRVN?Noo8ujilV_7|j{qXJ*>@ znZ801uems(TfaOCoP8+^V?Ud37ejMRe$^MMP)W2&=fD&K^&H-mKQkWkHRFiK@Wo%x zd=nphW&+<53@d?}jP3hRC<&Xh{}v8+%E#CHX-)KLID%Q1Kpu_pWa&HE%2)lqt<%H7 zxX~PTO>RpWaV2HjZ2Y^UmE5tDPC~ssL=8S(p;dQmf*N$;qy&)qyhr`=L1Z@&Hv2TM zA;_mj9%nRHsoi;X?rKj|zp0 zZNqDOY-dzKXPe^uGQhnom0~l%16N1EE`^ZPM08yO*E;G*$=W%xE zL)WmzP!XL4PketzHP0}0Z8JiwvH=(lf$k(kyvp$-mn!J{w`Y}QIFI~q?s}ri_8-lR zYcl{CxU#`%5q7DO9v?X~$+V3X@V9PcjOQjTm{5&4*ydzJ+AS3(=b_b z{mL|8uc4auE++<@!Et5hCnrcOn6RT|4okQvi_vJ2E?Ei4ZXL@e0XGHj+r;aJl^#HxGtfrhd@=SXMuh_Z0U4|l9GJA-g~AN*qJHnfJWu1$p{k-EM})n^T4jn;B{38s@c!t7t78dK zHr$Xh|vs=e?4mza9h*C$Sb}JF2yQo8jey)C%bCb!)c$XIgteP{@_SPH)*1<27BQ3^wQ1mpe(=t^BGsNO z9!9MlUp?`U11XxmOt~|N1}ELQRWEfjI)%KW><6`SaME1jNN)^=?IzIu9&C4>nhxKtJH9Pv9A~uT6&`edm>^eXDhMKVMXJnM-#&T(`r@UPWsN-Rl z1dBVCl#=*M8sR3Ym7hAqe;eZ$EEqqaMis-f8E^m30wL1!(i)0+!2zLtnE@#0;EjK` z;KE-nm@!hE_c+iX`WlRKyopFK1=jFI&0?hQoH`vHrU}!ANS>{7HxaWL7c8DFKi{3i zeL#Bt{VWwgsm=4CU%yK1<;Sgb4A{F`mD{09ufhI63b|kFUcc$GOCo;KpYFy!nG0VS ztF|M_A{chh`GIz+Ancy);-G=+4l`U@PZxvlrV0xR8XR^LkMPl80BHg^3GQS~8@WU( zF+){Q6oX~2R9Y$t+%NlL^6`$#LQM^@ff_VRh?S=8!|xnW0mHBOfjA{igiVjPATt=m zkj(0x+{v9NSVK`C-!f2Q`rIZG#?f-Igq*_9iFHc9*>>73eIILi(5^*r8=;fbPyeiMn7iEKNx|GQ&c4&tK1G?RA&%_VShk{##Q zY`r-2ot4g~=qoOrU-kB~@!7S|1#X~o*fy~iJszcTInB*`5dH9izbIy}l~MJ+9)2(e zE>4n&;K<26>y(;+cDe1y=jo%dJ7hx)3h0nTEaxA7TR3w9?KX<0lmAI?4#*IRwSQDP z*8r%ei6V*D!N6k7@iYHTEwfVD>&0g1p|V$oWIgWd#aqcGFM#1%AXe~len*|A9r|?s zWLXO>S>?@q6rmYH%QzaXoa3OmmTpiKd7UJNAxM;e%NjRoZK2P;R`B$GURs~&_kMeriNq&t8jX}b8 zd*9G@JltnrMVLfL6W53w;B}t6osu(@=RlOg;P_Ghk?)6P2Sq(PBW3i<94rNp(bzau zq@7-=d+6bX|0VhX09!Kuv8R)rvwNKNvuwI3!Zdx8l2K88KykyCODM7 zk2_(4Pcis)^0$UR9Y^PDu8DIa-7Fs&%jw64@=FjspABQly-(UjE@lY5;lzY1jsI;A zgxOb7^hx1?Z)^jHQ#2GKuKcAuCMsw1#JqnugxZFw9<^4~ivwaCFl^_ou5=yp6bJ#? zl{6&%a6d>gPkM=-C(x(ZLe(%uHHiZ6#K5zg_w2>1UP z&4g3!VbE`;z>_y2zPVnn0xOg9X#P0Lr8cl@P;X#}Dc2!4fIF&PK=;Hj?kw9+k7DJj zmod`4hlp@n=vRgr0kg@GeAcS>nn9S@Qq)zxYRfqdS@5=c7lNKF)#?f@=7JRa;0I-0`Gl^5|aKH`%ti65ifnv zdUCCNgVp6SWP9QB3X$kpg%Vp&V_{EGMK139pp+oyx+Zc4*j*|?UH@lfzjBl7N6{O< zcHEJNMz(IFPTm%9{H#0Gz)ZxBy@P(Pl6#!mu20NWoPJ~ygxi}i6PXVJ;%S)#(%Vtg{f1~+yk^22l9|pQ}(9g zp`@R|S^&){bXd2QuOtuUA9OxpT)xC@8rI1WLsDb7%ElAdGMnV?l;O0v0We!&7wy_r z|C>y+*`#AiiDB9X(}ZPks%uSqcUUMGV~dx?N|*TA{jYq|NPdBM6Yp7zc!A@@vep+$ zv`#rM+H`pnDSqv77f)aFIJcC;1-gobScSlu?0xwU6mMid#bEM1xK82ChodZ2HZp3n2r0?rnjHy=(rN`A z83bWCmw**&3iI@^;gK$|ZMT)<&4`ic@&Q;{jG`Yi!ns<-1hr z-ns?2`nL_$y^q5UUb^%(zoM9w@SHlYyn-O#A{>q84Ui@oFNE5V47{ZQ-RFaUt%4lUL#KNL&%APfDV$rGU_{%t^ zf~8{j5nS19l;tB zIm211daClUex&?e?o(A81}}@Z7}!^4_N4Jh)pA zfYZFUQ>=9aNqgp>*Z`jXZc08wcv3ui<=6;*&c5UxMKbLB@OG6{%)opk;A-8B*}G(v z^`q#=E-C7SP_t-}=^T6S)xsh`X`pks(1lc{^5&$>0m;9Nj`oF!M(bpo8DEV#IPz{WFqCi)Zf3Aot`Imp-_lYzn+M8$=ahHCW z(dcz8V`N++xud}TIZ2cV7`WQlVUZBlnhkcSE@h9hx)&w|_a3k%h!wd_$^4yToiD!Q zppdllQ9g|^;FjOS1(gqsb?r{}HfEfE^NipF#>0krvRa~RkDtVx1!lJxpOd6tkARYcZV++GCM+e86@hJFhI%n-OO3+e1uTXyd7G*CugB* zc-_mqYVWLEYlHey#L^A~yMD)FfJGB=DyjMLRaYaRb^DM7VvViVBeMcKiQN59?5S%D zS2;a3is_AP#wqfl*v1L|W{6E^PLRg0aqs+DNO>6k&n)&@qJ@gtIm$0(%mfID%2E)6 zi5%zzzjK0pDts(+?(wf_?&;HgU6neRgdHba7O_j&c-xl;jPcyIwhU8r(k2~c-Ym7H zq#1a}O5UrB4pe9VcHMCqYsHN>my8m|G{$;o)G_503I0fgOxJ^V5Lx@9xM#NH1--4k zqFg-7WwQQs7n`k74t};Hr$NIGs|Lee>}zX$5wV8gw>tl!^?+NDX``|)+XX+}K*LQIKI%l^f<+jL&?^_L=0ICwU4u%&rFvRvO40AG>Ky9OH3?+yq0S7I-HFKdPSMl6wob zz)^Zj1v1^R!;T(sQE$nlc!myi@2Vy!>a+Q8y1fR4M_bN-h*lh0FoS0@HuN@Y80c^ClkV zdE8Ok7o=K^!s&QxKHku$$C`*LjZQL6sz*<}Rzlo@zaG`>5Z_bc)P15CP-W>t(IY77 z3QIMsiX3a`LgF9?18$v2p{fD_ex_zc{;vxCm}{5P+^dIS?W=GQ2uU26W( zt=b}8eU#dhE<5D(?HVK82LKyxQu}SCGIMM z$|_E1t7#cv63T^SXw!bpQpO=iFd4{gi=lmk8i93KYJJ>1(yt$Cu8S%&I?ZAB$p|tJ z_j_@y*j*u+ds_azD6hKnRMbh^p&jR!$&p@Magamd1k|#qAxDppc24G=hCW2Ak;=Zk zR>68cj5b$!ouZauu+1sI?ToiM!aCrEz5jl><~Jzz(pRO-|(UM{RxVNzT8TbFSPWJ_@Vc5@^Ih-N7OmCkQID-LO%1rUYY#!JRF`-eKjuw zjU+}1oiw3^&w;w9gry(`(2-bG99MPygI5<&Vd?F>zpnkoB3QN<|0BQa+vAybf}~I4 zfQ=sfL=Tkv+1n5scmrh@wb9^tZV?mi)ExN~{)|G;{k&;0%6dd9@+9-IvGmm=4vF;2 zEN{TLH6i3Ofhi~vr)JMnnMBh7GWMz7V20tmrYCYxHvgq&UrlN+{g-j55KyY^hkgrI z2Vsjz>V^^mt2x~26Sk=G(Q4bx7t}k&Ib*^6v^u)S+|&du9~LfmPSbdJ1t-Qb7W`K3 zhxyx4i>W8Gd4SmE&I__5u{qv5UDUX2HUaZKRCuqjaHX7#0%(;v*AG_{$VuyE^N3!j z307|MZ$s%Wt%r!21B;n8w}etn5Hzg!k-mgp=k|Y6h`rO4+7AoyHVM+^0+TFR21Ew0 zSL=BgDCX2G!#@r)l1csOJ}QfhNC8W4VEdJBym;tC#U@B)e{X#-uquwfu+LqlSR*id zB4Z==JylN)boNc1QoFcFl>0>cHnn6 z5ZF@+(uL1dQeB2y;LpIK@doR$fTT)h;64m?9(w*79;6RykK-S2TkQiM5A}l@OlC$N zY*63)=vV+4XUz3OjZUGoqW2tP;d-(*&AAu!)x#PmtD#|JracvW79rXsYx;X*XGIWN zzgjc5ZNuS+7-Xq=2r)NecOey#YHRO>b&{52OhVLwL@%XoX;X(34mOd}T~Cuvr#Hy) zNhb;qtu30B;yuTei+l!hs>9Q(7Wik8I)bo{r&`_BZ5_EkDHtlfC8yGDDk#bOvg&Wq zJhUdqVa@hrH+H|{Ecj<&zk?u5nz^^w37LPNGIc&B3bZFp_u<4B{gymT#z{5Q4cEnC zGcS8i137|V0ZIDrmO{X38eKQ=7HAAjj@Z=8J4~X?i}YyOS5`-SRB^ehN_cJ22+ z0x=46gg;{%^J5{)O@O+ugDkx*8S!lhqqkejUOItEdy{7AXcqlY79p-Rk%>d^)kL## z{&GsUjVS!W%9rO3XmO%=&|xGm{7E4^;FVoqm^R2^d0>$0Ig_l2fb zK@a*43dy~SNO2-n%;YRZ zyg`ue)6iE#4vzA<6_jJ;_r|0Z>q5F+eHyCAkr?735^wl}0`S5f@P2{61i&b^iTV5N zP$i7`Ept4)a@Sr!KK!%Bzs|CfzRSY%fFrd5tL1Mi-s|LQN7rmQ0$*Yh4G54x>b%>cr!yBO1M!;Kg@ri^+r4S>=2u4QYH<9asSW-(GT z^%m@_r`xRiZdH16N;4|O?&*{|pFFNQm~Mut-Qey9M3<5Pmyo%x`5k7laR1!@dCVF_2A57dHz~^ zB9d{oQ?FoF#}>$nD|aO5&er_+RrpgS6*UC3JE?nJSB$ce4>|SWna!Pnchuy=?{dOA zlZ~NguXW!|Jn?Fu?Mq(6H#(We^$=!Ysz*m2$t{nEV)#m8)%mfLV@W&$Fb0S@82G+| zBM2hW__cdjl{{KmRJOSUet#jt=%7)Pyk$E_5pFz$P<}y^nNypBUSfNJB98Kd6-;VB7D>_{$UEu zfQ#y(`&YdZij5_%oxU-NvwEXpVypQT=wd2S+{j)qZjrbf{&M=rXK|7f9@Ae*y35#fE%!~%ayUWZL}lzNaSyQOsw!P(`XFI-!l#1jMYILA?3KNdHf`(H{6Qd zowf)0`w-OM2uRI?HZJ*h`(|74|3`_W97{}VA$9 zZ5#s$XMS}_&}&me?bZIJ%C`vm$ALZw)^st$cq(&XA5=g3FMV?`Y^+-kQ1g3H>NXPQ zm&%r*BOD}5gQ~D*E2K)sP8+`9T`Qi)U>j!-W7@s#I-v5LGUCh;k#Rv(;@Mfwa@-KV zR$y_toSiPnU_);Zj&Z#8XOX+X#CAQkuR>E}2NzrZmp^%xx4UKK;4x)bCb6vE{!2?= zEz{JiDE0TzqdOUB1Di ziHI_iWeIy~9HgjeyLY}YGF87*?^-%?Id0#2U_V-Mg-CJVpY|~nXLnc;glfcmy2MkS z!Ys>#(-R(cS@FQh6_itPm^29UZ1`a4_;HjXztD=ltm}OW?kJx7ico-uEn*UP)a5s? zK?}!8d)F5at!JG;9bE`R4>U%vA1t1S^zGF|=8-*Hq|wJJz2a@zxe`eAE}LO(A~J2` z$%*{445-BmY(zMwE?@$CoahBQH4NdF)f#S&un$EkAs(z*>iEs8aS*eFVp@gZrO_Ew z`0s*|q%WbyuXD2Aom^VTWm(MvRmp;b=kF5mg)D{2Dku+O9krjkqnXClXzHt6HQv*} z^-6eHSGC}~KDV$x?O>=4-7WI4zEL8!1dUm=BeU%q^V}SjF^VrVDuAWg;)8oxq$E}X z7El|6KL@R}I9@|=4Q)dcX|v)O;V;6gTR_nJ`&<2S!2MSnR<;W+H_6>;HP0qtW@1A=ymCGrbNKBGe{;NuV?$eB`XHJ`reE z2vkjnxvD=cF>*;*KN^6lG7F1It%H!&I1e)JZgK>RDPf}CcNq@+~2ivgDmCf^J2LTn8@xkce<(7NZG%J_pAnN@N@En%wlMcFnG{M^8Dyj!^g z`sxXFwn4G~KNYE1Wl)ZfDns_dl+EVP?~GuGWL0r1 zMHyy5V8*GGTRLXCsj&L!e+Cg(F-Gc6=~2_U5e;Aq#X*e4WqqzgVyP5yBYoL{Bkh=4 z$^kCha`Vp!fCEWeyYXCVv{Xto(J|fh96*F=SAO|gUMWBJpa8Ze2WVnP~79Z9;6ZT39nv2ALd#Qemv%b7|NYdmnISIhwyd zA{bG9@|9b!tI*$*AqJ*T+Uiu-PG$KpD-iE=aF6d!-DB6(NH&TYF=dcesG&uruxlG- zp4++?fO^jHBrQGMPHR>QorT*$4*9L=G#eI~>7J zmvRT<40R@@{vLeUK(jK#x2snip|WT-mU52`=ADK8v-B-ukfAcz)wK~dHJTQh$$f6k zq?;128Z4&@bRV}ezJ7}~SE*KS0aI9!i4+;}g~sQX6K%T=J#}%b{6qtzAc#(43hNib z+Rc(P2j@C&E^4i!{aJcSskC$$80!>gR2GuSBNi9&j@v_J6@N&7tzYSho)1s|Z-Kb8 zaw+T0ST904RQBv%^C1n<;qdH$Mq&C?ssuYM`+JlPAjXN-U^+=DlD<;%lXu@rQ)JF* zavIbUtSsy5S0RO8ym+vFnJa~`fJA3*XaG}?Tqn5HHzmHUHC41#JcVhfT|H}=Go=x#@|JZIdfmYt9jNK?AvrhinDfiu5Aex zd6tQH*kAXAFl5-|V&wf9&A$Jk0S`wt;5FR;UENXMC<&|czXzEM8}EBv{qwlT$f(TH{Io?2xtB} zi|}#a=xyNZ8n5#<6`Mg^`tjM6FeX(k`l0Z1kM_68Jo+}7|<&ytFPk2*E)kIpjC23$uo91CKeCJGLoW(JldehsihE4$)MGLswl2o<-Fcl{QP z*YDg;_@JN9R3&Lbv`yq_N@e^Y?2}t(N#;3Oo=v9u^|p+M!$d+a_QKyeVEEpDvHlT( z6u-B}Cq;-=CE>?dbn`_|@y&~)X_gCmGz+l+ML@d0KXb#DsuWGC?3{bWC+Cd|9uN*$k=@Jjs}RF;V(5TgZYbSTeL2pm@b0*e`^ zQ{eyWWYpEsK*JI26sgta*HLei0~Q;&M9pX7FNPr$q6Qb3W(H!tn!Ej|CUO%EFYtKD zENWmzxzO;lg$F7Ib;ek|5;i~3YI!YO`{y4C@%e0%9I9Cm90!Y#?XmiotJef079%`7 zZ;VL!2;92$slcI|>UWY}^IwXcUyN}KSgjjUHMU>0=oT=@Hjp%lf1 zD-)fWg&n7bud$xv>M^3*D{O5!FV_&!Rtv$|`K#Yq}+Ek1l-|F~CigO^E946GZWT#>F~zxe^@Qi=~Pe2Lp6x zBgWn-=Q}0`rjJHbHrZzohjZjp&7b9Vv0K%nq(}En{jr&6mk0+8*4)66tUs6gYwr++ zootL2j}W??qswA0n`gk`L)j`AR&?HhXa2{)64hQX=)*;KvkXCsiv08Z$xWJ+XMg38 z2_dnq<*31Y;8>ZBS{)omCU|iG_x~KV8Rn7I(6=Yqcr%No!P5Vi^^wVqzTV5ZW*R0j zWt*-pPhZrG)lnuW9&b#<7_E@cXZ)lkekiQL<$2jaoRTOrTFH#J-oAG9%LGwrjg^!> z9s;&u2#X4F^{4y0DGF&jP}OkT0uy(t--j7Rkn^2fhjJ&bn6y!=JVk z?ont~1RvnlT((9y8Z13(FnRL#84`&{3L(u#3#)oDe787~CL=v7ox&orGRZk%Lj1)G|~x<62GW znl8h0K>rylPp<*GiR?PzowvE%pNpCG;&+9;_hn7RK9mdjrOoC`YqN0~?98*jeh3tJ z#g@zeOmOx;6%P~W02w1FMOlP1CAyhb< z%xoSu8R<#Lmhw)@&h~_a-8&vo1P@%ay2CT#0+F76&4A}7Vcy7EqO`O_?~hm@5`Rf&K-aUOU)XfvsJHz&l3r2aV!`+xo&~A5k6-(5>Sf3%RM9d1 ze^v80oeNvl6=wHwy)vZx#XPlwnR1y+_l4_>4Wwj8WI7 z_I`67di%p26L?+|?z$$F+2Z7{GJpq^fTzbXY^f9X<)ft4TI5L`J{U6X4mGvFwV$!4 z|CaY)bTNuXoj&MTqWh8$>AB6(IiwljW{5o`8jwG7dGvv3mii&Mv5$DuQNP3!;aeQh z@o?#n@r3YGJUF?<0)RT@ZOL(ihCJs?609XjP@LI1xgBTZ);nXti9fl4{0(myphe^& z)6f$n)Wu4S(FXVe)}pUW)oB2$*j5v+a!rmGn?V7mbb@!a<{#piD)!>r18c8K2!xHL z;(tjD0gzu1AP)d!<^hJiOtJz;YJg4T$~l^$b);e$xf8p2`taZdYO`Z$bmWTLS5H^U z(4w?O0*z5@2HlRu8%V~t#$^fxAx}-aB|~KfZw~^=5{?D0f}{4>o|+Fx98CC4YG8&{CrD^uhD=8v-gCF%-6v8eM3n#ZV@XdJ1MP>0)-y!`)! z=1hjw82j#0>5^=AFRpo-nuqNqM@Ry$dQfZzw2GM9akm(sT4E~^J*@#i;D35R89Xu6 zzpE^gnvQaTN3O3_?HJ+RhWCKGXG!B=%^oSn&+AON&#JiWcO@%i527|f77p2aM>K?W z;069;85Q*J9wpudS{I~X-F1P?8&YqZEVoXr-Y}Nw3$HOfbC(5jtmdP&@o%x|HrJh@ zKRufYsm@&3tg6;sVRl}8i81G1~C#@k&2OyNEY8s zBB>L_II?;UKu=oA1b&UP$Zhv3k9D|VF9=~3!|b~s4Zp|A zN6uYfx_(`OzGASO_IO!-?6onx8Z-$O>2|;(CF)SWDbzuzWX6$iA2PL6w(ZUwX{`Oz z$^%B(dwUpDrPGCpW3aF$!n-eVC5jRe8sQ3qIc!@og`$5=^ti!-*RL_S7622609fFy zu~9dsopS$KG@P#s>tj>b!S5;RwH)CJ-c`EYMM#Sx;>=1wmLQU7Unjt%CJ)13duI(6@xYfPM zs#!G231j|uYi$w}6Ee!LEbBG#$V&L>atp|)oud8P5d5(zLYf8t9zi&sg9O%IlZa{L z7a=Qd2UD~`Q-P61CJ}&pT6klJKnUh&-{{>vomwuSS#T*b>ArT@nISji%-hjeh`RM^ zNHeY4)+ZT67a74ai@qiC7c)euRah~nDCnP!+R*l__-q0P9!T2s&wBTiZQGa*TxeX=M4s52bl7B~vBrq>B}It0x!94(?)6g(T_ajK zIxJtZO$M$2+5IN6VtVHygLHdNj73NQlWEK~K~ao>1~%-%KFbvo2eGS*gy3W(#u^t& zRfen*fSj)BB7B`4FO7Q@B^hJ_Q@F*Epd1}x2UNi0l8&BpFcTBS`ZBcCtu@z6O5{T5 z#)U7YOq4UW0hL|xLen2wcZjRJ&|h{cpBslj33LJZdcrlk3#@EgWPDudvS6vkQ*N{&&>KoO}UI2}tBwW&kYME@(c~DamhTGn;^+k!EQLI=|=eaJ}#O zeYfgRU)xD;B}g%E%u$LgipNF`oE#&{_hNd@>l2=O`6a(2`5Ptl88q44TdI!iq(?4? z4=87uu#!q+0-}Uz;GNE8$fwOtlX`oXzBrM_qSkM8B?B>zZiWOZg5YY&QABMlwD$1> zi_Ke+kL0r*br6UYdzfd1rTV#VWmpAB%yJKZ* zSo{zKTc^%3bE7RW5BJjr7eX5XaKj+;{@GLV6~TQ!B!k2C0!^?ZIs?g~eql*9#ldE4 z7%ctp%hpD!224*F#xnXA2w{-pRK1<2o4VjQmzV#dRq!92am&bMPTL>%mY=-3H>hsf z$9{`pOl%WJtbS_?#M!p-btsm8gyIE6Dp1grqz4e~Ty(ECE4tB3Uh$ZArN;=hxLsd* z3w#E%mQ*EF(7qc+!y)xID&o52BP@J$OwBg?mZxR)yI$A807Vpvr+MeM@dS~_)!MEfP^)zsdVqw(dGb;k8bkxTsC zb~16O4Le>S++NF1SvNVD1M7r4&O=d z2$O2zh*Sf@gBsP+;h?t$qj6t7)m3XNGT`TC%((hOW}AU0$=ieR320RClQ(^ z-&xz%;2EPeE(BMC>4zGFR4`Y`QwwsQO6G~h%tDb1GSk!Q=|eo2iujjQ1o2ezqdM38 zR8=1(e>HY!0lL>{Hq(?#ZmaGk#5VylIOip^64}XDcjsTfu;dveQX+^GBV3WJD`H=v zD_ch&bsimN;U|j%vp1)HYbjI&__mUROsoq#0HcT3CGDR4%skb^CL115&Uq`Nt~V(5 zLksiKQrL=%0^e5UT1!Z%si-?*8)2j66?(X81nR#kp(a8VTp;zc11*(i&6$MQN)9#i z$)Ie=%kW02&DNWwdwO=98v!PYQ)3wZyKczaxJkpiMJ-Qs)4zoCAYPmUAU&2g@fV?# zlQPrEmejI)2pk+AhYRi3>^mkx+- z-Dcu=tL=k)$iWCgs1e*Ks1vOd>bP+~0J6GH_oTf;KJ+hNwI{sjCDv;1w z#Gu2lnBOmVW#0%eHeGsD?UftdIKl*rtz%9sqE2yngT1(7uabTC03872D0fz|VnG+< zG}bsP_(1_}0f}rzZD~UzFI?GA2`=Z!L9Wr6HT9z_s#Ed#L@~WYEz~W|#t=1pqV@Q) zalN8({mND>P_sE&;VQlJcF$7kra&RxPdv6rnz_8N-95!NaSV=N&Y}S5EOpL?%D<0b zfFAo_u^_wuLw6B+b{4FCCj_6jEdTr))U(h*dbY%w><`0E(wEu%*OV{6^-z6)rQbF` z3d#6Yi9(OF`hAiq5kbC zWRdl@R*N_mdb`23=l7T=@gD|xRWk|vbgoH)ESm|zoAQeS z;fiu5NMAW;($e)2^th<}9}7bNrhTZme-Y6yEZ`@t_ot+Kgy}xYN4a}RH-obg^y^-{ zW%ZSzd`1f$DjTcnCX;}0yuI+@#J$G;zP<8{tUkuTro=l@k3W9^l1{dFu5rrMpr`!@ zfI+&0#S~mBNmo&)vO*#CLw5)Nybo!Tcb-SgsTJ$BGvLI{w{?G7mys6 ztC&N6v7o&jCcm*5kQX|F#E#uXF>RBn1r8@ zvRjg0lZ3Q~QaDsNGLyOTO&Ks6x`*F_C3E?Cu3Z`CxD)1_Li(LLm?#L< z_=k`(rtr`1hegNKyD8Pg2%%;*m)pKJf)E4=$22aZ61PvzW3y=U-Bat@=ian;x7}}n z{f3%P<$u(DBhc7~HbS;YWq0ng$Ae8RfH^vHd0@>pT(4Mc0Z=_4Do1|~Mef&Mtve-B zrbdC8nF?{LM^6K9tn;s>e2EkVS9BkGs~F3`#e#)9L!sHOcT@emRRRTMv;^`;-IIi9 z$YwT^t;_;BEUBIJGje}`iIgE-QBXZ=;d;+#@c^wzx2Kc;xH%=DCzYTZF!CaQY(frHgN}sds7Crl%g;OYD2!4sH@}8;M@c4gX z>=7Wi{S-eCBF=vb1|p3!N!l{f5-dDn^HZo0u~fUS@72Ex`7ctJ_8Iasq{pjW)O(8A zH=(eCh+#N!Gll>E;kz#t=qOZ9$EB$1seeRk*v*wyS@q;!#uXI@)^b8U=%hy_G$M2; ziXY!DRw1R!2-Q5#Zy-&Us2}+Y;@2uxoPxC~?_y-x@@u?JAo0tFHM^daL+IzJsH+a^ z5YPj0CIkbVRV)y!c@C{(l9MUXjyaDeD!5r-sX%O1e82tseJaBA2nXoi0+uF!K_LXA zoWB2=N146;B|CL;4Qrs;0k_yRpN@6ej)=v>flk@YX|`v|UcGH*)HMS1a^IH|*cNsz zt=R-O*r&;GqksgM7GI%p92&&tRz>Et(zuiRq)J5JjeW48xs-z zg8n(hlj<$Q;0^{Q2%Csr)S$y*jA^L|yFHQJ3H#S?XZxw>&jcK=1* zUSqv{Auw)7CY8cGqI{xihJXr6ilo@em>GPAu$1G1pC`X^mijUqzP)GH!#(4-Igb58 z6p(IgWTb^C+^x$YkYJY7SHXh`6in}%liu9HJR{_Q)pI%)k$fe}PIRLjU4;hc6vHCYQ&&VH~bkO$s zA4{xIL3OK48bv@GBQpRoA6h&0 zvWXgkW3pE{Gpl!_cX^@SOY(zA5ZW$VWwbOAGVC)F#(4q_-u z^5u#(wo{GXK3PS0v3|FroZ5&tE7785cxO!`BffPG(LOI|I^{$`&(9F>jC+&NFknnl zZLRw1XP7LW7CtMKBFLXpj0hQZOEannWF}N5^E_KiH!oldR2?3_hgRci+|oui(oeh1 z7M2irITebE0AkH6-AP}BGp%5=Q?CDSE#Luj`}D~rfjVjQrJ{omo>{52_wwAmqTllN zK^!u-`sObBnW|M#*fl$@?O1C?B!7QXiCWMLP+A5uLa+A&irVgBm$paLPsZD;fGiPb z0nDFCLKGaB@pB+^GhiBzh5|| zDv+GtCf3kqM0j9M)I&L2w63B|&K}!O&3fpjeQpii=sf`gq6rPHxrmq@&;<5n)6yA3 z4cWnlh{@`g{of&ASo`=|0MN*;#iym{X*jRw(t4YO^rkO8_(>km?$GTLva1z(G|<#? zY_+LGym?nr-c*lJ)$4miNzTlN-RMWe`dw{g5ke{pHUmrKizK#VA&L@PwBF8a;t{O9YKQu8e0KvwLKxlG4 z#n^@@=omLWIQ{MD^KLiLI#b1Fyhu*XVQ@njj5AJJr3jw21@C z3k@jWRX8t4=#^<-mG9?c(T4&tLfxt3?o!?5QEpXomQPFuz48K;=8#gWS04bEe+V#q z7oa*lFsklqXZ34cI!ztrS`>wR1RMu86lhL&527-;G&* zCwhx29z1dn$6uehzE~Lii~{h?Qw!{h3J00RZYPwJ|4lu6pj3((oF}(8prJ*0T@ zOn0LGKxY|?;TSLIVI~*c0oyzj%d600g^$D>-oZAIc^a?m3I7ADpOGl8t0BQ`oXDQ^ zL{6xY!tFt$Ju~$gKv*Vfy(9}>!1vj{YR0y)$N-Rx%?C%bM=5dwCbJ8-kpBg&q$~Qu`0EBN{Hx$rO^?N$1)yr@ElhLLN<#8 z%U20lKxnvv+-yRU5Kc(G>$bK>esN?#cwRO6@6E}OtmtdssXWh2P@5qNs0E+tp;aGD ze6S8E(bOdQs2Gb@Bt6~o2)YM41kRihcrS#pyey-&ewy+ub41ct16Dnicc%!?b9QY< zL33fPPt5Fn2x-W^O5jl*Q!sqr9#v&oNiWri&;Uk-p|~X}l=TFiSV}^s^o`_rMmMkJ zvny@3yQXvdYt-q;=ervRRbImhy!_Z#l%r3>ltis8JThRa=Uq%#r8Y-~sV>DZ(2H8C z1Rs#)a_8Pj0bL7aJ=0lv4lGcqoR0RBoBL-e%s#fQMn3mtC%jy?yFOMRRM}4GGrh># zt&7!EEr>#zdBNZV6MM==2{zSV7{Rmr5AuMQE#H%5*xoQv%QOqRO{|i4Q}-EGvZIX= zzQomCQuRue!I1eQq%qeWzDp2u%Q3U1FN=vQGM0mSbP6wEx@CrqG=xpKUUhn^A<@Wi z7wjjGo=yiQ^^+%>A2am59yXKI}pln$AQF$JX3VvM)`vMAGr&{#D zq5z3-5IQn10D%en%Q=Fphd&+j_i(X*53u{|I_UWrdZ+88YbP!prs!w{5U5VA{PRIX zL-$<6LxG`6Ny9Xv(v>5`t7mahVYYP?|1G@ya64^OH?QYOd0Mh!9Z0+*l9li-bFT$< zoW*kSN?E(Z(Wu14IcT3T93!l-`ajntJge)DCE z|L#nepGF43643mlR7t{*0>4^CgDD+D=RKq5xlW440BFE>Eo;^TS`xvDZh%b}Sv9vi zjpSqZrqgP5B%z)XZ~1~M0#&- z9ym^2None3FfJtYo*89n%e}zU8b=kUD3Te>SL0j>#AzBvFJ5lyBQxr4(k!#z?Z?xA z-=`i>T;~Yxx^PIIurvU1UBUzsMj5*;^*ELi_;-izk92APD)wSLTDY@FG2DkN{w5@B zHbw-KEWq{^yk$#DO)3>+r7(Rm=8K~PXsv_EA+H4o`nVklSRtKKF(Jcga7DiuY?YaC_m~r<59$(u5Ox%4H|p48vFsyQiE; zM)!1Jd^~kZt-cFU_9g+iFFhFS7Q{XDB7WFBdZ{OA#1{KBz~5pewdZ!*zI}XiGpZGJ z)i6;BWnJ#1QMXrqLE3@4wdzK}grN=GxHS`_qlVrCMmb7{TL?Mj zDfXkI$4<`|c7F8M?X$kZT9Gu*mLP;L3>=UqaT7G1GV<(PPV{}U=$gT1=~vI50E$?P?&GR|bkc6l*QL2u zcqk7hz8^hLL;d3*8xTyf=rdk}dMZf_*)R_$MC}R{m2eGRpucOy+OFMHhg%jWf*S|* z5fix!jkgEcFD}mep+DCl?#aAljQn#CJ$o48e|q`|%iX|ZD|`VzRg*5Skyt+O$5MZJ zjnUBF1`C_}!k$!>r=ssiJI{Ky#N96^4h+3{^*Re4*#=DMcPXgXtyGyp5kz9Yloo1HDxXu^Whlb>x;%vEvsex;@lX@=RzrpDx|{Q#h<=T+Z2(I z(nXKv`ywW-J^B8KHD&mkZv0`Kd~o4fTn5((#}pCdsQ{*1NW z6ZI*}`;rgBj0XFxvjL@jts5Jp`_9y!banYfg?z<0KUO1mbS|&od!R>!4L7wu2 zCztkXFB>tz4WL)tYem?Yr^9(Q|AP+8q&}44FyYE^wlMh(<@D4eGgdU~+VN5px+)=T zL99iboTs8y!<`ug1R>#uu)2m=vrGSc>__n%o%U;;X9?2y${!ibs|C1|zq53Ue*J|X zIA3FF(0L`xDVl&I??(7?9DsK%P%x z zwKTD;WS{r~kav5lEoE4g0DVd_B2bXymEk`aXI=**g4!3{7ftW|!(g=>4(joL+j)Cb zzIX<9rT<(ni&ghZBRd#?n`<~Ky=S9M4234T;dd>hI4(XrLG}rrGA**)nskJ%c*5N* z&b>;tnC>1%&i3a)%5JxCGBkLAK;&a@n`l|W%_|1V#!02Wd#3ZLiwZ;6&=3CKe-GkQ z4QhPVpyVy7(0?$tZ7sr?rO(H%7p?G&QiHdWnFM%al6slL4~;n)j_=Il<`^KHF4)sX z!`g?1p`vY|2lG9NuXC$>bYLCzCQw&b>K*YWT&GlaZ!COMq7Y;cMLmY|Ocw-gjSKNh zPM8)H%X;XO@r_u|X>BUL_uJSkT%C~XdrH3TP=PN2!b1xtqN^S7VZdypyw6a`MJHW` z0%GXlUKDvMjM_Lzv@2xxTi zJ6RNK7^!G;v59am+MxRj{+J*3 zf5=i!F?Rpg*9kti4&cv_m7LR9)1Yz8iUsAP5ogJ(Ujx^^FfJiCCT8?b29#_D52~tB z?O&EXP7-5W3L!!18#6>(_Lb->2a$}HE!u$rkFncu(@F>nl;z&Au-qYp=n;2n0<|f7 zVnMCba&Gqn`%T&8{hPhE6yYfI$Yx5x^_&4;AO!>WKZ|i0L zz%ZQsq1zom?*gOsd57OpX=QhlgA|$1ULtgmFSjNJ!O`CMp_D&$Tb-1988xSQh<)AQ zdYmB|{=bcnTRe=_C$|~;-zWBm7_R8h##(gpOyPQ1rLYXXGbM2j`1H=%lY%sKt2Gg+ z7fM8YhOu#xcNx`p1spu?Shc=9t}U(h91&)x{oVlMbS{97&U=P~m7i z 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 + +// +// Input Section +// + +//This is where you should include the input parameters for your entry and exit signals +input string Comment_strategy="=========="; //Entry And Exit Settings +//Add in this section the parameters for the indicators used in your entry and exit + +//General input parameters +input string Comment_0="=========="; //Risk Management Settings +input ENUM_RISK_DEFAULT_SIZE InpRiskDefaultSize=RISK_DEFAULT_AUTO; //Position Size Mode +input double InpDefaultLotSize=1; //Position Size (if fixed or if no stop loss defined) +input ENUM_RISK_BASE InpRiskBase=RISK_BASE_BALANCE; //Risk Base +input double InpMaxRiskPerTrade=0.5; //Percentage To Risk Each Trade +input double InpMinLotSize=0.01; //Min Lot Size +input double InpMaxLotSize=100; //Max Lot Size + + +input string Comment_1="=========="; //Trading Hours Settings +input bool InpUseTradingHours=false; //Activate Trading Hours +input string InpTradingHourStart="01"; //Trading Start Hour (Broker Server Hour) +input string InpTradingStartMin="30"; //Trading Start minute +input string InpTradingHourEnd="23"; //Trading End Hour (Broker Server Hour) +input string InpTradingEndMin="00"; //Trading End minute +input bool InpUseTradingSession=true; +input ENUM_TRADING_SESSION InpTradingSession = LONDON_SESSION; //Trading session + +input string Comment_2="=========="; //Trading Hours Settings +input int InpGridGap = 1000; + +input double InpVolume = 0.01; // Default order size +input string InpComment = __FILE__; // Default trade comment +input int InpMagicNumber = 20200701; // Magic Number +input int InpBrokerTimeZoneGMT = 2; //Broker timezone from GMT +input int InpSlippage = 2; + + +int londonSession[] = {7, 17}; +int newyorkSession[] = {13, 23}; +int tokyoSession[] = {0, 6}; + +// +// Declare the expert +// +#define CExpert CExpertBase +CExpert *Expert; + +// +// Signals +// +CSignalGrid *EntrySignal; +CSignalGrid *ExitSignal; + +// +// TPSL - use child class names instead of CTPSLBase +// +GridTPSL *TPObject; +GridTPSL *SLObject; + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int OnInit() + { + +// +// Instantiate the expert, use the child class name +// + Expert = new CExpert(); + +// +// Assign the default values to the expert +// + Expert.SetVolume(InpVolume); + Expert.SetTradeComment(InpComment); + Expert.SetMagic(InpMagicNumber); + Expert.SetDefaultLotSize(InpDefaultLotSize); + Expert.SetGridGap(InpGridGap); + Expert.SetGridNumber(10); + Expert.SetMaxLotSize(InpMaxLotSize); + Expert.SetMaxRiskPerTrade(InpMaxRiskPerTrade); + Expert.SetMinLotSize(InpMinLotSize); + Expert.SetRiskBase(InpRiskBase); + Expert.SetRiskDefaultSize(InpRiskDefaultSize); + Expert.SetUseTradingSession(InpTradingSession); + Expert.SetSlippage(InpSlippage); + +// +// Set up the signals +// + EntrySignal = new CSignalGrid(); +//EntrySignal.AddIndicator(Indicator1, 0); + + ExitSignal = new CSignalGrid(); + ExitSignal.SetMaxRiskPerTrade(InpMaxRiskPerTrade); + ExitSignal.setMmagic(InpMagicNumber); +//ExitSignal.AddIndicator(Indicator1, 0); + +// +// Add the signals to the expert +// + Expert.AddEntrySignal(EntrySignal); + Expert.AddExitSignal(ExitSignal); + +// +// If using fixed tp and sl set them here in points +// + Expert.SetTakeProfitValue(0); + Expert.SetStopLossValue(0); + +// +// Set up the Take Profit and Stop Loss objects +// Remember to create child class names, not base +// + TPObject = new GridTPSL(); // Create the object +//IndicatorTPSL1 = new CIndicatorBase(); // Create an indicator for the tp object +//TPObject.AddIndicator(IndicatorTPSL1, 0); // Add the indicator to tp +// Set any other properties needed + +// And for the SL object + SLObject = new GridTPSL(); +//IndicatorTPSL2 = new CIndicatorBase(); +//SLObject.AddIndicator(IndicatorTPSL2, 0); + + Expert.SetTakeProfitObj(TPObject); + Expert.SetStopLossObj(SLObject); + +// +// Finish expert initialisation and check result +// + int result = Expert.OnInit(); + + return(result); + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { + + EventKillTimer(); + + delete Expert; + delete ExitSignal; + delete EntrySignal; + delete TPObject; + delete SLObject; + + return; + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void OnTick() + { + + Expert.OnTick(); + return; + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void OnTimer() + { + + Expert.OnTimer(); + return; + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void OnTrade() + { + + Expert.OnTrade(); + return; + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void OnTradeTransaction(const MqlTradeTransaction& trans, + const MqlTradeRequest& request, + const MqlTradeResult& result) + { + + Expert.OnTradeTransaction(trans, request, result); + return; + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +double OnTester() + { + + return(Expert.OnTester()); + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void OnTesterInit() + { + + Expert.OnTesterInit(); + return; + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void OnTesterPass() + { + + Expert.OnTesterPass(); + return; + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void OnTesterDeinit() + { + + Expert.OnTesterDeinit(); + return; + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void OnChartEvent(const int id, + const long &lparam, + const double &dparam, + const string &sparam) + { + + Expert.OnChartEvent(id, lparam, dparam, sparam); + return; + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void OnBookEvent(const string &symbol) + { + + Expert.OnBookEvent(); + return; + + } + +//+------------------------------------------------------------------+ diff --git a/Experts/Nkanven/Framework EA/MA Crossover ATR TPSL/MA Crossover ATR TPSL.mq4 b/Experts/Nkanven/Framework EA/MA Crossover ATR TPSL/MA Crossover ATR TPSL.mq4 new file mode 100644 index 0000000..11188b9 --- /dev/null +++ b/Experts/Nkanven/Framework EA/MA Crossover ATR TPSL/MA Crossover ATR TPSL.mq4 @@ -0,0 +1,176 @@ +/* + + MA Crossover ATR TPSL.mq4 + + Copyright 2013-2020, Orchard Forex + https://www.orchardforex.com + + Description: + +*/ + +#property copyright "Copyright 2013-2020, Orchard Forex" +#property link "https://www.orchardforex.com" +#property version "1.00" +#property strict + +// +// This is where we pull in the framework +// +#include + +// +// Input Section +// +// Fast moving average +input int InpFastPeriods = 10; // Fast periods +input ENUM_MA_METHOD InpFastMethod = MODE_SMA; // Fast method +input ENUM_APPLIED_PRICE InpFastAppliedPrice = PRICE_CLOSE; // Fast price + +// Slow moving average +input int InpSlowPeriods = 20; // Slow periods +input ENUM_MA_METHOD InpSlowMethod = MODE_SMA; // Slow method +input ENUM_APPLIED_PRICE InpSlowAppliedPrice = PRICE_CLOSE; // Slow price + +// +// For ATR based TPSL +// +input int InpATRPeriods = 14; // ATR Periods +input double InpATRMultiplier = 3.0; // ATR Multiplier + +// +// Some standard inputs, +// remember to change the default magic for each EA +// +input double InpVolume = 0.01; // Default order size +input string InpComment = __FILE__; // Default trade comment +input int InpMagicNumber = 20200000; // Magic Number + +// +// Declare the expert, use the child class name +// +#define CExpert CExpertBase +CExpert *Expert; + +// +// Signals, use the child class names if applicable +// +CSignalBase *EntrySignal; + +// +// TPSL - use child class name +// +CTPSLSimple *TPSL; + +// +// Indicators - use the child class name here +// +CIndicatorMA *FastIndicator; +CIndicatorMA *SlowIndicator; +// And for the TPSL +CIndicatorATR *IndicatorATR; + +int OnInit() { + + // + // Instantiate the expert + // + Expert = new CExpert(); + + // + // Assign the default values to the expert + // + Expert.SetVolume(InpVolume); + Expert.SetTradeComment(InpComment); + Expert.SetMagic(InpMagicNumber); + + // + // Create the indicators + // + FastIndicator = new CIndicatorMA(InpFastPeriods, 0, InpFastMethod, InpFastAppliedPrice); + SlowIndicator = new CIndicatorMA(InpSlowPeriods, 0, InpSlowMethod, InpSlowAppliedPrice); + + // + // Set up the signals + // + EntrySignal = new CSignalCrossover(); + EntrySignal.AddIndicator(FastIndicator, 0); + EntrySignal.AddIndicator(SlowIndicator, 0); + + //ExitSignal = Not needed, using the same signal as entry + + // + // Add the signals to the expert + // + Expert.AddEntrySignal(EntrySignal); + Expert.AddExitSignal(EntrySignal); // Same signal + + // + // Set up the ATR TPSL + // + TPSL = new CTPSLSimple(); + IndicatorATR = new CIndicatorATR(InpATRPeriods); + TPSL.AddIndicator(IndicatorATR, 0); + TPSL.SetIndex(1); + TPSL.SetMultiplier(InpATRMultiplier); + Expert.SetTakeProfitObj(TPSL); + Expert.SetStopLossObj(TPSL); + + // + // Finish expert initialisation and check result + // + int result = Expert.OnInit(); + + return(result); + +} + +void OnDeinit(const int reason) { + + EventKillTimer(); + + delete Expert; + + delete EntrySignal; + + delete TPSL; + + delete FastIndicator; + delete SlowIndicator; + delete IndicatorATR; + + return; + +} + +void OnTick() { + + Expert.OnTick(); + return; + +} + +void OnTimer() { + + Expert.OnTimer(); + return; + +} + +double OnTester() { + + return(Expert.OnTester()); + +} + +void OnChartEvent(const int id, + const long &lparam, + const double &dparam, + const string &sparam) { + + Expert.OnChartEvent(id, lparam, dparam, sparam); + return; + +} + + diff --git a/Experts/Nkanven/Framework EA/MA Crossover ATR TPSL/MA Crossover ATR TPSL.mq5 b/Experts/Nkanven/Framework EA/MA Crossover ATR TPSL/MA Crossover ATR TPSL.mq5 new file mode 100644 index 0000000..ad81a92 --- /dev/null +++ b/Experts/Nkanven/Framework EA/MA Crossover ATR TPSL/MA Crossover ATR TPSL.mq5 @@ -0,0 +1,221 @@ +/* + + MA Crossover ATR TPSL.mq5 + + Copyright 2013-2020, Orchard Forex + https://www.orchardforex.com + + Description: + +*/ + +#property copyright "Copyright 2013-2020, Orchard Forex" +#property link "https://www.orchardforex.com" +#property version "1.00" +#property strict + +// +// This is where we pull in the framework +// +#include + +// +// Input Section +// +// Fast moving average +input int InpFastPeriods = 10; // Fast periods +input ENUM_MA_METHOD InpFastMethod = MODE_SMA; // Fast method +input ENUM_APPLIED_PRICE InpFastAppliedPrice = PRICE_CLOSE; // Fast price + +// Slow moving average +input int InpSlowPeriods = 20; // Slow periods +input ENUM_MA_METHOD InpSlowMethod = MODE_SMA; // Slow method +input ENUM_APPLIED_PRICE InpSlowAppliedPrice = PRICE_CLOSE; // Slow price + +// +// For ATR based TPSL +// +input int InpATRPeriods = 14; // ATR Periods +input double InpATRMultiplier = 3.0; // ATR Multiplier + +// +// Some standard inputs, +// remember to change the default magic for each EA +// +input double InpVolume = 0.01; // Default order size +input string InpComment = __FILE__; // Default trade comment +input int InpMagicNumber = 20200000; // Magic Number + +// +// Declare the expert, use the child class name +// +#define CExpert CExpertBase +CExpert *Expert; + +// +// Signals, use the child class names if applicable +// +CSignalBase *EntrySignal; +CSignalBase *ExitSignal; + +// +// TPSL +// +CTPSLSimple *TPSL; + +// +// Indicators - use the child class name here +// +CIndicatorMA *FastIndicator; +CIndicatorMA *SlowIndicator; +// And for the TPSL +CIndicatorATR *IndicatorATR; + +int OnInit() { + + // + // Instantiate the expert + // + Expert = new CExpert(); + + // + // Assign the default values to the expert + // + Expert.SetVolume(InpVolume); + Expert.SetTradeComment(InpComment); + Expert.SetMagic(InpMagicNumber); + + // + // Create the indicators + // + FastIndicator = new CIndicatorMA(InpFastPeriods, 0, InpFastMethod, InpFastAppliedPrice); + SlowIndicator = new CIndicatorMA(InpSlowPeriods, 0, InpSlowMethod, InpSlowAppliedPrice); + + // + // Set up the signals + // + EntrySignal = new CSignalCrossover(); + EntrySignal.AddIndicator(FastIndicator, 0); + EntrySignal.AddIndicator(SlowIndicator, 0); + + //ExitSignal = Not needed, using the same signal as entry + + // + // Add the signals to the expert + // + Expert.AddEntrySignal(EntrySignal); + Expert.AddExitSignal(EntrySignal); // Same signal + + // + // Set up the ATR TPSL + // + TPSL = new CTPSLSimple(); + IndicatorATR = new CIndicatorATR(InpATRPeriods); + TPSL.AddIndicator(IndicatorATR, 0); + TPSL.SetIndex(1); + TPSL.SetMultiplier(InpATRMultiplier); + Expert.SetTakeProfitObj(TPSL); + Expert.SetStopLossObj(TPSL); + + // + // Finish expert initialisation and check result + // + int result = Expert.OnInit(); + + return(result); + +} + +void OnDeinit(const int reason) { + + EventKillTimer(); + + delete Expert; + + delete EntrySignal; + + delete TPSL; + + delete FastIndicator; + delete SlowIndicator; + delete IndicatorATR; + + return; + +} + +void OnTick() { + + Expert.OnTick(); + return; + +} + +void OnTimer() { + + Expert.OnTimer(); + return; + +} + +void OnTrade() { + + Expert.OnTrade(); + return; + +} + +void OnTradeTransaction(const MqlTradeTransaction& trans, + const MqlTradeRequest& request, + const MqlTradeResult& result) { + + Expert.OnTradeTransaction(trans, request, result); + return; + +} + +double OnTester() { + + return(Expert.OnTester()); + +} + +void OnTesterInit() { + + Expert.OnTesterInit(); + return; + +} + +void OnTesterPass() { + + Expert.OnTesterPass(); + return; + +} + +void OnTesterDeinit() { + + Expert.OnTesterDeinit(); + return; + +} + +void OnChartEvent(const int id, + const long &lparam, + const double &dparam, + const string &sparam) { + + Expert.OnChartEvent(id, lparam, dparam, sparam); + return; + +} + +void OnBookEvent(const string &symbol) { + + Expert.OnBookEvent(); + return; + +} + + diff --git a/Experts/Nkanven/Framework EA/MA Crossover/MA Crossover.ex5 b/Experts/Nkanven/Framework EA/MA Crossover/MA Crossover.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..9691ee2e9efa19148eb7e91d66e4ec4d3984dd19 GIT binary patch literal 48146 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 + +// +// Input Section +// +// Fast moving average +input int InpFastPeriods = 10; // Fast periods +input ENUM_MA_METHOD InpFastMethod = MODE_SMA; // Fast method +input ENUM_APPLIED_PRICE InpFastAppliedPrice = PRICE_CLOSE; // Fast price + +// Slow moving average +input int InpSlowPeriods = 20; // Slow periods +input ENUM_MA_METHOD InpSlowMethod = MODE_SMA; // Slow method +input ENUM_APPLIED_PRICE InpSlowAppliedPrice = PRICE_CLOSE; // Slow price + +// Bar numbers for comparison +//input int InpBar2 = 2; // Base bar number +//input int InpBar1 = 1; // Crossover bar number + +// +// Some standard inputs, +// remember to change the default magic for each EA +// +input double InpVolume = 0.01; // Default order size +input string InpComment = __FILE__; // Default trade comment +input int InpMagicNumber = 20200701; // Magic Number + +// +// Declare the expert, use the child class name +// +#define CExpert CExpertBase +CExpert *Expert; + +// +// Signals, use the child class names if applicable +// +CSignalBase *EntrySignal; +CSignalBase *ExitSignal; + +// +// Indicators - use the child class name here +// +CIndicatorMA *FastIndicator; +CIndicatorMA *SlowIndicator; + +int OnInit() { + + // + // Instantiate the expert + // + Expert = new CExpert(); + + // + // Assign the default values to the expert + // + Expert.SetVolume(InpVolume); + Expert.SetTradeComment(InpComment); + Expert.SetMagic(InpMagicNumber); + + // + // Create the indicators + // + FastIndicator = new CIndicatorMA(InpFastPeriods, 0, InpFastMethod, InpFastAppliedPrice); + SlowIndicator = new CIndicatorMA(InpSlowPeriods, 0, InpSlowMethod, InpSlowAppliedPrice); + + // + // Set up the signals + // + EntrySignal = new CSignalCrossover(); + EntrySignal.AddIndicator(FastIndicator, 0); + EntrySignal.AddIndicator(SlowIndicator, 0); + + //ExitSignal = Not needed, using the same signal as entry + + // + // Add the signals to the expert + // + Expert.AddEntrySignal(EntrySignal); + Expert.AddExitSignal(EntrySignal); // Same signal + + // + // Finish expert initialisation and check result + // + int result = Expert.OnInit(); + + return(result); + +} + +void OnDeinit(const int reason) { + + EventKillTimer(); + + delete Expert; + //delete ExitSignal; + delete EntrySignal; + delete FastIndicator; + delete SlowIndicator; + + return; + +} + +void OnTick() { + + Expert.OnTick(); + return; + +} + +void OnTimer() { + + Expert.OnTimer(); + return; + +} + +double OnTester() { + + return(Expert.OnTester()); + +} + +void OnChartEvent(const int id, + const long &lparam, + const double &dparam, + const string &sparam) { + + Expert.OnChartEvent(id, lparam, dparam, sparam); + return; + +} + + diff --git a/Experts/Nkanven/Framework EA/MA Crossover/MA Crossover.mq5 b/Experts/Nkanven/Framework EA/MA Crossover/MA Crossover.mq5 new file mode 100644 index 0000000..caec3bc --- /dev/null +++ b/Experts/Nkanven/Framework EA/MA Crossover/MA Crossover.mq5 @@ -0,0 +1,197 @@ +/* + + MA Crossover.mq5 + + Copyright 2013-2020, Orchard Forex + https://www.orchardforex.com + + Description: + +*/ + +#property copyright "Copyright 2013-2020, Orchard Forex" +#property link "https://www.orchardforex.com" +#property version "1.00" +#property strict + +// +// This is where we pull in the framework +// +#include + +// +// Input Section +// +// Fast moving average +input int InpFastPeriods = 10; // Fast periods +input ENUM_MA_METHOD InpFastMethod = MODE_SMA; // Fast method +input ENUM_APPLIED_PRICE InpFastAppliedPrice = PRICE_CLOSE; // Fast price + +// Slow moving average +input int InpSlowPeriods = 20; // Slow periods +input ENUM_MA_METHOD InpSlowMethod = MODE_SMA; // Slow method +input ENUM_APPLIED_PRICE InpSlowAppliedPrice = PRICE_CLOSE; // Slow price + +// Bar numbers for comparison +//input int InpBar2 = 2; // Base bar number +//input int InpBar1 = 1; // Crossover bar number + +// +// Some standard inputs, +// remember to change the default magic for each EA +// +input double InpVolume = 0.01; // Default order size +input string InpComment = __FILE__; // Default trade comment +input int InpMagicNumber = 20200701; // Magic Number + +// +// Declare the expert, use the child class name +// +#define CExpert CExpertBase +CExpert *Expert; + +// +// Signals, use the child class names if applicable +// +CSignalBase *EntrySignal; +CSignalBase *ExitSignal; + +// +// Indicators - use the child class name here +// +CIndicatorMA *FastIndicator; +CIndicatorMA *SlowIndicator; + +int OnInit() { + + // + // Instantiate the expert + // + Expert = new CExpert(); + + // + // Assign the default values to the expert + // + Expert.SetVolume(InpVolume); + Expert.SetTradeComment(InpComment); + Expert.SetMagic(InpMagicNumber); + + // + // Create the indicators + // + FastIndicator = new CIndicatorMA(InpFastPeriods, 0, InpFastMethod, InpFastAppliedPrice); + SlowIndicator = new CIndicatorMA(InpSlowPeriods, 0, InpSlowMethod, InpSlowAppliedPrice); + + // + // Set up the signals + // + EntrySignal = new CSignalCrossover(); + EntrySignal.AddIndicator(FastIndicator, 0); + EntrySignal.AddIndicator(SlowIndicator, 0); + + //ExitSignal = Not needed, using the same signal as entry + + // + // Add the signals to the expert + // + Expert.AddEntrySignal(EntrySignal); + Expert.AddExitSignal(EntrySignal); // Same signal + + // + // Finish expert initialisation and check result + // + int result = Expert.OnInit(); + + return(result); + +} + +void OnDeinit(const int reason) { + + EventKillTimer(); + + delete Expert; + //delete ExitSignal; + delete EntrySignal; + delete FastIndicator; + delete SlowIndicator; + + return; + +} + +void OnTick() { + + Expert.OnTick(); + return; + +} + +void OnTimer() { + + Expert.OnTimer(); + return; + +} + +void OnTrade() { + + Expert.OnTrade(); + return; + +} + +void OnTradeTransaction(const MqlTradeTransaction& trans, + const MqlTradeRequest& request, + const MqlTradeResult& result) { + + Expert.OnTradeTransaction(trans, request, result); + return; + +} + +double OnTester() { + + return(Expert.OnTester()); + +} + +void OnTesterInit() { + + Expert.OnTesterInit(); + return; + +} + +void OnTesterPass() { + + Expert.OnTesterPass(); + return; + +} + +void OnTesterDeinit() { + + Expert.OnTesterDeinit(); + return; + +} + +void OnChartEvent(const int id, + const long &lparam, + const double &dparam, + const string &sparam) { + + Expert.OnChartEvent(id, lparam, dparam, sparam); + return; + +} + +void OnBookEvent(const string &symbol) { + + Expert.OnBookEvent(); + return; + +} + + diff --git a/Experts/Nkanven/GridEA.ex5 b/Experts/Nkanven/GridEA.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..6eadeedd15a7d9af9c509b10750ad2375784086b GIT binary patch literal 43632 zcmdqFLzFH|&?fknZQHhS%eHOXw(YuQ+qQ1mwr$&<@9$O5EN9mpapK89=HiK5M4lAY zU;}mpV88-EVF3UD5a0;(zvX`uf1ijto=7k^^4)AZ|46Udq4mH z|6_n4RLcLU3~E$?s2R;NYJq4|HY z;D5d|z!YEuu>B7S0c!uD9l-cMbp9`A_#ghCCI7?N<-ZO%1GoVU|Ec@`Qu_bcIsV6o z4M6`NH~ash|67IWKZcC|>HlAm@Dd?YmQR-Jqa>#52B*j1U6?d{6O{6BV4?00j zS7-gM9_o>=F3EU#@otCxPS-RjP=nd7+*QSJ?J_DFh^@H@+|A_Wnh5XSE<|W9DN`r- z+){h0Ju+>T4eWp*{$dR|sq*ZVtG@4PfR&h$*9g4Z0*-M566DC=X~3{jBVFac^nPc< z9pyrahB<}P;-R8EZSx3=4dlqpslVh=LL};FfvxRzC|xFE0oUXr zVK}90m$x5Hh4 zY!msx?A!_@>RR$jshd9!#NL$#Blko(_RaXij*?a(77;?RXE14P)Co$_)y;&~oS_## zWYFxuoFV9OdJ!1P!mmBC!nOi4EaqJu za$I~q80`s}7{q>d9a`kG?lPyIQa!7AGB4a2d)M}e=dOQPR0Kn+@{TTqzd zRwde0v|uGLKK8Crg~+_K;2JPinZfWumOIqm+}@HwCA4A4JU~5fu)zb_xnL2g~Pzskod}R3`FVyu>{vAYmfu z(oHAki_`ZJ4zi)3i<8BVaHGU)R2>hnwR6vT&SBQ@R&}B*b4!Ysuv{Dwiv0`3D{($9 z)t(y~3^#;46p9g#D-YHm`{!UxN|O~x64g`PX*X9PYT>2+b)e0z@^8KPish-k??%hw zVAy%?MG1qxiq-S-mzTBpAjv{Ie5!!MQ-J0(^z71XO+B@&LJEvxRTl{m+R^<}CmPpLd1{&u2GqvK7e#E79R8-zyq@BMM?G$zKcb`p@@wmKNBijrWvfNjM8sJ+r!i_Qg@1dMY>l`FtdCn$w_zpf zDFug3Q=C7i8H+%Yx5oqZg`x-KCU9DE2=S=^x&wZioL1u!UbjM57!i@y*2pi+MSIGn zNYbLVA6%w+?n{Y(Yi$pBId)2XPOv333eEosujZ%d_$xsr)djYL#j5Nrr+6JlBm9Ie=nlE%D_envK%0x%TF{I+A^R0`{d3@q=0Ge_CtXOy;~0lJNYwT|m8yEMB-TQDXG4H@R*R$qtG2-_DAg!PDE zyvqtS`?yB@I!G0o_iDnYtTldyRy4%z*R)uY@i?68OMLhmE1; zW43mHT~$3ChCg;`qd|QnAIn2(vENIQ1ky^{&n;FD+x-bVS4`N|W&8|N;3xz=bhr)A z?7sdhJe3%%XJR=e=oP-K!Avt7DF8djo_n8FA++xWi*H|JYNw!lC2L$tv{}Q~ zlb@16P2RqPwDkhBg2a$)VFXw$!(^*9*nMWaZYc|au>g!I{t_)sKRjv?h?hr7D6RJ! zJLV{-Kg3v$P9U^7x$P(+=jBQz%$EY2T&vupEQ~JeKTZ4Sg|PRX`+F%T7 zDag!pwQH6Tsz|zN<%hv4R=1ENa(<_?@cCL5)#ZRnGnmSjSwzTn~u6A+t2i_1GFn!L9Bp%{ml4cu@q-ZgpLf7 zybNX|T_0mR6iX}8S;t@RqgY8p$1xNd)2k6q88>X}7PtFNv%MkZOUaltmIED_U}Hh| zD3dC51o|{5j7Owz%G`PkKMdq|)0DfeCr~P1cZzcFupu^ttc5CqGj+_RudG%SGKikh zX1R^hPPM&e&B+prgdG69WkF%^yBDPTOkhs;6uj5B5^b&U)yPNeWUW6WVDlTCYQ^Ehz-&igsFo9#UY4+vda&cAvHwRuGI>p+w0m-fW^~B9EVmxz3 zkGRVfD%Sl;Iwi4SVJgW<8HD?7muqahb||Y^@V^_lJP>FWGIjSi7uC!M{$p5!Ce2=9 z3i&l3cKZMew~3-k>;1b&t<~18<>~-Q=+YMH?^lnu+C-WR{BNPDzF4BAh=y@U1dRvS z%G{=wGyRe72f0z)<;_r9I@^`M=oO^eI@X02h$|@@tGetG1AOzgijHROLmttq{k=&E z&XsZwrJ2ggtOrX%)d_zC2F|c0@Jlkaf68n0m>V`iehk^}a@3%swih+oHIK$jgCjA$ zjWxaNgvoonLV_0W-;9OP^K5HYGBF6*jElkMk3vEExu4CW7w5fQ$W2eqKq{jjG^YOu0!q7&kaw+8Nhj(Zs!cap8b_3MR_I&{ z$*6!$vbwLeG( zb3(LoOgz~vL2KsT3@1^%W>5l25#Km(rE&=`kGy+dmR ziWWYiwZn3#occa-GDbAh+Y>)hpu~U>kJblt;JN*XQb7BN@t_tbACQFS zLc(bj;`kQmBfNh5`(Anxo$qfKOpR|D*p{0>e6hH`IWa@x)(J$7wzUTG_}N!_1-Xi1 zsBDL<`pz7i2$Si!456v7|8eW3MB=oA_;G{B7P#jL1TbSV+A8;}0lVFvIScz)z~B-n z?k}T!7iDMAK(l-ghf8x>i`-%Cki!f5KfeJRx-RKDAlU*|7<=b*ZG$-ipU3F_9S*0P zUA%uZvgisb?)FVr#kdyM^=s8{hD9v*yn<+hhfgnz_EQUb z6~sZDh;H0Q;&n#)n5@_eL@mD)y9a`q<0co1(u0ZD`Xl!BKXr0>&-UMb5R$c&Vv*U> zl(Sl1F2r+M!GZ)|r;XARx$?hF?6dqG_c9fpv}qPFPPN>kzuxzhK8x!U>=Jenurq6Y zO;Y6;Tw?L``vV*|QaC4xllj;d^q!A|G2Yc7X_^!-d1incpbejoI5^PhyqFj=sECC{ zU2zcz!$Zy#QTUH)JozKt2H7>#jg-eDu+YnYfq>G2Q)0!VW)lvk7b=9&{oEbmyiTr% zx@2miUJs!P;&yb14C%bZu1RCBLLL$EkyILHYQEJs?D~u4a^S86A>9WHZ=z@%QhLKq zZIk!}aZ+t9Phpz&fL0>4rRqsHo1d?9U}I`UCXJT6t{aS(bQpPPiM!(j);^7I>0_3D zd8w;}M}~2{*(l2B==nYmxmkpI8mt%A{zy&6UDP)ZgZ>eUUQe-8gDtWa0l#;Lv(*bP zAOH&EyXkh$)Ktx$0++~Vo&xU&TWS@>@UKTYa!BGc9&i#%*^9Gl({GQZm`QpQ1Hv(Jp4^xpAflG zw*phz_P-AVlN)q`!@>KZ3=PR5uSTB=sz=IP$U~(6yu-5);$+)r>yuTmymXroIJKUa z?@5@UyIzPsY^1%g2sk&@K8kQc?eTB8)*(c041?maU%DM8tQb}&hm~3yZfA3JaIWrl znj1H7F{PVsK8~dCYh`;@Qs#k(t+N^bhm^cUg5p$LDZcZI?74K$}S0AhjACFLI% zNyJ{F#6BMy$$gO){2uK4Kt5;h@+z@+K6g5Ju2MYf@A$YV4Ox42%3>PAWTV&##SnDB zas%B>H!ohYwo~EFl1%2f=f%3N$)QXb#8WS!4e`0Tjr62N4l}!reXlw9r_kbQe)83G zQb^z?BM+91p)nw$9&qlVtK_YF)mnN#_cVWRTpC-x4+3|u^8960hc25XCeqx=2XO3lELGcmf?wLa*z4+2rJ= z2%CdL`?!-8fEc#$0!QPPyurQw)h)KzEO}++H2_H{#e{qoiVhOQN7PZ z%R*swGRcxF$aZlTE<$*yUJi;^(bm#TBdkMIE|4B5iXN*zubgRrZQXFyYbKf~!0uE+ z!3~1GCq*~?XOT0xh-dZp&W)aDW-^48EZ=*WODz8Bql z>~fgW1Pa;AOoF3OiRAD_x)Wq;@>zhpr)}kutLLrsblXBSC;y)l6Xbvi#2PbkZD}y@ zie>pD*S-aWV};;*-7j9h@iE~h01g+HzgZ-0921W;L@w_%$QM3hfi;BVLZRR)$fAbs z*`!w9U&qe^N_2$w|zTy97*)`i&RTPAr=%&JlW=^XAbRakvwd@y{VKU#weCUiCS zmwh3SAV#J%{|}2|+_;f~p)YxJikiOSJoq-j932}5AGOSbW4!Wv>DeOiRm@+UfFXhG zxW0)8wVl!V7XD;X!K86ESTD{@S6sN6OAp@CzjLlLSybsV-25;^D0_L{y_HW-_(RC2 z?K%~n4sv8lJ3f}3tRae+k|vV7HUt!}@)N3Qc)OJF7A0UC%sgqa?#Zsk1HQ*(l6ez&jyG^+C;>2WeS+oU3Q^f>xO!m(0xDdspE9>c zi!g87N1S}cnkrh!13rwkQ!{Fjq`9h<0~}+>8nY2{#Co6Xhn%Gg+U%#!#e(!nh#_73 zD8#~DOdXLWOb2voN;CrUC~}mEl5i(%B6;-v79nv;M;$Xdw^VUeB?O6YNdKtOj#F4- z)@YFcZejRP1Pw#WF{rs&Za!xz4 zMq#t7ENBEyeg)EpHJw%UjSkSxgM=P+Z@Z03bji%vmSrZsm2k{7ZHD#u<1raxT-q_z~S?v-dWZ(l-{h z%}}=!_XcmhBW|fjQy8oOD$N$FS&_xKkCI*jyWMA|ZGEjz7Dg%|r`V&+@0{uRD0ZHKr<7Bhk4^Rl!@5d(EwQ z;8EHy+66_b;SAXL+bRaCZP1Im@j*!6;V}!JrTCs@mBwDZ*Q^bRnE~u`b~rooMUKC;2Z-x*GnVW$3%{qw({NcOuj=s1ci-GYg}z(Zsu{bUA?7d{Q}pY~7&GR3NEv@$UYb!w z+{Gm~Io@PA17iIzC$?tY?B7&}66E+cpP1y>O3teL`^Evzph3bo+iqiMmZp{VX6d3J zGSA7w2M2q+1^=q@%BTtG3lSk@8*%1S7KTw)n3MPOIo4u+x@jzqjntf$B~b~(N)Zg_ zw{v?7}caKwPf9VL{kExU=IB~0+*Jv$H8fY$q_ zuMX0h+i&_@7Bm-o@$s~-l;>YxV=#V1A{he{3ToP@%MZBKR=ANPirt1eC=n9zJg&4_ z95%{`r_7%Q__g~rliRFbR;szjVuq~qbvEqLZbhc^a3H*?Oal_;C5EDj-e`X(4SusH z^`2Bbz#ifVQSjvHO|Vf644B}{9Fa{mJS(qE01xqB%qLhg7q9LjjP8F2U`t=nzw}N6 zynM?g2s)dcH&|1F&e0RsB6W-20f*QE_Bgz?d@W&YbK zMe7a-T=Qg5kK`IEnaHzk`!-Ksu3{emh$U&bds`9icvl{5YA4uKGfBkN(DzKd0C#&eqc^ z?yojOWIoCXIsQ$iMu(fO9uA#`iodm`xM4pUlb-FtY$N!qB(KX+EMJ;Ax@P^|C&3|z z^Kj^`*~io=7D2_P*3?)(YHGh#fjWr!Z$LSMW|kp8<;^7mlbHE{qf3M9LS2-c#6xs1 z;ad@6Mk{S55>pPFFg=uv-zu85Q52*RZ+bJ&gk zLw1l79c&4kp{VAHJzFZx3fDk7J~X$d9vXeSB$N9drXt}pad(=MHw5>echFrnLGHOu zLalIdPZe2zPzJo*8E%Nffp|}s+GgPT+P-?_cmogMUmRW4)j4`((qPuS=>7w5pz^5t znHNt4Y4O3T_fxb-K0l-94NZ41&~ zU4hiiUaMfg2zXG2+!q-Xf)iYfgDRXt z9fYlLKFU-m_&=d%8ePJM@9Oc4jxkw1?NiG%xm+SHX8@GH>;`1)l#w~^&vxXGp71G9 zG}`CU)^pL%dt^dS%>*NoD2j+@hC79N3cKms+pro?za)d&y{y|MJd2sS;s3T*sDvx3 z^)@H$gl|uTcKj%63TU)xf)rGpXctedqQGfCsXm&2mxhNsnZ643BfYdpU82z5C=P!e zlLwWFdUv`9UaIkWp?V+!r4?cqYMPv9vCMrAu?Zl#-57jx)U8tI{0l=z*LkSG>O!vo z_JpvI}UFliWtAe&Riql$|h9QK~$z zkzJm~r3`p`M{4uHI3+{qN^)`l3uJp3OhuLvUxs~VV-bL}R3~RF{Zbwp4gg-@ovjiv zXC(QR)4Kd#rJ?{C+#QA>o(Jc_$)Mrx>pq}UJ1u#8QTV=I;YdveGvrxPpjcYK$d{ys z2=b$DUL;geAP9s};(AiZ$;t_L;!GCXWngc+fY7*u@IOu`436i$UG_+(#82enK%FIT zaYw>0bKD-~PPk&tB$@?Ls?}>X9JZsG@MznW9QhpEwO;VbO|tU!5LdJ);RGv9Kpj%i z!C9ge0$4d1I?hB<)tTd=%k}hEun`t4Y} z+MU;mg$dK7rLjQYOif!>^b9+~qLwOaMK+Lr+$@akYERF00wG4=`IZGaAOCe>Q9m6ni83lCMsMfcntYSnMD7LNrDyqvUt=VVe7F0u4;xgrQJRxE z1vv>iqWnG=O3z10`ykTda!0%vS?f)u2Zf=DK+K$DAs-g8JS<$Szo2T4Y3SiP5qsi? zqEbzqM3}77|CC0|h)s4tFo(*8oosfMZU|xV$KXnL!7zKvb{w~E_hHa&yso@=P5r_` zenHqmYH3wdnK`OMqcbrw4U-gdS9dWVIMaD^Tz_xY5zaZ4`EY7r*?|fp#n?UOvM#j_ zg#m%LWcJA@2)-UJnlb;(F09SP6z`5>umH)Uj10ukl#jngi~%cdY8AW3XX5_4lffg@ zmsr9g%HRnMS?0%FjWdRP6BsGJpVOD%50>IG273z4Uo)Y#dN_1}UOD!{ND?QZ2to9l zlH}&+3-tE@oD6-Rpo@LI2Tw=DSlZ-$qjUUZlV^;D-1lnxS49f{22JJyt2+2TNMVv+ z|KkrgTq-II4Lu(j!os=!zg)t?+kZELpv+9zS1i3pc#8;ZpT_rB=CupZso~2w6M*`D zAE=vvR3r7zn(h)my^vV6rPps5(4<-hKZ9Jdot4|9cH-Y`IN$Hx(cM!J{^(HWo@OTtyER z#h%$K=h$ii-iS6^uI05$V3zcuVJ_kV!QbH_r-vkA5K69fyXO(tpHFWonN6r+rJOaf z?CopE+SplJE6NF&Cft8BKyGs?{#jOcJA;oLd;k{$)G(1P!{amUfq`X`!78Qk#pjyO zmoi=LA@!R=gtXQDdI8X`q?t_x%fuqz8m9O|^1>e=q6Q7M)>{eqEhVX7x?fiAZKgNl zj~QO<+;@K~QbxB#(~D~#!V@IeA78@(J!Dfey6FSD&Ej;Jk zx2I?=!3T@#rQnEjBW~7MsrIH#>01#nwv?x9p4}{0n;Sx;2V}4nymlMPJr^jv9+VC= zsqOm?@KYJm6RW&@ZxVB`E8_n6WN}>c!(-+Z)&(fcG4IZpE8S1jT9W^ORG&VRZveuw^~G1MxQ50X$xl32O3pbg00pRzLSB>r*{@p z#;!QuUnzDYLh6UYPphSz9sM!g;HRgQLW6z#q+9Xg9H0S69Ye%Ro1*;uV0!gyugMhbQCq` zQP4?ntwSj4`FIo9yc-VqG=J`89aseWOFo&b56snz4+qWpB?&aY-+|u}n|>iE&bETA z!{ayH=;J@(>-{FYHaLh=5mAbOX;uv9T(6h_u@E_??d6J3gyZq8U+40bK zm3Ihk{w{x<2Zx<#bHl^I!y(SS*Oj?);&|)?Vugn_9#~fC{A}u;ihn7+SQmYS6p71$ zI161*cNlB+=4Q}OGLLgJPpdIbSy42~^RMFb6@JWi%y~(&eh_UWFGgO~)(#N4loi`E z77t%aCMNVR<}q|YRE%8$Tmc9axS?&HISP{9DXqB}vdc!lNP<-z=RpV8U(emz6;HIO z71%5qveuJ^?@G66pho|)Yj9WcDX5ayoxFNZ@{LR=xC!<_*eJ-*y;4pIyU{TH4j#Fb z!?Z32IBu~*YvZr+oES-}$ph;$iB1s>S7Nv$-sS158W8U;kdOyG!}HUS-%-SyEz6H5&WXv3jCn30#!uZTOEzMHW9C_>= z36o<`mEl~Zk~A0DD|cr#G*P(hMH(ucqbk0~ggZPWDFcXc7k zD?Wsm*}wjKiuoIH7CC2Noqp`W`Ppm#A=^eig@QPlKuE)==IKRoOS}fvioZx)$3{Us z3{~>2KJM}32l3xc(TM*L9gGZzZ!u}w314}XkbP+`R~9&>3%O~YV-QWXIQ%Q4!Uw>` zfYZv_W&>qp1u74-40^=41BCOyqd-sIxu3EVav$&53;FUNKs?*-6|r|RHF>n8|4@mG zlVnTMqv%wUP`#GLd5$2CJY-TpsEw?L>nR@)-*{z#h^a~=Gk8><+HqNevT{Iqr4iT} zKtD_BW;-iJtBqOkn=!LCFqz<6)QSp+MZo=yf-A_~R4uSOU`r_;y>;l&l4-unh9;4d zlOPE4%@ax0p$+4BRz;aQ{i1)S?*Y|c+y@%Y3l`t1D8)zIz#xrt zZ3o2cR-6D*fZ&p?%F83sOM?DRU9tH!*WCu;lv&i4bXoL|IOX39QlTrtbk)}y(^y_> zSPE)4N#~;Yiiiw-l>i1&YVwOn+1iM1p>1gJzdw>Qc{j6xqY1m#A0VMZtuqFy$MU9I zM@Wh1-xYp?s%*xjzgtJg{6N}9YH+dP{`JqZr*TTc5?i~ZQa_12Fw+1ch$A*ZO`W;j zW{D9r!U9Y0813wg3)iInZcL@iv2HKoH88Ui8SWC()h-Hz`9h<#{W;y1c2%#;va>*d z^~6uAhBs5LCvEwDnP3!Mmk1v0F;2Kc;WF0gjYiXU{|GXkj*vU_5QZN(580HFlZx)$ z*42<|zSN{Y=EO@A40C~^_BFc8XP3jZksC6XwZ<+snu5kTY#ei!V&W+tkstFB(FkdWk_TQH^?krz=BTasYMh``&jUKV?YZ&L?aJQPtC|dgF&1c<> zaU@HsvQb(#cON>f8a{F|C*ru_?!bC_rTvx02k;IVu<4F`B@V3`doa!tXkakon6FkO z@nQ~@?;5gk8DY}?Yc~>Y73#%=Bk1)%$-KU49fDdIj)KJdN79!3fE4(y8B!P)S#R@K z)@iQ}M#)FWITl-jrrr^RAVaw6jB8~)_h4}s-+(L>aAOruCoJLouMN$M?Z{t=B=FQwJ4(Wv|mf2&VTGe?wM(YS8iCH%k zHfOwx8}_fbLWx@`69 z@2t-REyUI_ty_xSC{^q#`OI+v_#l+i@DPciiWmQR@G!T9^D6LHocVlb;F^$b9~d{E zSJJ3($@uMsv3tA)Mdgrjyc_ZxTbjnAI_Q_DQczL1;+)fvhMWe6zEQ$b@9}np@0biv z8U0?@cOQYwtPf8BYf{S~(Er;>`j}Fa7-)kskfE#3754hc0jNQsna5brf?ePS1A+#F0|I0F}d=V0*T9`AaUm#_spD<$^J zoXtfb?{*v#%}Oy-OjOax@ca&a-#~Ou2gGopbq*8R!x=Q48}ccbbO-(ffmJ44So z+#Gvq?3+(lxbXt3$&gycQUuh<4HDVUD$A-;BMqA1sui__pm>41JE8C<0dDy3Tg4oz zoxuWY=H7hMU^x!qd9~3&Nl&BZOf|xq2$1hcBIoWOPB6{68nIvH%GMH;nPYs2=T~YB zoYlJe((9Q_+gF^d;7u|x?mhm}B*Yz>?3_%J3=c3ouFe^?rq8Mxl3Y|u{h~=3;(x+r zD~`@yn*WoA&UCQ%lwz{)d+pTtPMiz9JuU)$%v0>4<`7N$1ku7IJ-tZ^Czt$~xdzyn$*Xy%?acVk zk>d$6H`op(VfTkAKHj9=BYxCN^GJ5X^PQg&q<28jC94#xzOEIrJ z^0g#X_yIg|UNjaxQTEG2e_NK#n)YzeBhYq_ZW22Yyn#2WjsJ>@)xu*(3HIZQiY^v? z;ulY6J>0+UK6Dj148X9oDh2vm2Au!;9<%_zMFtosW*ditpqZ~dZ15jVyv6vcr!sa-F;NohczyB=;A zd^xp~8%Y;)j&aO90$yuffl&$6=Tgt}>8YNBq`lMOK=qSpti)!^$G{uwAdl#dV0o$E zb!iR_lbO>p22wR(r+iS*MQH?=9;3%ZD!4ma1*s+O9p=?Cl9Eo%FR87(apQj`tECWI zQ7|iNG9o&&UKeGV$LI6OdUS4$yip_CIJ9P-nUxr$K8Lg1xJ*DDvm8CC-CrrNtG>J- zEmqW1&v(y7{0lpqg}4fzgr`EL7`OMvd(TO(3K(JQk-0@OB4p1&j_eT(9-ieA0wP#> z<5-RE_?aTo;SUi=y3Rv#^T^b+zuu#xYvlViJ;fpygOc&tGkU9icCVXYMmc* zrL=eK!cp9Zq-gNVRr&RfDYx6wz{H9cVNj?fM-pbg91eJ=XuKejX}iVQB7<48CZ`YHto$HV zqH)gaRIJcSTS>{M6kn8CL1{-*6P+xDe|he@)Kta4fx5>U!Wb!t)%6+ReuzNZuDcv_ z6c|rS>bk&b!YZr6^naAoU@jme`D%%+XK-PXl%4|NY5)<&qyRjM4eGHL;=l zh+eWV$r+CZL$@>ulp02!lJY925KRfjyu_D6P!^6AdAx5`%DHp&VFH}icA=Z76x1cc z=|Zd}l|ndt9?ZpP4!0OBr=-Z_gry1OWai?81wV%@bHY-s2gOIY^;GA;DIr@~HRc+N z%zM~Q5v8a~yOhB3GqaKg|Xtrs##F_N(-K=$j3tl^ZDfnLGB zdGURBx=vTlm)kRW!`Jg$8?%ad7NYfHV$HS27~ZPeCK~n_5h@0@vc}VW$LP_w29(ye zjbA1aW1+XvLX(&*{Z<4gV*e)X7!Gw@w<&?>GBTQlPUf9%u0x6d^&f`lNaGai~b#-W`jtAWCa3#$1XT>J(1tn z^BX0cC#vNS$|oa?uJ2OKQ~>gA_L5_VTNIZ*p~5xc=3L0tzo3^*PPFwxEap0J>>jN_f(BVKQTr5 z@AwMY&Nlrly$Wu$fa2&lmfIVpvUVj;A|fa!$)+>`Rvm?Y5~ zBODQ`=kwrOGYP$3o+n{82oMPrTNBH+?!{C3FdnCy(5B^A$aT?tT-`tu_Eb2()D-oU ze^Nl6Abb=k3cgNOQT^4O_(t(IQ)Q+VJ&9v2C?9nBA0xV`BCnhC74n;WqO~mO^aj(t zrx>W=EZ9!V>ae=iyHK_=wx2JRqlB2aPL2*UjEfcuY8;Uv0SVqAlabcsVsKs#R(`%? zm+@pk7OmuZ(sfu=bXqwYSrl*5;cvaTh4;A}B=toz9H)TO_h5s4$NN*Gw`ds*$kqi1 zI+Y(KXlt3Do}}CZ-Cu&qN-9}c0*HYoD`N<9z|Gc25B>cj4= z`qmi;uEb)0zEm8Kdu$F%Uze{@Jc56kr@xK;AW4W7Pbw2pV*FrfL=}@je)xPi-lgBG zQ7Rah=Rpry(B_6Y{@W}^guS`Z-TWU@L22xeKXv>%#6t6m@QUvSj@mRF0c9_Lciv@{ z|NDOj+GM|c6I~an$B$z5fe7)AdYdR7b&PiEhysPgv2Hr-i*Dg5Asbaev<|QDTiRQ{ z&&sh#SM3UryLHxob5hE+z5k=t!g=KRBt~%qEM+V2L)6jHuPgC<;(0b|CH^rR0juO> z%)E^|Zf?h9FjzRFJbNDU4Ohz$RYU$9&U{t7G?#wPgVkt!LlHn>($E~^x@V0Xk}(He zwGxP7B_nCDKM~@?-8w2bCFMBXTNU1ut}r*)j%9%`_Ef3@+J-EVfctS0VG46H-?XUR zF~o$qsL*#+iCe!Qwg*MSpMjdXA|dQlYAP%=Hi#J_3M*u)5Yak>bd7@mv;fpoikHhNGIE_Fol?i>aWz*E zhXJEB-i>frK4J7MnW>MVj({9`J>O2?Zz5KotJUi<&ENaplgq`_$E3}UJn8ZgK9Pae zgn7mYp`;plAC(PXb`00)@4qJb13_}eKcnrP7Nry?+L%NBMoRWYbxurw5n`yS{JkHx zN~{&t8=)XuhjY9AB6Z~3#TV%1{)Xb%>criNURlo#F|t&WRz88Zl70#xiqpxYhpLq! zl|~URQRi%YIjC;Ccx)E5UMp#LGZ1_N&-#M@Iy6jW$M8}7kc?A=(r`0435eTfc;8+X zkyC?`<|&2cDYl8m3>(xP-!IQuUuzdo!TUG}-It{2STPiW!MlLq#s$j&5bz_T4j3R9 zp|HgZ3O?;B$I)k>i{H*uj&syi?QetkNjdxR8jK8#gU3b_u_w%rpO-p&i=R4Xmqx(oT@^T*VeSED{A!});vZYhVn;yoE&X-D_)b~6`5>QV`70pQ#Sb)XA z3Dvoj&Ir;iD5Qs2RMztuj8!ZJeXPz`iyW9x1&ncEPFy`_JIW?Vr5p$XC=9xH z;*JeM=&X-v9p~g>YSd(6>2kB`1;91AinsLsXvf~x7-3mEiiuisDHS61S9K;C$a0Y7 z*L$`|HBpTZ;aYH8^m2AX*jtfkl@)?JR!=05E_w3Xb#(Y&8IJO3n~l@LUkC==lMv;_ zKy3r`y_kVT;v$F{P8HJh%svi+6@TacvIgRgRFWdM<@_i%ST@E-a8UlR9sRcW%hse2 z_j^@LlG~a`**8-4kWz4{P5VPJ5J7=mZhO&W0dr|hN~6<#=tBqoy?cm}Wz-3dI8Al0 zMr_EDf0^v~ujLnYo#f1A+beLm=?c6;1%CMW>wFYDakLRsH!@$jQbe6NSg(bDK6o}e zyu(lNgfM0G02q7=)&-Qf??`dRWYA;v3_uVk#6WK)L7{c$Eg5)21nd#WR1M2s&M#Ix3jiLydd)Rc#*Z@Q-Ya2D zDMo)owc_qKVGHCK$I@vyhT7U_!a*n4mMQSUb61{gN1^#Ik&b_9NKASc>u(D5NNv%( zH`;V@ovk`i&%r>ul=QLIV zqW5IrT5I2TB~{Dq2Zf(<8XRigA>(Og6%jXd>@%MFH>OmD{*mo~QzB{GG>xZ867xn2 z@EYj06+^US^48^`!CLrL<*_r2-C7Tr+d7mc1+^))?pNkGXpK;R%6RdnDsVkvRFwYJ zh$6(fZfrIRj!GagN#CrSSDuW?5S+~v^AyC%fODr~FMSEk2L35`mM0?c{w6m&#Hx9# zym=g^4~kOw8wwtf^pVBmlyIg#YT}e@y}r+B+FLadI?1VhBHHv2^ zJkn>YXS=U7AK~UBV!Fu@7KGQ#>q|~s4df-0y(+rc_k{4d`bvzI+U{-z`~*a9b~NqV z#u1Ki3Iqa3SnnQ#De4(Kgl1&1Xq-Kn&59mV6|p83J%&hXceU& z07P98&nHbUs6&C?km<1oXYKq3eL$pe8Za@VfWx>baoN8`Gzne#=s|nCY9+v>ILo^H zO4^hKvFjte1Nk@uMdQ$OfL#O{;k#O8lEp-)e` zi5z=J8x55)JFo0gv58sCoV(-w9wQ^<5xW z<_;*SpYDPa7CuQM1u&yhY#a>WH;zRucoqmN7#wb1b3gnm4S3Z3Q>bP?VfEo zt-L8s>Wh&Ft9^X8HORyM64JPEQG`lF$w#@BzkKMG#)jgIo}Xg1F=EGJ898z1Uh;b9 zrAsGDnB~NseT0DMZ9o1=rT^n;n?m4gTz3i@_Wlf6CTmfh6z+)~V}{uAUyB<-)6b;3 zgAcQXw#LgX8|XR4118UKW*9xpw8ZImlvdi|S%6vK6d1hevp2T&+D2cH&f zUqo%2Id+r{os5IvDj;vg^Li=@sf0m@tHKWoUA}=kpGa6cSN~g%1F!JSC`sk|vN9i3 zX@y|Fa;aYbQJFY~DBw-J9d@ znR-78Sx*QJR^uglOqU7MX`)DqPZSJuDCyu{y6ksn|2DTaMz2>REY7PUMb`oVoh0 z_Vh;%!CwSlaBWmB&2CQu75DLT5D915g2=VFi>tXg)UwKrGCOl#Rku-qiY!@xyR1RT zKN`tBsjZ|#X*aDtr^+Wn(blO89n^pe0l%ciGww<8y|uUl>b*HVgBcPQLgt!ZXv6?7 za3gEeGtLZ9mwzeY_a}p|UxKPd8$W@{IDf(eZxMtMJ-?GrN9n9xn$Q^o`&wDlc6B++ z$U$9Jp%&Oc6NLlVA7Ul-y|&tpj%BZJ?f((Q1JZhCtcvv_@@%m1nJuDt>N0XutXkn4 zf9F_mTSYa(w~w0RinZ7dWUHHPyP6@CqlS9#9WKhV4eIeo80}xiP_roHF5UM0oIDiD zv~Jm!fVR`y%eoXnSH?xQJ)u?D!teVjfJ zX~XWoV^^6ZblWa@=up^0ITGalCjBI}G>1VEA;!&Us6JZFG9L-^P0zX_nLwuBjl0%- z_%$lIKd!s}KL9O2(!V@tKoNB!Ajt@)eMTw1Owq=NgDAcSJ*G)b1tNrojdNKh?{~sB z5`aY302QQQkc8(HCH@Kf8MGm0-smk+cbn-*Fq71oGO}=&S|dT`<<=K@79rkcb&2ZA zp=Y*z4SfZlsJqIgWvB#&yEaiix=0U$Hj#D};w!9j8I|xlTi-~C70!gYpw;63U=9TE zrUW*Hl!{5Kw7})^(*$7Jln-)d9CbON8rTLCz40SH2KdJdRz-uc_V%mA8cjNCYB5A2 zetIh3@WJ&;QeJQq+~wC~9t_TCY=_;AC8NC?KsZ9wbqsKX127Z^Mlb9vC(3eA^Y=g~ zw{_RJJS7kPs;{0B_v43frV?T+G6#E&^7t{KG;g4e{csfvHiJSSc{Y_BhZU(|bG*i9 zeC4y4j=KjFraS&qX}}2JW-=2}NJr{V*icpb53hE%K)L_cbciQz3trJGC;H^n!fO*? z!gcqkz-3R^BJ0ScO}FL(U!e(D-Dw%vWTb3b@3BV&gH%?mab4&=AN0V|84 z`5VP%3Oj|Mj6%tNbmsM`n~;{u*ovqm3;gzci&zWg3)5buCEF4ep8 zT85rTIe;tClL#21OTZO&>3!SdX2U*>g;{hXb# z1+#ds<~WB9mSG$izMww@zXwT+8bTmW}%|6&qqo&Z^=^f%yR|0nOIRLLGwo;hbGG?o}`9AMVy9k0a-1Lt#+ZjzKYH>po1@416}^-gQ)cLGIy83D5HPBm;fLLhEO|okaC^ZL6ped>S#t-T@~@Ts@1fsK zE+E)mF~6pzVGBOXx+jdsYdNT{T9L+mKKRhq<+Gn`B^uPWH3D!bu|e{DGnA{SQD1ECUh(@)#z@4q%2DC|`IK%j#ls zP{-HWqy3k=Wp7h@Pa^g1t3g{T(}peuw6Xok@!Ac%J0q$(3PAhDPVFrd4{pf zFmvB=_pHBM+4=jpjbCB`adD+TRAEs7uwUcma3hnx0@zI~57r?%U-Sa6y}DYmCwvG%=6PP>QI2=0+0u{$xBMGFj7Z~a-4(&vzZ{@>cM)NmQeB0Y6fN#Y z&tZM6djLq``=RycU@?a`f|V$l%H4wk&ZvSRg?hmoUS(oU=yWb$e03!Nv)#- z2T0k_asE8nDbzfWbPNK<>}d4{y0Pgwz!M}(LYp#8at;7q5n$cCKoFWl&*BQj{s%I(^+^y%8&Y)@$F z%-?@w1Q2#@&kPzGY5CY&jS5=={@NAL4e_)ZTDzO=cFHlUaN2@&j;tE#b!!A`MxC%= zkZ7S5cnkj^Lcj$5vj>yz5upI=X6iUUE6nr2#*E`dq*NMBZYI$h)Z6y{tO7JoX-)9Q%CF(nFY-1?5*V&#(c_zbCX5Qv; z*o4a^*o2I1ER| zXtFr)vsrp~!NB?+kH?wpmGc$5z1Bup?D%uuKq4JS>dQHjmItt(1*g8MEno;wNJEQM5YWWc6ir&TQ5-g9zZf{BebI+w7&!g`AAq)?3(WJmUm^v$z%^Uy26 zl;3I=NHugs*4%tMun2ebnf?t-?d}v~3m~Qal&2G)JgJ-7%=nU(!fUtpuixqPa zfUrESPN8|j@(s3^twr9$&0@)c`iG#uMr2Tw5!E(w?r2`I5>p4w^>avDyec7y3Qg;W zO1lhF)W8Wn4f`zuq>I9rI##nEJu?amNIC`Y|NZ#RY~#M`nt`PqfUpD;qDSz@M!rFW zHSY;6n*;(oI$|RU^5?t^eOZb{n@;mJ5ba#2Dz6Mh0Okqx7Y+D@j6UkIXsi1=LoL2S zPnxr#AkIB?iA$ad0z{pYZAiIFix}5oSW#3h?ckDcPuWxs$L58#LASG6`j^KetNNUz zwnN^lPtBV9B^Ftbe*ThnR^AJ|i>dnXj@Fk>w}^GwICsuSlX(M<)GU60{KwSMFCR3Y9R7M95e2!1Pe>QtA=4w7TX6l)~DASQwBa`4}qo!UWUD~u#zm4ac zPvCL>^0msCX8H}Jz!2Vz#ApE-^U|J5Yco>3>VVt#Waa|Hj>ygn%`!*Z&!GN}QkL5D znegaN_#!8ZNkmdAD4JEL%uUXRN|1$>&(7D8?MP$_R%eoZxz=XmI4G-o!m~6#<Rv@2NKR@1qL$joHU-)hN`TQJAE+GOnK~7ak(wZXa6CQ3L^n=)19%uYGLX`bbCHuZ zj3~{;TmY=)&+&+Es&`GlyLlbIXSxkFdWS@lfw2tR*MZOmp0fxuYt<%>Ob0hSRAn4- zme4c*$UFp&+B^;5XJ(fXJY<m7Q)o79~ke!kUisp$+TQGwG(lyQSN~3Y~Ch+p<(!{q?wt`JlP_9 zj5&jcoW3MqIJ0!tb4+}SD@;-PaeL8=x^_9$AFQB0u4-!barb)Jvve>c4o#Tr`b8Z? z5gqB_c3hy68BzVqdp}2@i4%Bl#(=}6ag0jaFHie4AN%)ZB_uWds*2xtc9H@$HD7a_ zKriA5FP>D0E;u%i=yV$lJCKAgW4uegsfm5mZnsy+Y&$6=sQi|mpTIVUGe}xT4ca{=z`%BTl6L$zeu5PY2BYb^G(y=%^h7Epls7aSb&Lw&>CFkYpj8;QcH{wBXd(a70Mw<@Md3N;5Av_bN-Y6Wn=`!r>l*!)vq zslOWHkBrLjOi)y{+wa^Q;oSG=+gnp|Ez(X|*n8t{M3lQ?(Vp&dCn6UK7`K@7%MN~kQjCqJ*8sUcWho#%FxSb_`@8g?XIj?JuGY?(QIQF+-2!wg^f}8%)!*tS+4bmv_pRrNlbw%j z3NQ3_b-D1v)-=y^^mc|qsi$w*jJycr;Qxf-l$rveUp41iuacEV^Sn2OG&zowYoPDK zvZ%1!GxnO_>50Mii$T*iO~Zl)rE$?+07LV5Vn_Nl2D&5Ei(>a)yC$HS>B{Rc)k_LQ z6|&ZZ=VtT{@|y8INdsk|cBN-ax=1b~P1{#Ldavq@{*;Q4Io;}U4b49GgNJ7Kco{?% z4mT5s;oRqEhI&YiykW2Vti~1yD~fI!aCq#$-ae zO*e^avn^2wqEELR%vYzJE%UfLdXh8IMf}^fhKO z(i^L~5a^Gv4owOHO3_*Z<@S$4!r$fBmfhd?&+AiE$T4LIZvv1vIgXhn!jJK?Dibuj zH)()@;jv>s{&z#7i1?9nEb*GKSJ)`!V5o)kd=*$|)TRM+@(E}~D01p{rDc6m2diGj_sqrHxAg`BS3M+7)Nmx7Gu zCGck6qvQx3JuRNKQ9L(Q=9--PEG!^Y2}~_q_SPXrbK>Gq?5HhKV5`-Uh}wM>O$20f8vz%k0ImA+N2a&p4xu8$XF<^MylwrRQ+cQ z>2Py21V*L2!|MOFCpjDhmHgC~s)P&^b+#=wz)*tU{3m7GVj8tj&K+m&c!Qr$??Qd0 z#im@QM3*Z@UtLs;1{?}FKAHz@ckv(v!;INbmBZ;gHJ!R>6+}ahZomk$UC&hOKX>b^ zVKZ{LRAu(=Q&oo`-O(n38h1>zg_VEUT+|6l)w(?bP3M>&;dw+-hnka{(<~QH#g@^a zufh9*j7A-upzAO#BF~TWr`TIhr4ic5ww}Q-onFfCrhr`POd({1=PDeU zlGTa#V4#}XPN?%mYlfiCRrk3RY6wVXJ+X{N7>mv)2v(eJ~{1Ra2KziqV)<4Kty z=S7GH^ND{dJJE1MuQ6~&w`W=SFp76r>#<2PR`&P1d?`xI9#(5T$i~S$!u;6($dPy0 zP3mSrFu6Z%ipmAk8`IvY z#3!XYVE~G@-MbwY)75lBl32J|i!oBfBe^u%r4GyuTKXhMd)k`mTL6`qQpTu3Z*l2r zDcym&+W|LFw<OvQpH{;H%De_p&?CB{ zU^iM0>NiI0!Swl_XB_K6b{q!TV%@Yj$#RSoB)1Ez?!p7MTL8itwKg0WW_vjmdvk)6 z1?sDWVS7mRgNyhjRR?CM2fVh$Uj|^ydat^Q51>i?!S``=fqmGTGnN2pZYTc%Sd9RA z*D=6`V@XY9v2g%KTE!}tA49vpe~K<^as5;hP-3EKEh6^MqM+j(*>C(1w3qFdIr$Sg zD0uIIuLLjlR-&5$fyk_~vcPR)O2zzX1ud%ZAtj=1<00@98ATI&VmD&8Aq)ARzZcLK zvJ}ZKsTE#sw(FSKEwT*qRNYi?#x3#_T@4j@GPuL{_sEC|$1o^Mg}~o3z@&L8%F?FN zlEOW1m^bwxJ;J+_TxQHV^cmx#_4-oY(VR^hw|1PDwD>OZKqi@nRPlP_T>d zhwIYCg(-bKP=-rajvy=rJ@g(Vi@ct%MH_wo%B!pPpmWiX^l+f4zR9!L%lS?<`SV?D zW%FekT&~dg-G@>Tjw4r&vJ@feA{lB8UFiJ zx$-2O*0=&n0drb+U5raVajvcdVg_OH)s&#^Pt<@-c!kq`%|h)8;jus$NE9R8+foes zl-~444pdI&LG1c`*g*8)OAFTP2m-{P^tlmH0|fq}>OyZN2lb+l2l88VC2*^hyO_A!%Lpt_hTYW9+I0k6k808ymUdOeNa?QDl&2nHCqy6IMi*DCb-5l~v>Pj$-KZLqY100~>-p}!$6SdPt z77y&zf&_<$^FuXIz9wTxInf-T<(|;L;`}Op_P}HJl5~lHDI7EvAx9tE&~xqqT`7Mx z#yWH0+}?Ry`=RM^3d*@UaH5TSu@_~ZJvcep+r`m+EPhNXb7H$jh0?;9&VEg3H|5=2 zDo>_I(-CK8%H!^!6;|;}LC0noI__!S@@bxPmbs+$+2HYRlo^PfXdFX)VqV3yHt@68 zCBtRSDKB$=xAuzJk42!g;D0Mh2MG(3Q;@xx!GQt$*iWDzlt+jqK!}J>wBjFQ_=otZj(mr_|3lbh%qs9@g!33{ZoQ`9s@?BmPIVLXa%6DH; zHKQ`|o*wg#*ilULy@fDW_`E+U&^4Y9CwV)sUM0Z=TzL}%vXw{E!l$L}YXc$~f4uud zrpXdXF2u7;L?oy{iT-c z&mBtw9E8yeeRFb=0gr7`_>nG`N%p@{SvpIL_N=lZQA&1Dtfr7YxFD}_ZV6jXjPpTV zmtKjwSvROH4x#uK0T0k1r3{`4^(SB0hK8cX3e4lTwNupydxk4Ax;;^>ShuhysLWrS z51%Mv&k@80)j`aIv%Z&TxO-LngiKM;o8U8H`;U&CBTyKR^Y-Pkfr<3sa zbJb;|5)v;iCYs%1&GvlX^F8?GXcW)q50yJr+5Rho*ME&gbd47_KXg;wwHcBG1*5t)NY?d^Hb5n7Q~zl(uOC>(bgLk`W8~Lgc+7S1A4P_3-%b*m|b!YbUw0v74&2Ax5w7+G?ht z`49!nNN1e$Cmg7NHVcu0`eku3f}!2K#h-nKSe<;*!Nxc?~E*JU<9GW%*8{y zgRN<)?;%9>g)_~_BoS10Tna1ydCr`EiKG7~Tgq58m+S?S9X({QBzc)py8 zo(4(1baB;JZ>d7#r0r5P0ju(=W6u42t-SY z^j}P`>0MtV=GBS#}VG&Sb$?TVf5=#5D_=!wYd~GE+gkA*j2I6gdP5fxvODxC$M8Ux$1d5-}Z@s)W{kI z^W5NPTIF%KVt+{J%)2eLgn8Q4SE{Tx6Fcx4lI1S7KxtQLQqx4;!&b2jzmbXb)3Me^ zCX7aRXiw`6^0-Vwz7C>TGKm)^mAS(L{O+PYs8Nt#v54qS-}W_V(|3%cJVo6$kziJG zSs%Yt`U|VrXL!SZ6JYWD%7(7sd7jtDr2BI~iPn3(gdW1m`$)5!9#*}eh-!?e z(jh0g5PIwhJVkqLVK3j`_j8C&tER!Kfo*pScLix&y9u>B{>=0jsVeqzIHkp%fBgZd zFxWMI+S;Oy2pV~-^umjxpI{8yXZ^r|o18lA3S!lepYnNJ`U}c(TShRlhBfmRT&t>| z0-R0>(n!tt9(TB0g}ZO)r~1*f!0jhdMPB;6KHp2%K+yJs1o2`ZA4m*ZoSE2kL$xbI z#v=Hp8)FVa^KwUadB7@KBMML#4{4G^PO!1_UG;4Bi>gwKry$MT&^@UuaU=F54C=fK zUwGxdQ|2(?^SP&q@f>^<&ilvqea(o9eS0eAI-KT?{i(h+9$lY9sd<00M+N_~Y93BU z%h8VQmAO!Ny`Z-9Xx8C94=O8+h?8(V)fm_E74b7CcLN)(j(U4uZ;rJ1P8F(G;)vtZ ziusWX>N?b!$Z6(wChZMw!|#9rhUI{>EnmjKUx7@gBre>Dch>*`mvnPmlsz#^co6dL zOplZSRSRT35p`Xhfyji6@AT`RGJmKf?ja=7P&JUJWaF-)P>6w+WEh^7^sn)68djV# z>9tv~$7oZ|ju)>ZDrvfUQ|dR;=0bLyMC82ui+sO_awJI}=E4ae*`QU;G6joWNT-pn z*MegY=GpxdyqKO-+7%3LB*O6&b-iT!7dlO&@)YvI4)+3YtB1Ev%P*79TO2&a5(ECwzc@Ft*1n=95XEV1(I-k~eqneiEYS6I2|`TUid`M~M{e6XGGZcJ`sa+S{4 zfjO9Sp}?KJq-klcm}Z=9D2IjpovA9Vpjm^#!enusgTQI5J<8HrxFl5z{O3QZ*<5#O zZU@DrkI$d#I~l&jK&55anx&qth%V`EhF?K^y@vb0Y?)%(Q%kg-i?|EzN%Yl z^zl80)KFwej!@r(M3O~$@pVCH%MNrm# zopk66m}ynYy5+aW_+*3Zwe3Bl>0~TP)h)-vl@~niz0HVNHXGZK`r8wq;180k{HOGI zAg>%Jzx4^4L&E2bv7B%vtj-IeZ>3MUwX(H#KqyvSpAZZU(9aDM5PA=TRon|^;trg4 zSky-NH3AnI7oyH>DS8a`x4RwFc$jwkioBa5eqJGL3AMcJlyCw?V7|Me5lLM<WZPyarDguGBBwfX*h zI4$BbXf8XzVthZ6vaOST_nAx|rj)=t8Am5{`?^D=So37f_3N6ty;C+mv9F{Rq;wTh z9BAm%b%r0XXCIBs!d4)&c%}CRc=a;_n2#RVA{9tm0$7+R*^n_CkxX6R{d&lM7od@P z^K*5dZq9!5-eGv7w{n2;IH2%moW(8y z`YMh%5#$;W_p6>2%v!iE)DIIANK7M%jpK^w#&5}K)e$qmnU=C&)BV&4Z0E*oJ7c$#6 zYmBXJ+;Xo;XusBU9+xSJjkC&0=VaG3V{=3_Js=-qI9IR=`GD6}UIyDN+p5l?Hzlhz zD|%R6DTs^$O^)j~;3^ac%73O#(8&b~3+^HHW0&XSOfAF6z@Y9b2q+J70Kvg;a7QN1 z+BM!L1zN4p<}ESxJo7NMh$0ppN=;VwxR03LSEG)5*5L#odtfCFzGp#yHxo?YZDX=W z9`IvozG5>_1f<9)R?k9KzSl?>^00Lp{md4>*AU%!Ahk7y6ZtDxASK)&7t2E{tT{il zI5h|RQ=@G`3HLvD6e`nK69eds5{)*xBP67gRvHixRTwfFQqs=YLUG?B5||7X@uT%_ zu^YDY6=*3@y%xth|16_beQbHCqXBZyHTof9fRWdk@L1Ip=_gyr{&Xxx+Xnp3L$%X4Kq8Pc;Xv9J-S_5WKF+h)KLa@H7d(ttSM!D{E zbRJ@(&Th^h9*EP1^OH&y(ltanf8Te7B9~j0A7v*Mm;_#Fv*_>Cg@EV3yY4WMQlzF0 zdh}F?FOVk{(=r#F?5DvImkY{<5U6!|?BE7e@OK|cfQKjal0)wAlL?B$!$vQ5yLBIx z9ZeC<(J+cgk8xG1V*(qGK5Y%iq(hFx7$~s0l=1)jwb*JR%ifuV+i<#yA;SvpFKpnz zyX-{lFCytOGlE6O{C8ZiZ?N%2b3S5u40%Ig)j5sv*O!@v$!%{{QOE|ouLsRb%?5;c zcEBZURL5_ju1g+&`&gO^ z=@Wnr8?As@nIDsT%W16Cp_A`Kvut}kPa8d1&88RAqZ9t0K%qw7^5Bu@!GG4k?~POw zL2y|nwVCAI359YGhm0E>yZJdP)2XnG3nYhpuuS8zPOsff`}+sCo;tGw&$%-r(dKy8 zuMM0D$-oqeg0_(PWyKSyQS41^WlgEOI4J-Hut|#?m13V(B~v8KRf|@_*q=81yk@M? z@C#(q7uu($@j*Y4bOI;!#KN3xFGSHh2oPiRPiE5B-8=n9`1~E}f3eyl=F5t23{~@v zb(T8V@;R>(H*jQf1+1bkeIU5*38W}1?2R(v~< zp>*?D#Y16M*|ha^l~GE+b2qg@?tOrawTss?un?DQf!nUwIWOXjZCMrhild7B#KoDE zju}k(eRL9b%AYfs1#WSb0RvG+RU1jelo0!0 zQ01<*IC=ilxM+Up<*rhO5^((!D+@cSvN1@;`lMGswdx%)GA+;(`Bm*^cj{vin&8x3*sOe&3As3+3?j0j61#@PXPF#SIzU;OvO7nb1pV-d`X(XQ%nB*Mb+F$ zES3iDnod}LoBS>1yxlq+(1A4Bmk`*l^Bb>pXk&)qr4*5;c^%+9ZgT)T1{xfSJ_~)y2#d02~Hxr-NodtyJMMq>E~- zi;#br4ST*p5rF=m%;q;cIDdO$T(*M4o&`3Uyx4 zG+LNU8^LX1cvh4~DAdECesn?NlPA2pu8>*J`!i=5! zDg9JagKGH*1pr3KSy_NP)q#u{aj{a!h+QO;UDYa!+XHOB=s+ZY(hr7L&k$-*ZAv#_ z4y9Om|G)y3ZA@nfwWYZ_e_S+Mf52j0uc7MdxGsS)+=6Dr1FN?x?eY3h_Y}5rZ%g(r zqMWUA;d&V^3ztXxzMowIXGW9(9}>VnA84B+`+1cQI4GM9sp63k@)t`j9gC-srX(tW zjQDq+yJy!^NAZXqUNz$#zTccWNoVP{GId9tp!e6Q_V_{@7vpWZZLd&W-aq4s4nnC= zajm;0K}2Pt((lSctGAhNsL{uF8Ien#fSlH12q&&*+L2ezn3Abl&&}HvI;(Jni1DBD zPoCyskEqiMQ1wVHV?zB!T__B1)xUHi-cHlRDNUnWbtKY!#(q?J{fHKygHfqlfIGBx zr;=h9xI;lt#2M>}FW zi<;v@ax=UD3OXzDEC#derYiEk zv@N+hVK&2fQ;XtA=%76g>GG^S;oVu2Zr&l{8!nko9qFaPG+%^@QDF9bv#029!J zEd0ZS8zwZ%TdX-Tdd!c*I#3TwRFRZ_?eP;k)k&Y{u;wTs?%BptOveziumr2@{LY8{ za4xfI+a|ps>-%9_41XSF6v~k_c-+e&vu+{dKk&YjR{V!+$flc&1qgDvOY8n2S*-7n z>{kB&6x^py;-wanSvB|R-Kb&!!I)i=<*Py1wJFz8)nh;|qcrX)$(JD`yuEn>L*knb zR~pq^<=OG?L+*S_#(tpG#>nIr^we9#f~U zH)#Wj>#aDCB^Yb8KEfFd5SrShdTh3cr~7Y>C%IXdkY9|&gm^Tb!I~N`sbiAY9L}AA z0Nlks>T`*d+PNf;4g6LtiNXioUI2)=yeoXq0TnlZI0_c8XXHa$lX+bEJ!*EXNl?Tp zD}VE~uDQ;3I|iKYo;agAa_u4*Gp6s2cgy(2xbRN=O*bylyeKy-Q#Yb{tKAl+knwA9 zGzhkZ`%NEyHL@EiL$ zS3{Dn9;~E7qQN|I!-cmnrMp5?WOL?W6Oc%sau< z>W;ZPfq^)3#FLPdo#Fy^J)!J3vYj#w;aRW-fBsx@D&Z6K(d~Jnw5W#^vpYjG)S6G@ znJFgmx<;4*MYb#imMgxx;VLmGk+4g8-0Q-!9CYAr$iQ%lZ|VNiP14+7G3($-wVp`d z!WW;go#&rvLt#}_=RGhrSUkvsWZJwS0FCb;%l4C~kPWz(RJ`(q%*1_#38E<_Jb$7H z@ZNxoX{K9ZjmO;^1<3g(A(xQ10%urg8-;!H5%#o+9HT-sy_?}3-AKPJ! z7Rey_DQqT~!ZtdC<(|pW4Z$P;YK2quiuHJfCq=(>=&dHF93;t@C@>wBy^q{IQc<osc65e`2Z3N7 zF!^Eg{4JeXHHPADeGUaU0}?J;b{BSD;Es)D*yu&otpzL>i>uY*KS>2dN8NCX{;Hugz0>0#L@DX05k5R;r+TNo_Z) z#+nk2e45uyzK@HCn~rp7vpF3UcBTyWH7;j`GADZm-}z;c%h0D!acuRI?oTeY(oNUB zILn?pR$RqPHcnWaV1nsZF8`jEeEir87?w*d(sr*+G~;yq?1;!}u3{rJPU%g|;!ym& z&u$DZuu;KqKy^y1f3C4`U;ap)2;aaf!y2e?xEwn1?C1R6r7;(b;l*JrE~QCPbL^U* zHkF>Xs`oUO@@}*u>BL!(W{hM~!a{4G)d=6j?&)rYIn&5(jBJq|I-sp_tFW;;0)IWe z54l+C>k4UG$z&~w&g6;uF6;~9(>%fc;XqUVQA;Og6gzXyUDZh~met*XaP2A%1|W2p zPg;785opb&)<>FVx=UxD%9dMp=amc^4=(EuaDr5Ab5s`X0^*ki1;)P__jVLuVOI1u z{_yY&eg}8t2K81XXE27JQ0&|0srw#<#68g>X9(Xa-%rj#Z6m^o9LW>hVnIv?4k>RV zLF65Iqtp73CvWWb1*fnVh&AZflZ4PpukeGVnhT4$k2n%7Z8S$%U5-H(w(_AwL9R-| zPb&ng#f-c;YclFQlP2rX_!jpRGa(dtFk~I5e>>VSf(Xij(Cx0aYGd1>DycMx@&a49 zX*E@fNWz=i0Fde1%nJQjiY8gePygu=^*C`jT4_);#KJwADr9rJ#P=FZ+x^NJxFAPy zMPH_%M31!A7IxM4i-{DeC&0O<$N1zO8guNAQi55VL6eUfN3Y5S5RQlhJ^|z-T2CYMVF};%^oucI$ z)Q3+GMJNpTIkXHe!-KE2B4~UM0iX<;`J#me4WtDAV?+KI=qO_%qunbSQ0L#m zUH{FX=9ttgw+$ta+KR>N{$5R$i&urDtkJ2rpQ?+u26-aJ(nl5V?ppqJ-*x-h z^TWHNV`J-x+gcd|0X?{6FTpBL`Vz=UnuPS$avv30gK_=iPmW(&A%#n14f3sRse56` zqJz^m^?~goS6*nA;c6&vV<58txw+%Sa8ZLBreF!8-7?SKyGJ}=*fa~ZtU62viTgaP zZ-zU!33m@tEw$r}Zuocg6=BkPt9n_edch0_Yu90xJuXqx?(<_x1_~O$I!z5wCWp+- z$0{0qu(+`Y{WFEU(Au0m)=0nAHS6gC5FGRnuFl+^mL?yfqKiU#B|ah4b0(p&0(+Ef zE#7$!MiJR*WL)Smufs{Z?*_>(9sK#K_c^4!A3xMLn);6C9)kh5Kjr^9pXIX;0#4P1>_<)Q5(6`M zuOzfbQsab__fkVH;6>yi(D?Z_pCWfHi(kR-3 zc3pyn8U`_rtEFCY)&*g{CQqbSse{cK1(!b%7Wr(CTnsAZS10s4)H51-Uz2lAZu;1# zUE|wyk(ol)ZDQe9u_@67>F6ASQ0ml_UJ{H!1c74B#Uqv4lRFbwgQTCjvCaD`eR~ni za@ehX3e?UR>waKgR78SX3T>Yy2w}WbIVHk&sMFrW{dFZY!~R}gM#+v@<2CDYMSSVL z30*%!mRHR))45jAUNYqgWkEU2X9mmp7x?^^+o5G1uRnMII^KLene zDsC^x`M|#~@Vfp(6&IhUa zdI`A$jooFwczc@20y_MDr?uG(4;&$YrTQ?FA%fN$k7}m-H8BSq$&TXj3JOy`^w9N; zvTu6GK)X%5Yv~0Y6zxm0^YVRcT9eh|jz4BdWMVvKHq^`hz69V}j}a^(92r^_>Axow zG82l>m1T_pPbJ_m6q-KWah~A8Z@dEh=w8ZeL|H@o!tCnN|LcFzJ=nO&P;ASFUeKG=5|;2M z2c+S4e_8DJ9d5bwY-kq^qUt;JFm{pD$!QE%)E?era+_Yg@j{Ihj|2cOQv|uBAOVOu zG{^@I01kEjZKCK8nJNYptz1HFo4iQmw8Y+Gci?k@$Copt6kOrH*x6o51?Q^KHtNDT z7Z5)a6a9^$U_~*qd`-81&)!IF$xj63iUU0 zfDp@8B;N+PkHyVNyJn%v_e>W*x~Hlgp{8;TgAa%%_XlPWCAYiKM(gy{6T8+SI8hv* zWPKz{)}E6+K5ref8JP(OiXPpzVjwzZ;W>p_9#*$6>IvAB!lN%ihltDN`Z%eZ&=udT=tj1r>@&>%rsF$97i5m>3#)T`Wsi2B2W zvTn-Y_5n#OpECpuVs|N@-e_`iZY=_ac*)nqaGG9DV?H^EGJ2Yi~E(T7I%J$`mCQ~ z+y(ecsz{WM=m7HHkZAfsgU}%~zLqxFbL{=mZZnpQ>(ey1 zWd<3F2Dl1ccE+7xl`}{PZmVXP=?^R2(FA#;_$Guw!z7nAI3+@WJv>7jiJm(>{D#HL z<@9%#yl>xs5Q?@#rIjc0L9MgL!4fw3kU0mNh~m@T)?l(I0Wt*kS*Fn2flYvwLLS)L z5el;!D`_hXif<{4ea^uY4)zDqO$wcGirZ{r_a*m-ZTZexy)&fjWZiAi#-e_N5^(e@ zbr~>aIvPEZ zNzJ7!?ma4;HXU1|l!W;CD98%YJ0XxNUU{%d{zi`7$SXpU14tB`o>KKDA3t+A6HqJm zZRwwe+RbH-SgkC*&#;m-P9wTzt^4EtdL-RDS>T+wHeiRgA+@Y)UVj&C4xEMBJivl| zjor}c@HwwNL`ky*$43H$PkS{v^svixmidcILE^DEkt43XIMUc01;agoKJ z-KZZ$b}4f+b&^f^K1{J9$ubO(mA#V|Ka$CL+9$d~SAaJDRI|B>Ev}{FKWFlK^vnMr zi05GCqn2K9Vz6geZ?Kq<559k?>l3n?E9$dRlZy}2M2Xe#Cy^MvHao z(;8u2#O-bMa4I$d4=C{065B_H7XDRSxxnO%KT{q%HV-HsFc}m6%7h?nn45*+9A176 zUbRHe&p6dN!3DsDsP}$r;-yU`oq`9tJ@bjU_Uy^i%~A{^(*NNV;aCpZxpP zD47O?GXQErh#XAJGT&(=3sL^b5SNaVOV|#qFGe!fExf~n!mwl~9LNp$~ zu-PP+1OUi!)bf&<0P(-Xqod;53K$B$wOLRw*>Ap&DNYv_>C%J}gwBZNip-eSujp0v zbpN*EvHDX%-j~~om=Bydq|Dgr&E@VFCpin?&+~+|+kQRpO3RG$?X9UlDC~M_s59)I z_=!pZ>^32Mv4U+yoZC`#g4{yPtLVxO4m&!m{gG(~v7IHspu%&jVkj$wu93}E3+MaJ z1{gJ88wuP7-Vk--c+Fw*R-N!ex65aat39myPUpR)Gg>)voXF?I*#B+@7 z*WM>Um0YguxaQ9R$Mo0gF|*f&+-bCS%b}ImGtgqKJPg`6pp$~?{_pq|dLxWDFTH@>9HNt@m$UNSI7G#X6TC0#2dU^y>>LxoJ+yL;y%^@acB4 zVb<8CW|IV9?}IvroxRHtqDY9gtX7!Iv*knD@`2|;)54nfs6*VRsjIHw>)5RaalI%3 z?COs~b$roR3V?-36UF_Lmd)R#z^U!oUL_kZ+?Iq_kDu;coCBgwHw>|1qE;?H4+^dK zd?@HqdZt^~IRgygOB(8S43OZ>gL7^rO@k-S)ddtNA#Z+)i^ZUV#rdfu&yvu%x>%3U z#kdtBzk7)>s0R&9``%nwcwr6kq-^#!Ny@86c5aGj;|TI0&nD`9yoMVgm|r?tCS!BC z9caH0uCffxBz?A^Y+iE?OMEvalhzbiEPa!0S~1Lty_+nFNlwoV<3^om_`-l6YCF%R zMuWjkyhf765qBQUAtjZIqyIawj(naIgZ{E5NL$VNHuHc}&WmJ<6;H1TZn|MVs+n;{ zo52+?04@>s(ha_)H_{acu+_Pb`;^+iZ2i*e{G^1e1}5ko6Z`dfCgv6+Xd zxLb6saRyan`I?R5j$QF#&gH>P2eIYUVYimLl`vIPZU$oFDCJVWoc9%|Jq49`Z8t|gL4yZZXfQR_pAw~3w}uBfvU<9&Np zE0f_Gd1NhOSQAPvPFJkaUs-U%|N{mS|NAe#^)}mFgFl=S&y#R*PaYg z-gpT%xp5nuMewi=`;y$y@F z{e3Z*1%G_L(Q=;DT$>}KOR6@QK30F+EcWUfNd19SV2BrOf1E+q!1!#6gLYG=R-}$M zxe=Ia!>_`3J$!M;R<79zu8d9ov!Jo~mwA$&godw*$DLhREhIT~x~Pc@p#%6345YMd zZv&Y75NAK`uMt8onI0C1Z&`fX{aj2)u06 z*4b?%^=|PggcCNNW(#JV2LDZZg`^sFD^RSNgN7Sfra@)gN_5&w(w3WpHVJB|#P&x2G%~CV(Ab9qEkI&}FbKkgs`G#OM73tc(lS(2G z=lzG>n!H#AZ={k)VvNY{<^av?@v|_wi8e;tibj%}tg{NP3-y(39iXD?5&t@iBqnoc zv{5$*095-_?(o06&rqqDf~yOS38rjTNiUi?_HbPi?vw(TaVyV&)Ow{3(l+Wwb8qQe z-MGU?dm!uqFVayLG^H_$tCXXBT z1v|!xf8!k^gUeM}CY!gf+T3P~Ub9%yuasO#43r1p?r;2qtT$4P+u4955WhfhlOK+g z{gsc1VZBs;DnHZ_c8{Wh#>*!$mzV5I*tHM4k4TwH2oZ$E5Hqj7r-w|TIclx^9Q|7E zmxt2oWtrD07UNm?GKGi29oAa^zGILcuUkw}$pl@d=ajhuc%Pn(98%%swQp`oIWs;O zS5=tUQz-C5r`qF&N-8E3gV#9PS|9L`M6OCjzUNA2mY%YLNX27$H^YNW7ikrBz4%nz zs3)*R;G$??R_l}tR`_|K)Dvs>koU52TAVvF?_&oK`s}GfL=0WLEOpBI`2NB9102VE zo)?&wDETs?o!Ck)4e)8OA7)xPrbr>F65c4QRtix(T6hO}4ZpEU?Ml^ zFPXu3O6Zc7C|vLY$wSwZk0=%*E1qs+5&{m2bmOr|m%7)vAsVIAD zc;<9Fv(uu{2Qz71+g*GVZN-(D{%uL&$r;({M;q-SlVaQ>59$WZcJ;!0)5|L&iY@7w z+~Xngfo~ z5}7ZC{1j|idGBp>-rmO(jSfGO%iUm>i zpnpm_ER!cD1kisHH_1yg)#mNRt*Yr#x15<)n(mDP6?yQZJ?uCS{#daV#P=vc0vra4 z1DOHFF4aN}ykK&##Qd66f%%GQ8GxM=DzP`4dhy=NlhXHe z&fs`^>o%qRN$I0RF=^sX9j5}Z@NRIsLQfG2Dk}0TB&qyea_S(Gi`V`JJ1!f6!DJ_{ zE9+f|9KhBYcv|z!(O0=fV0Ovu%C+Dqwmg|0g8wCP4ZtJJI~cuhx`hy%z3Y0c50C`7@Xq!$Uj$jcHum3%W+fYnbgArNEz2h|6SXSKGei z{MtX}iII~tHws(!uW>VHu>lVz-cTo2drdF@zvIox>|}_Eh8NX$eE4{JB|^LEwwLK! z!G#I|f4#r%PA#rWy4^0U&x{xRN4^E4Xk$GIbx-1|YP~RnmdhS5W6>Wp3Y#P65||20 zRAJeGPy_@iRE79(Wt^!b$~eF$UJ}XVhol+vVF-YsrT9vHj94UYE;zP zTb5T<;g{RAJ6Dv9AxV5m2fg@*))bMA7!G7yUu-_M8VM!0 zK%;ajv(iG)tP6zw8t9PAD?!EsM($A!%j7NT^of~?{r=tnOq9x()SYVT43AFnqE2?U zfllas>9}~m(9hCYec+hH@nQL>irxW-2)%|Nbby>Jx~jxoiDBA0AyOfNsMvbi0_IuY z0SIP1R=>o<&W}dkP~5t`IXPNAM~CDIIx{nKin`t=R0}A=llfyX+ECobQ4Y?ghjyA< zg(P1L%1)>{eYp5Z9EGm5_+emb7TnGZU~UckH?2d~9tC9Ho-&fVV8GNiVV8+p^6b|$A~}_-WxAbP|Lq;^6wW@)qVB~zWVbtB^rW~4nRNKLAu5x)$=75LTW;IF z!?5~_=3!Jov1ZYB?-=ONa}?J1m8`PVJkJOF$<59WC3%Om z$q+-KXV~FK<^cB45I*DBt;FZUB%dO?ZtM_!wV@jXs`3i!5D+GZ@UVt+nGUT3o$bG1 zzHU@3lb$bsv?frSs12;`|5lry*7)v9L)j?oH?y#4m!^_C43eZuajg*DS92M}9lgB( z<08Ax=Hxn@80V%Eyq;p+kZ*yB7ptH_X4=`4oBVo|Wqtx;Ch`@mKn?1yoxkmLxMdAWe^%UDPK z8iFBRZBhey<T}v zOPc%ASm@cky=yeCLKPVoJC+j|#*JvtyX~SdC##W-y5F0aiVeyfvrPM*i_SxasRj|~ z8F*FtXGzah1_D?`fIFle=e&Z4O${mxMCG!&gyb=jN>rc7Q*;gyLjF|9j#t@3nv`2L zVJ25`vduGMJX<9zYfEw0s$o^8D@osbsvY&)!bOSLe*6{2_k|0JT0-Zp z$ltw8Wt-jv+NI4r-OIYo>mIj9CP64q%_X)D&F?u6)*{+Xf-qq;<2ua0)TpB@ZD`c; z=>VeEVlBh}IYsR!;ihDfmiV^^TCxFhtTCXlhdvP2R6kRT-8Fgk$+8G5#os1%z$uE4 zh;pvHrH4g4K?MRjqt>~7S0UYb$TV|k#B~~;T?%@$b?Gk{;#&|xd-v+4anw;lw@Si{ z=1eeqkGd%@43xaSU&*KatSG?$Oz>e4^!YHoX0!_UL(at2h~HTwc6Hi4~e}G;`Tz$kO zoYMAXP=t8p%zC>`Wi>&u%HFgi(!T)^&SL?99U2rEezN6*b|WnO7octuo!}`?eN2xi zBxfW!v&5x~q;)&7&q#2ahFaZ`P3j;BgTI}ZEJq{m%zNG#BfJ2i^Rl5rxY=QTE`xlrSPgw#G9CfcepRN3{` zt~im5^|0YH3DsoUCnbzq59&~xn2R8k;7)7O#?zK^_szC*Y+NO1!3!~U{F5O}vDp`mc)g6qYhzIQ>mvU=JASQNZG^{@(2PCF`!11c`ru?{a z59h5;?LY7BzOi$=1SMF41Tv2M#&0a&7o`zOW$CE)G>fg%It51QI(_+6JQ;*%9}Qg^ zFnUoRou-nVDW{b5S|+Yw!1|@jE(}&swekrDwMp*f{2Ou6c);$Q)GReXqpSi)Ci*Z_ z1#y^)Y%@YF;$J8K-~XqEtE*X6y7RYpZl@YNS8ThCFg*astVxvDoqs5|F7jz3rd#8y zYidLb&&+T?sQzyr94ublm~div&VM~On1{@!FQCRS2LI*30Q2dlH6g2^ABIx$!4=SU zV#{uDI2xs6(*1vB^sC7vUi{BM{nrPbgAHxZo`M>1Ji5yXyKyg%RP8{muGUZ8ev2na7!>_%YDqIK_JA_T@!i5%RIX}bXbcQ}#ZcZwEk(I2 zr{G7T`*-hTRY|C{t=Z24ZJoj-zL}`1s9Rm_?!JS0Zg-cqBTz0(tOB{JDWn@LHoZn6 z=`3QT#%1_h&5`held%k@cwlAG;2CKe8_ovIwk>tyfmp8A!THAnodGL9PPM7D$-?4` z1|*${8?aQEMDnG1l46(bCDr<#Yz692o>9X8iuuA_cmKdo`73$!!Gqk{51^zAU~)*+ z!;!1yU(>b(vor~G(Fz(Bc+AJN;4Bwgv~G{9s_!nD>#ls?TryLt1~lBl<`wPGS2F;n z;-=4U?1{@Zc5m^xQoFfu(QF_B-)ixC)fdtFfy>2x4Q&Aso}dX;;;^eFCejr{DE(Qo zix!Y~cW#jWrco{rvSreh~vCoHcTPThApH(u%KF|LmOxkkVscCZ|Nxs z;WO|n*ZVJ}94lt`2m>W)cyP~Kv8~YUc|WVedSc0^DY86ypK%*VSNDdOx@dE&tZ-(- z1h?+{xl&UJ-cTZ)q0!QVxC6Fn5!7TKTH~7{;fJwr!z%WA7lkEQgdtD>uHtoCX;(-} zEwHAgX@N23qe7K$#EOvZ^W_5q*-=yzgN4D;#2Rmi(qiug0_+2dAAYn9rumVWJ1_$} zm|=4Q4C1U3w+-ynZcvdXl%zD2(&?pG!JLgC&0akyx4kl@;4CvGJFMI^CwVo7_9zP4 z#t?nhS&bPR8?7p-CV4oBtUTtg3-!^a4`wiVWO^}X&y)P5OcdCPlw-Xs>6e~T6s+;c zQvP0(CT8;sCL^j&_`g_EiH^NoF-+|dgOYchd^wQIu)HGA84H!-^-|`oc`Qf@4XL@( zl`I%)o@|ApLOgS7JWl8unUBS>B_w$x_Y5xG*;%?{2@IVaVBOpou}wXynr0PkoO91C6S-c7GWIl*YcJW-J^qjp5jU$K@>=`(o!N*Nna3HPsr2F37Hc$M4#NI z&q^m0@{En0{R7kg&*O{}Q*s~X56g_1@~PZ`KvyCJ z2hR6_d^3Kl&^%p!d+e{0QlZ0_-!uMPHBAVrqW2ywPcoOEbYxyh(r_wsj%WvvdcM`S z$(#2nP!LT7GX%5uo0UDJpbGH3Ew|k7Z9XPice35C;RtYV48`$k|&LLr~Nqu4mE&lvWg<+oX*-D5`2wGv$N&O z<>DYm)|j0gVe-r{zEcKzoJugO32#cC;I7}zB_GC!CF!vpkC6YAxD}~zjCcaXEzw>n zoETkEAf4udn*Rp1-moseEmPFO=daE;VfefIf!Jd&q!0VxMssQ)4iy%;GD|1lq2-R% zI%t)gDY*2PO3qzO3`E`hI-OyyTsTY_HomQ}Db1!~ZHjRo-ay4t9V)C9%ZqpnaE z_p1#~^H@9}@Sry3F*`abT2law${SkI1y0_Kjqt>z{~;4u^x6T00W<0)T_q8g%s+PB z$+nngL6PaCJbofW2;5~Y1H{YR=0K5DmhmdbR=m+A!DKktRO)&)bYsbgE`plELF*+G z-ShKWz_(`%zAa2HhlGPK%ITOFtOwNqC65sUu3Y%I?nDGf;;oD?UALj;+7DHpUijfMFeHf&=XX0r(us#2MNm#*{W%vl zcNhoK8ev}j&#IrhWD}4`uCh-GNin}1ejR3)mM*5Y2Z8Lr zvSUMWTFKjrrad*vqohmWy$-R$eRSlc66x8unBIml@4!omM{hH{57S;;)4_=_>LHjM zqVpeW2%tvF0G^O*Ni_ETw6I!oQb!P8!BkruSIyL6bCG>t2?rau1M>>1DAT%b7_Pni z-{cI&z1mGRqyqsCaF&kHMntNeO@@}KSbcpGorKB{w#bo89^w<(-N6$(UpeIWULc0% zacDG+PDf~`J*&#Xs8XV(?d~Lfki#};`j}oHJ81ita02UdCDGcyDSkIUKcl2%RNqH> z)DB$ZJ2Rzlg@d_>PtOsPld){7JWt{|+kq)~bMo$0T9XIS7;<#u0t})EAzN#HEmBhF za#^3`i`?t{2#eFNSlzNe25qH_q}dD)bC_BQ!bD=)$*YdT@EA(cmthCto^=6dimW(w zL@XIk))pz(WHXK1Mlp!+AKi5m0ljIY)z%8tADZ!`gOzsU0^^gEd%pC(OMpnAwz2%C zeQOnoPMjRz?_Hp{=F8W(LglDO03FV0H6?-sNVATsu^SyYSd+%L8%lW^xHXYEDB?Z$ zFFL3EPsb;>F8@T8xASWRZN35ukNW57w@hrooasj8Wy$V`FrToVPjhDWJK8|se6-XX9QWLZubjs#8CbI`Z5!ZLrUt_4vxIX0!Q^V3> z%pEK}NmIr|e%tle7YrxxdMZIA%#UrWBMISBYT3aG0Mvnt8275AV;$g{qRR0WTN5S4 ztfeFMEUF-}n0u$MuM-s1#80|M3kKuC-X2VVD3Om^4wz5wV;F`h3c@Dvp$P!JzOX2b99`DU9? z_=Fw1>jJMUean2C^VUy9GG=a@zumA~hlG^Wrpu<%^|vg0kz(B)F!7SogG@ReG& z!+@r+lV1E3r%#%`hSPAu9EC?~%Lt9Ve%S8y5pE3bwD;^AHo4+X(AB~nYu6th4w~CV zU2CNwEILGcS@RQlvTWL!Epe}FoeJ<-_F^FM>16>CozQ;k<4Q_dB6eVBQ1suh2Ei4$ zVn}F#eeNY!%h1WVZbWb{IZqxqYE!Jum}-jEfD7P}F?|#lc+N@=qM?Vd)Qr}oNnfyh zwM&lJ7(W^Ej4@@!hHIw${||;Vy{f6S=fDJUzA7;oG^H{C$Tcc?70l)fUXHnNkUbN3 z*JF?Qp1I7$&g=pG*>kzZlKqx()oA1gyARz_KTfOnrtKuLBL^@$Q(BqP(CM@w?6>0> zF0GttW>svOCG32*=>A3H)|#Iq^K=!J!q{SU@0nl+p$_d&Q=bzPaEaR=ft~=>nnjqM zF>>dKMC;@uj{tzue1JM$&2WvrjeI&eyZCl3Jd|ii+r-_iQ;!_YMz(Acr35qW!#PA= zcmHt9m1GjEdQYJozguMsE-NKB6Gr2N{8Y0!_Eow)Lp=`U{?0AiRx z49C;ABBhQ2>#=Al2l;ghF+HEfhnr)pd26l-6@Z=dJhlRxDxLSx_wHa}`|F-NbK#x@ ztjIZWvb4h<`4!s4W#%heCmZ7E1pXxeIFi|teq_)*K8#Z=8z2N=^JG$D2N*%B+o_d4 zCqja1NG&Wue`YRU4`mj+TpZoEyRC;K(jxxRis-Zf4z@~9ZkIMMG5zQ^#9V_5`<294h1%SNu7eF;k;fnmDhxvlK7E9#C;Mm!zC!Kb zkjdHXo4~+T;KvP8`AS(5U=;BmCwkGtIKl!fjsa@1FxJ^)#7-5JNdzw{l0Pi9iC<=s z9yIROdd}5L?cX$7PH4Y)U?gIrf5ypMm!k=EfJ6@(q<@b&*LBshecAUF9Fs$-&A$0=JHJwY4k ziQZ!71=t7A6$N@K`Iq)&z9363$nE%hZN~i`_RPf|uCP30VW-upvX-;Zq>q|aul^?| z5s)sYak3A=u_w98u&>T-tHtX1}l2o(0=<%rW(v(bb zy!F(t+Vp`Zbd}cg2>B$3_qEB#(fla2>xrvS;WEOpU-cKw=Gk{Symu~@a6U(6yWi)$ zKx!?M2>vaBV}PHYj%%9|?%3HyfsXux`=xMu1)i=9sz|7DnBz4{?&w6*j^$C>COgFA z78N+rUH>|0U-6!Mjgc|x5#W~1T;g$~<90g$NYJ;8tOa1QM&U;(HNJ`A zYiM|)K>l7xZ^#-;?~LdLzBfY$RwI&6vZ!CVY2U&ZMi>V|gvmRD+g@_5$(9FHlwp-0?jRxx&>E%BOQ5B45=5W^nC;)R#tfu zoxLTFNx=i`j=`}MKGm9Er)^Xz zNmQ^gwaG}@D`#t6U}kG&I!(GOU}5cT7og<$tQtinjg5#NlWA~|95U>NDt?9kp>F>X z1RixR763k^fT*h%Q<3-o3$=iY6|TM&e@sPjcy{`gemo;#^BeslaAPOdLEJd@6y zltJ#IwA*_WJ4E_K(=@}E*9*|+FZJB9(cCz>JyFnNv+wie=DG{rDAh<-~iv~)%ZWlsOxPN+S-n6@?G;%ByxY(TmoQ~rO{TFU0 z5BWEpd7-2bOp5UM1b0cLH}QYOG*-GHDprewCWfy^dmPQFlNP&ag|Li9`{r@a)iCcq zZGKC>zJ4E5&k?M7+Zo0nMHcM^u>WuZQ;(Chx4pu=kz2@9h&jauuxPA=Z-zsf eO?no@f9^rUsfFSkdfjv@kV5^MNJ8C3NTxBk$+jf` literal 0 HcmV?d00001 diff --git a/Include/Nkanven/Frameworks/Extensions/AllExtensions.mqh b/Include/Nkanven/Frameworks/Extensions/AllExtensions.mqh new file mode 100644 index 0000000..d3081db --- /dev/null +++ b/Include/Nkanven/Frameworks/Extensions/AllExtensions.mqh @@ -0,0 +1,16 @@ +/* + All.mqh + + Copyright 2013-2020, Orchard Forex + https://www.orchardforex.com + + Auto Generated at 2021-07-10 17:11:59 + +*/ + +// +// Extension go here +// +#include "AllIndicators.mqh" +#include "AllSignals.mqh" +#include "AllTPSL.mqh" diff --git a/Include/Nkanven/Frameworks/Extensions/AllGridExtensions.mqh b/Include/Nkanven/Frameworks/Extensions/AllGridExtensions.mqh new file mode 100644 index 0000000..ea6f4de --- /dev/null +++ b/Include/Nkanven/Frameworks/Extensions/AllGridExtensions.mqh @@ -0,0 +1,6 @@ +// +// Extension go here +// +#include "GridSignals.mqh" +#include "GridTPSL.mqh" +#include "GlobalEnumDefinitions.mqh" \ No newline at end of file diff --git a/Include/Nkanven/Frameworks/Extensions/AllIndicators.mqh b/Include/Nkanven/Frameworks/Extensions/AllIndicators.mqh new file mode 100644 index 0000000..73ef5cb --- /dev/null +++ b/Include/Nkanven/Frameworks/Extensions/AllIndicators.mqh @@ -0,0 +1,16 @@ +/* + All.mqh + + Copyright 2013-2020, Orchard Forex + https://www.orchardforex.com + + Auto Generated at 2021-07-10 17:11:59 + +*/ + +// +// Extension go here +// +#include "Indicators/IndicatorATR.mqh" +#include "Indicators/IndicatorMA.mqh" +#include "Indicators/IndicatorTemplate.mqh" diff --git a/Include/Nkanven/Frameworks/Extensions/AllSignals.mqh b/Include/Nkanven/Frameworks/Extensions/AllSignals.mqh new file mode 100644 index 0000000..fbc665c --- /dev/null +++ b/Include/Nkanven/Frameworks/Extensions/AllSignals.mqh @@ -0,0 +1,17 @@ +/* + All.mqh + + Copyright 2013-2020, Orchard Forex + https://www.orchardforex.com + + Auto Generated at 2021-07-10 17:11:59 + +*/ + +// +// Extension go here +// +#include "Signals/SignalCombination.mqh" +#include "Signals/SignalCrossover.mqh" +#include "Signals/SignalTemplate.mqh" +#include "Signals/SignalGrid.mqh" diff --git a/Include/Nkanven/Frameworks/Extensions/AllTPSL.mqh b/Include/Nkanven/Frameworks/Extensions/AllTPSL.mqh new file mode 100644 index 0000000..15c4d3e --- /dev/null +++ b/Include/Nkanven/Frameworks/Extensions/AllTPSL.mqh @@ -0,0 +1,15 @@ +/* + All.mqh + + Copyright 2013-2020, Orchard Forex + https://www.orchardforex.com + + Auto Generated at 2021-07-10 17:11:59 + +*/ + +// +// Extension go here +// +#include "TPSL/TPSLSimple.mqh" +#include "TPSL/TPSLTemplate.mqh" diff --git a/Include/Nkanven/Frameworks/Extensions/GlobalEnumDefinitions.mqh b/Include/Nkanven/Frameworks/Extensions/GlobalEnumDefinitions.mqh new file mode 100644 index 0000000..fab455f --- /dev/null +++ b/Include/Nkanven/Frameworks/Extensions/GlobalEnumDefinitions.mqh @@ -0,0 +1,29 @@ +//+------------------------------------------------------------------+ +//| GlobalEnumDefinitions.mqh | +//| Copyright 2021, Nkondog Anselme Venceslas | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2021, Nkondog Anselme Venceslas" +#property link "https://www.mql5.com" + +enum ENUM_TRADING_SESSION + { + LONDON_SESSION=1, + NEWYORK_SESSION=2, + TOKYO_SESSION=3, + }; + +//Enumerative for the default risk size +enum ENUM_RISK_DEFAULT_SIZE + { + RISK_DEFAULT_FIXED=1, //FIXED SIZE + RISK_DEFAULT_AUTO=2, //AUTOMATIC SIZE BASED ON RISK + }; + +//Enumerative for the base used for risk calculation +enum ENUM_RISK_BASE + { + RISK_BASE_EQUITY=1, //EQUITY + RISK_BASE_BALANCE=2, //BALANCE + RISK_BASE_FREEMARGIN=3, //FREE MARGIN + }; \ No newline at end of file diff --git a/Include/Nkanven/Frameworks/Extensions/GridSignals.mqh b/Include/Nkanven/Frameworks/Extensions/GridSignals.mqh new file mode 100644 index 0000000..dac6402 --- /dev/null +++ b/Include/Nkanven/Frameworks/Extensions/GridSignals.mqh @@ -0,0 +1,5 @@ +// +// Extension go here +// + +#include "Signals/SignalGrid.mqh" \ No newline at end of file diff --git a/Include/Nkanven/Frameworks/Extensions/GridTPSL.mqh b/Include/Nkanven/Frameworks/Extensions/GridTPSL.mqh new file mode 100644 index 0000000..1682b6a --- /dev/null +++ b/Include/Nkanven/Frameworks/Extensions/GridTPSL.mqh @@ -0,0 +1,4 @@ +// +// Extension go here +// +#include "TPSL/GridTPSL.mqh" diff --git a/Include/Nkanven/Frameworks/Extensions/Indicators/IndicatorATR.mqh b/Include/Nkanven/Frameworks/Extensions/Indicators/IndicatorATR.mqh new file mode 100644 index 0000000..00822fc --- /dev/null +++ b/Include/Nkanven/Frameworks/Extensions/Indicators/IndicatorATR.mqh @@ -0,0 +1,77 @@ +/* + IndicatorATR.mqh + + Copyright 2013-2020, Orchard Forex + https://www.orchardforex.com + +*/ + +#include "../../Framework.mqh" + +class CIndicatorATR : public CIndicatorBase { + +private: + +protected: // member variables + + int mPeriods; + + +public: // constructors + + CIndicatorATR(int periods) + : CIndicatorBase() + { Init(periods); } + CIndicatorATR(string symbol, ENUM_TIMEFRAMES timeframe, + int periods) + : CIndicatorBase(symbol, timeframe) + { Init(periods); } + ~CIndicatorATR(); + + virtual int Init(int periods); + +public: + + virtual double GetData(const int buffer_num,const int index); + +}; + +CIndicatorATR::~CIndicatorATR() { + +} + +int CIndicatorATR::Init(int periods) { + + if (InitResult()!=INIT_SUCCEEDED) return(InitResult()); + + mPeriods = periods; + +#ifdef __MQL5__ + mIndicatorHandle = iATR(mSymbol, mTimeframe, mPeriods); + if (mIndicatorHandle==INVALID_HANDLE) return(InitError("Failed to create indicator handle", INIT_FAILED)); +#endif + + return(INIT_SUCCEEDED); + +} + +double CIndicatorATR::GetData(const int buffer_num,const int index) { + + double value = 0; + +#ifdef __MQL4__ + value = iATR(mSymbol, mTimeframe, mPeriods, index); +#endif + +#ifdef __MQL5__ + double bufferData[]; + ArraySetAsSeries(bufferData, true); + int cnt = CopyBuffer(mIndicatorHandle, buffer_num, index, 1, bufferData); + if (cnt>0) value = bufferData[0]; +#endif + + return(value); + +} + + diff --git a/Include/Nkanven/Frameworks/Extensions/Indicators/IndicatorMA.mqh b/Include/Nkanven/Frameworks/Extensions/Indicators/IndicatorMA.mqh new file mode 100644 index 0000000..7391f4a --- /dev/null +++ b/Include/Nkanven/Frameworks/Extensions/Indicators/IndicatorMA.mqh @@ -0,0 +1,82 @@ +/* + IndicatorMA.mqh + Updated - requires version 2.01 or later + + Copyright 2013-2020, Orchard Forex + https://www.orchardforex.com + +*/ + +#include "../../Framework.mqh" + +class CIndicatorMA : public CIndicatorBase { + +private: + +protected: // member variables + + int mPeriods; + int mShift; + ENUM_MA_METHOD mMethod; + ENUM_APPLIED_PRICE mAppliedPrice; + +public: // constructors + + CIndicatorMA(int periods, int shift, ENUM_MA_METHOD method, ENUM_APPLIED_PRICE appliedPrice) + : CIndicatorBase() + { Init(periods, shift, method, appliedPrice); } + CIndicatorMA(string symbol, ENUM_TIMEFRAMES timeframe, + int periods, int shift, ENUM_MA_METHOD method, ENUM_APPLIED_PRICE appliedPrice) + : CIndicatorBase(symbol, timeframe) + { Init(periods, shift, method, appliedPrice); } + ~CIndicatorMA(); + + virtual int Init(int periods, int shift, ENUM_MA_METHOD method, ENUM_APPLIED_PRICE appliedPrice); + +public: + + virtual double GetData(const int buffer_num,const int index); + +}; + +CIndicatorMA::~CIndicatorMA() { + +} + +int CIndicatorMA::Init(int periods, int shift, ENUM_MA_METHOD method, ENUM_APPLIED_PRICE appliedPrice) { + + if (InitResult()!=INIT_SUCCEEDED) return(InitResult()); + + mPeriods = periods; + mShift = shift; + mMethod = method; + mAppliedPrice = appliedPrice; + +#ifdef __MQL5__ + mIndicatorHandle = iMA(mSymbol, mTimeframe, mPeriods, mShift, mMethod, mAppliedPrice); + if (mIndicatorHandle==INVALID_HANDLE) return(InitError("Failed to create indicator handle", INIT_FAILED)); +#endif + + return(INIT_SUCCEEDED); + +} + +double CIndicatorMA::GetData(const int buffer_num,const int index) { + + double value = 0; +#ifdef __MQL4__ + value = iMA(mSymbol, mTimeframe, mPeriods, mShift, mMethod, mAppliedPrice, index); +#endif + +#ifdef __MQL5__ + double bufferData[]; + ArraySetAsSeries(bufferData, true); + int cnt = CopyBuffer(mIndicatorHandle, buffer_num, index, 1, bufferData); + if (cnt>0) value = bufferData[0]; +#endif + + return(value); + +} + + diff --git a/Include/Nkanven/Frameworks/Extensions/Indicators/IndicatorTemplate.mqh b/Include/Nkanven/Frameworks/Extensions/Indicators/IndicatorTemplate.mqh new file mode 100644 index 0000000..898f7e1 --- /dev/null +++ b/Include/Nkanven/Frameworks/Extensions/Indicators/IndicatorTemplate.mqh @@ -0,0 +1,91 @@ +/* + IndicatorTemplate.mqh + Updated as of framework version 2.02 + + Copyright 2013-2020, Orchard Forex + https://www.orchardforex.com + +*/ + +// Next line assumes this file is located in .../Frameworks/Extensions/someFolder +#include "../../Framework.mqh" + +class CIndicatorTemplate : public CIndicatorBase { + +private: + +protected: // member variables + +// Place any required member variables here + +public: // constructors + + // Add any required constructor arguments + // e.g. CIndicatorXYZ(int periods, double multiplier) + CIndicatorTemplate() + : CIndicatorBase() + { Init(); } + // Same constructor with symbol and timeframe added + CIndicatorTemplate(string symbol, ENUM_TIMEFRAMES timeframe) + : CIndicatorBase(symbol, timeframe) + { Init(); } + ~CIndicatorTemplate(); + + // Include all arguments to match the constructor + virtual int Init(); + +public: + + // Add this line to override the same function from the parent class + virtual double GetData(const int buffer_num,const int index); + +}; + +CIndicatorTemplate::~CIndicatorTemplate() { + + // Any destructors here + +} + +int CIndicatorTemplate::Init() { + + // Checks if init has been set to fail by any parent class already + if (InitResult()!=INIT_SUCCEEDED) return(InitResult()); + + // Assign variables and do any other initialisation here + +#ifdef __MQL5__ + // Just using iMA as an example here, replace as necessary +// mIndicatorHandle = iMA(mSymbol, mTimeframe, mPeriods, mShift, mMethod, mAppliedPrice); +// if (mIndicatorHandle==INVALID_HANDLE) return(InitError("Failed to create indicator handle", INIT_FAILED)); +#endif + + return(INIT_SUCCEEDED); + +} + +double CIndicatorTemplate::GetData(const int buffer_num,const int index) { + + double value = 0; +#ifdef __MQL4__ + // Next line is just an example using iMA + // value = iMA(mSymbol, mTimeframe, mPeriods, mShift, mMethod, mAppliedPrice, index); +#endif + +#ifdef __MQL5__ + // For MQL5 once indicator handle is set the code here should be common + // Declare a buffer to hold the data being retrieved + double bufferData[]; + // Set as series so the sequence matches the chrt + ArraySetAsSeries(bufferData, true); + // Copy indicator data into the buffer and get the count of elements + int cnt = CopyBuffer(mIndicatorHandle, buffer_num, index, 1, bufferData); + // If not enough elements came back then don't use the data + if (cnt>0) value = bufferData[0]; +#endif + + return(value); + +} + + diff --git a/Include/Nkanven/Frameworks/Extensions/Signals/SignalCombination.mqh b/Include/Nkanven/Frameworks/Extensions/Signals/SignalCombination.mqh new file mode 100644 index 0000000..ca0a7bd --- /dev/null +++ b/Include/Nkanven/Frameworks/Extensions/Signals/SignalCombination.mqh @@ -0,0 +1,86 @@ +/* + SignalCombination.mqh + For framework version 1.0 + + Copyright 2013-2020, Orchard Forex + https://www.orchardforex.com + +*/ + +#include "../../Framework.mqh" + +class CSignalCombination : public CSignalBase { + +private: + +protected: // member variables + + CSignalBase *mSignals[]; + +public: // constructors + + CSignalCombination(string symbol, ENUM_TIMEFRAMES timeframe) + : CSignalBase(symbol, timeframe) + { Init(); } + CSignalCombination() + : CSignalBase() + { Init(); } + ~CSignalCombination() { } + + int Init(); + +public: + + virtual void AddSignal(CSignalBase *signal); + virtual void UpdateSignal(); + +}; + +int CSignalCombination::Init() { + + if (InitResult()!=INIT_SUCCEEDED) return(InitResult()); + + ArrayResize(mSignals, 0); + + return(INIT_SUCCEEDED); + +} + +void CSignalCombination::UpdateSignal() { + + int index = ArraySize(mSignals); + + if (index<=0) { + + mEntrySignal = OFX_SIGNAL_NONE; + mExitSignal = OFX_SIGNAL_NONE; + + } else { + + mSignals[0].UpdateSignal(); + mEntrySignal = mSignals[0].EntrySignal(); + mExitSignal = mSignals[0].ExitSignal(); + + for (int i = 1; islow1) && !(fast2>slow2) ) { // Crossed up + mEntrySignal = OFX_SIGNAL_BUY; + mExitSignal = OFX_SIGNAL_SELL; + } else + if ( (fast10) value = bufferData[0]; +#endif + + return(value); + +} + + diff --git a/Include/Nkanven/Frameworks/Framework_1.00/Indicators/IndicatorBase.mqh b/Include/Nkanven/Frameworks/Framework_1.00/Indicators/IndicatorBase.mqh new file mode 100644 index 0000000..074800d --- /dev/null +++ b/Include/Nkanven/Frameworks/Framework_1.00/Indicators/IndicatorBase.mqh @@ -0,0 +1,44 @@ +/* + IndicatorBase.mqh + + Copyright 2013-2020, Orchard Forex + https://www.orchardforex.com + +*/ + +#include "../CommonBase.mqh" + +class CIndicatorBase : public CCommonBase { + +private: + +protected: // member variables + +public: // constructors + + CIndicatorBase() : CCommonBase() + { Init(); } + CIndicatorBase(string symbol, ENUM_TIMEFRAMES timeframe) + : CCommonBase(symbol, timeframe) + { Init(); } + ~CIndicatorBase() { } + + int Init(); + +public: + + virtual double GetData(const int index) { return(GetData(0,index)); } + virtual double GetData(const int bufferNum, const int index){ return (0); } + +}; + +int CIndicatorBase::Init() { + + if (InitResult()!=INIT_SUCCEEDED) return(InitResult()); + + return(INIT_SUCCEEDED); + +} + + + diff --git a/Include/Nkanven/Frameworks/Framework_1.00/Signals/AllSignals.mqh b/Include/Nkanven/Frameworks/Framework_1.00/Signals/AllSignals.mqh new file mode 100644 index 0000000..89bd126 --- /dev/null +++ b/Include/Nkanven/Frameworks/Framework_1.00/Signals/AllSignals.mqh @@ -0,0 +1,15 @@ +/* + AllSignals.mqh + + Copyright 2013-2020, Orchard Forex + https://www.orchardforex.com + + +*/ + +#include "SignalBase.mqh" + +// +// Other signals go here +// +#include "Crossover/SignalCrossover.mqh" diff --git a/Include/Nkanven/Frameworks/Framework_1.00/Signals/Crossover/SignalCrossover.mqh b/Include/Nkanven/Frameworks/Framework_1.00/Signals/Crossover/SignalCrossover.mqh new file mode 100644 index 0000000..f54bad7 --- /dev/null +++ b/Include/Nkanven/Frameworks/Framework_1.00/Signals/Crossover/SignalCrossover.mqh @@ -0,0 +1,78 @@ +/* + SignalCrossover.mqh + For framework version 1.0 + + Copyright 2013-2020, Orchard Forex + https://www.orchardforex.com + +*/ + +#include "../SignalBase.mqh" + +class CSignalCrossover : public CSignalBase { + +private: + +protected: // member variables + + int mIndex1; + int mIndex2; + +public: // constructors + + CSignalCrossover(string symbol, ENUM_TIMEFRAMES timeframe, + int index1=1, int index2=2) + : CSignalBase(symbol, timeframe) + { Init(index1, index2); } + CSignalCrossover(int index1=1, int index2=2) + : CSignalBase() + { Init(index1, index2); } + ~CSignalCrossover() { } + + int Init(int index1, int index2); + +public: + + virtual void UpdateSignal(); + +}; + +int CSignalCrossover::Init(int index1, int index2) { + + if (InitResult()!=INIT_SUCCEEDED) return(InitResult()); + + mIndex1 = index1; + mIndex2 = index2; + + return(INIT_SUCCEEDED); + +} + +void CSignalCrossover::UpdateSignal() { + + double fast1 = GetIndicatorData(0, mIndex1); + double fast2 = GetIndicatorData(0, mIndex2); + double slow1 = GetIndicatorData(1, mIndex1); + double slow2 = GetIndicatorData(1, mIndex2); + + // There is a less common condition where the fast + // indicator touches the slow indicator and then + // reverses. With the conditions below this would + // appear like a cross. + if ( (fast1>slow1) && !(fast2>slow2) ) { // Crossed up + mEntrySignal = OFX_SIGNAL_BUY; + mExitSignal = OFX_SIGNAL_SELL; + } else + if ( (fast10); +} + +bool CTradeCustom::Sell(const double volume,const string symbol=NULL,double price=0.0,const double sl=0.0,const double tp=0.0,const string comment="") { + if (price==0.0) price = SellPrice(symbol); + int ticket = OrderSend(symbol, ORDER_TYPE_SELL, volume, price, 0, sl, tp, comment, mMagic); + return(ticket>0); +} + +bool CTradeCustom::PositionCloseByType(const string symbol, ENUM_POSITION_TYPE positionType, const int deviation=ULONG_MAX) { + + int slippage = (deviation==ULONG_MAX) ? 0 : deviation; + + bool result = true; + int cnt = OrdersTotal(); + for (int i = cnt-1; i>=0; i--) { + if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { + if (OrderSymbol()==symbol && OrderMagicNumber()==mMagic && OrderType()==positionType) { + result &= OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), slippage); + } + } + } + + return(result); + +} diff --git a/Include/Nkanven/Frameworks/Framework_1.00/Trade/Trade_mql5.mqh b/Include/Nkanven/Frameworks/Framework_1.00/Trade/Trade_mql5.mqh new file mode 100644 index 0000000..90cfcbd --- /dev/null +++ b/Include/Nkanven/Frameworks/Framework_1.00/Trade/Trade_mql5.mqh @@ -0,0 +1,44 @@ +/* + Trade.mqh + (For MQL5) + + Copyright 2013-2020, Orchard Forex + https://www.orchardforex.com + +*/ + +#include + +class CTradeCustom : public CTrade { + +private: + +protected: // member variables + +public: // constructors + +public: + + bool PositionCloseByType(const string symbol, ENUM_POSITION_TYPE positionType,const ulong deviation=ULONG_MAX); + +}; + +bool CTradeCustom::PositionCloseByType(const string symbol, ENUM_POSITION_TYPE positionType, const ulong deviation=ULONG_MAX) { + + bool result = true; + int cnt = PositionsTotal(); + for (int i = cnt-1; i>=0; i--) { + ulong ticket = PositionGetTicket(i); + if (PositionSelectByTicket(ticket)) { + if (PositionGetString(POSITION_SYMBOL)==symbol && PositionGetInteger(POSITION_TYPE)==positionType && PositionGetInteger(POSITION_MAGIC)==m_magic) { + result &= PositionClose(ticket, deviation); + } + } else { + m_result.retcode=TRADE_RETCODE_REJECT; + result = false; + } + } + + return(result); + +} diff --git a/Include/Nkanven/Frameworks/Framework_2.04/CommonBase.mqh b/Include/Nkanven/Frameworks/Framework_2.04/CommonBase.mqh new file mode 100644 index 0000000..46edb6a --- /dev/null +++ b/Include/Nkanven/Frameworks/Framework_2.04/CommonBase.mqh @@ -0,0 +1,78 @@ +/* + CommonBase.mqh + For framework version 1.0 + + Copyright 2013-2020, Orchard Forex + https://www.orchardforex.com + +*/ + +#define _INIT_CHECK_FAIL if (mInitResult!=INIT_SUCCEEDED) return(mInitResult); +#define _INIT_ERROR(msg) return(InitError(msg, INIT_PARAMETERS_INCORRECT)); +#define _INIT_ASSERT(condition, msg) if (!condition) return(InitError(msg, INIT_FAILED)); + +class CCommonBase { + +private: + +protected: // Members + + int mDigits; + string mSymbol; + ENUM_TIMEFRAMES mTimeframe; + + string mInitMessage; + int mInitResult; + +protected: // Constructors + + // + // Constructors + // + CCommonBase() { Init(_Symbol, (ENUM_TIMEFRAMES)_Period); } + CCommonBase(string symbol) { Init(symbol, (ENUM_TIMEFRAMES)_Period); } + CCommonBase(int timeframe) { Init(_Symbol, (ENUM_TIMEFRAMES)timeframe); } + CCommonBase(ENUM_TIMEFRAMES timeframe) { Init(_Symbol, timeframe); } + CCommonBase(string symbol, int timeframe) { Init(symbol, (ENUM_TIMEFRAMES)timeframe); } + CCommonBase(string symbol, ENUM_TIMEFRAMES timeframe) { Init(symbol, timeframe); } + + // + // Destructors + // + ~CCommonBase() {}; + + int Init(string symbol, ENUM_TIMEFRAMES timeframe); + +protected: // Functions + + int InitError(string initMessage, int initResult) + { mInitMessage = initMessage; + mInitResult = initResult; + if (initMessage!="") Print(initMessage); + return(initResult); } + + double PointsToDouble(int points) { return(points*SymbolInfoDouble(mSymbol, SYMBOL_POINT)); } + +public: // Properties + + int InitResult() { return(mInitResult); } + string InitMessage() { return(mInitMessage); } + +public: // Functions + + bool TradeAllowed() { return(SymbolInfoInteger(mSymbol, SYMBOL_TRADE_MODE)!=SYMBOL_TRADE_MODE_DISABLED); } + +}; + +int CCommonBase::Init(string symbol, ENUM_TIMEFRAMES timeframe) { + + InitError("", INIT_SUCCEEDED); + + mSymbol = symbol; + mTimeframe = timeframe; + mDigits = (int)SymbolInfoInteger(symbol, SYMBOL_DIGITS); + + return(INIT_SUCCEEDED); + +} + diff --git a/Include/Nkanven/Frameworks/Framework_2.04/ExpertBase.mqh b/Include/Nkanven/Frameworks/Framework_2.04/ExpertBase.mqh new file mode 100644 index 0000000..e5afc1d --- /dev/null +++ b/Include/Nkanven/Frameworks/Framework_2.04/ExpertBase.mqh @@ -0,0 +1,380 @@ +/* + ExpertBase.mqh + + Copyright 2013-2020, Orchard Forex + https://www.orchardforex.com + +*/ + + +#include "CommonBase.mqh" +#include "SignalBase.mqh" +#include "TPSLBase.mqh" +#include "Trade/Trade.mqh" + +class CExpertBase : public CCommonBase { + +protected: + + int mMagicNumber; + string mTradeComment; + + double mVolume; + + datetime mLastBarTime; + datetime mBarTime; + + ////Changed + // Arrays to hold the signal objects + CSignalBase *mEntrySignals[]; + CSignalBase *mExitSignals[]; + ////CSignalBase *mEntrySignal; + ////CSignalBase *mExitSignal; + + double mTakeProfitValue; + double mStopLossValue; + CTPSLBase *mTakeProfitObj; + CTPSLBase *mStopLossObj; + + CTradeCustom Trade; + +private: + +protected: + + virtual bool LoopMain(bool newBar, bool firstTime); + +protected: + + int Init(int magicNumber, string tradeComment); + +public: + + // + // Constructors + // + CExpertBase() : CCommonBase() + { Init(0, ""); } + CExpertBase(string symbol, int timeframe, int magicNumber, string tradeComment) + : CCommonBase(symbol, timeframe) + { Init(magicNumber, tradeComment); } + CExpertBase(string symbol, ENUM_TIMEFRAMES timeframe, int magicNumber, string tradeComment) + : CCommonBase(symbol, timeframe) + { Init(magicNumber, tradeComment); } + CExpertBase(int magicNumber, string tradeComment) + : CCommonBase() + { Init(magicNumber, tradeComment); } + + // + // Destructors + // + ~CExpertBase(); + +public: // Default properties + + // + // Assign the default values to the expert + // + virtual void SetVolume(double volume) { mVolume = volume; } + + virtual void SetTakeProfitValue(int takeProfitPoints) + { mTakeProfitValue = PointsToDouble(takeProfitPoints); } + virtual void SetTakeProfitObj(CTPSLBase *takeProfitObj) + { mTakeProfitObj = takeProfitObj; } + + virtual void SetStopLossValue(int stopLossPoints) + { mStopLossValue = PointsToDouble(stopLossPoints); } + virtual void SetStopLossObj(CTPSLBase *stopLossObj) + { mStopLossObj = stopLossObj; } + + virtual void SetTradeComment(string comment) { mTradeComment = comment; } + virtual void SetMagic(int magicNumber) { mMagicNumber = magicNumber; + Trade.SetExpertMagicNumber(magicNumber); } + +public: // Setup + + ////Changed + virtual void AddEntrySignal(CSignalBase *signal) { AddSignal(signal, mEntrySignals); } + virtual void AddExitSignal(CSignalBase *signal) { AddSignal(signal, mExitSignals); } + virtual void AddSignal(CSignalBase *signal, CSignalBase* &signals[]); + ////virtual void AddEntrySignal(CSignalBase *signal) { mEntrySignal=signal; } + ////virtual void AddExitSignal(CSignalBase *signal) { mExitSignal=signal; } + +public: // Event handlers + + virtual int OnInit(); + virtual void OnTick(); + virtual void OnTimer() { return; } + virtual double OnTester() { return(0.0); } + virtual void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) {}; + +#ifdef __MQL5__ + virtual void OnTrade() { return; } + virtual void OnTradeTransaction(const MqlTradeTransaction& trans, + const MqlTradeRequest& request, + const MqlTradeResult& result) + { return; } + virtual int OnTesterInit() { return(INIT_SUCCEEDED); } + virtual void OnTesterPass() { return; } + virtual void OnTesterDeinit() { return; } + virtual void OnBookEvent() { return; } +#endif + +public: // Functions + + virtual void GetMarketPrices(ENUM_ORDER_TYPE orderType, MqlTradeRequest &request); + ////New + virtual ENUM_OFX_SIGNAL_DIRECTION GetCurrentSignal(CSignalBase* &signals[], + ENUM_OFX_SIGNAL_TYPE signalType); + +}; + +CExpertBase::~CExpertBase() { + +} + +int CExpertBase::OnInit() { + + int i = 0; + for (i=ArraySize(mEntrySignals)-1; i>=0; i--) { + if (mEntrySignals[i].InitResult()!=INIT_SUCCEEDED) return(mEntrySignals[i].InitResult()); + } + for (i=ArraySize(mExitSignals)-1; i>=0; i--) { + if (mExitSignals[i].InitResult()!=INIT_SUCCEEDED) return(mExitSignals[i].InitResult()); + } + if (mTakeProfitObj!=NULL) { + if (mTakeProfitObj.InitResult()!=INIT_SUCCEEDED) return(mTakeProfitObj.InitResult()); + } + if (mStopLossObj!=NULL) { + if (mStopLossObj.InitResult()!=INIT_SUCCEEDED) return(mStopLossObj.InitResult()); + } + + return(INIT_SUCCEEDED); + +} + +int CExpertBase::Init(int magicNumber, string tradeComment) { + + if (mInitResult!=INIT_SUCCEEDED) return(mInitResult); + + mTradeComment = tradeComment; + SetMagic(magicNumber); + + mTakeProfitValue = 0.0; + mStopLossValue = 0.0; + + mLastBarTime = 0; + + ////New + ArrayResize(mEntrySignals, 0); // Just make sure these are initialised + ArrayResize(mExitSignals, 0); + + return(INIT_SUCCEEDED); + +} + +void CExpertBase::OnTick(void) { + + if (!TradeAllowed()) return; + + mBarTime = iTime(mSymbol, mTimeframe, 0); + + bool firstTime = (mLastBarTime==0); + bool newBar = (mBarTime!=mLastBarTime); + + if (LoopMain(newBar, firstTime)) { + mLastBarTime = mBarTime; + } + + return; + +} + +bool CExpertBase::LoopMain(bool newBar,bool firstTime) { + + // + // To start I will only trade on a new bar + // and not on the first bar after start + // + if (!newBar) return(true); + if (firstTime) return(true); + + // + // Update the signals + // + ////Changed + ENUM_OFX_SIGNAL_DIRECTION entrySignal = GetCurrentSignal(mEntrySignals, OFX_ENTRY_SIGNAL); + ENUM_OFX_SIGNAL_DIRECTION exitSignal = GetCurrentSignal(mExitSignals, OFX_EXIT_SIGNAL); + ////if (mEntrySignal!=NULL) mEntrySignal.UpdateSignal(); + ////if (mEntrySignal!=mExitSignal) { + //// if (mExitSignal!=NULL) mExitSignal.UpdateSignal(); + ////} + + // + // Should any trades be closed + // + ////Changed + if (exitSignal==OFX_SIGNAL_BOTH) { + Trade.PositionCloseByType(mSymbol, POSITION_TYPE_BUY); + Trade.PositionCloseByType(mSymbol, POSITION_TYPE_SELL); + } else + if (exitSignal==OFX_SIGNAL_BUY) { + Trade.PositionCloseByType(mSymbol, POSITION_TYPE_BUY); + } else + if (exitSignal==OFX_SIGNAL_SELL) { + Trade.PositionCloseByType(mSymbol, POSITION_TYPE_SELL); + } + ////if (mExitSignal!=NULL) { + //// if (mExitSignal.ExitSignal()==OFX_SIGNAL_BOTH) { + //// Trade.PositionCloseByType(mSymbol, POSITION_TYPE_BUY); + //// Trade.PositionCloseByType(mSymbol, POSITION_TYPE_SELL); + //// } else + //// if (mExitSignal.ExitSignal()==OFX_SIGNAL_BUY) { + //// Trade.PositionCloseByType(mSymbol, POSITION_TYPE_BUY); + //// } else + //// if (mExitSignal.ExitSignal()==OFX_SIGNAL_SELL) { + //// Trade.PositionCloseByType(mSymbol, POSITION_TYPE_SELL); + //// } + ////} + + // + // Should a trade be opened + // + MqlTradeRequest request = {}; // Just initialising + ////Changed + if (entrySignal==OFX_SIGNAL_BOTH) { + + GetMarketPrices(ORDER_TYPE_BUY, request); + Trade.Buy(mVolume, mSymbol, request.price, request.sl, request.tp); + + GetMarketPrices(ORDER_TYPE_SELL, request); + Trade.Sell(mVolume, mSymbol, request.price, request.sl, request.tp); + + } else + if (entrySignal==OFX_SIGNAL_BUY) { + + GetMarketPrices(ORDER_TYPE_BUY, request); + Trade.Buy(mVolume, mSymbol, request.price, request.sl, request.tp); + + } else + if (entrySignal==OFX_SIGNAL_SELL) { + + GetMarketPrices(ORDER_TYPE_SELL, request); + Trade.Sell(mVolume, mSymbol, request.price, request.sl, request.tp); + + } +//// if (mEntrySignal!=NULL) { +//// if (mEntrySignal.EntrySignal()==OFX_SIGNAL_BOTH) { +//// +//// GetMarketPrices(ORDER_TYPE_BUY, request); +//// Trade.Buy(mVolume, mSymbol, request.price, request.sl, request.tp); +//// +//// GetMarketPrices(ORDER_TYPE_SELL, request); +//// Trade.Sell(mVolume, mSymbol, request.price, request.sl, request.tp); +//// +//// } else +//// if (mEntrySignal.EntrySignal()==OFX_SIGNAL_BUY) { +//// +//// GetMarketPrices(ORDER_TYPE_BUY, request); +//// Trade.Buy(mVolume, mSymbol, request.price, request.sl, request.tp); +//// +//// } else +//// if (mEntrySignal.EntrySignal()==OFX_SIGNAL_SELL) { +//// +//// GetMarketPrices(ORDER_TYPE_SELL, request); +//// Trade.Sell(mVolume, mSymbol, request.price, request.sl, request.tp); +//// +//// } +//// } + + return(true); + +} + +void CExpertBase::GetMarketPrices(ENUM_ORDER_TYPE orderType, MqlTradeRequest &request) { + + double sl = (mStopLossObj==NULL) ? mStopLossValue : mStopLossObj.GetStopLoss(); + double tp = (mTakeProfitObj==NULL) ? mTakeProfitValue : mTakeProfitObj.GetTakeProfit(); + + if (orderType==ORDER_TYPE_BUY) { + if (request.price==0.0) request.price = SymbolInfoDouble(mSymbol, SYMBOL_ASK); + request.tp = (tp==0.0) ? 0.0 : NormalizeDouble(request.price+tp, mDigits); + request.sl = (sl==0.0) ? 0.0 : NormalizeDouble(request.price-sl, mDigits); + } + + if (orderType==ORDER_TYPE_SELL) { + if (request.price==0.0) request.price = SymbolInfoDouble(mSymbol, SYMBOL_BID); + request.tp = (tp==0.0) ? 0.0 : NormalizeDouble(request.price-tp, mDigits); + request.sl = (sl==0.0) ? 0.0 : NormalizeDouble(request.price+sl, mDigits); + } + + return; + +} + +////New +void CExpertBase::AddSignal(CSignalBase *signal, CSignalBase* &signals[]) { + + int index = ArraySize(signals); + ArrayResize(signals, index+1); + signals[index] = signal; + +} + +////New +ENUM_OFX_SIGNAL_DIRECTION CExpertBase::GetCurrentSignal(CSignalBase* &signals[], + ENUM_OFX_SIGNAL_TYPE signalType) { + + ENUM_OFX_SIGNAL_DIRECTION result = OFX_SIGNAL_NONE; + ENUM_OFX_SIGNAL_DIRECTION r2 = OFX_SIGNAL_NONE; // Just working value + int index = ArraySize(signals); + + if (index<=0) { + + return(result); + + } else { + + signals[0].UpdateSignal(); + result = signals[0].GetSignal(signalType); + + // I have chosen to update all signals in case there is some + // behavour that needs it. The penalty is some performance + // If performance is an issue just add an exit inside the loop + // as the commented line + for (int i = 1; i0); +} + +bool CTradeCustom::Sell(const double volume,const string symbol=NULL,double price=0.0,const double sl=0.0,const double tp=0.0,const string comment="") { + if (price==0.0) price = SellPrice(symbol); + int ticket = OrderSend(symbol, ORDER_TYPE_SELL, volume, price, 0, sl, tp, comment, mMagic); + return(ticket>0); +} + +bool CTradeCustom::PositionCloseByType(const string symbol, ENUM_POSITION_TYPE positionType, const int deviation=ULONG_MAX) { + + int slippage = (deviation==ULONG_MAX) ? 0 : deviation; + + bool result = true; + int cnt = OrdersTotal(); + for (int i = cnt-1; i>=0; i--) { + if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { + if (OrderSymbol()==symbol && OrderMagicNumber()==mMagic && OrderType()==positionType) { + result &= OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), slippage); + } + } + } + + return(result); + +} + +////New +void CTradeCustom::PositionCountByType(const string symbol, int &count[]) { + + ArrayResize(count, 6); + ArrayInitialize(count, 0); + int cnt = OrdersTotal(); + for (int i = cnt-1; i>=0; i--) { + if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { + if (OrderSymbol()==symbol && OrderMagicNumber()==mMagic) { + count[(int)OrderType()]++; + } + } + } + + return; + +} diff --git a/Include/Nkanven/Frameworks/Framework_2.04/Trade/Trade_mql5.mqh b/Include/Nkanven/Frameworks/Framework_2.04/Trade/Trade_mql5.mqh new file mode 100644 index 0000000..3bae1c9 --- /dev/null +++ b/Include/Nkanven/Frameworks/Framework_2.04/Trade/Trade_mql5.mqh @@ -0,0 +1,66 @@ +/* + Trade.mqh + (For MQL5) + + Copyright 2013-2020, Orchard Forex + https://www.orchardforex.com + +*/ + +#include + +class CTradeCustom : public CTrade { + +private: + +protected: // member variables + +public: // constructors + +public: + + bool PositionCloseByType(const string symbol, ENUM_POSITION_TYPE positionType,const ulong deviation=ULONG_MAX); + ////New + void PositionCountByType(const string symbol, int &count[]); + +}; + +bool CTradeCustom::PositionCloseByType(const string symbol, ENUM_POSITION_TYPE positionType, const ulong deviation=ULONG_MAX) { + + bool result = true; + int cnt = PositionsTotal(); + for (int i = cnt-1; i>=0; i--) { + ulong ticket = PositionGetTicket(i); + if (PositionSelectByTicket(ticket)) { + if (PositionGetString(POSITION_SYMBOL)==symbol && PositionGetInteger(POSITION_TYPE)==positionType && PositionGetInteger(POSITION_MAGIC)==m_magic) { + result &= PositionClose(ticket, deviation); + } + } else { + m_result.retcode=TRADE_RETCODE_REJECT; + result = false; + } + } + + return(result); + +} + +////New +void CTradeCustom::PositionCountByType(const string symbol, int &count[]) { + + ArrayResize(count, 6); + ArrayInitialize(count, 0); + + int cnt = PositionsTotal(); + for (int i = cnt-1; i>=0; i--) { + ulong ticket = PositionGetTicket(i); + if (PositionSelectByTicket(ticket)) { + if (PositionGetString(POSITION_SYMBOL)==symbol && PositionGetInteger(POSITION_MAGIC)==m_magic) { + count[(int)PositionGetInteger(POSITION_TYPE)]++; + } + } + } + + return; + +} diff --git a/Include/Nkanven/Frameworks/Framework_2.04/Updates.txt b/Include/Nkanven/Frameworks/Framework_2.04/Updates.txt new file mode 100644 index 0000000..281bf10 --- /dev/null +++ b/Include/Nkanven/Frameworks/Framework_2.04/Updates.txt @@ -0,0 +1,7 @@ +Version 2.03 + +Added macros to CommonBase to standardise init checking + +Moved base classes up one level and removed unnecessary folders + +Updated framework number \ No newline at end of file diff --git a/Include/Nkanven/Frameworks/GridEA/CommonBase.mqh b/Include/Nkanven/Frameworks/GridEA/CommonBase.mqh new file mode 100644 index 0000000..6ff97cf --- /dev/null +++ b/Include/Nkanven/Frameworks/GridEA/CommonBase.mqh @@ -0,0 +1,75 @@ +/* + CommonBase.mqh + For framework version 1.0 + +*/ + +#define _INIT_CHECK_FAIL if (mInitResult!=INIT_SUCCEEDED) return(mInitResult); +#define _INIT_ERROR(msg) return(InitError(msg, INIT_PARAMETERS_INCORRECT)); +#define _INIT_ASSERT(condition, msg) if (!condition) return(InitError(msg, INIT_FAILED)); + +class CCommonBase { + +private: + +protected: // Members + + int mDigits; + string mSymbol; + ENUM_TIMEFRAMES mTimeframe; + + string mInitMessage; + int mInitResult; + +protected: // Constructors + + // + // Constructors + // + CCommonBase() { Init(_Symbol, (ENUM_TIMEFRAMES)_Period); } + CCommonBase(string symbol) { Init(symbol, (ENUM_TIMEFRAMES)_Period); } + CCommonBase(int timeframe) { Init(_Symbol, (ENUM_TIMEFRAMES)timeframe); } + CCommonBase(ENUM_TIMEFRAMES timeframe) { Init(_Symbol, timeframe); } + CCommonBase(string symbol, int timeframe) { Init(symbol, (ENUM_TIMEFRAMES)timeframe); } + CCommonBase(string symbol, ENUM_TIMEFRAMES timeframe) { Init(symbol, timeframe); } + + // + // Destructors + // + ~CCommonBase() {}; + + int Init(string symbol, ENUM_TIMEFRAMES timeframe); + +protected: // Functions + + int InitError(string initMessage, int initResult) + { mInitMessage = initMessage; + mInitResult = initResult; + if (initMessage!="") Print(initMessage); + return(initResult); } + + double PointsToDouble(int points) { return(points*SymbolInfoDouble(mSymbol, SYMBOL_POINT)); } + +public: // Properties + + int InitResult() { return(mInitResult); } + string InitMessage() { return(mInitMessage); } + +public: // Functions + + bool TradeAllowed() { return(SymbolInfoInteger(mSymbol, SYMBOL_TRADE_MODE)!=SYMBOL_TRADE_MODE_DISABLED); } + +}; + +int CCommonBase::Init(string symbol, ENUM_TIMEFRAMES timeframe) { + + InitError("", INIT_SUCCEEDED); + + mSymbol = symbol; + mTimeframe = timeframe; + mDigits = (int)SymbolInfoInteger(symbol, SYMBOL_DIGITS); + + return(INIT_SUCCEEDED); + +} + diff --git a/Include/Nkanven/Frameworks/GridEA/ExpertBase.mqh b/Include/Nkanven/Frameworks/GridEA/ExpertBase.mqh new file mode 100644 index 0000000..55c8d6a --- /dev/null +++ b/Include/Nkanven/Frameworks/GridEA/ExpertBase.mqh @@ -0,0 +1,812 @@ +/* + ExpertBase.mqh + + Copyright 2013-2020, Orchard Forex + https://www.orchardforex.com + +*/ + + +#include "CommonBase.mqh" +#include "Trade/Trade.mqh" +#include "../Extensions/AllGridExtensions.mqh" + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +class CExpertBase : public CCommonBase + { + +protected: + + int mMagicNumber; + string mTradeComment; + + double mVolume; + + int GridNumber; + int mGridGap; + int mSlippage; + double mDefaultLotSize; + double mMaxLotSize; + double mMinLotSize; + double mMaxRiskPerTrade; + + + + double lastBuyOrderPrice; + double lastSellOrderPrice; + double openedBuyPositionPrice; + double openedSellPositionPrice; + + + ENUM_TRADING_SESSION mUseTradingSession; + ENUM_RISK_DEFAULT_SIZE mRiskDefaultSize; + ENUM_RISK_BASE mRiskBase; + + enum ENUM_NAV_SIGNAL_TYPE + { + NAV_ENTRY_SIGNAL, + NAV_EXIT_SIGNAL + }; + + ENUM_NAV_SIGNAL_TYPE signalType; + + enum ENUM_NAV_SIGNAL_DIRECTION + { + NAV_SIGNAL_NONE = 0, + NAV_SIGNAL_BUY = 1, + NAV_SIGNAL_SELL = 2, + NAV_SIGNAL_BOTH = 3, + NAV_SIGNAL_ALL = 4 + }; + + ENUM_NAV_SIGNAL_DIRECTION signalDirection; + + datetime mLastBarTime; + datetime mBarTime; + + bool mResetGrid; + + ////Changed + // Arrays to hold the signal objects + CSignalGrid *mEntrySignals[]; + CSignalGrid *mExitSignals[]; + ////CSignalBase *mEntrySignal; + ////CSignalBase *mExitSignal; + + double mTakeProfitValue; + double mStopLossValue; + GridTPSL *mTakeProfitObj; + GridTPSL *mStopLossObj; + + CTradeCustom Trade; + +private: + +protected: + + virtual bool LoopMain(bool newBar, bool firstTime); + +protected: + + int Init(int magicNumber, string tradeComment); + +public: + + // + // Constructors + // + CExpertBase() : CCommonBase() + { Init(0, ""); } + CExpertBase(string symbol, int timeframe, int magicNumber, string tradeComment) + : CCommonBase(symbol, timeframe) + { Init(magicNumber, tradeComment); } + CExpertBase(string symbol, ENUM_TIMEFRAMES timeframe, int magicNumber, string tradeComment) + : CCommonBase(symbol, timeframe) + { Init(magicNumber, tradeComment); } + CExpertBase(int magicNumber, string tradeComment) + : CCommonBase() + { Init(magicNumber, tradeComment); } + + // + // Destructors + // + ~CExpertBase(); + +public: // Default properties + + // + // Assign the default values to the expert + // + virtual void SetVolume(double volume) { mVolume = volume; } + + virtual void SetTakeProfitValue(int takeProfitPoints) + { mTakeProfitValue = PointsToDouble(takeProfitPoints); } + virtual void SetTakeProfitObj(CTPSLBase *takeProfitObj) + { mTakeProfitObj = takeProfitObj; } + + virtual void SetStopLossValue(int stopLossPoints) + { mStopLossValue = PointsToDouble(stopLossPoints); } + virtual void SetStopLossObj(CTPSLBase *stopLossObj) + { mStopLossObj = stopLossObj; } + + virtual void SetTradeComment(string comment) { mTradeComment = comment; } + virtual void SetMagic(int magicNumber) + { + mMagicNumber = magicNumber; + Trade.SetExpertMagicNumber(magicNumber); + } + + virtual void SetGridNumber(int gNumber) {GridNumber = gNumber;} + virtual void SetGridGap(int gGap) {mGridGap = gGap;} + virtual void SetResetGrid() {mResetGrid = true;} + virtual void SetSlippage(int slippage) {mSlippage = slippage;} + virtual void SetDefaultLotSize(double defaultLotSize) {mDefaultLotSize = defaultLotSize;} + virtual void SetMaxLotSize(double maxLotSize) {mMaxLotSize = maxLotSize;} + virtual void SetMinLotSize(double minLotSize) {mMinLotSize = minLotSize;} + virtual void SetMaxRiskPerTrade(double maxRiskPerTrade) {mMaxRiskPerTrade = maxRiskPerTrade;} + + + virtual void SetUseTradingSession(ENUM_TRADING_SESSION useTradingSession) {mUseTradingSession = useTradingSession;} + virtual void SetRiskDefaultSize(ENUM_RISK_DEFAULT_SIZE riskDefaultSize) { mRiskDefaultSize = riskDefaultSize;} + virtual void SetRiskBase(ENUM_RISK_BASE riskBase) {mRiskBase=riskBase;} + +public: // Setup + + ////Changed + virtual void AddEntrySignal(CSignalGrid *signal) { AddSignal(signal, mEntrySignals); } + virtual void AddExitSignal(CSignalGrid *signal) { AddSignal(signal, mExitSignals); } + virtual void AddSignal(CSignalGrid *signal, CSignalGrid* &signals[]); + virtual void LotSize(double SL); + virtual void TradeWatcher(); + virtual bool IsTradingTime(); + virtual bool CheckTradingSession(); + + virtual double getLastBuyOrderPrice() {return lastBuyOrderPrice;} + virtual double getLastSellOrderPrice() {return lastSellOrderPrice;} + virtual double getOpenedBuyPositionPrice() {return openedBuyPositionPrice;} + virtual double getOpenedSellPositionPrice() {return openedSellPositionPrice;} + + ////virtual void AddEntrySignal(CSignalBase *signal) { mEntrySignal=signal; } + ////virtual void AddExitSignal(CSignalBase *signal) { mExitSignal=signal; } + +public: // Event handlers + + virtual int OnInit(); + virtual void OnTick(); + virtual void OnTimer() { return; } + virtual double OnTester() { return(0.0); } + virtual void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) {}; + +#ifdef __MQL5__ + virtual void OnTrade() { return; } + virtual void OnTradeTransaction(const MqlTradeTransaction& trans, + const MqlTradeRequest& request, + const MqlTradeResult& result) + { return; } + virtual int OnTesterInit() { return(INIT_SUCCEEDED); } + virtual void OnTesterPass() { return; } + virtual void OnTesterDeinit() { return; } + virtual void OnBookEvent() { return; } +#endif + +public: // Functions + + virtual void GetMarketPrices(ENUM_ORDER_TYPE orderType, MqlTradeRequest &request); + ////New + virtual ENUM_OFX_SIGNAL_DIRECTION GetCurrentSignal(CSignalGrid* &signals[], + ENUM_OFX_SIGNAL_TYPE signalType); + + }; + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +CExpertBase::~CExpertBase() + { + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int CExpertBase::OnInit() + { + + int i = 0; + for(i=ArraySize(mEntrySignals)-1; i>=0; i--) + { + if(mEntrySignals[i].InitResult()!=INIT_SUCCEEDED) + return(mEntrySignals[i].InitResult()); + } + for(i=ArraySize(mExitSignals)-1; i>=0; i--) + { + if(mExitSignals[i].InitResult()!=INIT_SUCCEEDED) + return(mExitSignals[i].InitResult()); + } + if(mTakeProfitObj!=NULL) + { + if(mTakeProfitObj.InitResult()!=INIT_SUCCEEDED) + return(mTakeProfitObj.InitResult()); + } + if(mStopLossObj!=NULL) + { + if(mStopLossObj.InitResult()!=INIT_SUCCEEDED) + return(mStopLossObj.InitResult()); + } + + return(INIT_SUCCEEDED); + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int CExpertBase::Init(int magicNumber, string tradeComment) + { + + if(mInitResult!=INIT_SUCCEEDED) + return(mInitResult); + + mTradeComment = tradeComment; + SetMagic(magicNumber); + + mTakeProfitValue = 0.0; + mStopLossValue = 0.0; + + mLastBarTime = 0; + +////New + ArrayResize(mEntrySignals, 0); // Just make sure these are initialised + ArrayResize(mExitSignals, 0); + + return(INIT_SUCCEEDED); + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void CExpertBase::OnTick(void) + { + + if(!TradeAllowed()) + return; + + mBarTime = iTime(mSymbol, mTimeframe, 0); + + bool firstTime = (mLastBarTime==0); + bool newBar = (mBarTime!=mLastBarTime); + + TradeWatcher(); +Print("signalDirection after TradeWatcher ", signalDirection); + if(LoopMain(newBar, firstTime)) + { + mLastBarTime = mBarTime; + } + + return; + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool CExpertBase::LoopMain(bool newBar,bool firstTime) + { + +// +// To start I will only trade on a new bar +// and not on the first bar after start +// + /*if(!newBar) + return(true); + if(firstTime) + return(true);*/ + +// +// Update the signals +// +////Changed + ENUM_OFX_SIGNAL_DIRECTION entrySignal = GetCurrentSignal(mEntrySignals, OFX_ENTRY_SIGNAL); + ENUM_OFX_SIGNAL_DIRECTION exitSignal = GetCurrentSignal(mExitSignals, OFX_EXIT_SIGNAL); + /*if(mEntrySignals[0]!=NULL) + mEntrySignals[0].UpdateSignal(); + if(mEntrySignals[0]!=mExitSignals[0]) + { + if(mEntrySignals[0]!=NULL) + mEntrySignals[0].UpdateSignal(); + }*/ + +// +// Should any trades be closed +// +////Changed +/* + if(exitSignal==OFX_SIGNAL_BOTH) + { + Trade.PositionCloseByType(mSymbol, POSITION_TYPE_BUY); + Trade.PositionCloseByType(mSymbol, POSITION_TYPE_SELL); + } + else + if(exitSignal==OFX_SIGNAL_BUY) + { + Trade.PositionCloseByType(mSymbol, POSITION_TYPE_BUY); + } + else + if(exitSignal==OFX_SIGNAL_SELL) + { + Trade.PositionCloseByType(mSymbol, POSITION_TYPE_SELL); + } + if(exitSignal==OFX_SIGNAL_ALL) + { + Trade.PositionCloseAll(); + + Trade.OrderCloseAll(); + } +*/ +////if (mExitSignal!=NULL) { +//// if (mExitSignal.ExitSignal()==OFX_SIGNAL_BOTH) { +//// Trade.PositionCloseByType(mSymbol, POSITION_TYPE_BUY); +//// Trade.PositionCloseByType(mSymbol, POSITION_TYPE_SELL); +//// } else +//// if (mExitSignal.ExitSignal()==OFX_SIGNAL_BUY) { +//// Trade.PositionCloseByType(mSymbol, POSITION_TYPE_BUY); +//// } else +//// if (mExitSignal.ExitSignal()==OFX_SIGNAL_SELL) { +//// Trade.PositionCloseByType(mSymbol, POSITION_TYPE_SELL); +//// } +////} + +// +// Should a trade be opened +// + MqlTradeRequest request = {}; // Just initialising + + double buyPrice, sellPrice, SLPoints=0; + int GripPips = mGridGap; + double TakeProfitPoint = GripPips*_Point; + LotSize(GripPips); +////Changed + + Print("Entry signal for Both ", NAV_SIGNAL_BOTH, " Entry for OFX_SIGNAL_BUY ", NAV_SIGNAL_BUY, " Actual ", signalDirection); + Print("signalDirection ", signalDirection); + if(signalDirection==NAV_SIGNAL_BOTH) + { + double AskPrice = SymbolInfoDouble(Symbol(),SYMBOL_ASK); + double BidPrice = SymbolInfoDouble(Symbol(),SYMBOL_BID); + + Print("m Grid pip ", GripPips, " Point ", _Point, " TP point ", TakeProfitPoint); + buyPrice = AskPrice + TakeProfitPoint; + sellPrice = BidPrice - TakeProfitPoint; + + Print("m Grid pip ", GripPips, " Point ", _Point); + + Print(" Buy price ", buyPrice, " TP normalized ", NormalizeDouble(buyPrice + TakeProfitPoint, mDigits)); + //SLPoints=MathCeil(buyPrice-GripPips); + + //GetMarketPrices(ORDER_TYPE_SELL, request); + //Trade.Sell(mVolume, mSymbol, request.price, request.sl, request.tp); + GetMarketPrices(ORDER_TYPE_BUY, request); + request.tp = NormalizeDouble(request.price + TakeProfitPoint, mDigits); + Trade.Buy(mVolume, mSymbol, request.price, request.sl); + + GetMarketPrices(ORDER_TYPE_SELL_STOP, request); + request.price = sellPrice; + request.tp = NormalizeDouble(sellPrice - TakeProfitPoint, mDigits); + Trade.SellStop(mVolume, request.price, mSymbol, request.sl); + + } + else + if(signalDirection==NAV_SIGNAL_BUY) + { + //If there's a pending order, get the last order's price else get the position price + Print("Trying to open a buy"); + buyPrice = getLastBuyOrderPrice()?getLastBuyOrderPrice():getOpenedBuyPositionPrice(); + request.price = buyPrice+TakeProfitPoint; + request.sl = 0.0; + request.tp = NormalizeDouble(buyPrice + TakeProfitPoint, mDigits); + GetMarketPrices(ORDER_TYPE_BUY_STOP, request); + Trade.BuyStop(mVolume, request.price, mSymbol, request.sl); + + } + else + if(signalDirection==NAV_SIGNAL_SELL) + { + Print("Trying to open a sell"); + sellPrice = getLastSellOrderPrice()?getLastSellOrderPrice():getOpenedSellPositionPrice(); + request.price = sellPrice-TakeProfitPoint; + request.sl = 0.0; + request.tp = NormalizeDouble(sellPrice - TakeProfitPoint, mDigits); + GetMarketPrices(ORDER_TYPE_SELL_STOP, request); + Trade.SellStop(mVolume, request.price, mSymbol, request.sl); + + } + if(signalDirection==NAV_SIGNAL_ALL) + { + Trade.OrderCloseAll(); + Trade.PositionCloseAll(); + } +//// if (mEntrySignal!=NULL) { +//// if (mEntrySignal.EntrySignal()==OFX_SIGNAL_BOTH) { +//// +//// GetMarketPrices(ORDER_TYPE_BUY, request); +//// Trade.Buy(mVolume, mSymbol, request.price, request.sl, request.tp); +//// +//// GetMarketPrices(ORDER_TYPE_SELL, request); +//// Trade.Sell(mVolume, mSymbol, request.price, request.sl, request.tp); +//// +//// } else +//// if (mEntrySignal.EntrySignal()==OFX_SIGNAL_BUY) { +//// +//// GetMarketPrices(ORDER_TYPE_BUY, request); +//// Trade.Buy(mVolume, mSymbol, request.price, request.sl, request.tp); +//// +//// } else +//// if (mEntrySignal.EntrySignal()==OFX_SIGNAL_SELL) { +//// +//// GetMarketPrices(ORDER_TYPE_SELL, request); +//// Trade.Sell(mVolume, mSymbol, request.price, request.sl, request.tp); +//// +//// } +//// } + +//mEntrySignals[0].SetSignal(OFX_ENTRY_SIGNAL, OFX_SIGNAL_NONE); +//mEntrySignals[0].SetSignal(OFX_EXIT_SIGNAL, OFX_SIGNAL_NONE); + + return(true); + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void CExpertBase::GetMarketPrices(ENUM_ORDER_TYPE orderType, MqlTradeRequest &request) + { + + double sl = (mStopLossObj==NULL) ? mStopLossValue : mStopLossObj.GetStopLoss(); + double tp = (mTakeProfitObj==NULL) ? mTakeProfitValue : mTakeProfitObj.GetTakeProfit(); + Trade.SetExpertMagicNumber(mMagicNumber); + if(orderType==ORDER_TYPE_BUY) + { + if(request.price==0.0) + request.price = SymbolInfoDouble(mSymbol, SYMBOL_ASK); + request.tp = (tp==0.0) ? 0.0 : NormalizeDouble(request.price+tp, mDigits); + request.sl = (sl==0.0) ? 0.0 : NormalizeDouble(request.price-sl, mDigits); + } + + if(orderType==ORDER_TYPE_SELL) + { + if(request.price==0.0) + request.price = SymbolInfoDouble(mSymbol, SYMBOL_BID); + request.tp = (tp==0.0) ? 0.0 : NormalizeDouble(request.price-tp, mDigits); + request.sl = (sl==0.0) ? 0.0 : NormalizeDouble(request.price+sl, mDigits); + } + + return; + + } + +////New +void CExpertBase::AddSignal(CSignalGrid *signal, CSignalGrid* &signals[]) + { + + int index = ArraySize(signals); + ArrayResize(signals, index+1); + signals[index] = signal; + + } + +////New +ENUM_OFX_SIGNAL_DIRECTION CExpertBase::GetCurrentSignal(CSignalGrid* &signals[], + ENUM_OFX_SIGNAL_TYPE signalType) + { + + ENUM_OFX_SIGNAL_DIRECTION result = OFX_SIGNAL_NONE; + ENUM_OFX_SIGNAL_DIRECTION r2 = OFX_SIGNAL_NONE; // Just working value + int index = ArraySize(signals); + + if(index<=0) + { + + return(result); + + } + else + { + + signals[0].UpdateSignal(); + result = signals[0].GetSignal(signalType); + + // I have chosen to update all signals in case there is some + // behavour that needs it. The penalty is some performance + // If performance is an issue just add an exit inside the loop + // as the commented line + for(int i = 1; i= result[0]) + { + londonSession + } + return; + }*/ + return true; + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool CExpertBase::IsTradingTime(void) + { + bool result = false; + + if(mUseTradingSession) + result = true; + + return result; + } +//+------------------------------------------------------------------+ + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void CExpertBase::LotSize(double SL=0) + { + +//Lot Size Calculator + +//If the position size is dynamic + if(mRiskDefaultSize==RISK_DEFAULT_AUTO) + { + //If the stop loss is not zero then calculate the lot size + Print("Stop loss ", SL); + if(SL!=0) + { + double RiskBaseAmount=0; + //TickValue is the value of the individual price increment for 1 lot of the instrument, expressed in the account currenty + double TickValue=SymbolInfoDouble(mSymbol,SYMBOL_TRADE_TICK_VALUE); + Print("Tick value ", TickValue); + //Define the base for the risk calculation depending on the parameter chosen + if(mRiskBase==RISK_BASE_BALANCE) + RiskBaseAmount=AccountInfoDouble(ACCOUNT_BALANCE); + if(mRiskBase==RISK_BASE_EQUITY) + RiskBaseAmount=AccountInfoDouble(ACCOUNT_EQUITY); + if(mRiskBase==RISK_BASE_FREEMARGIN) + RiskBaseAmount=AccountInfoDouble(ACCOUNT_FREEMARGIN); + + //Calculate the Position Size + mVolume=((RiskBaseAmount*mMaxRiskPerTrade/100)/(SL*TickValue)); + Print("Volume ", mVolume); + } + //If the stop loss is zero then the lot size is the default one + if(SL==0) + { + mVolume=mDefaultLotSize; + } + } +//Normalize the Lot Size to satisfy the allowed lot increment and minimum and maximum position size + mVolume=MathFloor(mVolume/SymbolInfoDouble(mSymbol,SYMBOL_VOLUME_STEP))*SymbolInfoDouble(mSymbol,SYMBOL_VOLUME_STEP); + +//Limit the lot size in case it is greater than the maximum allowed by the user + if(mVolume>mMaxLotSize) + mVolume=mMaxLotSize; +//Limit the lot size in case it is greater than the maximum allowed by the broker + if(mVolume>SymbolInfoDouble(mSymbol,SYMBOL_VOLUME_MAX)) + mVolume=SymbolInfoDouble(mSymbol,SYMBOL_VOLUME_MAX); + Print("Lot ", mVolume, " Max lot ", SymbolInfoDouble(mSymbol,SYMBOL_VOLUME_MAX)); +//If the lot size is too small then set it to 0 and don't trade + if(mVolume 0) + { + //Count the opened positions by type + int cntP = PositionsTotal(); + for(int i = cntP-1; i>=0; i--) + { + ticket = PositionGetTicket(i); + if(PositionSelectByTicket(ticket)) + { + if(PositionGetString(POSITION_SYMBOL)==mSymbol && PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY + && PositionGetInteger(POSITION_MAGIC)==mMagicNumber) + { + openedBuyPositionPrice = PositionGetDouble(POSITION_PRICE_OPEN); + pCountBuy += 1; + } + + Print("POSITION_SYMBOL ", PositionGetString(POSITION_SYMBOL), " = ", mSymbol, " POSITION_TYPE ",PositionGetInteger(POSITION_TYPE), " = ", POSITION_TYPE_SELL, " Magic ", PositionGetInteger(POSITION_MAGIC), " = ",mMagicNumber); + if(PositionGetString(POSITION_SYMBOL)==mSymbol && PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL + && PositionGetInteger(POSITION_MAGIC)==mMagicNumber) + { + openedSellPositionPrice = PositionGetDouble(POSITION_PRICE_OPEN); + pCountSell += 1; + } + } + else + { + Print(GetLastError()); + } + } + } +//Count the orders by type + + int cntO = OrdersTotal(); + Print("Total pending orders ", cntO); + for(int i = cntO-1; i>=0; i--) + { + ticket = OrderGetTicket(i); + if(OrderSelect(ticket)) + { + if(OrderGetString(ORDER_SYMBOL)==mSymbol && OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_BUY_STOP + && OrderGetInteger(ORDER_MAGIC)==mMagicNumber) + { + oCountBuy += 1; + lastBuyOrderPrice = OrderGetDouble(ORDER_PRICE_OPEN); + } + + Print("ORDER_SYMBOL ", OrderGetString(ORDER_SYMBOL), " Real symbol ", mSymbol, " ORDER_TYPE ", OrderGetInteger(ORDER_TYPE), " Real type ", ORDER_TYPE_SELL_STOP, " Magic ", OrderGetInteger(ORDER_MAGIC), " Real magic ", mMagicNumber); + if(OrderGetString(ORDER_SYMBOL)==mSymbol && OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_SELL_STOP + && OrderGetInteger(ORDER_MAGIC)==mMagicNumber) + { + oCountSell += 1; + lastSellOrderPrice = OrderGetDouble(ORDER_PRICE_OPEN); + } + } + else + { + Print(GetLastError()); + } + } + Print("openedBuyPositionPrice ", openedBuyPositionPrice, " openedSellPositionPrice ", openedSellPositionPrice); + + Print("lastBuyOrderPrice ", lastBuyOrderPrice, " lastSellOrderPrice ", lastSellOrderPrice); + + double floatingProfitPercent = ((AccountInfoDouble(ACCOUNT_EQUITY) - AccountInfoDouble(ACCOUNT_BALANCE))*100)/AccountInfoDouble(ACCOUNT_BALANCE); +// Check if profit is at least the mMaxRiskPerTrade + + Print(" MaxRiskPerTrade ",mMaxRiskPerTrade, " Floating profit percent ", floatingProfitPercent, " Account equity ", AccountInfoDouble(ACCOUNT_EQUITY), " Account balance ", AccountInfoDouble(ACCOUNT_BALANCE)); + +//The number of buy pending order should be twice the opened sell positions; and vice versa + realOCountBuy = pCountSell+1; + realOCountSell = pCountBuy*2; + totalBuy = pCountBuy+oCountBuy; + totalSell = pCountSell+oCountSell; + realTotalBuy = pCountSell+1; + realTotalSell = pCountBuy+1; + + Print("Sell order (", oCountSell, ") Real (", realOCountSell, ")"); + Print("Buy order (", oCountBuy, ") Real (", realOCountBuy, ")", " Opened sell ", pCountSell); + + + Print("oCountSell ", oCountSell, " < ", " realOCountSell ", realOCountSell, " && ", " pCountBuy ", pCountBuy," > 0"); + + if(OrdersTotal() == 0 && PositionsTotal() == 0) + { + signalDirection = NAV_SIGNAL_BOTH; + } + else + { + //If there's only one pending order left, close it. + if(OrdersTotal() >= 1 && PositionsTotal() == 0) + { + signalDirection = NAV_SIGNAL_ALL; + Print("Exit if no opened position"); + } + else + { + //When there are multiple positions, check is the account is making enough profit + if(floatingProfitPercent > mMaxRiskPerTrade) + { + signalDirection = NAV_SIGNAL_ALL; + Print("Exit on profit target"); + } + else + { + Print("realTotalSell ", realTotalSell, " <= ", " totalSell ", totalSell ," && ", " pCountBuy ",pCountBuy ," > 0"); + if(realTotalSell > totalSell && pCountBuy > 0) + { + signalType = NAV_ENTRY_SIGNAL; + signalDirection = NAV_SIGNAL_SELL; + Print("Sell order (", oCountSell, ") is less than it should be (", realOCountSell, ")"); + } + else + { + if(realTotalBuy > totalBuy && pCountSell > 0) + { + signalType = NAV_ENTRY_SIGNAL; + signalDirection = NAV_SIGNAL_BUY; + //mEntrySignals[0].SetSignal(OFX_ENTRY_SIGNAL, OFX_SIGNAL_BUY); + Print("Buy order (", oCountBuy, ") is less than it should be (", realOCountBuy, ")"); + } + } + } + } + } + } +//+------------------------------------------------------------------+ diff --git a/Include/Nkanven/Frameworks/GridEA/Framework.mqh b/Include/Nkanven/Frameworks/GridEA/Framework.mqh new file mode 100644 index 0000000..9700329 --- /dev/null +++ b/Include/Nkanven/Frameworks/GridEA/Framework.mqh @@ -0,0 +1,35 @@ +/* + Framework_2.03.mqh + + Copyright 2013-2020, Orchard Forex + https://www.orchardforex.com + + +*/ + +// History +// 1.00 - First version, not well version controlled +// 2.00 - Changed framework structure, functionally same as 1.00 +// 2.01 - Added TP and SL +// 2.02 - Move compound signals into expertbase +// Templates now use common files between mq4 and mq5 +// MakeMQH batch script also recreates framework.mqh +// 2.03 - Added macros to CommonBase to standardise init checking +// Moved base classes up one level and removed unnecessary folders + +#ifndef _FRAMEWORK_VERSION_ + + #define _FRAMEWORK_VERSION_ "2.03" + + #include "CommonBase.mqh" + + #include "Trade/Trade.mqh" + + #include "SignalBase.mqh" + #include "TPSLBase.mqh" + + #include "ExpertBase.mqh" + + #include "../Extensions/AllGridExtensions.mqh" + +#endif diff --git a/Include/Nkanven/Frameworks/GridEA/IndicatorBase.mqh b/Include/Nkanven/Frameworks/GridEA/IndicatorBase.mqh new file mode 100644 index 0000000..b064a1c --- /dev/null +++ b/Include/Nkanven/Frameworks/GridEA/IndicatorBase.mqh @@ -0,0 +1,59 @@ +/* + IndicatorBase.mqh + + Copyright 2013-2020, Orchard Forex + https://www.orchardforex.com + +*/ + +#include "CommonBase.mqh" + +class CIndicatorBase : public CCommonBase { + +private: + +protected: // member variables + + // Only used for MQL5 + int mIndicatorHandle; + +public: // constructors + + CIndicatorBase() : CCommonBase() + { Init(); } + CIndicatorBase(string symbol, ENUM_TIMEFRAMES timeframe) + : CCommonBase(symbol, timeframe) + { Init(); } + ~CIndicatorBase(); + + int Init(); + +public: + + virtual double GetData(const int index) { return(GetData(0,index)); } + virtual double GetData(const int bufferNum, const int index){ return (0); } + +}; + +CIndicatorBase::~CIndicatorBase() { + +#ifdef __MQL5__ + + if (mIndicatorHandle!=INVALID_HANDLE) IndicatorRelease(mIndicatorHandle); + +#endif + +} + +int CIndicatorBase::Init() { + + if (InitResult()!=INIT_SUCCEEDED) return(InitResult()); + + mIndicatorHandle = INVALID_HANDLE; + + return(INIT_SUCCEEDED); + +} + + + diff --git a/Include/Nkanven/Frameworks/GridEA/SignalBase.mqh b/Include/Nkanven/Frameworks/GridEA/SignalBase.mqh new file mode 100644 index 0000000..1e35527 --- /dev/null +++ b/Include/Nkanven/Frameworks/GridEA/SignalBase.mqh @@ -0,0 +1,95 @@ +/* + SignalBase.mqh + + Copyright 2013-2020, Orchard Forex + https://www.orchardforex.com + +*/ + +#include "CommonBase.mqh" +//#include "IndicatorBase.mqh" + +//// New +//// This is to maintain compatibility and allow sub classes to still +//// use mEntrySignal= or mExitSignal= +//// mEntrySignal and mExitSignal are effectively deprecated now +#define mEntrySignal mSignalValues[OFX_ENTRY_SIGNAL] // Deprecated +#define mExitSignal mSignalValues[OFX_EXIT_SIGNAL] // Deprecated + + +//// New +enum ENUM_OFX_SIGNAL_TYPE + { + OFX_ENTRY_SIGNAL, + OFX_EXIT_SIGNAL + }; + +enum ENUM_OFX_SIGNAL_DIRECTION + { + OFX_SIGNAL_NONE = 0, + OFX_SIGNAL_BUY = 1, + OFX_SIGNAL_SELL = 2, + OFX_SIGNAL_BOTH = 3, + OFX_SIGNAL_ALL = 4 + }; + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +class CSignalBase : public CCommonBase + { + +private: + +protected: // member variables + + //// Replaced + ENUM_OFX_SIGNAL_DIRECTION mSignalValues[2]; + double mMaxRiskPerTrade; + ////ENUM_OFX_SIGNAL_DIRECTION mEntrySignal; + ////ENUM_OFX_SIGNAL_DIRECTION mExitSignal; + +public: // constructors + + CSignalBase() : CCommonBase() + { Init(); } + CSignalBase(string symbol, ENUM_TIMEFRAMES timeframe) : CCommonBase(symbol, timeframe) + { Init(); } + ~CSignalBase() { } + + int Init(); + +public: + + virtual void UpdateSignal() { return; } + //// Changed - maintain backward compatibility + virtual ENUM_OFX_SIGNAL_DIRECTION EntrySignal() { return(mSignalValues[OFX_ENTRY_SIGNAL]); } + virtual ENUM_OFX_SIGNAL_DIRECTION ExitSignal() { return(mSignalValues[OFX_EXIT_SIGNAL]); } + //// New, and shows my lack of planning + virtual void SetSignal(ENUM_OFX_SIGNAL_TYPE type, + ENUM_OFX_SIGNAL_DIRECTION value) + { mSignalValues[type] = value; } + virtual void SetMaxRiskPerTrade(double maxRiskPerTrade) { mMaxRiskPerTrade = maxRiskPerTrade;} + + virtual ENUM_OFX_SIGNAL_DIRECTION GetSignal(ENUM_OFX_SIGNAL_TYPE type) + { return(mSignalValues[type]); } + + }; + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int CSignalBase::Init() + { + + if(InitResult()!=INIT_SUCCEEDED) + return(InitResult()); + +//// Replaced + ArrayInitialize(mSignalValues, OFX_SIGNAL_NONE); +////mEntrySignal = OFX_SIGNAL_NONE; +////mExitSignal = OFX_SIGNAL_NONE; + + return(INIT_SUCCEEDED); + + } diff --git a/Include/Nkanven/Frameworks/GridEA/TPSLBase.mqh b/Include/Nkanven/Frameworks/GridEA/TPSLBase.mqh new file mode 100644 index 0000000..8f81776 --- /dev/null +++ b/Include/Nkanven/Frameworks/GridEA/TPSLBase.mqh @@ -0,0 +1,39 @@ +/* + TPSLBase.mqh + + Copyright 2013-2020, Orchard Forex + https://www.orchardforex.com + +*/ + +#include "Signalbase.mqh" + +class CTPSLBase : public CSignalBase { + +private: + +public: // constructors + + CTPSLBase() : CSignalBase() { Init(); } + CTPSLBase(string symbol, ENUM_TIMEFRAMES timeframe) : CSignalBase(symbol, timeframe) { Init(); } + ~CTPSLBase() { } + + int Init(); + +public: + + virtual double GetTakeProfit() { return(0.0); } + virtual double GetStopLoss() { return(0.0); } + +}; + +int CTPSLBase::Init() { + + if (InitResult()!=INIT_SUCCEEDED) return(InitResult()); + + return(INIT_SUCCEEDED); + +} + + + diff --git a/Include/Nkanven/Frameworks/GridEA/Trade/Trade.mqh b/Include/Nkanven/Frameworks/GridEA/Trade/Trade.mqh new file mode 100644 index 0000000..6323929 --- /dev/null +++ b/Include/Nkanven/Frameworks/GridEA/Trade/Trade.mqh @@ -0,0 +1,16 @@ +/* + Trade.mqh + + Copyright 2013-2020, Orchard Forex + https://www.orchardforex.com + +*/ + + +#ifdef __MQL4__ + #include "Trade_mql4.mqh" +#endif +#ifdef __MQL5__ + #include "Trade_mql5.mqh" +#endif + diff --git a/Include/Nkanven/Frameworks/GridEA/Trade/Trade_mql4.mqh b/Include/Nkanven/Frameworks/GridEA/Trade/Trade_mql4.mqh new file mode 100644 index 0000000..c7c9bb8 --- /dev/null +++ b/Include/Nkanven/Frameworks/GridEA/Trade/Trade_mql4.mqh @@ -0,0 +1,123 @@ +/* + Trade.mqh + (For MQL4) + + Copyright 2013-2020, Orchard Forex + https://www.orchardforex.com + +*/ + +#include "..\CommonBase.mqh" + +struct MqlTradeRequest { + int action; // Trade operation type (as int here) + ulong magic; // Expert Advisor ID (magic number) + ulong order; // Order ticket + string symbol; // Trade symbol + double volume; // Requested volume for a deal in lots + double price; // Price + double stoplimit; // StopLimit level of the order + double sl; // Stop Loss level of the order + double tp; // Take Profit level of the order + ulong deviation; // Maximal possible deviation from the requested price + ENUM_ORDER_TYPE type; // Order type + int type_filling; // Order execution type (int here) + int type_time; // Order expiration type (int here) + datetime expiration; // Order expiration time (for the orders of ORDER_TIME_SPECIFIED type) + string comment; // Order comment + ulong position; // Position ticket + ulong position_by; // The ticket of an opposite position +}; + +enum ENUM_POSITION_TYPE { + POSITION_TYPE_BUY = ORDER_TYPE_BUY, + POSITION_TYPE_SELL = ORDER_TYPE_SELL +}; + +class CTradeCustom : public CCommonBase { + +private: + +protected: // member variables + + int mMagic; // expert magic number + +public: // constructors + + CTradeCustom(); + ~CTradeCustom(); + +public: + + ulong RequestMagic() { return(mMagic); } + void SetExpertMagicNumber(const int magic) { mMagic=magic; } + + double BuyPrice(string symbol) { return(SymbolInfoDouble(symbol, SYMBOL_ASK)); } + double SellPrice(string symbol) { return(SymbolInfoDouble(symbol, SYMBOL_BID)); } + + bool Buy(const double volume,const string symbol=NULL,double price=0.0,const double sl=0.0,const double tp=0.0,const string comment=""); + bool Sell(const double volume,const string symbol=NULL,double price=0.0,const double sl=0.0,const double tp=0.0,const string comment=""); + + bool PositionCloseByType(const string symbol, ENUM_POSITION_TYPE positionType,const int deviation=ULONG_MAX); + ////New + void PositionCountByType(const string symbol, int &count[]); + +}; + +CTradeCustom::CTradeCustom() { + + mMagic = 0; + +} + +CTradeCustom::~CTradeCustom() { + +} + +bool CTradeCustom::Buy(const double volume,const string symbol=NULL,double price=0.0,const double sl=0.0,const double tp=0.0,const string comment="") { + if (price==0.0) price = BuyPrice(symbol); + int ticket = OrderSend(symbol, ORDER_TYPE_BUY, volume, price, 0, sl, tp, comment, mMagic); + return(ticket>0); +} + +bool CTradeCustom::Sell(const double volume,const string symbol=NULL,double price=0.0,const double sl=0.0,const double tp=0.0,const string comment="") { + if (price==0.0) price = SellPrice(symbol); + int ticket = OrderSend(symbol, ORDER_TYPE_SELL, volume, price, 0, sl, tp, comment, mMagic); + return(ticket>0); +} + +bool CTradeCustom::PositionCloseByType(const string symbol, ENUM_POSITION_TYPE positionType, const int deviation=ULONG_MAX) { + + int slippage = (deviation==ULONG_MAX) ? 0 : deviation; + + bool result = true; + int cnt = OrdersTotal(); + for (int i = cnt-1; i>=0; i--) { + if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { + if (OrderSymbol()==symbol && OrderMagicNumber()==mMagic && OrderType()==positionType) { + result &= OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), slippage); + } + } + } + + return(result); + +} + +////New +void CTradeCustom::PositionCountByType(const string symbol, int &count[]) { + + ArrayResize(count, 6); + ArrayInitialize(count, 0); + int cnt = OrdersTotal(); + for (int i = cnt-1; i>=0; i--) { + if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { + if (OrderSymbol()==symbol && OrderMagicNumber()==mMagic) { + count[(int)OrderType()]++; + } + } + } + + return; + +} diff --git a/Include/Nkanven/Frameworks/GridEA/Trade/Trade_mql5.mqh b/Include/Nkanven/Frameworks/GridEA/Trade/Trade_mql5.mqh new file mode 100644 index 0000000..cfc0ed1 --- /dev/null +++ b/Include/Nkanven/Frameworks/GridEA/Trade/Trade_mql5.mqh @@ -0,0 +1,152 @@ +/* + Trade.mqh + (For MQL5) + + Copyright 2013-2020, Orchard Forex + https://www.orchardforex.com + +*/ + +#include + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +class CTradeCustom : public CTrade + { + +private: + +protected: // member variables + +public: // constructors + +public: + + bool PositionCloseByType(const string symbol, ENUM_POSITION_TYPE positionType,const ulong deviation=ULONG_MAX); + bool PositionCloseByTicket(const ulong ticket,const ulong deviation=ULONG_MAX); + bool PositionCloseAll(const ulong deviation=ULONG_MAX); + bool OrderCloseAll(); + + ////New + void PositionCountByType(const string symbol, int &count[]); +}; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool CTradeCustom::PositionCloseByType(const string symbol, ENUM_POSITION_TYPE positionType, const ulong deviation=ULONG_MAX) + { + + bool result = true; + int cnt = PositionsTotal(); + for(int i = cnt-1; i>=0; i--) + { + ulong ticket = PositionGetTicket(i); + if(PositionSelectByTicket(ticket)) + { + if(PositionGetString(POSITION_SYMBOL)==symbol && PositionGetInteger(POSITION_TYPE)==positionType && PositionGetInteger(POSITION_MAGIC)==m_magic) + { + result &= PositionClose(ticket, deviation); + } + } + else + { + m_result.retcode=TRADE_RETCODE_REJECT; + result = false; + } + } + + return(result); + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool CTradeCustom::PositionCloseByTicket(const ulong ticket,const ulong deviation=-1) + { + bool result = true; + if(PositionSelectByTicket(ticket)) + { + if(PositionGetInteger(POSITION_MAGIC)==m_magic) + { + result &= PositionClose(ticket, deviation); + } + } + else + { + m_result.retcode=TRADE_RETCODE_REJECT; + result = false; + } + return(result); + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool CTradeCustom::PositionCloseAll(const ulong deviation=-1) + { + bool result = true; + int cnt = PositionsTotal(); + for(int i = cnt-1; i>=0; i--) + { + ulong ticket = PositionGetTicket(i); + if(PositionSelectByTicket(ticket)) + { + + result &= PositionClose(ticket, deviation); + } + else + { + m_result.retcode=TRADE_RETCODE_REJECT; + result = false; + } + } + + return(result); + } + +bool CTradeCustom::OrderCloseAll(){ +bool result = true; + int cnt = OrdersTotal(); + for(int i = cnt-1; i>=0; i--) + { + ulong ticket = OrderGetTicket(i); + if(OrderSelect(ticket)) + { + + result &= OrderDelete(ticket); + } + else + { + m_result.retcode=TRADE_RETCODE_REJECT; + result = false; + } + } + + return(result); +} +////New +void CTradeCustom::PositionCountByType(const string symbol, int &count[]) + { + + ArrayResize(count, 6); + ArrayInitialize(count, 0); + + int cnt = PositionsTotal(); + for(int i = cnt-1; i>=0; i--) + { + ulong ticket = PositionGetTicket(i); + if(PositionSelectByTicket(ticket)) + { + if(PositionGetString(POSITION_SYMBOL)==symbol && PositionGetInteger(POSITION_MAGIC)==m_magic) + { + count[(int)PositionGetInteger(POSITION_TYPE)]++; + } + } + } + + return; + + } +//+------------------------------------------------------------------+ diff --git a/Include/Nkanven/Frameworks/GridEA/Updates.txt b/Include/Nkanven/Frameworks/GridEA/Updates.txt new file mode 100644 index 0000000..281bf10 --- /dev/null +++ b/Include/Nkanven/Frameworks/GridEA/Updates.txt @@ -0,0 +1,7 @@ +Version 2.03 + +Added macros to CommonBase to standardise init checking + +Moved base classes up one level and removed unnecessary folders + +Updated framework number \ No newline at end of file diff --git a/Include/Nkanven/Frameworks/GridFramework.mqh b/Include/Nkanven/Frameworks/GridFramework.mqh new file mode 100644 index 0000000..e565f78 --- /dev/null +++ b/Include/Nkanven/Frameworks/GridFramework.mqh @@ -0,0 +1,20 @@ +//+------------------------------------------------------------------+ +//| GridFramework.mqh | +//| Copyright 2021, Nkondog Anselme Venceslas | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2021, Nkondog Anselme Venceslas" +#property link "https://www.mql5.com" + +// +// The only purpose of this mqh file is to provide a single +// point to change the current framework version +// +// If you place an include to this file in your code you +// will get the version framework defined in this file +// unless your code has already included another +// framework file + +#ifndef _FRAMEWORK_VERSION_ + #include "GridEA/Framework.mqh" +#endif diff --git a/Include/Nkanven/Frameworks/MakeExtensionMQH.bat b/Include/Nkanven/Frameworks/MakeExtensionMQH.bat new file mode 100644 index 0000000..1c9be58 --- /dev/null +++ b/Include/Nkanven/Frameworks/MakeExtensionMQH.bat @@ -0,0 +1,114 @@ +@echo off + +: +: Get the current date and time in a format to show in the files +: +for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if '.%%i.'=='.LocalDateTime.' set ldt=%%j +set ldt=%ldt:~0,4%-%ldt:~4,2%-%ldt:~6,2% %ldt:~8,2%:%ldt:~10,2%:%ldt:~12,2% + +: +: Make sure there is an Extensions folder here +: +if not exist Extensions\ goto :quit + +: +: Move into the extensions folder to start +: +cd Extensions + +: +: Remove any existing mqh files +: +del *.mqh + +: +: Step through the directories here and build up mqh files for each +: +for /D %%f in (*) do ( + call :makemqh %%f +) + +: +: Build the AllExtensions file +: +call :makemqh . + +: +: Move back up to the frameworks folder +: +cd .. + +: +: Step through the framework files and build up the new framework.mqh +: +set framework_version= +for /f "tokens=*" %%f in ('dir /b /a:d /o:n "Framework_*"') do ( + set framework_version=%%f +) +call :makeframework1 %framework_version% + + +goto :quit + +:makeframework1 + +set file=Framework.mqh + +echo /* > %file% +echo Framework.mqh >> %file% +echo. >> %file% +echo Copyright 2013-2020, Orchard Forex >> %file% +echo https://www.orchardforex.com >> %file% +echo. >> %file% +echo. >> %file% +echo */ >> %file% +echo. >> %file% +echo // >> %file% +echo // The only purpose of this mqh file is to provide a single >> %file% +echo // point to change the current framework version >> %file% +echo // >> %file% +echo // If you place an include to this file in your code you >> %file% +echo // will get the version framework defined in this file >> %file% +echo // unless your code has already included another >> %file% +echo // framework file >> %file% +echo. >> %file% +echo #ifndef _FRAMEWORK_VERSION_ >> %file% +echo #include "%1/Framework.mqh" >> %file% +echo #endif >> %file% + +goto :eof + +:makemqh + +set mcurrent=%cd% +set mpath1=%~f1 +for %%f in ("%mpath1%") do set mpath=%%~nxf +set msub=%mpath%/ +if "%mcurrent%"=="%mpath1%" set msub= +set mfile=All%mpath%.mqh + +echo /* > %mfile% +echo All%mn2%.mqh >> %mfile% +echo. >> %mfile% +echo Copyright 2013-2020, Orchard Forex >> %mfile% +echo https://www.orchardforex.com >> %mfile% +echo. >> %mfile% +echo Auto Generated at %ldt% >> %mfile% +echo. >> %mfile% +echo */ >> %mfile% +echo. >> %mfile% +echo // >> %mfile% +echo // Extension %mn2% go here >> %mfile% +echo // >> %mfile% + +for %%f in (%1\*.mqh) do ( + if not "%%~nxf"=="%mfile%" echo #include "%msub%%%~nxf" >> %mfile% +) +echo Built include file %mfile% + +goto :eof + +:quit +echo Finished +pause +goto :eof \ No newline at end of file