複数のペアでEAを動作させるには? - ページ 2

 
mittalpa:

どちらのアプローチも良いと思います。

ただ一つ付け加えるとすれば、#2の方法はオーバーヘッドが少ないため、パフォーマンス面でメリットがあります。すべてがメモリ上にあり、ファイル操作よりも明らかに高速です。

3.の利点は、MT4ではできないようなことにファイルデータを使いたい場合です。

また、停電の際、ユーザーの介入なしに相場状況を更新できるEAを構築する必要がある場合、いずれにせよファイルアクセス機能を 構築することになることを考慮してください。

 
cloudbreaker wrote>>

また、停電が発生してもユーザーが操作しなくても相場が更新されるようなEAを作る必要がある場合は、ファイルアクセス機能を作ることになると思います。

私の経験では、複数のペアを取引するEAを構築しようとすると、多くの問題に直面することになります。

1. 各ペアは独自のカスタムロジック、最適化、そしていくつかのペアでは多分別の取引戦略を必要と します。私は、ある特定のペアのために最適化されたEAを書き、それがうまく取引されているポイントにしたことがあります。その後、最初のペアと最も相関のある別のペアで使ってみたところ、2番目のペアでEAを動作させ、最適化するために多くのことを変更しなければならないことに驚きました。それぞれのペアでカスタム設定やインジケータ値、さらには基本ロジックやストラテジーの変更が必要なことがわかりました。私にとっては、いくつかの異なる戦略とロジックの分岐を組み込んだ、非常に柔軟性の高いEAを1つ作成する方がはるかに理にかなっています。そして、各ペアごとに新しい最適な.setファイルを作成するだけの簡単なことです。

2. あなたが作りたいEAはStrategy Testerでバックテストや 最適化ができません。私の経験上、バックテストと最適化は必須です。Strategy Testerを使わなければ発見できなかった、私のEAのパフォーマンスを大幅に向上させる最適化があります。例えば、あるインジケータの設定が、多くの人が最も有用で最適と考える値から大きくかけ離れていて、最適値に近い値を試してみようとは思いもよらなかったようなことがありました。 EAのパラメータがどれだけあるか考えてみてください。それぞれを最適化する必要があり、あるパラメータを最適化するたびに、別のパラメータを変更する必要があるかもしれません。だから、各パラメータを単独で最適化することはできないのです。最適化のゴールは、すべてのパラメータをお互いの関係において可能な限り最適化することです。そのためには、テスターを使って長い時間と多くの労力がかかりますが、自分で一つずつパラメータを変えていくだけでは、これらの最適化を手動で行うことはかなり無理があります。

もう一つ、どのような方法でEAをコーディングするにしても、EAの状態やその他の情報をファイルに保存することはほとんどの場合必須ではありませんし、唯一の選択肢でもありません。最も効率的で簡単な方法は、グローバル変数に状態を保存することです。結局のところ、それがGlobal Variables機能がMTに追加された理由なのです。また、ファイルシステムに保存されたデータを交換するためだけに別のEAを作成し、2つのEA間のデータ交換と相互作用を可能にするという話もありました。これも不要です。複数のEA間でデータ交換や条件分岐ができるのも、グローバル変数の特徴です。 これは、異なるチャート上の複数のEAが、任意のEAのデータにアクセスし、そのデータを使用して、別のEAに変更を及ぼすことができる決定を行うことができます。そのデータは、コンピュータのクラッシュや停電が発生した場合でも、安全で確実です。しかし、EA間でデータを保存、読み込み、交換する過程で、1つまたは2つのファイルを開いているとき、クラッシュや停電で何が起こるでしょうか。データの欠落、データの破損、最悪の場合、ゼロバイトのファイルや全くファイルがない状態になる可能性が非常に高いです。 グローバル変数があれば、このような問題は起こりません。EAの状態は、システムがダウンする1ミリ秒前と全く同じになります。GVの欠点は、文字列を保存できないことですが、それを回避する良い方法がいくつかあります。

例えば、GlobalVariableSet(Symbol() + "LastUptime=" + TimeLocal(), -1); この方法の問題点は、GVの名前の長さに制限があるため、この方法で長い文字列を保存できないことです。もう一つの素晴らしい回避策は、私がいつも使っているグラフィカル・オブジェクトのテキスト・フィールドに文字列を保存することです。注文やGVを扱うのと同じように、文字列を扱うことができるのです。GVとグラフィカル・オブジェクトの合計量を得るためのmql関数があるので、それらをすべてループして、探しているものを見つけることができます(注文をループするのと全く同じ方法です)。

警告:グラフィック・オブジェクトがトレーディング機能を向上させる他のクールな方法について、少し脱線していますが、役に立つ情報かもしれません...

グラフィカルなオブジェクトでできることは、もっとたくさんあります。例えば、私のEAにはオプションでヘッジ機能があります。なぜなら、同じシンボルでヘッジするとき、ポイントは最初の注文が通常のストップロスを超えたら反対の注文を出すことであり、最初の注文は開いたままである必要があるからです。誤解のないように言っておきますが、注文に実際のストップロスを使用できないのは、注文がクローズされ、当然ながらヘッジが全くできなくなるからです。しかし、グラフィック・オブジェクトを使うことで、この機能を向上させ、ユーザーには実際のストップロスと全く同じように見せることができます。その方法は次のとおりです。注文を出すと同時に、価格パラメータをストップロスの価格に設定した水平線オブジェクトを作成します。ライン・オブジェクトの名前は「Order #」 + orderTicket、説明は「StopLoss @ " + SLPrice」とします。線のスタイルをSTYLE_DASHDOTに、色を赤に設定すると、実物と全く同じように見えるストップロス線ができます。これを動作させるコードも簡単です。必要な情報はすべてライン・オブジェクトにすでに格納されています-注文チケット番号とSL価格、これはライン・オブジェクトの値です。そして、現在の価格がラインに達したか、ラインを超えたかをチェックする関数を作成します。このとき、行の名前フィールドに保存されたチケット番号を取得します。そして、同じチケットを持っているオープンオーダーを見つけます。その注文を選択して、それが買い注文か売り注文かを確認し、ロットサイズも取得します。これで、ヘッジ注文を開くのに必要なすべての情報が揃いました。最初の注文とは逆の、同じロットサイズの新しい注文を出します。最後に、ストップロスラインを削除します。この動作を見ると、「ヘッジ」に近づいていることがわかるので、かなりクールです。

もう一つの利点は、注文がうまくいくかもしれないと思ったとき、価格が自分の有利な方向に戻るかもしれないが、もう少し余裕が必要だと思ったとき、SL/Hedgeラインを少し上にドラッグするだけでいいのです。標準のSLとTPのラインでもそれができたらと思いませんか?もし、ストップロスやテイクプロフィットラインが動かせるようになれば、マーケットが本当に動いているときに素早く調整することができるので、素晴らしい新機能になると思います。もちろん、上記の手順でEAでそれを行うことができますし、一つの利点は、ブローカーがあなたのSLやTPを見ることがないことです。一方、コンピュータが停止した場合、サーバー側のSLやTPがないことになります。しかし、同じことがFapTurboのようなロボットにも当てはまります。彼らの「ステルス」方法は、注文に偽のSLとTPの値を入れて、コードから注文を閉じるか、価格が近づいた最後の瞬間に正しいSLとTPの値で注文を変更します。

 
Jacques366:

こんにちは。

私は、私たちはまだリアルタイム処理で動作していることを心に留めておくことを好むので、私はちょうど通信に手を保つためにwhileループまたは待機関数を使用することを忘れてしまった!あなたのEAをEURUSDのようなペアに取り付けると、他のすべてのペアを管理するのに十分な信号を提供します。

EURUSDのようなペアにEAを取り付けると、他のすべてのペアを管理するために十分な信号を提供し、ティックは非常に頻繁にあります。分単位の問題ではなく、秒単位の問題です(2分間ループを走らせるのは、私には本当にクレイジーに聞こえます)。それは秒の問題ではない場合、ちょうど理由を考えるか、別のブローカーで参照してください。

もし、eurusdにEAをアタッチする以上のものが必要なら、各通貨にアタッチしたEAのインスタンスを別に走らせることも考えてみてください。申し訳ありませんが、私は「あるいはシステムを見直す」と考える傾向があります。

ちょっと唐突な投稿と感じられたら申し訳ありません。私の見解をお伝えしたかったのです。

がんばってください。

私はプログラマーとしては素人なので、議論のための「もしも」のシナリオとお考えください。


ループ内に生産的なものが何もない状態で延々とWhileループを作るのは悪いプログラミングだと理解していますし、それによってEAの残りの部分を実行できなくなるのであれば、EAの本体を含む延々とWhileループを作ったらどうでしょうか? 私はMQL4プログラミングを十分に理解していないので、あなたの「通信の手を離さない」というコメントを完全に理解することはできません。 スタンドアローンスクリプトで取引注文を 出す場合、EAが無限ループで実行され続けると通信の問題が発生するのでしょうか?


EAの実行をEURUSDのティックに依存すると長い遅延が発生するため、無限ループを使用し、スタンドアロンスクリプトで取引注文を出すというアイデアを検討し続けています。 例えば、今日のグリニッジ標準時の0700から0800の間、最長の待ち時間は31秒でしたが、ニューヨークセッションの終わり近くでは、受信ティックのために最大で2分かかることがあります。


EAの本体を無限ループにすれば、取引しているすべての通貨の更新頻度を簡単に制御でき、遅延を犠牲にすることはありません。 実際、1秒間に50回EAを通過させるのは気が遠くなるようであれば、ループ内に100-250ミリ秒のsleepステートメントを入れて少し減速させる必要があるかもしれません。


すべてのフィードバックに感謝します。

 
vangrosh wrote>>

警告:ここで、グラフィックオブジェクトがトレーディング機能を向上させる他のクールな方法について、少し兎道を行くことになります...少し話がそれますが、役に立つ情報かもしれません...

 
vangrosh:

私の経験では、複数のペアを取引するEAを作ろうとすると、かなり苦労することになります。

これは本当にクールなもので、必ずや私のEAにそのほとんどを導入するつもりです。

すでに決めていることがいくつかあります。
1.1.1つのEAに1組だけ。
2.2.注文は一組に一回のみ。(これは後で変更されるかもしれませんが、私は十分に熟練するまでこれを維持するつもりです)。

あなたの貴重な経験を共有していただき、ありがとうございます。

パンカジ
 

このグラフは、2009年4月29日のEURUSDのティック間の時間間隔を表しています。このデータがどのタイムゾーンを表して いるかはわかりません。ティックデータはGain Capitalからダウンロードしたものです。

ご覧のように、日中、ティック間の時間間隔が頻繁に1分を超え、時には2分を超える時間帯があります。



 
vangrosh:

それなら、それぞれのペアに最適な.setファイルを新たに作成すればいいだけのことです。

vangrosh: どうやって.setファイルを作って使う んですか?その種のファイルについてのリファレンスが見つからなかったんだ。

 
cloudbreaker wrote>>

また、停電から復旧するEAを構築する場合、ユーザーの介入なしに市場の状況などを更新する必要がある場合、いずれにせよファイルアクセス機能を構築することになることを考慮してください。

こちら(https://book.mql4.com/special/index)をご覧ください。

複雑なプログラムの一般的な特徴


多通貨のEAを作りたいならこの方法。

 
StraightTrader:

こちらもぜひご覧ください: https://book.mql4.com/special/index

複雑なプログラムの一般的な特徴


多通貨EAを作成したい場合の方法です。

参考にしていただきありがとうございます。

 
FXtrader2008 wrote>>

このグラフは、2009年4月29日のEURUSDのティック間の時間間隔を表しています。このデータがどのタイムゾーンを表しているかはわかりません。ティックデータはGain Capitalからダウンロードしたものです。

ご覧のように、ティック間の時間間隔が1分を頻繁に超え、時には2分を超える時間帯が日中にいくつかあります。

グラフをありがとうございます。念のため、他の通貨のグラフと比較してみるといいかもしれません。(例えば4つのペアのグラフを簡単に提示してくれるとありがたいです。)

私がEAを作り始めたときに気づいたのですが、ユーロドルでは1~2分ティックが出ないと、他の通貨でも同じようなことが起こります。その時はたまたまだったのかもしれませんし、私の思い込みが悪かったのかもしれませんが、この考えを持ち続けて、私のEAはもう何ヶ月も問題なく動いています。このように、ロジックの欠如を経験で補い、EAを稼働させ続けています。もし問題に遭遇していたら、あなたの解決策、つまり2つの実行の間に遅延を設けるだけでEAを起動し続けるというあなたのアイデアを導入していたでしょう。論理的には、私の知る限り、そのようにすべきなのですが、ブローカーがどのようにティックを生成しているのか知らないので、これ以上は難しいのです。

また、プログラム内のシステムに合わせてコーディングするのが「普通」であり「良い」ことです。

ですから、多通貨を扱う場合、通常はすべてのティックを提供するチャネルにEAをアタッチすることができるはずです。それはシステムロジックの欠落であり、何らかの方法で対処しなければなりません。

掲示板