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

 
joo:

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

为什么要用FileReadString( )?

你应该使用FileReadArray(),那么就不需要做循环

 
Serj_Che:

为什么要用FileReadString()?

使用FileReadArray() 不是更好吗那样就不需要做循环 了。

也许这样更好。我只是习惯于此。:)
 

罗什
将股权值写进文件。然后通过这些数值建立指标。然而,数据文件必须手动移动。 在测试过程中,文件被写入Agent_name/MQL5/Files 文件夹中。

直到现在,我才意识到一切是多么复杂。

但手动显然不是解决这个问题的办法,因为我们说的是数以百计的测试。

而且看起来:一开始有可用的数据,但是--哦,奇迹!--有了这些数据,我们就可以在未来的日子里,继续为我们的国家服务。- 该程序的设计方式是,在提取和使用程序之前,没有可能以某种方式和在某个地方保存它们!

我不是一个专业的程序员,但这种情况很难理解。

巨大的文档......,在构建方面的巨大可能性,似乎什么都有,什么都有......,内存管理,OOP,以及在这里,在根本上简单而关键的必要(我希望,我已经解释过了)--一个死锁。

...然而...问题!

是否没有可能在测试模式下写入一些强制近似注释的程序数组,随后可用于建立一个指标?

包括通过全局变量 传递指向这样一个数组的指针的可能性?

而在测试阶段和主要工作时间之间的数据存储和传输问题,不是从目前的执行情况来看,而是从原则上来看,是什么问题?

Renat提到了数百兆字节的数据,但是,首先,我们为什么要总是重新加载数据,因为我们只有在程序员的明确愿望下才能提供这种可能性;其次,就手头的任务而言,数据量要小得多,相当于几千位数。

我再次声明,从用户的角度来看,在多次测试(而市场由于其复杂性,需要多次测试)过程中,手动传输文件的选项绝对是不方便的,也是没有前途的,而我准备和任何人争论,账户指标的动态与测试历史中的价格动态直接相关,是一般最重要的之一。

在读取模式下打开文件的主要操作模式中,将可见性扩展到测试者文件的文件夹中是什么问题? 这里面即使是假想的威胁也是什么?

而不能在RAM中强制存储主模式和测试模式之间的所需数据,这是什么问题?

 

使用dll从磁盘上的任意文件夹写入和读取文件。只需将文件写入和读取功能移到dll中,就可以了。

 
DV2010:

...然而...问题!

是否没有可能在测试模式中写入一些强制窄程序数组,随后可用于建立一个指标?


尝试在打开文件时设置FILE_COMMON 标志 -https://www.mql5.com/ru/docs/constants/io_constants/fileflags

识别器

价值

描述

文件_COMMON

4096

文件在所有客户终端的共享文件夹中的位置。在打开文件(FileOpen())、复制文件(FileCopy()FileMove())和验证文件的存在(FileIsExist())时使用这个标志。

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы ввода/вывода / Флаги открытия файлов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы ввода/вывода / Флаги открытия файлов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы ввода/вывода / Флаги открытия файлов - Документация по MQL5
 
Rosh:

尝试在打开一个文件时指定FILE_COMMON 标志 -https://www.mql5.com/ru/docs/constants/io_constants/fileflags

运行这个脚本,看看它写到哪里了

//+------------------------------------------------------------------+
//|                                             Demo_File_Common.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property script_show_inputs
//--- input parameters
input string   filename="file_common.txt";
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string common_folder=TerminalInfoString(TERMINAL_COMMONDATA_PATH);
//---
   int handle=FileOpen(filename,FILE_WRITE|FILE_COMMON);
   if(handle!=INVALID_HANDLE)
     {
      uint written=FileWrite(handle,"Общая папка всех терминалов - ",common_folder);
      if(written>0)
        {
         PrintFormat("Записано %d байт в общую папку всех терминалов - %s",written,common_folder);
        }
     }
   else
     {
      Print("Не удалось открыть на запись файл ",filename,".  Ошибка ",GetLastError());
     }

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

joo, Rash, 谢谢你!

共享文件夹选项似乎更...集成。

唯一令人惊讶的是,当运行这段代码时,在指标中显示了一条关于不成功写入的信息,尽管写入本身仍在进行。另外--仍然是一个悬而未决的问题,到底如何以及何时写入数据比较好(为每个tick分别写入,但这是资源密集型的,或者在最后--整个数组,但用数组写入的东西还不是很清楚,此外,很难理解OnCalculated在这种情况下如何提取数据--在第二种情况下,经过测试已经证明了这段话?)

还有一个问题,有点离题,但关于昨天已经触及的问题。

在OnTick和OnCalculated中插入。

Print("ObjectsTotal =", ObjectsTotal(ChartID()));
但在测试完成 后,尽管存在与开仓和平仓有关的对象(箭头和线--在终端:图表>对象>对象列表中可见),但由于某种原因,返回值为0。
 

