129 lines
4.4 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| Fair_Value_Gap.mq5 |
| |||
//| Copyright 2024, Rajesh Kumar Nait |
| |||
//| https://www.mql5.com/en/users/rajeshnait/seller |
| |||
//+------------------------------------------------------------------+
| |||
#property copyright "Copyright 2024, Rajesh Kumar Nait"
| |||
#property link "https://www.mql5.com/en/users/rajeshnait/seller"
| |||
#property version "1.00"
| |||
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
#include "..\\Utils\\MetricSaver.mqh"
| |||
| |||
| |||
// https://www.mql5.com/en/code/48116 (convertido a EA)
| |||
| |||
//--- input parameters
| |||
input color InpColorToUP = clrLime; // Color of the gap up
| |||
input color InpColorToDN = clrDeepPink; // Color of the gap down
| |||
input int maxbars = 300;// how many bars to Look back
| |||
| |||
string prefix;
| |||
double price;
| |||
datetime lastBarTime = 0;
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Expert initialization function |
| |||
//+------------------------------------------------------------------+
| |||
int OnInit() {
| |||
//--- indicator buffers mapping
| |||
CMetricsSave::Start(FILE_CODE3);
| |||
prefix=MQLInfoString(MQL_PROGRAM_NAME)+"_";
| |||
//---
| |||
return(INIT_SUCCEEDED);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Expert deinitialization function |
| |||
//+------------------------------------------------------------------+
| |||
void OnDeinit(const int reason) {
| |||
ObjectsDeleteAll(0,prefix);
| |||
ChartRedraw();
| |||
CMetricsSave::Destroy();
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Expert tick function |
| |||
//+------------------------------------------------------------------+
| |||
void OnTick() {
| |||
//---
| |||
datetime currentBarTime = iTime(_Symbol, PERIOD_CURRENT, 0);
| |||
if(lastBarTime == currentBarTime)
| |||
return;
| |||
lastBarTime = currentBarTime;
| |||
| |||
MqlRates rates[];
| |||
int copied = CopyRates(_Symbol, PERIOD_CURRENT, 0, maxbars + 10, rates);
| |||
if(copied < 4) return;
| |||
| |||
datetime time[];
| |||
double open[];
| |||
double high[];
| |||
double low[];
| |||
double close[];
| |||
| |||
ArrayResize(time, copied);
| |||
ArrayResize(open, copied);
| |||
ArrayResize(high, copied);
| |||
ArrayResize(low, copied);
| |||
ArrayResize(close, copied);
| |||
| |||
for(int i = 0; i < copied; i++)
| |||
{
| |||
time[i] = rates[i].time;
| |||
open[i] = rates[i].open;
| |||
high[i] = rates[i].high;
| |||
low[i] = rates[i].low;
| |||
close[i] = rates[i].close;
| |||
}
| |||
| |||
int rates_total = copied;
| |||
| |||
price = close[0];
| |||
ArraySetAsSeries(open,true);
| |||
ArraySetAsSeries(high,true);
| |||
ArraySetAsSeries(low,true);
| |||
ArraySetAsSeries(close,true);
| |||
ArraySetAsSeries(time,true);
| |||
| |||
for(int i=maxbars; i>=0 && !IsStopped(); i--) {
| |||
if(low[i]-high[i+2]>=Point()) {
| |||
| |||
double up=fmin(high[i],low[i]);
| |||
double dn=fmax(high[i+2],low[i+2]);
| |||
| |||
DrawArea(i,up,dn,time,InpColorToUP,1);
| |||
| |||
}
| |||
if(low[i+2]-high[i]>=Point()) {
| |||
| |||
double up=fmin(high[i+2],low[i+2]);
| |||
double dn=fmax(high[i],low[i]);
| |||
DrawArea(i,up,dn,time,InpColorToDN,0);
| |||
| |||
}
| |||
}
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
void DrawArea(const int index, const double price_up,const double price_dn,const datetime &time[],const color color_area,const char dir) {
| |||
string name=prefix+(dir>0 ? "up_" : "dn_")+TimeToString(time[index]);
| |||
| |||
if(ObjectFind(0,name)<0 )
| |||
ObjectCreate(0,name,OBJ_RECTANGLE,0,0,0,0);
| |||
ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
| |||
ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);
| |||
ObjectSetInteger(0,name,OBJPROP_FILL,true);
| |||
ObjectSetInteger(0,name,OBJPROP_BACK,true);
| |||
ObjectSetString(0,name,OBJPROP_TOOLTIP,"\n");
| |||
//---
| |||
ObjectSetInteger(0,name,OBJPROP_COLOR,color_area);
| |||
ObjectSetInteger(0,name,OBJPROP_TIME,0,time[index+2]);
| |||
ObjectSetInteger(0,name,OBJPROP_TIME,1,time[index]);
| |||
ObjectSetDouble(0,name,OBJPROP_PRICE,0,price_up);
| |||
ObjectSetDouble(0,name,OBJPROP_PRICE,1,price_dn);
| |||
| |||
}
| |||
//+------------------------------------------------------------------+
|