新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1730

 
anrei2002 #:

不相关的箭头立即消失了!!!。

我不指望你能理解,我有一个客户有类似的问题,我一年都没能向他解释清楚,有一个不同的指标,但也有一个窥视。他似乎是个聪明人,但显然他对利益的渴求真的关闭了他的逻辑和思维。当他掏出很多钱的时候,他最终意识到了一切。我不知道该怎么办......如果你重置它,指标就会停止工作。如果你重新设置,只有右边的箭头保留,但在历史上...我已经看到了很多这样的指标

 
MakarFX #:
展示你已经做了什么。
#属性描述 "随机振荡器"
#属性严格

#属性 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
//----输入参数
输入 int InpKPeriod=5; // 输入K周期
输入 int InpDPeriod=3; // 输入 D Period
输入 int InpSlowing=3; // Slowing

输入字符串 PARA_Ref = "$USDX";
//input string PARA_Ref = "ETHUSD";


//--- 缓冲区
双倍ExtMainBuffer[]。
双重ExtSignalBuffer[]。
双重ExtHighesBuffer[]。
双重ExtLowesBuffer[]。

双重cl[]。
double hi[];
双倍lo[]。



//---
int draw_begin1=0。
int draw_begin2=0。
//+------------------------------------------------------------------+
//|自定义指标初始化功能
//+------------------------------------------------------------------+
int OnInit(void)
{
string short_name;
//---- 2个额外的缓冲区用于计数。
IndicatorBuffers(4)。
SetIndexBuffer(2, ExtHighesBuffer)。
SetIndexBuffer(3,ExtLowesBuffer)。
//----指标线
SetIndexStyle(0,DRAW_LINE)。
SetIndexBuffer(0,ExtMainBuffer)。
SetIndexStyle(1,DRAW_LINE)。
SetIndexBuffer(1,ExtSignalBuffer)。
//----数据窗口和指标子窗口标签的名称
short_name="Stochastic_Mult_1("+IntegerToString(InpKPeriod)+", "+IntegerToString(InpDPeriod)+", "+IntegerToString(InpSlowing)+")" 。
IndicatorShortName(short_name)。
SetIndexLabel(0,short_name)。
SetIndexLabel(1,"信号")。
//---
draw_begin1=InpKPeriod+InpSlowing。
draw_begin2=draw_begin1+InpDPeriod。
SetIndexDrawBegin(0,draw_begin1)。
SetIndexDrawBegin(1,draw_begin2)。
//----初始化完成
return(INIT_SUCCEED)。
}
//+------------------------------------------------------------------+
//| 随机震荡器 | |
//+------------------------------------------------------------------+
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;

//--------------------检查条数
if(rate_total<=InpKPeriod+InpDPeriod+InpSlowing)
return(0);
ArraySetAsSeries(ExtMainBuffer,false)。
ArraySetAsSeries(ExtSignalBuffer,false)。
ArraySetAsSeries(ExtHighesBuffer,false)。
ArraySetAsSeries(ExtLowesBuffer,false)。
ArraySetAsSeries(low,false)。
ArraySetAsSeries(high,false)。
ArraySetAsSeries(close,false)。

//---
pos=InpKPeriod-1。
如果(pos+1<prev_calculated)
pos=prev_calculated-2。
否则
{
for(i=0; i<pos; i++)
{
ExtLowesBuffer[i]=0.0。
ExtHighesBuffer[i]=0.0。
}
}
//---计算HighesBuffer[]和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)) // 原文: if(dmin>low[k])
dmin=iLow(PARA,0,n)* iLow(PARA_Ref,0,n); // 原文:dmin=low[k]。
if(dmax<iHigh(PARA,0,n)* iHigh(PARA_Ref,0,n)) // 原文: if(dmax<high[k])
dmax=iHigh(PARA,0,n)* iHigh(PARA_Ref,0,n); // 原文:dmax=high[k]。

}
ExtLowesBuffer[i]=dmin。
ExtHighesBuffer[i]=dmax。
}
//---- %K线
pos=InpKPeriod-1+InpSlowing-1。
如果(pos+1<prev_calculated)
pos=prev_calculated-2。
否则
{
for(i=0; i<pos; i++)
ExtMainBuffer[i]=0.0。
}
//---- 主循环
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]); // 原文: sumlow +=(close[k]-ExtLowesBuffer[k]) 。
sumhigh+=(ExtHighesBuffer[k]-ExtLowesBuffer[k])。
}
如果(sumhigh==0.0)
ExtMainBuffer[i]=100.0;
否则
ExtMainBuffer[i]=sumlow/sumhigh*100.0。
}
//---信号
pos=InpDPeriod-1。
如果(pos+1<prev_calculated)
pos=prev_calculated-2。
否则
{
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完成。返回新的prev_calculated。
return(rate_total)。
}
//+------------------------------------------------------------------+
 
它可以在不失去逻辑的情况下被修复,但它会在第8小节,甚至第9小节上画出箭头(但没有重画,也没有左信号)。你将需要这样,即新的和最新鲜的箭头将在第9条上。而且开放的延迟也将是9条。
 
Nikolay Ivanov #:

我不指望你能理解,我有一个客户有类似的问题,我一年都没能向他解释清楚,有一个不同的指标,但也有一个窥视装置。他似乎是个聪明人,但显然他对利益的渴求真的关闭了他的逻辑和思维。当他清空了大量的钱后,他最终意识到了一切。我不知道该怎么办......如果你重置它,指标就会停止工作。如果你重新设置,只有右边的箭头保留,但在历史上...我已经看到了很多这样的指标。

我不是程序员,但我还是不明白为什么箭头不能随着新蜡烛的出现而被纠正。

世界上有很多指标都有重新交叉,而它对所有的指标都能正常工作!箭头随着设定的交叉点移动,没有震荡。

他们都有相同的代码...

附加的文件:
02.png  15 kb
 
asdkika1 #:

最好把你想做的事写下来......一点一点地写。

 
anrei2002 #:

我不是程序员,但我还是不明白,为什么箭头不能随着新蜡烛的出现而被纠正?

世界上有很多指标都有重新交叉,而它对所有的指标都很好用!箭头随着设定的交叉点移动,没有震荡。

他们都有相同的代码。

正常的重排是指信号栏(箭头所在的位置)参与了信号的计算,并可能有0的索引...就是说,目前的酒吧...它每隔一段时间就会重新绘制,而且,信号也可以分别重新绘制...

但除了第0条,你还用了-1 -2 -3 -4 -5 -6 -7......第8条的负数从哪里来?使用第0条也是不好的......而带有负数指数的条形图是根本无法接受的......

我在上面写了如何修复它...如果你等待信号到8条的右边,那么它就能正常工作,不认为箭头会一直晚9条,你想这样吗?

 
MakarFX #:

最好把你想做的事写下来......一点一点地写。

从两对的乘法中计算随机性。
只是把标准的随机指数指标,改为
输入数据(标记的行)。
我从来没有使用过OnCalculate--显然这就是狗被埋葬的地方。
不起作用--搞不清楚原因。
我希望我不需要
我希望我不需要自己重新设计它。
 
Nikolay Ivanov #:

正常的超标是指信号条本身(箭头所在的位置)参与了信号外观的计算,可以有0的指数...这就是当前的酒吧...每一个刻度都会被重新绘制,因此,信号也可能被重新绘制...

但除了第0条,你还用了-1 -2 -3 -4 -5 -6 -7......第8条的负数从哪里来?使用第0条也是不好的......而带有负数指数的条形图是根本无法接受的......

我在上面写了如何修复它...如果你等待信号到8条的右边,那么一切都会正常工作,不认为箭头会一直晚9条,你想这样吗?

这里是另一个此类指标的例子!

他除了图表上的箭头外,在地下室的线条交汇处还有圆圈。

而圆圈,与箭头相反,是严格意义上的线的交汇点后面!没有多余的圆圈。

为什么没有箭头?

附加的文件:
03.png  98 kb
EATA__Alert.mq4  20 kb
 
anrei2002 #:

下面是其中另一个指标的例子!

除了图表上的箭头外,它在地下室的线条交汇处还有圆圈。

而圆圈,与箭头不同的是,严格意义上讲,是在线条的交汇点后面的!这也是为什么我们要把圆圈作为我们的目标。没有多余的圆圈。

为什么箭头有问题呢?

在测试器中运行该指标,观察加速时可视化的线条和圆圈...如果在这之后仍然没有意义,我不知道还能如何简单解释......

 
asdkika1 #:
从两对的乘法中 随机计算。
只是把标准的随机指数指标,改为
输入数据(标记的行)。
我从未使用过OnCalculate - 我想这就是问题所在。
不起作用--搞不清楚原因。
我希望我不需要
我希望我不必自己重做。 这应该是非常简单的。

倍增什么?开?关闭?斯托奇?