English 中文 Español Deutsch 日本語 Português
preview
Как интегрировать в советник концепции Smart Money (BOS) в сочетании с индикатором RSI

Как интегрировать в советник концепции Smart Money (BOS) в сочетании с индикатором RSI

MetaTrader 5Примеры |
897 3
Hlomohang John Borotho
Hlomohang John Borotho

Введение

В быстро меняющемся мире торговли иностранными валютами ключ к успеху — наличие надежной и эффективной торговой системы. В целом трейдинг богат терминами, теориями и стратегиями. Иногда все это может просто ошеломлять, особенно в случае новых трейдеров, только пытающихся найти опору в отрасли. Концепция Smart Money (SMC) — одна из трендовых теорий на Форексе, но иногда для новых трейдеров, да и для кого угодно, использование этой концепции в торговле может быть затруднительным.

Для решения этой проблемы необходим надежный инструмент автоматизации принятия торговых решений на основе структуры рынка и динамики цен. Решение — объединить концепцию Smart Money (Break Of Structure) с популярным индикатором индекса относительной силы (Relative Strength Index, RSI). Такое сочетание обеспечивает стратегическое преимущество благодаря использованию анализа как ценового действия, так и импульса, что повышает точность входов в сделки и выходов из них, оптимизируя эффективность трейдинга.


Идея примера советника

Идея и функциональность этого примера советника состоит в том, что он будет определять минимумы и максимумы колебаний, поскольку некоторые концепции Smart Money используют колебания. Индикатор RSI будет по-прежнему использовать традиционное преобразование уровня 70 для перекупленного рынка и уровня 30 — для перепроданного рынка, а период будет равен 8. Превышение рыночной ценой ранее обнаруженного максимума будет указывать на прорыв структуры в сторону повышения. Аналогично, когда цена ниже ранее обнаруженного минимума, это будет указывать на прорыв структуры в сторону понижения.


Теперь разработаем пример советника

 Цель советника — открывать ордер на покупку и ордер на продажу на основе рыночных условий и уровней RSI. В частности, он:

  1. Определяет максимумы и минимумы колебаний на рынке.
  2. Проверяет, находится ли рынок выше предыдущего максимума колебаний (для сигнала на продажу) или ниже предыдущего минимума колебаний (для сигнала на покупку).
  3. Затем подтверждает сигнал уровнями RSI.

При этом советник будет фактически искать прорыв структуры или прорыв предшествующих уровней колебаний (максимума/минимума), а затем, если значение RSI находится в пределах указанных настроек, будет исполнен рыночный ордер на покупку или продажу (BUY/SELL).


Разбивка кода

1. Свойства и включения

#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Trade/Trade.mqh>

Эти строки определяют свойства советника и включают торговую библиотеку, необходимую для совершения сделок.

2. Глобальные переменные и входные данные

long MagicNumber = 76543;
double lotsize = 0.01;
input int RSIperiod = 8;
input int RSIlevels = 70;
int stopLoss = 200;
int takeProfit = 500;
bool closeSignal = false;
  • MagicNumber: уникальный идентификатор сделок советника.
  • Lotsize: размер каждой сделки.
  • RSIperiod: период для расчетов RSI.
  • RSIlevels: пороговый уровень для RSI.
  • Stoploss and takeProfit: уровни SL и TP в пунктах.
  • CloseSignal: флаг закрытия позиций на основе противоположного сигнала в сравнении с текущей открытой позицией.

3. Переменные RSI

int handle;
double buffer[];
MqlTick currentTick;
CTrade trade;
datetime openTimeBuy = 0;
datetime openTimeSell = 0;

  • Handle: хэндл для индикатора RSI.
  • Buffer: массив для хранения значений RSI.
  • currentTick: структура для хранения текущих рыночных цен.
  • Trade: это объект для торговых операций.
  • openTimeBuy and openTimeSell: временные метки последних сигналов и операций покупки и продажи.

4. Функция инициализации

int OnInit() {
    if (RSIperiod <= 1) {
        Alert("RSI period <= 1");
        return INIT_PARAMETERS_INCORRECT;
    }
    if (RSIlevels >= 100 || RSIlevels <= 50) {
        Alert("RSI level >= 100 or <= 50");
        return INIT_PARAMETERS_INCORRECT;
    }
    trade.SetExpertMagicNumber(MagicNumber);
    handle = iRSI(_Symbol, PERIOD_CURRENT, RSIperiod, PRICE_CLOSE);
    if (handle == INVALID_HANDLE) {
        Alert("Failed to create indicator handle");
        return INIT_FAILED;
    }
    ArraySetAsSeries(buffer, true);
    return INIT_SUCCEEDED;
}
  • Проверяет период и уровни RSI.
  • Устанавливает магический номер для идентификации сделки.
  • Создает хэндл индикатора RSI.
  • Устанавливает буфер в виде серии для хранения значений RSI в обратном хронологическом порядке.

5. Функция деинициализации

void OnDeinit(const int reason) {
    if (handle != INVALID_HANDLE) {
        IndicatorRelease(handle);
    }
}

Освобождает хэндл индикатора RSI при удалении советника.

6. Функция OnTick

Как все мы знаем, функция OnTick содержит основную логику для обнаружения сигналов и совершения сделок.

void OnTick() {
    static bool isNewBar = false;
    int newbar = iBars(_Symbol, _Period);
    static int prevBars = newbar;
    if (prevBars == newbar) {
        isNewBar = false;
    } else if (prevBars != newbar) {
        isNewBar = true;
        prevBars = newbar;
    }


Во-первых, поскольку функция OnTick запускается на каждом тике, нужно убедиться, что при обнаружении сигнала или исполнении сделки вы исполняем ее один раз за бар. Добиваемся этого, объявив статическую логическую переменную isNewBar. Изначально устанавливаем ее на false, а затем объявляем int-переменную newBar, которой назначена функция iBars, чтобы можно было отслеживать каждую свечу.

  • static bool isNewBar: отслеживает формирование нового бара (свечи).
  • int newbar = iBars(_Symbol, _Period): получает текущее количество баров на графике.
  • static int prevBars = newbar: инициализирует предыдущее количество баров.
  • Блок if-else проверяет наличие изменений в количестве баров, указывающее на новый бар. Если новый бар сформировался, 'isNewBar' устанавливается в значение true, иначе — false.
    const int length = 10;
    int right_index, left_index;
    int curr_bar = length;
    bool isSwingHigh = true, isSwingLow = true;
    static double swing_H = -1.0, swing_L = -1.0;

Затем нам нужно задать переменные для обнаружения максимумов и минимумов колебаний:

  • const int length = 10: определяет диапазон для обнаружения максимумов и минимумов колебаний.
  • int right_index, left_index: индексы для баров справа и баров слева от текущего бара.
  • int curr_bar = length: установить индекс текущего бара.
  • bool isSwingHigh = true, isSwingLow = true: это флаги для определения, является бар максимумом или минимумом колебания.
  • static double swing_H = -1.0, swing_L = -1.0: сохраняет последние обнаруженные значения максимума и минимума колебаний.
    double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol, SYMBOL_ASK), _Digits);
    double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol, SYMBOL_BID), _Digits);

Переменные относятся к типу double, при этом переменная Ask используется для получения текущей рыночной цены ASK, а переменная Bid используется для получения текущей рыночной цены BID:

  • double Ask: получает текущую цену Ask
  • double Bid: получает текущую цену Bid
  • NormalizeDouble: округляет цену до правильного количества знаков после запятой.
    if (isNewBar) {
        for (int a = 1; a <= length; a++) {
            right_index = curr_bar - a;
            left_index = curr_bar + a;

            if ((high(curr_bar) <= high(right_index)) || (high(curr_bar) < high(left_index))) {
                isSwingHigh = false;
            }
            if ((low(curr_bar) >= low(right_index)) || (low(curr_bar) > low(left_index))) {
                isSwingLow = false;
            }
        }

        if (isSwingHigh) {
            swing_H = high(curr_bar);
            Print("We do have a swing high at: ", curr_bar, " H: ", high(curr_bar));
            drawswing(TimeToString(time(curr_bar)), time(curr_bar), high(curr_bar), 32, clrBlue, -1);
        }
        if (isSwingLow) {
            swing_L = low(curr_bar);
            Print("We do have a swing low at: ", curr_bar, " L: ", low(curr_bar));
            drawswing(TimeToString(time(curr_bar)), time(curr_bar), low(curr_bar), 32, clrRed, +1);
        }
    }

Теперь перейдем к поиску максимумов и минимумов колебаний, но перед этим, если обнаружен новый бар, функция проверяет соседние бары в пределах заданной длины length, чтобы выяснить, не являются ли они максимумами или минимумами колебаний. Переменная length предназначена для определения диапазона свечей, в котором ищутся колебания. Для каждого бара в пределах этого диапазона функция сравнивает максимум/минимум текущего бара с соседними барами.

Если максимум текущего бара не выше соседних баров, это не максимум колебания. Если минимум текущего бара не ниже соседних баров, это не минимум колебания. При условии соблюдения всех этих условий подтверждается максимум или минимум колебаний, затем сохраняется соответствующее значение, а с помощью функции drawswing рисуется маркер на графике.

    int values = CopyBuffer(handle, 0, 0, 2, buffer);
    if (values != 2) {
        Print("Failed to get indicator values");
        return;
    }

    Comment("Buffer[0]: ", buffer[0],
            "\nBuffer[1]: ", buffer[1]);
  • copyBuffer(handle, 0, 0, 2, buffer): копирует в буфер последние значения RSI.
  • Если функции не удается найти значения RSI, она завершает работу.
  • Значения RSI будут отображаться в виде комментария на графике.
    int cntBuy = 0, cntSell = 0;
    if (!countOpenPositions(cntBuy, cntSell)) {
        return;
    }

countOpenPositions(cntBuy, cntSell) — эта функция считает количество открытых позиций на покупку и продажу. Если функция не срабатывает, OnTick прекращает работу.

    if (swing_H > 0 && Ask > swing_H && buffer[0] >= 70) {
        Print("Sell Signal: Market is above previous high and RSI >= 70");
        int swing_H_index = 0;
        for (int i = 0; i <= length * 2 + 1000; i++) {
            if (high(i) == swing_H) {
                swing_H_index = i;
                break;
            }
        }
        drawBreakLevels(TimeToString(time(0)), time(swing_H_index), high(swing_H_index), time(0), high(swing_H_index), clrBlue, -1);

        if (cntSell == 0) {
            double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol, SYMBOL_BID), _Digits);
            double sl = Bid + stopLoss * _Point;
            double tp = Bid - takeProfit * _Point;
            trade.PositionOpen(_Symbol, ORDER_TYPE_SELL, lotsize, currentTick.bid, sl, tp, "RSI EA");
        }

        swing_H = -1.0;
        return;
    }

Как я уже объяснял ранее, будем проверять сигнал на продажу. Логика состоит в том, что цена ask должна быть выше предыдущего максимума колебаний. Кроме того, значение RSI должно быть несколько больше или равно уровню 70. При соблюдении этих условий он отмечает максимумы и минимумы колебаний и рисует на графике уровень пробоя. Если нет открытых позиций на продажу, тогда он приступает к открытию позиции на продажу. Эта сделка на продажу будет открыта с рассчитанным уровнем стоп-лосса и тейк-профита, а затем значение максимума колебания будет сброшено.

    if (swing_L > 0 && Bid < swing_L && buffer[0] <= 30) {
        Print("Buy Signal: Market is below previous low and RSI <= 30");
        int swing_L_index = 0;
        for (int i = 0; i <= length * 2 + 1000; i++) {
            if (low(i) == swing_L) {
                swing_L_index = i;
                break;
            }
        }
        drawBreakLevels(TimeToString(time(0)), time(swing_L_index), low(swing_L_index), time(0), low(swing_L_index), clrRed, +1);

        if (cntBuy == 0) {
            double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol, SYMBOL_ASK), _Digits);
            double sl = Ask - stopLoss * _Point;
            double tp = Ask + takeProfit * _Point;
            trade.PositionOpen(_Symbol, ORDER_TYPE_BUY, lotsize, currentTick.ask, sl, tp, "RSI EA");
        }

        swing_L = -1.0;
        return;
    }
}

