OrderSend를 사용하여 MT5에서 올바르게 작동하는 방법 - 페이지 2

 
fxsaber :
이것은 용어 분쟁입니다. 나쁜 상황은 위에서 자세히 설명했습니다. 표준 라이브러리 는 이것을 고려하지도 않습니다.

아니요.

하지만 계속 버티세요. 더 이상 설명하지 않겠습니다.

 
Renat Fatkhullin :

아니요.

하지만 계속 버티세요. 더 이상 설명하지 않겠습니다.

사람들은 포럼에 그것에 대해 씁니다. 그리고 한 번도 아닙니다. 반응은 이렇습니다.

 
fxsaber :

사람들은 포럼에 그것에 대해 씁니다. 그리고 한 번도 아닙니다. 반응은 이렇습니다.

사람들은 스스로 생각하기를 원하지 않지만 다른 사람들이 우리를 위해 그것을 해주기를 원합니다. 불행히도 이것은 그렇습니다.
 
prostotrader :

(MT5 로봇을 사용하여 실제 계정에서 거래한 개인적인 경험에서) 이러한 사건을 해결하는 데 도움을 주시겠습니까?

추가됨

완전 무료 :)

돼지 저금통에 추가

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

OrderSend() 전송 후 서버 응답을 기다리는 중

데니스 사르타코프 , 2016.10.08 15:43

함수는 동기식입니다. 이 기능이 완료되면 기록이 동기식으로 업데이트되지 않습니다.

저는 이렇게 합니다. OnTrade() 및 기타 문제를 어지럽히는 것보다 더 쉽다고 생각합니다.

 bool ClosePosition()
{
   if (! PositionSelect ( _Symbol ))
   {
       return ( false );
   }

   bool    b_Result;
   
   b_Result = m_trade.PositionClose( _Symbol ,mi_Deviation);
   
   if (!b_Result)
   {
       Print ( "The PositionClose() method has failed. Return code=" ,m_trade.ResultRetcode(),
             ". Code description: " ,m_trade.ResultRetcodeDescription());
       return ( false );
   }
   
   if (b_Result)
   {
       if (m_trade.ResultRetcode() == TRADE_RETCODE_DONE )
      {
         while ( PositionSelect ( _Symbol ))
         {
         }
         
         Print ( "The PositionClose() has been successfully executed. Return code=" ,m_trade.ResultRetcode(),
               " (" ,m_trade.ResultRetcodeDescription(), ")" );
         return ( true );
      }
       if (m_trade.ResultRetcode() != TRADE_RETCODE_DONE )
      {
         Print ( "The PositionClose() failed. Return code=" ,m_trade.ResultRetcode(),
               " (" ,m_trade.ResultRetcodeDescription(), ")" );
         return ( false );
      }
   }
   return ( false );
}      
//+------------------------------------------------------------------+

 
prostotrader :
사람들은 스스로 생각하기를 원하지 않지만 다른 사람들이 우리를 위해 그것을 해주기를 원합니다. 불행히도 이것은 그렇습니다.

사람들은 생각만 하는 것이 아니라 결정을 공유하기도 합니다. 불행히도 개발자는 이에 대해 침묵합니다.

이 주제에 대한 문서의 단일 예가 아닙니다. 그리고 이것은 주요 기능입니다.

 
fxsaber :

사람들은 생각만 하는 것이 아니라 결정을 공유하기도 합니다. 불행히도 개발자는 이에 대해 침묵합니다.

이 주제에 대한 문서의 단일 예가 아닙니다. 그리고 이것은 주요 기능입니다.

당신이 위에 준 예, 죄송합니다 - 완전히 넌센스입니다.

이것은 시작할 곳이 아닙니다!

 
prostotrader :

당신이 위에 준 예, 죄송합니다 - 완전히 넌센스입니다.

이것은 시작할 곳이 아닙니다!

내 버전

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

오류, 버그, 질문

fxsaber , 2016.10.09 09:39

OrderSend가 전송되면 이것이 완료되었음을 기억해야 합니다(잠재적인 취약점이 있음). 또한 해당 메시지가 OnTrade에 도착할 때까지 현재 이력(거래 환경)에 주의를 기울이지 마십시오. 그것이 오면 기억해야 할 것은 잊어버려야 합니다.

STORED 데이터가 없으면 MT4와 같이 이력을 신뢰할 수 있습니다.


 
//+------------------------------------------------------------------+
//|                                                    OrderSend.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
//
bool is_busy;
ulong order_ticket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   is_busy= false ; 
   order_ticket= 0 ;
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   if (!is_busy && (order_ticket== 0 )) //Только при выполнении данного условия мы продолжаем работать(кроме отложенного ордера)
   {
     MqlTradeRequest request={ 0 };
     MqlTradeResult   result={ 0 };
     
     if ( PositionSelect ( Symbol ()))
     {
       if ( OrderSend (request, result)
       {
         if (result.retcode== TRADE_RETCODE_PLACED ) //для биржи TRADE_RETCODE_PLACED
         {
           if (result.order> 0 )
           {
             is_busy= true ;
             order_ticket=result.order;
             Print ( "Order plased, ticket = " ,result.order);
           }
           else
           {
             Print ( "Internal error!" );
           }  
         }
         else
         {
           //смотрим причину result.retcode
         }
       }
       else
       {
         Print ( "Order NOT send!" );
       }
     }
     else
     {
     }
   }   
  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction ( const MqlTradeTransaction & trans,
                         const MqlTradeRequest & request,
                         const MqlTradeResult & result)
  {
//--- В зависимости от того, квкой тип ордера мы устанавливали, смотрим, что с ордером произошло
// и только после полного понимания снимаем флаг is_busy=false; order_ticket=0;
// вот и все премудрости OrderSend
   
  }
//+------------------------------------------------------------------+

즐기다.

 
prostotrader :

즐기다.

글쎄, 이것은 내가 위에 쓴 것과 어떻게 다른가요? 좋은 사람은 심지어 나에게 이 주제에 대해 진지한 성경을 던졌습니다.

사람들은 해결책을 찾습니다. 안보리에서도 개발자들 자신이 이것을 가지고 있지 않다는 사실에 관한 것입니다.

 
fxsaber :

글쎄, 이것은 내가 위에 쓴 것과 어떻게 다른가요? 좋은 사람은 심지어 나에게 이 주제에 대해 진지한 성경을 던졌습니다.

사람들은 해결책을 찾습니다. 안보리에서도 개발자들 자신이 이것을 가지고 있지 않다는 사실에 관한 것입니다.

싫어요 - 사용하지 마세요.