[ARCHIVE]フォーラムを乱立させないために、どんなルーキーの質問でも。プロフェッショナルの皆さん、通り過ぎないでください。あなたなしではどこにも行けない - 5. - ページ 396

 
rajak:

皆さん、こんにちは。

コンパイルしてもex4ファイルが表示されず、metalangも表示されないのですが、何が問題なのかご存知の方がいらっしゃいましたら、アドバイスをお願いします。どうしたらいいのでしょうか。2、3日前まではすべてうまくいっていたのですが。

意図的にエラーを導入しても、コンパイルはエラーなく実行されます。

Windows7の場合は、仮想フォルダ内を検索してください。

c:\UsersYour folderAppDataLocal﹑Program Files (x86)﹑MT4 folder ﹑experts

自分のフォルダとMT4のフォルダの代わりに、実際のディレクトリを代入してください。

 
lottamer:

以前、親切な方から、「最後のクローズポジションのリターンチケット」という関数を、「最後の2つのクローズポジションのリターンチケット」という関数にする方法を教えていただきました。

また、「3つの閉じた位置のチケット」という機能が必要なとき、(類似性と選択方式によって)実装できなかった

ヘルプをお願いします。

2つのコピーがあるのがわかると思いますが、2つ目のコピーは少し変更されています。

3枚目のチケットにこのバリアントがあるのですが...なぜかまた1位のチケットが返される...。


交換

if(OrderTicket()==A && (OrderTicket()==B) )continue;

まで

if(OrderTicket()==A || (OrderTicket()==B) )continue;

ただ、1つの関数から3つの値を返すというのは、何をやっているのかよくわかりません。

 
Roger:


交換

1つの関数から3つの値を返すというのは、何をやっているのかが不明です



ポイントは、最後のN個のポジションの結果を計算することで、そのために私は彼らのチケットを呼び出す、そして、あとはテクニックの問題だ

fLastClosetPoz();
     OrderSelect( Ticket1,SELECT_BY_TICKET); X=OrderProfit(); SL1=OrderType(); TM1=OrderOpenTime();      Print (Ticket1); Print (SL1,"_",X); //ПОСЛЕДНИЙ 
     OrderSelect( Ticket2,SELECT_BY_TICKET); Y=OrderProfit(); SL2=OrderType(); TM2=OrderOpenTime();      Print (Ticket2); Print (SL2,"_",Y); //ПРЕДпоследний
     OrderSelect( Ticket3,SELECT_BY_TICKET); Z=OrderProfit(); SL3=OrderType(); TM3=OrderOpenTime();      Print (Ticket3); Print (SL3,"_",Z); //ПРЕД-ПРЕДпоследний
 
Roger:


に置き換えてください。

まで


うまくいった!正直、ORをANDに代えるという発想はあったのだが・・・・。

ありがとうございます!ロジックは理解できましたが、閉じたものを15個数えるには、コードを風船サイズに膨らませなければなりませんね。

これを1つのループにまとめ、必要な取引数Nのパラメータを代入するだけでよいのでしょうか?

 
Zhunko:

1.やめたほうがいい彼のアルゴリズムに感心したことまで表現しています。それが「HENRYFIX」です。当時は別のあだ名があった。

スクリプト名の接頭辞は、私たちのニックネームの最初の文字です。

===============

2.ドミトリー、何があっても、公開されない秘密の問題を、秘密のアルゴリズムで解いてくれたことを心から嬉しく思います。

3.すべてがとても神秘的に見えました。自慢してくれてありがとう。あなたは間違いなく、このフォーラムで、いや、全宇宙で最もクールなプログラマーです。

1.そうそう!自分のコード、もしくは仲間のコードだとわかった後。アバルデ、が一番めちゃくちゃで恥ずかしかったのですが、今はすぐに立派になりましたね。

2.プログラマーとして知っていること、できること、知らないこと、わからないことで--なんとか対処していこうと。

3.タスクは絶対に秘密ではなく、絶対に明確であり、ここでオープンに定義されています。理解できる人は皆、問題なく一度に理解した。それは、何か秘密の、魔法のような方法ではなく、通常の標準的で明白な(そして世界的に知られている)方法によって解決されました。ここで自慢しているわけではなく、あなたに対して、奇跡的に、笑っているのです。 このことを理解し、悟ることができないのは、あなたの誇大妄想だけです。

 
Integer:

1.そうそう!自分のコード、もしくは仲間のコードと判明した後。アバルデス、が一番クソで恥ずかしかったのですが、今はすぐに立派になりましたね。

2.プログラマーとして知っていること、できること、知らないこと、わからないことで--なんとか対処していこうと。

3.この課題は、秘密でもなんでもなく、絶対的に明確であり、ここでオープンに定義されているのです。理解できる人は皆、問題なく一度に理解した。それは、何か秘密の、魔法のような方法ではなく、通常の標準的で明白な(そして世界的に知られている)方法によって解決されました。ここで自慢しているわけではなく、あなたに対して、奇跡的に、笑っているのです。 それを理解し、悟ることができないのは、あなたの誇大妄想だけです。




お前ら、他所で揉んでろよ!みんな現実的な問題を解決してるのに、お前らは感情論でスレッドを汚している。
 
lottamer:


お前らよそでやれよ!みんな現実的な問題を解決してるんだよ!お前らは感情でこのスレを汚して いるんだ


なぜこのようなことを書いているのですか?淳子を連れて行き、こう書いてください。彼はここに来て4日目ですが、私たちが話していることを理解できません。
 

もちろん、どんな議論にも限界はある。そうでなければ、すでに合理性の境界を越えている可能性があります。

両方の立場が述べられた後、当事者は同意することもしないこともあります。- それは彼らの権利です。たとえ人が間違っていても。誰にでも間違う権利はあるのです。

今回のように公開討論であれば、見ている人はそれぞれの言い分を理解し、問題に対するコンセンサスの有無にかかわらず、誰もが自分なりの解決策(あるいはその両方)を選択する機会を持つことができます。

しかし、(課題、問題、事件ではなく)個人への非難や訴えに転じることは、すでに自分の信用を落とすことになるのです。人を侮辱したことに対して)不必要なことであり、非難されるべきことである。


論点や解決方法はとっくに整理されているのだから、この問題で立ち止まって、双方が訴え合うのがいいのではないか。

どうやら、討論者がプログラム上の問題を解決するプロだとしたら、討論は初心者ということになりそうだ。このスレッドのトピックから外れているわけではなく、専門的なアドバイスができるようになっています。このアドバイスが聞き入れられるといいですね。

 
Integer:

1.そうそう!自分のコード、もしくは仲間のコードと判明した後。アバルデス、が一番めちゃくちゃで恥ずかしかったが、今はすぐに賞賛の声が上がる。

2.プログラマーとして知っていること、できること、知らないこと、わからないことで--なんとか対処していこうと。

3.タスクは絶対に秘密ではなく、絶対に明確であり、ここでオープンに定義されています。理解できる人は皆、問題なく一度に理解した。それは、何か秘密の、魔法のような方法ではなく、通常の標準的で明白な(そして世界的に知られている)方法によって解決されました。ここで自慢しているわけではなく、あなたに対して、奇跡的に、笑っているのです。このことを理解し、悟ることができないのは、あなたの誇大妄想だけです。

1.コードとアルゴリズムの違いをご存知ですか?しかも、このアルゴリズムは、チャート・ウィンドウを開くこととは何の関係もない。もちろん、コードも修正しました。チャートが開く場所は事実上変わっていない。当時はそれ以外に方法がなかったのです。DLLでは別の方法でやりました。より信頼性の高いものとなっています。

2.最高でしたね。あなたは最高です!

3:

FAQ:

1) 問題点:すべてのスクリプト(EA)は、他のすべてのスクリプトの存在を認識しなければならない。

2) 問題点 : 障害が発生した場合、障害が発生した方のグローバルが占有されずにハングアップし、キューがスタックしてしまう。

3) 解決策:

各エクスポは、名前-共通接頭辞+ウィンドウハンドル+シンボルで1つのグロバルカを構成します。グロバルカの値は、その機器の最後のティックの時間です。独自のハンドルを持つ2つの共通グローバル(作業後、それに独自のハンドルを書き込むか、それが最も古い場合、それをクリアします)。

キューは昇順に並べられ(ハンドル)、最も上位のものは2番目のグロバールをゼロに設定する

各Expで、シンボル/ハンドル/最終アクセス時刻/最終ティック時刻の3つの配列(構造体がないため)を作成します。

すべてのEXPは、すべてのEXPの(最終アクセス時刻/最終ティック時刻)を記録し、それらが異なるとすぐに(EXPの1つが故障)、故障したEXPの両方のグローバルが削除され、それは非アクティブとみなされます。

キューが復元される

これは、実際には、最もアクティブなチャート(頻繁なティック)に立つEAによって行われるでしょう。

が正常に初期化された場合、各Expoはそれ自身の後始末をします。

max skip - one tick.

ZS.そして一般的には、1つの多通貨を行う方が良い

これは、ラスタムのテレパシー能力のおかげなんですね。それは、仮説の問題であり、仮説の解決策なのです。それがあなたの問題とどう関係するのでしょうか?何も言ってくれないんですね。詮索せざるを得なかった。その答えは、建設的な言葉の代わりに冒涜的な言葉しかなく、あなたはそれを提案し続けるが、実行はしないのです。

2008年にも同じようなチャレンジがありました。秘密は、一部のように、しません。どのような問題で、どのように解決するのか、なぜこのような方法で解決すると失敗すると思うのか、具体的な例を挙げて説明します。

============================

問題の元データです。

1.このタスクには、複数の同じループを持つエキスパートが存在する。つまり、完全に独立したスレッドです。

2.8つのグループに分けられた係数のデータベースがあり、一部の専門家がアクセスしている。DBサイズは2Gbから。

3.DBは時々補充されます。2時間の倍数周期で補充されます。処理時間は時間帯の倍数に依存します。時間は5分から45分まで、時間帯の倍率やCPUの能力によって変化します。

タスク

データベースの補完には多くの時間がかかるので、1人の専門家が補完を担当するのが望ましい。そうでないと、終了を待てないかもしれません。

2.データベースの更新中は、アクセスを禁止する必要がある。係数の更新が大幅に遅くならないように、専門家が作業するグループに分かれて行う。

現在更新されている係数を扱う専門家は、古い係数で作業してください。

更新期間中に特定の係数群に切り替わった専門家は、単一の係数で作業し、そのことを知らせること。アップデートが終わったら、新しい係数に切り替わるはずです。ポイント3も同様です。

その時の解決策。

1.エキスパート識別子のインデックスからなる共通のキューが作成される。

2.データベースにアクセスする専門家の識別子とそのインデックスからなるキューが作成される。

両キューは共通のリソースです。キューへのアクセスは、1つの同期オブジェクトによって同期される。

2番目のキューの最初のエキスパートは、データベースの更新を担当する。

5.さらに、ほぼRustamの説明通りです。DLLでの実装のため、少し簡単になっています。

識別子はスルーインデックスである。Expert Advisor を削除すると、その識別子はキューから削除されます。再インデックス化は行われない。残った専門家はインデックスを残す。

新しいエキスパートを追加する際、最後のエキスパートのインデックスがその番号と一致しない場合、最初に空いている古いインデックスが割り当てられます。そうでない場合は、新しいインデックスが割り当てられる。

ディスクリプターやチャート機器へのバインディングは必要ありません。また、アンロードの失敗を記録しておく必要もありません。失敗したことは一度もない。仮にそうなったとしても、それは災害ではありません。EAでは、旧来の比率で作業を続けることになる。次の更新までに、更新カウンターコントローラは更新がないことを検知し、先頭のEAのIDを2番目のキューから削除する。次の専門家がマスターの使命を引き継ぐことになる。Expert Advisor がデータベース接続モードになると、同じコントローラが同じことをします。つまり、2番目のキューに入力するのです。つまり、係数の値が重要でないM1に従事している専門家だけが影響を受けることになる。

しかし、Expert Advisorが互いに拘束され、Expert Advisorがデータベースにデータを供給するという特殊な作業を行うため、信頼性に欠けるため、このソリューションは強く嫌われました。当時は、いろいろなことを知らないし、どうしたらいいのかわからなかった。1年後にやり直しました。

解決策2.

1.データベースは別スレッドで管理され、そこではタイマーで自己補充が行われる。

2.補充時のデータベースへのアクセスは、同期オブジェクトによって保護されます。

もっとシンプルになったんです。キューを使わずにでも、私もあまり好きではありませんでした。補充前にデータベースから引用符スワップのスクリプトが呼び出され、メモリがオーバーフローすることがありました。そのため、MT4がかなり遅くなりました。当時、MT4は2GBのメモリで動作していました。現在は4GBで動作しています。

解決策3.

1.DBは別アプリケーションです。つまり、MT4から独立した専用のメモリを 持つ別のプロセスです。

2.DBが自己補充している。

データ交換はマッピングによって行われる。データのやり取りやデータベースの補充のスピードが上がりました。以前はすべてディスクから読み取っていた。そうでなければできないことでした。МТ4のワーキングメモリは非常に限られています。

4.履歴はDBアプリケーションからリモートでMT4が汲み上げており、そこで必要に応じてキックします。MT4のあらゆる障害 - そのアンロードとその後のロード。

5.ポイント4は、現在のMT4ディレクトリにシンボリックリンクを作成することで行います。つまり、現在のMT4の完全なコピーです。履歴は、動作中のMT4アップロードを待つことなく、MT4ディレクトリに直接オンザフライで更新されます。

6.クリティカルセクションは1つのプロセスに対してのみ動作するため、データベースが更新される瞬間のアクセスをmutexで同期させる。

========================

だから、ドミトリー、あなたのタスクを知らないので、キューを整理してExpert Advisorのスレッドを独立させることなく解決できるかもしれないと思うかもしれません。信頼性を高め、全体のパフォーマンスを向上させることができます。もう何ページにもわたって(スレッドの独立性)語っています。

 

すみません。それに対する回答はありません。

Integer:

アトミックアクセス単位で、同期を取らない。このように預金にだけ対応するのでは意味がないのです。デポジットパラメータ関数のいずれかを呼び出すと、何の調整もなく、それだけでアトミックになります。アトミックに行えば、Expert Advisorのすべての作業が行われます。そうやって問題を解決していくのです。何かをしたつもりが、実はそれは錯覚なのです。

ドミトリー、周りにはバカしかいないと思わないほうがいい。セルゲイさんの質問から、問題をよく理解していることがわかりますね。

もちろん、同期をとった預金パラメータを単純に参照しても意味がない。これらのパラメータを変更するには、同期が必要です。そのため、並列するExpert Advisorは、すでに変更された正しいパラメータを、変更中に取得するのではなく、受信するようにします。