From b897386df31ccece4e055ab3a436215ecb8b4307 Mon Sep 17 00:00:00 2001 From: Gunther Schulz Date: Mon, 6 Jan 2020 16:55:48 +0100 Subject: [PATCH] add multi symbol support --- Experts/JsonAPI.mq5 | Bin 71584 -> 77434 bytes Include/OnTick(string symbol)_JsonAPI.mqh | 210 ++++++++++++++++++++++ 2 files changed, 210 insertions(+) create mode 100644 Include/OnTick(string symbol)_JsonAPI.mqh diff --git a/Experts/JsonAPI.mq5 b/Experts/JsonAPI.mq5 index 6a932729c87858fcce32adafdf851f2d93d885af..eaa44c5a86345c13d7989138e215966312f97400 100644 GIT binary patch delta 5302 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 UIWIVuKYDyRO#=%To#-F`AA54ZRR910 delta 1941 zcmbtVYfKbZ6ut}NvM$?U+?U8>ci372E6P)#(nVAr>#{1rm7ooX%4>a~EY!zV3N^-5 zqh;9-TSJvDw3@U(5S`XG{%9pJwrQ%dY18n-($(11KT>0xv=Y+v%&<+x@W(VaGjs1f z=bn4+`M&SY)EzE#ksBS?;P8AMO6UJ2m1z5;Pj6S57kF6yO2iRr&=RSR3;&FWbYKn2)8gbo8z?t!!fZY1~GOL|QKQn&>MB@v^-%64_FEvgz4F zGrOsISqJ&-P^^vkIiV=#WtK%P9YY_Pq>RJ|Dg?TCv?U1`OthfNnuneiH4>67cq562 zJDJCgG9Gxsl^=ldumiKsYmf;H5&iCfbd2Eo*W+nacYFugwUKj3jbm)u9w*` z@CM9Lqb0%NQlWFXfVYe7F_|orD%yqj>r4o&=eqY(bT4b9ISZK`V_inVp%9>^90!j9}ADp8pZz)o1+c*fQE zLjfUoF*4S!fZ#Br&^4{h3Gb;P+~d$tnGw^aAk>Ai)fc4`E2~v0GFUQYWYUOK;@O~f zFb7s;8!(VNOvKYeC^w^|OpUDa8jKuPBT&9wCRfFb$esg8g)S+~K}7JdwQLQmB!F$W zG_Z(>&%wW%M`x}cH!OPe1oetY8Y)G&vjus-)BSVR!^8f&5`CRufH&rlR&mW8-x z73PV`opY{o118SuFkLAq8aBJD6`}atIoPt6#}#)i);pXSb&0s@Fh>)O(YG!gla885 zK4#>tPojtx1isQE@To>xysBS?v%d{X^=qewh%4$5<#}ncP?#rMD83}&9bg{uvYT* zQ49|&$IXHlacf#*nyv518nmBFMv_UFIX8L!jXX>Liiq!iY(OYijj1L-rpB~5(wv5o z<}+}$_!R(ewRj@hAfmPgQBr7B01mh2<58s+UwBub-aA1zt`@GHS(y51873}i(9^mM zp*jxszb{B9cirGI>etBlA-tJK$xR;j`$aVTu7>V05A$(9#?SL;@K@osg_A~3cScE? zlP6WUeU`_!=XKIxwie&gJdZw;(7~9e9F9rD IgX6vb07!#X3jhEB diff --git a/Include/OnTick(string symbol)_JsonAPI.mqh b/Include/OnTick(string symbol)_JsonAPI.mqh new file mode 100644 index 0000000..f5d4271 --- /dev/null +++ b/Include/OnTick(string symbol)_JsonAPI.mqh @@ -0,0 +1,210 @@ +//+------------------------------------------------------------------+ +//| OnTick(string symbol).mqh | +//| Copyright 2010, Lizar | +//| https://login.mql5.com/ru/users/Lizar | +//| Revision 2011.01.30 | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2010, Lizar" +#property link "https://login.mql5.com/ru/users/Lizar" + +//+------------------------------------------------------------------+ +//| The events enumeration is implemented as flags | +//| the events can be combined using the OR ("|") logical operation | +//+------------------------------------------------------------------+ + + +enum ENUM_CHART_EVENT_SYMBOL + { + CHARTEVENT_NO =0, // Events disabled + CHARTEVENT_INIT =0, // "Initialization" event + + CHARTEVENT_NEWBAR_M1 =0x00000001, // "New bar" event on M1 chart + CHARTEVENT_NEWBAR_M2 =0x00000002, // "New bar" event on M2 chart + CHARTEVENT_NEWBAR_M3 =0x00000004, // "New bar" event on M3 chart + CHARTEVENT_NEWBAR_M4 =0x00000008, // "New bar" event on M4 chart + + CHARTEVENT_NEWBAR_M5 =0x00000010, // "New bar" event on M5 chart + CHARTEVENT_NEWBAR_M6 =0x00000020, // "New bar" event on M6 chart + CHARTEVENT_NEWBAR_M10=0x00000040, // "New bar" event on M10 chart + CHARTEVENT_NEWBAR_M12=0x00000080, // "New bar" event on M12 chart + + CHARTEVENT_NEWBAR_M15=0x00000100, // "New bar" event on M15 chart + CHARTEVENT_NEWBAR_M20=0x00000200, // "New bar" event on M20 chart + CHARTEVENT_NEWBAR_M30=0x00000400, // "New bar" event on M30 chart + CHARTEVENT_NEWBAR_H1 =0x00000800, // "New bar" event on H1 chart + + CHARTEVENT_NEWBAR_H2 =0x00001000, // "New bar" event on H2 chart + CHARTEVENT_NEWBAR_H3 =0x00002000, // "New bar" event on H3 chart + CHARTEVENT_NEWBAR_H4 =0x00004000, // "New bar" event on H4 chart + CHARTEVENT_NEWBAR_H6 =0x00008000, // "New bar" event on H6 chart + + CHARTEVENT_NEWBAR_H8 =0x00010000, // "New bar" event on H8 chart + CHARTEVENT_NEWBAR_H12=0x00020000, // "New bar" event on H12 chart + CHARTEVENT_NEWBAR_D1 =0x00040000, // "New bar" event on D1 chart + CHARTEVENT_NEWBAR_W1 =0x00080000, // "New bar" event on W1 chart + + CHARTEVENT_NEWBAR_MN1=0x00100000, // "New bar" event on MN1 chart + CHARTEVENT_TICK =0x00200000, // "New tick" event + + CHARTEVENT_ALL =0xFFFFFFFF, // All events enabled + }; + +//--- +#define CHART_EVENT_SYMBOL CHARTEVENT_TICK // frequency of calling OnTick() + +int _handle_[]; + +int _symbols_total_ = 0; // total symbols +int _symbols_market_ = 0; // number of symbols in Market Watch +bool _market_watch_ = false; // use symbols from Market Watch +bool _testing_ = false; // In testing mode + +//+------------------------------------------------------------------+ +//| Custom indicator initialization function | +//+------------------------------------------------------------------+ +int LoadSymbol(string symbol) + +// TODO only load when not already exists + { + //--- check if we work in Strategy Tester: + _testing_=((bool)MQL5InfoInteger(MQL5_TESTING) || + (bool)MQL5InfoInteger(MQL5_OPTIMIZATION) || + (bool)MQL5InfoInteger(MQL5_VISUAL_MODE)); + + //--- check settings + if(_testing_ ) + { + Print("Error: Strategy Tester is not working. "); + return(1); + } + + //--- Initialization of variables and arrays: + _symbols_total_=SymbolsTotal(false); // total symbols + ArrayResize(_handle_,_symbols_total_); // resize array for handles of "spys" + ArrayInitialize(_handle_,INVALID_HANDLE); // initalizae array for handles of "spys" + + Print(_symbols_total_, symbol); + _symbols_total_=ArraySize(tickSymbols); + for(int i=0;i<_symbols_total_;i++) + if(!LoadAgent(i, symbol)) return(1); + Print(_symbols_total_, symbol); + + //--- Execute OnInit function of Expert Advisor + //_OnInit(); + return(0); + } + +int UnloadAllSymbols() + { + //--- check if we work in Strategy Tester: + _testing_=((bool)MQL5InfoInteger(MQL5_TESTING) || + (bool)MQL5InfoInteger(MQL5_OPTIMIZATION) || + (bool)MQL5InfoInteger(MQL5_VISUAL_MODE)); + + //--- check settings + if(_testing_ ) + { + Print("Error: Strategy Tester is not working. "); + return(1); + } + + _symbols_total_=ArraySize(tickSymbols); + for(int i=0;i<_symbols_total_;i++) + if(!DeLoadAgent(i, tickSymbols[i])) return(1); + + + //--- Execute OnInit function of Expert Advisor + //_OnInit(); + return(0); + } + + + +//+------------------------------------------------------------------+ +//| Expert tick function | +//| Used only in Strategy Tester | +//+------------------------------------------------------------------+ +void OnTick() + { + if(_testing_) + { + for(int i=0;i<_symbols_total_;i++) + { + Print("a"); + string __symbol__=tickSymbols[i]; + if(MathAbs(GlobalVariableGet(__symbol__+"_flag")-2)<0.1) + { + Print("b"); + GlobalVariableSet(__symbol__+"_flag",1); + OnTick(__symbol__); + } + } + } + } + +//+------------------------------------------------------------------+ + +//| ChartEvent function | + +//+------------------------------------------------------------------+ + +void OnChartEvent(const int id,const long& lparam,const double& dparam,const string& sparam) + + { + //--- Call of OnTick(string symbol) or OnChartEvent event handler: + if(id==CHARTEVENT_CUSTOM_LAST) + { + OnTick(sparam); + //--- synchronize "agents" with Market Watch if necessary: + } + else _OnChartEvent(id,lparam,dparam,sparam); + } + +#define OnChartEvent _OnChartEvent // rendefine of OnChartEvent function + +//+------------------------------------------------------------------+ +//| Function for loading of "spys" | +//| INPUT: __id__ - id, corresponds to the symbol index in | +//| the list of symbols | +//| __symbol__ - symbol name | +//| OUTPUT: true - if successful | +//| false - if error | +//| REMARK: no. | +//+------------------------------------------------------------------+ +bool LoadAgent(int __id__, string __symbol__) + { + _handle_[__id__]=iCustom(__symbol__,_Period,"Spy Control panel MCM",ChartID(),65534,CHART_EVENT_SYMBOL); + if(_handle_[__id__]==INVALID_HANDLE) + { + Print("Error in setting of agent for ",__symbol__); + return(false); + } + Print("The agent for ",__symbol__," is set."); + return(true); + } + +//+------------------------------------------------------------------+ +//| Function for release of the "spys" | +//| INPUT: __id__ - id, corresponds to the symbol index in | +//| the list of symbols | +//| __symbol__ - symbol name | +//| OUTPUT: true - if successful | +//| false - if error | +//| REMARK: no. | +//+------------------------------------------------------------------+ +bool DeLoadAgent(int __id__, string __symbol__) + { + if(_handle_[__id__]!=INVALID_HANDLE) + { + if(!IndicatorRelease(_handle_[__id__])) + { + Print("Error deletion of agent for ",__symbol__); + return(false); + } + Print("The agent for ",__symbol__," is deleted."); + _handle_[__id__]=INVALID_HANDLE; + } + return(true); + } + +//+------------------------------ end -------------------------------+ \ No newline at end of file