MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1740

 
Maxim Kuznetsov #:

は、人に指図するものではありません。

データを記憶して作業する必要があります

マキシム そういうときは、何も覚えなくていいんです。直前のクローズドポジションを見るだけなら、もっと安全です。

データの記憶や異常時の復元など、何もする必要がありません。ターミナルを閉じると、位置データは失われます。したがって、暗記するときは、すぐに効果的な復元ができるように考えておく必要があります。

(コメントで注文を記憶することは、信頼できる解決策とは言えない。ブローカー/ディーラーの意志に依存することになる)。

そして面白いのは、とにかくこのデータをどこからか読み込んでくるということです。では、そのまま読めばいいのでは?

 
Sergey Zhukov #:

MT5ではなくMT4用にコンパイラを強制的にコンパイルするには?

#ifdef __MQL4__

#else

#endif
 
Artyom Trishkin #:

マキシム その状態なら、どこにも暗記する必要はないんです。過去のクローズドポジションを見るだけなら、もっと安全です。

データを記憶しておいて、いざという時に復元するようなことはしなくていいのです。ターミナルを閉じると、位置データは失われます。したがって、暗記するときは、すぐに効果的な復元ができるように考えておく必要があります。

(コメントで注文を記憶することは、信頼できる解決策とは言えない。ブローカー/ディーラーの意志に依存することになる)。

そして面白いのは、とにかくこのデータをどこからか読み込んでくるということです。では、そのまま読めばいいのでは?

そして、「なぜOnTimerが数秒に収まらないのか、OnTickが大きく外れてしまうのか」と続きます:-)

初期化時に一度だけ状態を復元する(ファイルやブラウズ履歴・環境から読み込む)、それだけ...最後の注文はその特性とともに変数に格納され、常に既知である。

 
Maxim Kuznetsov #:

というテーマが続き、「なぜOnTimerが数秒に収まらないのか、OnTickが大きく外れるのか」というテーマが続きます :-)

初期化時に一度だけ状態を復元する(ファイルから読み込むか、履歴や環境を調べる)、それで終わりです...最後の命令はその特性とともに変数に格納され、常に知られています

最後のポジションがどのようにクローズされたかを知るためには、それを見つける必要があります。結局、開いている間は、どのように閉じたかを記録し、記憶する方法がないのです。

最後にオープンしたポジションのチケットを保存し、それを使ってどのようにクローズしたかを判断することは可能ですが ...ポジションを操作する場合、ポジションが開いている間は、そのチケットは変更されることがあります。したがって、変更されたチケットを書き換える機能を実装する必要があります。このすべてが、コードを複雑にしている。

私は、最後に閉じたポジションを探すことを提案しただけです。また、EA再起動時の全ポジション検索と、新規クローズ時の1ポジションのみのデータ読み込みを組み合わせています。

結局のところ、このために過去のすべてのポジションをループする必要はなく、最後の1つだけをループする必要があることを、みなさん理解していただきたいと思います。すなわち、ループインデックスの変数1つ、つまり現在の値だけを記憶し、(ヒストリカルオーダーの数が増加したときに)ゼロからではなく、この変数の値から新しいループを開始するのです。そして、この変数の値は、Expert Advisor の起動時と再起動時、および新規ポジションのクローズ時に OnInit() に書き込まれます。つまり、こうすることで、位置データの書き込みや読み出し、ドライブとの連動が不要になるのです。

この方法が最も収益性が高いと思います。

1.ループインデックス
2 の値だけ覚えておけばよい。クローズドオーダーのインデックスに直接アクセスして必要な時にだけデータを取得する
3.読み取り/書き込み機能を作成する必要はありません
4.作業も書くのも速くなりました。

そして、そうですね、すべてのデータを把握する必要があることに同意します。私自身もそうしています。しかし、それはプログラムと自分自身に有益なそれらを知っていることが望ましいです。

 
Ivan Butko #:

情報提供ありがとうございました



Nキャンドル前の履歴で、Close[N]+50*PointとClose[N]-50*Pointという2種類の異なる方向のターゲットが設定されているのですが、時間があれば、修正方法を回答してください。
次に、価格がいずれかのターゲットに到達するという条件があります(if (High[i]>Close[N]+50*Point) or(if (Low[i]<Close[N]-50*Point)
条件を
満たすと、 Close[N] からHigh[i]までの距離がx[high]=High[i]配列に書き込まれます。


そして、Print(x[high]) で確認すると、10個中1〜2個が50未満と表示されます!一方は12個、もう一方は49個です。ただし、厳密には+50*ポイントです。8~9が正解(50以上)、1~2が異常。テスター経由ではありませんが、実際のチャートでExpert Advisor(取引機能なし)を置いていますが、上記のものでは履歴と連動してしまい、誤った結果を表示してしまいます。 値が大きいほど、このようなエラーは発生しにくくなります。スプレッドが邪魔をしているのかと思いきやMT4で履歴にスプレッドはないと思うのですが

解決済みです。

 
OnTimer()にRefreshRates()を追加する必要があるのか、それともデフォルトでタイマーが勝手に更新されるのでしょうか?
 
Ivan Butko #:
OnTimer()にRefreshRates()を追加する必要があるのか、それともデフォルトでタイマーが勝手に更新されるのでしょうか?
それはない
 
Aliaksandr Hryshyn #:
アップデートされない

ありがとうございました。

 
Artyom Trishkin #:

最後のポジションがどのように閉じられたかを知るには、それを見つけなければならない。開いている限り、どのように閉じたかを記録し記憶する方法はない--。

最後に開いたポジションのチケットを保存し、それを使ってどのように閉じたかを判断することは可能ですが ...ポジションを操作する場合、ポジションが開いている間は、そのチケットは変更されることがあります。したがって、変更されたチケットを書き換える機能を実装する必要があります。このすべてが、コードを複雑にしている。

私は、最後に閉じたポジションを探すことを提案しただけです。また、EA再起動時の全ポジション検索と、新規クローズ時の1ポジションのみのデータ読み込みを組み合わせています。

結局のところ、このために過去のすべてのポジションをループする必要はなく、最後の1つだけをループする必要があることを、みなさん理解していただきたいと思います。すなわち、ループインデックスの変数1つ、つまり現在の値だけを記憶し、(ヒストリカルオーダーの数が増加したときに)ゼロからではなく、この変数の値から新しいループを開始するのです。そして、この変数の値は、Expert Advisor の起動時と再起動時、および新規ポジションのクローズ時に OnInit() に書き込まれます。つまり、こうすることで、位置データの書き込みや読み出し、ドライブとの連動が不要になるのです。

この方法が最も収益性が高いと思います。

1.ループインデックス
2 の値だけ覚えておけばよい。クローズドオーダーのインデックスに直接アクセスして必要な時にだけデータを取得する
3.読み取り/書き込み機能を作成する必要はありません
4.作業も書くのも速くなりました。

そして、そうですね、すべてのデータを把握する必要があることに同意します。私自身もそうしています。しかし、それらを知ることは、プログラムのためにも、自分自身のためにも望ましいことです。

ポジションが開いている間は、チケットが変わることに気がつきません。通常、このポジションを開いた最初の注文のチケットと同じである。

最後の1つが閉じられた - シンボルで複数のEAが取引され、さらに手動で取引されている場合はどうなりますか?
 
JRandomTrader #:

ポジションのチケットがオープン中に変更されることに気がつきませんでした。通常、ポジションをオープンした最初の注文のチケットと同じです。

最後に閉じた - しかし、シンボルで複数のEAが取引され、さらに手動で取引されている場合はどうなりますか?

フィルやパーシャルクローズで、チケットは別物。どのチケットがどれから出たものかを判断し、記憶しているものを書き換える必要があります。しかし、どちらのプラットフォームを指しているのかが明確ではありません。どちらも微妙に異なりますが、追跡する必要があることには変わりありません。

このEAに属する最後のクローズドなもの」という意味です。