ライブラリ: TradeTransactions - ページ 2

 
Sergey Chalyshev:

今のところ、このライブラリーの使い道は思いつかない。

FXでは間違いなく必要ないし、証券取引所でも必要ない。

部分執行の話なら、FXでは本格的に機能する。特に、非同期性がFXで非常に求められているのはそのためで、したがってこのライブラリは有用です。

このライブラリを証券取引所でテストしましたか?

証券取引所でのテストはしていませんが、証券取引所もFXもライブラリとしては技術的には同じです。好きなときに好きな場所で、すべての取引に関するデータを取得するだけだ。それだけだ。だから、ここでは市場の種類には何も左右されない。

どんな場合に役立つと思いますか?

このライブラリーが役に立つのは、非同期が役に立つ場合です。これは、取引注文の 大量(複数)送信です。様々なシナリオが考えられます:

  • キャラクターバスケットの開設・変更・閉鎖。
  • グライダー。
  • 部分的な約定結果の処理。
  • すべてのポジションを決済し、すべての注文を削除する。
  • ...
 
fxsaber:

実験が必要だ。リソースの同時書き込み/読み込みは、グローバル変数と 同じように機能すると思います。リソースとグローバルの唯一の違いは、理論上、リソースに同時に何かを書き込むことはできないということです。グローバル変数の場合は可能です。


実際、リソースの読み込みはメモリからデータの一部を取得することです。また、読み出しが開始されたとしても、リソースの書き込みはそれに影響を与えないはずです。というのも、書き込みは別のメモリを確保することだからだ。そういうわけで、私の見解では、リソースのロードとセーブの競合は起こらないはずだ。しかし、もちろん開発者にこう質問した方がいい。

同じ名前のリソースは同じリソース(そしてそれぞれメモリの一部)ではないのか?

確認するのは簡単だ。末尾に特別なマークが付いた長いものを書いて、それを並行して読めばいい。メッセージ全体が読み込まれない場合は、衝突が起きている可能性があります。

 
Andrey Khatimlianskii:

同じ名前のリソースは同じリソース(それぞれメモリの塊)ではないのか?

書き込みは別のリソースを作成することです。

確認するのは簡単で、末尾に特別なマークを付けた長いものを書き、それを並行して読みます。メッセージ全体が読み込まれない場合は、競合が発生している可能性があります。

#property script_show_inputs

input bool Save = true; // セーブ/ロード

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

理論的には許される。だからこそ、あなたもチェックすべきなのだ。

長さの異なる2つの文字列があってもエラーになることはない:

#property script_show_inputs

input bool Save = true; // セーブ/ロード

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

長さの異なる2つの文字列でもエラーはない:

その通りです。だから元のコードで チェックしたと言ったんだ。

 
標準的なC++のスタイルや命名規則を使うことを考えたことはありますか?個人的にはあなたのコードは素晴らしいと思いますが、私があなたのライブラリを使わない(あるいはリファクタリングしなければならない)理由は、使われているスタイルにあります。あなたのコードのいくつかを精神的に解析する のはとても難しいのですが、それは単にあなたが標準的な規約に従っていないからです。これは、他の言語から来た人にとっては特にイライラすることだ。例えば、このライブラリはクラス宣言(ALLCAPS)以外をすべてキャメルケースで命名しているが、これはほとんどすべてのプログラミング言語の命名規則に反している。コードを見るとイライラする。
CamelCase.thing

他の多くの言語では、インスタンス属性ではなくクラス全体の属性にアクセスしているからです。

クラス宣言も同様で、あなたはマクロを使いたがるので、あなたのクラス宣言がマクロなのか列挙型なのか、私にはわかりません。通常、MQLの標準規約では、enum、マクロ、定数にはALLCAPSのみを使用し、クラス宣言にはCamelCaseを使用します。また、MQLの慣例により、変数はsnake_caseを使用して定義されます。


建設的な批評であなたを怒らせるつもりはありませんし、あなたがこれらのライブラリを誰でも無料で使えるようにするために懸命に働いていることも知っています。もしあなたが、適用されているスタイルに少し手を加えるだけで、より多くの開発者があなたのライブラリを使うようになるのなら。それがあなたの望みでしょう?