Для сигнала на покупку применяется та же логика, только с противоположным знаком: если цена bid ниже предыдущего минимума колебаний, а значение RSI меньше или равно уровню 30, то технически логика покупки в порядке, а условие выполняется. При соблюдении этого условия он отмечает минимум колебания и рисует на графике уровень прорыва. И если открытых позиций на покупку нет, он приступит к открытию новой сделки на покупку с рассчитанными уровнями столп-лосс и тейк-профит, а после этого сбросит значение минимума колебания.

Вот чего мы пытаемся добиться:

_ Продажа при соблюдении всех условий:

продажа


_ Покупка при соблюдении всех условий:

покупка


Краткая информация о функции OnTick:

Советник на каждом тике рынка выполняет следующие ключевые действия

  1. Обнаруживает новые бары: сначала он проверяет, есть ли у нас новая свеча, которая могла образоваться с момента последнего тика, а также отслеживает все свечи.
  2. Определяет максимумы и минимумы колебаний: выявляет точки колебаний на рынке, которые можно использовать как контрольные уровни позднее, когда рынок опустится ниже минимума колебаний.
  3. Извлекает значения RSI: получает самые последние значения RSI для подтверждения сигналов.
  4. Ведет подсчет открытых позиций: отслеживает текущие позиции на покупку и продажу.
  5. Генерирует торговые сигналы: использует точки колебаний, являющиеся максимумом и минимумом колебания, и уровни RSI для генерации сигналов на покупку или продажу.
  6. Совершает сделки: при соблюдении всех условий открывает новые позиции на основе сгенерированных сигналов.

Пользовательские функции для значений High, Low и Time

double high(int index){
       return (iHigh(_Symbol, _Period, index));
}

double low(int index){
       return (iLow(_Symbol, _Period, index));
}

datetime time(int index){
       return (iTime(_Symbol, _Period, index));
}

Функция high (int index) возвращает ценовой максимум бара при указанном индексе index. Она принимает index в качестве параметра типа int. Встроенная функция MQL5 iHigh(_symbol,_Period,index) используется для получения ценового максимума бара при индексе index для текущих символа и периода. Затем следует low (int index), когда эта функция возвращает ценовой минимум бара при указанном индексе index. Она также принимает index в качестве параметра типа int, и тогда мы получаем iLow(_symbol, _Period, index). Это тоже встроенная функция MQL5, получающая ценовой минимум бара при индексе index для текущего символа. Наконец, у нас есть функция time (int index), которая возвращает время бара при указанном индексе, iTime(_symbol, _Period, index) тоже встроенная функция MQL5 для получения времени бара при указанном индексе index для текущих символа и периода, а тип iTime — datetime.

Функция для рисования точек колебания

void drawswing(string objName, datetime time, double price, int arrCode, color clr, int direction){
   if(ObjectFind(0, objName) < 0){
      ObjectCreate(0, objName, OBJ_ARROW, 0, time, price);
      ObjectSetInteger(0, objName, OBJPROP_ARROWCODE, arrCode);
      ObjectSetInteger(0, objName, OBJPROP_COLOR, clr);
      ObjectSetInteger(0, objName, OBJPROP_FONTSIZE, 10);
      
      if(direction > 0){ObjectSetInteger(0, objName, OBJPROP_ANCHOR, ANCHOR_TOP);}
      if(direction < 0){ObjectSetInteger(0, objName, OBJPROP_ANCHOR, ANCHOR_BOTTOM);}
      
      string text = "";
      string Descr = objName + text;
      ObjectCreate(0, Descr, OBJ_TEXT, 0, time, price);
      ObjectSetInteger(0, Descr, OBJPROP_COLOR, clr);
      ObjectSetInteger(0, Descr, OBJPROP_FONTSIZE, 10);
      
      if(direction > 0){
         ObjectSetString(0, Descr, OBJPROP_TEXT,"  "+text);
         ObjectSetInteger(0, Descr, OBJPROP_ANCHOR, ANCHOR_LEFT_UPPER);
      }
      if(direction < 0){
         ObjectSetString(0, Descr, OBJPROP_TEXT,"  "+text);
         ObjectSetInteger(0, Descr, OBJPROP_ANCHOR, ANCHOR_LEFT_LOWER);
      }
   }
   ChartRedraw(0);
}

Эта функция создает на графике визуальные маркеры точек колебания (максимумов и минимумов). Она принимает следующие параметры:

  • ObjName: имя создаваемого объекта.
  • Time: время, в которое произошло или было обнаружено колебание.
  • Price: цена, на которой сформировалось колебание.
  • ArrCode: код стрелки для визуального представления.
  • Clr: цвет стрелки.
  • Direction: направление колебания (положительное для максимума и отрицательное для минимума).

Функциональность

1. Создание объекта:

  • ObjectFind(0, objName) < 0: проверяет, существует ли уже объект с таким именем.
  • ObjectCreate(0, objName, OBJ-ARROW, 0, time, price): создает объект-стрелку в указанное время и по указанной цене.
  • ObjectSetInteger(0, objName, OBJPROP-ARROWCODE, arrCode): устанавливает код стрелки.
  • ObjectSetInteger(0, objName, OBJPROP-COLOR, clr): устанавливает цвет стрелки.
  • ObjectSetInteger(0, objName, OBJPROP-FONTSIZE, 10): устанавливает размер шрифта.

2. Обработка направлений:

  • Устанавливает закрепленную позицию на основе направления.
  • OBJPROP-ANCHOR: устанавливает положение точки привязки для стрелки.

3. Создание текстового объекта:

  • Создает связанный со стрелкой текстовый объект для отображения дополнительной информации.
  • Устанавливает цвет, размер шрифта и точку привязки для текста в зависимости от направления.

4. Обновление графика:

  • ChartRedraw(0): перерисовывает график для отражения изменений

Функция для рисования уровней пробоя

void drawBreakLevels(string objName, datetime time1, double price1, datetime time2, double price2, color clr, int direction){
   if(ObjectFind(0, objName) < 0){
         ObjectCreate(0, objName, OBJ_ARROWED_LINE, 0, time1, price1, time2, price2);
         ObjectSetInteger(0, objName, OBJPROP_TIME, 0, time1);
         ObjectSetDouble(0, objName, OBJPROP_PRICE, 0, price1);
         ObjectSetInteger(0, objName, OBJPROP_TIME, 1, time2);
         ObjectSetDouble(0, objName, OBJPROP_PRICE, 1, price2);
         ObjectSetInteger(0, objName, OBJPROP_COLOR, clr);
         ObjectSetInteger(0, objName, OBJPROP_WIDTH, 2);
         
         string text = "Break";
         string Descr = objName + text;
         ObjectCreate(0, Descr, OBJ_TEXT, 0, time2, price2);
         ObjectSetInteger(0, Descr, OBJPROP_COLOR, clr);
         ObjectSetInteger(0, Descr, OBJPROP_FONTSIZE, 10);  
         
         if(direction > 0){
            ObjectSetString(0, Descr, OBJPROP_TEXT,text+"  ");
            ObjectSetInteger(0, Descr, OBJPROP_ANCHOR, ANCHOR_RIGHT_UPPER);
         }
         if(direction < 0){
            ObjectSetString(0, Descr, OBJPROP_TEXT,text+"  ");
            ObjectSetInteger(0, Descr, OBJPROP_ANCHOR, ANCHOR_RIGHT_LOWER);
         }          
   }
   ChartRedraw(0);
}

Эта функция создает визуальные представления пробоя ценовых уровней, являющихся точками колебания, которые были ранее обнаружены на графике. Имеет следующие параметры:

  • objName: имя создаваемого объекта.
  • time1, time2: начальное время — время формирования колебания, а конечное время — время, когда произошел пробой.
  • price1, price2: начальная цена — цена максимума или минимума возникшего колебания, price2 — цена, при которой случился пробой максимума или минимума колебания.
  • Clr: цвет стрелки.
  • Direction: направление привязки текста.


Функциональность

1. Создание объекта:

  • ObjectFind(0, objName) < 0: проверяет, существует ли уже объект с указанным именем.
  • ObjectCreate(0, objName, OBJ_ARROWED_LINE, 0, time1, price1, time2, price2): создает объект-стрелку в указанные моменты времени и по указанным ценам.
  • Устанавливает время и цены для начальной и конечной точек стрелки.
  • ObjectSetInteger(0, objName, OBJPROP-COLOR, clr): устанавливает цвет линии.
  • ObjectSetInteger(0, objName, OBJPROP-WIDTH, 2): устанавливает ширину линии.

2. Создание текстового объекта:

  • Создает связанный с линией текстовый объект для отображения дополнительной информации.
  • Устанавливает цвет, размер шрифта и точку привязки текста в зависимости от направления.

