UT Bot Alerts
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «tv_utbot.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
TV_UTBot — индикатор для MetaTrader 4, портированный с TradingView Pine Script «UT Bot Alerts» (QuantNomad). Основная функция — расчёт скользящего ATR-стопа (trailing stop) на основе xATR, где ATR вычисляется как Wilder RMA, взращённая SMA первых ATR_Period истинных диапазонов. Индикатор генерирует сигналы Buy/Sell при пересечении цены и стоп-уровня, рисует линии трейлинг-стопа и окрашивает свечи в зависимости от положения цены относительно стопа.
Дополнительно встроена панель статистики сигналов с подсчётом сделок, win rate, чистым профитом, фактором прибыли и максимальной просадкой. Доступен фильтр торговой сессии с возможностью затенения сессии на графике и закрытия открытой позиции по её завершении. Также поддерживаются уведомления о сигналах Buy/Sell.
Параметры настройки включают период ATR, чувствительность, использование Heikin Ashi, цвета и размеры стрелок, отображение линий и панелей, а также параметры сессии и статистики.
Настройки программы
| Настройка | Описание |
|---|---|
| ATR_Period | Период расчёта ATR (среднего истинного диапазона), используемого для построения trailing stop. |
| Use_Heikin_Ashi | Использовать свечи Heikin Ashi (OHLC4) вместо обычных цен Close для расчёта сигналов и trailing stop. |
| Sep_View | Разделитель визуальной группы настроек отображения на графике. |
| Show_Trail_Line | Рисовать линии trailing stop (длинной и короткой стороны) на графике. |
| Color_Bars | Окрасить свечи на графике в зависимости от положения цены относительно текущего уровня trailing stop. |
| Bull_Color | Цвет для бычьих (растущих) свечей, стрелок Buy и линий трейлинг-стопа длинной стороны. |
| Bear_Color | Цвет для медвежьих (падающих) свечей, стрелок Sell и линий трейлинг-стопа короткой стороны. |
| Arrow_Size | Размер стрелок-маркеров сигналов Buy и Sell на графике. |
| Alert_Signals | Отправлять уведомления при появлении сигналов UT Long и UT Short на закрытых свечах. |
| Sep_Stats | Разделитель визуальной группы настроек статистики сигналов и фильтра сессии. |
| Show_Stats | Отображать панель статистики сигналов в правом верхнем углу графика с данными о сделках и прибыльности. |
| Stats_Max_Bars | Количество баров, на которых ведётся подсчёт сделок (0 — все доступные бары). |
| Stats_Lots | Размер лота, используемый для пересчёта пунктовой стоимости в доллары в панели статистики. |
| Stats_Spread_Points | Спред на одну сделку в пунктах (-1 — использовать текущий рыночный спред). |
| Stats_Commission_Lot | Комиссия за один лот при расчёте чистого дохода (туда-обратно), в долларах. |
| Stats_Pip_Points | Количество пунктов, приходящихся на один пип (10 для 3- или 5-значных котировок). |
| Use_Session | Фильтровать сделки, считая только те, которые открыты внутри заданной ежедневной торговой сессии. |
| Session_Start | Время начала торговой сессии в формате HH:MM (ваше локальное время). |
| Session_End | Время окончания торговой сессии в формате HH:MM (может переходить через полночь, например 24:00). |
| Session_TZ_Shift | Сдвиг часового пояса: ваше локальное время равно серверному времени плюс это количество часов. |
| Close_At_Session_End | Автоматически закрывать открытую позицию по окончании торговой сессии (при включённом фильтре сессии). |
| Show_Session_Shade | Отображать затенённые прямоугольники на графике для обозначения торговой сессии. |
| Shade_Days | Количество дней назад от текущего момента, для которых отображается затенение торговой сессии. |
| Shade_Color | Цвет заливки (затенения) участков торговой сессии на графике, предназначен для тёмных тем оформления. |
| Show_Trade_Marks | Отображать маркеры входа и выхода для каждой учтённой сделки на графике (при наведении — подробности). |
| Max_Trade_Marks | Количество последних сделок, для которых отображаются маркеры входа и выхода на графике. |
| Stats_Font_Size | Размер шрифта текста в панели статистики сигналов. |
Поиск по коду файла
#property version "1.10"
#property description "MQL4 port of TradingView 'UT Bot Alerts' (QuantNomad): ATR trailing stop, Buy/Sell signals, bar colors."
#property description "Plus: signal statistics panel and an optional daily session filter (off by default)."
#property strict
#property indicator_chart_window
#property indicator_buffers 13
#property indicator_color1 clrLimeGreen
#property indicator_color2 clrRed
#property indicator_color3 clrDodgerBlue
#property indicator_color4 clrLimeGreen
#property indicator_color5 clrRed
#define PFX "TVUT_"
input double Key_Value = 1.0; // Key Value ('This changes the sensitivity')
input int ATR_Period = 10; // ATR Period
input bool Use_Heikin_Ashi = false; // Signals from Heikin Ashi Candles
input string Sep_View = "===== Display =====";
input bool Show_Trail_Line = true; // Draw the trailing-stop line (not in the original)
input bool Color_Bars = true; // Color bars (barcolor)
input color Bull_Color = clrLimeGreen;
input color Bear_Color = clrRed;
input int Arrow_Size = 1;
input bool Alert_Signals = false; // Alert UT Long / UT Short
input string Sep_Stats = "===== Signal statistics + session =====";
input bool Show_Stats = true; // Show statistics panel (top right)
input int Stats_Max_Bars = 5000; // Bars to count trades on (0 = all)
input double Stats_Lots = 0.01; // Lot size for the USD figures
input int Stats_Spread_Points = -1; // Spread per trade in points (-1 = current spread)
input double Stats_Commission_Lot = 7.0; // Commission per lot, round turn, USD
input int Stats_Pip_Points = 10; // Points per pip (10 for 3- or 5-digit quotes)
input bool Use_Session = false; // Count trades only inside a daily session
input string Session_Start = "21:00"; // Session start (HH:MM, your time)
input string Session_End = "24:00"; // Session end (HH:MM, may pass midnight)
input int Session_TZ_Shift = 0; // Your time = server time + this many hours
input bool Close_At_Session_End = true; // Close the open trade at session end
input bool Show_Session_Shade = true; // Shade the session on the chart
input int Shade_Days = 30; // Days to shade
input color Shade_Color = C'40,40,70'; // Session shade color (dark chart)
input bool Show_Trade_Marks = true; // Mark each counted trade (hover for details)
input int Max_Trade_Marks = 300; // Number of recent trades to mark
input int Stats_Font_Size = 9; // Panel font size
struct SsTrade { datetime t1; double p1; datetime t2; double p2; int dir; double net; string why; };
SsTrade ss_tr[];
int ss_ntr=0;
int ss_n=0, ss_w=0, ss_l=0, ss_maxCons=0, ss_openDir=0;
double ss_gross=0, ss_net=0, ss_winPts=0, ss_lossPts=0, ss_ddUsd=0;
double ss_openPts=0, ss_openEntry=0, ss_costPts=0, ss_mpp=0;
datetime ss_from=0, ss_openT=0, ss_lastBar=0;
int ss_sesS=0, ss_sesE=0;
color ss_bg=clrBlack, ss_fg=clrWhite;
int SS_HhMm(string t)
{
StringTrimLeft(t); StringTrimRight(t);
int c=StringFind(t,":");
if(c<0) return((int)StringToInteger(t)*60);
return((int)StringToInteger(StringSubstr(t,0,c))*60+(int)StringToInteger(StringSubstr(t,c+1)));
}
void SS_Session()
{
ss_sesS=SS_HhMm(Session_Start)%1440;
ss_sesE=SS_HhMm(Session_End)%1440; // 24:00 = 00:00
}
bool SS_InSession(datetime t)
{
if(!Use_Session) return(true);
datetime tl=t+Session_TZ_Shift*3600;
int m=TimeHour(tl)*60+TimeMinute(tl);
if(ss_sesS==ss_sesE) return(true);
if(ss_sesS<ss_sesE) return(m>=ss_sesS && m<ss_sesE);
return(m>=ss_sesS || m<ss_sesE);
}
string SS_Pts(double v,int d=0){ return((v>0 ? "+" : "")+DoubleToString(v,d)); }
string SS_Usd(double pts){ double u=pts*ss_mpp*Stats_Lots; return((u>0 ? "+" : "")+DoubleToString(u,2)+" $"); }
void SS_Colors()
{
ss_bg=(color)ChartGetInteger(0,CHART_COLOR_BACKGROUND);
ss_fg=(color)ChartGetInteger(0,CHART_COLOR_FOREGROUND);
}
void SS_Compute(const double &buy[],const double &sell[],int n)
{
ss_n=0; ss_w=0; ss_l=0; ss_maxCons=0; ss_openDir=0;
ss_gross=0; ss_net=0; ss_winPts=0; ss_lossPts=0; ss_ddUsd=0;
ss_openPts=0; ss_from=0; ss_ntr=0;
SS_Session();
double tv=MarketInfo(Symbol(),MODE_TICKVALUE), ts=MarketInfo(Symbol(),MODE_TICKSIZE);
ss_mpp=(ts>0) ? tv*Point/ts : 0;
double spr=(Stats_Spread_Points>=0) ? Stats_Spread_Points : MarketInfo(Symbol(),MODE_SPREAD);
ss_costPts=spr+((ss_mpp>0) ? Stats_Commission_Lot/ss_mpp : 0);
int pos=0, cons=0;
double entry=0, eq=0, peak=0;
datetime tIn=0;
int top=((Stats_Max_Bars>0) ? MathMin(Stats_Max_Bars,n) : n)-1;
for(int s=top;s>=1;s--)
{
datetime tx=Time[s-1];
double px=Open[s-1];
bool inS=SS_InSession(tx);
int sig=(buy[s]!=EMPTY_VALUE) ? 1 : (sell[s]!=EMPTY_VALUE) ? -1 : 0;
string why="";
bool doClose=false;
if(pos!=0 && Use_Session && Close_At_Session_End && !inS) { doClose=true; why="session end"; }
if(pos!=0 && sig!=0 && sig!=pos) { doClose=true; why="opposite signal"; }
if(doClose)
{
double g=pos*(px-entry)/Point, net=g-ss_costPts;
ss_n++; ss_gross+=g; ss_net+=net;
if(net>0){ ss_w++; ss_winPts+=net; cons=0; }
else { ss_l++; ss_lossPts+=net; cons++; if(cons>ss_maxCons) ss_maxCons=cons; }
eq+=net*ss_mpp*Stats_Lots;
if(eq>peak) peak=eq;
if(peak-eq>ss_ddUsd) ss_ddUsd=peak-eq;
ArrayResize(ss_tr,ss_ntr+1,1024);
ss_tr[ss_ntr].t1=tIn; ss_tr[ss_ntr].p1=entry; ss_tr[ss_ntr].t2=tx; ss_tr[ss_ntr].p2=px;
ss_tr[ss_ntr].dir=pos; ss_tr[ss_ntr].net=net; ss_tr[ss_ntr].why=why;
ss_ntr++;
pos=0;
}
if(sig!=0 && sig!=pos && inS)
{
pos=sig; entry=px; tIn=tx;
if(ss_from==0) ss_from=tx;
}
}
ss_openDir=pos;
ss_openEntry=entry;
ss_openT=tIn;
if(pos!=0) ss_openPts=pos*(Close[0]-entry)/Point;
}
void SS_UpdateOpen()
{
if(ss_openDir!=0) ss_openPts=ss_openDir*(Close[0]-ss_openEntry)/Point;
}
void SS_DrawMarks()
{
ObjectsDeleteAll(0,PFX+"T");
if(!Show_Stats || !Show_Trade_Marks) return;
int from=MathMax(0,ss_ntr-Max_Trade_Marks);
for(int i=from;i<ss_ntr;i++)
{
string id=IntegerToString(i);
color cIn=(ss_tr[i].dir>0) ? clrDodgerBlue : clrOrangeRed;
color cLn=(ss_tr[i].net>0) ? clrLimeGreen : clrTomato;
string tip=((ss_tr[i].dir>0) ? "BUY " : "SELL ")+TimeToString(ss_tr[i].t1,TIME_DATE|TIME_MINUTES)+" @ "+DoubleToString(ss_tr[i].p1,Digits)+
"\nclose "+TimeToString(ss_tr[i].t2,TIME_DATE|TIME_MINUTES)+" @ "+DoubleToString(ss_tr[i].p2,Digits)+" ("+ss_tr[i].why+")"+
"\nnet "+SS_Pts(ss_tr[i].net)+" pts = "+SS_Usd(ss_tr[i].net);
string a=PFX+"TA"+id, b=PFX+"TB"+id, l=PFX+"TL"+id;
ObjectCreate(0,a,OBJ_ARROW,0,ss_tr[i].t1,ss_tr[i].p1);
ObjectSetInteger(0,a,OBJPROP_ARROWCODE,1);
ObjectSetInteger(0,a,OBJPROP_COLOR,cIn);
ObjectCreate(0,b,OBJ_ARROW,0,ss_tr[i].t2,ss_tr[i].p2);
ObjectSetInteger(0,b,OBJPROP_ARROWCODE,3);
ObjectSetInteger(0,b,OBJPROP_COLOR,cLn);
ObjectCreate(0,l,OBJ_TREND,0,ss_tr[i].t1,ss_tr[i].p1,ss_tr[i].t2,ss_tr[i].p2);
ObjectSetInteger(0,l,OBJPROP_RAY,false);
ObjectSetInteger(0,l,OBJPROP_STYLE,STYLE_DOT);
ObjectSetInteger(0,l,OBJPROP_COLOR,cLn);
string nm[3]; nm[0]=a; nm[1]=b; nm[2]=l;
for(int k=0;k<3;k++)
{
ObjectSetInteger(0,nm[k],OBJPROP_SELECTABLE,false);
ObjectSetInteger(0,nm[k],OBJPROP_HIDDEN,true);
ObjectSetString(0,nm[k],OBJPROP_TOOLTIP,tip);
}
}
}
void SS_DrawShade()
{
ObjectsDeleteAll(0,PFX+"Z");
if(!Show_Session_Shade || !Use_Session) return;
SS_Session();
if(ss_sesS==ss_sesE) return;
int durMin=(ss_sesE-ss_sesS+1440)%1440;
datetime now=TimeCurrent();
datetime dayLocal=((now+Session_TZ_Shift*3600)/86400)*86400;
for(int d=0; d<=Shade_Days; d++)
{
datetime startServer=dayLocal-d*86400+ss_sesS*60-Session_TZ_Shift*3600;
datetime endServer=startServer+durMin*60;
int dw=TimeDayOfWeek(startServer+Session_TZ_Shift*3600);
if(dw==0 || dw==6) continue;
string nm=PFX+"Z"+IntegerToString(d);
ObjectCreate(0,nm,OBJ_RECTANGLE,0,startServer,0,endServer,1000000);
ObjectSetInteger(0,nm,OBJPROP_COLOR,Shade_Color);
ObjectSetInteger(0,nm,OBJPROP_BACK,true);
ObjectSetInteger(0,nm,OBJPROP_SELECTABLE,false);
ObjectSetInteger(0,nm,OBJPROP_HIDDEN,true);
ObjectSetString(0,nm,OBJPROP_TOOLTIP,"Session "+Session_Start+" - "+Session_End);
}
}
void SS_Row(int i,int x0,int w,int y,string k,string v,color vc)
{
string kn=PFX+"SK"+IntegerToString(i), vn=PFX+"SV"+IntegerToString(i);
if(ObjectFind(0,kn)<0)
{
ObjectCreate(0,kn,OBJ_LABEL,0,0,0);
ObjectCreate(0,vn,OBJ_LABEL,0,0,0);
string nm[2]; nm[0]=kn; nm[1]=vn;
for(int j=0;j<2;j++)
{
ObjectSetInteger(0,nm[j],OBJPROP_CORNER,CORNER_RIGHT_UPPER);
ObjectSetInteger(0,nm[j],OBJPROP_SELECTABLE,false);
ObjectSetInteger(0,nm[j],OBJPROP_HIDDEN,true);
ObjectSetString(0,nm[j],OBJPROP_FONT,"Arial");
}
ObjectSetInteger(0,kn,OBJPROP_ANCHOR,ANCHOR_LEFT_UPPER);
ObjectSetInteger(0,vn,OBJPROP_ANCHOR,ANCHOR_RIGHT_UPPER);
}
ObjectSetInteger(0,kn,OBJPROP_FONTSIZE,Stats_Font_Size);
ObjectSetInteger(0,vn,OBJPRПоказано первые 50% кода (символов: 15733)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.