mirror of
https://github.com/rithsila/MT5-EA-Sniper-Strategy.git
synced 2026-07-27 18:47:57 +00:00
181 lines
13 KiB
Plaintext
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)));
|
|
|
|
}
|
|
//+------------------------------------------------------------------+
|