初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 984 1...977978979980981982983984985986987988989990991...1503 新しいコメント Aleksey Vyazmikin 2019.01.22 05:48 #9831 Ihor Herasko: しかし、実際はどうでしょう。スリープしても、インジケーターのデータの再計算には影響しないはずです。バッファの充填がおかしい。もしかしたら、再現性のあるコードがあるのでは?インジケータはオーダーメイドで書きました。野暮ったいOOPで、よくわかりません :( この問題には一晩中かかりましたが、テスターと実アカウントの 乖離の原因はわかりましたので、寝たら秘密のロジックをいくつか削除してレビュー用に投稿するかもしれません。 Maxim Dmitrievsky 2019.01.22 07:52 #9832 Aleksey Vyazmikin:問題が発生しました。インジケータベースのEAは実際の口座では正常に動作しますが、テスターではOHLCによるティック生成モードと すべてのティックによるティック生成モードの両方で、結果は同じです。エラーの結果は、ゼロバーでインジケータのバッファが空になります(インジケータの計算に使用される上位TFに新しいバーがある場合のみ)。しかし、Expert AdvisorにSleepを追加することで、なんとか指標を計算させることができました。 しかし、ティックの生成モードによって、このSleepが異なることがわかりました。すべてのティックからの生成にはSleep(15000)で十分で、OHLCにはSleep(30000)が必要なのです。 というのも、論理的に考えて、ティック生成のモードによって異なる遅延時間がモデル化されていることがわかったからです。 開発者の皆さん、インジケータの状況を説明してください。私自身、原因が何なのか理解できません。 PMでインジケータとExpert Advisorを渡す用意があるが、誰に渡すか教えてくれ。価格を配列にコピーする場合、履歴があるかどうか、価格が変更されていないかどうかをチェックする必要があります。そのためには、TF用の履歴があるかどうかを確認し、なければ再度コピーを試み、ループ内に読み込まれるのを待つ必要があります。 これはプログラマーの腕の見せ所です。 スリップは正常ではありません User_mt5 2019.01.22 13:07 #9833 void OnChartEvent( const int id, // идентификатор события const long& lparam, // параметр события типа long const double& dparam,// параметр события типа double const string& sparam // параметр события типа string ) { Print(My_Name, " --- ", id, " lparam = ", lparam, " dparam = ", dparam, " sparam = ", sparam, " ChartID() = ", ChartID() ); // <<|+|+|+<< // } 説明してください... キーを押すと、イベントID=0が表示されます。これは何度でも繰り返せます。スペースバーが押されていない限り、結果は同じです。 スペースバーを押した=イベントID=0を取得。それ以降は、キーボードで操作しても何のイベントも発生しません。 呆然とした状態から抜け出すために、マウスボタンを押すと=イベントID=4が表示される。その後、再びキーボードをクリックすればいい=クリックするごとにイベントが発生する。スペースキーが押されていない限り=同じ結果になります。 質問:私は何かを理解していない愚か者なのでしょうか、それともこんなはずではなかったのでしょうか?リンクを貼ってください。 fxsaber 2019.01.22 13:39 #9834 Nikita Chernyshov:こんにちは、同僚たち。 質問:mql4で、ポジション数を 計算するためには、次のような関数を書けばよいのです。 mql5ではどのように実装されているのですか?マジックナンバーやタイプ別にポジションを計算するにはどうしたらいいですか?MQL4-functionの前に以下の行を追加します。 #include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006 で、MT5で動作します。 Aleksey Vyazmikin 2019.01.22 14:10 #9835 Maxim Dmitrievsky:インジケーターの場合、タイムスケールはまだ準備ができていない可能性があり、つまり価格を一度に配列にコピーすることはできません。そのためには、TF用の履歴があるかどうかを確認し、なければ再度コピーを試み、ループ内に読み込まれるのを待つ必要があります。 これはプログラマが知らないと手も足も出ない。 あながち間違いでもないテスターではどうなっているのでしょうか?本番とテスターのどちらに問題があるのか、履歴がないのは理解できますが...。しかし、このテストはどのようなものであるべきなのでしょうか。 開発者は私のメッセージを無視している、残念だ。 Maxim Dmitrievsky 2019.01.22 14:45 #9836 Aleksey Vyazmikin:テスターではどうなっているのでしょうか?本番やテスターでの問題であれば、そこに履歴が残らないのは理解できますが......。しかし、このテストはどのようなものであるべきなのでしょうか。開発者は私のメッセージを無視している、残念だ。価格がコピーされているかどうかをチェックし、もしCopycloseなどが-1を返したら、コピーされていない。 Aleksey Vyazmikin 2019.01.22 15:46 #9837 Maxim Dmitrievsky:価格がコピーされているかどうかをチェックし、もしCopycloseなどが-1を返したら、コピーされていない。インジケータは新しいバーの出現時に一度だけ計算されますが、私の理解が正しければ、このように実装されています。 //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { static int counted_bars=0; if(rates_total==prev_calculated) return(rates_total); も簡単なプリントで確認できます。 そのため、計算する価格がないと仮定すれば、インジケータは 1回計算 され、バッファは満たされないままですが、そうではなく、EAにスリープを追加して待てば満たされる、という状況になっています。もしかしたら、インジケータの計算が遅くて、テスターがそれを待っていないだけかもしれませんよ?でも、どうやって確認するのでしょうか? Maxim Dmitrievsky 2019.01.22 15:53 #9838 Aleksey Vyazmikin:このインジケータは、新しいバーが表示されたときに1回計算されますが、これは、私の理解が正しければ、このように実装されています。 ということも、簡単なプリントで確認することができます。 そのため、計算する価格がないと仮定すれば、インジケータは 一度計算 され、バッファは満たされないままですが、そうではなく、EAにスリープを追加して待っていれば満たされる、という状況になっています。もしかしたら、インジケータの計算が遅くて、テスターがそれを待っていないだけかもしれませんよ?でも、どうやって確認するのですか?それなら時間制にすべきかもしれない Aleksey Vyazmikin 2019.01.22 16:30 #9839 Maxim Dmitrievsky:それならタイマーを使ったほうがいいのでは?はい、EAにタイマーがあると、テストはタイマーなしより少し進みますが、スリープより 悪く、タイマーはスリープと本質的に同じです。このインジケータは、他の2つのインジケータのデータを使用して計算されており、コードは他のインジケータの計算されたバーの数を要求しています。 //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int CChannel::BarsCalculated(void) { int upchbars=BarsCalculated(m_upch); int dnchbars=BarsCalculated(m_dnch); if(upchbars<=dnchbars) return(upchbars); return(dnchbars); } と予想される算出バー数 int barsch=(InpChPeriod==PERIOD_CURRENT?rates_total:Bars(_Symbol,InpChPeriod)); この2つの値が一致しない場合、バッファは満たされない。 if(!channel.CreateChannel() || barsch<=0 || barsch!=channel.BarsCalculated() || channel.FillChBuffers(rates_total,calculated,time)==0) { for(;counted_bars<rates_total;counted_bars++) { ZigzagBuffer[counted_bars]=0.0; ZigzagStepBuffer[counted_bars]=0.0; UpChBuffer[counted_bars]=0.0; DnChBuffer[counted_bars]=0.0; InfoZigzagBuffer[counted_bars]=0.0; InfoUpChBuffer[counted_bars]=0.0; InfoDnChBuffer[counted_bars]=0.0; InfoDirectBuffer[counted_bars]=0.0; InfoBegPriceBuffer[counted_bars]=0.0; InfoEndPriceBuffer[counted_bars]=0.0; InfoBegTimeBuffer[counted_bars]=0.0; InfoEndTimeBuffer[counted_bars]=0.0; InfoStartPriceBuffer[counted_bars]=0.0; InfoStartTimeBuffer[counted_bars]=0.0; InfoZigzagTotal[counted_bars]=InfoZigzagTotal[counted_bars-1]; } if(InpInfEnd) CopyInfoBuffers(rates_total-1,(int)InfoZigzagTotal[rates_total-1]); return(calculated); } 私が正しく理解していれば、指標は1つのスレッドで実行され、それらの優先順位はそれらの作成時間によって分配されます。つまり、私がEAからアドレスした指標はより高い優先順位を持ち、最初にその計算を実行し、その後、(バッファデータに基づいて)計算を実行すべき指標にスレッドを渡すことが判明しています。 プリントでは、十分な大きさのSleepを設定すると、インジケータで再計算が行われることがわかります(まだ方法は理解していませんが)なぜ13秒後だけなのでしょうか? 2019.01.22 19:50:16.992 2019.01.21 23:45:00 barsch=6275 2019.01.22 19:50:16.992 2019.01.21 23:45:00 BarsCalculated=6274 2019.01.22 19:50:16.993 2019.01.21 23:45:13 barsch=6275 2019.01.22 19:50:16.993 2019.01.21 23:45:13 BarsCalculated=6275 インジケーターにタイマーはありません。 また、正しい計算をするためにはどうしたらよいでしょうか。バッファの値を待つ前にEAでwhileを使おうとしても、役に立ちません - ハングします。 削除済み 2019.01.22 16:56 #9840 こんにちは、私は自分のEAにステップ付きトレーリングストップを実装したいと思いました。KodobaseとMacd Sampleには、テンプレート以外のものは見つかりませんでした。他の選択肢もあるのでは? 1...977978979980981982983984985986987988989990991...1503 新しいコメント 理由: キャンセル 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
しかし、実際はどうでしょう。スリープしても、インジケーターのデータの再計算には影響しないはずです。バッファの充填がおかしい。もしかしたら、再現性のあるコードがあるのでは?インジケータはオーダーメイドで書きました。野暮ったいOOPで、よくわかりません :(
この問題には一晩中かかりましたが、テスターと実アカウントの 乖離の原因はわかりましたので、寝たら秘密のロジックをいくつか削除してレビュー用に投稿するかもしれません。
問題が発生しました。インジケータベースのEAは実際の口座では正常に動作しますが、テスターではOHLCによるティック生成モードと すべてのティックによるティック生成モードの両方で、結果は同じです。エラーの結果は、ゼロバーでインジケータのバッファが空になります(インジケータの計算に使用される上位TFに新しいバーがある場合のみ)。しかし、Expert AdvisorにSleepを追加することで、なんとか指標を計算させることができました。 しかし、ティックの生成モードによって、このSleepが異なることがわかりました。すべてのティックからの生成にはSleep(15000)で十分で、OHLCにはSleep(30000)が必要なのです。
というのも、論理的に考えて、ティック生成のモードによって異なる遅延時間がモデル化されていることがわかったからです。
開発者の皆さん、インジケータの状況を説明してください。私自身、原因が何なのか理解できません。
PMでインジケータとExpert Advisorを渡す用意があるが、誰に渡すか教えてくれ。
価格を配列にコピーする場合、履歴があるかどうか、価格が変更されていないかどうかをチェックする必要があります。そのためには、TF用の履歴があるかどうかを確認し、なければ再度コピーを試み、ループ内に読み込まれるのを待つ必要があります。
これはプログラマーの腕の見せ所です。
スリップは正常ではありません説明してください...
キーを押すと、イベントID=0が表示されます。これは何度でも繰り返せます。スペースバーが押されていない限り、結果は同じです。
スペースバーを押した=イベントID=0を取得。それ以降は、キーボードで操作しても何のイベントも発生しません。
呆然とした状態から抜け出すために、マウスボタンを押すと=イベントID=4が表示される。その後、再びキーボードをクリックすればいい=クリックするごとにイベントが発生する。スペースキーが押されていない限り=同じ結果になります。
質問:私は何かを理解していない愚か者なのでしょうか、それともこんなはずではなかったのでしょうか?リンクを貼ってください。
こんにちは、同僚たち。
質問:mql4で、ポジション数を 計算するためには、次のような関数を書けばよいのです。
mql5ではどのように実装されているのですか?マジックナンバーやタイプ別にポジションを計算するにはどうしたらいいですか?
MQL4-functionの前に以下の行を追加します。
で、MT5で動作します。
インジケーターの場合、タイムスケールはまだ準備ができていない可能性があり、つまり価格を一度に配列にコピーすることはできません。そのためには、TF用の履歴があるかどうかを確認し、なければ再度コピーを試み、ループ内に読み込まれるのを待つ必要があります。
これはプログラマが知らないと手も足も出ない。
あながち間違いでもないテスターではどうなっているのでしょうか?本番とテスターのどちらに問題があるのか、履歴がないのは理解できますが...。しかし、このテストはどのようなものであるべきなのでしょうか。
開発者は私のメッセージを無視している、残念だ。
テスターではどうなっているのでしょうか?本番やテスターでの問題であれば、そこに履歴が残らないのは理解できますが......。しかし、このテストはどのようなものであるべきなのでしょうか。
開発者は私のメッセージを無視している、残念だ。
価格がコピーされているかどうかをチェックし、もしCopycloseなどが-1を返したら、コピーされていない。
価格がコピーされているかどうかをチェックし、もしCopycloseなどが-1を返したら、コピーされていない。
インジケータは新しいバーの出現時に一度だけ計算されますが、私の理解が正しければ、このように実装されています。
も簡単なプリントで確認できます。
そのため、計算する価格がないと仮定すれば、インジケータは 1回計算 され、バッファは満たされないままですが、そうではなく、EAにスリープを追加して待てば満たされる、という状況になっています。もしかしたら、インジケータの計算が遅くて、テスターがそれを待っていないだけかもしれませんよ?でも、どうやって確認するのでしょうか?
このインジケータは、新しいバーが表示されたときに1回計算されますが、これは、私の理解が正しければ、このように実装されています。
ということも、簡単なプリントで確認することができます。
そのため、計算する価格がないと仮定すれば、インジケータは 一度計算 され、バッファは満たされないままですが、そうではなく、EAにスリープを追加して待っていれば満たされる、という状況になっています。もしかしたら、インジケータの計算が遅くて、テスターがそれを待っていないだけかもしれませんよ?でも、どうやって確認するのですか?
それなら時間制にすべきかもしれない
それならタイマーを使ったほうがいいのでは?
はい、EAにタイマーがあると、テストはタイマーなしより少し進みますが、スリープより 悪く、タイマーはスリープと本質的に同じです。
このインジケータは、他の2つのインジケータのデータを使用して計算されており、コードは他のインジケータの計算されたバーの数を要求しています。
と予想される算出バー数
この2つの値が一致しない場合、バッファは満たされない。
私が正しく理解していれば、指標は1つのスレッドで実行され、それらの優先順位はそれらの作成時間によって分配されます。つまり、私がEAからアドレスした指標はより高い優先順位を持ち、最初にその計算を実行し、その後、(バッファデータに基づいて)計算を実行すべき指標にスレッドを渡すことが判明しています。
プリントでは、十分な大きさのSleepを設定すると、インジケータで再計算が行われることがわかります(まだ方法は理解していませんが)なぜ13秒後だけなのでしょうか?
インジケーターにタイマーはありません。
また、正しい計算をするためにはどうしたらよいでしょうか。バッファの値を待つ前にEAでwhileを使おうとしても、役に立ちません - ハングします。