← К каталогу
Исходный код · ID 4653

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 и перейдите к оплате.

Стоимость полного кода
1 573,30₽ ≈ $19.61