초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 1113

 

인사말. 나는 유능한 비디오 "MQL4에서 MQL5로 - Metatrader 5를 위한 Expert Advisor를 다시 작성하는 방법"을 보았습니다.
작가님께 큰 존경을 표합니다. 직접 시도하기로 결정했습니다. 썼다. 아이디어는 다음과 같습니다.
1. 입력에서 dtriger = 1로 설정 - 매수가 열립니다.
2. 입력에 dtriger = -1을 설정했습니다. - Sell이 열립니다.
3. 입력에서 dtriger = 0으로 설정했습니다. 열려 있는 모든 항목이 닫힙니다.
도움말 페이지에서 MT5에서 반대 위치를 유지할 수 없다는 것을 읽었습니다.
그리고 나는 그것들을 가지고 있다.
질문: 현재 위치의 마감을 올바르게 등록하는 방법은 다음과 같습니다.
카운터 열기(역방향).
매우 감사합니다.

 #include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\OrderInfo.mqh>

CPositionInfo   o_position;
CTrade        o_trade;
CSymbolInfo        o_symbol;
COrderInfo         o_order;

input int           triger            = 0 ;
input double     StartLot             = 0.01 ;
input double     lpos_volume       = 1.0 ;
input int           Step         = 10 ;
input int           MagicNumber    = 12345 ;       //      Magic   nuaber
input int           Slippage          = 30 ;         //   slippage

int dtriger;
int dStep;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   dStep = Step ;
   dtriger = triger ;

   if (!o_symbol.Name( Symbol ()))
     return ( INIT_FAILED );
   
   RefreshRates();
   
   o_trade.SetExpertMagicNumber(MagicNumber) ;

   if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_FOK ))
   { 
      o_trade.SetTypeFilling( ORDER_FILLING_FOK );
   }
   else if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_IOC ))
   { 
      o_trade.SetTypeFilling( ORDER_FILLING_IOC );
   }
   else 
   {
      o_trade.SetTypeFilling( ORDER_FILLING_RETURN );
   }
      o_trade.SetDeviationInPoints(Slippage);
   
   if (o_symbol. Digits () == 3 || o_symbol. Digits () == 5 )
   {
      dStep = 10 ;
   }
   
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
       datetime               lpos_time          =         0 ;
       double                 lpos_price_open    =         0.0 ;
       ENUM_POSITION_TYPE    lpos_type           =        - 1 ;
       int                       pos_count               =         0 ;
       double                 sum_profit         = 0 ;
 
   for ( int i = PositionsTotal () - 1 ; i>= 0 ; i--)
   {
       if (o_position.SelectByIndex(i))
      {
         if (o_position. Symbol () == o_symbol.Name() && o_position.Magic() == MagicNumber)
         {
             if (o_position.Time() > lpos_time)
            {  
               lpos_time       = o_position.Time();             //OrderOpenTime();
               lpos_price_open = o_position.PriceOpen();       //OrderOpenPrice();
               lpos_type       = o_position.PositionType() ;   //OrderTipe();
             }  
            
            pos_count++;
            sum_profit = sum_profit + o_position.Commission() + o_position.Swap() + o_position.Profit() ;
          }     
       }     
    }          

   // Считаем кол-во отложенных ордеров
   int stop_count= 0 ;

   for ( int i= OrdersTotal ()- 1 ; i >= 0 ; i--) 
   {
       if (o_order.SelectByIndex(i)) 
      {
         if (o_order. Symbol () == o_symbol.Name() && o_order.Magic() == MagicNumber) 
           stop_count++;
      }
   }

   if (!RefreshRates())
     return ;
     
   if (dtriger == 0 )
   {
      CloseAll();
       return ;               
   } 
   
   // + -----    Откраваем Первый ордер   ++++++++++
 if (pos_count == 0   && stop_count == 0     )
   {
       if ( dtriger == - 1 &&  lpos_type != POSITION_TYPE_SELL )
      {
         o_trade.Sell(StartLot * lpos_volume , o_symbol.Name());   //   S E L L   11111
      }
      
       if ( dtriger == 1 &&  lpos_type != POSITION_TYPE_BUY )
      {
         o_trade.Buy(StartLot * lpos_volume , o_symbol.Name());   //   B U Y    11111
      }
   }
                          

// +  -----   Переворот    ++++++++++++++++++++++++++++   

