mql5言語の特徴、微妙なニュアンスとテクニック - ページ 86

 

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

バグ、バグ、質問

fxsaber さん 2018.06.20 23:18

システムに注文があるにもかかわらず、ターミナルに注文がない場合、このような幻の注文がどのくらい続くのかを確認することにしました。

// Советник отслеживает длительность ситуаций, когда ордер отсутствует среди текущих и исторических

#define  TOSTRING(A)  #A + " = " + (string)(A) + "\n"
#define  TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n"

bool OrderIsExist( const ulong &OrderTicket )
{
  return(OrderTicket ? OrderSelect(OrderTicket) || HistoryOrderSelect(OrderTicket) : true);
}

void OnTradeTransaction ( const MqlTradeTransaction &Trans, const MqlTradeRequest&, const MqlTradeResult& )
{
  static bool PrevIsExist = true;
  static ulong StartTime = 0;
  static ulong MaxInterval = 0;
  
  const ulong NowTime = GetMicrosecondCount();
  const bool IsExist = OrderIsExist(Trans.order);
    
  if (!IsExist)
  {
    Print(TOSTRING2(Trans.type) + TOSTRING(Trans.order) +
          TOSTRING(OrderSelect(Trans.order)) + TOSTRING(HistoryOrderSelect(Trans.order)));       
  
    if (PrevIsExist) 
      StartTime = NowTime;
  }
  else if (!PrevIsExist)
  {
    const ulong Interval = NowTime - StartTime;
    
    Print(TOSTRING(Interval) + TOSTRING2(Trans.type) + TOSTRING(Trans.order) +
          TOSTRING(OrderSelect(Trans.order)) + TOSTRING(HistoryOrderSelect(Trans.order)));       
    
    if (Interval > MaxInterval)
    {
      MaxInterval = Interval;
      
      Comment(TOSTRING(MaxInterval) + TOSTRING(Trans.order)); // mcs.
    }
  }
          
  PrevIsExist = IsExist;
}


結果

2018.06.21 00:10:31.047 Trans.type = TRADE_TRANSACTION_ORDER_DELETE (2)
2018.06.21 00:10:31.047 Trans.order = 2210967406
2018.06.21 00:10:31.047 OrderSelect(Trans.order) = false
2018.06.21 00:10:31.047 HistoryOrderSelect(Trans.order) = false
2018.06.21 00:10:31.047 
2018.06.21 00:10:31.080 Interval = 32643
2018.06.21 00:10:31.080 Trans.type = TRADE_TRANSACTION_HISTORY_ADD (3)
2018.06.21 00:10:31.080 Trans.order = 2210967406
2018.06.21 00:10:31.080 OrderSelect(Trans.order) = false
2018.06.21 00:10:31.080 HistoryOrderSelect(Trans.order) = true


32ミリ秒、注文はあるがターミナルにない!もし、この間に売買ロジックが実行されたらどうなるか、想像してみてください.


興味深いことに、ファントム注文はTRADE_TRANSACTION_ORDER_DELETEと TRADE_TRANSACTION_DEAL_ADD(かなり稀)の取引タイプにのみ 存在することが多い。


非常に悪いプラットフォームのニュアンス。


ZZY 5での貿易取引のスピードは、残念ながら疑問が残りますね。

 
HistorySelectは、最初から履歴を要求すると遅いです。したがって、次のようにすることが望ましい。

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

OrderCloseTime Expert Advisor MQL5

fxsaber さん 2018.07.06 09:27

void LastTimeMQL5( datetime &OpenTime, datetime &CloseTime )
{
  static datetime PrevTime = 0;
  
  if (HistorySelect(PrevTime, INT_MAX)) // HistorySelect(0, INT_MAX) - slow.
  {
    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;
      }
    }
  }
  
  PrevTime = CloseTime;
}


明らかに解決策は松葉づえ寸前です。他の実装は、もうこんなに簡潔にはいかないでしょう。ブレーキを回避する簡単な方法では、一般にうまくいきません。

 
fxsaber:
クイックマルチシンボル OnTick の実装

解らないんです。

OnTickはなぜSymbolというパラメータ付きで、なぜパラメータなしなのでしょうか?

って、なんでまたコメントの下の方にあるんだ?

なぜ、基本的なOnChartEventだけ ではないのですか?

void OnTick()
{
  OnTick(_Symbol); 
}

void OnChartEvent( const int id, const long &lparam, const double&, const string& )
{
  if (id == CHARTEVENT_CUSTOM)
    OnTick(Symbols[(int)lparam]);
}

// Мультисимвольный OnTick
void OnTick( const string &Symb )
{
}
 
fxsaber 私たちは、クールなコード・ドラッカーを持っています。このチップを理解することができない
 
Fast528 です。

なぜ、基本的なOnChartEventを 通さないのか?

なぜなら、「フライとカツ」を分けておくと便利だからです。すべてのロジックを多文字のOnTickで記述する。名前の偶然はランダム...。

 
fxsaber

なぜなら、「フライとカツ」を分けておくと便利だからです。すべてのロジックをマルチシンボルOnTickで記述します。名前に偶然が重なると...。

...2028年まで、皆さんと一緒に...。

あなたのコードです、完全なものを探します。

Индикатор

#property indicator_chart_window
#property indicator_plots 0

input long Chart = 0; // идентификатор графика-получателя события
input int Index = 0;

int OnCalculate( const int rates_total, const int prev_calculated, const int, const double &[] )
{
  if (prev_calculated)
    EventChartCustom(Chart, 0, Index, 0, NULL);
  
  return(rates_total);
}


Советник

input int AmountSymbols = 1;

const string Symbols[] = {"EURUSD", "GBPUSD", "AUDUSD", "USDJPY", "USDCAD"};

void OnInit()
{
  for (int i = 0; i < AmountSymbols; i++)
    if (Symbols[i] != _Symbol)
      iCustom(Symbols[i], PERIOD_W1, "Spy.ex5", ChartID(), i); // MQL5\Indicators\Spy.ex5
}

void OnTick()
{
  OnTick(_Symbol); 
}

void OnChartEvent( const int id, const long &lparam, const double&, const string& )
{
  if (id == CHARTEVENT_CUSTOM)
    OnTick(Symbols[(int)lparam]);
}

// Мультисимвольный OnTick
void OnTick( const string &Symb )
{
}
 
Fast528 です。

誰もこのマルチシンボルNewTickイベント実装のバリエーションを使うことを強制しているわけではありません。この支店では、いろいろなものをシンプルにまとめています。

 
fxsaber

誰もこのマルチシンボルNewTickイベント実装のバリエーションを使うことを強制しているわけではありません。このスレッドでは、いろいろとまとめてみただけです。

私はOnTickに興味があったのですが、これもパラメータがあると、コンパイラが飲み込む

 
Fast528 です。

なぜOnTickなのかというと......。

自分でもわからない、ランダムな偶然。

 
fxsaber

自分でもわからない、ランダムな偶然。

まさか、機能を見つけた、MCがまだ主要機能の1つの名称を直していない、読んでいて検索するのに時間がかかってしまった。

ドキュメント化されていない機能を探している

理由: