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

 
Renat Fatkhullin:

状態5000とアンリミテッドの2つしかないんですか?

あなたは自分の幸せの主人です。

そう、フルコントロールと表層的なコントロールのどちらかが必要なのです。中途半端は意味がないと思うんです。
 
Renat Fatkhullin:

理論的にはそうです。

同期処理も忘れてはいけません。プラットフォームでは膨大な数の処理が非同期で行われます。

例えば、取引所や流動性プロバイダーとゲートウェイを統合すると、数秒から数分の遅延でトランザクションレポートを送信することがあります。多くの場合、APIはリコンサイルのための履歴へのアクセスを全く提供せず、遅くて非リズミカルなレポートジェネレータを提供します。

マーケットオープン時、または予期せぬゲートウェイの再接続により、レポートが遅延することがあります。サーバー上の履歴に複製され、直ちに非同期で端末に送信される。日付でソートされているため、適切な場所に挿入され、その間に新しいトレードを開くことができるのです。

ほとんどの統合APIは、文盲で機能不全に陥っており、保証された ゲートウェイを作ることはほとんど不可能です。ただし、これは開発者の意図的な妨害行為であるという意見もある。

選択権を与えるべきか?物理的なスナップを必要とする人と、適切なリスクでインデックスを扱うのに十分な人。

 
このトピックに関係のないコメントは、「MQL5 MT5 MetaTrader5初心者からの質問」に移動しました。
 
fxsaber:

選ぶ権利を与えるべきか?物理的なスナップを必要とする人と、適切なリスクでインデックスを扱うのに十分な人。

EAでローカルキャッシュを保持し、最終更新時刻から相対的にサンプリングすることの何が問題なのか?私はそうしていますが、これまで一度もラグを感じたことはありません。私のネットワーク機能は、その同期的な実装のためにインターフェイス全体を遅らせるので、箱から出してWebRequestAsyncが あるといいのですが、私はすでにDLLや、pythonとC++の結合ラッパーを調べています。)

しかし、ローカルキャッシュを使わずに大量のデータを扱うのは、とても不思議なことです。

PS.一般に、ハッシュマスクとキャッシュは多通貨で非常に需要があり、それがこのスレッドで私が箱から出して普通の(高速な)ハッシュマスクを尋ねた理由です。
Документация по MQL5: Сетевые функции / WebRequest
Документация по MQL5: Сетевые функции / WebRequest
  • www.mql5.com
Для использования функции WebRequest() следует добавить адреса серверов в список разрешенных URL во вкладке "Советники" окна "Настройки". Порт сервера выбирается автоматически на основе указанного протокола - 80 для "http://" и 443 для "https://". Функция WebRequest() является синхронной, это означает, что она приостанавливает выполнение...
 
Andrey Pogoreltsev:

EAでローカルキャッシュを保持し、最終更新時刻から相対的にサンプリング することの何が問題なのか?

このスクリプトは、まさにそれを実現するものです。

ローカルキャッシュについては、MT4Ordersではそのように履歴が実装されています。

 
fxsaber:

ローカルキャッシュについては、MT4Ordersがそのように実装 した話です。

まさか、2年前の脚本が、こうなるとは。

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

OrderCloseTime Expert Advisor MQL5

fxsaber さん 2018.07.06 00:49

#include <MT4Orders.mqh> // https://www.mql5.com/en/code/16006

void LastTimeMQL4( datetime &OpenTime, datetime &CloseTime )
{
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL))
    {
      OpenTime = OrderOpenTime();
      CloseTime = OrderCloseTime();
      
      break;
    }
}

void LastTimeMQL5( datetime &OpenTime, datetime &CloseTime )
{
  if (HistorySelect(0, INT_MAX))
  {
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
    {
      const ulong Ticket = HistoryDealGetTicket(i);
  
      if (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT)
      {
        CloseTime = (datetime)HistoryDealGetInteger(Ticket, DEAL_TIME);

        if (HistorySelectByPosition(HistoryDealGetInteger(Ticket, DEAL_POSITION_ID)))
          OpenTime = (datetime)HistoryDealGetInteger(HistoryDealGetTicket(0), DEAL_TIME);
          
        break;
      }
    }
  }
}

typedef void (*GetLastTime)( datetime&, datetime& );

void Bench( GetLastTime LastTime, const int Amount = 10000 )
{
  datetime OpenTime, CloseTime;
  datetime Tmp = 0;

  for (int i = 0; i < Amount; i++)
  {
    LastTime(OpenTime, CloseTime);
    
    Tmp += CloseTime - OpenTime;        
  }
  
  Print(Tmp);
}

#define  BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{  
  if (HistorySelect(0, INT_MAX))
    PRINT(HistoryDealsTotal());

  BENCH(Bench(LastTimeMQL4))
  BENCH(Bench(LastTimeMQL5))  
}


は、そんなブレーキを見せるのです

// Первый запуск
2020.08.28 22:01:12.941 HistoryDealsTotal() = 9435
2020.08.28 22:01:13.198 2046.04.30 00:13:20
2020.08.28 22:01:13.198 Time[Bench(LastTimeMQL4)] = 257277
2020.08.28 22:01:43.982 2046.04.30 00:13:20
2020.08.28 22:01:43.982 Time[Bench(LastTimeMQL5)] = 30783493

// Второй запуск
2020.08.28 22:03:31.474 HistoryDealsTotal() = 9435
2020.08.28 22:03:31.724 2046.04.30 00:13:20
2020.08.28 22:03:31.724 Time[Bench(LastTimeMQL4)] = 250491
2020.08.28 22:04:02.011 2046.04.30 00:13:20
2020.08.28 22:04:02.011 Time[Bench(LastTimeMQL5)] = 30286258

純粋なMQL5は、部分的(HistorySelectByPositionのみ)なキャッシングに比べ100倍も遅い。

 
テストは全く受け入れられない。

MQL5-styleでは、具体的にHistorySelectの 1万サンプルを全深度でテストされたそうですね。さらに、サイクルを追加したんですね。

最初に明確な条件提示がなく、明らかな偏りを説明し、衝撃的な数字を出す--これは純粋に不正行為であり、操作である。

狼煙を上げるような反則行為に。
 
Renat Fatkhullin:
テストは全く受け入れられない。

MQL5-styleでは、具体的にHistorySelectの1万サンプルを全深度でテストされたそうですね。さらに、サイクルを追加したんですね。

最初に明確な条件提示がなく、明らかな偏りを説明し、衝撃的な数字を出す--これは純粋に不正行為であり、操作である。

狼煙を上げるような反則行為に。

なるほど、だからあなたの認識は間違っているのですね。とげがないように自分をキャッシュするのが正しいということが示されています。

私の理解が正しければ、この実装の後

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

MT5とスピードの関係

レナート・ファットフーリン, 2020.08.27 22:58

私たちはすでに多くのサンプリング操作を最適化し、今はキャッシュの最適な更新を考えていますが、実際には99%のサンプルは全く役に立たず、事実上見逃されることになります。

つまり、サンプリング制限を特にランダム化しない限り、キャッシュは100%に近いヒットを表示することになる。

おそらく来週には、すでに効果的な解決策が見つかっていることでしょう。


この例では、より高速に実行されます。


HH スクリプトは、取引履歴の最後のポジションのオープン/クローズ時間を計算します。

 
fxsaber:

投げやりにならないよう、正しいキャッシュの取り方を紹介。

このように「キャッシュ」しておけば、超高速に なるのです。

void LastTimeMQL5( datetime &OpenTime, datetime &CloseTime )
{
  static ulong PrevTicketIn = 0;  // Хранит тикет входа позиции с последнего вызова.
  static ulong PrevTicketOut = 0; // Хранит тикет выхода позиции с последнего вызова.
  
  if (HistorySelect(0, INT_MAX))
  {
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
    {
      const ulong Ticket = HistoryDealGetTicket(i);
      
      if (Ticket == PrevTicketOut)            
      {
        OpenTime = (datetime)HistoryDealGetInteger(PrevTicketIn, DEAL_TIME);
        CloseTime = (datetime)HistoryDealGetInteger(PrevTicketOut, DEAL_TIME);        
        
        break;
      }
      else if (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT)
      {
        PrevTicketOut = Ticket;
        
        CloseTime = (datetime)HistoryDealGetInteger(Ticket, DEAL_TIME);

        if (HistorySelectByPosition(HistoryDealGetInteger(Ticket, DEAL_POSITION_ID)))
        {
          PrevTicketIn = HistoryDealGetTicket(0);
          OpenTime = (datetime)HistoryDealGetInteger(PrevTicketIn, DEAL_TIME);
        }
          
        break;
      }
    }
  }
}

こんな文章を書く人がいるのか?

 
fxsaber:

このように「キャッシュ」しておけば、超高速です。

こんな文章を書く人がいるのか?

C言語プログラマー。