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

 
joo:

在EA的全局层面上声明两个数组 Equity[]和Time[]

在测试EA时,将股权和时间的值写入相应的数组中。

使用一个脚本在测试结束时读取文件,并在所需的图表上绘制股权。

这是对你的目的最好的方法,我不明白你为什么需要一个指标。

诶,如果我能够清楚而准确地了解我已经做的事情的困难所在,那么就会更容易......

( OnCalculated中的变化值已经存在了,那么还需要什么呢?)

我已经想到了全局变量,但根据定义。

datetime  GlobalVariableSet(
   string  name,      // имя
   double  value      // устанавлимое значение
   );

以及如何写一个数组,或者至少写一个对Value的引用,以便以后能够检索到它...问题。

至于对象,我想结合两件事。

1.根据结果显示交易行(红色 - 所有无利可图,蓝色 - 所有有利可图)。

2)在指标的底部做一个初始存款的回报图。

否则,当使用小规模的对象时,即使是交易的圆圈也无法看到价格动态(顺便说一下,我想摆脱它,但同样,我不知道如何摆脱)。

我说的是在大的时间框架上测试专家顾问,按照我现在的理解,正是这种曲线的组合将提供历史上亏损和盈利交易分布的最完整的概念,而没有必要将每笔交易的开盘方向与运动方向进行传统的比较。

 

sergey1294:
Даже не знаю как вам объяснить. AccountInfoDouble(ACCOUNT_EQUITY) хранит последнее значение эквити. После тестирования как сказал Ренат индикатор инициилизируется заново и пересчитывается. По этому данные эквити накопленные в буфере индикатора за время прогона стираются.

而这--关于抹杀--已经是 "热 "了!

但是,如何防止将OnCalculated 中的这些值写入另一个外来的、"不可擦除的 "指示器数组中,以恢复这些值,而不需要更多繁琐和资源密集型的读写文件程序?

或者这已经是一个系统级的问题(强制自动卸载数组的问题,我无法绕过)?

虽然我读到这种资源(内存中变量的创建和删除)也可以手动管理......

 
DV2010:

诶,如果我能够清楚而准确地了解我已经做的事情的困难所在,那么就会更容易保住......。

( OnCalculated中的变化值已经存在了,那么还需要什么呢?)

我已经想到了全局变量,但根据定义。

以及如何写一个数组,或者至少写一个对Value的引用,以便以后能够检索到它...问题。

至于对象,我想结合两件事。

1.根据结果显示交易行(红色 - 所有无利可图,蓝色 - 所有有利可图)。

2.在指标中建立一个从底部的初始存款的回报图。

否则,当使用小规模的对象时,即使是交易的圆圈也无法看到价格动态(顺便说一下,我想摆脱它,但同样,我不知道如何摆脱)。

在我看来,我说的是在大的时间框架上测试专家顾问,正如我现在所理解的,这种曲线的组合将提供历史上亏损和盈利交易的最完整的分布情况,而没有必要对每笔交易的开盘方向和运动方向进行传统的比较。

我指的是程序的全局变量,而不是终端的全局变量。

这些对象甚至可以在1分钟的图表上绘制,以达到最大的准确性(频率)。然后,从图表中读取对象后,你可以用指标画线(如果对指标有无比强烈的愿望),你甚至可以在指标设置中输入一个修正系数,这样你就可以查看任何初始存款的权益

同样,所有的线条和图表也可以由一个脚本来构建。

 
joo:

我是指全局 程序变量,而不是终端变量。

即使在一分钟的图表上也可以绘制对象,以获得最大的准确性(频率)。然后,通过从图表中读取对象,你可以使用该指标建立线条。 你甚至可以在指标设置中输入修正系数,这样你就可以看到任何初始存款的权益。

关于程序的全局变量--根据我的理解,在指标的代码和专家顾问的代码中可以有全局变量。

其中一个变量是一个指标值数组,在测试后由于某种原因(可能是系统性质),这些指标值被擦除。

但我正确的理解是,在OnCalculated Indicator中,有必要获取显示Equty历史的值,无论是来自全局变量、对象还是来自文件的历史?

 
DV2010:

但我的理解是正确的,有必要从全局变量、对象或文件中获取显示Equty历史的数值,只是在OnCalculated指标中?

