程序库: TradeTransactions

 

TradeTransactions:

在应用程序中的任何位置来访问 OnTradeTransaction 中的数据。

作者: fxsaber

 
图书馆 - 实现这一想法

OnTradeTransaction 编写一个指标(没有缓冲区和输入变量),该指标将所有交易写入公共位置(例如,资源)。

  • Expert Advisor 通过 iCustom 创建该指标。
  • 在执行的任何时候,EA 都可以看到该指标写入的所有交易。
  • 因此,它具有极大的灵活性。

    例如,您可以发送一百个异步订单,然后等待它们的执行,而无需离开深度内核,继续执行您的代码。


    当然,我们说的是请求。魔法主题与此无关。


    虽然让开发人员在公共数组中执行事务记录是合理的。不带指示器

    当然,从开发人员进行终端操作的那一刻起,公开可用的交易数组将是促进 MT5 交易异步化的合理方式。但这种解决方案的需求可能接近于零。当然,如果有人需要的话,目前该库弥补了这一空白。

     

    价值不在于库,而在于当所有终端交易存档时的这种功能。

    当你完全不需要考虑异步、等待结果等问题时,就有可能编写一个交易库。交易库本身会在无形中完成所有工作。


    例如,账户中有 1K 美元。发送 100 个异步订单,买入USDCHF 1 手。很明显,其中 99 个会被交易服务器(而不是终端)拒绝,只有第一个会被执行。但在取消和交易服务器做出任何回应之前,智能交易圣经可以假设有 100 个买入头寸。

     
    • В исходниках библиотеки присутствует (ResourceData.mqh) универсальный класс, позволяющий удобно сохранять/читать данные в/из Ресурсах.
    由于一个错误,它在 MT4 中不起作用。
     

    例如,由于部分执行,可能会有许多仓位而不是一个仓位。当您需要修改大量仓位/订单时,使用建议的方法会变得非常方便。

    从 OnTick 退出时不需要记住任何东西,也不需要写OnTradeTransaction 和处理 RequestID - 方法相同。像往常一样,您只需在 OnTick 中编写。在其中,您始终可以完全控制任何地方的异步交易。 您可以获得快如闪电的多重修改,无需手鼓--您甚至无需考虑异步及其特殊性。

     
    有趣的想法,谢谢。 据我所知,由于代码并行化,性能应该会有所提高。 它在测试器中工作正常吗?
     
    Alexey Navoykov:
    有趣的想法,谢谢。 据我所知,由于代码并行化,性能应该会提高。 在测试版中能正常工作吗?

    我还没在测试版中试过。但如果多货币 OnTick 在测试版中也能以同样的思路运行,那么在这里也应该能运行。


    ZЫ 但我们的想法不是并行化。在 MT4 中,我们是通过交易流进行分配的。

     
    // 通过终端内的资源存储/交换数据的示例
    #include <fxsaber\TradeTransactions\ResourceData.mqh> //https://www.mql5.com/zh/code/22166
    
    void OnStart()
    {  
      const RESOURCEDATA<int> ResourceINT("::int"); // 用于交换 ints 的资源。const - 证明没有向类对象写入任何内容
      
      int ArrayINT[] = {1, 2, 3};
      int Num = 5;
      
      ResourceINT = ArrayINT;  // 资源存储一个数组。
      ResourceINT += Num;      // 为资源添加了另一个值.
      ResourceINT += ArrayINT; // 添加了一个数组。
      
      int ArrayINT2[];  
      ResourceINT.Get(ArrayINT2); // 从资源中读取数据。
      ArrayPrint(ArrayINT2);      // 撤回: 1 2 3 5 1 2 3
    
      ResourceINT.Free();                // 删除资源中的数据
      Print(ResourceINT.Get(ArrayINT2)); // 检查是否没有数据:0
    
      const RESOURCEDATA<MqlTick> ResourceTicks("::Ticks"); // 用于交换刻度的资源。const - 证明没有向类对象写入任何内容
      MqlTick Tick;
      
      if (SymbolInfoTick(_Symbol, Tick))
        for (int i = 0; i < 3; i++)
          ResourceTicks += Tick; // 添加到提基资源
    
      MqlTick Ticks[];
      ResourceTicks.Get(Ticks); // 从资源中读取数据。
      ArrayPrint(Ticks);        // 撤回。
      
      // 这是要从另一个程序访问的资源的全名
      const string NameOut = StringSubstr(MQLInfoString(MQL_PROGRAM_PATH), StringLen(TerminalInfoString(TERMINAL_PATH)) + 5) + "::Ticks";  
      Print(NameOut); // 打印资源的全名。
      
      const RESOURCEDATA<MqlTick> Resource(NameOut); // 从另一个程序访问数据(只读)的资源
      
      MqlTick TicksOut[];
      Resource.Get(TicksOut); // 从资源中读取数据。
      ArrayPrint(TicksOut);   // 撤回。
      
      Resource.Free();   // 无法影响只读资源数据。
      Print(_LastError); // ERR_INVALID_PARAMETER - 调用系统函数时出现错误参数。
    }
     
    fxsaber:
    通过终端内的资源存储/交换数据的示例

    能否读取正在写入的数据?即能否读取不完整的信息?

     

    到目前为止,我还想不出这个库有什么用处。

    外汇交易肯定不需要它,证券交易所也不需要它。

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

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

     
    Andrey Khatimlianskii:

    能否读取正在写入的数据?即读取不完整的信息?

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


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