Smart Session Breakout
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «smartsessionbreakout_v1.10.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Индикатор Smart Session Breakout рассчитывает и отображает ценовые диапазоны торговых сессий на графиках MetaTrader 4. Он определяет сессию по настраиваемому времени начала и окончания (серверное время брокера), строит прямоугольник между максимумом и минимумом диапазона и отображает уровни сопротивления и поддержки.
При пробое диапазона сессии индикатор строит стрелки сигналов покупки или продажи. Для оценки качества свечи используется фильтр на основе ATR: свеча должна иметь тело не меньше заданного соотношения от значения ATR. Сигналы подтверждаются на закрытии бара и не перерисовываются.
Индикатор включает информационную панель на экране, показывающую фазу текущей сессии, спред, значение ATR и обратный отсчёт до закрытия бара. Поддерживаются уведомления: всплывающие окна, звуковые сигналы, электронная почта и push-уведомления на мобильные устройства.
Настройки программы
| Настройка | Описание |
|---|---|
| InpAsianStart | Время начала торговой сессии в формате серверного времени брокера (ЧЧ:ММ). |
| InpAsianEnd | Время окончания торговой сессии в формате серверного времени брокера (ЧЧ:ММ). |
| InpMaxDays | Максимальное количество дней истории для обработки на графике. При значении 0 обрабатывается вся доступная история. |
| InpMinBoxPips | Минимальная допустимая высота диапазона сессии в пунктах. Диапазоны меньше этого значения игнорируются. |
| InpMaxBoxPips | Максимальная допустимая высота диапазона сессии в пунктах. Диапазоны вне этого диапазона игнорируются. |
| InpSignalOnClose | Подтверждение сигнала на закрытии бара. При включении сигналы не перерисовываются и оцениваются только по закрытым барам. |
| InpUseATRFilter | Включение фильтра расширения на основе ATR для проверки качества пробойной свечи. |
| InpATRPeriod | Период расчёта индикатора ATR, используемого для фильтрации пробоев по качеству свечи. |
| InpATRCoeff | Минимальное соотношение тела пробойной свечи к значению ATR для прохождения фильтра качества свечи. |
| InpBoxColor | Цвет прямоугольника диапазона торговой сессии на графике. |
| InpFillBox | Переключатель заполнения прямоугольника диапазона сессии цветом. |
| InpUpperLineCol | Цвет линии верхнего уровня сопротивления диапазона сессии. |
| InpLowerLineCol | Цвет линии нижнего уровня поддержки диапазона сессии. |
| InpShowDash | Переключатель отображения информационной панели на графике. |
| InpCorner | Угловая позиция информационной панели на графике. |
| InpBgColor | Цвет фона информационной панели. |
| InpTxtColor | Цвет текста на информационной панели. |
| InpAccentColor | Цвет акцентного выделения на информационной панели. |
| InpPopupAlert | Включение всплывающих окон-уведомлений при появлении сигнала. |
| InpSoundAlert | Включение звукового сигнала при появлении торгового сигнала. |
| InpSendEmail | Включение отправки электронной почты при появлении сигнала. |
| InpSendPush | Включение отправки push-уведомлений на мобильные устройства при появлении сигнала. |
Поиск по коду файла
#property version "1.10"
#property strict
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 clrLimeGreen // Buy Signal Arrow
#property indicator_color2 clrRed // Sell Signal Arrow
#property indicator_color3 clrDodgerBlue // Upper Range Level
#property indicator_color4 clrDeepPink // Lower Range Level
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 1
#property indicator_width4 1
double BufferBuy[];
double BufferSell[];
double BufferUpperLevel[];
double BufferLowerLevel[];
input string InpAsianStart = "00:00"; // Session Start (Broker Server Time HH:MM)
input string InpAsianEnd = "08:00"; // Session End (Broker Server Time HH:MM)
input int InpMaxDays = 30; // Max Days to Process on Chart
input double InpMinBoxPips = 8.0; // Min Range Box Height (Pips)
input double InpMaxBoxPips = 70.0; // Max Range Box Height (Pips)
input bool InpSignalOnClose = true; // Confirm Signal on Bar Close (Non-Repainting)
input bool InpUseATRFilter = true; // Enable ATR Expansion Filter
input int InpATRPeriod = 14; // ATR Period
input double InpATRCoeff = 0.8; // Min Breakout Candle Body vs ATR Ratio
input color InpBoxColor = C'30,50,90'; // Range Box Color
input bool InpFillBox = true; // Fill Range Box
input color InpUpperLineCol = clrDodgerBlue;// Upper Line Color
input color InpLowerLineCol = clrDeepPink; // Lower Line Color
input bool InpShowDash = true; // Show On-Screen Dashboard Panel
input ENUM_BASE_CORNER InpCorner= CORNER_RIGHT_UPPER; // Panel Position Corner
input color InpBgColor = C'18,24,38'; // Dashboard Background Color
input color InpTxtColor = clrWhite; // Dashboard Text Color
input color InpAccentColor = C'0,195,255'; // Dashboard Accent Highlight
input bool InpPopupAlert = true; // Enable Pop-up Alert
input bool InpSoundAlert = true; // Enable Sound Alert
input bool InpSendEmail = false; // Enable Email Alert
input bool InpSendPush = false; // Enable Push Alert to Mobile
string g_prefix = "SSB_";
double g_pipSize = 0.0001;
datetime g_lastAlertBar = 0; // one alert per bar, whatever the mode
int g_startSec = 0; // session start, seconds past midnight
int g_sessionLen= 0; // session length in seconds, always > 0
int ParseHHMM(string s)
{
string parts[];
if(StringSplit(s, StringGetCharacter(":", 0), parts) != 2) return(-1);
int h = (int)StringToInteger(parts[0]);
int m = (int)StringToInteger(parts[1]);
if(h < 0 || h > 23 || m < 0 || m > 59) return(-1);
return(h * 3600 + m * 60);
}
datetime MidnightOf(datetime t) { return((datetime)(t - (t % 86400))); }
bool IsRightCorner()
{
return(InpCorner == CORNER_RIGHT_UPPER || InpCorner == CORNER_RIGHT_LOWER);
}
int PanelX(int panelLeft, int panelWidth, int offsetFromLeft)
{
return(IsRightCorner() ? (panelLeft + panelWidth - offsetFromLeft)
: (panelLeft + offsetFromLeft));
}
int OnInit()
{
// код доступен только после оплаты
}
void OnDeinit(const int reason)
{
CleanUpObjects();
}
int OnCalculate(const int rates_total,
const int 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 int &spread[])
{
// код доступен только после оплаты
}
if(rates_total < 50) return(0);
int limit = rates_total - prev_calculated;
if(prev_calculated > 0) limit++;
if(limit > rates_total) limit = rates_total;
if(InpMaxDays > 0)
{
int maxBars = iBarShift(NULL, 0, TimeCurrent() - InpMaxDays * 86400, false);
if(maxBars > 0 && limit > maxBars) limit = maxBars;
}
datetime cachedStart = 0;
double cachedHigh = 0.0;
double cachedLow = 0.0;
bool cachedValid = false;
for(int i = limit - 1; i >= 0; i--)
{
BufferBuy[i] = EMPTY_VALUE;
BufferSell[i] = EMPTY_VALUE;
BufferUpperLevel[i] = EMPTY_VALUE;
BufferLowerLevel[i] = EMPTY_VALUE;
datetime barTime = time[i];
datetime sessStart = MidnightOf(barTime) + g_startSec;
datetime sessEnd = sessStart + g_sessionLen;
if(barTime < sessEnd)
{
sessStart -= 86400;
sessEnd -= 86400;
}
if(barTime < sessEnd) continue;
if(sessStart != cachedStart)
{
cachedStart = sessStart;
cachedValid = false;
int barStart = iBarShift(NULL, 0, sessStart, false);
int barEnd = iBarShift(NULL, 0, sessEnd, false);
if(barStart > 0 && barEnd >= 0 && barStart > barEnd)
{
int count = barStart - barEnd + 1;
int hiShift = iHighest(NULL, 0, MODE_HIGH, count, barEnd);
int loShift = iLowest (NULL, 0, MODE_LOW, count, barEnd);
if(hiShift >= 0 && loShift >= 0)
{
double boxHigh = High[hiShift];
double boxLow = Low[loShift];
double boxPips = (boxHigh - boxLow) / g_pipSize;
if(boxPips >= InpMinBoxPips && boxPips <= InpMaxBoxPips)
{
cachedHigh = boxHigh;
cachedLow = boxLow;
cachedValid = true;
DrawSessionBox(sessStart, sessEnd, boxHigh, boxLow);
Показано первые 50% кода (символов: 10051)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.