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

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

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

또한 선택을 시도하여 위치의 열림을 확인할 수 있습니다. 그리고 몇 가지를 시도하는 것이 좋습니다

         int n = 0 ;
           do
           {
            n++;
           }
           while (! PositionSelectByTicket (tradeResult.deal) && n < 5 );
지연 및 해당 위치가 이미 제자리에 있다는 확인이 있습니다.

그리고 OrderCheck(Request, checkResult) 체크가 없다는 것도 알아차렸습니다.
 

예, 그리고 시장 주문에서도 - 가격 = 0

Request.price= SymbolInfoDouble ( _Symbol , SYMBOL_BID ); 잊어버려

bool SendOrderSyncMode()
  {
   MqlTradeRequest request={ 0 };
   MqlTradeResult   result={ 0 };
   order_ticket= 0 ;
   request.action = TRADE_ACTION_DEAL ;
   request.magic  = 9876543211 ;
   request.symbol = Symbol ();
   request.volume = 1 ;
   request.price  = 0 ;
   request.type= ORDER_TYPE_BUY ;
   request.comment= "Sync mode" ;
   request.type_filling=ORDER_FILLING_FOK;
   request.type_time= ORDER_TIME_DAY ;
   if ( OrderSend (request,result))
     {
       if ((result.retcode== TRADE_RETCODE_DONE ) || (result.retcode== TRADE_RETCODE_PLACED ))
        {
         if (result.order> 0 )
           {
            order_ticket=result.order;
             Print ( __FUNCTION__ , " Order sent in sync mode" );
             return ( true );
           }
         else
           {
             Print ( __FUNCTION__ , " Error order sent in sync mode! Retcode = " ,result.retcode);
           }
        }
       else
        {
         Print ( __FUNCTION__ , " Error order sent in sync mode! Retcode = " ,result.retcode);
        }
     }
   else
     {
       Print ( __FUNCTION__ , " Order not sent in sync mode." );
     }
   return ( false );
  }
void OnTradeTransaction ( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result)
  {
   switch (trans.type)
     {
       case TRADE_TRANSACTION_HISTORY_ADD :
         if ((order_ticket > 0 ) && (trans.order == order_ticket))
      {
         //Вот здесь и смотрим что произошло
      }
       break ;
     }
  }
 
Alexey Viktorov :
또한 선택을 시도하여 위치의 열림을 확인할 수 있습니다. 그리고 몇 가지를 시도하는 것이 좋습니다

         int n = 0 ;
           do
           {
            n++;
           }
           while (! PositionSelectByTicket (tradeResult.deal) && n < 5 );
지연 및 해당 위치가 이미 제자리에 있다는 확인이 있습니다.

그리고 OrderCheck(Request, checkResult) 체크가 없다는 것도 알아차렸습니다.

이미 자리가 있었다면?

아니면 이미 포지션이 있는데 주문이 완전히 채워지지 않았나요?

 
Alexey Viktorov :
또한 선택을 시도하여 위치의 열림을 확인할 수 있습니다. 그리고 몇 가지를 시도하는 것이 좋습니다

         int n = 0 ;
           do
           {
            n++;
           }
           while (! PositionSelectByTicket (tradeResult.deal) && n < 5 );
지연 및 해당 위치가 이미 제자리에 있다는 확인이 있습니다.

그리고 OrderCheck(Request, checkResult) 체크가 없다는 것도 알아차렸습니다.

글쎄요, 가능합니다 . OrderCheck(Request, checkResult)를 삽입하겠습니다 .
감사해요

그러나 나는 이 주기를 별로 좋아하지 않는다.

 
prostotrader :

예, 그리고 시장 주문에서도 - 가격 = 0

Request.price= SymbolInfoDouble ( _Symbol , SYMBOL_BID ); 잊어버려

bool SendOrderSyncMode()
  {
   MqlTradeRequest request={ 0 };
   MqlTradeResult   result={ 0 };
   order_ticket= 0 ;
   request.action = TRADE_ACTION_DEAL ;
   request.magic  = 9876543211 ;
   request.symbol = Symbol ();
   request.volume = 1 ;
   request.price  = 0 ;
   request.type= ORDER_TYPE_BUY ;
   request.comment= "Sync mode" ;
   request.type_filling=ORDER_FILLING_FOK;
   request.type_time= ORDER_TIME_DAY ;
   if ( OrderSend (request,result))
     {
       if ((result.retcode== TRADE_RETCODE_DONE ) || (result.retcode== TRADE_RETCODE_PLACED ))
        {
         if (result.order> 0 )
           {
            order_ticket=result.order;
             Print ( __FUNCTION__ , " Order sent in sync mode" );
             return ( true );
           }
         else
           {
             Print ( __FUNCTION__ , " Error order sent in sync mode! Retcode = " ,result.retcode);
           }
        }
       else
        {
         Print ( __FUNCTION__ , " Error order sent in sync mode! Retcode = " ,result.retcode);
        }
     }
   else
     {
       Print ( __FUNCTION__ , " Order not sent in sync mode." );
     }
   return ( false );
  }
void OnTradeTransaction ( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result)
  {
   switch (trans.type)
     {
       case TRADE_TRANSACTION_HISTORY_ADD :
         if ((order_ticket > 0 ) && (trans.order == order_ticket))
      {
         //Вот здесь и смотрим что произошло
      }
       break ;
     }
  }
이렇게 자세한 설명과 설명... 너무 감사합니다...
그리고 가격에 대해 .... 예, 저는 MT4에 더 익숙합니다. 그리고 거기에서 항상 가격을 설정해야합니다 ...
 
Sergey Chalyshev :

반복합니다

또한 주문 현황과 이미 내역에 나타난 적이 있는지 여부도 확인해야 합니다.

거래소는 포지션이 아닌 주문만 가능합니다.

진지하게?
 
Gennady Mazur :
지연을 두는 것이 옳겠지만 저는 시장에서 일하고 있으며 여기서 티켓은 Results.deal 을 사용하여 얻습니다.
어쨌든 먼저 주문이 전송된 다음 실행됩니다.
 
Sergey Chalyshev :

나는 당신의 미소가 무엇을 의미하는지 이해하지 못합니까?

당신에게서 그런 소식을 들을 줄은 몰랐습니다. 무슨 일시 중지 또는 농담입니까?

OrderSend() 이후에 일시 중지하여 시장 정보와 기록이 업데이트되도록 합니다.
 
Sergey Chalyshev :

나쁜 유전 외환.

...

표현을 선택해주세요. 그렇지 않으면 FOOOORTS 지지자의 유전적 돌연변이에 대해 이야기할 수 있습니다.
 
Sergey Chalyshev :

이미 자리가 있었다면?

아니면 이미 자리가 있는데 주문이 완전히 채워지지 않았습니까?

응. 그리고 나는 헤지(hedge)에 관한 모든 것입니다. 나는 내가 완전히 옳지 않았다는 것을 인정한다. 또는 완전히 잘못되었습니다. :-)