TrueTL
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «truetl v1.01 bt.mq5» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
TrueTL — это пользовательский индикатор для платформы MetaTrader 4, предназначенный для построения и визуализации трендовых линий на графиках цен. Индикатор отрисовывает нисходящие и восходящие трендовые линии (OBJ_TREND), автоматически обновляя их по мере поступления новых свечей.
В основе работы лежит обнаружение фракталов и паттернов свечей для определения точек начала трендовых линий. Линии окрашиваются в разные цвета в зависимости от их продолжительности: обычные и длинные трендовые линии имеют отдельные настройки цвета. Доступна функция «Three Touch», которая выделяет особые трендовые линии, сформированные при трёх касаниях.
Индикатор оснащён встроенной кнопкой-переключателем, позволяющей показывать или скрывать отрисовку. Реализована функция автообновления, а также ускоренный анализ для таймфреймов M1 и M5. Доступна маркировка наибольших и наименьших трендовых линий на графике.
Настройки включают параметры периодов, цветов, ширин линий и внешнего вида кнопки управления. Индикатор работает в основном графике (indicator_chart_window) и совместим с стандартными объектами MetaTrader 4.
Настройки программы
| Настройка | Описание |
|---|---|
| Auto_Refresh | Автообновление — Переключатель автоматического обновления трендовых линий при поступлении новых свечей. |
| Normal_TL_Period | Период обычной линии — Период (в барах) для определения нормальной длительности трендовой линии. |
| Three_Touch | Three Touch — Включает режим Three Touch для выделения особых трендовых линий. |
| M1_Fast_Analysis | Быстрый анализ M1 — Включает ускоренный анализ на таймфрейме M1. |
| M5_Fast_Analysis | Быстрый анализ M5 — Включает ускоренный анализ на таймфрейме M5. |
| Mark_Highest_and_Lowest_TL | Маркировка экстремумов — Отображение маркеров для наибольших и наименьших трендовых линий. |
| Expiration_Day_Alert | Дней до предупреждения — Число дней до истечения срока для отображения предупреждения об истечении. |
| Normal_TL_Color | Цвет обычных линий — Цвет обычных трендовых линий. |
| Long_TL_Color | Цвет длинных линий — Цвет длинных трендовых линий. |
| Three_Touch_TL_Width | Толщина Three Touch линий — Толщина линий Three Touch. |
| Three_Touch_TL_Color | Цвет Three Touch линий — Цвет трендовых линий в режиме Three Touch. |
| button_note1_ | Разделитель 1 — Текстовый разделитель перед группой настроек кнопки. |
| What window to put the button on. If <0, the button will use the same sub-window as the indicator. (btn_Subwindow) | Подокно кнопки — Подокно, в котором размещается кнопка. Если значение меньше 0, кнопка использует тот же подокон индикатора. |
| button corner on chart for anchoring (btn_corner) | Угол кнопки — Угол графика для привязки кнопки. |
| a button name (btn_text) | Текст кнопки — Текст (название) кнопки. |
| button font name (btn_Font) | Шрифт кнопки — Шрифт текста на кнопке управления. |
| button font size (btn_FontSize) | Размер шрифта кнопки — Размер шрифта текста на кнопке. |
| ON color when the button is turned on (btn_text_ON_color) | Цвет текста (вкл) — Цвет текста кнопки во включённом состоянии. |
| OFF color when the button is turned off (btn_text_OFF_color) | Цвет текста (выкл) — Цвет текста кнопки в выключенном состоянии. |
| background color of the button (btn_background_color) | Фон кнопки — Цвет фона кнопки. |
| border color the button (btn_border_color) | Рамка кнопки — Цвет рамки кнопки. |
| x coordinate of the button (button_x) | X-координата кнопки — Горизонтальная координата кнопки на графике. |
| y coordinate of the button (button_y) | Y-координата кнопки — Вертикальная координата кнопки на графике. |
| button width (btn_Width) | Ширина кнопки — Ширина кнопки управления. |
| button height (btn_Height) | Высота кнопки — Высота кнопки управления. |
| button_note2 | Разделитель 2 — Текстовый разделитель после группы настроек кнопки. |
Поиск по коду файла
#property indicator_chart_window
extern bool Auto_Refresh = TRUE;
extern int Normal_TL_Period = 500;
extern bool Three_Touch = TRUE;
extern bool M1_Fast_Analysis = TRUE;
extern bool M5_Fast_Analysis = TRUE;
extern bool Mark_Highest_and_Lowest_TL = TRUE;
extern int Expiration_Day_Alert = 5;
extern color Normal_TL_Color = clrGainsboro;
extern color Long_TL_Color = clrGoldenrod;
extern int Three_Touch_TL_Width = 2;
extern color Three_Touch_TL_Color = clrDimGray;
extern string button_note1_ = "------------------------------";
extern int btn_Subwindow = 0; // What window to put the button on. If <0, the button will use the same sub-window as the indicator.
extern ENUM_BASE_CORNER btn_corner = CORNER_LEFT_UPPER; // button corner on chart for anchoring
extern string btn_text = "TRUETL"; // a button name
extern string btn_Font = "Arial"; // button font name
extern int btn_FontSize = 9; // button font size
extern color btn_text_ON_color = clrLime; // ON color when the button is turned on
extern color btn_text_OFF_color = clrRed; // OFF color when the button is turned off
extern color btn_background_color = clrDimGray; // background color of the button
extern color btn_border_color = clrBlack; // border color the button
extern int button_x = 20; // x coordinate of the button
extern int button_y = 25; // y coordinate of the button
extern int btn_Width = 80; // button width
extern int btn_Height = 20; // button height
extern string button_note2 = "------------------------------";
bool show_data, recalc=false;
string IndicatorObjPrefix, buttonId;
int counted_bars;
int OnInit()
{
// код доступен только после оплаты
}
void createButton(string buttonID,string buttonText,int width2,int height,string font,int fontSize,color bgColor,color borderColor,color txtColor)
{
ObjectDelete (0,buttonID);
ObjectCreate (0,buttonID,OBJ_BUTTON,btn_Subwindow,0,0);
ObjectSetInteger(0,buttonID,OBJPROP_COLOR,txtColor);
ObjectSetInteger(0,buttonID,OBJPROP_BGCOLOR,bgColor);
ObjectSetInteger(0,buttonID,OBJPROP_BORDER_COLOR,borderColor);
ObjectSetInteger(0,buttonID,OBJPROP_BORDER_TYPE,BORDER_RAISED);
ObjectSetInteger(0,buttonID,OBJPROP_XSIZE,width2);
ObjectSetInteger(0,buttonID,OBJPROP_YSIZE,height);
ObjectSetString (0,buttonID,OBJPROP_FONT,font);
ObjectSetString (0,buttonID,OBJPROP_TEXT,buttonText);
ObjectSetInteger(0,buttonID,OBJPROP_FONTSIZE,fontSize);
ObjectSetInteger(0,buttonID,OBJPROP_SELECTABLE,0);
ObjectSetInteger(0,buttonID,OBJPROP_CORNER,btn_corner);
ObjectSetInteger(0,buttonID,OBJPROP_HIDDEN,1);
ObjectSetInteger(0,buttonID,OBJPROP_XDISTANCE,9999);
ObjectSetInteger(0,buttonID,OBJPROP_YDISTANCE,9999);
ObjectSetInteger(0, buttonId, OBJPROP_STATE, true);
}
void OnDeinit(const int reason)
{
if(reason != REASON_CHARTCHANGE) ObjectDelete(buttonId);
deinit2();
}
void OnChartEvent(const int id, //don't change anything here
const long &lparam,
const double &dparam,
const string &sparam)
{
if(id==CHARTEVENT_OBJECT_CREATE || id==CHARTEVENT_OBJECT_DELETE) return; // This appears to make this indy compatible with other programs that enabled CHART_EVENT_OBJECT_CREATE and/or CHART_EVENT_OBJECT_DELETE
if(id==CHARTEVENT_MOUSE_MOVE || id==CHARTEVENT_MOUSE_WHEEL) return; // If this, or another program, enabled mouse-events, these are not needed below, so skip it unless actually needed.
if (id==CHARTEVENT_OBJECT_CLICK && sparam == buttonId)
{
show_data = ObjectGetInteger(0, buttonId, OBJPROP_STATE);
if (show_data)
{
ObjectSetInteger(0,buttonId,OBJPROP_COLOR,btn_text_ON_color);
init2();
recalc=true;
mystart();
}
else
{
ObjectSetInteger(0,buttonId,OBJPROP_COLOR,btn_text_OFF_color);
deinit2();
}
}
}
int init2() {
ObjectCreate("calctl", OBJ_HLINE, 0, 0, 0);
ObjectCreate("visibletl", OBJ_HLINE, 0, 0, 0);
ObjectCreate("downmax", OBJ_TREND, 0, 0, 0, 0, 0);
ObjectCreate("upmax", OBJ_TREND, 0, 0, 0, 0, 0);
return (0);
}
int deinit2() {
for (int ForexStation = 0; ForexStation <= 100; ForexStation++) {
ObjectDelete("downtrendline" + ForexStation);
ObjectDelete("uptrendline" + ForexStation);
ObjectDelete("downtrendline" + ForexStation + "tt");
ObjectDelete("uptrendline" + ForexStation + "tt");
}
ObjectDelete("calctl");
ObjectDelete("timeleft");
ObjectDelete("invacc");
ObjectDelete("visibletl");
ObjectDelete("downmax");
ObjectDelete("upmax");
ObjectDelete("downmax");
ObjectDelete("upmax");
return (0);
}
int start() {
// код доступен только после оплаты
}
int mystart()
{
if (show_data)
{
double mySecondCount;
double myFractal01;
double CandleHigh;
double SemaFor01;
double myFractal02;
double AnotherCandleHigh;
double myTemp01;
double DownLine;
double AlternatePoint;
double TouchDownLine01;
double Touch3Shift;
double NormalTL;
double Forex01;
double MachNumber;
double MandoNumber;
double anotherDownLine01;
double anotherDownLine02;
double TempDownLine02;
double TempDownLine;
double myATRnumber;
double MagicNumber;
double yourDownTrendLine02;
double yourUpTrendLine02;
if (Normal_TL_Period > 1000 || Normal_TL_Period < 100) Normal_TL_Period = 500;
string myAccount01 = AccountNumber();
string myAccount02 = AccountNumber();
int myGoal = 1;
int myVisibleBar = MathMax(0, WindowFirstVisibleBar() - WindowBarsPerChart());
double limit = Bars;
if (counted_bars == 0) counted_bars = limit;
if(recalc)
{
counted_bars = 0;
recalc=false;
}
if (limit > counted_bars) {
counted_bars = limit;
if (Auto_Refresh == TRUE && myVisibleBar == 0) ObjectSet("calctl", OBJPROP_PRICE1, -1);
}
if (Auto_Refresh == TRUE && IndicatorCounted() == 0) ObjectSet("calctl", OBJPROP_PRICE1, -1);
if (ObjectGet("visibletl", OBJPROP_PRICE1) == -1.0) {
for (int myDownTrendLine = 0; myDownTrendLine <= 100; myDownTrendLine++) {
ObjectDelete("downtrendline" + myDownTrendLine);
ObjectDelete("uptrendline" + myDownTrendLine);
ObjectDelete("downtrendline" + myDownTrendLine + "tt");
ObjectDelete("uptrendline" + myDownTrendLine + "tt");
}
}
if (ObjectGet("calctl", OBJPROP_PRICE1) == -1.0 && ObjectGet("visibletl", OBJPROP_PRICE1) == 0.0 && StringFind(myAccount02, myAccount01, 0) >= 0 && myGoal > 0) {
for (myDownTrendLine = 0; myDownTrendLine <= 100; myDownTrendLine++) {
ObjectDelete("downtrendline" + myDownTrendLine);
ObjectDelete("uptrendline" + myDownTrendLine);
ObjectDelete("downtrendline" + myDownTrendLine + "tt");
ObjectDelete("uptrendline" + myDownTrendLine + "tt");
}
mySecondCount = 150000;
if (Period() == PERIOD_M1 && M1_Fast_Analysis == TRUE) mySecondCount = 8000;
if (Period() == PERIOD_M5 && M5_Fast_Analysis == TRUE) mySecondCount = 2400;
if (Period() == PERIOD_MN1) {
mySecondCount = 150;
Three_Touch = FALSE;
Normal_TL_Period = 150;
}
myFractal01 = myVisibleBar + MathMin(Bars - myVisibleBar - 10, mySecondCount);
CandleHigh = iHigh(NULL, 0, myFractal01);
myFractal02 = myVisibleBar + MathMin(Bars - myVisibleBar - 10, mySecondCount);
AnotherCandleHigh = iHigh(NULL, 0, myFractal02);
for (int kounter01 = 1; kounter01 < 50; kounter01++) {
if ((iFractals(NULL, 0, MODE_UPPER, myVisibleBar + kounter01) > 0.0 && kounter01 > 2) || (Close[myVisibleBar + kounter01 + 1] > Open[myVisibleBar + kounter01 + 1] && Close[myVisibleBar + kounter01 + 1] - (Low[myVisibleBar +
kounter01 + 1]) < 0.6 * (High[myVisibleBar + kounter01 + 1] - (Low[myVisibleBar + kounter01 + 1])) && Close[myVisibleBar + kounter01] < Open[myVisibleBar + kounter01]) || (Close[myVisibleBar + kounter01 + 1] <= Open[myVisibleBar +
kounter01 + 1] && Close[myVisibleBar + kounter01] < Open[myVisibleBar + kounter01]) || (Close[myVisibleBar + kounter01] < Open[myVisibleBar + kounter01] && Close[myVisibleBar + kounter01] < Low[myVisibleBar + kounter01 + 1])) {
SemaFor01 = myVisibleBar + kounter01;
break;
}
}
for (int kounter02 = 1; kounter02 <= 30; kounter02++) {
if (myFractal01 > SemaFor01 + 6.0) {
ObjectCreate("downtrendline" + kounter02, OBJ_TREND, 0, iTime(NULL, 0, myFractal01), CandleHigh, iTime(NULL, 0, myFractal01), CandleHigh);
for (kounter01 = myFractal01; kounter01 >= SemaFor01; kounter01--) {
if (ObjectGet("downtrendline" + kounter02, OBJPROP_PRICE1) == ObjectGet("downtrendline" + kounter02, OBJPROP_PRICE2)) {
ObjectMove("downtrendline" + kounter02, 1, iTime(NULL, 0, kounter01 - 1), iHigh(NULL, 0, kounter01 - 1));
myFractal01 = kounter01 - 1;
CandleHigh = iHigh(NULL, 0, kounter01 - 1);
}
DownLine = ObjectGetValueByShift("downtrendline" + kounter02, kounter01);
if (DownLine < iHigh(NULL, 0, kounter01)) {
ObjectMove("downtrendline" + kounter02, 1, iTime(NULL, 0, kounter01), iHigh(NULL, 0, kounter01));
myFractal01 = kounter01;
CandleHigh = iHigh(NULL, 0, kounter01);
}
}
}
if (ObjectGet("downtrendline" + kounter02, OBJPROP_PRICE1) < ObjectGet("downtrendline" + kounter02, OBJPROP_PRICE2)) ObjectDelete("downtrendline" + kounter02);
if (iBarShift(NULL, 0, ObjectGet("downtrendline" + kounter02, OBJPROP_TIME1)) - myVisibleBar >= Normal_TL_Period) {
ObjectSet("downtrendline" + kounter02, OBJPROP_COLOR, Long_TL_Color);
ObjectSetText("downtrendline" + kounter02, "Long");
} else {
ObjectSet("downtrendline" + kounter02, OBJPROP_COLOR, Normal_TL_Color);
ObjectSetText("downtrendline" + kounter02, "Normal");
}
}
for (kounter01 = 1; kounter01 < 50; kounter01++) {
if ((iFractals(NULL, 0, MODE_LOWER, myVisibleBar + kounter01) > 0.0 && kounter01 > 2) || (Close[myVisibleBar + kounter01 + 1] < Open[myVisibleBar + kounter01 + 1] && High[myVisibleBar + kounter01 + 1] - (Close[myVisibleBar +
kounter01 + 1]) < 0.6 * (High[myVisibleBar + kounter01 + 1] - (Low[myVisibleBar + kounter01 + 1])) && Close[myVisibleBar + kounter01] > Open[myVisibleBar + kounter01]) || (Close[myVisibleBar + kounter01 + 1] >= Open[myVisibleBar +
kounter01 + 1] && Close[myVisibleBar + kounter01] > Open[myVisibleBar + kounter01]) || (Close[myVisibleBar + kounter01] > Open[myVisibleBar + kounter01] && Close[myVisibleBar + kounter01] > High[myVisibleBar + kounter01 + 1])) {
myTemp01 = myVisibleBar + kounter01;
break;
}
}
for (kounter02 = 1; kounter02 <= 30; kounter02++) {
if (myFractal02 > myTemp01 + 6.0) {
ObjectCreate("uptrendline" + kounter02, OBJ_TREND, 0, iTime(NULL, 0, myFractal02), AnotherCandleHigh, iTime(NULL, 0, myFractal02), AnotherCandleHigh);
Показано первые 50% кода (символов: 17955)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.