Files
MT5-EA-Sniper-Strategy/MQL5/Experts/Nkanven/AsianBreak.mq5
T
2022-11-28 16:07:29 +01:00

181 lines
13 KiB
Plaintext

//+------------------------------------------------------------------+
//| AsianBreak.mq5 |
//| Copyright 2022, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
input int MaxCandleIteration=50; //Max candles to check for trading range boundaries
input string AsianStart="22:00"; //Trading Boundary Hour
input string AsianEnd="07:00"; //Trading Boundary minute
input double rangemargin=0.0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
double newHigh, newLow;
bool rangeUpdated = false;
double High[];
double Low[];
string server_time;
double upper_boundary, lower_boundary; //Trading range boundaries
long current_chart_id = ChartID();
int asianStartIndex, asianEndIndex;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
//Get asian high and low
drawRange();
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void drawRange()
{
string candles_times, candles_date, todayi;
int time_to_string, date_to_string;
ushort a, b;
string d_time = TimeToString(iTime(Symbol(),PERIOD_M30,0), TIME_MINUTES);
string open_hour[];
string obj_name = "Upper boundary", obj_name_l = "Lower boundary";
ArraySetAsSeries(High,true);
CopyHigh(_Symbol,_Period,0,MaxCandleIteration,High);
ArraySetAsSeries(Low,true);
CopyLow(_Symbol,_Period,0,MaxCandleIteration,Low);
//--- Get the separator code
a = StringGetCharacter(":",0);
b = StringGetCharacter(".",0);
todayi = TimeToString(iTime(Symbol(),_Period,0), TIME_DATE);
int k = StringSplit(d_time, a, open_hour);
if(k>0)
{
server_time = "Server time on last 5 Min candle => Hour = " +open_hour[0]+ ", Minute = " +open_hour[1];
}
// Get trading range
for(int j = 0; j <= MaxCandleIteration; j++)
{
Print("Index ", j);
string result[], datei[];
candles_times = TimeToString(iTime(Symbol(),_Period,j), TIME_MINUTES);
candles_date = TimeToString(iTime(Symbol(),_Period,j), TIME_DATE);
date_to_string = StringSplit(candles_date, b, datei);
time_to_string = StringSplit(candles_times, a, result);
Print("date_to_string ", datei[0], " ", datei[1], " ", datei[2]);
Print(candles_times, " ", iTime(Symbol(),_Period,j), " date ", candles_date);
Print("Is trading boundary "+(result[0] == AsianStart && result[1] == AsianEnd));
if(candles_times == AsianStart)
{
asianStartIndex = j;
break;
}
if(candles_times == AsianEnd && todayi == candles_date)
{
asianEndIndex = j;
}
//ObjectDelete(current_chart_id, obj_name_l);
//ObjectDelete(current_chart_id, obj_name);
//In_Trade = false;
}
Print("Endindex ", asianEndIndex, "Startindex", asianStartIndex);
double val, valo;
int val_indexw;
//--- Calculation of the highest Close value among 20 consecutive bars
//--- From index 4 to index 23 inclusive, on the current timeframe
int val_index=iHighest(NULL,0,MODE_HIGH,asianStartIndex+1,asianStartIndex);
if(val_index!=-1)
val=High[val_index];
else
PrintFormat("iHighest() call error. Error code=%d",GetLastError());
if(asianEndIndex == 0)
{
val_indexw=iLowest(NULL,0,MODE_LOW,asianStartIndex-1,0);
if(val_indexw!=-1)
valo=Low[val_indexw];
else
PrintFormat("iHighest() call error. Error code=%d",GetLastError());
}
else
{
val_indexw=iLowest(NULL,0,MODE_LOW,10,asianEndIndex);
if(val_indexw!=-1)
valo=Low[val_indexw];
else
PrintFormat("iHighest() call error. Error code=%d",GetLastError());
}
Print("val ", val, " valo", valo);
Print(iTime(Symbol(),_Period,asianEndIndex));
Print(iTime(Symbol(),_Period,asianStartIndex));
if(!rangeUpdated)
{
upper_boundary = val + rangemargin;
lower_boundary = valo - rangemargin;
}
Print("upper_boundary ", upper_boundary, "lower_boundary ", lower_boundary);
//Print("Iteration no "+iTime(Symb,PERIOD_M5,j));
ObjectCreate(current_chart_id, obj_name, OBJ_HLINE, 0, iTime(Symbol(),_Period,0), upper_boundary);
//--- set color to Red
ObjectSetInteger(current_chart_id, obj_name, OBJPROP_COLOR, clrRed);
//--- set object width
ObjectSetInteger(current_chart_id, obj_name, OBJPROP_WIDTH, 2);
//--- Move the line
ObjectMove(current_chart_id, obj_name, 0, iTime(Symbol(),_Period,0), upper_boundary);
ObjectCreate(current_chart_id, obj_name_l, OBJ_HLINE, 0, iTime(Symbol(),_Period,0), lower_boundary);
//--- set color to Red
ObjectSetInteger(current_chart_id, obj_name_l, OBJPROP_COLOR, clrRed);
//--- set object width
ObjectSetInteger(current_chart_id, obj_name_l, OBJPROP_WIDTH, 2);
//--- Move the line
ObjectMove(current_chart_id, obj_name_l, 0, iTime(Symbol(),_Period,0), lower_boundary);
//Print("upper_boundary ", upper_boundary, " lower_boundary ", lower_boundary);
//Print("Real high ", iHigh(Symb, PERIOD_M5, j), " Real low ", iLow(Symb, PERIOD_M5, j), " as of ", TimeToString(iTime(Symb,PERIOD_M5, j)));
}
//+------------------------------------------------------------------+