According to belonging to the on-line trading system MetaTrader 4 there are two types of indicators in MQL4 - technical and custom. Technical indicator is an integral part of the on-line trading system MetaTrader, built-in function that allows drawing on the screen a certain dependence. Each technical indicator calculates a certain predefined dependence.
To draw this dependence graphically on the screen, a technical indicator should be attached to a chart. As a result one or several lines calculated in this indicator will appear in the chart window. Attachment of a technical indicator to a chart. Indicator lines of a technical indicator may be drawn both in the main chart window and in a separate window in the lower part of a security window. In Fig. All technical indicators are built-in, their code is not available for making modifications.
So a user is secured from an erroneous modification of built-in technical indicators. However, the source code, upon which a technical indicator is calculated, is available on the software developer website MetaQuotes Ltd. If needed, a programmer may use the full code or part of it to create custom indicators see Creation of Custom Indicators. Graphical representation visible to a user is displayed by a client terminal.
Further for convenience we will call such drawings 'indicator lines'. Indicator Line is a graphical display of a certain dependence based on numeric values included in an indicator array. Indicator line type is set up by a user.
Indicator line can be displayed in the form of a solid or dashed line, of a specified color, as well as in the form of a chain of certain signs dots, squares, rings, etc. During indicator calculations, sets of numeric values are calculated in it; indicator lines will be drawn in accordance with these calculations.
These value sets are stored in indicator arrays. Indicator Array is a one-dimensional array containing numeric values, in accordance with which indicator lines are constructed. Numeric values of indicator array elements are dots coordinates, upon which an indicator line is drawn. The Y-coordinate of each dot is the value of an indicator array element, X-coordinate is the index value of the indicator array element.
Data storing technology in indicator arrays is the basis of constructing technical and custom indicators. Values of indicator array elements of technical indicators are available from all application programs, including Expert Advisors, scripts and custom indicators. For getting a value of an indicator array element with a certain index in an application program it is necessary to call a built-in function, the name of which is set in accordance with a technical indicator name.Array is an arranged set of values of one-type variables that have a common name.
Arrays can be one-dimensional and multidimensional. The maximum admissible amount of dimensions in an array is four. Arrays of any data types are allowed.
Array element is a part of an array; it is an indexed variable having the same name and some value. Graphical presentation of arrays of integer type: a one-dimensional; b two-dimensional; c three-dimensional.
Array element index is one or several integer values indicated in the form of a constant, variable or expression enumerated comma-separated in square brackets. Array element index uniquely defines place of an element in an array. Array element index is indicated after a variable identifier array name and is an integral part of an array element.
In MQL4 indexing starting form zero is used. The closest everyday analogue of a two-dimensional array is a cinema hall. The row number is the first index value, the number of place in a raw is the value of the second index, viewers are array elements, viewer's surname is the value of an array element, cinema ticket specifying row and place is a method to access the value of an array element.
Before using an array in a program, it must be declared. An array can be declared like a variable on the global and local level. Accordingly, values of global array elements are available to the whole program, values of a local one - only to the function, in which it is declared. An array cannot be declared on the level of a client terminal, that is why global variables of client terminal cannot be gathered into an array.
iMAOnArray: I would like to understand ALL(!) parameters
Array elements values can be of any type. Values of all array elements are of the same type, namely of the type indicated at array declaration. When declaring an array, data type, array name and number of elements of each dimension must be specified:.
Access to array elements is implemented elementwise, i.
Type of array component value is not specified in the program. Array component value can be assigned or changed using the assignment operator:. For example, for the array Mas the element with the smallest indexes value is the element Mas[0,0], the one with maximal indexes values is the element Mas[9,14].
Operations with arrays can also be conducted using standard functions. Some of these functions are analyzed further. An array can be initialized only by constants of a corresponding type. One-dimensional and multi-dimensional arrays are initialized by one-dimensional sequence of constants separated by commas.
The sequence is included into curly brackets:. In the initialized sequence one or several constants can be omitted. In such a case corresponding array elements of numeric type are initialized by zero, elements of arrays of string type are initialized by string value "" quotation marks without a spacei. The next program displays values of arrays, initialized by a sequence with omission of some values script arrayalert.
If the size of a one-dimension initialized array is not specified, it is defined by a compiler based on the initialized sequence. An array can be also initialized by the standard function ArrayInitialize. All arrays are static, i. It means all arrays preserve their values between calls of the function, in which the array is declared see Types of Variables.
All arrays used in MQL4 can be divided into two groups: user-defined arrays created by a programmer's initiative and arrays-timeseries arrays with predefined names and data types.
Defining sizes of user-defined arrays and values of their elements depends on how a program is created and, ultimately, on a programmer's will.Arrays are extensively used when working with charts and indicators so even if you already know what they are it is worth spending a few minutes reviewing them.
To understand the concept of array you must already have a good grasp on variables and data typesoperatorsand you should also know how to create a demo script so that you can test it. Arrays are variables, more specifically, arrays are indexed sequences of data of the same type. So we said that arrays are sequences and the data in the sequence must be of the same type, so for example we can have:. For example:. In the definition of array we can read that is an indexed sequence, this means that the elements are identifiable in the array using an index.
This may be confusing at first but you need to get used to it as the majority of programming languages use the same convention: arrays start to count their elements from 0. The first element of an array is located at index 0 zeroand as a consequence in an array of size 10 with ten elements the last element will be located at the position 9.
There are several ways to populate an array with values, the most popular are manual and using loops For, While for example.The Confusion About Arrays
When working with arrays you will see that loops are one of your best friends. Combining the use of indexes and loops you can play with arrays, scan for information, write values, make calculation and so on. We will see a simple example here where we scan a string array and print its values.
In a particular case of a one-dimensional array of 50 elements, calling of the first element will appear as array, of the last one - as array. Returns index of the first found element in the first array dimension. Returns the result of comparing two arrays of simple types or custom structures without complex objects. Frees up buffer of any dynamic array and sets the size of the zero dimension in 0.
Sets all elements of a numeric array into a single value. Returns the number of elements in the specified dimension of the array. Sets the new size in the first dimension of the array. Sorting of numeric arrays by the first dimension. Copies rates to the two-dimensional array from chart RateInfo array returns copied bars amount. Copies a series array to another one and returns the count of the copied elements. Added functions for quick insertion, deletion, copying and expanding array elements.
The new ArraySwap function swaps the contents of two dynamic arrays of the same type, while the ArrayPrint function allows you to easily print an array of a simple type or a simple structure in the journal. For fast and easy visualization, use the Graphics library containing the functions for fast drawing of five chart types with auto scaling, color selection and line smoothing.
Function Action ArrayBsearch Returns index of the first found element in the first array dimension ArrayCopy Copies one array into another ArrayCompare Returns the result of comparing two arrays of simple types or custom structures without complex objects ArrayFree Frees up buffer of any dynamic array and sets the size of the zero dimension in 0.
ArrayGetAsSeries Checks direction of array indexing ArrayInitialize Sets all elements of a numeric array into a single value ArrayFill Fills an array with the specified value ArrayIsSeries Checks whether an array is a timeseries ArrayIsDynamic Checks whether an array is dynamic ArrayMaximum Search for an element with the maximal value ArrayMinimum Search for an element with the minimal value ArrayRange Returns the number of elements in the specified dimension of the array ArrayResize Sets the new size in the first dimension of the array ArraySetAsSeries Sets the direction of array indexing ArraySize Returns the number of elements in the array ArraySort Sorting of numeric arrays by the first dimension ArrayCopyRates Copies rates to the two-dimensional array from chart RateInfo array returns copied bars amount ArrayCopySeries Copies a series array to another one and returns the count of the copied elements ArrayDimension Returns the multidimensional array rank.
The dark mode beta is finally here. Change your preferences any time. Stack Overflow for Teams is a private, secure spot for you and your coworkers to find and share information.
Can somebody explain me what is the difference between both shift parameters of the iMA function on an example? According to the MQL4 documentation:. Indicators line offset relate to the chart by timeframe. Play with it and verify against the 'Moving Average' indicator bring up Data Window :. A -ve number will request future non-existent periods.
You can try putting a -ve number in the text indicator above to see what you get. So why is it there? Most likely as a standardisation with other indicators, e. This is only relevant to displaying the array values. Not much relevant to coding EA s.
The " shift " is a value of element, taken into calculation. By default, the value of the shift is zero the zero bar the last bar. Any shifts in bars in MQL4 are from the last bar backwards. Example : You compare two SMA. In numbers Lets say the 20 SMA in the last bar is 1.
Lets say the 10 SMA is as follows: 1. In summary. Meaning, a 4 shift represents the MA value 4 bars back. This option is available in coding only, for the purpose of algorithm construction. Learn more.
What do the shift parameters of iMA function mean? Ask Question. Asked 6 years, 8 months ago.I've spent the past week reading about MQL4 and trying to turn an excel model I've been working on for about 5 months now into an EA. I feel like I've gone from the thrilling heights of finally having a working model to the crushing lows of seeing how complicated MQL4 is for someone with no experience outside of if functions in excel.
I've read the Array's section in the book and documentation, and also downloaded a guide for dummies on MQL4, but I'm still struggling -- and dying to finally test my excel EA on a demo account without having to start months of work all over again. From what I've read I need to create an array. I then found the slope of the moving average I used the 4 most recent values of the MA. And so one of my indicators to buy was the steepness of this slope. A second indicator was if the slope value was negative within the last ticks.
That way I'm not going to get onboard when a trend is nearly exhausted and the probability of upwards movement in higher because it's the start of the wave. The final indicator was comparing the correllation of the last ticks against a line with a gradient of 1 e. Also if anyone has any idea about how to calculate the slope of the MA do you have to compare it against another array of numbers like in excel?
Thanks so much in advance, even for reading this far, and so may the forex karma gods smile on you. Then you will need to prevent the counter going below zero and you will need to reindex the array when it is full to make each tick moves up one position in the array. So add some code for that and you end up with something like this:. I think I need to do some more reading about how arrays are indexed but I just thought I'd say thank you first.
So correct me if I'm wrong - or anyone else who uses the code above - the code above creates an array which contains the most recent Bid values and it's updated each time a new tick comes through provided ofcourse I have no server problems and don't miss any ticks, in which case it just skips to the next tick and is no big problem if i'm doing an average of If you are using it in an indicator make sure you do all the tickarray code outside of the main indicator loop so it doesnt fill that array while it is trying to index all the history bars.
I did something wrong in that code, i meant to move all the ticks up one position in the array, I mistakenly wrote the loop so it would move them down one position, so change the line:.
Ill edit my code in the earlier post to reflect that change, sorry about that, I'll test it properly when the price feed starts up again later. I made my model on excel - which essentially is a tick array as the pricing data was tick by tick.
Creation of Custom Indicators
I don't know how to make tick charts and it sounds complicated so I thought it would be easier to put everything in an array. I think this means i can apply the EA to any chart time-period as it's not dependent on the number of bars.
I also have a filter depending on the most recent ticks so i think this means i couldn't use it if i was using the candlesticks. From the array I'll calculate a moving average, a slope, and a correlation with a second array. I've still got to learn how to do all those functions so it'll be a busy week. Thanks again for your help with the code, I'd have no idea where the problem was because this is the first coding I've done.
Using ticks in arrays for a beginner! To add comments, please log in or register. S J In excel: 1. I created a moving average of the last tick points.Mathematical and trigonometric functions are included in MQL4.
There are no difficulties in using most of them. For example, the MathMax function returns the maximum value of two values specified in the list of parameters of the function. The usage of other functions claims certain attention and thoughtfulness. Let's examine one of the functions of this kind. The function returns a numeric value that corresponds the greatest integer that is less or equal to x.
Note that a value returned by the function is the real number double typeat the same time, it is written that the function returns an integer. It should be realized that the function returns a real number that has all the positions equal to zero after the decimal point.
For example, the MathFloor function may return The description says also that the function returns the maximum of possible numbers that is less than a specified one. For example, if the value of the given x parameter is Or if the In such a manner, modification of the sign of the passed to the function value leads to the different results, namely the received values are not equal to each other in absolute magnitude.
Usage of such functions is very convenient, in some cases. Let's examine the fragment of the lots amount calculation for new orders as an example:. The value of the Percent parameter is set by user. According to the rules that are specified by the dealing center, the correctly calculated amount of lots must be divisible by the minimum step of lots changing size Step.
Let's use the numeric values of the variables for better visualization. The In this case, the price of a new order may reach the Spending all these money you can open one new order that has the To calculate the desired amount of lots you should throw away all the "needless" digits in the decimal part and replace them with zeros. The calculated value of MathFloor 1. This value meets the requirements of the dealing center and so can be used as the declared amount of lots in new orders.
To get the detailed information about these and other functions, please refer to the Documentation at MQL4. MathFloor Function double MathFloor double x The function returns a numeric value that corresponds the greatest integer that is less or equal to x. Parameters: x - numeric value.