if (pos_count> 0 )
   {
       if (lpos_type == POSITION_TYPE_BUY )
      {
         if ( dtriger == - 1 )
         {
         o_trade.Sell(StartLot * lpos_volume , o_symbol.Name());   //   S E L L   +++++
         }
      }

       if (lpos_type== POSITION_TYPE_SELL )
      {
         if ( dtriger == 1 )
         {
         o_trade.Buy(StartLot * lpos_volume , o_symbol.Name());       //   B U Y    +++++
         }
      }
   }


   if (pos_count> 0 && stop_count> 0 ) 
     DeleteStopOrders() ;
  
} 
//-----------------------------------------------------------
bool RefreshRates()
{
   if (!o_symbol.RefreshRates())
     return ( false ) ;
     
     if (o_symbol.Ask() == 0 || o_symbol.Bid() == 0 )
       return ( false );
      
     return ( true );
}  
//---  --------------------------------------------------------- 
 bool IsFillingTypeAllowed ( string symbol, int fill_type)
{ 
   int filling = ( int ) SymbolInfoInteger (symbol, SYMBOL_FILLING_MODE ); 
 
   return ((filling && fill_type) == fill_type) ;
} 
 
 //  -------------------------------------------------- 
   void CloseAll()
{
   for ( int index = PositionsTotal ()- 1 ; index >= 0 ; index--)
   {
       if (o_position.SelectByIndex(index))
      {
         if (o_position. Symbol () == o_symbol.Name() && o_position.Magic() == MagicNumber)
         {
            o_trade.PositionClose(o_position.Ticket());
         }
      }  
    } 
 } 
  
 //----------------------------------------------------------- 
 // Delete all pending orders
 //-------------------------------------
 void DeleteStopOrders()
 {
     for ( int i = OrdersTotal () - 1 ; i >= 0 ; i-- ) 
   {
       if (o_order.SelectByIndex(i))
         if (o_order. Symbol () == o_symbol.Name() && o_order.Magic() == MagicNumber)
            o_trade.OrderDelete(o_order.Ticket());
   }
 } 
 
//+------------------------------------------------------------------+
 
procom :

인사말. 나는 유능한 비디오 "MQL4에서 MQL5로 - Metatrader 5를 위한 Expert Advisor를 다시 작성하는 방법"을 보았습니다.
작가님께 큰 존경을 표합니다. 직접 시도하기로 결정했습니다. 썼다. 아이디어는 다음과 같습니다.
1. 입력에서 dtriger = 1로 설정했습니다. 구매가 열립니다.
2. 입력에서 dtriger = -1로 설정 - Sell이 열립니다.
3. 입력에서 dtriger = 0으로 설정했습니다. 열려 있는 모든 항목이 닫힙니다.
도움말 페이지에서 MT5에서 반대 위치를 유지할 수 없다는 것을 읽었습니다.
그리고 나는 그것들을 가지고 있다.
질문: 현재 위치의 마감을 올바르게 등록하는 방법은 다음과 같습니다.
카운터 열기(역방향).
매우 감사합니다.

설명서를 잘 안 읽으신 것 같습니다.

참조: 일반 원칙 - 거래 운영 .

결론: MetaTrader 5에는 네팅 시스템헤징 시스템 이 모두 있습니다.

Общие принципы - Торговые операции - MetaTrader 5
Общие принципы - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
 

그리고 나는 당신의 작업을 다른 방식으로 공식화할 것입니다:

1. dtriger = 1 - 매수를 엽니다.
2. dtrigger = -1 - 매도가 열립니다.
3. dtriger = 0 - 열려 있는 모든 항목이 닫힙니다.

그리고 고문은 다음과 같이 해야 합니다.

  • BUY를 열어야 하는 경우 - 먼저 SELL을 닫아야 합니다(SELL 위치를 닫으라는 명령을 내립니다. 존재 여부는 중요하지 않음)
  • SELL을 열어야 하는 경우 먼저 BUY를 닫아야 합니다(BUY 위치를 닫으라는 명령을 내립니다. 존재 여부는 중요하지 않음)
  • 모든 것을 닫아야 하는 경우 모든 것을 닫으십시오(구매 또는 판매 여부는 중요하지 않음).

구현을 위해서는 두 가지 알고리즘이 필요합니다(고유 식별자도 여기에 포함됨 - 매직 넘버) - 끌 수도 있습니다.

 //+------------------------------------------------------------------+
//| Close positions                                                  |
//+------------------------------------------------------------------+
void ClosePositions( const ENUM_POSITION_TYPE pos_type)
  {
   for ( int i= PositionsTotal ()- 1 ;i>= 0 ;i--) // returns the number of current positions
       if (m_position.SelectByIndex(i))     // selects the position by index for further access to its properties
         if (m_position. Symbol ()==m_symbol.Name() && m_position.Magic()==InpMagic)
             if (m_position.PositionType()==pos_type) // gets the position type
               m_trade.PositionClose(m_position.Ticket()); // close a position by the specified symbol
  }

그리고

 //+------------------------------------------------------------------+
//| Close all positions                                              |
//+------------------------------------------------------------------+
void CloseAllPositions( void )
  {
   for ( int i= PositionsTotal ()- 1 ;i>= 0 ;i--) // returns the number of current positions
       if (m_position.SelectByIndex(i))     // selects the position by index for further access to its properties
         if (m_position. Symbol ()==m_symbol.Name() && m_position.Magic()==InpMagic)
            m_trade.PositionClose(m_position.Ticket()); // close a position by the specified symbol
  }


일반적인 의미는 주기의 모든 위치를 PositionsTotal() -1에서 0으로 우회하는 것입니다. 즉, PositionsTotal()-1에서 0으로, 0에서 PositionsTotal()-1로가 아니라 그것은 중요하다.

 
또 다른 팁: MetaTrader 5에서 작업할 때 주문은 PENDING ORDER 입니다. 따라서 초기 단계에서 생각에 혼란을 일으키지 않도록 "주문"이라는 단어를 기억조차하지 않는 것이 좋습니다.
 
Vladimir Karputov :
또 다른 팁: MetaTrader 5에서 작업할 때 주문은 PENDING ORDER 입니다. 따라서 초기 단계에서 생각에 혼란을 일으키지 않도록 "주문"이라는 단어를 기억조차하지 않는 것이 좋습니다.

또한 매수 및 매도 시장 주문과 CloseBy 마감 주문이 있습니다.

 

시계처럼 정말 감사합니다.

 
procom :

시계처럼 정말 감사합니다.

내 코드에 대한 설명이 필요하면 물어보세요.
 

그럼 너무 친절하세요.
무효가 삽입되어 예비폐쇄를 규정하고 있지만 여기저기서 또 주문이 걸려 있다.

 // +  -----   Переворот    ++++++++++++++++++++++++++++   

if (pos_count> 0 )
   {
       if (lpos_type == POSITION_TYPE_BUY )
      {
         if ( dtriger == - 1 )
         {
         o_trade.PositionClose(o_symbol.Name());
         }
         {
         o_trade.Sell(StartLot * lpos_volume , o_symbol.Name());   //   S E L L   +++++
         }
      }

       if (lpos_type== POSITION_TYPE_SELL )
      {
         if ( dtriger == 1 )
         {
         o_trade.PositionClose(o_symbol.Name());
         }
         {
         o_trade.Buy(StartLot * lpos_volume , o_symbol.Name());       //   B U Y    +++++
         }
      }
   }
 
procom :

그럼 너무 친절하세요.
무효가 삽입되어 예비폐쇄를 규정하고 있지만 여기저기서 또 주문이 걸려 있다.

닫기 작업과 열기 작업을 분리해야 합니다. 즉, 힙에서 이러한 작업을 수행하지 마십시오.
샘플 계획: OnTick()에서 맨 처음에 ExtNeedCloseBuy, ExtNeedCloseSell 및 ExtNeedCloseAll의 세 가지 플래그가 확인됩니다.
그리고 나서 ExtNeedOpenBuy 및 ExtNeedOpenSell의 두 플래그를 확인합니다.
따라서 모든 것이 엄격한 순서로 진행될 것입니다.
그리고 예, 주문이 없습니다. 열린 위치 가 있습니다.
 
procom :

시계처럼 정말 감사합니다.

오프닝 시그널은? 그렇지 않으면 결과가 완전한 코드가 아닙니다. 포지션을 닫고 포지션 도 열어야 합니다...


무역 명령.mq5
#속성 버전 "1.000"

지금까지는 다음 세 가지만 수행합니다.

  • 모든 구매 닫기
  • 모든 판매 닫기
  • 모든 매수 및 매도 마감
이익실현, 손절매 및 추적 기능은 이미 내장되어 있습니다. 누락된 유일한 것은 포지션을 여는 신호에 대한 설명입니다.
Совершение сделок - Торговые операции - MetaTrader 5
Совершение сделок - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
파일: