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

 
Arles:
同じEAが複数のチャートにあり、注文を開くシグナルが2つのチャートに同時に表示されるなど、問題を解決する方法をご教示ください。ただし、2順目は開かないようにする必要があります。EAにはオープンオーダーのチェックがありますが、最初のEAがオーダーをオープンする必要があり、2番目のEAもオーダーをオープンするリクエストを送信するため、役に立ちません。何か解決策があるのでしょうか?
複数のチャートに同一のEAを複数個、どのような目的で使用するのかがよくわからない。- この理解に基づいて、何かをアドバイスする方が論理的でしょう。しかし、私たちが持っている情報に基づいて、1つのEAだけを取引させたい場合は、設定(EA内に提供されている場合)またはタブ「一般」-「EAの取引を許可」(チェックボックスを非選択)のいずれかで、2番目のEAを取引できないようにすることができます。
ちなみに、すべてのExpert Advisorは同じ端末で並列に動作するわけではなく、順次動作します。- 1台目が作業を終えるまで、2台目はデータを処理しない。ですから、もしEAが正しく書かれていれば、つまり発注された注文をチェックしていれば、2つ目のEAはすでにこの注文を考慮に入れていることになるのです。- これはその一つです。しかし、これはExpert Advisorが首尾一貫して動作するように設定されている場合にのみ実現されます。仮に、同じマジックを持ち、マネーマネジメントのための会計を行うとしよう。それ以外は、「不要な」EAを無効化することのみ。- では、なぜ入れたのか...?
 
Chiripaha:
複数のチャートで同一のEAを複数使用するのは、どのような目的で使用するのかよくわからない。

Expert Advisorは、ホバリングしているペアのみを分析します。シグナルが最初に表示されたペアで、注文を開始します。しかし、2つのペアに同時に信号が現れることもある。そして、不思議なことに、Expert Advisorでは、それぞれのオープンオーダーにチェックが入っており、2つ目のオーダーは開かないはずなのに、2つのオーダーがオープンされています。これは、預金残高が十分でないために必要なことです。

1番目の作業が終わらない限り、2番目のデータは処理されません。

しかし、1番目が仕事を終えて注文を出したとき、仕事を始めた2番目が少しの間、すでに注文があることに気づかないのです。注文が始まる前に仕事に取り掛かるか。
--

もう一つ、1つ目のEAがSleep(1000)の時、2つ目のEAは待機しているのか、動き出すのか?

 

皆さん、こんにちは。

次のようなアイデアをコード化しました。

条件N1 ...High[1]がある最大値を超えた場合 X

と同時に

条件N2 .次の150本のローソク足の最初の High[1]とLowの差 >= 150 p.

------------------------------------------------------------------

アクションN1 .前回の注文を削除する

アクション N2 ...保留注文を出す

アクションN3 .変数に値を割り当てる。

問題点 市場に注文がない場合、または現在のバーで最後の注文が出されていない場合にのみ、保留中の注文を出すべきであるという事実にもかかわらずです。 if (ot==0||last_order_bar>0)

条件N1と条件N2が成立した場合、同時に複数の 注文が 発注されます。

保留中の注文を1つだけ出したいのですが。

-----------------------------------------------

ot last_order_bar の値は、上記のコードで計算されます。

                                                                                                                        
                                                                                                                
int last_order_bar = 0;                                                                                                                 
int ot = OrdersTotal();                                                                                                                 
                                                                                                                        
 if (ot>0) //если есть ордера в рынке                                                                                                                   
 {                                                                                                                      
   if (OrderSelect (ot-1,SELECT_BY_POS)) //выбрали последний ордер                                                                                                                      
      if ( OrderType ()==OP_SELLSTOP) //проверили тип
        last_order_bar = iBarShift (Symbol (),0,T ); //запомнили, на каком  баре открыт последний ордер (если он есть)                                                                                                                  
 }                                                                                                                      
if(High[1] > X )
 {
   
   for(int i=1;i<150;i++)
     {
      if((High[1]-Low[i])>=1500*Point)//
      break;         //
             {
     if (ot>0) 
         {
           bool R = OrderDelete(OrderTicket());  
         }
if(R==0)                      //если последний выставленный SELLSTOP удален
         {
if (ot==0 || last_order_bar>0)        
int Ticket=OrderSend(Symbol(),OP_SELLSTOP,0.1,iHigh( Symbol (), 0,1)-1500*Point,1,iHigh( Symbol (), 0,1),iHigh( Symbol (), 0,1)-1610*Point,"jfh",123 );//выставить новый SELLSTOP       
if (Ticket>0)                // если SELLSTOP выставлен
 N = (OrderTicket());        //запомнить в глобальную переменную N тикета данного SELLSTOP .
 T = Time [0];               //запомнить в глобальную переменную время выставления данного SELLSTOP
 X=iHigh( Symbol (), 0,1);   //запомнить в глобальную переменную High свечи N1 после которой был выставлен данный SELLSTOP
   
 }
 }
 }
 }
}
 }   
                        
return(0);
 
Arles:

Expert Advisorは、ホバリングしているペアのみを分析します。シグナルが最初に表示されたペアで、注文を開始します。しかし、2つのペアに同時に信号が現れることもある。そして、不思議なことに、Expert Advisorでは、それぞれのオープンオーダーにチェックが入っており、2つ目のオーダーは開かないはずなのに、2つのオーダーがオープンされています。これは、預金残高が十分でないために必要なことです。

しかし、1台目が仕事を終えて注文を出したとき、2台目は仕事を始めてからしばらくは、その注文がすでに存在していることに気づかないのです。あるいは、注文が始まる前に出勤してしまう。
--

もう一つ、1つ目のEAがSleep(1000)の時、2つ目のEAは待つのか動き出す のか、

最初の質問について:私は、EAが正しく書かれていれば...と規定しています。もちろん、EAに 発注済み(未決済)注文のチェックや 資金管理の計算がなければ、おっしゃるようなことも起こり得ます。これはすべて、プログラマーのレベル(と怠慢さ)にかかっています。すべてが正しく実装されていれば、あなたが心配しているようなことは起こりません。- シグナルは2つのペアで同時に表示されることがありますが、(前回の記事を参照)Expert Advisorは順次動作します。したがって、最初のEAがクォートを処理しない限り、次のEAは動作し始めません。- これが順次処理にした理由だと思います(仮に引用文を並列処理することが可能だとしても、それはまた別の議論になるでしょう)。

また、EAのレベルにもよります。というのも、ご質問の内容は、どれも処方がかなり面倒なものばかりで、とても財務の知識が必要な小手先の仕事ではありません。そのため、EAは「シンプル」になりがちで、現在の通貨の口座ごと渡されることを想定しています。通常、1つの通貨が取引される。なぜなら、例えば複数の通貨を取引するには、かなり異なるタイプの預金が必要であり、そのような単純なシステムはそこには適用できないからです。唯一の例外は、ヘッジの操作(正確な用語を忘れてしまったので、別の言い方をします)、ある価格でオープンし、すぐに別の価格(あるいは複数の価格)で再開する場合、その差はそれ自身にあります。しかし、これは別のタイプのEAであり、すべてがそこで説明されます(オールインワン)。- そして、一般的に、私の意見では、あるペアで流動性より資金がない場合、すべてのペアで一度に取引することは悪いトーンです。(ただし、これは私見です) ポートフォリオなど。- 投機的な取引には使用できません。なぜかみんなそれをまったく考慮しないんですよね。- 国際的な生産活動や貿易を行う企業でなければ、たくさんの通貨は全く必要ありません。- 私が言いたいのは、なぜ通常EAで異なる通貨を会計処理するためにそのようなブロックを実装しないのか、それは無関係だからだ、ということです。

Sleep(1000)機能で端末がどのように反応するのかがよくわからないので、詳しい 方にアドバイスをお願いします。理想的には、この時点の端末はストリーミング価格を処理するだけです。つまり、相場を受け取り、チャートとインジケータを描画します。しかし、このEAが「待機」している間は、他の人に順番が回ってくることはありません。- しかし、これは私の思い込みであり、全く自信があるわけではありません。おそらく、この「キュー」のもう一つの例外は、EAが待機している間に実行するために起動できるスクリプトです。- 私も同じ疑問を持っています。

しかし、私はこの無知から抜け出すために、最初のポイントの正しさに基づいてExpert Advisorを構築しています。

 
solnce600:

皆さん、こんにちは。

次のようなアイデアをコード化しました。

条件N1 ...High[1]がある最大値を超えた場合 X

と同時に

条件N2 .次の150本のローソク足の最初の High[1]とLowの差 >= 150 p.

------------------------------------------------------------------

アクションN1 .前回の注文を削除する

アクション N2 ...保留注文を出す

アクションN3 .変数に値を割り当てる。

問題点 市場に注文がない場合、または現在のバーで最後の注文が出されていない場合にのみ、保留中の注文を出すべきであるという事実にもかかわらずです。 if (ot==0 || last_order_bar>0)

条件N1と条件N2が成立した場合、同時に複数の 注文が発注されます。

保留中の注文が1つだけ必要なのですが。

:))アンドレイ 君が質問しているのは、すでに教科書で説明されているようなことなんだ。チュートリアルのTerminalの例では、どのように注文を考慮する必要があるかの原則と論理が詳細に説明されていますので、ご覧ください。- そうすれば、ほとんどの疑問は自ずと解消されるでしょう。一般的に、チュートリアルは、あらゆる有能なExpert Advisorの構造が完全に例として提示されているという事実に基づいて構築されています。- ここが魅力です。+ プログラミングの基本的な理論的な概念が与えられている。しかし、それは怠惰な読者のためのものではない、書かれていることの構造から導かれるものであるという、一つの欠点があります。つまり、特定のポイントに関する質問を取り除くには、教科書をすべて読む必要があります。 しかし、それ(教科書)を再話することに同意する人はほとんどいないでしょう。

注文という会計の上に杭を打っているのですね。- もっとシンプルなアプローチが必要です。注文があるかないか、そしてどのバーで(あなたの条件下で)開いているかは関係ないのです。- このように複雑であるため、私たちは注文や条件を検討する際に混乱するのです。- そのため、プログラマーはアルゴリズムの誤りを探す必要があります。プログラムを書く ロジックを変えれば、アルゴリズムの間違いは(勝手に)なくなります。

 
わかりました ありがとうございます
 
Arles:

Expert Advisorは、ホバリングしているペアのみを分析します。シグナルが最初に表示されたペアで、注文を開始します。しかし、2つのペアに同時に信号が現れることもある。そして、不思議なことに、Expert Advisorでは、それぞれのオープンオーダーにチェックが入っていて、2つ目のオーダーは開かないはずなのに、2つのオーダーがオープンされています。これは、預金残高が十分でないために必要なことです。

これはかなり初歩的なことです最初のExpert Advisorが注文を開始します。どちらのEAで注文を出したかが重要でないなら...両方のEAに条件を作ってください。最後に開いた注文を見つけ、それぞれ開いた時刻を抽出するブール関数を作成する。この開始時間が 現在のバーの開始時間と等しい場合、TRUでこの関数を終了 します。機能をスタートの先頭に置き、モードがTRUの 場合は、スタートから終了します。
 
Chiripaha:

また、2つ目の質問 ですが、正直なところ、私自身もこの質問は未解決です。Sleep(1000)関数を実行したときにターミナルがどう反応するのかが全く分からないので、分かる人には答えを教えて 欲しいと訴えています。理想的には、この時点の端末はストリーミング価格を処理するだけです。つまり、相場を受け取り、チャートとインジケータを描画します。しかし、このEAが「待機」している間は、他の人に順番が回ってくることはありません。- しかし、これは私の思い込みであり、全く自信があるわけではありません。おそらく、この「キュー」のもう一つの例外は、EAが待機している間に実行するために起動することができるスクリプトです。- 私も同じ疑問を持っています。

しかし、私はこの無知から抜け出すために、最初のポイントの正しさをベースにExpert Advisorを構築するようにしています。



私の理解では、Sleep()の 後、Expert Advisorは単に眠りに落ち、すなわち、その作業は一時停止され、この時点でそれは引用符を受け取り、何も反応しない。そのため、端末は「キュー」を別の端末に渡す。

もし反対する人がいたら、訂正してください

 
hoz:


私の理解では、Sleep() が処理されると、Expert Advisor は単にスリープ状態になり、すなわち作業が中断され、この瞬間は、気配値を受け取ることも、何かに反応することも一切ありません。そのため、端末は「キュー」を別の端末に渡す。

もし反対する人がいたら、訂正してください

私は同意する用意がありません。- なぜなら、この位置からエキスパート・アドバイザーによる正しい作業と資金とポジションの両方の計算の論理が失われてしまうからです。- これはその一つです。2番目。- 例えば、私のEAが100ミリ秒眠っていて、同時に別のEAが動き出したとしたら、この100ミリ秒が過ぎると同時に、もう一つのEAはその作業を止めなければならないということが起こるのでしょうか...。で、それをまた真ん中のこの人に渡す、ということを無限に繰り返していく...。その一方で私は、EAで、数分間、実行ブロックごとに何度も「スリープ」状態になるのを(まれではありませんが)見たことがあります。- では、この時間帯に他のすべてのフクロウが動いていないとしたら、それもどこかおかしい。- だから、質問はかなり適切です。この際、操作のロジックを理解したいと思います。しかし、公式の資料で詳しい説明に出会ったことはない。

しかし、2つの悪のうち、私は後者を選びます。この場合、私なら確信犯的なフクロウを残すだけです。そうでなくても、再計算のスピードは落ちるが、正確さは保たれる。

この問題は、見た目ほど些細なことではありません。- 要は、私の実験では、「EAに取引を許可 する」のチェックを外すと、EAの動作は止まらず、すべての計算が毎ティック同じように行われることがわかりました。EAのトランザクションだけがサーバーに送信されることはありません。しかし、これらの計算が(正確とは言い難い)「滑り」で埋め尽くされると、そのようなEAが5~10個あれば、現在取引している実際のEAの実行を具体的に遅らせることができるのです。

そう、プログラマーの中には、これを前提にトレードやフクロウの仕事を飛ばすためのパーミッションにコントロールを置く人もいるのです。しかし、その頻度は高くはありません。また、コードが閉じていると、その操作がブレーキなのかそうでないのか(具体的にどのフクロウなのか)、まったく理解することができません。- では、フォーラム検索でこのトピックをつつくことにします。何かが減速している。

質問してくれたアルル さん、思い出させてくれて、更新してくれて、ありがとうございます。私は経験不足で、何が書いてあるのか理解できませんでした。今、もう一度やります。

 
Arles:

Expert Advisorは、ホバリングしているペアのみを分析します。シグナルが最初に表示されたペアで、注文を開始します。しかし、2つのペアに同時に信号が現れることもある。そして、不思議なことに、Expert Advisorでは、それぞれのオープンオーダーにチェックが入っていて、2つ目のオーダーは開かないはずなのに、2つのオーダーがオープンされています。これは、預金残高が十分でないために必要なことです。

しかし、1台目が仕事を終えて注文を出したとき、2台目は仕事を始めてからしばらくは、その注文がすでに存在していることに気づかないのです。あるいは、注文が始まる前に出勤してしまう。
--

もう一つ、1つ目のEAがSleep(1000)したとき、2つ目のEAは待機しているのか動き出すのか?

少額の保証金では、複数のペアで取引しない(世渡り上手)。

技術的には、異なるEAに注文数の合計を考慮させるために、この方式を試すこともあります。

    int li_total - OrdersTotal();
    if (li_total == 0) Sleep (1000);
    li_total - OrdersTotal();
    if (li_total == 0) OrderSend();

どの程度効果があるかはわかりません(2でも効果があるはずです)。セマフォを配置した端末のグローバル変数 で順次動作させるのが安全でしょう。そうすれば、Expert Advisorがいくつ並列に動作しても問題ない。