marketstructure_rsi_validator.mq5
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «marketstructure_rsi_validator.mq5» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Market Structure RSI Validator — это аналитический советник для MetaTrader 5, который проверяет пересечения порогов RSI на закрытых барах в контексте рыночной структуры. Программа определяет подтверждённые свинг-максимумы и свинг-минимумы, классифицирует структуру как бычью, медвежью или боковик, и генерирует визуальные сигналы-стрелки на графике.
Советник обрабатывает событие OnTick, но анализирует только вновь открытые бары, игнорируя изменения внутри текущего бара. RSI рассчитывается через стандартный индикаторный handle iRSI, а данные ценового графика получаются через CopyRates. Перед началом работы входные параметры проверяются на корректность.
Программа явно заявлена как аналитическая и не размещает торговые ордера. Она отображает результаты анализа в виде графических объектов и информационной панели Comment на графике.
При деинициализации советник освобождает индикаторный handle и удаляет только свои графические объекты по заданному префиксу.
Настройки программы
| Настройка | Описание |
|---|---|
| InpRSIPeriod | Период расчёта индикатора RSI. |
| InpAppliedPrice | Тип цены, используемой для расчёта индикатора RSI (например, PRICE_CLOSE). |
| InpOverbought | Уровень перекупленности RSI, при превышении которого фиксируется пересечение вверх. |
| InpOversold | Уровень перепроданности RSI, при снижении ниже которого фиксируется пересечение вниз. |
| InpSwingLeft | Количество баров слева от кандидата, которые не должны содержать более высокий максимум или более низкий минимум для подтверждения свинга. |
| InpSwingRight | Количество баров справа от кандидата, которые не должны содержать более высокий максимум или более низкий минимум для подтверждения свинга. |
| InpStructureLookback | Количество баров истории, используемых для поиска двух последних подтверждённых свинг-точек. |
| InpConfirmationBars | Максимальное количество баров ожидания структурного подтверждения для отложенного кандидата, после чего он аннулируется. |
| InpBreakBufferPoints | Размер буфера в пунктах для определения пробоя свинг-уровней высокого и низкого. |
| InpDrawSignals | Переключатель отображения или скрытия стрелок сигналов на графике. |
| InpBuyColor | Цвет стрелок, отображающих покупательские подтверждённые сигналы на графике. |
| InpSellColor | Цвет стрелок, отображающих продавательские подтверждённые сигналы на графике. |
| InpObjectPrefix | Префикс имён графических объектов-стрелок, создаваемых программой на графике. |
Поиск по коду файла
#property version "1.00"
#property strict
#property description "Validates closed-bar RSI threshold crossings with swing structure."
#property description "The program is analytical and does not place trades."
input group "RSI settings"
input int InpRSIPeriod = 14;
input ENUM_APPLIED_PRICE InpAppliedPrice = PRICE_CLOSE;
input double InpOverbought = 70.0;
input double InpOversold = 30.0;
input group "Market structure settings"
input int InpSwingLeft = 2;
input int InpSwingRight = 2;
input int InpStructureLookback = 150;
input int InpConfirmationBars = 5;
input int InpBreakBufferPoints = 10;
input group "Visualization settings"
input bool InpDrawSignals = true;
input color InpBuyColor = clrLimeGreen;
input color InpSellColor = clrTomato;
input string InpObjectPrefix = "MSRSI_";
enum ENUM_STRUCTURE_STATE
{
STRUCTURE_UNKNOWN,
STRUCTURE_BULLISH,
STRUCTURE_BEARISH,
STRUCTURE_RANGE
};
enum ENUM_RSI_CANDIDATE
{
CANDIDATE_NONE,
CANDIDATE_OVERBOUGHT,
CANDIDATE_OVERSOLD
};
int g_rsi_handle=INVALID_HANDLE;
datetime g_last_bar_time=0;
ENUM_RSI_CANDIDATE g_candidate=CANDIDATE_NONE;
int g_candidate_age=0;
datetime g_candidate_time=0;
double g_candidate_rsi=0.0;
string g_last_result="Waiting for a closed-bar RSI event";
bool InputsAreValid()
{
if(InpRSIPeriod<2 || InpSwingLeft<1 || InpSwingRight<1)
return(false);
if(InpStructureLookback<20 || InpConfirmationBars<1)
return(false);
if(InpOversold<=0.0 || InpOverbought>=100.0 ||
InpOversold>=InpOverbought)
return(false);
return(true);
}
int OnInit()
{
// код доступен только после оплаты
}
void OnTick()
{
// код доступен только после оплаты
}
bool IsSwingHigh(const MqlRates &rates[],const int shift)
{
double level=rates[shift].high;
for(int i=1;i<=InpSwingLeft;i++)
{
if(level<=rates[shift+i].high)
return(false);
}
for(int i=1;i<=InpSwingRight;i++)
{
if(level<=rates[shift-i].high)
return(false);
}
return(true);
}
bool IsSwingLow(const MqlRates &rates[],const int shift)
{
double level=rates[shift].low;
for(int i=1;i<=InpSwingLeft;i++)
{
if(level>=rates[shift+i].low)
return(false);
}
for(int i=1;i<=InpSwingRight;i++)
{
if(level>=rates[shift-i].low)
return(false);
}
return(true);
}
bool ReadStructure(double &last_high,double &prior_high,
double &last_low,double &prior_low,
MqlRates &rates[])
{
int required=InpStructureLookback+InpSwingLeft+InpSwingRight+5;
ArraySetAsSeries(rates,true);
int copied=CopyRates(_Symbol,_Period,0,required,rates);
if(copied<InpSwingLeft+InpSwingRight+10)
return(false);
int highs=0;
int lows=0;
int first_shift=InpSwingRight+1;
int final_shift=MathMin(copied-InpSwingLeft-1,InpStructureLookback);
for(int shift=first_shift;shift<=final_shift;shift++)
{
if(highs<2 && IsSwingHigh(rates,shift))
{
if(highs==0)
last_high=rates[shift].high;
else
prior_high=rates[shift].high;
highs++;
}
if(lows<2 && IsSwingLow(rates,shift))
{
if(lows==0)
last_low=rates[shift].low;
else
prior_low=rates[shift].low;
lows++;
}
if(highs==2 && lows==2)
break;
}
return(highs==2 && lows==2);
}
ENUM_STRUCTURE_STATE ClassifyStructure(const double last_high,
const double prior_high,
const double last_low,
const double prior_low)
{
if(last_high>prior_high && last_low>prior_low)
return(STRUCTURE_BULLISH);
if(last_high<prior_high && last_low<prior_low)
return(STRUCTURE_BEARISH);
return(STRUCTURE_RANGE);
}
string StructureText(const ENUM_STRUCTURE_STATE state)
{
if(state==STRUCTURE_BULLISH)
return("Bullish: higher high and higher low");
if(state==STRUCTURE_BEARISH)
return("Bearish: lower high and lower low");
if(state==STRUCTURE_RANGE)
return("Range or transition");
return("Unknown");
}
void DrawSignal(const datetime time,const double price,
const bool buy,const string label)
{
if(!InpDrawSignals)
return;
string name=InpObjectPrefix+IntegerToString((long)time)+"_"+label;
if(ObjecПоказано первые 50% кода (символов: 8031)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.