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

 
MKさん、標準ライブラリに バイナリサーチの普通の関数を追加してはどうでしょう?ArrayBsearchは、型が単純で、カスタムコンパレータを必要としない場合にのみ適用されます。テンプレートがあるので、c++::std::lower/upper_boundの上にオーバーライドを作る。今までは自分で書いていたので、普通ではありません(ほとんどcppreferenceからコピーしています)。
template<typename A, typename T, typename Compare>
uint lower_bound(const A &ar[], const T &value, Compare &comp){
   long count = ArraySize(ar);
   uint first = 0;
  
   while(count > 0){
      uint it = first;
      uint step = count / 2;
      it += step;
      if(comp.comp(ar[it], value)){
         first = ++it;
         count -= step + 1;
      }
      else
         count = step;
   }
   return first;
}

void OnStart(){
   struct M_point{
      double price;
      datetime time;
   };
   M_point ar[5];
   ar[0].time = 2; ar[1].time = 4; ar[2].time = 6;
   ar[3].time = 8; ar[4].time = 10;
   struct Comp{
      bool comp(const M_point &p, datetime value) {return p.time < value;}
   }cmp;
   datetime value = 6;
   lower_bound(ar, value, cmp);
   return;
}

その過程で、いくつかの疑問が生まれました。
1.Compでoperator()が書けない(なぜか禁止されている)のはなぜですか?
bool operator()(const M_point &p, datetime value) {return p.time < value;}
2.定数参照を受け付ける関数にprvalueを渡せないのはなぜですか?
lower_bound(ar, 6, cmp) ); // ошибка
HH: さらに、「構造体にはメンバがありません、サイズは1バイトに割り当てられています」という警告も非常に気になります。
 
coderex:

そこでは全て問題なく、発注はOnTradeTransactionで制御されるべきです。ところで、Plaza2を通じて直接取引所に接続する場合も状況は同じで、発注に関するメッセージの到着を制御する必要があります。MT4では、この機能は同期式ですが、MT5でも同様のオプションがあり、この場合のみ、関数が応答を受け取らないまでロジックが停止します。

必要であれば、コントロールクラスをお送りしますが、これはマーケットプレイス用に書かれたもので、近々リミッター用に最終調整する予定です。

要求を制御するためには、その配置の事実を覚えておく必要があります。クラスはお送りします。
 
fxsaber:
ぜひとも、コドベースに投稿してください。教育目的のため。

https://www.mql5.com/ru/forum/1111/page1743#comment_2877482、あなたが指摘した理由でできません 最近、私はエラーを特定することができず、ソースコードをservicedkに形成するために多くの時間を費やしました - 最終的に多くの相互参照(幾何学的な進行で1つが他のものを引っ張る)のために何も出てこなかった - 私は.ex5を送信しました。

教育的な観点から、私は次のようなことを提案します:変数を追加することなく、h()を単純化し、f()がどのような場合でも一度だけ呼ばれるようにする。

bool f() { return Random(); /*вычисляется ооочень долго, но результат не зависит от числа вызовов*/ } 
void g1() { /*делает что-то полезное*/ }
void g2() { /*делает что-то полезное*/ }
void h() {
#ifndef  MACRO
        if ( f() )
#endif
        {
                if ( f() )
                        g1();
                g2();
        }
}
Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум трейдеров MQL5.community
 
A100:

コンパイルエラー

(*) 一般に、パターン(1)では、Tの代わりにA->(2)とconst A->(3)の両方を代用することができる。

それはなぜでしょうか?constを含むパターンはnon-constを受け入れることができません - それは契約に違反します。

 
A100:

教育目的のために、私は次の課題を提案することができます:追加の変数を導入することなく、f()がどのような場合でも一度だけ呼ばれるようにh()を簡素化します。

bool f() { return Random(); /*вычисляется ооочень долго, но результат не зависит от числа вызовов*/ } 
void g1() { /*делает что-то полезное*/ }
void g2() { /*делает что-то полезное*/ }
void h() {
#ifndef  MACRO
        if ( f() )
        {
                g1();
                g2();
        }
#else
        if ( f() )
                g1();
        g2();
#endif
}
 
Stanislav Korotky:

それはなぜでしょうか?constを持つテンプレートはconst以外を受け付けない - 契約に違反する。

テンプレートはそれ自体ではありません(関数とは異なります) - そのタスクは置換を実行することです(#defineとの類似性)。置換が終わった時点で矛盾がなければ(なくても)、テンプレートはその使命を果たしたことになる。少なくとも私はC++でコンパイルしようとしましたが、コンパイラはエラーや警告を出しませんでした。
 
fxsaber:
これは本当に単純化したものではありません。元のMACRO+2*f+g1+g2=5で - MACRO+2*f+2*g1+2*g2=7となります。
 
Sergey Diubakin:

同じような問題を経験された方はいらっしゃいますか?端末の "バグ "か、私の "バグ "か?

GetLastError() は何を返すのですか?
 
fxsaber:

MT5-OrderSendは完全な同期型ではなく、取引環境と同期していません。これは、ヒストリーの読みが実際の状況に対応していないことを意味します。

タイムアウトなしは論外。同期の問題はサーバーレベルではなく、端末レベルで解決しなければならないので、確実な解決策はない。

実は、MT4ブリッジの開発者が直面していることに、MT5ユーザーも直面しているのです。

OrderSendが送信された場合、それが行われたことを記憶しておく必要があります(ここが潜在的な脆弱性です)。そして、OnTradeに対応するメッセージが来るまで、現在の履歴(取引環境)を無視します。届いたら、REMEMBER to FORGET(忘れることなく)。

REMEMBERがない場合は、MT4と同様に履歴を信頼することができます。

MT4-OrderSendは完全に同期しています。
不思議ですね、どんな理由でこんなことをするのでしょう.
OrderSendAsyncを非同期でいじれば、OnTradeとOnTradeTransactionの両方を処理できるのは理解できるのですが。OrderSendでは、MT4のようなシンプルな動作をさせたいと思っています。この関数が呼び出されると、すでに変更されたオープンポジションと履歴が出力されます。
微妙なところがあるんです。現在の状態がグローバル変数に 格納されており、状態の変化の予想に比較的時間がかかる場合、トレーダーがEAパラメータを変更することに成功すると、グローバル変数がリセットされ、状態が破棄されます。
 
bool f() { return Random(); /*вычисляется ооочень долго, но результат не зависит от числа вызовов*/ } 
void g1() { /*делает что-то полезное*/ }
void g2() { /*делает что-то полезное*/ }
void h() {
        if ( f() )

        {
                g1();
#ifdef  MACRO
        }
#endif
                 g2();
#ifndef  MACRO
        }
#endif
}