MQL5的股权振荡器意味着 - 页 2

 
DV2010: 但为什么不断变化的 股票价值 没有显示在指标上,尽管不断变化的价值(检查!)被写入指标数组中?

那里什么也没写,循环也没被调用。自己检查一下吧。
 

这就是问题所在:该循环在所有滴答声中都被调用。

你自己看吧!我是故意把输出放在循环的主体里的。

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[]){
   for (int i = prev_calculated; i <= rates_total-1; ++i){
      Print("Equity - OnCalculate - Cycle: prev_calculated=",prev_calculated,"   rates_total=",rates_total);
      Print("Equity - OnCalculate - Cycle: AccountInfoDouble(ACCOUNT_EQUITY)=", AccountInfoDouble(ACCOUNT_EQUITY));
      Values[i] = AccountInfoDouble(ACCOUNT_EQUITY);
   }
   return rates_total;
}

这就是最终的结果。

2011.01.20 13:58:56     Core 1  OnTester result 0
2011.01.20 13:58:56     Core 1  2011.01.14 23:59:59   order performed sell 0.15 at 1.33829 [#13 sell 0.15 EURUSD at 1.33829]
2011.01.20 13:58:56     Core 1  2011.01.14 23:59:59   deal performed [#13 sell 0.15 EURUSD at 1.33829]
2011.01.20 13:58:56     Core 1  2011.01.14 23:59:59   deal #13 sell 0.15 EURUSD at 1.33829 done (based on order #13)
2011.01.20 13:58:56     Core 1  2011.01.14 23:59:59   position closed due end of test at 1.33829 [buy 0.15 EURUSD 1.33593]
2011.01.20 13:58:56     Core 1  2011.01.14 22:00:00   Equity - OnCalculate - Cycle: AccountInfoDouble(ACCOUNT_EQUITY)=9949.299999999999
2011.01.20 13:58:56     Core 1  2011.01.14 22:00:00   Equity - OnCalculate - Cycle: prev_calculated=6418   rates_total=6419
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   CTrade::PositionOpen: instant buy 0.15 EURUSD at 1.33593 [done at 0.00000]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   order performed buy 0.15 at 1.33593 [#12 buy 0.15 EURUSD at 1.33593]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   deal performed [#12 buy 0.15 EURUSD at 1.33593]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   deal #12 buy 0.15 EURUSD at 1.33593 done (based on order #12)
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   instant buy 0.15 EURUSD at 1.33593 (1.33577 / 1.33593 / 1.33577)
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   CTrade::PositionClose: instant buy 0.15 EURUSD at 1.33593 [done at 0.00000]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   order performed buy 0.15 at 1.33593 [#11 buy 0.15 EURUSD at 1.33593]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   deal performed [#11 buy 0.15 EURUSD at 1.33593]
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   deal #11 buy 0.15 EURUSD at 1.33593 done (based on order #11)
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   instant buy 0.15 EURUSD at 1.33593 (1.33577 / 1.33593 / 1.33577)
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   Equity - OnCalculate - Cycle: AccountInfoDouble(ACCOUNT_EQUITY)=9929.65
2011.01.20 13:58:56     Core 1  2011.01.14 21:00:00   Equity - OnCalculate - Cycle: prev_calculated=6417   rates_total=6418
 
DV2010:

这就是问题所在:该循环在所有滴答声中都被调用。

你自己看吧!我是故意把输出放在循环的主体里的。

这就是最终的结果。

测试与此有什么关系?在图表上 运行该指标,你会看到。只要别忘了给我做编辑。
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
  • www.mql5.com
Операции с графиками / ChartIndicatorAdd - Документация по MQL5
 

在这里测试的原因是,我需要在历史上看到测试期内股权的变化。

我已经做了你的修正,我在测试模式 下和将其拖到一个新的图表中都运行了该指标。

该指标适用于整个时期,直到当前的报价,以及任何时间框架(或者说 "你将看到一切 "到底是什么意思?)

然而,公平值保持不变,尽管输出到日志中显示它在变化。

( 否则,除了通过Print,我们还能怎样判断循环是否工作?)

...为了以防万一,这里是附有指标的专家顾问的 "骨架"。

#property copyright "Copyright 2010, Pavlov Sergei"
#property link      ""
#property version   "1.00"

#include <\..\Experts\_My\Classes\ClassExpert\ClassExpert.mqh>
ClassExpert Expert1;

int Equity1=0;
void OnInit(){
   Equity1 = iCustom(NULL,0,"Equity",
                          5,          // Период
                          0,          // Смещение
                          MODE_SMA,   // Метод рассчета
                          PRICE_CLOSE // считаем по ценам закрытия)
                          );
   Expert1.Init();
}
void OnTick(){
   Expert1.OnTick();
}
void OnDeinit(const int reason){
   Expert1.Deinit();
}
 
DV2010:

在这里测试的原因是,我需要在历史上看到测试期内股权的变化。

我已经做了你的修正,我在测试模式下运行了该指标,并将其拖放到一个新图表上。

该指标适用于整个时期,直到当前的报价,以及任何时间框架(或者说 "你将看到一切 "到底是什么意思?)

然而,公平值保持不变,尽管输出到日志中显示它在变化。

( 否则,除了通过Print,我们还能怎样判断循环是否工作?)

...为了以防万一,这里是附有指标的专家顾问的 "骨架"。

将错误的指标放入EA 是没有意义的,它不会使EA 变得更好。你仍然没有检查我的选项?
 

也许我弄错了,但你不是在测试完成后将指标在图表上 的外观与测试时的计算结果进行比较吗?

重点是,来自测试器的自定义指标的结果(计算数组)不会以任何方式转移到图表上,但指定的指标只是在图表上启动一个新的计算。

Документация по MQL5: Операции с графиками / ChartIndicatorAdd
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
  • www.mql5.com
Операции с графиками / ChartIndicatorAdd - Документация по MQL5
 

在分钟图上运行这个指标(如果你有一个开放的头寸),10-15分钟后,你会得到这样的图片。


代码。

//+------------------------------------------------------------------+
//|                                             Equity_Indicator.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double Values[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Values,INDICATOR_DATA);
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,100);
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   ArraySetAsSeries(Values,false);
   return(0);
  }
//+------------------------------------------------------------------+
//| 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[])
  {


   Print("prev_calculated=",prev_calculated,"   rates_total=",rates_total);
   int limit=prev_calculated;
   if(limit>0) limit--;

//---Блок заполнения Индикатора и журнала сообщений значениями
   for(int i=limit; i<rates_total;++i)
     {
      Values[i]=AccountInfoDouble(ACCOUNT_EQUITY);
     }
   return rates_total;
  }
//+------------------------------------------------------------------+
 

罗切,我已经问过你我的指标有什么问题,我也给你写过我如何检查你的变体 而且我试图尽可能详细地向你解释,而你只简单地写了 "循环不起作用 "和 "你自己看吧"......

...雷纳特,按照我的理解在测试完成后 指标根据测试期间的计算和指标阵列的填充 图表上显示但是,测试器的结果不能从测试器转移到自定义指标图上,这是什么意思?

那么他们需要什么呢?为什么当我从代码中删除对数组的赋值时,指标线会一下子消失呢(即使是一条恒定的水平线,它也会消失)?

我以为,在 OnCalculated 填入的指标值数组 与图表上的指标值之间的对应关系 是不明确的,否则,指标值怎么能被初始化?

这很难理解......这似乎是一个微不足道的任务,但我已经纠结了好几天,很难找到一个人,至少可以提示如何在历史上以不同的方式解决这个问题,以及是否解决了。

再次,按照我的理解(如果我错了,请纠正我,如果你不介意)。

1.我在测试器中指定一个测试期,并选择一个附有我的指标的专家顾问

2.第一次调用 OnCalculated ,参数 prev_calculated =0, rate_total = 测试开始时对应的tick(bar)数量。在这段时间内,平衡值保持在最初的恒定水平。

随后 在测试期内按条 调用 OnCalculated ,发生在每个单独的条上,在这里我们可以用那些变化的数据初始化一个指标值数组(例如,复制价格,正如我写的,这很有效,但后来为什么不用变化的值初始化 Equity 而用变化的价格 ?)

而且,无论如何,你是个专家。我希望这个简单的任务能得到解决,或者 MetaTrader 还没有达到这样的 "高度"?:)))

我已经提供了我对这个问题的简单解决方案,但它拒绝工作。

那么如何才能实现--根据对历史的测试结果,在价格图的下面有一个股票图?

 
我要告诉你一件事,在启动可视化模式之前,要解决你的问题并不容易。有一个解决方案,就是在测试过程中把股票数据写到一个文件中。 然后把这个文件中的数据写到指标缓冲区,从而建立股票图。
 

Rosh,在线的变体已经发布了,但作为一个主要从事历史工作的人,我需要一个能在历史数据上发挥作用的变体。而我仍然觉得很难理解主要的困难可能是什么。

由于交易数量 较少,交易者对网上的平衡图有一个概念(除非他是一个几乎没有时间按买入和卖出的临时工)。

事实上,在有数百甚至数千次交易的漫长历史中,股票动态变得至关重要,但测试器中的图表原则上不提供这些动态与价格动态的简单比较(除非,当然,MetaQuote认为程序员的主要事情是快速消除已经准备好的专家,而不分析单独的一系列弱势和强势地位)。