エラー、バグ、質問 - ページ 2744

 
Aliaksandr Hryshyn:

エラーです。


メッセージをありがとうございました。
修正しました。

 
Ilyas:

最適化に関する質問です。テスターでは、すべてのティックに、さらなる作業のためのティックを取得する必要があります。私はこの方法でやっています。

void OnTick()
{
  static MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))
    // ...
}


このバリエーションが遅くなることは明らかです。

void OnTick()
{
  MqlTick Tick;
  
  if (SymbolInfoTick(Symbol(), Tick))
    // ...
}


しかし、SymbolInfoTickは、文字列パラメータが参照渡しでないため、速度も遅くなります。


文字列を参照渡しする通常のSymbolInfo*オーバーロードは可能でしょうか?


があったほうがいい。

const MqlTick _Tick; // Текущий _Symbol-тик.


Optimizerでは、これらの関数が何百億回と呼び出される。

 
Ilyas:
GetNextEvent関数を追加するということでしょうか?

そうではなく、むしろこの関数をHandleNextEventとして呼ぶことが可能なシグネチャです。

bool HandleNextEvent (ENUM_EVENT_TYPE);


呼び出されると、GetNextEventと同様に、指定されたENUM_EVENT_TYPEがキューに存在するかどうかをチェックします。
、このイベントが存在する場合、自動的に対応するハンドラ(OnChartEvent、OnTrade、OnTradeTransactionなど)のユーザーコードに制御が渡されます。(追加してくれたfxsaberに 感謝))
キューにイベントがあった場合はtrueを,そうでない場合はfalseを返す.


想定される使用例

//....
for(int i = 0; i < 10^6; ++i){
   // .... Data Calculations

   if((i % 10^3) == 0){
       while(HandleNextEvent(EVENT_TYPE_ALL));
   }
}
//....
 
fxsaber:

最適化に関する質問です。テスターでは、すべてのティックに、さらなる作業のためのティックを取得する必要があります。私はこの方法でやっています。
このバリエーションが遅くなることは明らかです。

この文言は実際に確認されましたか?一見、正反対に見えるかもしれません。

MqlTickは初期化されていないプリミティブなデータ型から構成されています。
それに対応して、サイズが違うだけで同じ「サブesp」操作なので、選択には全く無駄な時間がかかりません。
その結果、メモリから値を読み出す操作のボトルネックはプロセッサのキャッシュ側になる可能性がある。

一般的にはテストしてみるべきだろう ))。

 
Sergey Dzyublik:

このイベントが発生すると、自動的に適切なハンドラのユーザーコードに制御を移します。

想定される使用例

とても素敵で便利なソリューションです

 
Sergey Dzyublik:

この文章を実際に検証したことがありますか?ただ、その逆になってしまうかもしれません。

ここで理論武装。確認はしていない。しかし、ストリングリンクでの転送は適切だと思われます。

 
Sergey Dzyublik:

考えられる使用例。

って、意味不明なこと言ってますね。

署名とあなたの説明によると、端末は次のイベントを処理する関数を呼び出し、handlenexteventが呼び出された時点で、プログラムに制御を 戻す必要があるのですね?

処理中にhandlenexteventが再度呼び出された場合はどうなりますか?

パラメータにあるフィルタを通過しなかったイベントはどうなるのでしょうか。

スクリプトにはイベントキューが全くありません。Expert Advisorやインジケータがあるのに、なぜ松葉杖でイベントキューを追加するのですか?

 
TheXpert:

1)何か無意味なことを示唆している。
2) 署名とあなたの説明によると、端末は関数によって次のイベントを呼び出し、その後、handlenexteventが呼び出されたところまでプログラムに制御を 戻す必要があるのでしょうか?
3) 処理中にhandlenexteventが再度呼び出された場合はどうするのか?
4) そして、パラメータにあるフィルターに該当しないイベントはどうなるのでしょうか?スキップされるのでしょうか?


1) 私の仕事は提案することですが、それがおかしなものかどうかは、あなたではなく、開発者が決めることです。
2)わかりました。システム内のすべてのイベントではなく、特定のイベントの処理に興味がある場合、他のイベントの処理は通常通りとして、このタイプのイベントのみを 処理できるようになればいいと思います。
3) 処理中に再度HandleNextEventが呼び出された場合 - 呼び出して処理する。スタックオーバーフローだけが起こる可能性がありますが、これはユーザーとコードの問題であり、開発者の問題ではありません。
4) フィルタに該当しないイベントは、同じシーケンスのまま、ユーザーがシステムに制御を戻したときに通常通り呼び出されます。


 
TheXpert:

スクリプトにはイベントキューが全くありません。EAやインジケータがあるのに、なぜ松葉杖で追加するのでしょうか?

以下は、非同期でポジションや注文をオープン/クローズするスクリプトの例です。

// Максимально быстро все закрывает. Возврат, когда действие подтверждено.
bool CloseAll()
{
  uint RequestID[];
  
  for (int i = ArrayResize(RequestID, OrdersTotal()) - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS))
      // Отправили асинхронный приказ
      RequestID[i] = (OrderType() <= OP_SELL) ? OrderCloseAsync(OrderTicket(), OrderLots(), OrderClosePrice(), 100) : OrderDeleteAsync(OrderTicket());
  
  return(Transactions.Waiting(RequestID)); // Дождались ответа от сервера на все асинхронные приказы
}
TradeTransactions
TradeTransactions
  • www.mql5.com
Асинхронные торговые приказы обладают огромным преимуществом - высокая скорость при массовой отправке. Однако, распространению таких приказов мешает некоторое неудобство - данные о результате приказа возможно увидеть только в OnTradeTransaction. Такое обстоятельство заставляет обывателя строить событийную модель своей ТС, если хочется...
 
Sergey Dzyublik:

1)私の仕事は提案することであり、それがナンセンスかどうかは、あなたが決めることではなく、開発者が、もう少し良く知っていることです...。

より実装しやすいものを提案すれば、実装される可能性は高くなる。 ほとんど何も得られないので、選択肢を削除した。