最好是尽可能少地写入文件,所以最好是以整数阵列的形式进行。测量数值的频率不应超过每分钟一次,否则在图表上显示会有问题(此外还会不合理地消耗资源)。也就是说,在运行结束后。但这也是有可能的。

该算法如下。

1) 在测试器中运行专家。

2)测量感兴趣的价值。

3)在文件中记录了 该值。

4) 将真值写到一个单独的文件中,这意味着我们记录了一个新的值。

5)启动一个无限循环,在标志文件中退出条件为假。

6) 在一个单独的图表中,脚本读取带有标志的文件,如果有一个新的值,在图表上画出一个风险,将假值写入文件。


这大概是测试器中视觉模式的测试的样子。

等一下,比赛会结束,也许会有更多优雅和美丽的解决方案出现。

Документация по MQL5: Файловые операции / FileWrite
Документация по MQL5: Файловые операции / FileWrite
  • www.mql5.com
Файловые операции / FileWrite - Документация по MQL5
 
DV2010:

joo, Rash, 谢谢你!

共享文件夹选项似乎更...集成。

唯一令人惊讶的是,当在指标中运行这段代码时,它显示了一个失败的写入信息,尽管写入本身确实得到了完成。

我没有得到任何这种输出。试一试吧。

//+------------------------------------------------------------------+
//|                                   Demo_File_Common_Indicator.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red

double buffer[];
input string   filename="file_common.txt";

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,buffer,INDICATOR_DATA);

   string common_folder=TerminalInfoString(TERMINAL_COMMONDATA_PATH);
//---
   int handle=FileOpen(filename,FILE_WRITE|FILE_COMMON);
   if(handle!=INVALID_HANDLE)
     {
      uint written=FileWrite(handle,"Общая папка всех терминалов - ",common_folder);
      if(written>0)
        {
         PrintFormat("Записано %d байт в общую папку всех терминалов - %s",written,common_folder);
        }
     }
   else
     {
      Print("Не удалось открыть на запись файл ",filename,".  Ошибка ",GetLastError());
     }
//---
   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[])
  {
//---

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

Rosh:

我不明白这些。你应该试试。

罗什

不明白是什么原因,但与我的指标不同,当我用你的指标启动时,我得到一个信息。

2011.01.21 13:52:53     Core 1  2011.01.14 00:00:00   Expert removed because indicator 43 cannot load [4002]

现在我根据你的代码做了一个类似的简单的智能交易系统,它应该把所有的股票价值写入文件(我只改变了所有价值的输出,包括写入的零字节,使变量成为全局,并把文件的打开和写入分为OnInit和OnTick),但尽管没有写错误,文件也被创建,记录和文件是空的。

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

#include <\..\Experts\_My\Classes\ClassExpert\ClassExpert.mqh>
ClassExpert Expert1;
int handle;
string common_folder;
string filename;

void OnInit(){
   Expert1.Init();
   //--
   filename="equity.txt";
   common_folder=TerminalInfoString(TERMINAL_COMMONDATA_PATH);
   int handle=FileOpen(filename,FILE_WRITE|FILE_COMMON);
}
void OnTick(){
   Expert1.OnTick();
   //---
   if(handle!=INVALID_HANDLE){
      uint written=FileWrite(handle, AccountInfoDouble(ACCOUNT_EQUITY),common_folder);
      PrintFormat("Expert OnTick: Записано %d байт в общую папку всех терминалов - %s",written,common_folder);
   }
   else{
      Print("Expert OnTick: Не удалось открыть на запись файл ",filename,".  Ошибка ",GetLastError());
   }  
}
void OnDeinit(const int reason){
   Expert1.Deinit();
   //---
   FileClose(filename);
}

2011.01.21 14:00:46     Core 1  connect closed
2011.01.21 14:00:46     Core 1  log file "C:\Program Files\MetaTrader 5\Tester\Agent-127.0.0.1-3000\logs\20110121.log" written
2011.01.21 14:00:46     Core 1  EURUSD,H1: 5516 ticks (23 bars) generated within 47 ms (total bars in history 6419, total time 3093 ms)
2011.01.21 14:00:46     Core 1  OnTester result 0
2011.01.21 14:00:46     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.21 14:00:46     Core 1  2011.01.14 23:59:59   deal performed [#13 sell 0.15 EURUSD at 1.33829]
2011.01.21 14:00:46     Core 1  2011.01.14 23:59:59   deal #13 sell 0.15 EURUSD at 1.33829 done (based on order #13)
2011.01.21 14:00:46     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.21 14:00:46     Core 1  2011.01.14 22:00:00   Expert OnTick: Записано 0 байт в общую папку всех терминалов - C:\Documents and Settings\All Users\Application Data\MetaQuotes\Terminal\Common
2011.01.21 14:00:46     Core 1  2011.01.14 21:00:00   Expert OnTick: Записано 0 байт в общую папку всех терминалов - C:\Documents and Settings\All Users\Application Data\MetaQuotes\Terminal\Common