3. Обновление графика:

  • chartRedraw(0): перерисовывает график для отражения изменений.


    Заключение

    Подводя итог, можно сказать, что пользовательские функции повышают качество торговли для трейдера, поскольку обеспечивает удобный, упрощенный доступ к значениям максимумов, минимумов и времени (high, low и time) баров. Объединив индикатор RSI с концепциями SMC, мы можем визуализировать индикаторы и подтвердить, что советник выполняет инструкции. Рисуя стрелку на графике, функция отмечает важные точки, то есть точки колебаний (максимумы и минимумы). Кроме того, можно наблюдать уровни пробоя. А еще у нас есть функция динамического обновления (Dynamic update), обеспечивающая актуальность графика в режиме реального времени с учетом самых последних маркеров и индикаторов, что облегчает визуальный анализ и принятие решений.

    Благодаря этому подробному руководству обеспечивается полное понимание путей интеграции концепции SMC с индикатором RSI в структуру и функциональность любого советника. Следуя пошаговому объяснению, читатели смогут теперь получить четкое представление о работе советника SMC_RSI — от инициализации переменных до совершения сделок на основе рассчитанных сигналов. Независимо от того, опытный вы трейдер или новичок, этот всесторонний обзор снабжает вас необходимыми знаниями для эффективного использования и адаптации этих мощных инструментов в ваших торговых начинаниях.

    Ниже приводятся результаты бэк-теста. Могу сказать, что советник все еще нуждается в некоторой оптимизации для получения более высокого профит-фактора. Вот результаты бэк-теста:

    backtest

    Теперь ниже можно видеть визуальное представление кривой эквити. Я проводил тестирование только за 12 месяцев, поэтому трудно точно сказать, как он будет работать для периода в 12 лет.

    equity curve

    Ссылки

    Исходная статья: https://www.mql5.com/en/articles/15017

    Перевод с английского произведен MetaQuotes Ltd.
    Оригинальная статья: https://www.mql5.com/en/articles/15030

    Прикрепленные файлы |
    SMC_RSI.mq5 (12.13 KB)
    Последние комментарии | Перейти к обсуждению на форуме трейдеров (3)
    Allan Munene Mutiiria
    Allan Munene Mutiiria | 22 июл. 2024 в 23:04

    В связи с вопросами авторского права эта статья напрямую копирует код по частям из оригинальной статьи, найденной на https://www.mql5.com/en/articles/15017, опубликованной @Allan Munene Mutiiria, которая изначально принадлежит автору. Вам следовало бы проявить вежливость и отметить оригинального автора реализованного контента, который также можно найти конкретно здесь, в видео на YouTube.

    Например:

    Оригинальный контент:

    ОРИГИНАЛ 1

    Авторский контент:

    КОПИРАЙТ 1

    По крайней мере, вы могли бы попытаться реализовать свою собственную логику, а не просто скопировать и вставить не только логику, но и точные используемые переменные. Вот пример:
    Оригинальный контент:

    ОРИГИНАЛ 2

    Авторское содержимое:

    КОПИРАЙТ 2

    Очевидно, что некоторое доверие заслуживает @Allan Munene Mutiiria




    Hlomohang John Borotho
    Hlomohang John Borotho | 30 июл. 2024 в 15:31
    Allan Munene Mutiiria #:

    В связи с вопросами авторского права эта статья напрямую копирует код по частям из оригинальной статьи, найденной на https://www.mql5.com/en/articles/15017, опубликованной @Allan Munene Mutiiria, которая изначально принадлежит автору. Вам следовало бы проявить вежливость и отметить оригинального автора реализованного контента, который также можно найти конкретно здесь, в видеоролике YouTube.

    Например:

    Оригинальный контент:


    Авторское содержимое:


    По крайней мере, вы могли бы попытаться реализовать свою собственную логику, а не просто скопировать и вставить не только логику, но и точные используемые переменные. Вот пример:
    Оригинальный контент:


    Авторское содержимое:


    Очевидно, что некоторое доверие заслуживает @Allan Munene Mutiiria




    Я прошу прощения у вас, сэр.

    Я отмечу вас под ссылками, первоначально я получил мотивацию из видео на YouTube от трейдера forex algo, я искренне не знал о существовании оригинальной статьи.
    Allan Munene Mutiiria
    Allan Munene Mutiiria | 7 авг. 2024 в 17:33
    Hlomohang John Borotho #:
    Я прошу прощения у вас, сэр.

    Я отмечу вас под ссылками, первоначально я получил мотивацию из видео на YouTube от трейдера forex algo, я искренне не знал о существовании оригинальной статьи.

    Нет проблем.

    Постфактумный анализ торговли: подбираем TrailingStop и новые стопы в тестере стратегий Постфактумный анализ торговли: подбираем TrailingStop и новые стопы в тестере стратегий
    Продолжаем тему анализа совершённых сделок в тестере стратегий для улучшения качества торговли. Проверим, как использование различных трейлингов поможет изменить уже полученные результаты торговли.
    От начального до среднего уровня: Оператор IF ELSE От начального до среднего уровня: Оператор IF ELSE
    В этой статье мы проанализируем, как работать с оператором IF и ее спутником ELSE, Данный оператор - самый важный и значимый из существующих в любом языке программирования. Однако, несмотря на простоту использования, он иногда приводит в замешательство, если у нас нет опыта его применения и связанных с ней понятий. Представленные здесь материалы предназначены только для обучения. Ни в коем случае не рассматривайте его как окончательное приложение, целью которого не является изучение представленных понятий.
    Нейросети в трейдинге: Иерархический двухбашенный трансформер (Hidformer) Нейросети в трейдинге: Иерархический двухбашенный трансформер (Hidformer)
    Предлагаем познакомиться с фреймворком иерархического двухбашенного трансформера (Hidformer), который был разработан для прогнозирования временных рядов и анализа данных. Авторы фреймворка предложили несколько улучшений к архитектуре Transformer, что позволило повысить точность прогнозов и снизить потребление вычислительных ресурсов.
    Переосмысливаем классические стратегии (Часть III): Прогнозирование более высоких максимумов и более низких минимумов Переосмысливаем классические стратегии (Часть III): Прогнозирование более высоких максимумов и более низких минимумов
    В статье мы эмпирически проанализируем классические торговые стратегии, чтобы увидеть, можно ли улучшить их с помощью искусственного интеллекта (ИИ). Мы попытаемся предсказать более высокие максимумы и более низкие минимумы, используя модель линейного дискриминантного анализа (Linear Discriminant Analysis).