Задача:
снимать значения индикатора с более высокого таймфрейма (Н4), на Н1. Имеются ввиду, что надо узнать значение индикатора (на ещё не завершённом баре) выраженного через iCustom на нулевом баре Н4, который будет отображаться на Н1.
iCustom(Symbol(),PERIOD_H4,"Indicator Name",..... Indicator Params...,bufNumb,0);
Попробуйте так. Для любого т\ф, младше 4-х часовок.
Задача:
снимать значения индикатора с более высокого таймфрейма (Н4), на Н1. Имеются ввиду, что надо узнать значение индикатора (на ещё не завершённом баре) выраженного через iCustom на нулевом баре Н4, который будет отображаться на Н1.
Я вот ломал себе голову, но не могу придумать как это сделать.
Попробуйте так. Для любого т\ф, младше 4-х часовок.
Я пробовал уже, но не помогает((( Просто одна длинная линия на весь экран. Здесь в чём-то другом проблема.
посмотрите два варианта тут https://www.mql5.com/ru/code/9603
Так у меня идея как раз и родилась от этого примера, но только я хочу применить JMA сглаживание для этого
Так у меня идея как раз и родилась от этого примера, но только я хочу применить 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);
}
//+------------------------------------------------------------------+
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Задача:
снимать значения индикатора с более высокого таймфрейма (Н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;
}