エラーに悩まされ、取引業務がない - ページ 14

 
Maxim Kuznetsov:

Stop Outで何が起こるかを考える。(マージンコールはすでに持っている、ステップの方が近い)。

の場合、取引は強制的に終了しますが、そのようなオプションを無視し、毎ティック(履歴では長い)探し、不正な注文を送ることになります。

"10年以上のMQLプログラミング "をしている人のために補足しておくと

起こる可能性のあることは、必ず起こります。

ストップアウトやマージンコールはそれほど普通ではありませんが、当然のことであり、EAはそれらに対応できるようにしておく必要があります。

取引条件は変更される可能性があり、不変ではありません。StopLevelは時々ジャンプし、レバレッジも変化します。

ユーザーは、意図せずとも簡単にストップ/テイクを設定/変更したり、ポジションを閉じることができます - Expert Advisorはこれに反応する必要があります。

ユーザーがMagicで注文をオープン/クローズする(または誤ってMagic=0に設定して手で取引する)ことができますが、ロボットは何をするのでしょうか?

EAを再起動せずに残高を入金/出金する - これができるロボットは非常に重要(最近トピックがありました - 男性がお金を失っただけ)。

端末が再起動し、アップデートに時間がかかったり、かなりの時間接続が切れたりすることがある。これらすべてとオフラインで起こったことを考慮する必要がある

Validatorは「最低限必要なもの」の1-2%しかチェックしないのに、まだ文句を言う人がいるのか...。

 
Renat Akhtyamov:

は、質問と回答の順で書かれているようです。

スレッドの全ページにアクセスできます。

レナト ワラントをカウントしているとのことですが。なぜなんでしょう?


マキシム・クズネツォフ

ただ、「MQLプログラミング歴10年以上」の皆さんのために補足しておきます。

起こる可能性のあることは、必ず起こります。

ストップアウトとマージンコールはそれほど普通ではないが、当然のことであり、EAはそれらに対応できるようにしなければならない。

取引条件は変更される可能性があり、一定ではありません。StopLevelは時々ジャンプし、レバレッジも変化します。

ユーザーは、意図せずとも簡単にストップ/テイクを設定/変更したり、ポジションを閉じることができます - Expert Advisorはこれに反応する必要があります。

ユーザーがMagicで注文をオープン/クローズする(または誤ってMagic=0に設定して手で取引する)ことができますが、ロボットは何をするのでしょうか?

EAを再起動せずに残高を入金/出金する - これができるロボットは非常に重要(最近トピックがありました - 男性がお金を失っただけ)。

端末が再起動し、アップデートに時間がかかったり、かなりの時間接続が切れたりすることがある。これらすべてとオフラインで起こったことを考慮する必要がある

Validatorは「最低候補」の1〜2%しかチェックされないのに、まだ文句を言う人がいるのか...。

マキシム、何を言ってるんだ!ストップ安になった時の対処法を相談したもの。フォーラムを6ページ目から読んでみてください、私の考えでは、私の疑問を詳細に述べています。

 
Andrey Kaunov:

レナト ワラントをカウントしているとのことですが。なぜなんでしょう?


マキシム、何を言ってるんだ!ストップ・アウトをどうするかというアドバイスを求めたのだろうか。6ページのフォーラムを読むと、私の疑問が詳細に述べられているように思います。

リアルでのチケットは0,,,,Nではないので

 
ああ、私の小さなコードのことですね。だから、チケットの種類は関係ないんです。そこに2次元配列のRenatがある。セル[0]にはチケットを書き、セル[1]にはオーダーをカウントする。違う変数でやってもいいのですが、その方法でやってみようと思いました。
 
Andrey Kaunov:

レナト ワラントをカウントしているとのことですが。なぜなんでしょう?


マキシム、何を言ってるんだ!ストップ・アウトをどうするかというアドバイスを求めたのだろうか。フォーラムを6ページ目から読んでください。私の意見では、私の質問を詳細に述べています。

あなたの10年の経験から、私は何をアドバイスしたらいいのでしょうか?)

私のアドバイスを無視して、EAにバリデーターを要求していますね。

---

NZDUSDでストップアウトして、注文がクローズされた場合、EAのロジックは関係なく、それを選択してOrderCloseを送信すると、falseが表示されます。この驚くべき動作が1 目盛りごとに繰り返され、全体がスローになり、チェックがキャンセルされるのです。しかも、これは最もシンプルなケースでの話です。

トレードコンディションチェックについて - 前14ページ参照

 
Andrey Kaunov:

あなたのこの投稿に注目してください。

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

取引操作のないエラーに疲れる

アンドレイ・カウノフ さん 2020.07.25 11:42

レナットさん、試してみますね。

ウラジミール、質問を建設的に理解することができるか?マージンなどのロットは確認しないのですか?どんなチェックを通さなければならないか...」という記事は、もう私にとってバイブルのような ものです。上にコードスニペットを掲載しました。完全準拠のため、記事中の推奨事項に従ってコードを変更しました。

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots(string symbol, double lot, int direction, bool is_margin=true) {
   if(lot<=0) return(0.0);
   RefreshRates();
   double min=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   double max=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   double step=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP); 
   //double free = AccountFreeMargin()*0.95;
   //double margin = MarketInfo(symbol,MODE_MARGINREQUIRED);
   double _lot=lot<min?min:(lot>max?max:lot);
          _lot=MathRound(_lot/step)*step;
   //if(is_margin && _lot*margin>free)  _lot=0.0;
   ResetLastError();
   if(is_margin && (AccountFreeMarginCheck(Symbol(),direction,_lot)<=0 || GetLastError()==134)) _lot=0.0;
   return(_lot);
}

でも、まだ「ノートレード」と表示されるんです。

もし、この関数が常に0.0ロットを送信して、取引を開始できないのであれば、最小ロットを送信するように変更します。

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots(string symbol, double lot, int direction, bool is_margin=true) {
   if(lot<=0) return(0.0);
   RefreshRates();
   double min=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   double max=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   double step=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP); 
   //double free = AccountFreeMargin()*0.95;
   //double margin = MarketInfo(symbol,MODE_MARGINREQUIRED);
   double _lot=lot<min?min:(lot>max?max:lot);
          _lot=MathRound(_lot/step)*step;
   //if(is_margin && _lot*margin>free)  _lot=0.0;
   ResetLastError();
   if(is_margin && (AccountFreeMarginCheck(Symbol(),direction,_lot)<=0 || GetLastError()==134)) _lot=min;
   return(_lot);
}

そして、トレードが発生した履歴が表示されます(以下のスクリーンショットを参照)。しかし、最低限のロットはもちろん、とても不思議なことにやってくるのですが、それはそれとして。でも、お買い得品はありますよ

それは、このような状況では、非常に奇妙なことは、$ 1の預金のための最小ロット0.2を作る、バリデータです。


当然、お買い得感は皆無でしょうし かも、これは完全に適切なコードで。ちなみに、テストのためにインジケータなどの条件はすべて外しています。Expert Advisor を起動すると同時に、取引が開始されます。

では、バリデーターは何をするのでしょうか?今のところ、プログラマーの心を揺さぶるだけだと思います

バリデータの何かを変えろとは言っていないことに注意してください。単純にテストログを見ればいいんです。そうすれば、どのようなパラメータでテストが行われているのか、またどのような堆積物があるのかを理解することができます。結局のところ、少なくともプリントを使って、コードのどこにエラーがあるのかを確認し、できるだけ早く修正することができるかもしれません。私たちは、1週間ずっと空に向かって指を指して、エラーを特定することだけを試みているわけではありません。私たちは互いに敵対しているわけではないのですね。わかるよ、一緒に何かを稼ごうとしているんだから。

最初のスクリーンショットです。NZDUSDの取引はありませんというメッセージにくっついたんですね。そして、あなたは14ページにわたって、この工場と戦ってきたのです。

しかし、最初のスクリーンショットの主なエラーは、そのようなものではありません。GBPUSDのテストが長すぎることを知らせているものです。テストが長すぎたため、バリデータはテストをタイムアウトさせた。

GBPUSD, M30でコードプロファイラを実行し、3時間取引させる。そして、ボトルネックに目を向け、それを解決する。

 
Maxim Kuznetsov:


---

NZDUSDにストップアウトがあり、注文をクローズした場合、Expert Advisorのロジックはそれを気にせず、まだそれを選択してOrderCloseを送信すると、falseが返されます。こ の驚くべき動作が1 目盛りごとに繰り返され、全体がスローになり、チェックがキャンセルされるのです。しかも、これは最もシンプルなケースでの話です。

取引条件の確認について - 前14ページをご参照ください。

マキシム、あなたはコードを非常に不注意に読んでいます。

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
   gl_lots=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   gl_ask=NormalizeDouble(Ask,_Digits);
   gl_bid=NormalizeDouble(Bid,_Digits);
   gl_comm="test";
//---
   if(AccountFreeMarginCheck(_Symbol,OP_BUY,gl_lots)<=0 || GetLastError()==134) {
      printf("Not enough money for the minimum lot: %.4f",gl_lots); 
      return;
   }
   if(test_ticket[1]<8 && test_ticket[0]==0) {
      test_ticket[0]=OrderSend((StringCompare(_Symbol,"NZDUSD")==0?"NZDUSD":_Symbol),OP_BUY,gl_lots,gl_ask,30,0.0,0.0,gl_comm,33333,0,clrNONE);
      if(test_ticket[0]>0) test_ticket[1]++;
      else if(Fun_Error(GetLastError())==1) return; 
   }   
   if(test_ticket[0]>0)
      if(OrderSelect(test_ticket[0],SELECT_BY_TICKET)) {
         if(OrderCloseTime()==0 && OrderOpenTime()+300<TimeCurrent())
            if(OrderClose(test_ticket[0],OrderLots(),gl_bid,30,clrNONE)) {
               printf("Test order closed, ticket #%d",test_ticket[0]);
               test_ticket[0]=0;
            } else if(Fun_Error(GetLastError())==1) return;
      } else if(Fun_Error(GetLastError())==1) return;
}

マーカーに書いてある条件は、注文がクローズされるとOrderClose()関数が逃げない、これが第一です。そして第二に、NZDUSDに少なくとも1つの注文が開いていれば、バリデータは「取引なし」を返さないでしょう。

アルチョム・トリシキン

...

GBPUSD, M30でコードプロファイラを実行し、3時間取引させる。そして、ボトルネックに目を向け、それを解決する。

よし、アルチョム。試してみます。

 
Andrey Kaunov:

マキシム、あなたは非常に不注意にコードを読んでいます。

マーカーで指定した条件では、OrderClose()関数を逃がさない、これが第一条件です。そして第二に、NZDUSDで少なくとも1つの注文が開かれていれば、バリデータは「取引なし」を返さないでしょう。


正直なところ、曲がったコードのデバッガーを演じ、作者の自信と戦うのはもうこりごりです。指定されたエラーは、自分で見てください

を徭蛍で恬ることは、徭蛍を徭蛍で恬ることであり、徭蛍を徭蛍で恬ることは、徭蛍を徭蛍で恬ることである。Validatorは関係ありません

 
マキシムさん個人にデバッグをお願いしているわけではないんです。コードが曲がっているのは結構だが、バリデーションをパスして いる。問題はまったく違う。
 
Artyom Trishkin:

...

GBPUSD, M30でコードプロファイラを実行し、3時間取引させる。そして、ボトルネックに目を向け、それを解決する。

Artyomさん、コードプロファイラでは ボトルネックは出ていませんね。病的に長い処理もなく、コード全体がスムーズに動きます。

この一連の話の底流にあるのは、こういうことだ。なんやかんやで、ようやくバリデーションに合格しました。コードには全く依存しません(この記事で紹介したように、明らかなエラーがなく正しい場合)。バリデーターがどのように機能するかは、当然ながら制作者しか知らない。2回目でコードを確認し、3回目で確認する。何回か続けて通過することもあれば、まったく通過しないこともある。しかも、入力パラメータを変更したり(大したことない)、並べ替えても何も変わらない行をずらしたり、さらにはコメント(作業ファイルには何ら影響しないはず)を削除したり追加したりするだけです。

一般に、検証の合否は「気分」(ネットワーク内の電圧、ある種のパワーフローなど)にのみ依存します。このように、通常のテスターでは、通常のパラメータでコードがハングアップすることはなく、どのようなペアやTFでも 失敗することはなかったのです。