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

 
Northwest:

1.把所有东西放回去,不要折磨电脑

对不起,但你不能这样做,指标必须从左到右数。

我不去管它,我把它用于它的预期目的。

2.使用存储在阵列中的数据计算的iBandsOnArray、iStdDevOnArray

是的,它们是用bbMacd[]数组的数据计算出来的,那么接下来呢?

3.数组在一个循环中被填充

在一个还是在第一个?

你是说,为了填充一个数组,你需要一个个人循环,在这个循环中填充这个数组

阵列被填满,不能进行其他操作?


对我来说,重要的是找出指标变慢的原因,以及如何计算那些发生这种情况的地方。

我有更多的问题,但没有答案。

不幸的是,你没有提供任何线索。

如果某样东西是用数组建立的,它应该是用一个已经存在的数组建立的。这是阵列准备的一个周期,也是该阵列绘制指标的第二个周期。这是一个一般的案例。还有一些更特殊的情况,但它们应该单独考虑 - 例如,我们可以创建函数,只从一个计算栏中返回值。

//+------------------------------------------------------------------+
//| BandsOnArray                                                     |
//+------------------------------------------------------------------+
double BandsOnArray(const int rates_total,const int index,const int period,const double deviation_bb,const double &array[],const int line,const bool as_series=true)
  {
//--- check position
   bool check_index=(as_series ? index<=rates_total-period-1 : index>=period-1);
   if(period<1 || !check_index)
      return 0;
   //--- calculate StdDev
   double dev=StdDevOnArray(rates_total,index,period,array);
   //--- base line
   double mid=0;              
   for(int i=0; i<period; i++)
      mid+=array[index+i];    
   mid/=period;               
   //--- upper line
   double top=mid+dev*deviation_bb;
   //--- lower line
   double btm=mid-dev*deviation_bb;
   return(line==UPPER_BAND ? top : line==LOWER_BAND ? btm : mid);
  }  
//+------------------------------------------------------------------+
//| StdDevOnArray                                                    |
//+------------------------------------------------------------------+
double StdDevOnArray(const int rates_total,const int index,const int period,const double &array[],const bool as_series=true)
  {
//--- check position
   bool check_index=(as_series ? index<=rates_total-period-1 : index>=period-1);
   if(period<1 || !check_index)
      return 0;
//--- calculate value
   double avg=0;              
   for(int i=0; i<period; i++)
      avg+=array[index+i];    
   avg/=period;               
   double sd=0;
   for(int i=0; i<period; i++)
      sd+=(avg-array[index+i])*(avg-array[index+i]);
   return(sqrt(sd/period));
  }  
//+------------------------------------------------------------------+

但是它们也需要一个已经准备好的数据数组作为输入,因为StdDevOnArray和BandsOnArray使用了简单平滑,对于它来说,需要填充等于周期 平滑值的数据。

 

关于交易、自动交易系统和策略测试的论坛

对MQL4新手的任何问题,对算法和代码的帮助和讨论

Artyom Trishkin, 2018.11.18 20:21

PlotIndexSetInteger(0,PLOT_ARROW,140)。

你需要创建一个与周数相等的缓冲区。而对于每个缓冲区,你必须给出一个从140到149的箭头代码--1、2、3、4、5、6、7、8、9、10--十个星期够不够一年?这只有70天。或者你想怎么做?


是否可以通过案例来覆盖SetIndexArrow?

或者至少在直方图上显示这些数字?


关于交易、自动交易系统和策略测试的论坛

任何关于MQL4初学者的问题,帮助和讨论算法和代码

Artyom Trishkin, 2018.11.18 20:02

缓冲区被填充了一个小时的数值。而如果小时数为零,直方图就不会被画出来。因此,我们必须检查小时数是否等于零(我们在设置中设置为搜索零小时数),如果等于零,我们必须在缓冲区中输入0.1而不是小时数(零)--以显示柱状图栏。这将在数据窗口中显示一个0的值,而不是0.1,因为指标Digits被设置为零


我现在明白了,谢谢你。

 
psyman:

SetIndexArrow能否被一个案例所覆盖?

或者至少在柱状图上显示这些数字?



我现在明白了,谢谢你。

它一次性地作用于整个缓冲区

你需要在发现栏上放一个周数的图标,那里应该是一年的周数。数字箭头在Wingdings中明显丢失。

可以用对象文本转出,用周数的值标记条,但将缓冲区的图标设置为32--一个空字符。该值将出现在条形图上,但不会被显示。然后值可以是一年中的周数,在对象中写上你想要的任何内容,对象就会显示在发现的条形图上。

 

关于交易、自动交易系统和策略测试的论坛

关于MQL4的初学者的任何问题,对算法和代码的帮助和讨论

Artyom Trishkin, 2018.11.19 10:50 am

它一次性地作用于整个缓冲区

你需要在发现栏上放一个周数图标,那里应该有一年的周数。数字箭头在Wingdings中明显丢失。

你可以用对象文字转过来,用周数的数值标记条,但缓冲区的图标要设置32--一个空字符。该值将出现在条形图上,但不会被显示。然后值可以是一年中的周数,在对象中写上你想要的任何内容,对象就会显示在发现的条形图上。


我写的是一周中的一天--周一、周二、周三,而不是数字。你只需要在图表上做5个不同的标记。

 
psyman:

我写的是一周中的一天--周一、周二、周三,而不是数字。你只需要在图表上做五个不同的标记。

那么你需要五个缓冲区,并为每个缓冲区分配一个不同的箭头数字--从140到144。

 
Artyom Trishkin:

如果某样东西是用数组建立的,那么它应该是用一个已经准备好的数组建立的。而这是阵列准备的一个周期,第二个周期是由这个阵列绘制指标。这是一个一般的案例。还有一些更特殊的情况,但它们应该单独考虑 - 例如,我们可以创建函数,只从一个计算栏中返回值。

但是它们也需要一个已经准备好的数据数组作为输入,因为StdDevOnArray和BandsOnArray使用了简单平滑,对于它来说,需要填充等于周期平滑值的数据。

谢谢你对情况的澄清。
 

你好

我如何制作一个带有按钮的弹出窗口,以手动确认/取消交易?

 
Andrey Sokolov:

你好

我如何制作一个带有按钮的弹出窗口,以手动确认/取消交易?

讯息框()
 
Artyom Trishkin:
讯息框()

谢谢

 

大家好。

我怎样才能获得与测试器中一样的最大缩减百分比?

以下是代码。

double  MaxPeak,DD, MaxDD, DD2, MaxDD2;
--------------------------------------
--------------------------------------
это вывод:

 SM("Maximal drawdown        : " + DoubleToString(MaxDrawdown_Money(), 2)+ " (" + DoubleToString(MaxDrawdown_Protsent(), 2) +" %)");

-------------------------------------
-------------------------------------

//--------------------Рассчет % относительной просадки----------
double MaxDrawdown_Protsent()
{
if (AccountEquity() > MaxPeak)
{
MaxPeak = AccountEquity();
}
if (AccountEquity() < MaxPeak)
{
DD2 = NormalizeDouble((MaxPeak - AccountEquity())/MaxPeak*100,2);
}
if (MaxDD2< DD2)
{
MaxDD2 = DD2;
}
return (MaxDD2);
}
//---------------------Рассчет суммы максимальной просадки--------
double MaxDrawdown_Money()
{
if (AccountEquity() > MaxPeak)
{
MaxPeak = AccountEquity();
}
if (AccountEquity() < MaxPeak)
{
DD = NormalizeDouble(MaxPeak - AccountEquity(),2);
}
if (MaxDD< DD)
{
MaxDD = DD;
}
return (MaxDD);
}

最大缩水的数额与测试者相同,相对缩水的百分比也与测试者相同。

我怎样才能获得 测试 器中一样的最大缩减百分比?

原因: