布林带有3个RSI在地下室运行。
我想以这样的方式检查信号:当3个RSI击中上部Bbands的区域时,有一个信号向下,反之亦然:
int start(){
double ma, stdev;
int i, limit, count=IndicatorCounted();
if(count<0) return(0);
limit=Bars-count;
if(limit>1) limit=Bars-1;
for(i=limit; i>=0; i--) {
RSI[i] =iRSI(Symbol(),Period(),rsi_period, PRICE_CLOSE,i);
RSI2[i]=iRSI(Symbol(),Period(),rsi_period_2,PRICE_CLOSE,i);
RSI3[i]=iRSI(Symbol(),Period(),rsi_period_3,PRICE_CLOSE,i);
}
for(i=limit; i>=0; i--) {
ma=iMAOnArray(RSI3,0,bb_period,0,0,i); // midle line
stdev=iStdDevOnArray(RSI3,0,bb_period,0,0,i); // dev
BBUP[i]=ma+bb_dev*stdev; // up line
BBDOWN[i]=ma-bb_dev*stdev; // down line
UP[i]=0;
DOWN[i]=0;
}
if(limit<Bars-1) limit++;
for(i=limit; i>0; i--) {
if(RSI[i] <= BBDOWN[i] && RSI[i+1] > BBDOWN[i+1] && RSI2[i] <= BBDOWN[i] && RSI2[i+1] > BBDOWN[i+1] && RSI3[i] <= BBDOWN[i] && RSI3[i+1] > BBDOWN[i+1]){
DOWN[i] = iLow(_Symbol, _Period, i);
}
if(RSI[i] >= BBUP[i] && RSI[i+1] < BBUP[i+1] &&W RSI2[i] >= BBUP[i] && RSI2[i+1] < BBUP[i+1] && RSI3[i] >= BBUP[i] && RSI3[i+1] < BBUP[i+1]){
UP[i]= iHigh(_Symbol, _Period, i);
}
}
整个问题是我有非常弯曲的信号。
出现在他们不应该的地方,而且没有地方。
答案 0 :(得分:1)
如果TARGET要计算&amp;在GUI上绘制布林带上的RSI3[]
值,最好的方法是使用:
UPPER[i] = iBandsOnArray( RSI3, // ArrayAsSeries[]
array_calculation_depth, // reduce overheads
BB_MA_period, // BBands period
BB_StDev_MUL, // how many sigmas
BB_Zero_Shift, // #DEFINE BB_Zero_Shift 0
MODE_UPPER, // BBands upper line
i // shifting operator[i]
);
这样可以有效地生成每个{ MODE_UPPER | MODE_MAIN | MODE_LOWER }
布林带线,始终生成无维RSI3[]
数据,从而保护感觉< / strong>信号组合中的任何加法运算与其他无维度数据,如{ RSI2[], RSI[] }
。
鉴于GUI相应地显示行,可以尝试组合信号条件。 &#34; hot&#34; -bar [0]
是一个活动栏,如果没有经过适当的专业护理,新手可能会遇到欺骗信号情况。
仅在步骤0之后)&amp; 1)发生并且都满足了自己先前的期望,任何代码开始都有意义建立。
答案 1 :(得分:0)
来自MQL4文档https://docs.mql4.com/indicators/imaonarray
与
iMA(...)
不同,iMAOnArray()
功能不会占用数据 符号名称,时间范围,应用价格。价格数据必须是 以前准备好了指标从左到右计算。 访问数组元素的系列数组(即从右边开始) 要离开),必须使用ArraySetAsSeries()
功能。
RSI3目前从右到左(0是最近的时间点,限制是最远的元素)。
与iStdDevOnArray()
修复这些问题,它应该可以正常工作。 在RSI上绘制布林带是否有任何价值是另一回事
函数ArraySetAsSeries()
可用于在从左到右和从右到左之间交换数组
首次初始化RSI数组时(在OnInit()
中)告诉MetaTrader终端它们是时间序列。
ArraySetAsSeries(RSI1,True);
ArraySetAsSeries(RSI2,True);
ArraySetAsSeries(RSI3,True);
然后在主体中,在第二个for循环之前添加ArraySetAsSeries(RSI3,False);
以交换数组方向。然后在循环后ArraySetAsSeries(RSI3,True);
恢复数组方向。
for(i=limit; i>=0; i--) {
RSI[i ] = iRSI(Symbol(),Period(),rsi_period,PRICE_CLOSE,i);
RSI2[i] = iRSI(Symbol(),Period(),rsi_period_2,PRICE_CLOSE,i);
RSI3[i] = iRSI(Symbol(),Period(),rsi_period_3,PRICE_CLOSE,i);
}
ArraySetAsSeries(RSI3,False);
for(i=limit; i>=0; i--) {
ma=iMAOnArray(RSI3,0,bb_period,0,0,i); // midle line
stdev=iStdDevOnArray(RSI3,0,bb_period,0,0,i); // dev
BBUP[i]=ma+bb_dev*stdev; // up line
BBDOWN[i]=ma-bb_dev*stdev; // down line
UP[i]=0;
DOWN[i]=0;
}
ArraySetAsSeries(RSI3,True);
if(limit<Bars-1) limit++;
for(i=limit; i>0; i--) {
if( RSI[i] <= BBDOWN[i] &&
RSI[i+1] > BBDOWN[i] &&
RSI2[i] <= BBDOWN[i] &&
RSI2[i+1] > BBDOWN[i] &&
RSI3[i] <= BBDOWN[i] &&
RSI3[i+1] > BBDOWN[i]) {
DOWN[i] = iLow(_Symbol, _Period, i);
}
if( RSI[i] >= BBUP[i] &&
RSI[i+1] < BBUP[i+1] &&
RSI2[i] >= BBUP[i] &&
RSI2[i+1] < BBUP[i+1] &&
RSI3[i] >= BBUP[i] &&
RSI3[i+1] < BBUP[i+1]) {
UP[i]= iHigh(_Symbol, _Period, i);
}
}
您需要浏览MQL4 Documentation并了解指标的正确结构。需要一个OnInit()
函数来初始化值。然后是OnCalculate()
函数,用于填充指标缓冲区。
//+-----------------------------------------------------------------+
//| Custom indicator initialization function |
//+-----------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
ArraySetAsSeries(RSI3,True);
//---
return(INIT_SUCCEEDED);
}
//+-----------------------------------------------------------------+
//| Custom indicator iteration function |
//+-----------------------------------------------------------------+
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[])
{
// Do your calculations here
//--- return value of prev_calculated for next call
return(rates_total);
}
如果您使用 iBandsOnArray()
来计算布林带,则在OnInit()
如果指标正在编译但崩溃,则需要对其进行调试。最简单的方法是查看日志中的错误并在整个代码中添加PrintFormat()语句,这样您就可以看到指标在不同点上的作用,并查看它崩溃的位置。