From 37cb0fe738d0b951532a9783f753c3043ede45b8 Mon Sep 17 00:00:00 2001 From: Gunther Schulz Date: Tue, 3 Mar 2020 12:52:46 +0100 Subject: [PATCH] cleanup --- Experts/JsonAPI.mq5 | 173 +++++--- Include/EnumStringToInt.mqh | 692 ++++++++++++++++---------------- Indicators/JsonAPIIndicator.mq5 | 28 +- 3 files changed, 494 insertions(+), 399 deletions(-) diff --git a/Experts/JsonAPI.mq5 b/Experts/JsonAPI.mq5 index 2f0b465..550dadb 100644 --- a/Experts/JsonAPI.mq5 +++ b/Experts/JsonAPI.mq5 @@ -44,9 +44,9 @@ int SYS_PORT=15555; int DATA_PORT=15556; int LIVE_PORT=15557; int STR_PORT=15558; -int IND_DATA_PORT=15559; -int CHART_LIVE_PORT=15560; -int PUB_CHART_LIVE_PORT=15562; +int INDICATOR_DATA_PORT=15559; +int CHART_DATA_PORT=15560; +int CHART_INDICATOR_PORT=15562; // ZeroMQ Cnnections Context context("MQL5 JSON API"); @@ -55,15 +55,15 @@ Socket dataSocket(context,ZMQ_PUSH); Socket liveSocket(context,ZMQ_PUSH); Socket streamSocket(context,ZMQ_PUSH); Socket indicatorDataSocket(context,ZMQ_PUSH); -Socket chartLiveSocket(context,ZMQ_PULL); -Socket pubChartLiveSocket(context,ZMQ_PUB); +Socket chartDataSocket(context,ZMQ_PULL); +Socket chartIndicatorSocket(context,ZMQ_PUB); -// Global variables +// Global variables \\ bool debug = false; bool liveStream = true; -bool connectedFlag= true; +bool connectedFlag = true; int deInitReason = -1; -double chartAttached = ChartID(); +double chartAttached = ChartID(); // Chart id where the expert is attached to // Variables for handling price data stream struct SymbolSubscription { @@ -76,29 +76,30 @@ int symbolSubscriptionCount = 0; // Variables for controlling indicators struct Indicator { - long id; - string indicatorId; - int indicatorHandle; - int indicatorParamCount; - int indicatorBufferCount; + long id; // Internal id + string indicatorId; // UUID + int indicatorHandle; // Internal id/handle + int indicatorParamCount; // Number of parameters to be passed to the indicator + int indicatorBufferCount; // Numnber of buffers to be returned bythe indicator }; Indicator indicators[]; int indicatorCount = 0; // Variables for controlling chart struct ChartWindow { - long id; - string chartId; - string indicatorId; - int indicatorHandle; + long id; // Internal id + string chartId; // UUID + string indicatorId; // UUID + int indicatorHandle; // Internal id/handle }; ChartWindow chartWindows[]; int chartWindowCount = 0; -// Refresh chart windows interval. OnTimer function of indicatore JsonAPIIndicator gets triggered on each interval -int chartWindowTimerInterval = 100; -int chartWindowTimerCounter = 0; +// Refresh chart window interval for JsonAPIIndicator +int chartWindowTimerInterval = 100; // Cycles of the globally set EventSetMillisecondTimer interval +int chartWindowTimerCounter = 0; // Keeps track of the current cycle +// Error handling ControlErrors mControl; //string chartWindowObjects[]; @@ -119,20 +120,20 @@ bool BindSockets(){ if (result == false) { return result; } else {Print("Bound 'Live' socket on port ", LIVE_PORT);} result = streamSocket.bind(StringFormat("tcp://%s:%d", HOST,STR_PORT)); if (result == false) { return result; } else {Print("Bound 'Streaming' socket on port ", STR_PORT);} - result = indicatorDataSocket.bind(StringFormat("tcp://%s:%d", HOST,IND_DATA_PORT)); - if (result == false) { return result; } else {Print("Bound 'Indicator Data' socket on port ", IND_DATA_PORT);} - result = chartLiveSocket.bind(StringFormat("tcp://%s:%d", HOST,CHART_LIVE_PORT)); - if (result == false) { return result; } else {Print("Bound 'Chart Live' socket on port ", CHART_LIVE_PORT);} - result = pubChartLiveSocket.bind(StringFormat("tcp://%s:%d", HOST,PUB_CHART_LIVE_PORT)); - if (result == false) { return result; } else {Print("Bound 'PUB Chart Live' socket on port ", PUB_CHART_LIVE_PORT);} + result = indicatorDataSocket.bind(StringFormat("tcp://%s:%d", HOST,INDICATOR_DATA_PORT)); + if (result == false) { return result; } else {Print("Bound 'Indicator Data' socket on port ", INDICATOR_DATA_PORT);} + result = chartDataSocket.bind(StringFormat("tcp://%s:%d", HOST,CHART_DATA_PORT)); + if (result == false) { return result; } else {Print("Bound 'Chart Data' socket on port ", CHART_DATA_PORT);} + result = chartIndicatorSocket.bind(StringFormat("tcp://%s:%d", HOST,CHART_INDICATOR_PORT)); + if (result == false) { return result; } else {Print("Bound 'JsonAPIIndicator Data' socket on port ", CHART_INDICATOR_PORT);} sysSocket.setLinger(1000); dataSocket.setLinger(1000); liveSocket.setLinger(1000); streamSocket.setLinger(1000); indicatorDataSocket.setLinger(1000); - chartLiveSocket.setLinger(1000); - pubChartLiveSocket.setLinger(1000); + chartDataSocket.setLinger(1000); + chartIndicatorSocket.setLinger(1000); // Number of messages to buffer in RAM. sysSocket.setSendHighWaterMark(1); @@ -140,8 +141,8 @@ bool BindSockets(){ liveSocket.setSendHighWaterMark(1); streamSocket.setSendHighWaterMark(50); indicatorDataSocket.setSendHighWaterMark(5); - chartLiveSocket.setReceiveHighWaterMark(1); // TODO confirm settings - pubChartLiveSocket.setReceiveHighWaterMark(1); + chartDataSocket.setReceiveHighWaterMark(1); // TODO confirm settings + chartIndicatorSocket.setReceiveHighWaterMark(1); return result; } @@ -201,18 +202,18 @@ void OnDeinit(const int reason){ if (reason != REASON_CHARTCHANGE){ Print(__FUNCTION__," Deinitialization reason: ", getUninitReasonText(reason)); - Print("Unbinding 'System' socket on port ", SYS_PORT,".."); - sysSocket.unbind(StringFormat("tcp://%s:%d", HOST,SYS_PORT)); - Print("Unbinding 'Data' socket on port ", DATA_PORT,".."); - dataSocket.unbind(StringFormat("tcp://%s:%d", HOST,DATA_PORT)); + Print("Unbinding 'System' socket on port ", SYS_PORT, ".."); + sysSocket.unbind(StringFormat("tcp://%s:%d", HOST, SYS_PORT)); + Print("Unbinding 'Data' socket on port ", DATA_PORT, ".."); + dataSocket.unbind(StringFormat("tcp://%s:%d", HOST, DATA_PORT)); Print("Unbinding 'Live' socket on port ", LIVE_PORT, ".."); - liveSocket.unbind(StringFormat("tcp://%s:%d", HOST,LIVE_PORT)); + liveSocket.unbind(StringFormat("tcp://%s:%d", HOST, LIVE_PORT)); Print("Unbinding 'Streaming' socket on port ", STR_PORT, ".."); - streamSocket.unbind(StringFormat("tcp://%s:%d", HOST,STR_PORT)); - Print("Unbinding 'CHart' socket on port ", STR_PORT, ".."); - streamSocket.unbind(StringFormat("tcp://%s:%d", HOST,CHART_LIVE_PORT)); - Print("Unbinding 'pub chart' socket on port ", STR_PORT, ".."); - streamSocket.unbind(StringFormat("tcp://%s:%d", HOST,PUB_CHART_LIVE_PORT)); + streamSocket.unbind(StringFormat("tcp://%s:%d", HOST, STR_PORT)); + Print("Unbinding 'Chart Data' socket on port ", STR_PORT, ".."); + streamSocket.unbind(StringFormat("tcp://%s:%d", HOST, CHART_DATA_PORT)); + Print("Unbinding 'JsonAPIIndicator Data' socket on port ", STR_PORT, ".."); + streamSocket.unbind(StringFormat("tcp://%s:%d", HOST, CHART_INDICATOR_PORT)); // Shutdown ZeroMQ Context context.shutdown(); @@ -374,11 +375,11 @@ void OnTimer(){ // Publish indicator values for the JsonAPIIndicator indicator ZmqMsg chartMsg; - chartLiveSocket.recv(chartMsg, true); + chartDataSocket.recv(chartMsg, true); if(chartMsg.size()>0){ Print(chartMsg.getData()); - pubChartLiveSocket.send(chartMsg,true); - ResetLastError(); + chartIndicatorSocket.send(chartMsg,true); + //ResetLastError(); } // Trigger the indicator JsonAPIIndicator to check for new Messages @@ -674,6 +675,7 @@ void OpenChart(CJAVal &dataObject){ chartWindows[idx].id = ChartOpen(symbol, period); CJAVal message; + message["error"]=(bool) false; message["chartId"] = (string) chartId; string t=message.Serialize(); @@ -682,7 +684,7 @@ void OpenChart(CJAVal &dataObject){ } //+------------------------------------------------------------------+ -//| Add JsonAPIIndicator indicator chart to chart | +//| Add JsonAPIIndicator indicator to chart | //+------------------------------------------------------------------+ void AddIndicatorChartToChart(CJAVal &dataObject){ @@ -706,6 +708,7 @@ void AddIndicatorChartToChart(CJAVal &dataObject){ } if(!CheckError(__FUNCTION__)) { CJAVal message; + message["error"]=(bool) false; message["chartId"] = (string) chartIdStr; string t=message.Serialize(); @@ -717,7 +720,7 @@ void AddIndicatorChartToChart(CJAVal &dataObject){ //+------------------------------------------------------------------+ //| Draw on chart | //+------------------------------------------------------------------+ -void ChartDraw(CJAVal &dataObject){ +void ChartDrawY(CJAVal &dataObject){ /* Print("drawchart"); @@ -866,6 +869,86 @@ void ChartDrawX(CJAVal &dataObject){ //ChartRedraw(chart_id); } +//+------------------------------------------------------------------+ +//| Draw on chart | +//+------------------------------------------------------------------+ +void ChartDraw(CJAVal &dataObject){ + + // DONT DRAW, if chartid noes not exist any more + + string id=dataObject["id"].ToStr(); + + string graphicsType=dataObject["data"]["graphicstype"].ToStr(); + + if (graphicsType=="line") { + string objectId=dataObject["data"]["objectId"].ToStr(); + datetime fromDate=dataObject["data"]["fromDate"].ToInt(); + datetime toDate=dataObject["data"]["toDate"].ToInt(); + double fromPrice=dataObject["data"]["fromPrice"].ToDbl(); + double toPrice=dataObject["data"]["toPrice"].ToDbl(); + + + /* + double params[]; + for(int i=0;i=0)return r; - ENUM_ACCOUNT_INFO_INTEGER a2; - r = StringToEnum(indicatorConstantString,a2); - if(r>=0)return r; - ENUM_ACCOUNT_INFO_STRING a3; - r = StringToEnum(indicatorConstantString,a3); - if(r>=0)return r; - ENUM_ACCOUNT_MARGIN_MODE a4; - r = StringToEnum(indicatorConstantString,a4); - if(r>=0)return r; - ENUM_ACCOUNT_STOPOUT_MODE a5; - r = StringToEnum(indicatorConstantString,a5); - if(r>=0)return r; - ENUM_ACCOUNT_TRADE_MODE a6; - r = StringToEnum(indicatorConstantString,a6); - if(r>=0)return r; - ENUM_ALIGN_MODE a7; - r = StringToEnum(indicatorConstantString,a7); - if(r>=0)return r; - ENUM_ANCHOR_POINT a8; - r = StringToEnum(indicatorConstantString,a8); - if(r>=0)return r; - ENUM_APPLIED_PRICE a9; - r = StringToEnum(indicatorConstantString,a9); - if(r>=0)return r; - ENUM_APPLIED_PRICE a10; - r = StringToEnum(indicatorConstantString,a10); - if(r>=0)return r; - ENUM_APPLIED_VOLUME a11; - r = StringToEnum(indicatorConstantString,a11); - if(r>=0)return r; - ENUM_ARROW_ANCHOR a12; - r = StringToEnum(indicatorConstantString,a12); - if(r>=0)return r; - ENUM_BASE_CORNER a13; - r = StringToEnum(indicatorConstantString,a13); - if(r>=0)return r; - ENUM_BOOK_TYPE a14; - r = StringToEnum(indicatorConstantString,a14); - if(r>=0)return r; - ENUM_BORDER_TYPE a15; - r = StringToEnum(indicatorConstantString,a15); - if(r>=0)return r; - ENUM_CALENDAR_EVENT_FREQUENCY a16; - r = StringToEnum(indicatorConstantString,a16); - if(r>=0)return r; - ENUM_CALENDAR_EVENT_IMPACT a17; - r = StringToEnum(indicatorConstantString,a17); - if(r>=0)return r; - ENUM_CALENDAR_EVENT_IMPORTANCE a18; - r = StringToEnum(indicatorConstantString,a18); - if(r>=0)return r; - ENUM_CALENDAR_EVENT_MULTIPLIER a19; - r = StringToEnum(indicatorConstantString,a19); - if(r>=0)return r; - ENUM_CALENDAR_EVENT_SECTOR a20; - r = StringToEnum(indicatorConstantString,a20); - if(r>=0)return r; - ENUM_CALENDAR_EVENT_TIMEMODE a21; - r = StringToEnum(indicatorConstantString,a21); - if(r>=0)return r; - ENUM_CALENDAR_EVENT_TYPE a22; - r = StringToEnum(indicatorConstantString,a22); - if(r>=0)return r; - ENUM_CALENDAR_EVENT_UNIT a23; - r = StringToEnum(indicatorConstantString,a23); - if(r>=0)return r; - ENUM_CHART_EVENT a24; - r = StringToEnum(indicatorConstantString,a24); - if(r>=0)return r; - ENUM_CHART_MODE a25; - r = StringToEnum(indicatorConstantString,a25); - if(r>=0)return r; - ENUM_CHART_POSITION a26; - r = StringToEnum(indicatorConstantString,a26); - if(r>=0)return r; - ENUM_CHART_PROPERTY_DOUBLE a27; - r = StringToEnum(indicatorConstantString,a27); - if(r>=0)return r; - ENUM_CHART_PROPERTY_INTEGER a28; - r = StringToEnum(indicatorConstantString,a28); - if(r>=0)return r; - ENUM_CHART_PROPERTY_STRING a29; - r = StringToEnum(indicatorConstantString,a29); - if(r>=0)return r; - ENUM_CHART_VOLUME_MODE a30; - r = StringToEnum(indicatorConstantString,a30); - if(r>=0)return r; - ENUM_CL_DEVICE_TYPE a31; - r = StringToEnum(indicatorConstantString,a31); - if(r>=0)return r; - ENUM_COLOR_FORMAT a32; - r = StringToEnum(indicatorConstantString,a32); - if(r>=0)return r; - ENUM_CRYPT_METHOD a33; - r = StringToEnum(indicatorConstantString,a33); - if(r>=0)return r; - ENUM_CUSTOMIND_PROPERTY_DOUBLE a34; - r = StringToEnum(indicatorConstantString,a34); - if(r>=0)return r; - ENUM_CHART_PROPERTY_INTEGER a35; - r = StringToEnum(indicatorConstantString,a35); - if(r>=0)return r; - ENUM_CUSTOMIND_PROPERTY_STRING a36; - r = StringToEnum(indicatorConstantString,a36); - if(r>=0)return r; - ENUM_DATABASE_EXPORT_FLAGS a37; - r = StringToEnum(indicatorConstantString,a37); - if(r>=0)return r; - ENUM_DATABASE_FIELD_TYPE a38; - r = StringToEnum(indicatorConstantString,a38); - if(r>=0)return r; - ENUM_DATABASE_OPEN_FLAGS a39; - r = StringToEnum(indicatorConstantString,a39); - if(r>=0)return r; - ENUM_DATABASE_PRINT_FLAGS a40; - r = StringToEnum(indicatorConstantString,a40); - if(r>=0)return r; - ENUM_DATATYPE a41; - r = StringToEnum(indicatorConstantString,a41); - if(r>=0)return r; - ENUM_DAY_OF_WEEK a42; - r = StringToEnum(indicatorConstantString,a42); - if(r>=0)return r; - ENUM_DEAL_ENTRY a43; - r = StringToEnum(indicatorConstantString,a43); - if(r>=0)return r; - ENUM_DEAL_PROPERTY_DOUBLE a44; - r = StringToEnum(indicatorConstantString,a44); - if(r>=0)return r; - ENUM_DEAL_PROPERTY_INTEGER a45; - r = StringToEnum(indicatorConstantString,a45); - if(r>=0)return r; - ENUM_DEAL_PROPERTY_STRING a46; - r = StringToEnum(indicatorConstantString,a46); - if(r>=0)return r; - ENUM_DEAL_REASON a47; - r = StringToEnum(indicatorConstantString,a47); - if(r>=0)return r; - ENUM_DEAL_TYPE a48; - r = StringToEnum(indicatorConstantString,a48); - if(r>=0)return r; - ENUM_DRAW_TYPE a49; - r = StringToEnum(indicatorConstantString,a49); - if(r>=0)return r; - ENUM_DX_BUFFER_TYPE a50; - r = StringToEnum(indicatorConstantString,a50); - if(r>=0)return r; - ENUM_DX_FORMAT a51; - r = StringToEnum(indicatorConstantString,a51); - if(r>=0)return r; - ENUM_DX_HANDLE_TYPE a52; - r = StringToEnum(indicatorConstantString,a52); - if(r>=0)return r; - ENUM_DX_PRIMITIVE_TOPOLOGY a53; - r = StringToEnum(indicatorConstantString,a53); - if(r>=0)return r; - ENUM_DX_SHADER_TYPE a54; - r = StringToEnum(indicatorConstantString,a54); - if(r>=0)return r; - ENUM_ELLIOT_WAVE_DEGREE a55; - r = StringToEnum(indicatorConstantString,a55); - if(r>=0)return r; - ENUM_FILESELECT_FLAGS a56; - r = StringToEnum(indicatorConstantString,a56); - if(r>=0)return r; - ENUM_FILE_POSITION a57; - r = StringToEnum(indicatorConstantString,a57); - if(r>=0)return r; - ENUM_FILE_PROPERTY_INTEGER a58; - r = StringToEnum(indicatorConstantString,a58); - if(r>=0)return r; - ENUM_GANN_DIRECTION a59; - r = StringToEnum(indicatorConstantString,a59); - if(r>=0)return r; - ENUM_INDEXBUFFER_TYPE a60; - r = StringToEnum(indicatorConstantString,a60); - if(r>=0)return r; - ENUM_INDICATOR a61; - r = StringToEnum(indicatorConstantString,a61); - if(r>=0)return r; - ENUM_INIT_RETCODE a62; - r = StringToEnum(indicatorConstantString,a62); - if(r>=0)return r; - ENUM_LICENSE_TYPE a63; - r = StringToEnum(indicatorConstantString,a63); - if(r>=0)return r; - ENUM_LINE_STYLE a64; - r = StringToEnum(indicatorConstantString,a64); - if(r>=0)return r; - ENUM_MA_METHOD a65; - r = StringToEnum(indicatorConstantString,a65); - if(r>=0)return r; - ENUM_MQL_INFO_INTEGER a66; - r = StringToEnum(indicatorConstantString,a66); - if(r>=0)return r; - ENUM_MQL_INFO_STRING a67; - r = StringToEnum(indicatorConstantString,a67); - if(r>=0)return r; - ENUM_OBJECT a68; - r = StringToEnum(indicatorConstantString,a68); - if(r>=0)return r; - ENUM_OBJECT_PROPERTY_DOUBLE a69; - r = StringToEnum(indicatorConstantString,a69); - if(r>=0)return r; - ENUM_OBJECT_PROPERTY_INTEGER a70; - r = StringToEnum(indicatorConstantString,a70); - if(r>=0)return r; - ENUM_OBJECT_PROPERTY_STRING a71; - r = StringToEnum(indicatorConstantString,a71); - if(r>=0)return r; - ENUM_OPENCL_HANDLE_TYPE a72; - r = StringToEnum(indicatorConstantString,a72); - if(r>=0)return r; - ENUM_OPENCL_PROPERTY_INTEGER a73; - r = StringToEnum(indicatorConstantString,a73); - if(r>=0)return r; - ENUM_PLOT_PROPERTY_STRING a74; - r = StringToEnum(indicatorConstantString,a74); - if(r>=0)return r; - ENUM_POINTER_TYPE a75; - r = StringToEnum(indicatorConstantString,a75); - if(r>=0)return r; - ENUM_POSITION_PROPERTY_DOUBLE a76; - r = StringToEnum(indicatorConstantString,a76); - if(r>=0)return r; - ENUM_ORDER_PROPERTY_INTEGER a77; - r = StringToEnum(indicatorConstantString,a77); - if(r>=0)return r; - ENUM_PLOT_PROPERTY_STRING a78; - r = StringToEnum(indicatorConstantString,a78); - if(r>=0)return r; - ENUM_PROGRAM_TYPE a79; - r = StringToEnum(indicatorConstantString,a79); - if(r>=0)return r; - ENUM_SERIESMODE a80; - r = StringToEnum(indicatorConstantString,a80); - if(r>=0)return r; - ENUM_SERIES_INFO_INTEGER a81; - r = StringToEnum(indicatorConstantString,a81); - if(r>=0)return r; - ENUM_SIGNAL_BASE_DOUBLE a82; - r = StringToEnum(indicatorConstantString,a82); - if(r>=0)return r; - ENUM_SIGNAL_BASE_INTEGER a83; - r = StringToEnum(indicatorConstantString,a83); - if(r>=0)return r; - ENUM_SIGNAL_BASE_STRING a84; - r = StringToEnum(indicatorConstantString,a84); - if(r>=0)return r; - ENUM_SIGNAL_INFO_DOUBLE a85; - r = StringToEnum(indicatorConstantString,a85); - if(r>=0)return r; - ENUM_SIGNAL_INFO_INTEGER a86; - r = StringToEnum(indicatorConstantString,a86); - if(r>=0)return r; - ENUM_SIGNAL_INFO_STRING a87; - r = StringToEnum(indicatorConstantString,a87); - if(r>=0)return r; - ENUM_STATISTICS a88; - r = StringToEnum(indicatorConstantString,a88); - if(r>=0)return r; - ENUM_STO_PRICE a89; - r = StringToEnum(indicatorConstantString,a89); - if(r>=0)return r; - ENUM_SYMBOL_CALC_MODE a90; - r = StringToEnum(indicatorConstantString,a90); - if(r>=0)return r; - ENUM_SYMBOL_CHART_MODE a91; - r = StringToEnum(indicatorConstantString,a91); - if(r>=0)return r; - ENUM_SYMBOL_INFO_DOUBLE a92; - r = StringToEnum(indicatorConstantString,a92); - if(r>=0)return r; - ENUM_SYMBOL_INFO_INTEGER a93; - r = StringToEnum(indicatorConstantString,a93); - if(r>=0)return r; - ENUM_SYMBOL_INFO_STRING a94; - r = StringToEnum(indicatorConstantString,a94); - if(r>=0)return r; - ENUM_STATISTICS a95; - r = StringToEnum(indicatorConstantString,a95); - if(r>=0)return r; - ENUM_STO_PRICE a96; - r = StringToEnum(indicatorConstantString,a96); - if(r>=0)return r; - ENUM_SYMBOL_CALC_MODE a97; - r = StringToEnum(indicatorConstantString,a97); - if(r>=0)return r; - ENUM_SYMBOL_CHART_MODE a98; - r = StringToEnum(indicatorConstantString,a98); - if(r>=0)return r; - ENUM_SYMBOL_INFO_DOUBLE a99; - r = StringToEnum(indicatorConstantString,a99); - if(r>=0)return r; - ENUM_SYMBOL_INFO_INTEGER a100; - r = StringToEnum(indicatorConstantString,a100); - if(r>=0)return r; - ENUM_SYMBOL_INFO_STRING a101; - r = StringToEnum(indicatorConstantString,a101); - if(r>=0)return r; - ENUM_SYMBOL_OPTION_MODE a102; - r = StringToEnum(indicatorConstantString,a102); - if(r>=0)return r; - ENUM_SYMBOL_OPTION_RIGHT a103; - r = StringToEnum(indicatorConstantString,a103); - if(r>=0)return r; - ENUM_SYMBOL_ORDER_GTC_MODE a104; - r = StringToEnum(indicatorConstantString,a104); - if(r>=0)return r; - ENUM_SYMBOL_SWAP_MODE a105; - r = StringToEnum(indicatorConstantString,a105); - if(r>=0)return r; - ENUM_SYMBOL_TRADE_EXECUTION a106; - r = StringToEnum(indicatorConstantString,a106); - if(r>=0)return r; - ENUM_SYMBOL_TRADE_MODE a107; - r = StringToEnum(indicatorConstantString,a107); - if(r>=0)return r; - ENUM_TERMINAL_INFO_DOUBLE a108; - r = StringToEnum(indicatorConstantString,a108); - if(r>=0)return r; - ENUM_TERMINAL_INFO_INTEGER a109; - r = StringToEnum(indicatorConstantString,a109); - if(r>=0)return r; - ENUM_TERMINAL_INFO_STRING a110; - r = StringToEnum(indicatorConstantString,a110); - if(r>=0)return r; - ENUM_TIMEFRAMES a111; - r = StringToEnum(indicatorConstantString,a111); - if(r>=0)return r; - ENUM_TRADE_REQUEST_ACTIONS a112; - r = StringToEnum(indicatorConstantString,a112); - if(r>=0)return r; - ENUM_TRADE_TRANSACTION_TYPE a113; - r = StringToEnum(indicatorConstantString,a113); - if(r>=0)return r; +int StringToEnumInt(string indicatorConstantString) + { + int r = -1; - return(-1); -} + ENUM_ACCOUNT_INFO_DOUBLE a1; + r = StringToEnum(indicatorConstantString,a1); + //if(debug) Print("ENUM type: ENUM_ACCOUNT_INFO_DOUBLE"); + if(r>=0)return r; + ENUM_ACCOUNT_INFO_INTEGER a2; + r = StringToEnum(indicatorConstantString,a2); + if(r>=0)return r; + ENUM_ACCOUNT_INFO_STRING a3; + r = StringToEnum(indicatorConstantString,a3); + if(r>=0)return r; + ENUM_ACCOUNT_MARGIN_MODE a4; + r = StringToEnum(indicatorConstantString,a4); + if(r>=0)return r; + ENUM_ACCOUNT_STOPOUT_MODE a5; + r = StringToEnum(indicatorConstantString,a5); + if(r>=0)return r; + ENUM_ACCOUNT_TRADE_MODE a6; + r = StringToEnum(indicatorConstantString,a6); + if(r>=0)return r; + ENUM_ALIGN_MODE a7; + r = StringToEnum(indicatorConstantString,a7); + if(r>=0)return r; + ENUM_ANCHOR_POINT a8; + r = StringToEnum(indicatorConstantString,a8); + if(r>=0)return r; + ENUM_APPLIED_PRICE a9; + r = StringToEnum(indicatorConstantString,a9); + if(r>=0)return r; + ENUM_APPLIED_PRICE a10; + r = StringToEnum(indicatorConstantString,a10); + if(r>=0)return r; + ENUM_APPLIED_VOLUME a11; + r = StringToEnum(indicatorConstantString,a11); + if(r>=0)return r; + ENUM_ARROW_ANCHOR a12; + r = StringToEnum(indicatorConstantString,a12); + if(r>=0)return r; + ENUM_BASE_CORNER a13; + r = StringToEnum(indicatorConstantString,a13); + if(r>=0)return r; + ENUM_BOOK_TYPE a14; + r = StringToEnum(indicatorConstantString,a14); + if(r>=0)return r; + ENUM_BORDER_TYPE a15; + r = StringToEnum(indicatorConstantString,a15); + if(r>=0)return r; + ENUM_CALENDAR_EVENT_FREQUENCY a16; + r = StringToEnum(indicatorConstantString,a16); + if(r>=0)return r; + ENUM_CALENDAR_EVENT_IMPACT a17; + r = StringToEnum(indicatorConstantString,a17); + if(r>=0)return r; + ENUM_CALENDAR_EVENT_IMPORTANCE a18; + r = StringToEnum(indicatorConstantString,a18); + if(r>=0)return r; + ENUM_CALENDAR_EVENT_MULTIPLIER a19; + r = StringToEnum(indicatorConstantString,a19); + if(r>=0)return r; + ENUM_CALENDAR_EVENT_SECTOR a20; + r = StringToEnum(indicatorConstantString,a20); + if(r>=0)return r; + ENUM_CALENDAR_EVENT_TIMEMODE a21; + r = StringToEnum(indicatorConstantString,a21); + if(r>=0)return r; + ENUM_CALENDAR_EVENT_TYPE a22; + r = StringToEnum(indicatorConstantString,a22); + if(r>=0)return r; + ENUM_CALENDAR_EVENT_UNIT a23; + r = StringToEnum(indicatorConstantString,a23); + if(r>=0)return r; + ENUM_CHART_EVENT a24; + r = StringToEnum(indicatorConstantString,a24); + if(r>=0)return r; + ENUM_CHART_MODE a25; + r = StringToEnum(indicatorConstantString,a25); + if(r>=0)return r; + ENUM_CHART_POSITION a26; + r = StringToEnum(indicatorConstantString,a26); + if(r>=0)return r; + ENUM_CHART_PROPERTY_DOUBLE a27; + r = StringToEnum(indicatorConstantString,a27); + if(r>=0)return r; + ENUM_CHART_PROPERTY_INTEGER a28; + r = StringToEnum(indicatorConstantString,a28); + if(r>=0)return r; + ENUM_CHART_PROPERTY_STRING a29; + r = StringToEnum(indicatorConstantString,a29); + if(r>=0)return r; + ENUM_CHART_VOLUME_MODE a30; + r = StringToEnum(indicatorConstantString,a30); + if(r>=0)return r; + ENUM_CL_DEVICE_TYPE a31; + r = StringToEnum(indicatorConstantString,a31); + if(r>=0)return r; + ENUM_COLOR_FORMAT a32; + r = StringToEnum(indicatorConstantString,a32); + if(r>=0)return r; + ENUM_CRYPT_METHOD a33; + r = StringToEnum(indicatorConstantString,a33); + if(r>=0)return r; + ENUM_CUSTOMIND_PROPERTY_DOUBLE a34; + r = StringToEnum(indicatorConstantString,a34); + if(r>=0)return r; + ENUM_CHART_PROPERTY_INTEGER a35; + r = StringToEnum(indicatorConstantString,a35); + if(r>=0)return r; + ENUM_CUSTOMIND_PROPERTY_STRING a36; + r = StringToEnum(indicatorConstantString,a36); + if(r>=0)return r; + ENUM_DATABASE_EXPORT_FLAGS a37; + r = StringToEnum(indicatorConstantString,a37); + if(r>=0)return r; + ENUM_DATABASE_FIELD_TYPE a38; + r = StringToEnum(indicatorConstantString,a38); + if(r>=0)return r; + ENUM_DATABASE_OPEN_FLAGS a39; + r = StringToEnum(indicatorConstantString,a39); + if(r>=0)return r; + ENUM_DATABASE_PRINT_FLAGS a40; + r = StringToEnum(indicatorConstantString,a40); + if(r>=0)return r; + ENUM_DATATYPE a41; + r = StringToEnum(indicatorConstantString,a41); + if(r>=0)return r; + ENUM_DAY_OF_WEEK a42; + r = StringToEnum(indicatorConstantString,a42); + if(r>=0)return r; + ENUM_DEAL_ENTRY a43; + r = StringToEnum(indicatorConstantString,a43); + if(r>=0)return r; + ENUM_DEAL_PROPERTY_DOUBLE a44; + r = StringToEnum(indicatorConstantString,a44); + if(r>=0)return r; + ENUM_DEAL_PROPERTY_INTEGER a45; + r = StringToEnum(indicatorConstantString,a45); + if(r>=0)return r; + ENUM_DEAL_PROPERTY_STRING a46; + r = StringToEnum(indicatorConstantString,a46); + if(r>=0)return r; + ENUM_DEAL_REASON a47; + r = StringToEnum(indicatorConstantString,a47); + if(r>=0)return r; + ENUM_DEAL_TYPE a48; + r = StringToEnum(indicatorConstantString,a48); + if(r>=0)return r; + ENUM_DRAW_TYPE a49; + r = StringToEnum(indicatorConstantString,a49); + if(r>=0)return r; + ENUM_DX_BUFFER_TYPE a50; + r = StringToEnum(indicatorConstantString,a50); + if(r>=0)return r; + ENUM_DX_FORMAT a51; + r = StringToEnum(indicatorConstantString,a51); + if(r>=0)return r; + ENUM_DX_HANDLE_TYPE a52; + r = StringToEnum(indicatorConstantString,a52); + if(r>=0)return r; + ENUM_DX_PRIMITIVE_TOPOLOGY a53; + r = StringToEnum(indicatorConstantString,a53); + if(r>=0)return r; + ENUM_DX_SHADER_TYPE a54; + r = StringToEnum(indicatorConstantString,a54); + if(r>=0)return r; + ENUM_ELLIOT_WAVE_DEGREE a55; + r = StringToEnum(indicatorConstantString,a55); + if(r>=0)return r; + ENUM_FILESELECT_FLAGS a56; + r = StringToEnum(indicatorConstantString,a56); + if(r>=0)return r; + ENUM_FILE_POSITION a57; + r = StringToEnum(indicatorConstantString,a57); + if(r>=0)return r; + ENUM_FILE_PROPERTY_INTEGER a58; + r = StringToEnum(indicatorConstantString,a58); + if(r>=0)return r; + ENUM_GANN_DIRECTION a59; + r = StringToEnum(indicatorConstantString,a59); + if(r>=0)return r; + ENUM_INDEXBUFFER_TYPE a60; + r = StringToEnum(indicatorConstantString,a60); + if(r>=0)return r; + ENUM_INDICATOR a61; + r = StringToEnum(indicatorConstantString,a61); + if(r>=0)return r; + ENUM_INIT_RETCODE a62; + r = StringToEnum(indicatorConstantString,a62); + if(r>=0)return r; + ENUM_LICENSE_TYPE a63; + r = StringToEnum(indicatorConstantString,a63); + if(r>=0)return r; + ENUM_LINE_STYLE a64; + r = StringToEnum(indicatorConstantString,a64); + if(r>=0)return r; + ENUM_MA_METHOD a65; + r = StringToEnum(indicatorConstantString,a65); + if(r>=0)return r; + ENUM_MQL_INFO_INTEGER a66; + r = StringToEnum(indicatorConstantString,a66); + if(r>=0)return r; + ENUM_MQL_INFO_STRING a67; + r = StringToEnum(indicatorConstantString,a67); + if(r>=0)return r; + ENUM_OBJECT a68; + r = StringToEnum(indicatorConstantString,a68); + if(r>=0)return r; + ENUM_OBJECT_PROPERTY_DOUBLE a69; + r = StringToEnum(indicatorConstantString,a69); + if(r>=0)return r; + ENUM_OBJECT_PROPERTY_INTEGER a70; + r = StringToEnum(indicatorConstantString,a70); + if(r>=0)return r; + ENUM_OBJECT_PROPERTY_STRING a71; + r = StringToEnum(indicatorConstantString,a71); + if(r>=0)return r; + ENUM_OPENCL_HANDLE_TYPE a72; + r = StringToEnum(indicatorConstantString,a72); + if(r>=0)return r; + ENUM_OPENCL_PROPERTY_INTEGER a73; + r = StringToEnum(indicatorConstantString,a73); + if(r>=0)return r; + ENUM_PLOT_PROPERTY_STRING a74; + r = StringToEnum(indicatorConstantString,a74); + if(r>=0)return r; + ENUM_POINTER_TYPE a75; + r = StringToEnum(indicatorConstantString,a75); + if(r>=0)return r; + ENUM_POSITION_PROPERTY_DOUBLE a76; + r = StringToEnum(indicatorConstantString,a76); + if(r>=0)return r; + ENUM_ORDER_PROPERTY_INTEGER a77; + r = StringToEnum(indicatorConstantString,a77); + if(r>=0)return r; + ENUM_PLOT_PROPERTY_STRING a78; + r = StringToEnum(indicatorConstantString,a78); + if(r>=0)return r; + ENUM_PROGRAM_TYPE a79; + r = StringToEnum(indicatorConstantString,a79); + if(r>=0)return r; + ENUM_SERIESMODE a80; + r = StringToEnum(indicatorConstantString,a80); + if(r>=0)return r; + ENUM_SERIES_INFO_INTEGER a81; + r = StringToEnum(indicatorConstantString,a81); + if(r>=0)return r; + ENUM_SIGNAL_BASE_DOUBLE a82; + r = StringToEnum(indicatorConstantString,a82); + if(r>=0)return r; + ENUM_SIGNAL_BASE_INTEGER a83; + r = StringToEnum(indicatorConstantString,a83); + if(r>=0)return r; + ENUM_SIGNAL_BASE_STRING a84; + r = StringToEnum(indicatorConstantString,a84); + if(r>=0)return r; + ENUM_SIGNAL_INFO_DOUBLE a85; + r = StringToEnum(indicatorConstantString,a85); + if(r>=0)return r; + ENUM_SIGNAL_INFO_INTEGER a86; + r = StringToEnum(indicatorConstantString,a86); + if(r>=0)return r; + ENUM_SIGNAL_INFO_STRING a87; + r = StringToEnum(indicatorConstantString,a87); + if(r>=0)return r; + ENUM_STATISTICS a88; + r = StringToEnum(indicatorConstantString,a88); + if(r>=0)return r; + ENUM_STO_PRICE a89; + r = StringToEnum(indicatorConstantString,a89); + if(r>=0)return r; + ENUM_SYMBOL_CALC_MODE a90; + r = StringToEnum(indicatorConstantString,a90); + if(r>=0)return r; + ENUM_SYMBOL_CHART_MODE a91; + r = StringToEnum(indicatorConstantString,a91); + if(r>=0)return r; + ENUM_SYMBOL_INFO_DOUBLE a92; + r = StringToEnum(indicatorConstantString,a92); + if(r>=0)return r; + ENUM_SYMBOL_INFO_INTEGER a93; + r = StringToEnum(indicatorConstantString,a93); + if(r>=0)return r; + ENUM_SYMBOL_INFO_STRING a94; + r = StringToEnum(indicatorConstantString,a94); + if(r>=0)return r; + ENUM_STATISTICS a95; + r = StringToEnum(indicatorConstantString,a95); + if(r>=0)return r; + ENUM_STO_PRICE a96; + r = StringToEnum(indicatorConstantString,a96); + if(r>=0)return r; + ENUM_SYMBOL_CALC_MODE a97; + r = StringToEnum(indicatorConstantString,a97); + if(r>=0)return r; + ENUM_SYMBOL_CHART_MODE a98; + r = StringToEnum(indicatorConstantString,a98); + if(r>=0)return r; + ENUM_SYMBOL_INFO_DOUBLE a99; + r = StringToEnum(indicatorConstantString,a99); + if(r>=0)return r; + ENUM_SYMBOL_INFO_INTEGER a100; + r = StringToEnum(indicatorConstantString,a100); + if(r>=0)return r; + ENUM_SYMBOL_INFO_STRING a101; + r = StringToEnum(indicatorConstantString,a101); + if(r>=0)return r; + ENUM_SYMBOL_OPTION_MODE a102; + r = StringToEnum(indicatorConstantString,a102); + if(r>=0)return r; + ENUM_SYMBOL_OPTION_RIGHT a103; + r = StringToEnum(indicatorConstantString,a103); + if(r>=0)return r; + ENUM_SYMBOL_ORDER_GTC_MODE a104; + r = StringToEnum(indicatorConstantString,a104); + if(r>=0)return r; + ENUM_SYMBOL_SWAP_MODE a105; + r = StringToEnum(indicatorConstantString,a105); + if(r>=0)return r; + ENUM_SYMBOL_TRADE_EXECUTION a106; + r = StringToEnum(indicatorConstantString,a106); + if(r>=0)return r; + ENUM_SYMBOL_TRADE_MODE a107; + r = StringToEnum(indicatorConstantString,a107); + if(r>=0)return r; + ENUM_TERMINAL_INFO_DOUBLE a108; + r = StringToEnum(indicatorConstantString,a108); + if(r>=0)return r; + ENUM_TERMINAL_INFO_INTEGER a109; + r = StringToEnum(indicatorConstantString,a109); + if(r>=0)return r; + ENUM_TERMINAL_INFO_STRING a110; + r = StringToEnum(indicatorConstantString,a110); + if(r>=0)return r; + ENUM_TIMEFRAMES a111; + r = StringToEnum(indicatorConstantString,a111); + if(r>=0)return r; + ENUM_TRADE_REQUEST_ACTIONS a112; + r = StringToEnum(indicatorConstantString,a112); + if(r>=0)return r; + ENUM_TRADE_TRANSACTION_TYPE a113; + r = StringToEnum(indicatorConstantString,a113); + if(r>=0)return r; + + return(-1); + } diff --git a/Indicators/JsonAPIIndicator.mq5 b/Indicators/JsonAPIIndicator.mq5 index 12d06b7..a5dd2e3 100644 --- a/Indicators/JsonAPIIndicator.mq5 +++ b/Indicators/JsonAPIIndicator.mq5 @@ -8,7 +8,7 @@ #property link "https://www.guntherschulz.de" #property version "1.00" -#include +#include #include #include @@ -18,7 +18,7 @@ int CHART_SUB_PORT=15562; // ZeroMQ Cnnections Context context("MQL5 JSON API"); -Socket chartLiveSocket(context,ZMQ_SUB); +Socket chartSubscriptionSocket(context,ZMQ_SUB); //#property indicator_separate_window //#property indicator_buffers 1 @@ -52,14 +52,16 @@ bool first = false; //+------------------------------------------------------------------+ int OnInit() { - bool result = chartLiveSocket.connect(StringFormat("tcp://%s:%d", HOST, CHART_SUB_PORT)); + bool result = chartSubscriptionSocket.connect(StringFormat("tcp://%s:%d", HOST, CHART_SUB_PORT)); if (result == false) {Print("Failed to subscrbe on port ", CHART_SUB_PORT);} else { Print("Accepting Chart Indicator data on port ", CHART_SUB_PORT); - chartLiveSocket.setSubscribe(""); - chartLiveSocket.setLinger(1000); + // TODO subscribe only to own IndicatorId topic + // Subscribe to all topics + chartSubscriptionSocket.setSubscribe(""); + chartSubscriptionSocket.setLinger(1000); // Number of messages to buffer in RAM. - chartLiveSocket.setReceiveHighWaterMark(5); // TODO confirm settings + chartSubscriptionSocket.setReceiveHighWaterMark(5); // TODO confirm settings } //--- indicator buffers mapping; @@ -130,6 +132,9 @@ void SubscriptionHandler(ZmqMsg &chartMsg){ if(message["indicatorChartId"]==IndicatorId) WriteToBuffer(message); } +//+------------------------------------------------------------------+ +//| Update indicator buffer function | +//+------------------------------------------------------------------+ void WriteToBuffer(CJAVal &message) { int bufferSize = ArraySize(Buffer); int messageDataSize = message["data"].Size(); @@ -172,13 +177,16 @@ dependable redraw after calling timer */ +//+------------------------------------------------------------------+ +//| Check for new indicator data function | +//+------------------------------------------------------------------+ void CheckMessages(){ - // Timer() works, when the indicator is manually added to a chart, but not with ChartIndicatorAdd() + // This is a workaround for Timer(). It is needed, because Timer() works, when the indicator is manually added to a chart, but not with ChartIndicatorAdd() ZmqMsg chartMsg; // Recieve chart instructions stream from client via live Chart socket. - chartLiveSocket.recv(chartMsg,true); + chartSubscriptionSocket.recv(chartMsg,true); // Request recived if(chartMsg.size()>0){ @@ -189,6 +197,10 @@ void CheckMessages(){ } } +//+------------------------------------------------------------------+ +//| OnTimer() workaround function | +//+------------------------------------------------------------------+ +// Gets triggered by the OnTimer() function of the JsonAPI Expert script void OnChartEvent(const int id, const long &lparam, const double &dparam,