Forum on trading, automated trading systems and testing trading strategies
When you post code please use the CODE button (Alt-S)!
Why does my EA not plot anything on Strategy Tester Visualization?
Your posted code is not an EA — it is an indicator.
-
int OnCalculate(…){ return(rates_total); }
You do not populate your buffer, so nothing is shown.
-
VWPHandle = rates[0].close * rates[0].real_volume;
A handle is an int not a double. Perhaps you should read the manual, especially the examples.
How To Ask Questions The Smart Way. 2004
How To Interpret Answers.
RTFM and STFW: How To Tell You've Seriously Screwed Up. They all (including iCustom) return a handle (an int). You get that in OnInit. In OnTick (after the indicator has updated its buffers), you use the handle, shift and count to get the data.
Technical Indicators - Reference on algorithmic/automated trading language for MetaTrader 5
Timeseries and Indicators Access / CopyBuffer - Reference on algorithmic/automated trading language for MetaTrader 5
How to start with MQL5 - General - MQL5 programming forum - Page 3 #22 2020.03.08
How to start with MQL5 - MetaTrader 5 - General - MQL5 programming forum - Page 7 #61 2020.07.05
How to call indicators in MQL5 - MQL5 Articles 12 March 2010 -
double BufferVWP[]; double BufferVS[]; double BufferVWAP[]; double BufferVWAPSD[]; double BufferVWAPSQR[];
None of these (except BufferVWAP) are buffers. They are arrays with zero size.
-
int OnInit(){ ⋮ int copied=CopyRates(…
Don't try to use any price or server related functions in OnInit (or on load), as there may be no connection/chart yet:
- Terminal starts.
- Indicators/EAs are loaded. Static and globally declared variables are initialized. (Do not depend on a specific order.)
- OnInit is called.
- For indicators OnCalculate is called with any existing history.
- Human may have to enter password, connection to server begins.
- New history is received, OnCalculate called again.
- New tick is received, OnCalculate/OnTick is called. Now TickValue, TimeCurrent, account information and prices are valid.
//+------------------------------------------------------------------+ //| Anchored_VWAP.mq5 | //| Aabh | //| | //+------------------------------------------------------------------+ #property copyright "Aabh" #property link "" #property version "1.00" #property indicator_chart_window #property indicator_buffers 1 #property indicator_plots 1 #property indicator_type1 DRAW_LINE #property indicator_label1 "VWAP_Daily" #property indicator_color1 clrGhostWhite #property indicator_style1 STYLE_SOLID #property indicator_width1 4 //--- input parameters input int Interval = 1; //bool time; //int startTime = T'0:00:00'; //int endTime = T'23:58:00'; //int startTime = 0; //int endTime = 23; MqlRates rates[]; double volumesum, volume_times_close, vwap_now, vwap_square, vwap_sd, u, x, y, z; double vtc[], v[], vwap[], vwap_sqr[], vwap_SD[]; int arraylimit = 24, i = 0; datetime tm = TimeCurrent(); //gets current time in datetime data type string str = TimeToString(tm,TIME_MINUTES); //changing the data type to a string string current = StringSubstr(str, 0, 2); //selecting the first two characters of the datetime e.g. if it's 5:00:00 then it'll save it as 5, if it's 18 it will save 18. int currentTimeInt = StringToInteger(current); //changes the string to an integer //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { ArraySetAsSeries(rates,true); // ArraySetAsSeries(vwap,true); // ArraySetAsSeries(vwap_SD,true); IndicatorSetInteger(INDICATOR_DIGITS,_Digits); SetIndexBuffer(0,vwap,INDICATOR_DATA); ObjectCreate(0,"VWAP_Daily",OBJ_LABEL,0,0,0); ObjectSetInteger(0,"VWAP_Daily",OBJPROP_CORNER,3); ObjectSetInteger(0,"VWAP_Daily",OBJPROP_XDISTANCE,180); ObjectSetInteger(0,"VWAP_Daily",OBJPROP_YDISTANCE,40); ObjectSetInteger(0,"VWAP_Daily",OBJPROP_COLOR,indicator_color1); ObjectSetInteger(0,"VWAP_Daily",OBJPROP_FONTSIZE,7); ObjectSetString(0,"VWAP_Daily",OBJPROP_FONT,"Verdana"); ObjectSetString(0,"VWAP_Daily",OBJPROP_TEXT," "); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnDeinit(const int pReason) { ObjectDelete(0,"VWAP_Daily"); } void OnTick() { int copied=CopyRates( Symbol(), // symbol name PERIOD_CURRENT, // Don't hard code constants PERIOD_CURRENT 0, // Shift 100, // how many bars back rates // array ); static int LastBarCount = 0; ArrayResize(vtc,arraylimit); ArrayResize(v,arraylimit); ArrayResize(vwap,arraylimit); ArrayResize(vwap_sqr,arraylimit); ArrayResize(vwap_SD,arraylimit); for(i;i<arraylimit;i++) { if (Bars(_Symbol, _Period) > LastBarCount) {LastBarCount = Bars(_Symbol, _Period); Print(LastBarCount); Print(i); Print("bar real volume " + (string) rates[1].tick_volume); Print("bar close " + (string) rates[1].close); volume_times_close = rates[1].tick_volume * rates[1].close; volumesum = rates[1].tick_volume; Print("vtc " + (string) volume_times_close); //volume times close Print("vtc " + (string) volume_times_close); if (i == 0) ArrayFill(vtc,i,1,volume_times_close); else ArrayFill(vtc,i,1,vtc[i-1]+volume_times_close); Print("vtc array " + (string) i + " " + (string) vtc[i]); //volume Print("v " + (string) volumesum); if (i == 0) ArrayFill(v,i,1,volumesum); else ArrayFill(v,i,1,v[i-1]+volumesum); Print("v array " + (string) i + " " + (string) v[i]); //vwap ArrayFill(vwap,i,1,vtc[i]/v[i]); Print("vwap array " + (string) i + " " + (string) vwap[i]); //vwap squared // Print("vwap_sqr " + (string) vwap_square); u = rates[1].close-vwap[i]; Print("u " + u); x = pow(u,2); Print("x " + x); Print("x*volume " + x*volumesum); // y = v[i]; // z = x*v; if (i == 0) ArrayFill(vwap_sqr,i,1,pow((rates[1].close-vwap[i]),2)*volumesum); else ArrayFill(vwap_sqr,i,1,vwap_sqr[i-1]+pow((rates[1].close-vwap[i]),2)*volumesum); Print("vwap_sqr array " + (string) i + " " + (string) vwap_sqr[i]); //vwap standard deviaton ArrayFill(vwap_SD,i,1,MathSqrt(vwap_sqr[i]/v[i])); Print("vwap_SD array " + (string) i + " " + (string) vwap_SD[i]); } else return; } } /* int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { return (rates_total); } */
Hi,
I spent the last few weeks reading documentation and posts on this forum and I have posted in the comment as source code the new code for a vwap and I have tested the output of the data, i.e. arrays and all the data looks good but could someone please help me with what commands I need to add (and under which section) in order that I can plot the vwap[] and vwap_SD[] array data onto the chart?
Eventually my plan is to actually use the vwap and vwap_SD array data as part of my strategy but I would also like to visualize it.
Many thanks in advance.
Aabh

- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
Hi,
I am trying to replicate a strategy on MQL what I have in Thinkscript. I'm starting with one indicator, an anchored intraday VWAP line. I have read forums and watched videos on youtube on how to build an indicator and I do not understand what I am doing incorrectly. Can anybody please point me in the direction of getting this working?
Thanks in advance.
My code: