エラー、バグ、質問 - ページ 480 1...473474475476477478479480481482483484485486487...3185 新しいコメント Валерий 2011.08.08 15:47 #4791 papaklass: 現在、アップデートして、再度試行錯誤中です。ほぼすべての行にプリントを入れました。その結果をご報告します。ストップロスが確定した瞬間の、あなたのインサートを使ったランです。 2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 EURUSDによるロングポジション、ストップロスの決済へ 2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27-----------------Deal #63 sl 1.33328 2011.08.09 00:41:08 Core 1 2011.08.09 00:41:08 Core 1 2011.01.01.14 01:41:27oldDealsTotal=62 newDealsTotal=63 2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27CSampleExpert::Trade 2011年.08.09 00:41:08 Core 1 2011.01.14 01:41:27 order performed sell 0.15 at 1.33328 [#63 sell 0.15 at 1.33328].15 EURUSD at 1.33328] 2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 取引実行 [#63 sell 0.15 EURUSD at 1.33328] 2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 deal #63 sell 0.15 EURUSD at 1.33328 done (based on order #63) 2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27ストップロス 発動 買い 0.15 EURUSD 1.32127 sl: 1.33328 tp: 1.35139 [#63 売り 0.15 EURUSD at 1.33328] 2011.08.09 00:41:08 Core 1 2011.01.13 18:32:00 EURUSDによるロングポジションは、トレーリングを修正することになりました。 Errors, bugs, questions 静的配列 ? static array ? Валерий 2011.08.08 16:00 #4792 明らかに異なる結果は、OnTradeでの処理の違いです。私は取引だけを探しており、彼らが私に興味を持っただけです。一方、あなたは、私が理解しているように、すべてのイベントを処理し、分類し、ここのどこかで何かを台無しにしています。 Aleksey Rodionov 2011.08.09 07:34 #4793 先物のベッティングマーケットもデモということですね?MMVBから本物を取り出した、ロットが合わない。 Rashid Umarov 2011.08.09 07:37 #4794 papaklass: 私は、1時間の有効期限で保留注文を出します。1時間経過後、有効化されていない注文は、注文の有効期限までに決済されます。複数の注文が同時に決済され、決済前にHistoryOrdersTotal()関数がゼロ以外の値を持っていた場合、いくつかの注文を失うことになります。例えば、8件の注文を締め切る前、関数の値は4でしたが、締め切った後、関数の値は10となります。2つのオーダーが失われる。注文がなくなった」とはどういう意味ですか?OnTrade()に来るメッセージは、1つ以上の取引イベントに関する情報を伝える可能性があることを念頭に置く必要があります。また、複数のメッセージを同時に送信した場合、最初のメッセージを処理するときに、すでに履歴キャッシュが変更されている可能性があり、「イベントの喪失感」を感じることがあります。 MetaTrader 5のトレードイベントについての 記事をお読みください。結論 MetaTrader 5取引プラットフォームのすべての操作は非同期であり、取引口座のすべての変更に関するメッセージの送信は互いに独立して行われるため、「1つのリクエスト - 1つの取引イベント」ルールに従って単一のイベントを追跡しようとしないでください。取引イベントの後に何が変わったかを正確に判断したい場合は、ハンドラOnTradeが呼び出されるたびに、すべての取引、ポジション、注文を分析し、イベントが現れる前の状態と比較する必要があります。 Rashid Umarov 2011.08.09 08:23 #4795 papaklass: 注文を閉じる前に、HistoryOrdersTotal()の値が4であることを明確に要求しました。8 つの注文を決済した後、HistoryOrdersTotal() の値は 12 (4 + 8) になるはずですが、10 になっています。ログファイルを添付しましたが、同様の状況を複数回確認することができます。これを取得したExpert Advisorも添付しておきます。自分でやってみれば、すべてが見えてくる。機能を変更してみて、どうなるのか?void OnTrade(){ //--- HistorySelect(dayStart,TimeTradeServer()); Print(" ",__FUNCTION__," : historyOrdersTotal = ",HistoryOrdersTotal()," ",TimeTradeServer()); } Andrei 2011.08.09 10:05 #4796 テスター実行のHTMLレポートがファイルに保存されないことがあるのですが? Alexey Da 2011.08.09 10:19 #4797 zigan: テスター実行のHTMLレポートが、必ずしもファイルに保存されない!より具体的に記述してください。どのような状況下で Andrei 2011.08.09 10:42 #4798 alexvd:より具体的に記述してください。どのような状況下でまれに、20~30回のテスター実行のうち1回程度 - 「結果」タブを開く。XMLレポートの保存をクリックすると、レポートファイルが表示され、すべてOKです。HTMLレポートの保存をクリックすると、ファイルを保存するためのウィンドウがポップアップし、しばらく空のProgressBarでハングアップし、その後ProgressBarがすぐにいっぱいになり、ウィンドウが閉じます...。しかし、レポートファイルは作成されません具体的にどんな時にそうなるのか、パターンを特定することはできません。 Валерий 2011.08.09 13:06 #4799 Rosh:機能を変更してみて、どうなるのか? これではどうしようもないと思います。OnTradeは、原則的にpapaklassの ような仕組みはできません。重要なのは「OnTradeハンドラを呼び出すたびにすべての取引、ポジション、注文を分析し、登場する前の状態と比較する必要が ある」ということです。保留中の注文がある の の例では、履歴の中の注文にのみ適用されます。 注文を失わないために、私ならこのようにコードを変更します。グローバル変数int oldHistoryOrders; を導入し、 Ontradeでは、以下のような感じです。//--------------------------ТОРГОВЫЕ СОБЫТИЯ-------------------------------------------------------------+ void OnTrade(){ //--- Print(__FUNCTION__); HistorySelect(0,TimeCurrent()+1); int newHistoryOrders=HistoryOrdersTotal(); if(oldHistoryOrders==newHistoryOrders) return; Print("oldHistoryOrders=",oldHistoryOrders," newHistoryOrders=",newHistoryOrders); for(int i=oldHistoryOrders;i<newHistoryOrders;i++) Print("Order ",i," #",HistoryOrderGetTicket(i)); oldHistoryOrders=newHistoryOrders; // Print(" ",__FUNCTION__," : historyOrdersTotal = ",newHistoryOrders," ",dayStart); } ファイル: TestHistoryOrders.mq5 11 kb Валерий 2011.08.09 21:00 #4800 papaklass: これは、あなたが説明したように、私がOnTrade()で動作する方法ではありません。添付したコードでは、関数のバグを強調する部分のみを残して、すべてを削除しています。私のEAでは、実質的にループはありません。EAは1ティックで1つのシンボルを扱います。だから、サイクルは必要ないのです。12ティック以内にすべてのシンボルを処理します。 追記:OnTrade()はトレードイベントを知らせてくれます。 そして、どんなイベントが発生したかは、ループのない私の関数で定義されています。 まあいいや、私はOnTrade機能による注文の損失を証明する、はずのあなたの例について言及しただけです。OnTradeはティック単位ではなく非同期で動作するため、1ティックで処理するシンボルの数は気になりません。空注文が一度に大量に失効するので、回避策を講じないとやっていけないんですね。OnTradeが何も見逃していないことを示すために、あなたのコードを変更しました。テスターで動かしても、すべて問題ないようです。OnTradeからプリンターで印刷されたすべての削除された注文の ティッカーがログに存在します。私のバージョンは試されましたか? Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров www.mql5.com Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5 1...473474475476477478479480481482483484485486487...3185 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
現在、アップデートして、再度試行錯誤中です。ほぼすべての行にプリントを入れました。その結果をご報告します。
ストップロスが確定した瞬間の、あなたのインサートを使ったランです。
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 EURUSDによるロングポジション、ストップロスの決済へ2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27-----------------Deal #63 sl 1.33328
2011.08.09 00:41:08 Core 1 2011.08.09 00:41:08 Core 1 2011.01.01.14 01:41:27oldDealsTotal=62 newDealsTotal=63
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27CSampleExpert::Trade
2011年.08.09 00:41:08 Core 1 2011.01.14 01:41:27 order performed sell 0.15 at 1.33328 [#63 sell 0.15 at 1.33328].15 EURUSD at 1.33328]
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 取引実行 [#63 sell 0.15 EURUSD at 1.33328]
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27 deal #63 sell 0.15 EURUSD at 1.33328 done (based on order #63)
2011.08.09 00:41:08 Core 1 2011.01.14 01:41:27ストップロス 発動 買い 0.15 EURUSD 1.32127 sl: 1.33328 tp: 1.35139 [#63 売り 0.15 EURUSD at 1.33328]
2011.08.09 00:41:08 Core 1 2011.01.13 18:32:00 EURUSDによるロングポジションは、トレーリングを修正することになりました。
私は、1時間の有効期限で保留注文を出します。1時間経過後、有効化されていない注文は、注文の有効期限までに決済されます。複数の注文が同時に決済され、決済前にHistoryOrdersTotal()関数がゼロ以外の値を持っていた場合、いくつかの注文を失うことになります。例えば、8件の注文を締め切る前、関数の値は4でしたが、締め切った後、関数の値は10となります。2つのオーダーが失われる。
注文がなくなった」とはどういう意味ですか?OnTrade()に来るメッセージは、1つ以上の取引イベントに関する情報を伝える可能性があることを念頭に置く必要があります。また、複数のメッセージを同時に送信した場合、最初のメッセージを処理するときに、すでに履歴キャッシュが変更されている可能性があり、「イベントの喪失感」を感じることがあります。
MetaTrader 5のトレードイベントについての 記事をお読みください。
結論
MetaTrader 5取引プラットフォームのすべての操作は非同期であり、取引口座のすべての変更に関するメッセージの送信は互いに独立して行われるため、「1つのリクエスト - 1つの取引イベント」ルールに従って単一のイベントを追跡しようとしないでください。取引イベントの後に何が変わったかを正確に判断したい場合は、ハンドラOnTradeが呼び出されるたびに、すべての取引、ポジション、注文を分析し、イベントが現れる前の状態と比較する必要があります。注文を閉じる前に、HistoryOrdersTotal()の値が4であることを明確に要求しました。8 つの注文を決済した後、HistoryOrdersTotal() の値は 12 (4 + 8) になるはずですが、10 になっています。ログファイルを添付しましたが、同様の状況を複数回確認することができます。これを取得したExpert Advisorも添付しておきます。自分でやってみれば、すべてが見えてくる。
機能を変更してみて、どうなるのか?
テスター実行のHTMLレポートが、必ずしもファイルに保存されない!
より具体的に記述してください。どのような状況下で
より具体的に記述してください。どのような状況下で
まれに、20~30回のテスター実行のうち1回程度 - 「結果」タブを開く。
XMLレポートの保存をクリックすると、レポートファイルが表示され、すべてOKです。
HTMLレポートの保存をクリックすると、ファイルを保存するためのウィンドウがポップアップし、しばらく空のProgressBarでハングアップし、その後ProgressBarがすぐにいっぱいになり、ウィンドウが閉じます...。しかし、レポートファイルは作成されません
具体的にどんな時にそうなるのか、パターンを特定することはできません。
機能を変更してみて、どうなるのか?
重要なのは「OnTradeハンドラを呼び出すたびにすべての取引、ポジション、注文を分析し、登場する前の状態と比較する必要が ある」ということです。保留中の注文がある の の例では、履歴の中の注文にのみ適用されます。 注文を失わないために、私ならこのようにコードを変更します。
グローバル変数int oldHistoryOrders; を導入し、 Ontradeでは、以下のような感じです。
これは、あなたが説明したように、私がOnTrade()で動作する方法ではありません。添付したコードでは、関数のバグを強調する部分のみを残して、すべてを削除しています。私のEAでは、実質的にループはありません。EAは1ティックで1つのシンボルを扱います。だから、サイクルは必要ないのです。12ティック以内にすべてのシンボルを処理します。
追記:OnTrade()はトレードイベントを知らせてくれます。 そして、どんなイベントが発生したかは、ループのない私の関数で定義されています。