2 Commits

Author SHA1 Message Date
Gunther Schulz 08b83713af fix compiler failure 2020-11-22 13:15:51 +01:00
Gunther Schulz 775a962d38 format code with new MT5 code styler 2020-11-22 13:14:33 +01:00
2 changed files with 1995 additions and 2294 deletions
+67 -90
View File
@@ -101,6 +101,10 @@ struct ChartWindowIndicator
ChartWindowIndicator chartWindowIndicators[]; ChartWindowIndicator chartWindowIndicators[];
int chartWindowIndicatorCount = 0; int chartWindowIndicatorCount = 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 // Error handling
ControlErrors mControl; ControlErrors mControl;
@@ -345,7 +349,6 @@ int GetChartIndicatorIdxByChartIndicatorId(string indicatorId)
void StreamPriceData() void StreamPriceData()
{ {
// If liveStream == true, push last candle to liveSocket. // If liveStream == true, push last candle to liveSocket.
if(liveStream) if(liveStream)
{ {
CJAVal last; CJAVal last;
@@ -361,7 +364,6 @@ void StreamPriceData()
ENUM_TIMEFRAMES period = GetTimeframe(chartTF); ENUM_TIMEFRAMES period = GetTimeframe(chartTF);
datetime thisBar = 0; datetime thisBar = 0;
float price;
MqlTick tick; MqlTick tick;
MqlRates rates[1]; MqlRates rates[1];
int spread[1]; int spread[1];
@@ -390,6 +392,7 @@ void StreamPriceData()
} }
else else
{ {
;
Data[0] = (long) rates[0].time; Data[0] = (long) rates[0].time;
Data[1] = (double) rates[0].open; Data[1] = (double) rates[0].open;
Data[2] = (double) rates[0].high; Data[2] = (double) rates[0].high;
@@ -398,6 +401,7 @@ void StreamPriceData()
Data[5] = (double) rates[0].tick_volume; Data[5] = (double) rates[0].tick_volume;
Data[6] = (int) spread[0]; Data[6] = (int) spread[0];
} }
last["status"] = (string) "CONNECTED"; last["status"] = (string) "CONNECTED";
last["symbol"] = (string) symbol; last["symbol"] = (string) symbol;
last["timeframe"] = (string) chartTF; last["timeframe"] = (string) chartTF;
@@ -461,19 +465,24 @@ void OnTimer()
// Ensure that all indicators have finished intitailisation // Ensure that all indicators have finished intitailisation
for(int i=0; i<ArraySize(chartWindowIndicators); i++) for(int i=0; i<ArraySize(chartWindowIndicators); i++)
{ {
//CopyBuffer(chartWindowIndicators[i].indicatorHandle, 7, 0, 1, values); // '7' is the number of the 'alive' indicator buffer CopyBuffer(chartWindowIndicators[i].indicatorHandle, 7, 0, 1, values); // '7' is the number of the 'alive' indicator buffer
// Wait for CopyBuffer to return. Ensures that indicator has been initialized
CopyBuffer(chartWindowIndicators[i].indicatorHandle, 0, 0, 1, values); // '7' is the number of the 'alive' indicator buffer
} }
chartIndicatorDataSocket.send(chartMsg,true); chartIndicatorDataSocket.send(chartMsg,true);
} }
// Trigger the indicator JsonAPIIndicator to check for new Messages // Trigger the indicator JsonAPIIndicator to check for new Messages
for(int i=0; i<ArraySize(chartWindows); i++) if(chartWindowTimerCounter >= chartWindowTimerInterval)
{ {
long chartId = chartWindows[i].id; for(int i=0; i<ArraySize(chartWindows); i++)
EventChartCustom(chartId, 222, 222, 222.0); {
long ChartId = chartWindows[i].id;
EventChartCustom(ChartId, 222, 222, 222.0);
}
chartWindowTimerCounter = 0;
} }
else
chartWindowTimerCounter++;
} }
//+------------------------------------------------------------------+ //+------------------------------------------------------------------+
@@ -813,7 +822,6 @@ void OpenChart(CJAVal &dataObject)
CJAVal message; CJAVal message;
message["error"]=(bool) false; message["error"]=(bool) false;
message["chartId"] = (string) chartId; message["chartId"] = (string) chartId;
message["mtChartId"] = (string) chartWindows[idx].id;
string t=message.Serialize(); string t=message.Serialize();
if(debug) if(debug)
@@ -828,16 +836,16 @@ void AddChartIndicator(CJAVal &dataObject)
{ {
string chartIdStr=dataObject["chartId"].ToStr(); string chartIdStr=dataObject["chartId"].ToStr();
string chartIndicatorId=dataObject["chartIndicatorId"].ToStr(); string chartIndicatorId=dataObject["indicatorChartId"].ToStr();
int chartIndicatorSubWindow=dataObject["chartIndicatorSubWindow"].ToInt(); int chartIndicatorSubWindow=dataObject["chartIndicatorSubWindow"].ToInt();
string shortName = dataObject["shortName"].ToStr(); //string shortname = dataObject["style"]["shortname"].ToStr();
int chartIdx = GetChartWindowIdxByChartWindowId(chartIdStr); int chartIdx = GetChartWindowIdxByChartWindowId(chartIdStr);
long chartId = chartWindows[chartIdx].id; long ChartId = chartWindows[chartIdx].id;
double chartIndicatorHandle = iCustom(ChartSymbol(chartId),ChartPeriod(chartId),"JsonAPIIndicator",chartIndicatorId,shortName); //linelabel,colorstyle,linetype,linestyle,linewidth); double chartIndicatorHandle = iCustom(ChartSymbol(ChartId),ChartPeriod(ChartId),"JsonAPIIndicator",chartIndicatorId,"JsonAPI"); //linelabel,colorstyle,linetype,linestyle,linewidth);
if(ChartIndicatorAdd(chartId, chartIndicatorSubWindow, chartIndicatorHandle)) if(ChartIndicatorAdd(ChartId, chartIndicatorSubWindow, chartIndicatorHandle))
{ {
chartWindowIndicatorCount++; chartWindowIndicatorCount++;
ArrayResize(chartWindowIndicators,chartWindowIndicatorCount); ArrayResize(chartWindowIndicators,chartWindowIndicatorCount);
@@ -914,32 +922,6 @@ bool PushHistoricalData(CJAVal &data)
return true; return true;
} }
//+------------------------------------------------------------------+
//| Correct historical tick data |
//+------------------------------------------------------------------+
// Some brokers (markets.com) deliver incorrect historical tick data
// with an incorrect spread.
// This attempts to automatically adjust the
// historical tick data.
// Live bar data is also represented with the same, incorrect spread so we attempt
// to adjust historical tick data by that same amount.
void CorrectTicks(string symbol, MqlTick &copyTicksArray[])
{
MqlTick symbolInfoTick;
double offsetBid, offsetAsk;
int tickCount = ArraySize(copyTicksArray);
SymbolInfoTick(symbol,symbolInfoTick);
offsetBid = copyTicksArray[tickCount-1].bid - symbolInfoTick.bid;
offsetAsk = copyTicksArray[tickCount-1].ask - symbolInfoTick.ask;
for(int i=0; i<tickCount; i++)
{
copyTicksArray[i].bid = copyTicksArray[i].bid - offsetBid;
copyTicksArray[i].ask = copyTicksArray[i].ask - offsetAsk;
}
}
//+------------------------------------------------------------------+ //+------------------------------------------------------------------+
//| Get historical data | //| Get historical data |
//+------------------------------------------------------------------+ //+------------------------------------------------------------------+
@@ -949,7 +931,6 @@ void HistoryInfo(CJAVal &dataObject)
string actionType = dataObject["actionType"].ToStr(); string actionType = dataObject["actionType"].ToStr();
string chartTF = dataObject["chartTF"].ToStr(); string chartTF = dataObject["chartTF"].ToStr();
string symbol=dataObject["symbol"].ToStr(); string symbol=dataObject["symbol"].ToStr();
bool correctTickHistory=dataObject["correctTickHistory"].ToBool();
// Write CVS fle to local directory // Write CVS fle to local directory
if(actionType=="WRITE" && chartTF=="TICK") if(actionType=="WRITE" && chartTF=="TICK")
@@ -986,8 +967,6 @@ void HistoryInfo(CJAVal &dataObject)
CheckError(__FUNCTION__); CheckError(__FUNCTION__);
Print("Preparing data of ", tickCount, " ticks for ", symbol); Print("Preparing data of ", tickCount, " ticks for ", symbol);
if(correctTickHistory)
CorrectTicks(symbol,tickArray);
int file_handle=FileOpen(outputFile, FILE_WRITE | FILE_CSV); int file_handle=FileOpen(outputFile, FILE_WRITE | FILE_CSV);
if(file_handle!=INVALID_HANDLE) if(file_handle!=INVALID_HANDLE)
{ {
@@ -1113,8 +1092,6 @@ void HistoryInfo(CJAVal &dataObject)
tickCount=CopyTicksRange(symbol,tickArray, COPY_TICKS_ALL, 1000*(ulong)fromDateM, 1000*(ulong)toDateM); tickCount=CopyTicksRange(symbol,tickArray, COPY_TICKS_ALL, 1000*(ulong)fromDateM, 1000*(ulong)toDateM);
Print("Preparing tick data of ", tickCount, " ticks for ", symbol); Print("Preparing tick data of ", tickCount, " ticks for ", symbol);
if(correctTickHistory)
CorrectTicks(symbol,tickArray);
if(tickCount) if(tickCount)
{ {
for(int i=0; i<tickCount; i++) for(int i=0; i<tickCount; i++)
@@ -1550,54 +1527,54 @@ ENUM_TIMEFRAMES GetTimeframe(string chartTF)
{ {
ENUM_TIMEFRAMES tf; ENUM_TIMEFRAMES tf;
tf=NULL;
if(chartTF=="TICK") if(chartTF=="TICK")
tf=PERIOD_CURRENT; tf=PERIOD_CURRENT;
else
if(chartTF=="M1") if(chartTF=="M1")
tf=PERIOD_M1; tf=PERIOD_M1;
else
if(chartTF=="M5") if(chartTF=="M5")
tf=PERIOD_M5; tf=PERIOD_M5;
else
if(chartTF=="M15") if(chartTF=="M15")
tf=PERIOD_M15; tf=PERIOD_M15;
else
if(chartTF=="M30") if(chartTF=="M30")
tf=PERIOD_M30; tf=PERIOD_M30;
else
if(chartTF=="H1") if(chartTF=="H1")
tf=PERIOD_H1; tf=PERIOD_H1;
else
if(chartTF=="H2") if(chartTF=="H2")
tf=PERIOD_H2; tf=PERIOD_H2;
else
if(chartTF=="H3") if(chartTF=="H3")
tf=PERIOD_H3; tf=PERIOD_H3;
else
if(chartTF=="H4") if(chartTF=="H4")
tf=PERIOD_H4; tf=PERIOD_H4;
else
if(chartTF=="H6") if(chartTF=="H6")
tf=PERIOD_H6; tf=PERIOD_H6;
else
if(chartTF=="H8") if(chartTF=="H8")
tf=PERIOD_H8; tf=PERIOD_H8;
else
if(chartTF=="H12") if(chartTF=="H12")
tf=PERIOD_H12; tf=PERIOD_H12;
else
if(chartTF=="D1") if(chartTF=="D1")
tf=PERIOD_D1; tf=PERIOD_D1;
else
if(chartTF=="W1") if(chartTF=="W1")
tf=PERIOD_W1; tf=PERIOD_W1;
else
if(chartTF=="MN1") if(chartTF=="MN1")
tf=PERIOD_MN1; tf=PERIOD_MN1;
//error will be raised in config function
//if tf == NULL an error will be raised in config function else
tf=NULL;
return(tf); return(tf);
} }
+75 -351
View File
@@ -21,20 +21,24 @@ Context context("MQL5 JSON API");
Socket chartSubscriptionSocket(context,ZMQ_SUB); Socket chartSubscriptionSocket(context,ZMQ_SUB);
//--- input parameters //--- input parameters
#property indicator_buffers 31 #property indicator_buffers 21
#property indicator_plots 30 #property indicator_plots 20
#property indicator_label1 "JsonAPI"
#property indicator_type1 DRAW_NONE
#property indicator_type2 DRAW_NONE
#property indicator_type3 DRAW_NONE
//#property indicator_color3 CLR_NONE
#property indicator_type4 DRAW_NONE
#property indicator_type5 DRAW_NONE
input string IndicatorId=""; input string IndicatorId="";
input string ShortName="JsonAPIIndicator"; input string ShortName="JsonAPI";
//--- indicator settings //--- indicator settings
double B0[], B1[], B2[], B3[], B4[], B5[], B6[], B7[], B8[], B9[], B10[]; double B0[], B1[], B2[], B3[], B4[], B5[], B6[], B7[], B8[], B9[], B10[], B11[], B12[], B13[], B14[], B15[], B16[], B17[], B18[], B19[], alive[];
double B11[], B12[], B13[], B14[], B15[], B16[], B17[], B18[], B19[], B20[]; bool debug = true;
double B21[], B22[], B23[], B24[], B25[], B26[], B27[], B28[], B29[]; bool first = false;
bool debug = false;
int activeBufferCount = 0; int activeBufferCount = 0;
long mtChartId = 0;
bool setFormingCandleBlank = true;
//+------------------------------------------------------------------+ //+------------------------------------------------------------------+
//| Custom indicator initialization function | //| Custom indicator initialization function |
@@ -50,8 +54,7 @@ int OnInit()
} }
else else
{ {
if(debug) Print("Accepting Chart Indicator data on port ", CHART_SUB_PORT);
Print("Accepting Chart Indicator data on port ", CHART_SUB_PORT);
// TODO subscribe only to own IndicatorId topic // TODO subscribe only to own IndicatorId topic
// Subscribe to all topics // Subscribe to all topics
chartSubscriptionSocket.setSubscribe(""); chartSubscriptionSocket.setSubscribe("");
@@ -61,6 +64,7 @@ int OnInit()
chartSubscriptionSocket.setReceiveHighWaterMark(5); // TODO confirm settings chartSubscriptionSocket.setReceiveHighWaterMark(5); // TODO confirm settings
} }
//--- indicator buffers mapping; //--- indicator buffers mapping;
ArraySetAsSeries(B0,true); ArraySetAsSeries(B0,true);
ArraySetAsSeries(B1,true); ArraySetAsSeries(B1,true);
@@ -82,47 +86,30 @@ int OnInit()
ArraySetAsSeries(B17,true); ArraySetAsSeries(B17,true);
ArraySetAsSeries(B18,true); ArraySetAsSeries(B18,true);
ArraySetAsSeries(B19,true); ArraySetAsSeries(B19,true);
ArraySetAsSeries(B20,true); ArraySetAsSeries(alive,true);
ArraySetAsSeries(B21,true);
ArraySetAsSeries(B22,true); SetIndexBuffer(0,B0,INDICATOR_DATA);
ArraySetAsSeries(B23,true); SetIndexBuffer(1,B1,INDICATOR_DATA);
ArraySetAsSeries(B24,true); SetIndexBuffer(2,B2,INDICATOR_DATA);
ArraySetAsSeries(B25,true); SetIndexBuffer(3,B3,INDICATOR_DATA);
ArraySetAsSeries(B26,true); SetIndexBuffer(4,B4,INDICATOR_DATA);
ArraySetAsSeries(B27,true); SetIndexBuffer(5,B5,INDICATOR_DATA);
ArraySetAsSeries(B28,true); SetIndexBuffer(6,B6,INDICATOR_DATA);
ArraySetAsSeries(B29,true); SetIndexBuffer(7,B7,INDICATOR_DATA);
SetIndexBuffer(8,B8,INDICATOR_DATA);
SetIndexBuffer(9,B9,INDICATOR_DATA);
SetIndexBuffer(10,B10,INDICATOR_DATA);
SetIndexBuffer(11,B11,INDICATOR_DATA);
SetIndexBuffer(12,B12,INDICATOR_DATA);
SetIndexBuffer(13,B13,INDICATOR_DATA);
SetIndexBuffer(14,B14,INDICATOR_DATA);
SetIndexBuffer(15,B15,INDICATOR_DATA);
SetIndexBuffer(16,B16,INDICATOR_DATA);
SetIndexBuffer(17,B17,INDICATOR_DATA);
SetIndexBuffer(18,B18,INDICATOR_DATA);
SetIndexBuffer(19,B19,INDICATOR_DATA);
SetIndexBuffer(20,alive,INDICATOR_CALCULATIONS); // If the buffer index changes, the line starting with "CopyBuffer(chartWindowIndicators[i].indicatorHandle," in JsonAPI.mq5 has to be updated
SetIndexBuffer(0,B0,INDICATOR_CALCULATIONS);
SetIndexBuffer(1,B1,INDICATOR_CALCULATIONS);
SetIndexBuffer(2,B2,INDICATOR_CALCULATIONS);
SetIndexBuffer(3,B3,INDICATOR_CALCULATIONS);
SetIndexBuffer(4,B4,INDICATOR_CALCULATIONS);
SetIndexBuffer(5,B5,INDICATOR_CALCULATIONS);
SetIndexBuffer(6,B6,INDICATOR_CALCULATIONS);
SetIndexBuffer(7,B7,INDICATOR_CALCULATIONS);
SetIndexBuffer(8,B8,INDICATOR_CALCULATIONS);
SetIndexBuffer(9,B9,INDICATOR_CALCULATIONS);
SetIndexBuffer(10,B10,INDICATOR_CALCULATIONS);
SetIndexBuffer(11,B11,INDICATOR_CALCULATIONS);
SetIndexBuffer(12,B12,INDICATOR_CALCULATIONS);
SetIndexBuffer(13,B13,INDICATOR_CALCULATIONS);
SetIndexBuffer(14,B14,INDICATOR_CALCULATIONS);
SetIndexBuffer(15,B15,INDICATOR_CALCULATIONS);
SetIndexBuffer(16,B16,INDICATOR_CALCULATIONS);
SetIndexBuffer(17,B17,INDICATOR_CALCULATIONS);
SetIndexBuffer(18,B18,INDICATOR_CALCULATIONS);
SetIndexBuffer(19,B19,INDICATOR_CALCULATIONS);
SetIndexBuffer(20,B20,INDICATOR_CALCULATIONS);
SetIndexBuffer(21,B21,INDICATOR_CALCULATIONS);
SetIndexBuffer(22,B22,INDICATOR_CALCULATIONS);
SetIndexBuffer(23,B23,INDICATOR_CALCULATIONS);
SetIndexBuffer(24,B24,INDICATOR_CALCULATIONS);
SetIndexBuffer(25,B25,INDICATOR_CALCULATIONS);
SetIndexBuffer(26,B26,INDICATOR_CALCULATIONS);
SetIndexBuffer(27,B27,INDICATOR_CALCULATIONS);
SetIndexBuffer(28,B28,INDICATOR_CALCULATIONS);
SetIndexBuffer(29,B29,INDICATOR_CALCULATIONS);
//--- //---
IndicatorSetString(INDICATOR_SHORTNAME,ShortName); IndicatorSetString(INDICATOR_SHORTNAME,ShortName);
@@ -130,14 +117,6 @@ int OnInit()
return(INIT_SUCCEEDED); return(INIT_SUCCEEDED);
} }
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// Print("INDI DEINIT ",reason);
}
//+------------------------------------------------------------------+ //+------------------------------------------------------------------+
//| | //| |
@@ -165,11 +144,9 @@ int OnCalculate(const int rates_total,
const long &volume[], const long &volume[],
const int &spread[]) const int &spread[])
{ {
// While a new candle is forming, set the current value to be empty // While a new candle is forming, set the current value to be empty
if(rates_total>prev_calculated)
if(rates_total>prev_calculated && setFormingCandleBlank)
{ {
B0[0] = EMPTY_VALUE; B0[0] = EMPTY_VALUE;
B1[0] = EMPTY_VALUE; B1[0] = EMPTY_VALUE;
@@ -191,17 +168,10 @@ int OnCalculate(const int rates_total,
B17[0] = EMPTY_VALUE; B17[0] = EMPTY_VALUE;
B18[0] = EMPTY_VALUE; B18[0] = EMPTY_VALUE;
B19[0] = EMPTY_VALUE; B19[0] = EMPTY_VALUE;
B20[0] = EMPTY_VALUE;
B21[0] = EMPTY_VALUE;
B22[0] = EMPTY_VALUE;
B23[0] = EMPTY_VALUE;
B24[0] = EMPTY_VALUE;
B25[0] = EMPTY_VALUE;
B26[0] = EMPTY_VALUE;
B27[0] = EMPTY_VALUE;
B28[0] = EMPTY_VALUE;
B29[0] = EMPTY_VALUE;
} }
if(first==false)
alive[0] = 1;
// ChartRedraw(0);
//--- return value of prev_calculated for next call //--- return value of prev_calculated for next call
return(rates_total); return(rates_total);
@@ -223,163 +193,52 @@ void SubscriptionHandler(ZmqMsg &chartMsg)
Alert("Deserialization Error"); Alert("Deserialization Error");
ExpertRemove(); ExpertRemove();
} }
if(message["chartIndicatorId"]==IndicatorId) if(message["indicatorChartId"]==IndicatorId)
{ {
if(message["action"]=="PLOT" && message["actionType"]=="DATA") if(message["action"]=="PLOT" && message["actionType"]=="DATA")
{ {
int bufferIdx = message["indicatorBufferId"].ToInt(); int bufferIdx = message["indicatorBufferId"].ToInt();
if(bufferIdx == 0) if(bufferIdx == 0)
{
WriteToBuffer(message, B0); WriteToBuffer(message, B0);
SetIndexBuffer(0,B0,INDICATOR_DATA);
}
if(bufferIdx == 1) if(bufferIdx == 1)
{
WriteToBuffer(message, B1); WriteToBuffer(message, B1);
SetIndexBuffer(1,B1,INDICATOR_DATA);
}
if(bufferIdx == 2) if(bufferIdx == 2)
{
WriteToBuffer(message, B2); WriteToBuffer(message, B2);
SetIndexBuffer(2,B2,INDICATOR_DATA);
}
if(bufferIdx == 3) if(bufferIdx == 3)
{
WriteToBuffer(message, B3); WriteToBuffer(message, B3);
SetIndexBuffer(3,B3,INDICATOR_DATA);
}
if(bufferIdx == 4) if(bufferIdx == 4)
{
WriteToBuffer(message, B4); WriteToBuffer(message, B4);
SetIndexBuffer(4,B4,INDICATOR_DATA);
}
if(bufferIdx == 5) if(bufferIdx == 5)
{
WriteToBuffer(message, B5); WriteToBuffer(message, B5);
SetIndexBuffer(5,B5,INDICATOR_DATA);
}
if(bufferIdx == 6) if(bufferIdx == 6)
{
WriteToBuffer(message, B6); WriteToBuffer(message, B6);
SetIndexBuffer(6,B6,INDICATOR_DATA);
}
if(bufferIdx == 7) if(bufferIdx == 7)
{
WriteToBuffer(message, B7); WriteToBuffer(message, B7);
SetIndexBuffer(7,B7,INDICATOR_DATA);
}
if(bufferIdx == 8) if(bufferIdx == 8)
{
WriteToBuffer(message, B8); WriteToBuffer(message, B8);
SetIndexBuffer(8,B8,INDICATOR_DATA);
}
if(bufferIdx == 9) if(bufferIdx == 9)
{
WriteToBuffer(message, B9); WriteToBuffer(message, B9);
SetIndexBuffer(9,B9,INDICATOR_DATA);
}
if(bufferIdx == 10) if(bufferIdx == 10)
{
WriteToBuffer(message, B10); WriteToBuffer(message, B10);
SetIndexBuffer(10,B10,INDICATOR_DATA);
}
if(bufferIdx == 11) if(bufferIdx == 11)
{
WriteToBuffer(message, B11); WriteToBuffer(message, B11);
SetIndexBuffer(11,B11,INDICATOR_DATA);
}
if(bufferIdx == 12) if(bufferIdx == 12)
{
WriteToBuffer(message, B12); WriteToBuffer(message, B12);
SetIndexBuffer(12,B12,INDICATOR_DATA);
}
if(bufferIdx == 13) if(bufferIdx == 13)
{
WriteToBuffer(message, B13); WriteToBuffer(message, B13);
SetIndexBuffer(13,B13,INDICATOR_DATA);
}
if(bufferIdx == 14) if(bufferIdx == 14)
{
WriteToBuffer(message, B14); WriteToBuffer(message, B14);
SetIndexBuffer(14,B14,INDICATOR_DATA);
}
if(bufferIdx == 15) if(bufferIdx == 15)
{
WriteToBuffer(message, B15); WriteToBuffer(message, B15);
SetIndexBuffer(15,B15,INDICATOR_DATA);
}
if(bufferIdx == 16) if(bufferIdx == 16)
{
WriteToBuffer(message, B16); WriteToBuffer(message, B16);
SetIndexBuffer(16,B16,INDICATOR_DATA);
}
if(bufferIdx == 17) if(bufferIdx == 17)
{
WriteToBuffer(message, B17); WriteToBuffer(message, B17);
SetIndexBuffer(17,B17,INDICATOR_DATA);
}
if(bufferIdx == 18) if(bufferIdx == 18)
{
WriteToBuffer(message, B18); WriteToBuffer(message, B18);
SetIndexBuffer(18,B18,INDICATOR_DATA);
}
if(bufferIdx == 19) if(bufferIdx == 19)
{
WriteToBuffer(message, B19); WriteToBuffer(message, B19);
SetIndexBuffer(19,B19,INDICATOR_DATA);
}
if(bufferIdx == 20)
{
WriteToBuffer(message, B20);
SetIndexBuffer(20,B20,INDICATOR_DATA);
}
if(bufferIdx == 21)
{
WriteToBuffer(message, B21);
SetIndexBuffer(21,B21,INDICATOR_DATA);
}
if(bufferIdx == 22)
{
WriteToBuffer(message, B22);
SetIndexBuffer(22,B22,INDICATOR_DATA);
}
if(bufferIdx == 23)
{
WriteToBuffer(message, B23);
SetIndexBuffer(23,B23,INDICATOR_DATA);
}
if(bufferIdx == 24)
{
WriteToBuffer(message, B24);
SetIndexBuffer(24,B24,INDICATOR_DATA);
}
if(bufferIdx == 25)
{
WriteToBuffer(message, B25);
SetIndexBuffer(25,B25,INDICATOR_DATA);
}
if(bufferIdx == 26)
{
WriteToBuffer(message, B26);
SetIndexBuffer(26,B26,INDICATOR_DATA);
}
if(bufferIdx == 27)
{
WriteToBuffer(message, B27);
SetIndexBuffer(27,B27,INDICATOR_DATA);
}
if(bufferIdx == 28)
{
WriteToBuffer(message, B28);
SetIndexBuffer(28,B28,INDICATOR_DATA);
}
if(bufferIdx == 29)
{
WriteToBuffer(message, B29);
SetIndexBuffer(29,B29,INDICATOR_DATA);
}
ChartRedraw(mtChartId);
} }
else else
if(message["action"]=="PLOT" && message["actionType"]=="ADDBUFFER") if(message["action"]=="PLOT" && message["actionType"]=="ADDBUFFER")
@@ -389,165 +248,30 @@ void SubscriptionHandler(ZmqMsg &chartMsg)
string linetypeStr = message["style"]["linetype"].ToStr(); string linetypeStr = message["style"]["linetype"].ToStr();
string linestyleStr = message["style"]["linestyle"].ToStr(); string linestyleStr = message["style"]["linestyle"].ToStr();
int linewidth = message["style"]["linewidth"].ToInt(); int linewidth = message["style"]["linewidth"].ToInt();
setFormingCandleBlank = message["style"]["blankforming"].ToBool();
color colorstyle = StringToColor(colorstyleStr); color colorstyle = StringToColor(colorstyleStr);
int linetype = StringToEnumInt(linetypeStr); int linetype = StringToEnumInt(linetypeStr);
int linestyle = StringToEnumInt(linestyleStr); int linestyle = StringToEnumInt(linestyleStr);
/*
//if (aa == false) {
Print("SETBUFF ActCount ",activeBufferCount);
if (activeBufferCount == 0) {SetIndexBuffer(0,B1,INDICATOR_DATA);} // Two semicolons ar required! No idea why. Seems to be a timing problem, better to keep it in init()
if (activeBufferCount == 1) {SetIndexBuffer(1,B2,INDICATOR_DATA);;}
if (activeBufferCount == 2) {SetIndexBuffer(2,B3,INDICATOR_DATA);;}
if (activeBufferCount == 3) {SetIndexBuffer(3,B4,INDICATOR_DATA);;}
if (activeBufferCount == 4) {SetIndexBuffer(4,B5,INDICATOR_DATA);;}
//aa = true;}
*/
SetStyle(activeBufferCount, linelabel, colorstyle, linetype, linestyle, linewidth); SetStyle(activeBufferCount, linelabel, colorstyle, linetype, linestyle, linewidth);
activeBufferCount = activeBufferCount + 1; activeBufferCount = activeBufferCount + 1;
ClearBuffer(activeBufferCount-1);
} }
} }
} }
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void Clear(double &buffer[])
{
int bufferSize = ArraySize(buffer);
for(int i=0; i<bufferSize; i++)
{
buffer[i] = EMPTY_VALUE;
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void ClearBuffer(int bufferIdx)
{
switch(bufferIdx)
{
case 0:
{
Clear(B0);
}
case 1:
{
Clear(B1);
}
case 2:
{
Clear(B2);
}
case 3:
{
Clear(B3);
}
case 4:
{
Clear(B4);
}
case 5:
{
Clear(B5);
}
case 6:
{
Clear(B6);
}
case 7:
{
Clear(B7);
}
case 8:
{
Clear(B8);
}
case 9:
{
Clear(B9);
}
case 10:
{
Clear(B10);
}
case 11:
{
Clear(B11);
}
case 12:
{
Clear(B12);
}
case 13:
{
Clear(B13);
}
case 14:
{
Clear(B14);
}
case 15:
{
Clear(B15);
}
case 16:
{
Clear(B16);
}
case 17:
{
Clear(B17);
}
case 18:
{
Clear(B18);
}
case 19:
{
Clear(B19);
}
case 20:
{
Clear(B20);
}
case 21:
{
Clear(B21);
}
case 22:
{
Clear(B22);
}
case 23:
{
Clear(B23);
}
case 24:
{
Clear(B24);
}
case 25:
{
Clear(B25);
}
case 26:
{
Clear(B26);
}
case 27:
{
Clear(B27);
}
case 28:
{
Clear(B28);
}
case 29:
{
Clear(B29);
}
break;
default:
{} break;
}
}
//+------------------------------------------------------------------+ //+------------------------------------------------------------------+
//| Update indicator buffer function | //| Update indicator buffer function |
//+------------------------------------------------------------------+ //+------------------------------------------------------------------+
@@ -555,32 +279,32 @@ void WriteToBuffer(CJAVal &message, double &buffer[])
{ {
int bufferSize = ArraySize(buffer); int bufferSize = ArraySize(buffer);
int messageDataSize = message["data"].Size(); int messageDataSize = message["data"].Size();
// TODO check if this is working as expected. Seems to
if(first==false)
{
for(int i=0; i<activeBufferCount; i++)
{
//Print("BUFF ",bufferSize-messageDataSize, " ",ArraySize(B2)," ", ArraySize(B3), " ",messageDataSize);
PlotIndexSetInteger(i,PLOT_DRAW_BEGIN,bufferSize-messageDataSize);
}
first = true;
}
// calculate the buffer offset
MqlRates r[];
mtChartId =(datetime)message["mtChartId"].ToInt();
datetime fromDate=(datetime)message["fromDate"].ToInt();
datetime toDate=TimeCurrent();
ENUM_TIMEFRAMES period = ChartPeriod(mtChartId);
string symbol = ChartSymbol(mtChartId);
int rateCount;
rateCount = CopyRates(symbol, period, fromDate, toDate, r);
int offset = rateCount - 1;
// write to buffer
for(int i=0; i<messageDataSize; i++) for(int i=0; i<messageDataSize; i++)
{ {
// don't add more elements than the automatically sized buffer array can // don't add more elements than the automatically sized buffer array can hold
if(i+offset<bufferSize) if(i+1<bufferSize)
{ {
double val = message["data"][i].ToDbl(); // the first element is the current unformed candle, so we start at index 1
if(val >= EMPTY_VALUE) // we reverse the order of the incoming values, which are expected to be ascending
val = EMPTY_VALUE; //buffer[i+1] = message["data"][messageDataSize-1-i].ToDbl();
buffer[i+offset] = val; buffer[i+1] = message["data"][messageDataSize-1-i].ToDbl();
} }
} }
// Set the most recent plotted value to nothing, as we do not have any data for yet unformed candles
buffer[0] = EMPTY_VALUE;
} }