成行注文を正しく発注するにはどうしたらよいですか?

 

先日、注文の再開についてトピックを立てました。1週間ほど順調に動作していたので、問題は解決したと思っていました。しかし、今日、開くときだけ同じような問題が発生しました。
Finamでは多くの注文が、Otkritieでは9つの注文が開きました...いずれも1つの注文しか開いていないはずですが。

以下は、EAからのコードスニペットです。

    if(OpenOrders<1)
    {
        Coment="Open Sell "+string(OpenOrders+1);
        ret=OpenSellPosition(_Symbol,volume,Coment,Sleeppage,Filling);
    }
    
    
  if(ret)
  {
    OpenOrders++;
    PriceLastOpen=price;
  }

bool OpenSellPosition(string symbol, double volume, string comment="", ulong deviation=10, ENUM_ORDER_TYPE_FILLING filling=ORDER_FILLING_FOK)
{
  MqlTradeRequest Request;
  MqlTradeResult Results;
  ZeroMemory(Request);
  ZeroMemory(Results);
  Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
  Request.action=TRADE_ACTION_DEAL;
  Request.type=ORDER_TYPE_SELL;
  Request.symbol=symbol;
  Request.volume=volume;      
  Request.deviation=deviation;
  Request.comment=comment;  
  Request.type_filling=filling;
  bool res=false;
  res=OrderSend(Request,Results);
  if(res)
  {
    if(Results.deal>0) return(true);
    else return(false);
  }
  return(false);
}

つまり、操作が成功すれば、変数OpenOrdersが 増加し、最初は0に なることがコードからわかる。

0より大きい場合は、それ以上の注文のオープンはないはずですが、Order1というコメントで注文の山全体がオープンされます。

注文を 開く関数で肯定的な応答があるかどうか、注文チケットが届いているかどうかをチェック しますが、実際には注文が設定されているにもかかわらず、なぜかこの関数はfalseを返します。

何が問題なのか、どうすれば解決できるのかを説明してください。

 
取引に関する情報はまだ届いていないのでしょう。ここ(赤で 示した部分)は、運に頼っていることになります。そして、彼女は気まぐれな女性なのです :-))

bool OpenSellPosition(string symbol, double volume, string comment="", ulong deviation=10, ENUM_ORDER_TYPE_FILLING filling=ORDER_FILLING_FOK)
{
  MqlTradeRequest Request;
  MqlTradeResult Results;
  ZeroMemory(Request);
  ZeroMemory(Results);
  Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
  Request.action=TRADE_ACTION_DEAL;
  Request.type=ORDER_TYPE_SELL;
  Request.symbol=symbol;
  Request.volume=volume;      
  Request.deviation=deviation;
  Request.comment=comment;  
  Request.type_filling=filling;
  bool res=false;
  res=OrderSend(Request,Results);
  if(res)
  {
    if(Results.deal>0) return(true);
    else return(false);

  }
  return(false);
}
 
Gennady Mazur:

先日、注文のやり直しの問題を提起しました。1週間はすべて順調に動いていたので、問題が解決したと思っていました。しかし、今日、開くときだけ同じような問題が発生しました。
Finamでは非常に多くの注文が、Otkritieでは9つの注文が開始されました...ただし、すべてのケースで1つの注文しか開始されていないはずです。

以下は、EAからのコードスニペットです。

    if(OpenOrders<1)
    {
        Coment="Open Sell "+string(OpenOrders+1);
        ret=OpenSellPosition(_Symbol,volume,Coment,Sleeppage,Filling);
    }
    
    
  if(ret)
  {
    OpenOrders++;
    PriceLastOpen=price;
  }

bool OpenSellPosition(string symbol, double volume, string comment="", ulong deviation=10, ENUM_ORDER_TYPE_FILLING filling=ORDER_FILLING_FOK)
{
  MqlTradeRequest Request;
  MqlTradeResult Results;
  ZeroMemory(Request);
  ZeroMemory(Results);
  Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
  Request.action=TRADE_ACTION_DEAL;
  Request.type=ORDER_TYPE_SELL;
  Request.symbol=symbol;
  Request.volume=volume;      
  Request.deviation=deviation;
  Request.comment=comment;  
  Request.type_filling=filling;
  bool res=false;
  res=OrderSend(Request,Results);
  if(res)
  {
    if(Results.deal>0) return(true);
    else return(false);
  }
  return(false);
}

つまり、操作が成功すれば、変数OpenOrdersが 増加し、最初は0に なることがコードからわかる。

0より大きい場合は、それ以上の注文のオープンはないはずですが、Order1というコメントで注文の山全体がオープンされます。

注文を 開く関数で肯定的な応答があるかどうか、注文チケットが届いているかどうかをチェック しますが、実際には注文が設定されているにもかかわらず、なぜかこの関数はfalseを返します。

何が問題で、どうすればこの問題を解決できるのか、説明してもらえますか?

悪いFXの遺産。

Resultsを 確認する必要があります。の注文を受け付けています。

注文があったとしても、すでに取引が成立しているわけではありません。

 
Sergey Chalyshev:

悪いFXの遺産。

チェックしなければなりませんの注文を受け付けています。

注文が出されても、すでに取引が成立しているわけではありません。

私が保留中の注文を出すのであれば、あなたは正しいのですが、私は市場によって動作し、ここでチケットはResults.dealで 取得されます。
 
Dennis Kirichenko:
取引に関する情報はまだ届いていないのでしょう。ここ(赤で 示した部分)は、運に頼っていることになります。そして、彼女は気まぐれな女性なのです :-))

bool OpenSellPosition(string symbol, double volume, string comment="", ulong deviation=10, ENUM_ORDER_TYPE_FILLING filling=ORDER_FILLING_FOK)
{
  MqlTradeRequest Request;
  MqlTradeResult Results;
  ZeroMemory(Request);
  ZeroMemory(Results);
  Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
  Request.action=TRADE_ACTION_DEAL;
  Request.type=ORDER_TYPE_SELL;
  Request.symbol=symbol;
  Request.volume=volume;      
  Request.deviation=deviation;
  Request.comment=comment;  
  Request.type_filling=filling;
  bool res=false;
  res=OrderSend(Request,Results);
  if(res)
  {
    if(Results.deal>0) return(true);
    else return(false);

  }
  return(false);
}
いいえ、この結果は存在します。これはサーバー上のチケットオーダーではなく、一時的なチケット操作であり、後でチケットポジションに置き換えられる予定です
 
Dennis Kirichenko:
取引に関する情報はまだ届いていないのでしょう。ここ(赤で 示した部分)は、運に頼っていることになります。そして、彼女は気まぐれな女性なのです :-))

bool OpenSellPosition(string symbol, double volume, string comment="", ulong deviation=10, ENUM_ORDER_TYPE_FILLING filling=ORDER_FILLING_FOK)
{
  MqlTradeRequest Request;
  MqlTradeResult Results;
  ZeroMemory(Request);
  ZeroMemory(Results);
  Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
  Request.action=TRADE_ACTION_DEAL;
  Request.type=ORDER_TYPE_SELL;
  Request.symbol=symbol;
  Request.volume=volume;      
  Request.deviation=deviation;
  Request.comment=comment;  
  Request.type_filling=filling;
  bool res=false;
  res=OrderSend(Request,Results);
  if(res)
  {
    if(Results.deal>0) return(true);
    else return(false);

  }
  return(false);
}
そして、私は前のスレッドで保証された、このフォーラムの第一人者は、この情報は常に来る...ほとんど瞬時に...そして、サーバーは積極的にチケットを発行されていない応答した場合、順序が失敗していること
 

すべてのトレードを 記録する必要があります。例えば、こんな風に。

まず "ヘッダー "でCTradeのトレードクラスと接続します。

#include <Trade\Trade.mqh>
CTrade         m_trade;                      // trading object

で、以下はBuyの操作例です。

   if(m_trade.Buy(lots,NULL,m_symbol.Ask(),sl,tp))
     {
      if(m_trade.ResultDeal()==0)
         Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());

      else
         Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());
     }
   else
      Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
            ", description of result: ",m_trade.ResultRetcodeDescription());

つまり、最初のレベル:オペレーションが基本的なチェックを 通過しなかった、2番目のレベル:トレードのチケットのチェック、という2つのエラーが発生する可能性があるのです。

そして、何か問題があれば、そのログを元に解決することができます。

追記:上記はSYNCの動作モードの場合です。

 

今ならここの達人も教えてくれますよ ))

Объясните что не так, как решить данную проблему? 

あなたの経験では、ここでそのような質問をするのは見苦しいです。

 
Vladimir Karputov:

すべてのトレードを 記録する必要があります。例えば、こんな風に。

まず "ヘッダー "でCTradeのトレードクラスと接続します。

#include <Trade\Trade.mqh>
CTrade         m_trade;                      // trading object

で、以下はBuyの操作例です。

   if(m_trade.Buy(lots,NULL,m_symbol.Ask(),sl,tp))
     {
      if(m_trade.ResultDeal()==0)
         Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());

      else
         Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());
     }
   else
      Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
            ", description of result: ",m_trade.ResultRetcodeDescription());

つまり、最初のレベル:オペレーションが基本的なチェックを 通過しなかった、2番目のレベル:トレードのチケットのチェック、という2つのエラーが発生する可能性があるのです。

そして、何か問題があれば、そのログを元に解決することができます。

追記:上記はSYNCの動作モードの場合です。

まさにその通りです。

  bool res=false;
  res=OrderSend(Request,Results);
  if(res)
  {
    if(Results.deal>0) return(true);
    else return(false);
  }
  return(false);
自作コードのみ
 
Vladimir Karputov:

すべてのトレードを 記録する必要があります。例えば、こんな風に。

まず "ヘッダー "でCTradeのトレードクラスと接続します。

#include <Trade\Trade.mqh>
CTrade         m_trade;                      // trading object

で、以下はBuyの操作例です。

   if(m_trade.Buy(lots,NULL,m_symbol.Ask(),sl,tp))
     {
      if(m_trade.ResultDeal()==0)
         Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());

      else
         Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());
     }
   else
      Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
            ", description of result: ",m_trade.ResultRetcodeDescription());

つまり、最初のレベル:オペレーションが基本的なチェックを 通過しなかった、2番目のレベル:トレードのチケットのチェック、という2つのエラーが発生する可能性があるのです。

そして、何か問題があれば、そのログを元に解決することができます。

追記:SYNCの動作モードでも同様です。

それと、もう一つ、標準機能で注文の執行、そのファイリングをサポートしていますか?私は以前、SeaTradeを使って開設していましたが、ある取引所では、ファイリングの判断が不可能なため、注文が執行されるのを嫌がりましたので。
 
Gennady Mazur:
まさにその通りです。

  bool res=false;
  res=OrderSend(Request,Results);
  if(res)
  {
    if(Results.deal>0) return(true);
    else return(false);
  }
  return(false);
が、自作のコードで。
伐採は?操作に成功した場合と、特に失敗した場合の両方をエラーコード 付きで出力する必要があります。
理由: