Перевести скрипт spine (tradingview) в индикатор mql (meta trader 4)

#pine-script #mql4

#pine-скрипт #mql4

Вопрос:

Я хотел бы преобразовать скрипт Pine из скрипта trading view в индикатор mq4 для meta trader 4.

Вот скрипт для перевода скрипта Pine из trading view:

 
rsiLength = input(title="RSI Length", type=input.integer, defval=14)
lbLength = input(title="Look Back Length", type=input.integer, defval=5)
avgLength = input(title="Average Length", type=input.integer, defval=8)
drawSig = input(title="Signal On/Off?", type=input.bool, defval=false)
sigLength = input(title="Signal Length", type=input.integer, defval=6)
src = input(title="Source", type=input.source, defval=close)
ob = input(title="Over Bought", type=input.integer, defval=80)
os = input(title="Over Sold", type=input.integer, defval=20)

avgRSI(rsiLength, lookBack, avgLen) =>
    rsi = rsi(src, rsiLength)
    rsiLowest = lowest(rsi, lookBack)
    rsiHighest = highest(rsi, lookBack)
    avgRSILow = sma(rsi - rsiLowest , avgLen)
    avgHiLow = sma(rsiHighest - rsiLowest, avgLen)

    return = 100 / (.01   avgHiLow / avgRSILow)
    return


rsi = avgRSI( rsiLength, lbLength, avgLength )

plot(series=rsi, title="StochRSI", color=color.red, transp=0)
signal = drawSig ? sma(rsi, sigLength) : na
plot(series=signal, title="StochRSI Signal", color=color.orange, transp=0)
h1 = hline(price=ob, title="OB")
h2 = hline(price=os, title="OS")
fill(h1, h2)
 

Я не понимаю эти две строки:

     avgRSILow = sma(rsi - rsiLowest , avgLen)
    avgHiLow = sma(rsiHighest - rsiLowest, avgLen)
 

Это мой код для metatrader 4:

 double lineBuffer[];
int rsiLength = 5;
int lbLength = 5;
int avgLength = 8;
int sigLength = 6;


int OnInit()
  {
   SetIndexBuffer(0, lineBuffer);
   return(INIT_SUCCEEDED);
  }

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime amp;time[],
                const double amp;open[],
                const double amp;high[],
                const double amp;low[],
                const double amp;close[],
                const long amp;tick_volume[],
                const long amp;volume[],
                const int amp;spread[])
{
   
   int uncalculatedBar = rates_total - prev_calculated;
   
   for(int i = 0; i < uncalculatedBar; i  ){
      double rsi = iRSI(NULL, NULL, rsiLength, PRICE_CLOSE, i);
      double rsiLowest = lowestRSI(lbLength, i);
      double rsiHighest = highestRSI(lbLength, i);
      double avgRSILow = lowAverageRsi(avgLength, i, rsiLowest);
      double avgHiLow = lowHighRsiAverage(avgLength, rsiLowest, rsiHighest);
      lineBuffer[i] =  100 / (.01   avgHiLow / avgRSILow);
   }
   return(rates_total);
}

// Return lowest rsi value for the last x values (->loopback) from a specific index (->start)
double lowestRSI(int loopback, int start) {
   double lowest_rsi = iRSI(NULL, NULL, rsiLength, PRICE_CLOSE, start);
   for(int i = start   1; i <= start   loopback; i  ){
      if(iRSI(NULL, NULL, rsiLength, PRICE_CLOSE, i) < lowest_rsi){
         lowest_rsi = iRSI(NULL, NULL, rsiLength, PRICE_CLOSE, i);
      }
   }
   return lowest_rsi;
}

// Return highest rsi value for the last x values (->loopback) from a specific index (->start)
double highestRSI(int loopback, int start) {
   double highest_rsi = iRSI(NULL, NULL, rsiLength, PRICE_CLOSE, start);
   for(int i = start   1; i <= start   loopback; i  ){
      if(iRSI(NULL, NULL, rsiLength, PRICE_CLOSE, i) > highest_rsi){
         highest_rsi = iRSI(NULL, NULL, rsiLength, PRICE_CLOSE, i);
      }
   }
   return highest_rsi;
}

// Calculate rsi average for last x values (-> loopback) minus lowestRsi
double lowAverageRsi(int loopback, int start, double lowestRsi) {
   double low_average_rsi = 0;
   for(int i = start; i < start   loopback; i  ){
      low_average_rsi = low_average_rsi   ((iRSI(NULL, NULL, rsiLength, PRICE_CLOSE, i) - lowestRsi) / loopback);
   }
   return low_average_rsi;
}

// Calculate avergage for last x values between two values
double lowHighRsiAverage(int loopback, double lowestRsi, double highestRSI) {
   double low_high_rsi_average = 0;
   for(int i = 0; i < loopback; i  ){
      low_high_rsi_average = low_high_rsi_average   ((highestRSI - lowestRsi) / loopback);
   }
   return low_high_rsi_average;
}
 

Я застрял, я не знаю, что делать, если вы можете мне помочь, это было бы здорово

Ответ №1:

idk, если вы хотите, чтобы код был объяснен, или если вам нужно обойти из-за характера кодирования mt4.

 avgRSILow = sma(rsi, avgLen) - sma(rsiLowest , avgLen)
avgHiLow = sma(rsiHighest, avgLen) - sma(rsiLowest, avgLen)
 

приведенный выше код дает тот же результат, что и

 avgRSILow = sma(rsi - rsiLowest , avgLen)
avgHiLow = sma(rsiHighest - rsiLowest, avgLen)
 

его просто x количество значений обратно усредняется с использованием функции sma и вычитанием значения друг для друга. определите природу кода, который зависит от создателя, но он представляет собой всего лишь средние результаты прошлых значений x amount lengh или rsi со средним значением наименьшего значения x amount lookback.

если у вас все еще есть сомнения, просто попробуйте лучше объяснить то, что вы не понимаете…

Комментарии:

1. Спасибо, что ответили мне K4eMi, можете ли вы объяснить мне, что делает эта функция «Pine»? sma (rsi, avgLen) Для меня функция sma tradingview принимает массив и целое число (количество итераций) в качестве параметра, но «rsiLowest» — это целое число, а не массив, так что же делает функция «sma (rsiLowest , avgLen)»?