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

 

mql5 (헤지)

구현 방법   포지션을 2로 마감 하는 알고리즘   정황?

1건.   만약 2개의 포지션이 열려있다면, 이익이 더 많은 포지션을 닫습니다... 2번째 경우. 2개 이상의 포지션이 열리면 값을 평균화하여 닫습니다...

이제 두 가지 방법을 사용하여 그러한 위치를 닫습니다.

첫 번째 경우에는 이익으로 포지션을 비교하고 이익이 더 높은 포지션을 청산하고, 두 번째 경우에는 모든 포지션을 평균화하여 주식으로 청산합니다.

이러한 방법은 개별적으로는 잘 작동하지만 함께는 그렇지 않습니다.   두 이벤트 중 하나가 두 방법의 분포에 속하기 때문입니다.

그리고 나는 그것들을 분리할 수 없는 것 같다. 결과적으로 두 경우 모두 주식에 의해 주로 마감되며 모든 포지션이 마감됩니다. 이로 인해 첫 번째 경우 원하는 위치가 삭제되고 다시 열립니다.

결과적으로. 더블 스프레드, 더블 커미션. 짜증난다)))

주문 및 포지션 배치 방식은 다음과 같습니다.    SELL의 경우(그리고 SELL 의 경우에만)

주문 제한. SELL_LIMIT _

위치.                   팔다    (항상 주문 사이)

주문을 중지합니다.   SELL_STOP _

첨부된 도표입니다.

클로징 포지션.

하나.   중지 주문이 트리거된 경우, 즉, 동시에   두 개 이상의 포지션이 나타나면 한 포지션을 청산해야 합니다.   이익 이상... (20)

2. 지정가 주문 이 발동된 경우, 즉 두 개 이상의 포지션이 동시에 열려 있는 경우 다음 값으로 평균을 내어 해당 포지션을 청산해야 합니다...(15)

문제. 이 두 메서드를 분리하여 자체 이벤트만 처리하도록 하는 방법은 무엇입니까?

아마도 이 두 가지 조건을 처리하는 다른 방법이 있습니까?

내가 사용하는 방법의 예.

 //+---------------------------------------------------------------------+
//|  -- ЗАКРЫВАЕМ ОДНУ ИЗ ДВУХ ПОЗИЦИЙ С НИЗУ, ГДЕ ПРОФИТ БОЛЬШЕ ЧЕМ ---|
//+---------------------------------------------------------------------+ 
ulong ticket_n= ULONG_MAX ;   double profit= DBL_MIN ;

     if (invert_close == true ) //Проверка на наличие 2х и более поз.
     {
     int positions= PositionsTotal ();
     for ( int i= PositionsTotal ()- 1 ; i>= 0 ; i--)
     {
     ulong tmp_ticket= PositionGetTicket (i);
     if (ticket_n!= 0 )
     {
     double tmp_profit= PositionGetDouble ( POSITION_PROFIT );
     if (tmp_profit>profit+Prof_eqw_niz) // допустим 20
     {
     ticket_n=tmp_ticket;
     profit=tmp_profit;
     }
     }
     }
//-----------
     if (ticket_n!= ULONG_MAX )
     m_trade.PositionClose(ticket_n);
     invert_close = false ;
     Print ( "------  ЗАКРЫЛИ ТОЛСТУЮ ---------" );
     }       

//+---------------------------------------------------------------------+
//|                     Э К В И Т И   ДЛЯ SELL_LIMIT                    |
//+---------------------------------------------------------------------+
   npos_ALL= 0 ; NPos_ALL(npos_ALL);
   if (npos_ALL>=Metod_Eqw && m_account.Equity()>= m_account.Balance()+Prof_eqw) //Допустим 15
   {
   CloseAllPositions();
   Print ( "------  ЗАКРЫЛИ ВСЕ ---------" );
   }
Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
Vladpedro :


위치는 고문이 일하는 기호로 열립니까? 매직넘버 사용?
 
Vladimir Karputov :
위치는 고문이 일하는 기호로 열립니까? 매직넘버 사용

예, 현재 기호에 대해. 예, 마법이 사용됩니다.

 
Vladpedro :

예, 현재 기호에 대해. 예, 마법이 사용됩니다.

두 번째 조건을 설명하십시오. 그것은 무엇을 의미합니까? ( 2개 이상의 포지션이 오픈된 경우, 값당 평균을 내서 마감합니다... )

 
Vladimir Karputov :

두 번째 조건을 설명하십시오. 그것은 무엇을 의미합니까? ( 2개 이상의 포지션이 오픈된 경우, 값당 평균을 내서 마감합니다... )

이는 다음을 의미합니다. 두 개 이상의 포지션이 열려 있고 자기자본 이 잔액보다 일정 값(15라고 가정해 봅시다)만큼 크면 모든 포지션이 닫힙니다.

예를 들어. 3개의 포지션이 오픈되었습니다. 첫 번째에 현재 손실은 -10, 두 번째에는 -5, 세 번째에는 +15의 양으로 이익 +30이며 모든 것을 닫을 수 있습니다.

평균 이익 + 15에 도달하지 않은 경우 포지션은 사전 설정된 SL 또는 TP에서 마감됩니다. (이것은 포지션을 청산 하는 세 번째 조건과 비슷하지만 문제가 없으므로 침묵했습니다.)

 
Vladpedro :

이는 다음을 의미합니다. 두 개 이상의 포지션이 열려 있고 자기자본 이 잔액보다 일정 값(15라고 가정해 봅시다)만큼 크면 모든 포지션이 닫힙니다.

예를 들어. 3개의 포지션이 오픈되었습니다. 첫 번째에 현재 손실은 -10, 두 번째에는 -5, 세 번째에는 +15의 양으로 이익 +30이며 모든 것을 닫을 수 있습니다.

평균 이익 + 15에 도달하지 않은 경우 포지션은 사전 설정된 SL 또는 TP에서 마감됩니다. (이것은 포지션을 청산 하는 세 번째 조건과 비슷하지만 문제가 없으므로 침묵했습니다.)

다음은 두 가지 조건에 대한 전체 코드입니다.

 //+------------------------------------------------------------------+
//|                                       Closing Two conditions.mq5 |
//|                              Copyright © 2020, Vladimir Karputov |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2020, Vladimir Karputov"
#property version    "1.00"
/*
   barabashkakvn Trading engine 3.116
*/
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
//---
CPositionInfo  m_position;                   // object of CPositionInfo class
CTrade         m_trade;                       // object of CTrade class
CSymbolInfo    m_symbol;                     // object of CSymbolInfo class
//--- input parameters
input double    InpProfitTarget      = 15 ;       // Profit target, in deposit money (if Positions > 2)
input ulong     InpDeviation         = 10 ;       // Deviation, in points (1.00045-1.00055=10 points)
input ulong     InpMagic             = 200 ;       // Magic number
//---
bool      m_need_close_all           = false ;     // close all positions
ulong     m_need_close_ticket        = ULONG_MAX ; // close one position
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   if (!m_symbol.Name( Symbol ())) // sets symbol name
     {
       Print ( __FILE__ , " " , __FUNCTION__ , ", ERROR: CSymbolInfo.Name" );
       return ( INIT_FAILED );
     }
//---
   m_trade.SetExpertMagicNumber(InpMagic);
   m_trade.SetMarginMode();
   m_trade.SetTypeFillingBySymbol(m_symbol.Name());
   m_trade.SetDeviationInPoints(InpDeviation);
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   if (m_need_close_all)
     {
       if (IsPositionExists())
        {
         CloseAllPositions();
         return ;
        }
       else
         m_need_close_all= false ;
     }
//---
   if (m_need_close_ticket!= ULONG_MAX )
     {
       //--- close one position
       if (m_position.SelectByTicket(m_need_close_ticket))
        {
         m_trade.PositionClose(m_need_close_ticket); // close a position
         return ;
        }
       else
         m_need_close_ticket= ULONG_MAX ;
     }
//--- calculate all positions
   int total= 0 ;
   for ( int i= PositionsTotal ()- 1 ; i>= 0 ; i--)
       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)
            total++;

   if (total== 2 )
     {
       //--- conditon 1
       ulong tmp_ticket= ULONG_MAX ;
       double tmp_profit= DBL_MIN ;
       for ( int i= PositionsTotal ()- 1 ; i>= 0 ; i--)
         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)
              {
               double profit=m_position.Commission()+m_position.Swap()+m_position.Profit();
               if (profit>tmp_profit)
                 {
                  tmp_profit=profit;
                  tmp_ticket=m_position.Ticket();
                 }
              }
       //---
       if (tmp_ticket!= ULONG_MAX )
         m_need_close_ticket=tmp_ticket;
     }
   else
     {
       if (total> 2 )
        {
         //--- conditon 2
         double profit= 0 ;
         for ( int i= PositionsTotal ()- 1 ; i>= 0 ; i--)
             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)
                  profit+=m_position.Commission()+m_position.Swap()+m_position.Profit();
         //---
         if (profit>=InpProfitTarget)
            m_need_close_all= true ;
        }
     }
  }
//+------------------------------------------------------------------+
//| Is position exists                                               |
//+------------------------------------------------------------------+
bool IsPositionExists( void )
  {
   for ( int i= PositionsTotal ()- 1 ; i>= 0 ; i--)
       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)
             return ( true );
//---
   return ( false );
  }
//+------------------------------------------------------------------+
//| 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 m_symbol
  }
//+------------------------------------------------------------------+
파일:
 
Vladimir Karputov :

다음은 두 가지 조건에 대한 전체 코드입니다.

블라디미르 감사합니다. 나는 그것을 알아 내려고 노력할 것입니다.

나름대로 해결해 보았는데 이 두 조건이 어떻게 분리될 수 있는지 이해가 갑니다.

예를 들어.

3개의 부울 변수를 선언합시다.

위치_1;

Pos_2_Clos_1;

Pos_2_Clos_All;

1. 오픈 포지션 의 수를 확인합니다.

만약에   우리는 1개의 포지션만 열려 있습니다 SE LL 할당   의미:  

Pos_1=참;     Pos_2_Clos_1=거짓;       Pos_2_Clos_All = false ;

2개의 포지션이 열려 있고 자산 금액이 양수이면(SELL_S TOP 주문이 트리거될 때만 발생할 수 있음) 이 이벤트에 부울 값을 할당합니다.

Pos_1= 거짓 ;     Pos_2_Clos_1= ;       Pos_2_Clos_All = false ;

2개의 포지션이 열려 있고 자본 금액이 음수이면(SELL_LIMIT 주문이 트리거될 때만 발생할 수 있음),

Pos_1= 거짓 ;     Pos_2_Clos_1= 거짓 ;       Pos_2_Clos_All = true ;

그게 다인듯...   부울 변수에 대한 검사를 실행하고 자신의 닫는 방법을 할당할 수 있지만 어떤 이유로 이것은 저에게 효과가 없었습니다 ...

나는 여전히 쓸모없는 프로그래머입니다. 아마도 어딘가에서 실수를 저질렀을 것입니다 ...

도와 주셔서 감사합니다)

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

블라디미르 카르푸토프 :

블라디미르. 내가 할 수 없는 일. SELL_STOP 주문이 실행되면 모든 것이 정상입니다. 더 많은 이익을 내는 하나의 포지션만 청산되고,

하지만 SELL_LIMIT가 발동되면 모든 오픈 포지션의 이익의 합산이 아니라 클로징이 잘못 발생하지만, 이익이 더 높은 포지션은 청산되는 것처럼 보입니다.

전에 비슷한 오류가 있었습니다. 이제 나는 이미 그것이 일종의 잼이라고 생각하기 시작했습니다. 아마도 포즈를 세지 않고 여는 것일 수 있습니다.

테스트할 준비가 된 내 코드를 보면 오류가 표시될 수 있습니다. 그러나 코드에도 불일치가 있을 수 있습니다. 아니면 내가 어떻게 든 잘못 설명했습니다 .., 나에게 평균 이익은 무엇입니까.

나는 이제 알고리즘을 다루기 시작했고 앞서 말한 것보다 결과가 다소 복잡하다는 것을 깨달았습니다.

자신의 SL 로 포지션을 청산하기 위한 세 번째 조건은 처음 두 조건의 알고리즘에 오류를 유발할 수 있습니다.

SEL_STOP 케이스가 정상적으로 실행되기 때문에 SELL_LIMIT 케이스에 대해서만 포지션을 닫기 위한 완전한 알고리즘을 다시 한 번 설명하겠습니다. 일단 놔두자.

1. 우리는 처음에 하나의 열린 SELL 포지션 을 가지고 있으며 자체 SL 세트를 가지고 있지만 SELL_LIMIT보다 높으므로 SL은 SELL_LIMIT 이전에 작동하지 않습니다.

2. SELL_LIMIT가 트리거되고 두 번째 SELL 위치가 자체 SL과 함께 나타납니다. 이는 다음 SELL_LIMIT 이전에도 트리거될 수 없습니다.

3. SELL_LIMIT 주문이 실행되면 새로운 SELL_LIMIT 주문이 설정됩니다. (언제나)

4. 열린 SELL 포지션의 수는 1-3 또는 그 이상이 될 수 있으며, 이는 모두 SL이 얼마나 멀리 있는지에 달려 있습니다. 최대 3개가 있는 경우를 고려하십시오. (SL에 한정할 수 있습니다)

이제 포지션을 마감하는 시나리오입니다.

열려있는 경우 pos. 2, 그러면 하나 또는 모든 포지션을 청산 하는 두 가지 시나리오만 가능합니다.

1. Equity 기준으로 잔액이 15 이상인 경우( 모든 포지션은 청산 ), (m_account.Equity()>= m_account.Balance()+15) 여러 포지션을 청산하겠다는 뜻이었습니다. 평균을 내서.

2. 자신의 SL에 의해(하나의 위치가 닫힘).

3. 어떤 조건을 적용할지 모르기 때문에 나머지 한 포지션은 이전에 설정한 경우 마감 조건에서 지워져야 합니다.

SELL_LIMIT 스크립트를 반복하거나 SEL_STOP으로 이동하여 다른 닫기 조건을 따를 수 있습니다. (조건을 재설정)

4. 포지션이 3개 라면 그것도 닫는다   (m_account.Equity()>= m_account.Balance()+15) 또는 그 중 하나가 SL 을 트리거하고 두 위치가 남습니다.

클로징 조건이 정의되지 않은 포지션이 하나 남을 때까지 이 규칙을 적용합니다...

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

블라디미르 카르푸토프 :

블라디미르. 내가 할 수 없는 일. SELL_STOP 주문이 실행되면 모든 것이 정상입니다. 더 많은 이익을 내는 하나의 포지션만 청산되고,

하지만 SELL_LIMIT가 발동되면 모든 오픈 포지션의 이익의 합산이 아니라 클로징이 잘못 발생하지만, 이익이 더 높은 포지션은 청산되는 것처럼 보입니다.

전에 비슷한 오류가 있었습니다. 이제 나는 이미 그것이 일종의 잼이라고 생각하기 시작했습니다. 아마도 포즈를 세지 않고 여는 것일 수 있습니다.

테스트할 준비가 된 내 코드를 보면 오류가 표시될 수 있습니다. 그러나 코드에도 불일치가 있을 수 있습니다. 아니면 내가 어떻게 든 잘못 설명했습니다 .., 나에게 평균 이익은 무엇입니까?

일반적으로 어떤 보류 주문 이 실행되었는지는 중요하지 않습니다. 결국 우리는 포지션을 얻은 다음 해당 포지션의 이익을 계산합니다.

 
Vladimir Karputov :

일반적으로 어떤 보류 주문 이 실행되었는지는 중요하지 않습니다. 결국 우리는 포지션을 얻은 다음 포지션의 이익을 계산합니다.

네, 상관없습니다. 나는 주문과 위치를 지정할 때 내 위치, 내 주문에 대한 "설명"을 할당했기 때문에 차이점을 의심했습니다. 결과적으로 주문이 위치에 들어갈 때 주문 주석을 상속합니다.

그러다 댓글을 통해 입장을 확인하다 혼란이 왔는데... 댓글이 달라졌다. 글쎄, 나는 그것을 수정했다.

귀하의 코드에서 SELL_LIMIT가 작동한 조건에 대해 위치가 어떻게 마감되는지 전혀 찾거나 이해하지 못했습니다. 주식으로.

 if (total== 2 )
   {
//-------------------------------------------------------- conditon 1
       ulong tmp_ticket= ULONG_MAX ;
       double tmp_profit= DBL_MIN ;
       for ( int i= PositionsTotal ()- 1 ; i>= 0 ; i--)
       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)
      {
       double profit=m_position.Commission()+m_position.Swap()+m_position.Profit();
       if (profit>tmp_profit)
      {
      tmp_profit=profit;
      tmp_ticket=m_position.Ticket();
      }
      }
       //---
       if (tmp_ticket!= ULONG_MAX )
      m_need_close_ticket=tmp_ticket;
      }
       else
      {
       if (total== 2 )
        {
//--------------------------------------------------------- conditon 2
         double profit= 0 ;
         for ( int i= PositionsTotal ()- 1 ; i>= 0 ; i--)
         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)
        profit+=m_position.Commission()+m_position.Swap()+m_position.Profit();
//--------
       if (profit>=InpProfitTarget)
         m_need_close_all= true ;
        }
        }

모든 포지션을 폐쇄할 가능성이 있는지 확인하고 플래그를 설정한 것으로 보입니다.

그러나 CloseAllPositions();

 if (m_need_close_all)
   {
   if (IsPositionExists())
   {
   CloseAllPositions();
   return ;
   }
   else
   m_need_close_all= false ;
   }

그런 것이 빠져 있습니다.

 if (m_account.Equity()>= m_account.Balance()+ 15 )

케이스에 대한 모든 직책을 닫아야 하는 경우 - SELL_LIMIT 작업

아마도 동일한 m_account.Equity()>= m_account.Balance()+ 15가 어떻게든 다르게 구현되었습니까?

아니면 정말 당신을 위해 작동하지 않습니까? 아마도 내가 이해에서 평균이 무엇인지 설명하지 않았기 때문일 것입니다.

사유: