시장가 주문을 올바르게 여는 방법은 무엇입니까?

 

나는 최근에 재오픈 주문에 대한 주제를 제기했습니다. 문제를 해결했다고 생각했기 때문입니다. 일주일 동안 모든 것이 잘 작동했습니다. 그러나 오늘은 열 때만 비슷한 문제가 발생했습니다.
오프닝 9에 Finam에서 많은 주문이 열렸지만... 모든 경우에 하나의 주문만 열렸어야 했습니다.

다음은 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 :

나는 최근에 재오픈 주문에 대한 주제를 제기했습니다. 문제를 해결했다고 생각했기 때문입니다. 일주일 동안 모든 것이 잘 작동했습니다. 그러나 오늘은 열 때만 비슷한 문제가 발생했습니다.
오프닝 9에 Finam에서 많은 주문이 열렸지만... 모든 경우에 하나의 주문만 열렸어야 했습니다.

다음은 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를 반환합니다.

무엇이 잘못되었는지 설명하고 이 문제를 해결하는 방법은 무엇입니까?

나쁜 유전 외환.

결과를 확인해야 합니다. 주문하다.

주문이 접수되었다고 해서 거래가 이미 이루어진 것은 아닙니다.

 
Sergey Chalyshev :

나쁜 유전 외환.

결과를 확인해야 합니다. 주문하다.

주문이 접수되었다고 해서 거래가 이미 이루어진 것은 아닙니다.

지연을 두는 것이 옳겠지만 저는 시장에서 일하고 있으며 여기서 티켓은 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

다음은 구매 작업의 예입니다.

   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());

즉, 두 번 오류가 발생할 수 있습니다. 첫 번째 수준 - 작업이 기본 검사를 통과하지 못함두 번째 수준의 방어 - 트랜잭션 티켓을 확인합니다 .

그런 다음 오버레이가 있으면 로그에서 알아낼 수 있습니다.

추가됨: 위의 내용은 SYNCHRONOUS 작동 모드에 해당됩니다.

 

바로 지금, 그리고 여기에서 전문가들이 가르칠 것입니다))

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

귀하의 경험에 비추어 볼 때 여기에서 그러한 질문을 하는 것은 무례합니다.

 
Vladimir Karputov :

모든 거래 를 기록해야 합니다. 예를 들면 다음과 같습니다.

먼저 "헤더"에서 거래 클래스 CTrade를 연결합니다.

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

다음은 구매 작업의 예입니다.

   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());

즉, 두 번 오류가 발생할 수 있습니다. 첫 번째 수준 - 작업이 기본 검사를 통과하지 못함두 번째 수준의 방어 - 트랜잭션 티켓을 확인합니다 .

그런 다음 오버레이가 있으면 로그에서 알아낼 수 있습니다.

추가됨: 위의 내용은 SYNCHRONOUS 작동 모드에 해당됩니다.

그래서 그게 바로 내가 한 일이야

   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

다음은 구매 작업의 예입니다.

   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());

즉, 두 번 오류가 발생할 수 있습니다. 첫 번째 수준 - 작업이 기본 검사를 통과하지 못함두 번째 수준의 방어 - 트랜잭션 티켓을 확인합니다 .

그런 다음 오버레이가 있으면 로그에서 알아낼 수 있습니다.

추가됨: 위의 내용은 SYNCHRONOUS 작동 모드에 해당됩니다.

그러나 표준 기능은 주문 실행, 채우기를 지원합니까? 이전에 CiTrade를 사용하여 열었기 때문에 주문이 실행되기를 원하지 않는 거래소에 도착할 때까지. 충전량을 결정하는 것은 불가능했습니다.
 
Gennady Mazur :
그래서 그게 바로 내가 한 일이야

   bool res= false ;
  res= OrderSend (Request,Results);
   if (res)
  {
     if (Results.deal> 0 ) return ( true );
     else return ( false );
  }
   return ( false );
당신의 코드로만
로깅은 어떻습니까? 작업의 성공적인 완료와 특히 오류 코드 와 함께 실패를 모두 표시해야 합니다.