76 lines
2.5 KiB
MQL5
76 lines
2.5 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| Copyright (C) 2026, boyvlad |
|
|
//| https://www.mql5.com/en/users/boyvlad |
|
|
//+------------------------------------------------------------------+
|
|
|
|
//--- Do not remove!
|
|
#property tester_everytick_calculate
|
|
//---
|
|
#property indicator_chart_window
|
|
#property indicator_buffers 1
|
|
#property indicator_plots 1
|
|
//---
|
|
#property indicator_type1 DRAW_LINE
|
|
#property indicator_color1 clrOrange
|
|
#property indicator_style1 STYLE_SOLID
|
|
#property indicator_width1 2
|
|
#property indicator_label1 "Applied price"
|
|
//---
|
|
#property copyright "Copyright (C) 2026, boyvlad"
|
|
#property link "https://www.mql5.com/en/users/boyvlad"
|
|
|
|
input(name="Price") ENUM_APPLIED_PRICE inpAppliedPrice = PRICE_CLOSE;
|
|
|
|
double buffer[];
|
|
|
|
int OnInit()
|
|
{
|
|
SetIndexBuffer(0, buffer, INDICATOR_DATA);
|
|
return INIT_SUCCEEDED;
|
|
}
|
|
|
|
int OnCalculate(const int32_t rates_total,
|
|
const int32_t 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 int32_t &spread[])
|
|
{
|
|
if(rates_total < 2 || rates_total < prev_calculated)
|
|
{
|
|
PrintFormat(__FUNCTION__" Something went wrong. rates_total %i, prev_calculated %i", rates_total, prev_calculated);
|
|
return 0;
|
|
}
|
|
int barIdxToRecalcFrom;
|
|
switch(rates_total - prev_calculated)
|
|
{
|
|
case 0:
|
|
case 1:
|
|
barIdxToRecalcFrom = prev_calculated - 1;
|
|
break;
|
|
default:
|
|
barIdxToRecalcFrom = 0;
|
|
break;
|
|
}
|
|
for(int i = barIdxToRecalcFrom; i < rates_total; i++)
|
|
buffer[i] = calculate(i, inpAppliedPrice, open, high, low, close);
|
|
return rates_total;
|
|
}
|
|
|
|
double calculate(int barIdx, ENUM_APPLIED_PRICE a_mode, const double &open[], const double &high[], const double &low[], const double &close[])
|
|
{
|
|
switch(a_mode)
|
|
{
|
|
case PRICE_OPEN: return open[barIdx];
|
|
case PRICE_HIGH: return high[barIdx];
|
|
case PRICE_LOW: return low[barIdx];
|
|
case PRICE_MEDIAN: return (high[barIdx] + low[barIdx]) / 2.0;
|
|
case PRICE_TYPICAL: return (high[barIdx] + low[barIdx] + close[barIdx]) / 3.0;
|
|
case PRICE_WEIGHTED: return (high[barIdx] + low[barIdx] + close[barIdx] + close[barIdx]) / 4.0;
|
|
default: return close[barIdx];
|
|
}
|
|
}
|