程序库: TradeTransactions - 页 2

 
Sergey Chalyshev:

到目前为止,我还没有想到这个图书馆的用途。

外汇交易肯定不需要它,股票交易也不需要它。

如果你说的是部分执行,那么它在外汇交易中就能充分发挥作用。特别是,这就是为什么外汇交易非常需要异步,因此这个库可以派上用场。

您在证券交易所测试过这个库吗?

我还没有在证券交易所测试过,但从技术上讲,证券交易所和外汇交易所对库来说是一样的。你只需随时随地获取所有交易的数据。仅此而已。所以,这里的一切都不取决于市场类型。

您认为它在什么情况下会有用?

当异步功能派上用场时,该库就会派上用场。这是指大量(不止一次)发送交易订单。可以有多种情况:

  • 打开/修改/关闭角色篮。
  • 网格器。
  • 处理部分执行的结果。
  • 关闭所有仓位并删除所有订单。
  • ...
 
fxsaber:

有必要进行试验。我认为,同时写入/读取资源的方式与全局变量 相同,因为两种情况下的写入都是创建:ResourceCreate 和 GlobalVariableSet。资源和全局变量的唯一区别是,理论上你甚至不能同时向资源写入任何内容。而全局变量则可以。


事实上,读取资源就是从内存中获取数据。如果读取已经开始,那么写入资源也不会对其产生影响,因为写入是在分配另一块内存。它们很难重叠,因为操作系统本身很可能会阻止它们重叠。因此,在我看来,资源的加载/保存不应该发生冲突。当然,最好还是向开发人员提出这个问题。

名称相同的资源不就是相同的资源(和一块内存)吗?

这很容易检查--你应该写一些很长的内容,在末尾加上特殊标记,然后并行读取。如果不能读取整条信息,就意味着可能存在冲突。

 
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;
      }
    }        
}


本测试脚本显示不存在冲突。

 
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; }
    }
}

看来真的不会丢失。

 
Andrey Khatimlianskii:

我的意思是这样的

看来确实没有丢失。

这种检查方式没有考虑到资源大小和资源末端数据的变化。

 
fxsaber:

该检查变量不考虑资源大小和资源末端数据的变化。

以前写入的数据能否保留在内存中?如何清除?

 
Andrey Khatimlianskii:

以前记录的数据能否保留在内存中?

理论上是可以的。因此,您也应该检查一下。

如何清除?

交易、自动交易系统和交易策略测试论坛

库:TradeTransactions

fxsaber, 2018.09.20 16:23.

  ResourceINT.Free();                // 删除资源中的数据

清理资源 - 删除。

 
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; }
    }
}
 
Andrey Khatimlianskii:

两个长度不同的字符串也没有出现错误:

没错。所以我才说,原来的代码 已经检查过了。

 
你有没有考虑过使用标准的 C++ 风格/命名约定?我个人认为您的代码非常出色,但我不使用您的库(或不得不重构它们)的原因是您使用的风格。仅仅因为你没有遵循任何标准约定,我就很难在头脑中解析 你的某些代码。这对于我们这些来自其他语言的人来说尤其令人沮丧。例如,除了类的声明 (ALLCAPS),这个库使用 CamelCase 来命名所有内容,这与几乎所有编程语言的命名规范都背道而驰。查看代码令人沮丧,因为在许多其他语言中
CamelCase.thing

是访问全类属性,而不是实例属性。

类声明也是如此,而你又如此喜欢使用宏,以至于我从来不知道你的类声明是宏还是枚举。通常情况下,根据 MQL 标准约定,枚举、宏和常量只能使用 ALLCAPS,而类声明则使用 CamelCase。此外,根据 MQL 惯例,变量的定义使用 snake_case。


我的建设性批评无意冒犯您,我知道您为了让每个人都能免费使用这些库付出了巨大的努力,这非常了不起,我们需要更多像您这样的开发人员。我知道我说的不仅仅是我自己,如果你只是对应用的风格稍作调整,那么会有更多的开发者使用你的库。这不正是你们想要的吗?