SS_SupportResistance
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «ss_supportresistance_v07.1.mq5» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Данный продукт представляет собой индикатор для MetaTrader 4 (MQL4), предназначенный для построения и отображения зон поддержки и сопротивления на ценовых графиках. Индикатор определяет потенциальные торговые уровни на основе быстрых и медленных фрактальных точек, формируя зоны различной силы — от возможных до подтверждённых.
Зоны классифицируются по степени подтверждения: возможные, непроверенные, проверённые, слабые и перевёрнутые. Пользователь может настраивать цвета, стили и отображение каждой категории зон, а также включать или отключать показ разрушенных уровней. Индикатор поддерживает работу с несколькими таймфреймами.
Встроенная система оповещений включает попап-уведомления, звуковые сигналы и push-уведомления при входе цены в зону. Доступен режим тестирования с кнопкой переключения, позволяющий просматривать историческое отображение зон при прокрутке графика назад. Зоны могут объединяться при перекрытии для наглядности.
Настройки программы
| Настройка | Описание |
|---|---|
| BackLimit | Глубина поиска зон в количестве баров от текущего бара |
| TimeFrame | Таймфрейм для анализа уровней (0 — текущий график, 60 — H1, 240 — H4, 1440 — D1, 10080 — W1, 43200 — MN) |
| TimeString | Строка с описанием доступных таймфреймов для справки |
| color_support_possible | Цоль возможной зоны поддержки |
| color_support_untested | Цвет непроверенной зоны поддержки |
| color_support_verified | Цвет подтверждённой зоны поддержки |
| color_support_weak | Цвет слабой зоны поддержки |
| color_support_turncoat | Цоль перевёрнутой зоны поддержки |
| color_resist_possible | Цоль возможной зоны сопротивления |
| color_resist_untested | Цвет непроверенной зоны сопротивления |
| color_resist_verified | Цвет подтверждённой зоны сопротивления |
| color_resist_weak | Цвет слабой зоны сопротивления |
| color_resist_turncoat | Цоль перевёрнутой зоны сопротивления |
| color_broken_weak | Цвет слабых разрушенных зон |
| color_broken_verified | Цвет подтверждённых разрушенных зон |
| color_broken_other | Цвет прочих разрушенных зон |
| zone_show_possible | Отображение зон категории «Возможные» |
| zone_fuzzfactor | Коэффициент размытия для определения границ зон |
| zone_solid | Сплошное залитие зоны вместо прозрачного прямоугольника |
| zone_linewidth | Толщина линии границы зоны |
| zone_style | Стиль линии границы зоны (0 — сплошная и др.) |
| zone_show_info | Отображение текстовых меток с информацией о зоне и количестве касаний |
| zone_label_shift | Смещение текстовой метки зоны по горизонтали |
| color_label | Цвет текстовых меток зон |
| font_label | Шрифт текстовых меток зон |
| size_label | Размер шрифта текстовых меток зон |
| zone_show_alerts | Включение системы оповещений при входе цены в зону |
| zone_alert_popups | Включение всплывающих окон-оповещений при входе цены в зону |
| zone_alert_sounds | Включение звуковых сигналов при входе цены в зону |
| use_push | Включение отправки push-уведомлений при входе цены в зону |
| zone_alert_waitseconds | Интервал ожидания в секундах между последовательными оповещениями |
| zone_merge | Объединение перекрывающихся зон в одну для упрощения отображения |
| zone_extend | Расширение границ зон на величину, рассчитанную через коэффициент размытия |
| zone_showbroken | Отображение разрушенных зон на графике |
| zone_limit | Максимальное количество отображаемых зон на графике |
| fractals_show | Отображение фрактальных точек на графике в виде стрелок |
| fractal_fast_factor | Множитель для расчёта быстрых фрактальных точек |
| fractal_slow_factor | Множитель для расчёта медленных фрактальных точек |
| SetGlobals | Включение сохранения данных зон в глобальные переменные терминала |
| ShiftEndRight | Количество баров, на которое конец зоны сдвигается вправо за последний видимый бар |
| Testing | Включение режима тестирования — при прокрутке графика назад отображается исторический вид зон |
| ShowTestingBtn | Отображение кнопки для переключения режима тестирования |
| TestingBtnX | Горизонтальная позиция кнопки тестирования на графике |
| TestingBtnY | Вертикальная позиция кнопки тестирования на графике |
Поиск по коду файла
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 clrRed
#property indicator_color2 clrRed
#property indicator_color3 clrDodgerBlue
#property indicator_color4 clrDodgerBlue
extern int BackLimit = 10000;
extern int TimeFrame = 0;
extern string TimeString = "0=Current, 60=H1, 240=H4, 1440=Day, 10080=Week, 43200=Month";
extern color color_support_possible = clrDarkSlateGray;
extern color color_support_untested = clrSeaGreen;
extern color color_support_verified = clrGreen;
extern color color_support_weak = clrLimeGreen;
extern color color_support_turncoat = clrOliveDrab;
extern color color_resist_possible = clrIndigo;
extern color color_resist_untested = clrOrchid;
extern color color_resist_verified = clrCrimson;
extern color color_resist_weak = clrRed;
extern color color_resist_turncoat = clrDarkOrange;
extern color color_broken_weak = clrDarkGray;
extern color color_broken_verified = clrGray;
extern color color_broken_other = clrDimGray;
extern bool zone_show_possible = true;
extern double zone_fuzzfactor = 0.5;
extern bool zone_solid = false;
extern int zone_linewidth = 1;
extern int zone_style = 0;
extern bool zone_show_info = true;
extern int zone_label_shift = 3;
extern color color_label = clrWhite; //Label color
extern string font_label = "Courier New"; //Label Font
extern int size_label = 9; //Label size
extern bool zone_show_alerts = true;
extern bool zone_alert_popups = true;
extern bool zone_alert_sounds = true;
extern bool use_push = true;
extern int zone_alert_waitseconds = 300;
extern bool zone_merge = true;
extern bool zone_extend = false;
extern bool zone_showbroken = false;
extern int zone_limit = 1000;
extern bool fractals_show = false;
extern double fractal_fast_factor = 3.0;
extern double fractal_slow_factor = 6.0;
extern bool SetGlobals = true;
extern int ShiftEndRight = 3;//extend the end of zones 3 bars beyond last bar
extern bool Testing = false; //TRUE == scrolling back the chart shows PAST zone "look"
extern bool ShowTestingBtn = false; //Show button to switch Testing mode On/Off
extern int TestingBtnX = 10; //Position of this button
extern int TestingBtnY = 120;
string BtnSRTesting = "BtnSRTesting";
double FastDnPts[], FastUpPts[];
double SlowDnPts[], SlowUpPts[];
double zone_hi[], zone_lo[];
int zone_start[], zone_hits[], zone_type[], zone_strength[], zone_end[], zone_count = 0;
bool zone_turn[];
#define ZONE_SUPPORT 1
#define ZONE_RESIST 2
#define ZONE_BROKEN 3
#define ZONE_POSSIBLE 0
#define ZONE_TURNCOAT 1
#define ZONE_UNTESTED 2
#define ZONE_VERIFIED 3
#define ZONE_WEAK 4
#define UP_POINT 1
#define DN_POINT -1
int time_offset = 0;
int LastBar = 0; //Last visible bar on the chart - in Testing mode
bool Initialized = false; //Has the INIT function finished?
double PipSize = 0;
int init()
{
// код доступен только после оплаты
}
int deinit()
{
DeleteZones();
DeleteGlobalVars();
ObjectDelete(0, BtnSRTesting);
return(0);
}
int start()
{
// код доступен только после оплаты
}
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam){
if (id == CHARTEVENT_OBJECT_CLICK){
if (sparam == BtnSRTesting){
Testing = !Testing;
if (Testing)
ObjectSetInteger(0, BtnSRTesting, OBJPROP_BGCOLOR, C'236,233,216');
else
ObjectSetInteger(0, BtnSRTesting, OBJPROP_BGCOLOR, clrSlateGray);
}
}
if (Testing && Initialized && id == CHARTEVENT_CHART_CHANGE){
int PrevLastBar = LastBar;
if (LastBar > 0){
LastBar = 0;
}
LastBar = GetNextBar(0);
if (Testing && PrevLastBar > 0 && LastBar >= 0 && PrevLastBar != LastBar)
start();
}
}
void CheckAlerts()
{
static int lastalert = 0;
if (zone_show_alerts == false)
return;
if (Time[0] - lastalert > zone_alert_waitseconds)
if (CheckEntryAlerts() == true)
lastalert = Time[0];
}
bool CheckEntryAlerts()
{
for (int i=0; i<zone_count; i++)
{
if (Close[0] >= zone_lo[i] && Close[0] < zone_hi[i])
{
if (zone_show_alerts == true)
{
if (zone_alert_popups == true)
{
if (zone_type[i] == ZONE_SUPPORT)
Alert(Symbol() + TimeFrameToString(TimeFrame) + ": Support Zone Entered");
else
Alert(Symbol() + TimeFrameToString(TimeFrame) + ": Resistance Zone Entered");
}
if (zone_alert_sounds == true)
PlaySound("alert.wav");
}
if (use_push == true)
{
string dir = "";
string msg = StringConcatenate(Symbol(), "-", TimeFrameToString(TimeFrame), " at ", TimeToStr(Time[0], TIME_DATE|TIME_SECONDS),
" ", dir, " Zone Entered");
if (zone_type[i] == ZONE_SUPPORT)
{
dir = "Support";
SendNotification("SS_SupRes_v07.1 alert" + msg);
}
else
{
dir = "Resistance";
SendNotification("SS_SupRes_v07.1 alert" + msg);
}
}
return(true);
}
}
return(false);
}
void DeleteGlobalVars()
{
if (SetGlobals == false)
return;
GlobalVariableDel("SSSR_Count_"+Symbol()+TimeFrame);
GlobalVariableDel("SSSR_Updated_"+Symbol()+TimeFrame);
int old_count = zone_count;
zone_count = 0;
DeleteOldGlobalVars(old_count);
}
void DeleteOldGlobalVars(int old_count)
{
if (SetGlobals == false)
return;
for (int i=zone_count; i<old_count; i++)
{
GlobalVariableDel("SSSR_HI_"+Symbol()+TimeFrame+i);
GlobalVariableDel("SSSR_LO_"+Symbol()+TimeFrame+i);
GlobalVariableDel("SSSR_HITS_"+Symbol()+TimeFrame+i);
GlobalVariableDel("SSSR_STRENGTH_"+Symbol()+TimeFrame+i);
GlobalVariableDel("SSSR_AGE_"+Symbol()+TimeFrame+i);
}
}
void FindZones()
{
int i, j, shift, bustcount=0, testcount = 0, brokebar;
double hival, loval;
bool turned = false, hasturned = false;
double temp_hi[1000], temp_lo[1000];
int temp_start[1000], temp_hits[1000], temp_strength[1000], temp_count = 0;
bool temp_turn[1000], temp_merge[1000];
double bust_hi[1000], bust_lo[1000];
int bust_start[1000], bust_hits[1000], bust_strength[1000], bust_end[1000], bust_count = 0;
bool bust_turn[1000], bust_merge[1000];
int merge1[1000], merge2[1000], merge_count = 0;
int berge1[1000], berge2[1000], berge_count = 0;
for (shift=MathMin(Bars(NULL, TimeFrame)-1, LastBar + BackLimit); shift> LastBar + 5; shift--)
{
double atr = iATR(NULL, TimeFrame, 7, shift);
double fu = atr/2 * zone_fuzzfactor;
bool isPossible;
bool touchOk = false;
bool isBust = false;
double close = iClose(NULL, TimeFrame, shift);
double high = iHigh(NULL, TimeFrame, shift);
double low = iLow(NULL, TimeFrame, shift);
double hi_i;
double lo_i;
if (FastUpPts[shift] > 0.001)
{
isPossible = true;
if (SlowUpPts[shift] > 0.001)
isPossible = false;
hival = high;
if (zone_extend == true)
hival += fu;
loval = MathMax(MathMin(close, high-fu), high-fu*2);
turned = false;
hasturned = false;
isBust = false;
bustcount = 0;
testcount = 0;
brokebar = 0;
for (i=shift-1; i>=LastBar + 0; i--)
{
hi_i = iHigh(NULL, TimeFrame, i);
lo_i = iLow(NULL, TimeFrame, i);
if ((turned == false && FastUpPts[i] >= loval && FastUpPts[i] <= hival) ||
(turned == true && FastDnPts[i] <= hival && FastDnPts[i] >= loval))
{
touchOk = true;
for (j=i+1; j<i+11; j++)
{
if ((turned == false && FastUpPts[j] >= loval && FastUpPts[j] <= hival) ||
(turned == true && FastDnPts[j] <= hival && FastDnPts[j] >= loval))
{
touchOk = false;
break;
}
}
if (touchOk == true)
{
bustcount = 0;
testcount++;
}
}
if ((turned == false && hi_i > hival) ||
(turned == true && lo_i < loval))
{
bustcount++;
brokebar = MathMax(brokebar, i);
if (bustcount > 1 || isPossible == true)
{
isBust = true;
break;
}
if (turned == true)
turned = false;
else if (turned == false)
turned = true;
hasturned = true;
testcount = 0;
}
}
if (isBust == false)
{
temp_hi[temp_count] = hival;
temp_lo[temp_count] = loval;
temp_turn[temp_count] = hasturned;
temp_hits[temp_count] = testcount;
temp_start[temp_count] = shift;
temp_merge[temp_count] = false;
if (testcount > 3)
temp_strength[temp_count] = ZONE_WEAK;
else if (testcount > 0)
temp_strength[temp_count] = ZONE_VERIFIED;
else if (hasturned == true)
temp_strength[temp_count] = ZONE_TURNCOAT;
else if (isPossible == false)
temp_strength[temp_count] = ZONE_UNTESTED;
else
temp_strength[temp_count] = ZONE_POSSIBLE;
temp_count++;
}
else if (zone_showbroken)
{
bust_hi[bust_count] = hival;
bust_lo[bust_count] = loval;
bust_turn[bust_count] = hasturned;
bust_hits[bust_count] = testcount;
bust_start[bust_count] = shift;
bust_end[bust_count] = brokebar;
bust_merge[bust_count] = false;
if (testcount > 3)
bust_strength[bust_count] = ZONE_WEAK;
else if (testcount > 0)
bust_strength[bust_count] = ZONE_VERIFIED;
else if (hasturned == true)
bust_strength[bust_count] = ZONE_TURNCOAT;
else if (isPossible == false)
bust_strength[bust_count] = ZONE_UNTESTED;
else
bust_strength[bust_count] = ZONE_POSSIBLE;
bust_count++;
}
}
else if (FastDnPts[shift] > 0.001)
{
isPossible = true;
if (SlowDnPts[shift] > 0.001)
isPossible = false;
loval = low;
if (zone_extend == true)
loval -= fu;
hival = MathMin(MathMax(close, low+fu), low+fu*2);
turned = false;
hasturned = false;
bustcount = 0;
testcount = 0;
brokebar = 0;
isBust = false;
for (i=shift-1; i>=LastBar + 0; i--)
{
hi_i = iHigh(NULL, TimeFrame, i);
lo_i = iLow(NULL, TimeFrame, i);
if ((turned == true && FastUpPts[i] >= loval && FastUpPts[i] <= hival) ||
(turned == false && FastDnPts[i] <= hival && FastDnPts[i] >= loval))
{
touchOk = true;
for (j=i+1; j<i+11; j++)
{
if ((turned == true && FastUpPts[j] >= loval && FastUpPts[j] <= hival) ||
(turned == false && FastDnPts[j] <= hival && FastDnPts[j] >= loval))
{
touchOk = false;
break;
}
}
if (touchOk == true)
{
bustcount = 0;
testcount++;
}
}
if ((turned == true && hi_i > hival) ||
(turned == false && lo_i < loval))
{
bustcount++;
brokebar = MathMax(brokebar, i);
if (bustcount > 1 || isPossible == true)
{
isBust = true;
break;
}
if (turned == true)
turned = false;
else if (turned == false)
turned = true;
hasturned = true;
testcount = 0;
}
}
if (isBust == false)
{
temp_hi[temp_count] = hival;
temp_lo[temp_count] = loval;
temp_turn[temp_count] = hasturned;
temp_hits[temp_count] = testcount;
temp_start[temp_count] = shift;
temp_merge[temp_count] = false;
if (testcount > 3)
temp_strength[temp_count] = ZONE_WEAK;
else if (testcount > 0)
temp_strength[temp_count] = ZONE_VERIFIED;
else if (hasturned == true)
temp_strength[temp_count] = ZONE_TURNCOAT;
else if (isPossible == false)
temp_strength[temp_count] = ZONE_UNTESTED;
else
temp_strength[temp_count] = ZONE_POSSIBLE;
temp_count++;
}
else if (zone_showbroken)
{
bust_hi[bust_count] = hival;
bust_lo[bust_count] = loval;
bust_turn[bust_count] = hasturned;
bust_hits[bust_count] = testcount;
bust_start[bust_count] = shift;
bust_end[bust_count] = brokebar;
bust_merge[bust_count] = false;
if (testcount > 3)
bust_strength[bust_count] = ZONE_WEAK;
else if (testcount > 0)
bust_strength[bust_count] = ZONE_VERIFIED;
else if (hasturned == true)
bust_strength[bust_count] = ZONE_TURNCOAT;
else if (isPossible == false)
bust_strength[bust_count] = ZONE_UNTESTED;
else
bust_strength[bust_count] = ZONE_POSSIBLE;
bust_count++;
}
}
}
if (zone_merge == true)
{
merge_count = 1;
int iterations = 0, target, source;
while (merge_count > 0 && iterations < 3)
{
merge_count = 0;
iterations++;
for (i = 0; i < temp_count; i++Показано первые 50% кода (символов: 24523)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.