Индикатор на основе индикатора tradingview.com "Кривая линейной регрессии"

작업 종료됨

실행 시간 3 일
고객의 피드백
Блестящая работа, точно по спецификации!
피고용인의 피드백
Понятное ТЗ - отличный результат, всё закономерно. Приятно было поработать с Артёмом. Надеюсь на дальнейшее сотрудничество.

명시




Есть вот такой индикатор "Кривая линейной регрессии" для сайта tradingview.com:


Его исходный код:

//@version=4

study("LR Breakthrough Alert", shorttitle="LR Br. Alert", overlay=true)


upperMult = input(title="Upper Deviation", defval=2)

lowerMult = input(title="Lower Deviation", defval=-2)


useUpperDev = input(title="Use Upper Deviation", defval=true)

useLowerDev = input(title="Use Lower Deviation", defval=true)

showPearson = input(title="Show Pearson's R", defval=true)

extendLines = input(title="Extend Lines", defval=false)


len = input(title="Count", defval=100)

src = input(title="Source", defval=close)


extend = extendLines ? extend.right : extend.none


calcSlope(src, len) =>

    if not barstate.islast or len <= 1

        [float(na), float(na), float(na)]

    else

        sumX = 0.0

        sumY = 0.0

        sumXSqr = 0.0

        sumXY = 0.0

        for i = 0 to len - 1

            val = src[i]

            per = i + 1.0

            sumX := sumX + per

            sumY := sumY + val

            sumXSqr := sumXSqr + per * per

            sumXY := sumXY + val * per

        slope = (len * sumXY - sumX * sumY) / (len * sumXSqr - sumX * sumX)

        average = sumY / len

        intercept = average - slope * sumX / len + slope

        [slope, average, intercept]


[s, a, i] = calcSlope(src, len)


startPrice = i + s * (len - 1)

endPrice = i

var line baseLine = na


if na(baseLine) and not na(startPrice)

    baseLine := line.new(bar_index - len + 1, startPrice, bar_index, endPrice, width=1, extend=extend, color=color.red)

else

    line.set_xy1(baseLine, bar_index - len + 1, startPrice)

    line.set_xy2(baseLine, bar_index, endPrice)

    na


calcDev(src, len, slope, average, intercept) =>

    upDev = 0.0

    dnDev = 0.0

    stdDevAcc = 0.0

    dsxx = 0.0

    dsyy = 0.0

    dsxy = 0.0

    

    periods = len - 1


    daY = intercept + (slope * periods) / 2

    val = intercept

    

    for i = 0 to periods

        price = high[i] - val

        if (price > upDev)

            upDev := price


        price := val - low[i]

        if (price > dnDev)

            dnDev := price


        price := src[i]

        dxt = price - average

        dyt = val - daY

        

        price := price - val

        stdDevAcc := stdDevAcc + price * price

        dsxx := dsxx + dxt * dxt

        dsyy := dsyy + dyt * dyt

        dsxy := dsxy + dxt * dyt

        val := val + slope

    

    stdDev = sqrt(stdDevAcc / (periods == 0 ? 1 : periods))

    pearsonR = dsxx == 0 or dsyy == 0 ? 0 : dsxy / sqrt(dsxx * dsyy)

    [stdDev, pearsonR, upDev, dnDev]


[stdDev, pearsonR, upDev, dnDev] = calcDev(src, len, s, a, i)


upperStartPrice = startPrice + (useUpperDev ? upperMult * stdDev : upDev)

upperEndPrice = endPrice + (useUpperDev ? upperMult * stdDev : upDev)

var line upper = na


lowerStartPrice = startPrice + (useLowerDev ? lowerMult * stdDev : -dnDev)

lowerEndPrice = endPrice + (useLowerDev ? lowerMult * stdDev : -dnDev)

var line lower = na


if na(upper) and not na(upperStartPrice)

    upper := line.new(bar_index - len + 1, upperStartPrice, bar_index, upperEndPrice, width=1, extend=extend, color=#0000ff)

else

    line.set_xy1(upper, bar_index - len + 1, upperStartPrice)

    line.set_xy2(upper, bar_index, upperEndPrice)

    na


if na(lower) and not na(lowerStartPrice)

    lower := line.new(bar_index - len + 1, lowerStartPrice, bar_index, lowerEndPrice, width=1, extend=extend, color=#0000ff)

else

    line.set_xy1(lower, bar_index - len + 1, lowerStartPrice)

    line.set_xy2(lower, bar_index, lowerEndPrice)

    na


Нужно написать такой же для MQ4.

Вот есть текущие наработки по нему на языке MQ4, но неправильно рисует:

#property strict

//--- input parameters

input int      len=100;

input bool     useUpperDev=true;

input bool     useLowerDev=true;

input bool     showPearson=true;

input bool     extendLines=false;

//--- indicator buffers

double         Label1Buffer[];


int OnInit() {

//--- indicator buffers mapping

   SetIndexBuffer(0,Label1Buffer);

   return(INIT_SUCCEEDED);

}


void calcDev(double &src[], int len, double slope, double average, double intercept, double &result[]) {

   double upDev = 0.0;

   double dnDev = 0.0;

   double stdDevAcc = 0.0;

   double dsxx = 0.0;

   double dsyy = 0.0;

   double dsxy = 0.0;

   

   int periods = len - 1;

   

   double daY = intercept + (slope * periods) / 2;

   double val = intercept;

   

   for (int i = 0; i <= periods; i++) {

      double price = iHigh(NULL, 0, i) - val;

      if (price > upDev) {

         upDev = price;

      }

   

      price = val - iLow(NULL, 0, i);

      if (price > dnDev) {

         dnDev = price;

      }

   

      price = iClose(NULL, 0, i);

      double dxt = price - average;

      double dyt = val - daY;

     

      price = price - val;

      stdDevAcc = stdDevAcc + price * price;

      dsxx = dsxx + dxt * dxt;

      dsyy = dsyy + dyt * dyt;

      dsxy = dsxy + dxt * dyt;

      val = val + slope;

   }

   

   double stdDev = sqrt(stdDevAcc / (periods == 0 ? 1 : periods));

   double pearsonR = (dsxx == 0 || dsyy == 0 ? 0 : dsxy / sqrt(dsxx * dsyy));

   

   result[0] = stdDev;

   result[1] = pearsonR;

   result[2] = upDev;

   result[3] = dnDev;

}


void calcSlope(int len, double &result[]) {

   double sumX = 0.0;

   double sumY = 0.0;

   double sumXSqr = 0.0;

   double sumXY = 0.0;

   //for (int i = 0; i < len-1; i++) {

   for (int i = len-1; i > 0; i--) {

      double val = iClose(NULL, 0, i);

      double per = i + 1.0;

      sumX = sumX + per;

      sumY = sumY + val;

      sumXSqr = sumXSqr + per * per;

      sumXY = sumXY + val * per;

   }

   double slope = (len * sumXY - sumX * sumY) / (len * sumXSqr - sumX * sumX);

   double average = sumY / (len);

   double intercept = average - slope * sumX / len + slope;

   

   result[0] = slope;

   result[1] = average;

   result[2] = intercept;

}


int OnCalculate(const int rates_total,

                const int prev_calculated,

                const datetime &time[],

                const double &open[],

                const double &high[],

                const double &low[],

                const double &close[],

                const long &tick_volume[],

                const long &volume[],

                const int &spread[]) {

   double calcSlopeResults[3];

   double calcDevResults[4];

   

   calcSlope(len, calcSlopeResults);

   double s = calcSlopeResults[0];

   double a = calcSlopeResults[1];

   double i = calcSlopeResults[2];

   

   double startPrice = i + s * (len - 1);

   double endPrice = i;

   

   //baseLine := line.new(bar_index - len + 1, startPrice, bar_index, endPrice, width=1, extend=extend, color=color.red)

   ObjectDelete(0, "LR Base Line");

   datetime time1 = iTime(NULL, NULL, 1);

   datetime time2 = iTime(NULL, NULL, len);

   // Рисуем base line (должна быть посередине канала):

   if (!ObjectCreate(0, "LR Base Line", OBJ_TREND, 0, time1, startPrice, time2, endPrice)) { 

      Print(__FUNCTION__, ": не удалось создать линию. Код ошибки = ", GetLastError());

      return(false);

   }

   ObjectSetInteger(0, "LR Base Line", OBJPROP_RAY_RIGHT, false); 

   Print("time1: " + time1 + "; time2: " + time2 + "; startPrice: " + startPrice + "; endPrice: " + endPrice);


   return(rates_total);

}



Нужно доработать/исправить этот скрипт, чтобы он рисовал канал линейной регрессии как на tradingview.com.

Чтобы проверить правильность работы индикатора, нужно в tradingview.com открыть график любой валютной пары, нажать кнопку «индикаторы» и добавить индикатор «Кривая линейной регрессии».


응답함

1
개발자 1
등급
(156)
프로젝트
167
34%
중재
4
25% / 25%
기한 초과
3
2%
작업중
비슷한 주문
Technical task Make dashboard for several signals for choose for mt4 and mt5 with source code TimeFrames show (1m,5m,15m,30m,1h,4h,1d,7d,30d) For mt5 other TF (choose) Life time on current tf for live candle (back time to 0 before new) (true\false) Size Colour Symbols import from wathlist Signals for choose (only 1): 1)Current price into bb or ouside BB period, shift, std 2)Trend by MA MA period, shift, types 3)Price
Modify Cycles 7 Fibo based on MA and BB for mt4 and mt5 Modify indicator Cycles 7 for mt4 and mt4 and give source code with comments Add 2 modes (not cyclic), ray is always true: 1)Auto by MA to price (MA period, shift) Object appear at cross price MA (wait N bars), then this draw before new cross, then first object is dissapear 2)Auto by BB to price (BB period, std) Object appear at cross price BB line (for up trend
Здравствуйте! 1. Введение Настоящее техническое задание описывает требования к разработке торгового робота для автоматизированной торговли на рынке Forex. Основной задачей робота является выполнение сделок на основе заданных алгоритмов и стратегий, минимизация рисков и максимизация прибыли. 2. Цели и задачи Цель: Разработать торгового робота, который автоматически выполняет сделки на рынке Forex, основываясь на
Modify indicator Cycles 4 with rectangle Make indictor for mt4 and mt5 with comments in source code This indicator based on Cycles_4 Parametres MA1 - is default MA2 (yes or no) - yes - value add (if not 3 MA - 2nd in trend MA, also if only 1 MA without 2 and 3) Trend MA (true\false) - true - yes - value add Revers rect - true/false Fix rect by height - true\false, like how user add and this remember in the exit from
Приобрету вашего робота если он: 1.Статистически прибылен на 99% качества тиков (если есть журнал сделок (фхбук) за последние года - будет большим преимуществом) 2. ЭТО НЕ МАРТИНГЕЙЛ ИЛИ СЕТКА, роботов с такими моделями я не рассматриваю априори 3. Одиночные трейды с ТП и СЛ 4. Не ХТФ, без стратегий которые зарабатывают на хеджировании В остальном готов рассмотреть ваши предложения Присылайте статистку за последние 3

프로젝트 정보

예산
30 - 56 USD
개발자에게
27 - 50.4 USD