程序库: TradeTransactions - 页 2 12345678 新评论 fxsaber 2018.09.21 07:54 #11 Sergey Chalyshev:到目前为止,我还没有想到这个图书馆的用途。外汇交易肯定不需要它,股票交易也不需要它。 如果你说的是部分执行,那么它在外汇交易中就能充分发挥作用。特别是,这就是为什么外汇交易非常需要异步,因此这个库可以派上用场。 您在证券交易所测试过这个库吗?我还没有在证券交易所测试过,但从技术上讲,证券交易所和外汇交易所对库来说是一样的。你只需随时随地获取所有交易的数据。仅此而已。所以,这里的一切都不取决于市场类型。 您认为它在什么情况下会有用? 当异步功能派上用场时,该库就会派上用场。这是指大量(不止一次)发送交易订单。可以有多种情况: 打开/修改/关闭角色篮。网格器。处理部分执行的结果。关闭所有仓位并删除所有订单。... Andrey Khatimlianskii 2018.09.22 00:42 #12 fxsaber:有必要进行试验。我认为,同时写入/读取资源的方式与全局变量 相同,因为两种情况下的写入都是创建:ResourceCreate 和 GlobalVariableSet。资源和全局变量的唯一区别是,理论上你甚至不能同时向资源写入任何内容。而全局变量则可以。事实上,读取资源就是从内存中获取数据。如果读取已经开始,那么写入资源也不会对其产生影响,因为写入是在分配另一块内存。它们很难重叠,因为操作系统本身很可能会阻止它们重叠。因此,在我看来,资源的加载/保存不应该发生冲突。当然,最好还是向开发人员提出这个问题。名称相同的资源不就是相同的资源(和一块内存)吗? 这很容易检查--你应该写一些很长的内容,在末尾加上特殊标记,然后并行读取。如果不能读取整条信息,就意味着可能存在冲突。 fxsaber 2018.09.22 07:01 #13 Andrey Khatimlianskii:名称相同的资源不就是相同的资源(和内存块)吗? 写入就是创建另一个资源。 要检查这一点很容易--你应该写一些很长的内容,并在末尾加上特殊标记,然后并行读取。如果读取的不是整条信息,则可能存在冲突。#property script_show_inputs input bool Save = true; // 保存/加载 #include <fxsaber\TradeTransactions\ResourceData.mqh> //https://www.mql5.com/zh/code/22166 #define MINLENGTH 100000 #define _CS(A) ((!::IsStopped()) && (A)) void OnStart() { const RESOURCEDATA<int> Resource("::Test"); int Array[]; while (_CS(true)) if (Save) for (int i = 0; _CS(i < MINLENGTH); i++) { const int Size = ArrayResize(Array, i + MINLENGTH); Array[Size - 1] = Size; Resource = Array; } else { ArrayResize(Array, 0); const int Size = Resource.Get(Array); if (!Size || (Array[Size - 1] != Size)) { Print(Size); break; } } } 本测试脚本显示不存在冲突。 Andrey Khatimlianskii 2018.09.27 02:40 #14 fxsaber:录制是另一种资源的创建。这个验证脚本显示不存在冲突。我也有类似的想法: #property script_show_inputs input bool Save = true; // 保存/加载 #include <fxsaber\TradeTransactions\ResourceData.mqh> //https://www.mql5.com/zh/code/22166 #define MINLENGTH 100000 void OnStart() { const RESOURCEDATA<int> Resource("::Test"); int Array[]; string str = ""; for ( int i = 0; i < MINLENGTH; i ++ ) str += (i%1000==0?"\n":"a"); str += "\nCHECK"; while ( !::IsStopped() ) if (Save) { char arr[]; StringToCharArray( (string)GetTickCount() + "\n" + str, arr ); ArrayResize(Array, ArraySize(arr)); ArrayCopy( Array, arr ); Resource = Array; } else { ArrayResize(Array, 0); const int Size = Resource.Get(Array); char get[]; ArrayResize( get, Size ); ArrayCopy( get, Array ); string res = CharArrayToString( get ); uint start = (uint)StringToInteger( StringSubstr( res, 0, StringFind( res, "\n" ) ) ); Comment( "Delay = ", (GetTickCount() - start), " ms\n", res ); if ( StringSubstr( res, StringLen( res )-5, 5 ) != "CHECK" ) { Print( res ); break; } } } 看来真的不会丢失。 fxsaber 2018.09.27 07:46 #15 Andrey Khatimlianskii:我的意思是这样的看来确实没有丢失。这种检查方式没有考虑到资源大小和资源末端数据的变化。 Andrey Khatimlianskii 2018.09.27 07:53 #16 fxsaber:该检查变量不考虑资源大小和资源末端数据的变化。以前写入的数据能否保留在内存中?如何清除? fxsaber 2018.09.27 08:04 #17 Andrey Khatimlianskii:以前记录的数据能否保留在内存中? 理论上是可以的。因此,您也应该检查一下。 如何清除? 交易、自动交易系统和交易策略测试论坛 库:TradeTransactions fxsaber, 2018.09.20 16:23. ResourceINT.Free(); // 删除资源中的数据 清理资源 - 删除。 Andrey Khatimlianskii 2018.09.27 08:22 #18 fxsaber:理论上是允许的。所以你也应该检查一下。两个长度不同的字符串不会出现错误: #property script_show_inputs input bool Save = true; // 保存/加载 #include <fxsaber\TradeTransactions\ResourceData.mqh> //https://www.mql5.com/zh/code/22166 #define MINLENGTH 100000 void OnStart() { const RESOURCEDATA<int> Resource("::Test"); int Array[]; string str[2] = {""}; for ( int i = 0; i < MINLENGTH ; i ++ ) str[0] += (i%1000==0?"\n":"a"); for ( int i = 0; i < MINLENGTH/2; i ++ ) str[1] += (i%1000==0?"\n":"b"); str[0] += "\nCHECK"; str[1] += "\nCHECK"; while ( !::IsStopped() ) if (Save) { char arr[]; static bool var = false; var = !var; StringToCharArray( (string)GetTickCount() + "\n" + str[var], arr ); ArrayResize(Array, ArraySize(arr)); ArrayCopy( Array, arr ); Resource = Array; } else { ArrayResize(Array, 0); const int Size = Resource.Get(Array); char get[]; ArrayResize( get, Size ); ArrayCopy( get, Array ); string res = CharArrayToString( get ); uint start = (uint)StringToInteger( StringSubstr( res, 0, StringFind( res, "\n" ) ) ); Comment( "Delay = ", (GetTickCount() - start), " ms\n", res ); if ( StringSubstr( res, StringLen( res )-5, 5 ) != "CHECK" ) { Print( res ); break; } } } fxsaber 2018.09.27 08:35 #19 Andrey Khatimlianskii:两个长度不同的字符串也没有出现错误:没错。所以我才说,原来的代码 已经检查过了。 nicholish en 2018.11.14 17:32 #20 你有没有考虑过使用标准的 C++ 风格/命名约定?我个人认为您的代码非常出色,但我不使用您的库(或不得不重构它们)的原因是您使用的风格。仅仅因为你没有遵循任何标准约定,我就很难在头脑中解析 你的某些代码。这对于我们这些来自其他语言的人来说尤其令人沮丧。例如,除了类的声明 (ALLCAPS),这个库使用 CamelCase 来命名所有内容,这与几乎所有编程语言的命名规范都背道而驰。查看代码令人沮丧,因为在许多其他语言中CamelCase.thing是访问全类属性,而不是实例属性。类声明也是如此,而你又如此喜欢使用宏,以至于我从来不知道你的类声明是宏还是枚举。通常情况下,根据 MQL 标准约定,枚举、宏和常量只能使用 ALLCAPS,而类声明则使用 CamelCase。此外,根据 MQL 惯例,变量的定义使用 snake_case。我的建设性批评无意冒犯您,我知道您为了让每个人都能免费使用这些库付出了巨大的努力,这非常了不起,我们需要更多像您这样的开发人员。我知道我说的不仅仅是我自己,如果你只是对应用的风格稍作调整,那么会有更多的开发者使用你的库。这不正是你们想要的吗? 12345678 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
到目前为止,我还没有想到这个图书馆的用途。
外汇交易肯定不需要它,股票交易也不需要它。
如果你说的是部分执行,那么它在外汇交易中就能充分发挥作用。特别是,这就是为什么外汇交易非常需要异步,因此这个库可以派上用场。
您在证券交易所测试过这个库吗?
我还没有在证券交易所测试过,但从技术上讲,证券交易所和外汇交易所对库来说是一样的。你只需随时随地获取所有交易的数据。仅此而已。所以,这里的一切都不取决于市场类型。
您认为它在什么情况下会有用?
当异步功能派上用场时,该库就会派上用场。这是指大量(不止一次)发送交易订单。可以有多种情况:
有必要进行试验。我认为,同时写入/读取资源的方式与全局变量 相同,因为两种情况下的写入都是创建:ResourceCreate 和 GlobalVariableSet。资源和全局变量的唯一区别是,理论上你甚至不能同时向资源写入任何内容。而全局变量则可以。
事实上,读取资源就是从内存中获取数据。如果读取已经开始,那么写入资源也不会对其产生影响,因为写入是在分配另一块内存。它们很难重叠,因为操作系统本身很可能会阻止它们重叠。因此,在我看来,资源的加载/保存不应该发生冲突。当然,最好还是向开发人员提出这个问题。
名称相同的资源不就是相同的资源(和一块内存)吗?
这很容易检查--你应该写一些很长的内容,在末尾加上特殊标记,然后并行读取。如果不能读取整条信息,就意味着可能存在冲突。
名称相同的资源不就是相同的资源(和内存块)吗?
写入就是创建另一个资源。
要检查这一点很容易--你应该写一些很长的内容,并在末尾加上特殊标记,然后并行读取。如果读取的不是整条信息,则可能存在冲突。
本测试脚本显示不存在冲突。
录制是另一种资源的创建。
这个验证脚本显示不存在冲突。
我也有类似的想法:
看来真的不会丢失。
我的意思是这样的
看来确实没有丢失。
这种检查方式没有考虑到资源大小和资源末端数据的变化。
该检查变量不考虑资源大小和资源末端数据的变化。
以前写入的数据能否保留在内存中?如何清除?
以前记录的数据能否保留在内存中?
理论上是可以的。因此,您也应该检查一下。
如何清除?
交易、自动交易系统和交易策略测试论坛
库:TradeTransactions
fxsaber, 2018.09.20 16:23.
ResourceINT.Free(); // 删除资源中的数据清理资源 - 删除。
理论上是允许的。所以你也应该检查一下。
两个长度不同的字符串不会出现错误:
两个长度不同的字符串也没有出现错误:
没错。所以我才说,原来的代码 已经检查过了。
是访问全类属性,而不是实例属性。
类声明也是如此,而你又如此喜欢使用宏,以至于我从来不知道你的类声明是宏还是枚举。通常情况下,根据 MQL 标准约定,枚举、宏和常量只能使用 ALLCAPS,而类声明则使用 CamelCase。此外,根据 MQL 惯例,变量的定义使用 snake_case。
我的建设性批评无意冒犯您,我知道您为了让每个人都能免费使用这些库付出了巨大的努力,这非常了不起,我们需要更多像您这样的开发人员。我知道我说的不仅仅是我自己,如果你只是对应用的风格稍作调整,那么会有更多的开发者使用你的库。这不正是你们想要的吗?