正是如此。
 
joo:
正是如此。

在这种情况下,我们可以使用程序的全局变量 吗?

因为专家顾问的全局变量在指标中是不可见的,然后我们必须使用指标的全局变量,与指标值的数组不同,在专家顾问模式的OnCalculated工作后,这些变量应该是 "不可磨灭的"?

还有一个,如果可能的话,关于当前图表的对象的问题。我曾试图找到如何提取属于它的对象的列表,但还是很难找到。你能建议如何以编程方式进行吗?

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 
DV2010:

如果可以的话,还有一个关于当前时间表中的对象的问题。我曾试图找出如何提取属于它的对象列表,但还是很难找到。你能告诉我如何以编程方式进行吗?

使用ObjectsTotal 函数来获取图表上的对象数量

int  ObjectsTotal(
   long  chart_id,     // идентификатор графика
   int   nwin=-1,      // индекс окна
   int   type=-1       // тип объекта     
   );
使用ChartID 获取图表的ID
 

粗略地说,它是这样的。

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2010, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
input int TradeHistoy=10000;

//Глобальные пременные
double   Equity[];
datetime EquityTime[];
int      cnt;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   ArrayResize(Equity,TradeHistoy);ArrayInitialize(Equity,0.0);
   ArrayResize(EquityTime,TradeHistoy);ArrayInitialize(Equity,1);
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

//Записать накопленные данные в файл
   D_ArrayToCsv("DATA",Equity,TradeHistoy,";");
   D_ArrayToCsv("TIME",Equity,TradeHistoy,";");

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {

//В нужном месте эксперта проверить значение эквити
//записать эквити и время замера 
   if(cnt<TradeHistoy)
     {
      Equity[cnt]=AccountInfoDouble(ACCOUNT_EQUITY);
      EquityTime[cnt]=TimeTradeServer();
     }

  }
//+------------------------------------------------------------------+

void D_ArrayToCsv(string filename,double &mass[],int line,string Separator)
  {
// запись массива в файл
   string str;
   int handle=FileOpen(filename,FILE_CSV|FILE_WRITE,Separator);
//Цикл записи строчек в файл
   for(int l=0;l<line;l++)
     {
      str=DoubleToString(mass[l],8);
      FileWrite(handle,str);
     }
   FileClose(handle);
  }
//+------------------------------------------------------------------+
然后你可以对你创建的文件做任何你喜欢的事情。
 

谢谢你,Rosh,关于对象的提示,我想我现在可以处理这一部分的任务了。

...但对于我刚刚尝试掌握的文件操作,就有点复杂了(其实我很害怕!)。

:)

一下子就有了几个惊喜。

1.循环中的可写文件由于某种原因只写了一个值,而不是几个值。

2.尽管FileWriteArray操作成功地获得了一个指针 并检查了被传递的数组是否为空,但是

写的项目数等于-1。

3.文件中说,在测试期间,打开操作是在MQL5/tester/files文件夹中进行的,而在主要操作期间--在MQL5/文件,因此立即产生了一个问题,即在主要工作期间,指标如何接收测试阶段记录的数据(而且文件夹的路径并不简单,很可能会随着时间的推移而改变 - \tester\Agent-127。0.0.1-3000\MQL5\Files )

 
DV2010:


3.文件中说,在测试阶段,打开操作在MQL5/tester/files文件夹中进行,而在主要操作阶段--在MQL5/文件,因此出现了一个问题,即在主要工作期间,指标如何接收测试阶段记录的数据(而且文件夹的路径并不简单,很可能会随着时间的推移而改变 - \tester\Agent-127.0.0.1-3000\MQL5\Files )

你必须用手来转移。

下面是你从文件中读取的代码。

void CsvTo1D_Array(string nameFile,double &array[],int line,string Separator)
{
        int end=0;
        int handle=FileOpen(nameFile,FILE_CSV|FILE_READ,Separator);

        if (handle!=1)
        {
                Alert("Файл ",nameFile," не найден!");
        }
        else
        {
                for (int l=0;l<line;l++)
                {
                        array[l]=StringToDouble(FileReadString(handle));
                }
                FileClose(handle);
        }
}
//+------------------------------------------------------------------+
原因: