MT5とスピードの関係 - ページ 56

 
Renat Akhtyamov:
ジェントルマン・オブ・ザ・プログ...
コンピュータのメモリ割り当てについて最初に読み、次にどのように、どのような手段でそれが行われ、次にどのようにクリーニングして、から読み取ることは困難ではありません。少なくとも、開発者に対するより合理的な提案は可能である

mt4ではわからないのでは?
あらかじめ設定されているAsk Bidを自分で使っているのですか?
mt5では、MqlTickの構造体 全体に対して、何らかの理由でそれらが欠落しています。
関数を呼び出し、構造体を埋めてから、値を取得します。
それともすぐに値を取得するのか、違いはあるのでしょうか?

それとも、私の方向ではないのでしょうか?
せめて誰に宛てて書いているのかくらいは示すべきでしょう ))

 
Roman:

あらかじめ定義された変数、現在のティックのための、おそらくより良いだろう。

開発者は以前、直接アクセスには根本的な限界があると説明しています

void f()
{
        MqlTick t1 = _Tick;
        MqlTick t2 = _Tick;
}

であり、一般に t1 と t2 は等しくない。さらに、t1 と t2 の両方に含まれるフィールドの値は、まったく異なるティックを参照することになるかもしれません。

 
A100:

開発者は以前、直接アクセスには根本的な限界があると説明しています

であり、一般にt1はt2と等しくない。さらに、t1 と t2 はリンクしたフィールドであるにもかかわらず、両者の中のフィールド値は異なるティックを参照することができます(これらは同じティックを参照するはずです)。

Brr、根本的な限界は何ですか?
例の構造は不要です、埋める必要はありません。

ソケットから値が来て、構造に従って変数 _Ask, _Bid, などに書き込まれる。
_Ask != _Ask in your opinion?
構造体を埋めてしまうと制限が発生し、時間がかかってしまいます。
記入する必要はありませんが、_Ask, _Bid などは直接与えてください。

 
Roman:

Brr、原理的な制限とは何ですか?
例の構造はここでは不要です、記入する必要はありません。

void f()
{
        double ask1 = _Ask;
        double ask2 = _Ask;
}

構造がなくても書き換えることができます。一般的な場合、ask1 と ask2 は等しくない。

 
A100:

また、構造を無視して書き直すことも可能です。一般的な場合、ask1 と ask2 は等しくない。

I.e.これらは非同期環境に対するリクエストであり、応答は現在の環境の状態によって受け取られるのですか?また、OnTickは現在のティックをキャッチしてEAを動作させていますが、同時にEAが動作しているときにティック構造による要求は、次のティックから答えを得ることができるのでしょうか?

 
A100:

また、構造を無視して書き直すことも可能です。一般に、ask1 と ask2 は等しくない。

だから、実数の最後の桁が異なる100500桁を使用する必要はありません 0.000000000000000001
各変数のための異なる桁、価格ダブル最大8です。

 
Renat Fatkhullin:

重要なのはベータ版2652をリリースしたこと。

  • コンパイル割り込みの改善 (22%増)
  • SymbolInfoTickへのアクセスが劇的に速くなりました。

22%良好です。

SymbolInfoTick- 自宅のマシンでは、アラートが出ないことに目で見て気がつきました。しかし、ログにあるこれらのアラートをフィルタリングしてみると、24時間前の同じ時間帯に発行された2650件よりも多くの件数があることがわかりました。

両方のログをPMに送信しました。

 
Valeriy Yastremskiy:

つまり、これらは非同期環境に対するリクエストであり、応答は環境の現在の状態に基づいて行われるのですか?また、OnTickは現在のティックをキャッチしてEAをワークアウトしていますが、EAがワークアウトしているときのティック構造による要求は、次のティックから答えを得ることができるのでしょうか。

はい。

 
Renat Fatkhullin:

大量の刻み作業を行う場合は、メモリを多めに搭載してください。

4gb(価格€20)は、分析や調査に関して言えば、2020年にはもう通用しない。

CopyTicksに一度だけ電話をかけるという話です。これは、OnInitでこれらのティックで仮想バックテストを行い、新鮮なティックのみをフィードしてリアルタイムでそれを継続するために行われます。

妥協案として、OnInitで呼ばれるCopyTicksの直後にTerminal内のメモリを解放することを提案します。それなら、CopyTicksに強制冷却機能を導入する必要はない。

今、スリープ版の 冷却はとてもカクカクしています。しかし、この松葉杖がいかにメモリの節約になるかは、前述したとおりです。


20のExpert Advisorが低速のVPSでも高速に動作することが判明しました。しかし、それらを起動させるのは重大な問題です。


以下は、この問題を示すExpert Advisorです。

// Демонстрация 10-ти секундного удержания в памяти ненужных данных CopyTicks.
#define  PRINT(A) Print(#A + " = " + (string)(A))

input datetime inFrom = D'2020.06.01'; // С какой даты анализировать историю

int OnInit()
{
  MqlTick Ticks[];
  
  Print("Before CopyTicks:");
  PRINT(MQLInfoInteger(MQL_MEMORY_USED));     
  PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));
  
  PRINT(CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, (long)inFrom * 1000));
  ArrayFree(Ticks);
  
  Print("After CopyTicks:");
  
  for (int i = 0; i < 10; i++)
  {
    PRINT(i);
    PRINT(MQLInfoInteger(MQL_MEMORY_USED));    
    PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));
    
    Sleep(1000);
  }
  
  return(INIT_FAILED);
}


結果

2020.10.14 08:49:24.016 Before CopyTicks:
2020.10.14 08:49:24.016 MQLInfoInteger(MQL_MEMORY_USED) = 0
2020.10.14 08:49:24.031 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 864
2020.10.14 08:49:25.399 CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 14372119
2020.10.14 08:49:25.465 After CopyTicks:
2020.10.14 08:49:25.465 i = 0
2020.10.14 08:49:25.465 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:25.499 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:26.594 i = 1
2020.10.14 08:49:26.594 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:26.630 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:27.729 i = 2
2020.10.14 08:49:27.729 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:27.762 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:28.852 i = 3
2020.10.14 08:49:28.852 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:28.884 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:29.977 i = 4
2020.10.14 08:49:29.977 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:30.009 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:31.102 i = 5
2020.10.14 08:49:31.102 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:31.136 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:32.224 i = 6
2020.10.14 08:49:32.225 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:32.257 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:33.348 i = 7
2020.10.14 08:49:33.348 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:33.381 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:34.468 i = 8
2020.10.14 08:49:34.468 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:34.501 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1796
2020.10.14 08:49:35.593 i = 9
2020.10.14 08:49:35.593 MQLInfoInteger(MQL_MEMORY_USED) = 1
2020.10.14 08:49:35.605 TerminalInfoInteger(TERMINAL_MEMORY_USED) = 860
 
fxsaber:

22%・・・結構です。

SymbolInfoTick - 自宅のマシンでは、アラートがないことに目で見て気づきました。しかし、ログにあるこれらのアラートをフィルタリングしてみると、24時間前の同じ時間帯に発行された2650件よりも多くの件数があることがわかりました。

両方のログをPMに送信しました。

大量並列アクセスの場合、1/10に高速化。

その他の場合は、プロセッサ、メモリ、オペレーティングシステムのアップグレードのみとなります。