Помогите новичку...
Нужно изменить стандартный Стохастик - индикатор (на MT4 (MQL4)) так, что бы он рассчитывался не от одной пары,
а от суммы/умножения нескольких пар. Пытаюсь 2 дня - всё насмарку.
Кому не трудно - помогите, или, может, где есть подскажите...
- Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
- Помогите с индикатором.
- Помогите c изменением индикатора
asdkika1:
Помогите новичку...
Нужно изменить стандартный Стохастик - индикатор (на MT4 (MQL4)) так, что бы он рассчитывался не от одной пары,
а от суммы/умножения нескольких пар. Пытаюсь 2 дня - всё насмарку.
Кому не трудно - помогите, или, может, где есть подскажите...
Сюда пора, с таким уровнем развития
Торговые приложения для MetaTrader 5 на заказ
- 2021.11.08
- www.mql5.com
Самый большой фриланс c разработчиками программ на MQL5
asdkika1:
Помогите новичку...
Нужно изменить стандартный Стохастик - индикатор (на MT4 (MQL4)) так, что бы он рассчитывался не от одной пары,
а от суммы/умножения нескольких пар. Пытаюсь 2 дня - всё насмарку.
Кому не трудно - помогите, или, может, где есть подскажите...
как Вы это делаете?
покажите, подправим
#property description "Stochastic Oscillator"
#property strict
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
#property indicator_buffers 2
#property indicator_color1 LightSeaGreen
#property indicator_color2 Red
#property indicator_level1 20.0
#property indicator_level2 80.0
#property indicator_levelcolor clrSilver
#property indicator_levelstyle STYLE_DOT
//--- input parameters
input int InpKPeriod=5; // K Period
input int InpDPeriod=3; // D Period
input int InpSlowing=3; // Slowing
input string PARA_Ref = "$USDX";
input string PARA = "ETHUSD";
//--- buffers
double ExtMainBuffer[];
double ExtSignalBuffer[];
double ExtHighesBuffer[];
double ExtLowesBuffer[];
double cl[];
double hi[];
double lo[];
//---
int draw_begin1=0;
int draw_begin2=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit(void)
{
string short_name;
//--- 2 additional buffers are used for counting.
IndicatorBuffers(4);
SetIndexBuffer(2, ExtHighesBuffer);
SetIndexBuffer(3, ExtLowesBuffer);
//--- indicator lines
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0, ExtMainBuffer);
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1, ExtSignalBuffer);
//--- name for DataWindow and indicator subwindow label
short_name="Stochastic_Mult_1("+IntegerToString(InpKPeriod)+","+IntegerToString(InpDPeriod)+","+IntegerToString(InpSlowing)+")";
IndicatorShortName(short_name);
SetIndexLabel(0,short_name);
SetIndexLabel(1,"Signal");
//---
draw_begin1=InpKPeriod+InpSlowing;
draw_begin2=draw_begin1+InpDPeriod;
SetIndexDrawBegin(0,draw_begin1);
SetIndexDrawBegin(1,draw_begin2);
//--- initialization done
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Stochastic oscillator |
//+------------------------------------------------------------------+
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[])
{
int i,k,pos,n;
//--- check for bars count
if(rates_total<=InpKPeriod+InpDPeriod+InpSlowing)
return(0);
//--- counting from 0 to rates_total
ArraySetAsSeries(ExtMainBuffer,false);
ArraySetAsSeries(ExtSignalBuffer,false);
ArraySetAsSeries(ExtHighesBuffer,false);
ArraySetAsSeries(ExtLowesBuffer,false);
ArraySetAsSeries(low,false);
ArraySetAsSeries(high,false);
ArraySetAsSeries(close,false);
//---
pos=InpKPeriod-1;
if(pos+1<prev_calculated)
pos=prev_calculated-2;
else
{
for(i=0; i<pos; i++)
{
ExtLowesBuffer[i]=0.0;
ExtHighesBuffer[i]=0.0;
}
}
//--- calculate HighesBuffer[] and ExtHighesBuffer[]
for(i=pos; i<rates_total && !IsStopped(); i++)
{
double dmin=1000000.0;
double dmax=-1000000.0;
for(k=i-InpKPeriod+1; k<=i; k++)
{
n = i-k;
if(dmin>iLow(PARA,0,n)* iLow(PARA_Ref,0,n)) // original: if(dmin>low[k])
dmin=iLow(PARA,0,n)* iLow(PARA_Ref,0,n); // original: dmin=low[k];
if(dmax<iHigh(PARA,0,n)* iHigh(PARA_Ref,0,n)) // original: if(dmax<high[k])
dmax=iHigh(PARA,0,n)* iHigh(PARA_Ref,0,n); // original: dmax=high[k];
}
ExtLowesBuffer[i]=dmin;
ExtHighesBuffer[i]=dmax;
}
//--- %K line
pos=InpKPeriod-1+InpSlowing-1;
if(pos+1<prev_calculated)
pos=prev_calculated-2;
else
{
for(i=0; i<pos; i++)
ExtMainBuffer[i]=0.0;
}
//--- main cycle
for(i=pos; i<rates_total && !IsStopped(); i++)
{
double sumlow=0.0;
double sumhigh=0.0;
for(k=(i-InpSlowing+1); k<=i; k++)
{
n = i-k;
sumlow +=((iClose(PARA,0,n) * iClose(PARA_Ref,0,n))-ExtLowesBuffer[k]); // original: sumlow +=(close[k]-ExtLowesBuffer[k]);
sumhigh+=(ExtHighesBuffer[k]-ExtLowesBuffer[k]);
}
if(sumhigh==0.0)
ExtMainBuffer[i]=100.0;
else
ExtMainBuffer[i]=sumlow/sumhigh*100.0;
}
//--- signal
pos=InpDPeriod-1;
if(pos+1<prev_calculated)
pos=prev_calculated-2;
else
{
for(i=0; i<pos; i++)
ExtSignalBuffer[i]=0.0;
}
for(i=pos; i<rates_total && !IsStopped(); i++)
{
double sum=0.0;
for(k=0; k<InpDPeriod; k++)
sum+=ExtMainBuffer[i-k];
ExtSignalBuffer[i]=sum/InpDPeriod;
}
//--- OnCalculate done. Return new prev_calculated.
return(rates_total);
}
//+------------------------------------------------------------------+
Не получается переделать индикатор MQL4 на MQL5.
- 2021.05.19
- www.mql5.com
Здравствуйте. Индикатор Trend Filter.mq4 скачан на просторах интернета. Задача переделать для МТ5. Индикатор не сложный, но я не справился...
asdkika1 #:
#property description "Stochastic Oscillator"
#property strict
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
#property indicator_buffers 2
#property indicator_color1 LightSeaGreen
#property indicator_color2 Red
#property indicator_level1 20.0
#property indicator_level2 80.0
#property indicator_levelcolor clrSilver
#property indicator_levelstyle STYLE_DOT
//--- input parameters
input int InpKPeriod=5; // K Period
input int InpDPeriod=3; // D Period
input int InpSlowing=3; // Slowing
input string PARA_Ref = "$USDX";
input string PARA = "ETHUSD";
//--- buffers
double ExtMainBuffer[];
double ExtSignalBuffer[];
double ExtHighesBuffer[];
double ExtLowesBuffer[];
double cl[];
double hi[];
double lo[];
//---
int draw_begin1=0;
int draw_begin2=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit(void)
{
string short_name;
//--- 2 additional buffers are used for counting.
IndicatorBuffers(4);
SetIndexBuffer(2, ExtHighesBuffer);
SetIndexBuffer(3, ExtLowesBuffer);
//--- indicator lines
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0, ExtMainBuffer);
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1, ExtSignalBuffer);
//--- name for DataWindow and indicator subwindow label
short_name="Stochastic_Mult_1("+IntegerToString(InpKPeriod)+","+IntegerToString(InpDPeriod)+","+IntegerToString(InpSlowing)+")";
IndicatorShortName(short_name);
SetIndexLabel(0,short_name);
SetIndexLabel(1,"Signal");
//---
draw_begin1=InpKPeriod+InpSlowing;
draw_begin2=draw_begin1+InpDPeriod;
SetIndexDrawBegin(0,draw_begin1);
SetIndexDrawBegin(1,draw_begin2);
//--- initialization done
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Stochastic oscillator |
//+------------------------------------------------------------------+
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[])
{
int i,k,pos,n;
//--- check for bars count
if(rates_total<=InpKPeriod+InpDPeriod+InpSlowing)
return(0);
//--- counting from 0 to rates_total
ArraySetAsSeries(ExtMainBuffer,false);
ArraySetAsSeries(ExtSignalBuffer,false);
ArraySetAsSeries(ExtHighesBuffer,false);
ArraySetAsSeries(ExtLowesBuffer,false);
ArraySetAsSeries(low,false);
ArraySetAsSeries(high,false);
ArraySetAsSeries(close,false);
//---
pos=InpKPeriod-1;
if(pos+1<prev_calculated)
pos=prev_calculated-2;
else
{
for(i=0; i<pos; i++)
{
ExtLowesBuffer[i]=0.0;
ExtHighesBuffer[i]=0.0;
}
}
//--- calculate HighesBuffer[] and ExtHighesBuffer[]
for(i=pos; i<rates_total && !IsStopped(); i++)
{
double dmin=1000000.0;
double dmax=-1000000.0;
for(k=i-InpKPeriod+1; k<=i; k++)
{
n = i-k;
if(dmin>iLow(PARA,0,n)* iLow(PARA_Ref,0,n)) // original: if(dmin>low[k])
dmin=iLow(PARA,0,n)* iLow(PARA_Ref,0,n); // original: dmin=low[k];
if(dmax<iHigh(PARA,0,n)* iHigh(PARA_Ref,0,n)) // original: if(dmax<high[k])
dmax=iHigh(PARA,0,n)* iHigh(PARA_Ref,0,n); // original: dmax=high[k];
}
ExtLowesBuffer[i]=dmin;
ExtHighesBuffer[i]=dmax;
}
//--- %K line
pos=InpKPeriod-1+InpSlowing-1;
if(pos+1<prev_calculated)
pos=prev_calculated-2;
else
{
for(i=0; i<pos; i++)
ExtMainBuffer[i]=0.0;
}
//--- main cycle
for(i=pos; i<rates_total && !IsStopped(); i++)
{
double sumlow=0.0;
double sumhigh=0.0;
for(k=(i-InpSlowing+1); k<=i; k++)
{
n = i-k;
sumlow +=((iClose(PARA,0,n) * iClose(PARA_Ref,0,n))-ExtLowesBuffer[k]); // original: sumlow +=(close[k]-ExtLowesBuffer[k]);
sumhigh+=(ExtHighesBuffer[k]-ExtLowesBuffer[k]);
}
if(sumhigh==0.0)
ExtMainBuffer[i]=100.0;
else
ExtMainBuffer[i]=sumlow/sumhigh*100.0;
}
//--- signal
pos=InpDPeriod-1;
if(pos+1<prev_calculated)
pos=prev_calculated-2;
else
{
for(i=0; i<pos; i++)
ExtSignalBuffer[i]=0.0;
}
for(i=pos; i<rates_total && !IsStopped(); i++)
{
double sum=0.0;
for(k=0; k<InpDPeriod; k++)
sum+=ExtMainBuffer[i-k];
ExtSignalBuffer[i]=sum/InpDPeriod;
}
//--- OnCalculate done. Return new prev_calculated.
return(rates_total);
}
//+------------------------------------------------------------------+
при компиляции предупрежедний нет?
например тут у Вас double делится на int
ExtSignalBuffer[i]=sum/InpDPeriod;
будет ошибка расчета
желательно так
ExtSignalBuffer[i]=sum/(double)InpDPeriod;
с этого начнем
пробуйте
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь