複数注文の問題

 

皆さん、こんにちは。

私のコードに問題があります。注文(買いまたは売り)が開くと、他の注文が次々と出てきます。

私がしようとしていることは、次のとおりです。

最後の注文が売りであれば、価格が注文のOpenpriceプラスいくつかのpips(ReturnDist)上に来るとき、買い注文を開く。

最後の注文が買いなら、価格がOpenpriceから数pipsを引いた価格になったら売り 注文を出す。

どなたか教えていただけませんか?

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

ルイス

ファイル:
 
luisneves:

皆さん、こんにちは。

私のコードに問題があります。注文(買いまたは売り)が開くと、他の注文が次々と出てきます。

私がしようとしていることは、次のとおりです。

最後の注文が売りであれば、価格が注文のOpenpriceプラスいくつかのpips(ReturnDist)上に来るとき、買い注文を開く。

最後の注文が買いなら、価格がOpenpriceから数pipsを引いた価格になったら売り注文を出す。

どなたか教えていただけませんか?

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

ルイス

どのように制限するつもりですか?

OpenOpposite を 1 で初期化します。

int    Ticket,total,OpenOpposite=1,UseSlippage,i;

毎ティック、OpenOppositeOrder() を呼び出します。

   int start()
     {
      if (OrdersTotal()==0)GoToOpen();
       else GoToClose();      
      if(OpenOpposite>0)OpenOppositeOrder(); //<-- here 
      if(OrdersTotal()>0)OpPendingDel();
      
     }

OpenOpposite への他の参照は見当たりません。

OpenOppositeOrder の for ループは、私がこれまで見てきた限りでは、何の制限もありません...そうすべきでしょうか?

あなたのコードのどこにエラーがあると思いますか?

 

Kroninさん、こんにちは。

まずは、迅速なご回答に感謝いたします。

しかし、私がしようとしたことは、コードの独立した作業ブロックを持つことでした。

そこで、ご指摘の行と、void OpenOpposite () と書いてある上の部分をきれいにしたのですが、次のようなエラーが発生しました。

グローバルスコープでの式は許可されていません、などです。

もし、お時間を取らせなければ、ここで助けていただけませんか?

ありがとうございます。

ルイス



 
luisneves:

Kroninさん、こんにちは。

まずは、迅速なご回答に感謝いたします。

しかし、私がしようとしたことは、コードの独立した作業ブロックを持つことでした。

そこで、ご指摘の行と、void OpenOpposite () と書いてある上の部分をきれいに したのですが、次のようなエラーが発生しました。

グローバルスコープでの式は許可されていません、などです。

もし、お時間を取らせてしまうようでしたら、ここで助けていただけないでしょうか?

ありがとうございます。

ルイス

私は、あなたが何かをクリーンアップする必要があるとは言っていません。ただ、EAが複数の注文を出すのを制限する方法を知りたかっただけです。

これを試してみてください(私はそれをテストしていません)。

スタート関数を 次のように変更してください(もしかしたら、成行注文だけをフィルタリングする必要があるかもしれません→あなたの戦略次第)。

   int start()
     {
      if(OrdersTotal()==0){GoToOpen();OpenOpposite=0;} //<-- set OpenOpposite to 0 if no order is open (pending and market)
      else GoToClose();      
      if(OpenOpposite==0)OpenOppositeOrder();          //<-- only run OpenOpositeOrder, if OpenOpposite is 0.
      if(OrdersTotal()>0)OpPendingDel();      
     }

OpenOppositeOrder()関数にOpenOppositeカウンターを追加する。

         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
            {
            Op = OrderType();

            if(Op == OP_BUY  && Ask < (OrderOpenPrice()- ReturnDist*pt))
               {                
               Ticket = OrderSend(Symbol(), OP_SELL, mlots, SellPrice, UseSlippage, 0, 0, "Sell Order", MagicNumber, 0, Red);
               if(Ticket > 0) 
                  {
                  Print("Opposite Sell order placed # ", Ticket);
                  AddLimitsSell();
                  OpenOpposite++;
                  }
               else
                  {
                  Print("Order Send failed, error # ", GetLastError());
                  }
               }
               
            if(Op == OP_SELL && Bid > (OrderOpenPrice()+ ReturnDist*pt))
               {               
               Ticket = OrderSend(Symbol(), OP_BUY, mlots, BuyPrice, UseSlippage, 0, 0, "Buy Order", MagicNumber, 0, Green);
               if(Ticket > 0)
                  {
                  Print("Opposite Buy order placed # ", Ticket);
                  AddLimitsBuy();
                  OpenOpposite++;
                  }
               else
                  {  
                  Print("Order Send failed, error # ", GetLastError());
                  }   
               }
            }

これは、複数の注文が連続して開く問題を解決するはずです。これは、EAが複数の(反対)注文を開くことを制限する。

 
luisneves:

皆さん、こんにちは。

私のコードに問題があります。注文(買いまたは売り)が開くと、他の注文が次々と出てきます。

なぜ同じコードの部分について2番目のスレッドが必要なのでしょうか?

RaptorUK

あなたのコードを見て、私はあなたがやろうとしていることをフォローするのは非常に困難であることを見つける、私は私を助けるために非常に少数のコメントを参照してください、あなたのstart()関数は、各ティックでやろうとしていることを私に示していない、あなたはインデントの一貫したレイアウトを持っていない。


このスレッドから: https://www.mql5.com/en/forum/142629 ページ 3

 
RaptorUK:

あなたのコードを見ると、あなたがやろうとしていることを追うのは非常に困難だと思います。私を助けるためのコメントはほとんど見当たりませんし、あなたのstart()関数は、各ティックで何をやろうとしているのか私に示しません。

その点は同意します。コードが読みにくいので、複数注文の問題以外、何もチェックしていません。コードの一部が、他の人が書いた他のコードからコピー&ペーストされているように見える。自分自身の関数を 自分自身のスタイルで(一貫性を持って)書いた方が良い。

 
kronin:

私はあなたが何かをクリーンアップする必要があるとは言っていません。ただ、EAが複数の注文を出すのを制限する方法を知りたかっただけです。

これを試してみてください(私はテストしていません)。

スタート関数を次のように変更してください(もしかしたら、成行注文だけをフィルタリングする必要があるかもしれません→あなたの戦略次第です)。

OpenOppositeOrder()関数にOpenOppositeカウンターを追加する。

これは、複数の注文が連続して開く問題を解決するはずです。これは、EAが複数の(反対)注文を開くことを制限するものです。


こんにちは、kroninさん。

私の問題に迅速に対応していただき、ありがとうございました。私が取得しようとしているのは、このような注文を開くための条件です。

インジケータを使った最初のオープンは買い(もちろん売りでもよい)、その後買い注文が出され、価格が買い注文のオープン価格以下のレベルに跳ね下がると売り注文が出されますが、価格が再び上がると新たな買い注文は出ません。ここで、新しい買い注文は、価格が売り注文から跳ね返されたときにのみ発生するはずです。売り注文が最初に起こってもすべて同じです。
私は添付の次のコードでそれを得ようとしましたが、うまくいきません。ここでは最初の注文が買いで、次に予想通り売り注文が開きますが、ここからは他の注文は開きません...

2つのコードブロックがありますが、1つ目のコードは期待通りの動作をしているようです: インジケータで定義された条件が揃えば、買いまたは売り注文を出します。オーダー
チケットを受信したら、オーダーリミットを送信するためにオーダーを修正します。

私は複数の注文を開くことを避けるために、コードでBuyTicketとSellTicketを使用していますが、それは正しい方法ではないようです...

// Buy Order Condition to Open

  if(Volume[0] > volume_previous + OpenDistance*pt && BuyTicket == 0)                       
          {//5  
          while(IsTradeContextBusy()) Sleep(10);
          RefreshRates();       
                       
     BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,RealSlippage,0,0,"Buy Order",MagicNumber,0,Green);
     if(BuyTicket > -1)
        {//6
         Print("Opposite Buy order placed # ",BuyTicket);
         AddLimitsBuy();        
         }//6
      else
         {//7 
         Print("Order Send failed, error # ", GetLastError());
         }//7 
         
      return(0);
      }//5
  //-----------------------------------------------------------------------------+      
  
  // Sell Order Condition to Open

  if(Volume[0] < volume_previous - OpenDistance*pt && SellTicket == 0)                   
     {//8                                 
          while(IsTradeContextBusy()) Sleep(10);
          RefreshRates();       
                                                
          SellTicket=OrderSend(Symbol(),OP_SELL,LotSize,Bid,RealSlippage,0,0,"Sell Order",MagicNumber,0,Red);
          if(SellTicket > -1)
                  {//9
        Print("Opposite Sell order placed # ", SellTicket);
        AddLimitsSell();       
        }//9
     else
        {//10
        Print("Order Send failed, error # ", GetLastError());
        }//10      
     return(0);
     }//8                       


次のコードは、未決済の注文を識別し、それらを買いシンボル、マジックナンバー、注文タイプでフィルタリングします。プール内の最後のオープンオーダーを検出し、オープンする条件(最後のオーダーが買いであることを考慮する)とセルチケットが存在しないことを確認したら、売りオーダーがオープンされます。最後の注文が売りであれば同じ。と、ここでコードは動いています。

問題は,3つ目の注文をオープンする条件が来たときなどである。ここでは、それにもかかわらず、開くための条件があり、コードは2番目のオープンにうまく対処しているなぜここでコードが動作しないのですか?

int Op;  
   
   for(int Counter = OrdersTotal()-1; Counter >= 0; Counter--)
      {//14
      if(OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES))  
         {//15
         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
            {//16
            Op = OrderType();

            if(Op == OP_BUY && Bid < OrderOpenPrice() - (ReturnDist*pt) && SellTicket == 0)
               {//17               
               SellTicket = OrderSend(Symbol(), OP_SELL, MLots, Bid, RealSlippage, 0, 0, "Sell Order", MagicNumber, 0, Red);
               if(SellTicket > -1) 
                  {//18
                  Print("Opposite Sell order placed # ", SellTicket);
                  AddLimitsSell();
                  }//18
               else
                  {//19
                  Print("Order Send failed, error # ", GetLastError() );
                  }//19
                }//17
                           
            if(Op == OP_SELL && Ask > OrderOpenPrice() + (ReturnDist*pt)&& BuyTicket == 0)
               {//20             
               BuyTicket = OrderSend(Symbol(), OP_BUY, MLots, Ask, RealSlippage, 0, 0, "Buy Order", MagicNumber, 0, Green);
               if(BuyTicket > -1)
                  {//21
                  Print("Opposite Buy order placed # ", BuyTicket);
                  AddLimitsBuy();
                  }//21
               else
                  {//22  
                  Print("Order Send failed, error # ", GetLastError());
                  }//22   
               }//20
            }//16
         }//15    
      }//14

私が説明しようとしているものを見る必要がある場合に備えて、完全なコードが添付されています。

これは、私が注文を開くために使用する方法の場合です。なぜなら、私はまだ入札プラスマイナス距離に基づいて注文を開く方法を学んでいるからです。

もしあなたが私を助けてくれるなら、本当に感謝します。


よろしくお願いします。
Luis

ファイル:
 
Volume[0]が何を意味するか知っていますか? それにPointの 値を加えることは、どのような意味があるのでしょうか?
 

Raptorさん、こんにちは。

おっしゃるとおりです。

私はまだ勉強中で、必要なものを得るためにいくつかの方法を試していますが、時には愚かなことが起こります。

私は、オブジェクトをビッドレベルに置き、そのポジションをオープンオーダーにすることを試みましたが、これより良いようです。主な問題の1つは、オープン・オーダーがクローズされていない状態で、新しいオープンを制限する方法です。

私は学ぶことがたくさんあることを知っていて、エラーによって試してみることは、これが実際にどのように実行されるかをよりよく理解するために見つけた方法です。私は本やドキュメントから情報を理解するために私の最大限の努力をしている間、私は失われた感じと他の人から助けを得ようとするいくつかの時間。ここポルトガルでは、このテーマの周りに授業料を得ることは非常に困難であるため、ヘルプやアドバイスを得るために他の人からの善意、忍耐と自己主張からすべての依存です。そのヘルプが到着したとき、私は理解するために私のベストを尽くすが、時には私はそれで対処することはできません。

とにかく、ボリュームはその種の指標を得るための方法ではないことを教えてくれてありがとうございました。

よろしくお願いします。

ルイス

 
luisneves:

Raptorさん、こんにちは。

おっしゃるとおりです。

私はまだ勉強中で、必要なものを得るためにいくつかの方法を試していますが、時々愚かなことが起こります。

まずはシンプルなEAを作り、それを使って必要なことを実現する方法を理解するまでは、いくつかのことを試し、Print文を追加し、何が起こるか見てみるといいでしょう。EAをコーディングする前に、何をさせたいのか明確にしておく必要があります。

もう一つ、タスクをモジュールに分解して、他のEAで再利用できるようにしましょう。そして、そのモジュールをユーザー定義関数として、スクリプトやシンプルなEAの一部として単独でコーディングして、それが動作し、堅牢であることを確認します ... それから、EAでその関数が動作することを確信して使用することができます。
 

RaptorUKさん、こんにちは。

正直なご回答ありがとうございます。私はすでにタスクを中断しようとし、他の種類の問題が表示され始め、それがすべてをまとめるようになった理由です(そして他の問題が始まる...)。

すでに別のEAをやってみたところうまくいったのですが、今度はインジケータ(標準のもの)を使わずにこの方法を使うと、物事が複雑になってしまいます。

今、完全に迷っているところです。私は方法が動作するはずであり、その後、複数の開口部を避けるために制限を取得しようとすると、物事を悪化させる理論でティックによってコードの仕事のティックを参照していることを考えた。

だから今、正常に動作しているコードのいくつかのブロックがあり、パフォーマンスを向上させるためにいくつかの注意を必要とし、他の(2)動作しない、そしてここで私はここから取得する方法がわからない...そのように単純な、私は完全に助けを借りて、人々はそれに対処する方法を知っていることである。あなたはMの問題に多くの時間を捧げてきた人の一人ですが、それでも私はまだいくつかの問題に対処することはできません。私はすべてのmqlのコードを学習し、過去に取得した理論と経験の多くに基づいて書き込みを開始する時間を持っていた場合、おそらく私はここにいませんでした。

私はEA(添付ファイル)を見て、それは私が探しているものをもたらすべきであるコードの部分で動作する方法を理解しようとするが、それに失敗しました。 私が見たものは、それが価格プラスとマイナスいくつかの距離に基づいて開口部を得るためにコードを使用することであった。そして、なぜ代替注文が理論通り(少なくとも私が見てきた方法)機能しないのかが分かりません。本当に恥ずかしい......。

とにかく、これは限られた人間からの言葉です。

よろしくお願いします。

ルイス

ファイル: