killzonessessionpivots.mq5
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «killzonessessionpivots.mq5» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Индикатор рисует сессионные блоки (killzones) в новом времени, отображая высокую и низкую цену каждой сессии, а также её среднюю линию. Поддерживает до пяти настраиваемых сессий с возможностью продления уровней до их пробоя и отправки оповещений при срабатывании. На графике отображаются уровни предыдущих дня, недели и месяца, линии цены открытия и вертикальные маркеры в заданные моменты времени. Всё построено на объектах графика без использования торговых API.
Настройки программы
| Настройка | Описание |
|---|---|
| session 1 name (InpS1Name) | Название сессии 1 — Имя первой торговой сессии |
| session 1 time (InpS1Time) | Время сессии 1 — Время начала и окончания первой сессии в формате ЧЧММ-ЧЧММ |
| session 1 color (InpS1Color) | Цвет сессии 1 — Цвет рисования первой сессии |
| session 2 name (InpS2Name) | Название сессии 2 — Имя второй торговой сессии |
| session 2 time (InpS2Time) | Время сессии 2 — Время начала и окончания второй сессии в формате ЧЧММ-ЧЧММ |
| session 2 color (InpS2Color) | Цвет сессии 2 — Цвет рисования второй сессии |
| session 3 name (InpS3Name) | Название сессии 3 — Имя третьей торговой сессии |
| session 3 time (InpS3Time) | Время сессии 3 — Время начала и окончания третьей сессии в формате ЧЧММ-ЧЧММ |
| session 3 color (InpS3Color) | Цвет сессии 3 — Цвет рисования третьей сессии |
| session 4 name (InpS4Name) | Название сессии 4 — Имя четвёртой торговой сессии |
| session 4 time (InpS4Time) | Время сессии 4 — Время начала и окончания четвёртой сессии в формате ЧЧММ-ЧЧММ |
| session 4 color (InpS4Color) | Цвет сессии 4 — Цвет рисования четвёртой сессии |
| session 5 name (InpS5Name) | Название сессии 5 — Имя пятой торговой сессии |
| session 5 time (InpS5Time) | Время сессии 5 — Время начала и окончания пятой сессии в формате ЧЧММ-ЧЧММ |
| session 5 color (InpS5Color) | Цвет сессии 5 — Цвет рисования пятой сессии |
| sessions kept on the chart (InpKeep) | Количество сохраняемых сессий — Число последних сессий, отображаемых на графике |
| box opacity, percent (InpBoxOpacity) | Прозрачность блоков — Процент прозрачности заливки сессионных блоков |
| draw session high and low (InpPivots) | Отображение уровней высока и низа — Рисует линии высока и низа каждой сессии |
| draw session midpoint (InpMid) | Отображение средней линии — Рисует среднюю линию сессии между высоком и низом |
| label the pivots (InpPivotTags) | Метки уровней — Отображает текстовые метки у линий высока и низа |
| extend pivots (InpExtension) | Продление уровней — Определяет, как долго продлеваются линии высока и низа |
| alert when a high or low is taken (InpAlerts) | Оповещения о срабатывании — Отправляет оповещение, когда цена берёт высок или низ сессии |
| previous day levels (InpDayLevels) | Уровни предыдущего дня — Отображает линии высока, низа и средней линии предыдущего дня |
| day color (InpDayColor) | Цвет дня — Цвет рисования уровней предыдущего дня |
| previous week levels (InpWeekLevels) | Уровни предыдущей недели — Отображает линии высока, низа и средней линии предыдущей недели |
| week color (InpWeekColor) | Цвет недели — Цвет рисования уровней предыдущей недели |
| previous month levels (InpMonthLevels) | Уровни предыдущего месяца — Отображает линии высока, низа и средней линии предыдущего месяца |
| month color (InpMonthColor) | Цвет месяца — Цвет рисования уровней предыдущего месяца |
| opening-price line at each time (InpOpens) | Линии открытия — Рисует горизонтальную линию цены открытия в заданные моменты времени |
| vertical marker at each time (InpMarks) | Вертикальные маркеры времени — Рисует вертикальные маркеры в заданные моменты времени |
| time 1 (InpK1Time) | Время 1 — Первое время для линии открытия и маркера |
| time 1 label (InpK1Name) | Метка времени 1 — Текстовая метка первого временного слота |
| time 1 color (InpK1Color) | Цвет времени 1 — Цвет рисования первого временного слота |
| time 2 (InpK2Time) | Время 2 — Второе время для линии открытия и маркера |
| time 2 label (InpK2Name) | Метка времени 2 — Текстовая метка второго временного слота |
| time 2 color (InpK2Color) | Цвет времени 2 — Цвет рисования второго временного слота |
| time 3 (InpK3Time) | Время 3 — Третье время для линии открытия и маркера |
| time 3 label (InpK3Name) | Метка времени 3 — Текстовая метка третьего временного слота |
| time 3 color (InpK3Color) | Цвет времени 3 — Цвет рисования третьего временного слота |
| draw only up to this timeframe (InpMaxPeriod) | Максимальный таймфрейм — Ограничивает отрисовку индикатора до указанного таймфрейма включительно |
Поиск по коду файла
#property version "1.04"
#property description "ICT killzones in New York time with session pivots, previous day, week"
#property description "and month levels, and opening-price lines at key times."
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots 0
enum ENUM_EXTENSION // how long pivots run
{
EXTEND_UNTIL_TAKEN, // until taken
EXTEND_PAST_TAKEN // past the take
};
enum ENUM_SERVER_DST // broker daylight-saving calendar
{
SERVER_DST_US, // US
SERVER_DST_EU, // EU
SERVER_DST_NONE // none
};
input group "Sessions (New York time)"
input string InpS1Name = "ASIA"; // session 1 name
input string InpS1Time = "2000-0000"; // session 1 time
input color InpS1Color = C'94,129,172'; // session 1 color
input string InpS2Name = "LONDON"; // session 2 name
input string InpS2Time = "0200-0500"; // session 2 time
input color InpS2Color = C'196,98,62'; // session 2 color
input string InpS3Name = "NY AM"; // session 3 name
input string InpS3Time = "0930-1100"; // session 3 time
input color InpS3Color = C'52,140,96'; // session 3 color
input string InpS4Name = "NY LUNCH"; // session 4 name
input string InpS4Time = ""; // session 4 time
input color InpS4Color = C'201,152,40'; // session 4 color
input string InpS5Name = "NY PM"; // session 5 name
input string InpS5Time = "1330-1600"; // session 5 time
input color InpS5Color = C'134,92,176'; // session 5 color
input int InpKeep = 3; // sessions kept on the chart
input int InpBoxOpacity = 40; // box opacity, percent
input group "Session pivots"
input bool InpPivots = true; // draw session high and low
input bool InpMid = false; // draw session midpoint
input bool InpPivotTags = true; // label the pivots
input ENUM_EXTENSION InpExtension = EXTEND_UNTIL_TAKEN; // extend pivots
input bool InpAlerts = true; // alert when a high or low is taken
input group "Previous day, week, month"
input bool InpDayLevels = true; // previous day levels
input color InpDayColor = C'70,110,160'; // day color
input bool InpWeekLevels = true; // previous week levels
input color InpWeekColor = C'58,146,134'; // week color
input bool InpMonthLevels = true; // previous month levels
input color InpMonthColor = C'176,72,84'; // month color
input group "Key times (New York time)"
input bool InpOpens = true; // opening-price line at each time
input bool InpMarks = true; // vertical marker at each time
input string InpK1Time = "0930"; // time 1
input string InpK1Name = "NY Open"; // time 1 label
input color InpK1Color = C'70,110,160'; // time 1 color
input string InpK2Time = "1200"; // time 2
input string InpK2Name = "Midday"; // time 2 label
input color InpK2Color = C'201,152,40'; // time 2 color
input string InpK3Time = "1600"; // time 3
input string InpK3Name = "Close"; // time 3 label
input color InpK3Color = C'176,72,84'; // time 3 color
input group "Broker clock"
input int InpServerGmt = 2; // broker server GMT offset in winter
input ENUM_SERVER_DST InpServerDst = SERVER_DST_US; // broker daylight-saving calendar
input ENUM_TIMEFRAMES InpMaxPeriod = PERIOD_M30; // draw only up to this timeframe
#define TAG "KSP_" // prefix of every chart object
#define SESSIONS 5 // session slots
#define SLOTS 3 // key-time slots
#define FRAMES 3 // day, week, month
#define KIND_HIGH 0 // frame line: previous high
#define KIND_LOW 1 // frame line: previous low
#define KIND_MID 2 // frame line: previous midline
#define FONT_SIZE 8 // label font size
#define HISTORY 5000 // bars processed on load
struct TimeSpan
{
int from; // first minute inside the window
int to; // first minute after the window
bool valid; // parsed correctly
};
struct SessionMark
{
int slot; // session slot, 0..4
long id; // unique id, names the objects
datetime opened; // first bar of the session
datetime lastIn; // last bar inside the session
double top; // session high so far
double bottom; // session low so far
datetime topAt; // bar of the high
datetime bottomAt; // bar of the low
datetime topUntil; // right end of the high line
datetime bottomUntil; // right end of the low line
datetime midUntil; // right end of the midline
bool topOpen; // high not taken yet
bool bottomOpen; // low not taken yet
bool midOpen; // midline not touched yet
};
struct FrameLine
{
int frame; // 0 day, 1 week, 2 month
int kind; // KIND_HIGH, KIND_LOW or KIND_MID
long id; // unique id
double price; // level
datetime from; // left end
datetime until; // right end
datetime period; // start of the period it describes
};
struct FrameTotals
{
long key; // period key of the current period
double open; // current period open
double high; // current period high
double low; // current period low
double prevHigh; // previous period high
double prevLow; // previous period low
datetime began; // current period first bar
datetime prevBegan; // previous period first bar
bool highTaken; // previous high traded through
bool lowTaken; // previous low traded through
int periods; // periods counted for hit rates
int highHits; // periods whose previous high was taken
int lowHits; // periods whose previous low was taken
};
struct TimeLine
{
int slot; // key-time slot, 0..2
long id; // unique id
double price; // opening price (unused by markers)
datetime from; // bar of the time
datetime until; // right end
};
class CLayerState
{
public:
SessionMark marks[];
FrameLine frames[];
TimeLine opens[];
TimeLine stamps[];
FrameTotals totals[FRAMES];
int runs[SESSIONS];
int topHits[SESSIONS];
int bottomHits[SESSIONS];
datetime firstRun[SESSIONS];
long nextId;
void Clear(void);
void CopyFrom(const CLayerState &src);
};
struct SessionSetup
{
bool on; // slot enabled
string name; // label text
color tint; // drawing color
TimeSpan span; // window
};
struct SlotSetup
{
bool on; // slot enabled
string name; // label text
color tint; // drawing color
TimeSpan span; // one-minute window
};
SessionSetup g_sessions[SESSIONS]; // the five sessions
SlotSetup g_times[SLOTS]; // the key times
CLayerState g_done; // state after the last closed bar
CLayerState g_view; // state including the bar in progress
int g_doneBar = -1; // index of the last closed bar applied
datetime g_doneTime = 0; // time of that bar
string g_drawn[]; // objects drawn on the last render
string g_alerted[]; // alerts already sent, by key
void CLayerState::Clear(void)
{
ArrayResize(marks,0);
ArrayResize(frames,0);
ArrayResize(opens,0);
ArrayResize(stamps,0);
ZeroMemory(totals);
ArrayInitialize(runs,0);
ArrayInitialize(topHits,0);
ArrayInitialize(bottomHits,0);
ArrayInitialize(firstRun,0);
nextId=1;
}
void CLayerState::CopyFrom(const CLayerState &src)
{
ArrayCopy(marks,src.marks);
ArrayResize(marks,ArraySize(src.marks));
ArrayCopy(frames,src.frames);
ArrayResize(frames,ArraySize(src.frames));
ArrayCopy(opens,src.opens);
ArrayResize(opens,ArraySize(src.opens));
ArrayCopy(stamps,src.stamps);
ArrayResize(stamps,ArraySize(src.stamps));
for(int f=0; f<FRAMES; f++)
totals[f]=src.totals[f];
for(int s=0; s<SESSIONS; s++)
{
runs[s]=src.runs[s];
topHits[s]=src.topHits[s];
bottomHits[s]=src.bottomHits[s];
firstRun[s]=src.firstRun[s];
}
nextId=src.nextId;
}
TimeSpan ParseSpan(string text,const bool single)
{
TimeSpan span;
span.valid=false;
StringReplace(text," ","");
StringReplace(text,":","");
string part[];
int count=StringSplit(text,'-',part);
if(count!=(single ? 1 : 2))
return(span);
int edge[2];
for(int k=0; k<count; k++)
{
string p=part[k];
if(StringLen(p)==3)
p="0"+p;
if(StringLen(p)!=4)
return(span);
int hh=(int)StringToInteger(StringSubstr(p,0,2));
int mm=(int)StringToInteger(StringSubstr(p,2,2));
if(hh<0 || hh>23 || mm<0 || mm>59)
return(span);
edge[k]=hh*60+mm;
}
span.from=edge[0];
span.to=single ? edge[0]+1 : (edge[1]==0 ? 1440 : edge[1]);
span.valid=true;
return(span);
}
bool Inside(const TimeSpan &span,const int minute)
{
if(!span.valid)
return(false);
if(span.from<span.to)
return(minute>=span.from && minute<span.to);
return(minute>=span.from || minute<span.to);
}
int SundayOf(const int year,const int month,const int n)
{
MqlDateTime d;
ZeroMemory(d);
d.year=year;
d.mon=month;
d.day=1;
datetime first=StructToTime(d);
TimeToStruct(first,d);
int firstSunday=1+(7-d.day_of_week)%7;
if(n>0)
return(firstSunday+7*(n-1));
MqlDateTime e;
ZeroMemory(e);
e.year=(month==12) ? year+1 : year;
e.mon=(month==12) ? 1 : month+1;
e.day=1;
int days=(int)((StructToTime(e)-first)/86400);
int last=firstSunday;
while(last+7<=days)
last+=7;
return(last);
}
datetime At(const int year,const int month,const int day,const int hour)
{
MqlDateTime d;
ZeroMemory(d);
d.year=year;
d.mon=month;
d.day=day;
d.hour=hour;
return(StructToTime(d));
}
bool UsSummer(const datetime utc)
{
MqlDateTime d;
TimeToStruct(utc,d);
datetime begin=At(d.year,3,SundayOf(d.year,3,2),7);
datetime end=At(d.year,11,SundayOf(d.year,11,1),6);
return(utc>=begin && utc<end);
}
bool EuSummer(const datetime utc)
{
MqlDateTime d;
TimeToStruct(utc,d);
datetime begin=At(d.year,3,SundayOf(d.year,3,0),1);
datetime end=At(d.year,10,SundayOf(d.year,10,0),1);
return(utc>=begin && utc<end);
}
datetime ToClock(const datetime server)
{
datetime guess=server-InpServerGmt*3600;
bool summer=(InpServerDst==SERVER_DST_US) ? UsSummer(guess) :
(InpServerDst==SERVER_DST_EU) ? EuSummer(guess) : false;
datetime utc=guess-(summer ? 3600 : 0);
return(utc+(UsSummer(utc) ? -4 : -5)*3600);
}
int ClockMinute(const datetime server)
{
return((int)((ToClock(server)%86400)/60));
}
long PeriodKey(const int frame,const datetime t)
{
long day=(long)(t/86400);
if(frame==0)
return(day);
if(frame==1)
return((day+3)/7);
MqlDateTime d;
TimeToStruct(t,d);
return((long)d.year*12+d.mon);
}
void Notify(const bool live,const string key,const string text)
{
if(!live)
return;
for(int k=ArraySize(g_alerted)-1; k>=0; k--)
if(g_alerted[k]==key)
return;
int n=ArraySize(g_alerted);
ArrayResize(g_alerted,n+1);
g_alerted[n]=key;
Alert(_Symbol," ",text);
}
void TrimMarks(CLayerState &st,const int slot)
{
int seen=0;
for(int k=ArraySize(st.marks)-1; k>=0; k--)
{
if(st.marks[k].slot!=slot)
continue;
if(++seen>MathMax(1,InpKeep))
ArrayRemove(st.marks,k,1);
}
}
void TrimFrames(CLayerState &st,const int frame,const int kind)
{
int seen=0,keep=MathMax(1,InpKeep);
for(int k=ArraySize(st.frames)-1; k>=0; k--)
{
if(st.frames[k].frame!=frame || st.frames[k].kind!=kind)
continue;
if(++seen>keep)
ArrayRemove(st.frames,k,1);
}
}
void TrimLines(TimeLine &list[],const int slot,const int keep)
{
int seen=0;
for(int k=ArraySize(list)-1; k>=0; k--)
{
if(list[k].slot!=slot)
continue;
if(++seen>keep)
ArrayRemove(list,k,1);
}
}
void StepSessions(CLayerState &st,const datetime t,const double hi,const double lo,
const int minute,const int prevMinute,const bool live)
{
for(int s=0; s<SESSIONS; s++)
{
if(!g_sessions[s].on)
continue;
bool now=Inside(g_sessions[s].span,minute);
bool before=Inside(g_sessions[s].span,prevMinute);
if(now && !before)
{
SessionMark m;
ZeroMemory(m);
m.slot=s;
m.id=st.nextId++;
m.opened=t;
m.lastIn=t;
m.top=hi;
m.bottom=lo;
m.topAt=t;
m.bottomAt=t;
m.topUntil=t;
m.bottomUntil=t;
m.midUntil=t;
m.topOpen=true;
m.bottomOpen=true;
m.midOpen=true;
int n=ArraySize(st.marks);
ArrayResize(st.marks,n+1);
st.marks[n]=m;
st.runs[s]++;
if(st.firstRun[s]==0)
st.firstRun[s]=t;
TrimMarks(st,s);
}
int rank=0;
for(int k=ArraySize(st.marks)-1; k>=0; k--)
{
if(st.marks[k].slot!=s)
continue;
if(rank==0 && now)
{
st.marks[k].lastIn=t;
if(hi>st.marks[k].top)
{
st.marks[k].top=hi;
st.marks[k].topAt=t;
}
if(lo<st.marks[k].bottom)
{
st.marks[k].bottom=lo;
st.marks[k].bottomAt=t;
}
}
if(rank==0)
{
if(InpExtension==EXTEND_PAST_TAKEN || st.marks[k].topOpen)
st.marks[k].topUntil=t;
if(InpExtension==EXTEND_PAST_TAKEN || st.marks[k].bottomOpen)
st.marks[k].bottomUntil=t;
if(st.marks[k].topOpen && hi>st.marks[k].top)
{
st.marks[k].topOpen=false;
st.topHits[s]++;
if(InpAlerts && InpPivots)
Notify(Показано первые 50% кода (символов: 21992)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.