FORTS: 초보자를 돕기 위해 - 페이지 5

 
Mikhail Filimonov :

자주 사용하고 유용한 기능:  

재설계된 GetPositionPrice() 함수:

이 함수는 잘못된 결과를 보여주거나 우리가 원하는 결과가 아닌 결과를 보여줍니다. 나는 이해하기 시작했고, 문서에 쓰여진 것처럼 포지션 ID는 반전 중에(즉, 인/아웃 거래 중에) 변경되지 않는다는 것이 밝혀졌습니다.

https://www.mql5.com/ru/docs/constants/tradingconstants/positionproperties

위치 반전은 ID를 반전으로 이어진 주문의 티켓으로 변경합니다.

귀하의 GetPositionPrice는 반전이 있는 경우 2개 이상의 서로 다른 방향의 위치를 혼합할 수 있으며 이에 대한 평균 가격을 계산합니다. 이러한 평균 포지션 가격에는 실질적인 의미가 없습니다.

그렇다면 역전하는 동안 Position ID가 변경됩니까?

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
후진시 위치 번호는 변경되지 않습니다.
 
그리고 인/아웃 거래로 이전 포지션을 마감한 거래량과 새로운 포지션을 연 거래량을 어떻게 결정할 수 있습니까?
 
igorbel :
그리고 인/아웃 거래로 이전 포지션을 마감한 거래량과 새로운 포지션을 연 거래량을 어떻게 결정할 수 있습니까?
현재 열려있는 것과 비교할 수 있습니다. 하지만 id로 포지션의 히스토리 를 공부하는 것이 좋으며, 플립 중에도 변하지 않는... 매수/매도 물량에 도움이 됩니다.
 
Dennis Kirichenko :
현재 열려있는 것과 비교할 수 있습니다. 하지만 id로 포지션의 히스토리 를 공부하는 것이 좋으며, 플립 중에도 변하지 않는... 매수/매도 물량에 도움이 됩니다.

최근 역전 시 위치 ID가 변경되었습니다. 이에 대한 문서는 이미 업데이트되었습니다....

POSITION_IDENTIFIER

Position ID는 새로 개설된 각 Position에 할당되는 고유 번호로 평생 동안 변경되지 않습니다. 위치를 연 주문 티켓에 해당합니다.

 

포지션 ID는 각 주문(ORDER_POSITION_ID)과 거래(DEAL_POSITION_ID)를 개설, 변경 또는 마감한 순서로 표시됩니다. 이 속성을 사용하여 위치와 연결된 주문 및 거래를 검색합니다.

 

위치 반전은 ID를 반전으로 이어진 주문의 티켓으로 변경합니다.

 
Dennis Kirichenko :
현재 열려있는 것과 비교할 수 있습니다. 하지만 id로 포지션의 히스토리 를 공부하는 것이 좋으며, 플립 중에도 변하지 않는... 매수/매도 물량에 도움이 됩니다.

그것은 전혀 옵션이 아닙니다. 이전 위치는 반전 등으로 인해 열릴 수도 있습니다. 아마도 옵션이지만 분명히 최선은 아닙니다.

 
Andrey Barinov :

최근 역전 시 위치 ID가 변경되었습니다. 이에 대한 문서는 이미 업데이트되었습니다....

POSITION_IDENTIFIER

Position ID는 새로 개설된 각 Position에 할당되는 고유 번호로 평생 동안 변경되지 않습니다. 위치를 연 주문 티켓에 해당합니다.

 

포지션 ID는 각 주문(ORDER_POSITION_ID)과 거래(DEAL_POSITION_ID)를 개설, 변경 또는 마감한 순서로 표시됩니다. 이 속성을 사용하여 위치와 연결된 주문 및 거래를 검색합니다.

 

위치 반전은 ID를 반전으로 이어진 주문의 티켓으로 변경합니다.

이렇게 작성했지만 실제로는 아무것도 변경되지 않습니다.

원하는 경우 내 코드는 다음과 같습니다.

 long pos_id1,pos_id2,pos_id3;
   ulong deal1_ticket=xxx;
   ulong deal2_ticket=xxx;
   ulong deal3_ticket=xxx;
   if (! HistoryDealSelect (deal1_ticket))
       Print ( __FUNCTION__ + ": deal 1 not selected. Error=" , GetLastError ());   
   pos_id1= HistoryDealGetInteger (deal1_ticket, DEAL_POSITION_ID );
   Print ( __FUNCTION__ + ": ticket=" ,deal1_ticket, ", position ID=" ,pos_id1);
   if (! HistoryDealSelect (deal2_ticket))
       Print ( __FUNCTION__ + ": deal 2 not selected. Error=" , GetLastError ());
   pos_id2= HistoryDealGetInteger (deal2_ticket, DEAL_POSITION_ID );
   Print ( __FUNCTION__ + ": ticket=" ,deal2_ticket, ", position ID=" ,pos_id2);
   if (! HistoryDealSelect (deal3_ticket))
       Print ( __FUNCTION__ + ": deal 3 not selected. Error=" , GetLastError ());
   pos_id3= HistoryDealGetInteger (deal3_ticket, DEAL_POSITION_ID );
   Print ( __FUNCTION__ + ": ticket=" ,deal3_ticket, ", position ID=" ,pos_id3);

여기서 deal2_ticket은 인/아웃 딜 티켓이고, deal1_ticket은 인/아웃 딜 이전의 티켓이고, deal3_ticket은 인/아웃 딜 이후의 티켓입니다. 세 가지 경우 모두 동일한 위치 ID를 얻습니다.

 
igorbel :

이렇게 작성했지만 실제로는 아무것도 변경되지 않습니다.

원하는 경우 내 코드는 다음과 같습니다.

여기서 deal2_ticket은 인/아웃 딜 티켓이고, deal1_ticket은 인/아웃 딜 이전의 티켓이고, deal3_ticket은 인/아웃 딜 이후의 티켓입니다. 세 가지 경우 모두 동일한 위치 ID를 얻습니다.

나는 변화하고 있다. 최신 빌드 1340에서 시도하십시오.
 
igorbel :
그리고 인/아웃 거래로 이전 포지션을 마감한 거래량과 새로운 포지션을 연 거래량을 어떻게 결정할 수 있습니까?

네팅 계정의 "기록에 대한 디버그" 모드에서 이 Expert Advisor를 실행하십시오. 예는 거래 내역에 "IN/OUT" 유형 거래가 하나만 있는 것으로 계산되기 때문에 약간 거칠습니다.

 //+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link        "http://wmua.ru/slesar/"
#property version    "1.00"
#include <Trade\Trade.mqh>
CTrade my_trade;
long deal_positions_id_in_out= 0 ;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---

//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   static int t= 0 ;
   if (t== 20 )
     {
      my_trade.Buy( 0.02 );
     }
   if (t== 25 )
     {
      my_trade.Buy( 0.01 );
     }
   if (t== 30 )
     {
      my_trade.Sell( 0.07 );
     }
   if (t== 40 )
     {
      my_trade.PositionClose( Symbol ());
     }
   if (t== 50 )
     {
       //--- request trade history 
       HistorySelect ( 0 , TimeCurrent ());
       long      deal_positions_id= 0 ;
       double    deal_volume= 0 ;
       long      deal_entry= 0 ;
       long      deal_type= 0 ;
       ulong     ticket= 0 ;
       for ( int i= 0 ;i< HistoryDealsTotal ();i++)
        {
         if ((ticket= HistoryDealGetTicket (i))> 0 )
           {
            deal_positions_id= HistoryDealGetInteger (ticket, DEAL_POSITION_ID );
            deal_volume= HistoryDealGetDouble (ticket, DEAL_VOLUME );
            deal_entry= HistoryDealGetInteger (ticket, DEAL_ENTRY );
            deal_type= HistoryDealGetInteger (ticket, DEAL_TYPE );
             if (deal_entry== DEAL_ENTRY_INOUT )
               deal_positions_id_in_out=deal_positions_id;
             Print ( "DEAL_POSITION_ID " ,deal_positions_id,
                   ", DEAL_VOLUME " , DoubleToString (deal_volume, 2 ),
                   ", DEAL_ENTRY " , EnumToString (( ENUM_DEAL_ENTRY )deal_entry),
                   ", DEAL_TYPE " , EnumToString (( ENUM_DEAL_TYPE )deal_type));
           }
        }
     }
   if (t== 55 )
     {
       //--- request trade history 
       HistorySelect ( 0 , TimeCurrent ());
       long      deal_positions_id= 0 ;
       double    deal_volume= 0 ;
       long      deal_entry= 0 ;
       long      deal_type= 0 ;
       ulong     ticket= 0 ;
       double    volume_in= 0 ;
       double    volume_out= 0 ;
       for ( int i= 0 ;i< HistoryDealsTotal ();i++)
        {
         if ((ticket= HistoryDealGetTicket (i))> 0 )
           {
            deal_positions_id= HistoryDealGetInteger (ticket, DEAL_POSITION_ID );
            deal_volume= HistoryDealGetDouble (ticket, DEAL_VOLUME );
            deal_entry= HistoryDealGetInteger (ticket, DEAL_ENTRY );
            deal_type= HistoryDealGetInteger (ticket, DEAL_TYPE );
             if (deal_positions_id==deal_positions_id_in_out && deal_entry== DEAL_ENTRY_IN )
               volume_in+=deal_volume;
             else if (deal_positions_id==deal_positions_id_in_out && deal_entry== DEAL_ENTRY_INOUT )
               volume_out=deal_volume;
           }
        }
       Print ( "DEAL_POSITION_ID " ,deal_positions_id_in_out,
             ": volume in " , DoubleToString (volume_in, 2 ), ", volume out " , DoubleToString (volume_out, 2 ));
     }
   t++;
  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade ()
  {
//---

  }
//+------------------------------------------------------------------+

첫째, 완료된 모든 거래와 포지션이 완전히 닫힌 후 모든 거래( DEAL_POSITION_ID , DEAL_VOLUME, DEAL_ENTRY,DEAL_TYPE )에 대한 설명이 표시되는 반면 DEAL_POSITION_ID는 IN/OUT 유형의 거래에 대해 기억됩니다.

그런 다음 다시 내역을 살펴보고 DEAL_POSITION_ID의 거래에 대한 모든 항목을 요약합니다.

우리는 다음과 같은 것을 얻습니다.

 10 : 58 : 23.963     Test (EURUSD,H1)         2016.01 . 04 00 : 06 : 42    CTrade:: OrderSend : instant buy 0.04 EURUSD at 1.08732 [done at 1.08732 ]
10 : 58 : 30.692     Test (EURUSD,H1)         2016.01 . 04 00 : 07 : 10    DEAL_POSITION_ID 0 , DEAL_VOLUME 0.00 , DEAL_ENTRY DEAL_ENTRY_IN , DEAL_TYPE DEAL_TYPE_BALANCE
10 : 58 : 30.784     Test (EURUSD,H1)         2016.01 . 04 00 : 07 : 10    DEAL_POSITION_ID 2 , DEAL_VOLUME 0.02 , DEAL_ENTRY DEAL_ENTRY_IN , DEAL_TYPE DEAL_TYPE_BUY
10 : 58 : 32.074     Test (EURUSD,H1)         2016.01 . 04 00 : 07 : 10    DEAL_POSITION_ID 2 , DEAL_VOLUME 0.01 , DEAL_ENTRY DEAL_ENTRY_IN , DEAL_TYPE DEAL_TYPE_BUY
10 : 58 : 33.826     Test (EURUSD,H1)         2016.01 . 04 00 : 07 : 10    DEAL_POSITION_ID 2 , DEAL_VOLUME 0.07 , DEAL_ENTRY DEAL_ENTRY_INOUT , DEAL_TYPE DEAL_TYPE_SELL
10 : 58 : 37.237     Test (EURUSD,H1)         2016.01 . 04 00 : 07 : 10    DEAL_POSITION_ID 4 , DEAL_VOLUME 0.04 , DEAL_ENTRY DEAL_ENTRY_OUT , DEAL_TYPE DEAL_TYPE_BUY
10 : 59 : 07.397     Test (EURUSD,H1)         2016.01 . 04 00 : 07 : 19    DEAL_POSITION_ID 2 : volume in 0.03 , volume out 0.07
파일:
Test.mq5  5 kb
 
Andrey Barinov :
나는 변화하고 있다. 최신 빌드 1340에서 시도하십시오.
나는 그것을 시도했다. 귀하의 국가에서 어떤 시장이 변화하고 있습니까?