#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;
voidOnInit(){ Expert1.Init(); //-- filename="equity.txt"; common_folder=TerminalInfoString(TERMINAL_COMMONDATA_PATH); int handle=FileOpen(filename,FILE_WRITE|FILE_COMMON); } voidOnTick(){ 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()); } } voidOnDeinit(constint reason){ Expert1.Deinit(); //--- FileClose(filename); }
2011.01.2114:00:46 Core 1 connect closed 2011.01.2114:00:46 Core 1log file "C:\Program Files\MetaTrader 5\Tester\Agent-127.0.0.1-3000\logs\20110121.log" written 2011.01.2114: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.2114:00:46 Core 1 OnTester result 0 2011.01.2114:00:46 Core 12011.01.1423:59:59 order performed sell 0.15 at 1.33829 [#13 sell 0.15 EURUSD at 1.33829] 2011.01.2114:00:46 Core 12011.01.1423:59:59 deal performed [#13 sell 0.15 EURUSD at 1.33829] 2011.01.2114:00:46 Core 12011.01.1423:59:59 deal #13 sell 0.15 EURUSD at 1.33829 done (based on order #13) 2011.01.2114:00:46 Core 12011.01.1423:59:59 position closed due end of test at 1.33829 [buy 0.15 EURUSD 1.33593] 2011.01.2114:00:46 Core 12011.01.1422:00:00 Expert OnTick: Записано 0 байт в общую папку всех терминалов - C:\Documents and Settings\All Users\Application Data\MetaQuotes\Terminal\Common 2011.01.2114:00:46 Core 12011.01.1421:00:00 Expert OnTick: Записано 0 байт в общую папку всех терминалов - C:\Documents and Settings\All Users\Application Data\MetaQuotes\Terminal\Common
下面是从文件中读取的代码。
为什么要用FileReadString( )?
你应该使用FileReadArray(),那么就不需要做循环。
为什么要用FileReadString()?
使用FileReadArray() 不是更好吗,那样就不需要做循环 了。
罗什。
将股权值写进文件。然后通过这些数值建立指标。然而,数据文件必须手动移动。 在测试过程中,文件被写入Agent_name/MQL5/Files 文件夹中。
直到现在,我才意识到一切是多么复杂。
但手动显然不是解决这个问题的办法,因为我们说的是数以百计的测试。
而且看起来:一开始有可用的数据,但是--哦,奇迹!--有了这些数据,我们就可以在未来的日子里,继续为我们的国家服务。- 该程序的设计方式是,在提取和使用程序之前,没有可能以某种方式和在某个地方保存它们!
我不是一个专业的程序员,但这种情况很难理解。
巨大的文档......,在构建方面的巨大可能性,似乎什么都有,什么都有......,内存管理,OOP,以及在这里,在根本上简单而关键的必要(我希望,我已经解释过了)--一个死锁。
...然而...问题!
是否没有可能在测试模式下写入一些强制近似注释的程序数组,随后可用于建立一个指标?
包括通过全局变量 传递指向这样一个数组的指针的可能性?
而在测试阶段和主要工作时间之间的数据存储和传输问题,不是从目前的执行情况来看,而是从原则上来看,是什么问题?
Renat提到了数百兆字节的数据,但是,首先,我们为什么要总是重新加载数据,因为我们只有在程序员的明确愿望下才能提供这种可能性;其次,就手头的任务而言,数据量要小得多,相当于几千位数。
我再次声明,从用户的角度来看,在多次测试(而市场由于其复杂性,需要多次测试)过程中,手动传输文件的选项绝对是不方便的,也是没有前途的,而我准备和任何人争论,账户指标的动态与测试历史中的价格动态直接相关,是一般最重要的之一。
在读取模式下打开文件的主要操作模式中,将可见性扩展到测试者文件的文件夹中是什么问题? 这里面即使是假想的威胁也是什么?
而不能在RAM中强制存储主模式和测试模式之间的所需数据,这是什么问题?
使用dll从磁盘上的任意文件夹写入和读取文件。只需将文件写入和读取功能移到dll中,就可以了。
...然而...问题!
是否没有可能在测试模式中写入一些强制窄程序数组,随后可用于建立一个指标?
尝试在打开文件时设置FILE_COMMON 标志 -https://www.mql5.com/ru/docs/constants/io_constants/fileflags
识别器
价值
描述
文件_COMMON
4096
文件在所有客户终端的共享文件夹中的位置。在打开文件(FileOpen())、复制文件(FileCopy()、FileMove())和验证文件的存在(FileIsExist())时使用这个标志。
尝试在打开一个文件时指定FILE_COMMON 标志 -https://www.mql5.com/ru/docs/constants/io_constants/fileflags
运行这个脚本,看看它写到哪里了
joo, Rash, 谢谢你!
共享文件夹选项似乎更...集成。
唯一令人惊讶的是,当运行这段代码时,在指标中显示了一条关于不成功写入的信息,尽管写入本身仍在进行。另外--仍然是一个悬而未决的问题,到底如何以及何时写入数据比较好(为每个tick分别写入,但这是资源密集型的,或者在最后--整个数组,但用数组写入的东西还不是很清楚,此外,很难理解OnCalculated在这种情况下如何提取数据--在第二种情况下,经过测试已经证明了这段话?)
还有一个问题,有点离题,但关于昨天已经触及的问题。
在OnTick和OnCalculated中插入。
但在测试完成 后,尽管存在与开仓和平仓有关的对象(箭头和线--在终端:图表>对象>对象列表中可见),但由于某种原因,返回值为0。最好是尽可能少地写入文件,所以最好是以整数阵列的形式进行。测量数值的频率不应超过每分钟一次,否则在图表上显示会有问题(此外还会不合理地消耗资源)。也就是说,在运行结束后。但这也是有可能的。
该算法如下。
1) 在测试器中运行专家。
2)测量感兴趣的价值。
3)在文件中记录了 该值。
4) 将真值写到一个单独的文件中,这意味着我们记录了一个新的值。
5)启动一个无限循环,在标志文件中退出条件为假。
6) 在一个单独的图表中,脚本读取带有标志的文件,如果有一个新的值,在图表上画出一个风险,将假值写入文件。
这大概是测试器中视觉模式的测试的样子。
等一下,比赛会结束,也许会有更多优雅和美丽的解决方案出现。
joo, Rash, 谢谢你!
共享文件夹选项似乎更...集成。
唯一令人惊讶的是,当在指标中运行这段代码时,它显示了一个失败的写入信息,尽管写入本身确实得到了完成。
我没有得到任何这种输出。试一试吧。
我不明白这些。你应该试试。
罗什
我 不明白是什么原因,但与我的指标不同,当我用你的指标启动时,我得到一个信息。现在我根据你的代码做了一个类似的简单的智能交易系统,它应该把所有的股票价值写入文件(我只改变了所有价值的输出,包括写入的零字节,使变量成为全局,并把文件的打开和写入分为OnInit和OnTick),但尽管没有写错误,文件也被创建,记录和文件是空的。