Невозможно рассчитать правильный объем RSI в MQL4 с работающим примером Pine-Script

Я хочу «перевести» Pine-Script на MQL4, но получаю неверный вывод в MQL4 по сравнению с Pine-Script в Trading-view.

Я написал индикатор на Pine-Script, так как это кажется довольно простым. После того, как я получил результат, который искал, я сократил Pine-Script. Вот рабочий Pine-Script:

// Pinescript - whole Code to recreate the Indicator
   study( "Volume RSI", shorttitle = "VoRSI" )

   periode = input( 3, title = "Periode", minval = 1 )
   VoRSI   = rsi( volume, periode )

   plot( VoRSI, color = #000000, linewidth = 2 )

Теперь я хочу перевести этот код на MQL4, но получаю разные результаты.

Вот код MQL4, который я написал до сих пор:

// MQL4 Code

   input int InpRSIPeriod = 3; // RSI Period

   double sumn  = 0.0;
   double sump  = 0.0;
   double VoRSI = 0.0;
   int i = 0;

   void OnTick()  {

       for ( i; i < InpRSIPeriod; i++ )  {
          // Check if the Volume is buy or sell
             double     close = iClose( Symbol(), 0, i );
             double old_close = iClose( Symbol(), 0, i + 1 );

             if ( close - old_close < 0 )
             {
               // If the Volume is positive, add it up to the positive sum "sump"
                  sump = sump + iVolume( Symbol(), 0, i + 1 );
                  }
             else
             {
               // If the Volume is negative, add it up to the negative sum "sumn"
                  sumn = sumn + iVolume( Symbol(), 0, i + 1 );
                  }
       }

    // Get the MA of the sump and sumn for the Input Period
       double Volume_p = sump / InpRSIPeriod;
       double Volume_n = sumn / InpRSIPeriod;

    // Calculate the RSI for the Volume
       VoRSI = 100 - 100 / ( 1 + Volume_p / Volume_n );

    // Print Volume RSI for comparison with Tradingview  
       Print( VoRSI );

    // Reset the Variables for the next "OnTick" Event
       i    = 0;
       sumn = 0;
       sump = 0;
    }

Я уже проверил, совпадают ли период, символ и таймфрейм, а также сделал снимок экрана с различными выходами.

введите здесь описание изображения


Я уже пытался следовать объяснениям функций в pine-скрипте для функций rsi, max, rma и sma, но я не могу получить никаких результатов, которые кажутся наполовину выполненными.


Я рассчитываю перевести Pine-Script на MQL4.

Я не хочу рисовать весь объем RSI в качестве индикатора на графике. Я просто хочу рассчитать значение Volume RSI за весь последний период (когда открывается новая свеча), чтобы проверить, достигает ли оно значения выше 80. После этого я хочу проверить, когда оно снова опустится ниже 80, и использовать это как пороговое значение. следует ли открывать сделку или нет.

Мне нужна простая функция, которая получает период в качестве входных данных и принимает текущую пару и таймфрейм, чтобы вернуть желаемое значение от 0 до 100. До сих пор мой перевод сохраняется, чтобы предоставить неправильное выходное значение.

Что я упустил в расчете? Может ли кто-нибудь сказать мне, как правильно рассчитать мой индикатор Tradingview с помощью MQL4?


person Patrik Hörmann    schedule 13.09.2019    source источник


Ответы (1)


В : Может ли кто-нибудь сказать мне, как правильно рассчитать мой индикатор Tradingview с помощью MQL4?

Ваш основной промах цели заключается в том, что вы помещаете код в неправильный тип MQL4-кода. Терминал MetaTrader может разместить индикатор с помощью MQL4-кода типа Custom Indicator.

Там вы должны объявить так называемые индикаторные буферы, которые содержат предварительно вычисленные значения указанного индикатора, и эти буферы отдельно отображаются на индикаторы-линии (в зависимости от типа стиля представления GUI - линии, область-между- линии и др.).

Если вы настаиваете на использовании индикатора без Custom-Indicator, что вполне законно и необходимо в некоторых случаях использования, вам необходимо реализовать собственную «механизацию» рисования линий в отдельном подокне графического интерфейса в Expert-Advisor-код, где вы будете управлять всеми настройками и строить графики "вручную" как хотите, сегмент за сегментом (мы используем это по многим причинам при прототипировании, чтобы избежать всех Custom-Indicator зависимостей и call-interface грубые мелочи во время интеграции сложной торговой экзосистемы — так что я уверен в выполнимости и преимуществах производительности и затратах на этот путь).

Решение за вами, MQL4 может сделать это в любом случае.


Вопрос : Что я упустил в расчете?

БОНУСНАЯ ЧАСТЬ: скрытая жемчужина для улучшения производительности...

При любом способе использования Custom-Indicator-типа-MQL4-кода или Expert-Advisor-типа-MQL4-кода решение можно избежать пересчета по-QUOTE-прихода всей «глубины» RSI. Есть замороженная часть и одна, горячая часть линии индикатора, и с точки зрения производительности более чем разумно хранить static записей «старых» и замороженных данных и просто обновлять «живую» горячую часть индикатора. индикатор-линия. Это значительно экономит задержку ответа, которую ваш графический интерфейс потребляет из любого цикла ответа в реальном времени...

person user3666197    schedule 13.09.2019
comment
На первый вопрос: я не хочу рисовать весь объем RSI в качестве индикатора на графике. Я просто хочу рассчитать значение Volume RSI, чтобы проверить, поднимается ли оно выше 80, а затем снова опускается ниже 80, и использовать его в качестве порогового значения, следует ли открывать сделку или нет. - person Patrik Hörmann; 13.09.2019
comment
Сказав это, просто рассчитайте значения внутри EA OnTick(), как было рекомендовано выше, и автоматизируйте правильную обработку буфера внутри вашего собственного кода, чтобы следовать более разумному пути, чем повторные вычисления полной глубины грубой силы, как указано в БОНУСНАЯ ЧАСТЬ. Других проблем нет. - person user3666197; 17.09.2019