Библиотеки: TradeTransactions - страница 2

 
Sergey Chalyshev:

Пока что не могу придумать пользы от этой библиотеки.

На форексе она точно не нужна, а на бирже нет необходимости.

Если Вы про частичное исполнение, то оно вовсю работает на форексе. В частности, поэтому на форексе очень даже востребована асинхронность, а значит и данная библиотека может быть полезной.

Тестировали данную библиотеку на бирже?

На бирже не тестировал, но биржа и форекс для библиотеки - технически одно и то же. Вы просто получаете данные о всех транзакциях в любом месте, когда захотите. Только и всего. Поэтому от типа рынка здесь ничего не зависит.

В каком случае по вашему она может пригодиться?

Библиотека пригодится тогда же, когда пригодится асинхронность. А этом любая массовая (больше одного) отправка торговых приказов. Сценариев может быть много:

  • Открытие/модификация/закрытие корзины символов.
  • Гридеры.
  • Работа с результатами частичных исполнений.
  • Закрытие всех позиций и удаление всех ордеров.
  • ...
 
fxsaber:

Нужно экспериментировать. Думаю, что одновременная запись/чтение ресурса действует также, как и с глобальными переменными, т.к. запись в обоих случаях - это создание: ResourceCreate и GlobalVariableSet. Единственное отличие ресурса от глобальной - невозможно даже теоретически что-либо писать в ресурс одновременно. С глобальными - возможно.


Фактически, чтение ресурса - это получение куска данных из памяти. И если чтение началось, то запись ресурса не должна повлиять, т.к. запись - это выделение другого куска памяти. Пересекаться они вряд ли могут, т.к. это, скорее всего, не даст сделать сама ОС. Поэтому, с моей точки зрения, конфликтов load/save с ресурсами быть не должно. Но лучше, конечно, задать этот вопрос разработчикам.

А разве ресурс с одним именем — это не тот же ресурс (и кусок памяти, соответственно)?

Проверить легко — нужно записывать что-то длинное, со специальной меткой в конце, и параллельно читать. Если будет прочитано не целое сообщение, значит, конфликт может быть.

 
Andrey Khatimlianskii:

А разве ресурс с одним именем — это не тот же ресурс (и кусок памяти, соответственно)?

Запись - это создание другого ресурса.

Проверить легко — нужно записывать что-то длинное, со специальной меткой в конце, и параллельно читать. Если будет прочитано не целое сообщение, значит, конфликт может быть.

#property script_show_inputs

input bool Save = true; // Save/Load

#include <fxsaber\TradeTransactions\ResourceData.mqh> // https://www.mql5.com/ru/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; // Save/Load

#include <fxsaber\TradeTransactions\ResourceData.mqh> // https://www.mql5.com/ru/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:

В памяти могут оставаться записанные ранее данные?

Теоретически это можно допустить. Поэтому нужно и это проверять.

Как очистить?

Очистка ресурса - удаление.

 
fxsaber:

Теоретически это можно допустить. Поэтому нужно и это проверять.

С двумя строками разной длины ошибок тоже нет:

#property script_show_inputs

input bool Save = true; // Save/Load

#include <fxsaber\TradeTransactions\ResourceData.mqh> // https://www.mql5.com/ru/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:

С двумя строками разной длины ошибок тоже нет:

Все так. К тому высказался, что изначальный код это проверял.

 

Мне не как не получается получить данные, здесь я запускаю скрипт и, как я понимаю, данные сейчас сохранились в где-то в терминале:

#include <fxsaber\TradeTransactions\ResourceData.mqh> // https://www.mql5.com/ru/code/22166
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   const RESOURCEDATA<int>ResourceINT("::int"); // Ресурс для обмена int-ами. const - как доказательство, что ничего не пишется в объект класса  
   int ArrayINT[]={1,2,3};
   ResourceINT=ArrayINT;  // Ресурс хранит массив. 
   int ArrayINT2[];
   ResourceINT.Get(ArrayINT2); // Считали данные из ресурса.
   ArrayPrint(ArrayINT2);      // Вывели: 1 2 3 5 1 2 3   
  }
//+------------------------------------------------------------------+

здесь я запускаю другой скрипт, чтобы получить данные которые сохранились когда я запустил первый скрипт, но данные не выводится:

#include <fxsaber\TradeTransactions\ResourceData.mqh> // https://www.mql5.com/ru/code/22166
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
// Это полное имя ресурса для обращения из другой программы
   //const string NameOut=StringSubstr(MQLInfoString(MQL_PROGRAM_PATH),StringLen(TerminalInfoString(TERMINAL_PATH))+5)+"::Ticks";   
   const string NameOut=StringSubstr(MQLInfoString(MQL_PROGRAM_PATH),StringLen(TerminalInfoString(TERMINAL_PATH))+5,9)+"Test_Keep_Info.ex5::Ticks";   
   Print(NameOut); // Вывели полное имя ресурса.
   const RESOURCEDATA<int>Resource(NameOut); // Ресурс для доступа к данным (read-only) из другой программы
   int ArrayINT2[];
   Resource.Get(ArrayINT2); // Считали данные из ресурса.
   ArrayPrint(ArrayINT2);      // Вывели: 

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

Можете поправить где там ошибка?

Файлы:
Причина обращения: