MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 1110

 
if ( OrderSelect (ticket, SELECT_BY_TICKET)){
       double lots;
       string symbol = OrderSymbol(); 
       while ( true ){
         RefreshRates();
         double price;
         parseClosePrice(OrderType(), symbol, price);
         if (OrderClose(OrderTicket(), OrderLots(), price, 500 )){
             break ;
         } else {
             Print ( GetLastError ());
         }              
         Sleep ( 1000 );
      }   

때때로 오류 4108을 반환합니다. OrderClose에 대한 잘못된 티켓입니다. OrderTicket()이 OrderSelect 의 티켓과 일치하지 않을 수 있습니까? 티켓 변수는 0일 수 있습니다.

오류를 재현하는 데 오랜 시간이 걸리므로 질문하기가 더 쉽습니다.
 
Dmitri Custurov :

때때로 오류 4108을 반환합니다. OrderClose에 대한 잘못된 티켓입니다. OrderTicket()이 OrderSelect의 티켓과 일치하지 않을 수 있습니까? 티켓 변수는 0일 수 있습니다.

오류를 재현하는 데 오랜 시간이 걸리므로 질문하기가 더 쉽습니다.

티켓 으로 주문을 선택합니다 . 선택한 주문이 아직 마감되지 않았습니까? 그런데 동시에 다시 닫으려 하시네요... 티켓에서 선택 성공 후 마감시간을 확인하세요.

 
Artyom Trishkin :

티켓 으로 주문을 선택합니다 . 선택한 주문이 아직 마감되지 않았습니까? 그런데 동시에 다시 닫으려 하시네요... 티켓에서 선택 성공 후 마감시간을 확인하세요.

오류를 재현하면 확인하겠습니다. 전역 변수의 모든 티켓이 저장되어 있습니다. 주문이 마감되면 삭제됩니다. OrderSelect() 티켓이 전역 변수에서 가져오기 전에. 변수에 티켓이 없으면 이 변수는 0이 됩니다. 즉, 주문을 선택하지 않아야 하고 OrderSelect()가 false를 반환합니다. 하지만 네, 확인해 볼 가치가 있습니다. 고맙습니다.

 
Dmitri Custurov :

오류를 재현하면 확인하겠습니다. 전역 변수의 모든 티켓이 저장되어 있습니다. 주문이 마감되면 삭제됩니다. OrderSelect() 티켓이 전역 변수에서 가져오기 전에. 변수에 티켓이 없으면 이 변수는 0이 됩니다. 즉, 주문을 선택하지 않아야 하고 OrderSelect()가 false를 반환합니다. 하지만 네, 확인해 볼 가치가 있습니다. 고맙습니다.

티켓 주문 시 종가를 확인하는 것은 기본입니다. 다른 방법으로, 일반적으로 주문이 마감되어 마감 목록에서 선택되었는지, 아니면 여전히 열려 있고 시장 목록에서 선택되었는지 알 수 없습니다.

가장 근시안적인 것은 티켓을 전역 변수 에 저장하는 것입니다. 거래 환경에서 가져와야 합니다. 현재 최신 정보가 있습니다.

 
Artyom Trishkin :

티켓 주문 시 종가를 확인하는 것은 기본입니다. 다른 방법으로, 일반적으로 주문이 마감되어 마감 목록에서 선택되었는지, 아니면 여전히 열려 있고 시장 목록에서 선택되었는지 알 수 없습니다.

가장 근시안적인 것은 티켓을 전역 변수 에 저장하는 것입니다. 거래 환경에서 가져와야 합니다. 현재 최신 정보가 있습니다.

다음과 같이 선택하면 이론상 OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)가 문제를 부분적으로 해결할 수 있습니까? 다른 이유로 티켓을 전역 변수에 저장하고 동시에 이 경우에 사용했습니다.

 
Dmitri Custurov :

다음과 같이 선택하면 이론상 OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)가 문제를 부분적으로 해결할 수 있습니까? 다른 이유로 티켓을 전역 변수에 저장하고 동시에 이 경우에 사용했습니다.

아니요, 그렇지 않습니다. 티켓으로 선택할 때 풀(MODE_TRADES)은 무시됩니다.

 
Dmitri Custurov :

때때로 오류 4108을 반환합니다. OrderClose에 대한 잘못된 티켓입니다. OrderTicket()이 OrderSelect의 티켓과 일치하지 않을 수 있습니까? 티켓 변수는 0일 수 있습니다.

오류를 재현하는 데 오랜 시간이 걸리므로 질문하기가 더 쉽습니다.

일반적으로 시장 주문을 확인하는 것으로 충분합니다.

OrderCloseTime() == 0 //주문이 열려 있습니다.

OrderCloseTime() > 0 //주문 마감

지정가 주문의 경우 종가 도 확인해야 합니다. 0이면 지정가 주문이 취소된 것입니다.

 
답변해주셔서 모두 감사합니다, 알겠습니다 :)
 

안녕하세요!

PositionClosePartial 메서드를 사용하여 코드를 공유할 수 있는 사람.

이론적으로 어떻게 작동하는지 이해하지만 작동하는 코드를 보고 싶습니다.

또는 어디를 봐야 하는지 조언해 주십시오.

미리 감사드립니다.

 
odyn :

안녕하세요!

PositionClosePartial 메서드를 사용하여 코드를 공유할 수 있는 사람.

이론적으로 어떻게 작동하는지 이해하지만 작동하는 코드를 보고 싶습니다.

또는 어디를 봐야 하는지 조언해 주십시오.

미리 감사드립니다.

거의 한 줄의 코드입니다. 그러나 그것을 위해서는 포지션 티켓이 필요합니다. 다음은 0.2가 많은 포지션을 열고 OnTick에서 포지션의 절반을 마감하는 OnInit의 Expert Advisor입니다.

 //+------------------------------------------------------------------+
//|                                                           00.mq5 |
//|                                          © 2020, Alexey Viktorov |
//|                     https://www.mql5.com/ru/users/alexeyvik/news |
//+------------------------------------------------------------------+
#property copyright "© 2020, Alexey Viktorov"
#property link        "https://www.mql5.com/ru/users/alexeyvik/news"
#property version    "1.00"

#include <Trade\Trade.mqh>
CTrade trade;
ulong posTicket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
 {
  trade.SetExpertMagicNumber( 111 );
  trade.PositionOpen( _Symbol , ORDER_TYPE_BUY , 0.2 , SymbolInfoDouble ( _Symbol , SYMBOL_ASK ), 0.0 , 0.0 );
   return ( INIT_SUCCEEDED );
 }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
 {
//---
 }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
 {
   if ( PositionSelectByTicket (posTicket) && PositionGetDouble ( POSITION_VOLUME ) > 0.1 )
    trade.PositionClosePartial(posTicket, 0.1 );
 }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction ( const MqlTradeTransaction & trans,
                         const MqlTradeRequest & request,
                         const MqlTradeResult & result)
 {
//---
   if (trans.type == TRADE_TRANSACTION_HISTORY_ADD )
   {
     if ( PositionSelectByTicket (trans.position) && PositionGetInteger ( POSITION_MAGIC ) == 111 && PositionGetString ( POSITION_SYMBOL ) == _Symbol )
      posTicket = PositionGetInteger ( POSITION_TICKET );
   }
 }
//+------------------------------------------------------------------+

또는 다음은 CTrade 클래스 의 전체 코드입니다.

 //+------------------------------------------------------------------+
//| Partial close specified opened position (for hedging mode only)  |
//+------------------------------------------------------------------+
bool CTrade::PositionClosePartial( const ulong ticket, const double volume, const ulong deviation)
  {
//--- check stopped
   if ( IsStopped ( __FUNCTION__ ))
       return ( false );
//--- for hedging mode only
   if (!IsHedging())
       return ( false );
//--- check position existence
   if (! PositionSelectByTicket (ticket))
       return ( false );
   string symbol= PositionGetString ( POSITION_SYMBOL );
//--- clean
   ClearStructures();
//--- check filling
   if (!FillingCheck(symbol))
       return ( false );
//--- check
   if (( ENUM_POSITION_TYPE ) PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_BUY )
     {
       //--- prepare request for close BUY position
      m_request.type = ORDER_TYPE_SELL ;
      m_request.price= SymbolInfoDouble (symbol, SYMBOL_BID );
     }
   else
     {
       //--- prepare request for close SELL position
      m_request.type = ORDER_TYPE_BUY ;
      m_request.price= SymbolInfoDouble (symbol, SYMBOL_ASK );
     }
//--- check volume
   double position_volume= PositionGetDouble ( POSITION_VOLUME );
   if (position_volume>volume)
      position_volume=volume;
//--- setting request
   m_request.action   = TRADE_ACTION_DEAL ;
   m_request.position =ticket;
   m_request.symbol   =symbol;
   m_request.volume   =position_volume;
   m_request.magic    =m_magic;
   m_request.deviation=(deviation== ULONG_MAX ) ? m_deviation : deviation;
//--- close position
   return ( OrderSend (m_request,m_result));
  }
파일:
00.mq5  5 kb