Запутался

 

Задача:

снимать значения индикатора с более высокого таймфрейма (Н4), на Н1. Имеются ввиду, что надо узнать значение индикатора (на ещё не завершённом баре) выраженного через iCustom на нулевом баре Н4, который будет отображаться на Н1.

Я вот ломал себе голову, но не могу придумать как это сделать.

 

  int limit=300;
for(i=limit; i>=0; i--)
{
j=iBarShift(Symbol(), PERIOD_H4, iTime(Symbol(), PERIOD_H1, i));

Ma_Price=Close[i];
JMAVol= iCustom(Symbol(),PERIOD_H4,"_0000xdigma",0,IndicatorPeriod,-100,0,1,-100,3,0,Ma_Price,0,j);

  IndBuffer[i]= JMAVol;

}  
 

 
blo0ds:

Задача:

снимать значения индикатора с более высокого таймфрейма (Н4), на Н1. Имеются ввиду, что надо узнать значение индикатора (на ещё не завершённом баре) выраженного через iCustom на нулевом баре Н4, который будет отображаться на Н1.



iCustom(Symbol(),PERIOD_H4,"Indicator Name",..... Indicator Params...,bufNumb,0);

Попробуйте так. Для любого т\ф, младше 4-х часовок.

 
blo0ds:

Задача:

снимать значения индикатора с более высокого таймфрейма (Н4), на Н1. Имеются ввиду, что надо узнать значение индикатора (на ещё не завершённом баре) выраженного через iCustom на нулевом баре Н4, который будет отображаться на Н1.

Я вот ломал себе голову, но не могу придумать как это сделать.

посмотрите два варианта тут https://www.mql5.com/ru/code/9603
 
VladislavVG:

Попробуйте так. Для любого т\ф, младше 4-х часовок.




Я пробовал уже, но не помогает((( Просто одна длинная линия на весь экран. Здесь в чём-то другом проблема.
 
sergeev:
посмотрите два варианта тут https://www.mql5.com/ru/code/9603


Так у меня идея как раз и родилась от этого примера, но только я хочу применить JMA сглаживание для этого
 
blo0ds:


Так у меня идея как раз и родилась от этого примера, но только я хочу применить JMA сглаживание для этого

Если просто сгладить - то это один вопрос. И надо просто дать в алгоритм JMA сформированный массив как в этом примере. То есть вам надо в коде JMA расчетный массив редактировать по принципу из примера - с подменой последнего бара.

 

Сделал, но что то опять не так.... Я получил лесенку с старшего таймфрейма, но не зафиксированные значения на старшем. Я хочу заменить стандартную МА на JMA/ Красным вставленный код.

 

//+------------------------------------------------------------------+
//| RSI_JMA.mq4 |
//| Weld, Jurik Research |
//| weld.torguem.net |
//+------------------------------------------------------------------+
#property copyright "Weld"
#property link "weld.torguem.net"
//I'm just intresting in 11 JMA and 8 JMA on 15M charts. No trading
//activity just alert.

#property indicator_chart_window //#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 DodgerBlue
#property indicator_color2 Red
#property indicator_width1 1
#property indicator_width2 1

//---- input parameters

extern int JMA_Length = 2;
extern int JMA_Phase = -100;
extern int CountBars = 1000;
extern int Step = 2;
extern int TF=240;
extern bool ShowSimple=false;


//---- buffers
double JMAValueBuffer [];
double RSIValueBuffer [];
double fC0Buffer [];
double fA8Buffer [];
double fC8Buffer [];


//---- temporary buffers
double list[128], ring1[128], ring2[11], buffer[62];

//---- bool flag
bool initFlag;

//---- integer vars
int limitValue, startValue, loopParam, loopCriteria;
int cycleLimit, highLimit, counterA, counterB;

//---- double vars
double cycleDelta, lowDValue, highDValue, absValue, paramA, paramB, Norma;
double JMA_PhaseParam, logParam, JMAValue, series, sValue, sqrtParam, JMA_LengthDivider;

//---- temporary int variables
int s58, s60, s40, s38, s68;

//+------------------------------------------------------------------+
//| JMA initFlagization function |
//+------------------------------------------------------------------+
int init(){
double JMA_LengthParam;
CountBars=CountBars+JMA_Length*10;

//---- 3 additional buffers are used for counting.
IndicatorBuffers(5);

//---- drawing settings
SetIndexStyle (0, DRAW_LINE);
SetIndexStyle (1, DRAW_LINE);

//---- 4 indicator buffers mapping
SetIndexBuffer (0, RSIValueBuffer);
SetIndexBuffer (1, JMAValueBuffer);
SetIndexBuffer (2, fC0Buffer);
SetIndexBuffer (3, fA8Buffer);
SetIndexBuffer (4, fC8Buffer);

//---- initialize one buffer (neccessary)
ArrayInitialize (ring2, 0);
ArrayInitialize (ring1, 0);
ArrayInitialize (buffer, 0);

//---- name for DataWindow and indicator subwindow label
IndicatorShortName ("RSI("+JMA_Length+") => JMAValue(" + JMA_Length + "," + JMA_Phase + ")");
SetIndexLabel (0, "RSI");
SetIndexLabel (1, "JMA_RSI");

//---- initial part
limitValue = 63;
startValue = 64;

//----
for (int i = 0; i <= limitValue; i++) list [i] = -1000000;
for (i = startValue; i <= 127; i++) list [i] = 1000000;

//----
initFlag = true;
if (JMA_Length <1.0000000002) JMA_LengthParam = 0.0000000001;
else JMA_LengthParam = (JMA_Length - 1) / 2.0;

//----
if (JMA_Phase <-100) JMA_PhaseParam = 0.5;
else if (JMA_Phase > 100) JMA_PhaseParam = 2.5;
else JMA_PhaseParam = JMA_Phase / 100.0 + 1.5;
//----
logParam = MathLog (MathSqrt (JMA_LengthParam)) / MathLog (2.0);
//----
if (logParam + 2.0 < 0) logParam = 0;
else logParam = logParam + 2.0;
//----
sqrtParam = MathSqrt(JMA_LengthParam) * logParam;
JMA_LengthParam = JMA_LengthParam * 0.9;
JMA_LengthDivider = JMA_LengthParam / (JMA_LengthParam + 2.0);

//----
return;
}

int start()
{
int tf,limit1, ntf, i1, n, j1, counted_bars1=IndicatorCounted();
string smb=Symbol(); if(Bars<=JMA_Length) return(0);
double d, d2, MA[],PR[]; ArraySetAsSeries(PR, true); ArraySetAsSeries(MA, true);
if(counted_bars1<1) for(i1=1;i1<=JMA_Length;i1++) MA[Bars-i1]=EMPTY_VALUE;




tf=Period(); ntf=TF; n=iBars(smb, ntf); ArrayResize(PR, n); ArrayResize(MA, n);
for (i1=0; i1<n; i1++) // копируем расчетные цены со старшего ТФ
PR[i1]=iClose(smb, ntf, i1);
for(i1=Bars-1; i1>=0; i1--)
{
j1=iBarShift(smb, ntf, iTime(smb, tf, i1)); // получаем смещение бара на старшем ТФ от текузего бара текущего ТФ
if (!ShowSimple) { d=PR[j1]; PR[j1]=iClose(smb, tf, i1); }
MA[j1]=PR[j1]; //iMAOnArray(PR, 0, PeriodMA, 0, ModeMA, j); // определяем значение МА
if (!ShowSimple) {PR[j1]=d;}
}







if (CountBars>Bars) CountBars=Bars;
SetIndexDrawBegin(0, Bars-CountBars+JMA_Length*10);
SetIndexDrawBegin(1, Bars-CountBars+JMA_Length*10);
//---- get already counted bars
int counted_bars = IndicatorCounted();

//---- check for possible errors
if (counted_bars < 0) return (-1);
//int limit = (Bars - counted_bars) + JMA_Length*5;
int limit = CountBars;



//---- main cycle
  for (int shift = limit; shift >= 0; shift--) {


j1=iBarShift(smb, ntf, iTime(smb, tf, shift));
  series = MA[j1]; 

RSIValueBuffer[shift] = series;



if (loopParam < 61) {
loopParam++;
buffer [loopParam] = series;
}else
{
//Alert(loopParam+ " " + Bars); //если раскомментировать будет сильно тормозить.
}

if (loopParam > 30) {
if (initFlag) {
initFlag = false;

int diffFlag = 0;
for (int i = 1; i <= 29; i++) {
if (buffer [i + 1] != buffer [i]) diffFlag = 1;
}
highLimit = diffFlag * 30;

if (highLimit == 0) paramB = series;
else paramB = buffer[1];

paramA = paramB;
if (highLimit > 29) highLimit = 29;
} else
highLimit = 0;

//---- big cycle
for (i = highLimit; i >= 0; i--) {
if (i == 0) sValue = series;
else sValue = buffer [31 - i];

if (MathAbs (sValue - paramA) > MathAbs (sValue - paramB))
absValue = MathAbs(sValue - paramA);
else absValue = MathAbs(sValue - paramB);

double dValue = absValue + 0.0000000001; //1.0e-10;

if (counterA <= 1) counterA = 127; else counterA--;
if (counterB <= 1) counterB = 10; else counterB--;
if (cycleLimit < 128) cycleLimit++;
cycleDelta += (dValue - ring2 [counterB]);
ring2 [counterB] = dValue;

if (cycleLimit > 10) highDValue =
cycleDelta / 10.0; else highDValue = cycleDelta / cycleLimit;

if (cycleLimit > 127) {
dValue = ring1 [counterA];
ring1 [counterA] = highDValue;
s68 = 64; s58 = s68;
while (s68 > 1) {
if (list [s58] < dValue) {
s68 = s68 / 2.0;
s58 += s68;
} else
if (list [s58] <= dValue){
s68 = 1;
} else {
s68 = s68 / 2.0;
s58 -= s68;
}
}
} else {
ring1 [counterA] = highDValue;
if ((limitValue + startValue) > 127) {
startValue--;
s58 = startValue;
} else {
limitValue++;
s58 = limitValue;
}
if (limitValue > 96) s38 = 96;
else s38 = limitValue;
if (startValue < 32) s40 = 32;
else s40 = startValue;
}
//----
s68 = 64;
s60 = s68;
while (s68 > 1) {
if (list [s60] >= highDValue) {
if (list [s60 - 1] <= highDValue) {
s68 = 1;
}
else {
s68 = s68 / 2.0;
s60 -= s68;
}
}
else {
s68 = s68 / 2.0;
s60 += s68;
}
if ((s60 == 127) && (highDValue > list[127])) s60 = 128;
}
if (cycleLimit > 127) {
if (s58 >= s60) {
if (((s38 + 1) > s60) && ((s40 - 1) < s60))
lowDValue += highDValue;
else if ((s40 > s60) && ((s40 - 1) < s58))
lowDValue += list [s40 - 1];
}
else if (s40 >= s60) {
if (((s38 + 1) < s60) && ((s38 + 1) > s58))
lowDValue += list[s38 + 1];
}
else if ((s38 + 2) > s60)
lowDValue += highDValue;
else if (((s38 + 1) < s60) && ((s38 + 1) > s58))
lowDValue += list[s38 + 1];

if (s58 > s60) {
if (((s40 - 1) < s58) && ((s38 + 1) > s58))
lowDValue -= list [s58];
else if ((s38 < s58) && ((s38 + 1) > s60))
lowDValue -= list[s38];
}
else {
if (((s38 + 1) > s58) && ((s40 - 1) < s58))
lowDValue -= list [s58];
else if ((s40 > s58) && (s40 < s60))
lowDValue -= list [s40];
}
}
if (s58 <= s60) {
if (s58 >= s60) list[s60] = highDValue; else {
for (int j = s58 + 1; j <= (s60 - 1); j++) {
list [j - 1] = list[j];
}
list [s60 - 1] = highDValue;
}
} else {
for (j = s58 - 1; j >= s60; j--) {
list [j + 1] = list [j];
}
list [s60] = highDValue;
}

if (cycleLimit <= 127) {
lowDValue = 0;
for (j = s40; j <= s38; j++) {
lowDValue += list[j];
}
}
//----
if ((loopCriteria + 1) > 31) loopCriteria = 31; else loopCriteria++;
double JMATempValue, sqrtDivider = sqrtParam / (sqrtParam + 1.0);

if (loopCriteria <= 30) {
if (sValue - paramA > 0) paramA = sValue; else paramA = sValue - (sValue - paramA) * sqrtDivider;
if (sValue - paramB < 0) paramB = sValue; else paramB = sValue - (sValue - paramB) * sqrtDivider;
JMATempValue = series;

if (loopCriteria == 30) {
fC0Buffer [shift] = series;
int intPart;

if (MathCeil(sqrtParam) >= 1) intPart = MathCeil(sqrtParam); else intPart = 1;
int leftInt = IntPortion (intPart);
if (MathFloor(sqrtParam) >= 1) intPart = MathFloor(sqrtParam); else intPart = 1;
int rightPart = IntPortion (intPart);

if (leftInt == rightPart) dValue = 1.0;
else
dValue = (sqrtParam - rightPart) / (leftInt - rightPart);

if (rightPart <= 29) int upShift = rightPart; else upShift = 29;
if (leftInt <= 29) int dnShift = leftInt; else dnShift = 29;
fA8Buffer [shift] = (series - buffer [loopParam - upShift]) * (1 - dValue) / rightPart + (series - buffer[loopParam - dnShift]) * dValue / leftInt;
}
} else {
double powerValue, squareValue;

dValue = lowDValue / (s38 - s40 + 1);
if (0.5 <= logParam - 2.0) powerValue = logParam - 2.0;
else powerValue = 0.5;

if (logParam >= MathPow(absValue/dValue, powerValue)) dValue = MathPow (absValue/dValue, powerValue); else dValue = logParam;
if (dValue < 1) dValue = 1;

powerValue = MathPow (sqrtDivider, MathSqrt (dValue));
if (sValue - paramA > 0) paramA = sValue; else paramA = sValue - (sValue - paramA) * powerValue;
if (sValue - paramB < 0) paramB = sValue; else paramB = sValue - (sValue - paramB) * powerValue;
}
}
// ---- end of big cycle
if (loopCriteria > 30) {
JMATempValue = JMAValueBuffer [shift + 1];
powerValue = MathPow (JMA_LengthDivider, dValue);
squareValue = MathPow (powerValue, 2);

fC0Buffer [shift] = (1 - powerValue) * series + powerValue * fC0Buffer [shift + 1];
fC8Buffer [shift] = (series - fC0Buffer [shift]) * (1 - JMA_LengthDivider) + JMA_LengthDivider * fC8Buffer [shift + 1];

fA8Buffer [shift] = (JMA_PhaseParam * fC8Buffer [shift] + fC0Buffer [shift] - JMATempValue) *
(powerValue * (-2.0) + squareValue + 1) + squareValue * fA8Buffer [shift + 1];
JMATempValue += fA8Buffer [shift];
}
JMAValue = JMATempValue;
}

if (loopParam <= 30)
JMAValue = 0;

// JMAValue= (JMAValue+10)*20;

// JMAValueBuffer [shift] = (MathExp(2.0 * JMAValue) - 1.0) / (MathExp(2.0 * JMAValue) + 1.0); //JMAValue

Norma = Step * Point;
JMAValue /= Norma;
JMAValue = NormalizeDouble(JMAValue, 0);
JMAValue *= Norma;



JMAValueBuffer [shift] = JMAValue;

}
return;
}

//+------------------------------------------------------------------+
int IntPortion (double param) {
if (param > 0) return (MathFloor (param));
if (param < 0) return (MathCeil (param));
return (0.0);
}
//+------------------------------------------------------------------+
 

Причина обращения: