"플로팅" PositionSelect() 오류 - 페이지 4

 
prostotrader :

다시 한 번 "후보", "의사", "교수" 및 "학자"를 위해.

OnTradeTransaction()에 오는 모든 이벤트 가 손실될 수 있습니다.

따라서 중요한 이벤트 TRADE_TRANSACTION_HISTORY_ADD 가 발생한 후 실수라고 생각합니다.

위치에 대한 터미널의 데이터는 업데이트되지 않습니다!

도움말( https://www.mql5.com/ru/docs/basis/function/events#ontradetransaction ):

터미널에서 또는 OrderSend() / OrderSendAsync() 거래 함수 를 통해 수동으로 전송된 하나의 거래 요청 은 거래 서버에서 여러 개의 연속 거래 거래를 생성할 수 있습니다. 동시에 터미널에서 이러한 거래를 수신하는 순서는 보장되지 않으므로 다른 거래가 도착한 후 일부 거래가 수신될 것으로 예상하여 거래 알고리즘을 구축할 수 없습니다. 또한 서버에서 단말로 전달하는 과정에서 거래가 손실될 수 있습니다.

따라서 이 기능이 필요한 이유가 전혀 명확하지 않습니다. 사용할 필요가 없습니다. 그게 전부입니다. 주문 및 거래 내역을 독립적으로 분석해야 합니다.

 
Dmitry Fedoseev :

도움말( https://www.mql5.com/ru/docs/basis/function/events#ontradetransaction ):

따라서 이 기능이 필요한 이유가 전혀 명확하지 않습니다. 사용할 필요가 없습니다. 그게 전부입니다. 주문 및 거래 내역을 독립적으로 분석해야 합니다.

고맙습니다. 또한, 다른 모든 기능을 사용하실 수 없습니다 :) (불법)
 

주문, 위치 및 거래에 관해서.

도움말에 나와 있는 것처럼 - 거래의 순서는 보장되지 않습니다 - 히스토리로 주문을 이관하는 거래는 거래 거래보다 먼저 받을 수 있습니다.
단말기에서 의 포지션 변경은 각각 거래 거래를 수신한 결과 엄격하게 발생하며, 이를 수신하는 것은 포지션이 변경되었음을 보장합니다.
내역에 대한 주문 이전 거래를 수신하면 해당 주문이 더 이상 활성(개방)되지 않고 주문 내역으로 이전되었음을 보장합니다.


Кроме того, транзакции могут потеряться при доставке от сервера к терминалу.

이 문구에 관해서는.

분명히 비동기 거래가있는 터미널의 초기 버전 중 하나에 대한 문서에서 남아있었습니다. 곧 제거하겠습니다. 죄인은 총에 맞을 것입니다.

 
MQ Alexander :

주문, 위치 및 거래에 관해서.

도움말에 나와 있는 것처럼 - 거래의 순서는 보장되지 않습니다 - 히스토리로 주문을 이관하는 거래는 거래 거래보다 먼저 받을 수 있습니다.
단말기에서 의 포지션 변경은 각각 거래 거래를 수신한 결과 엄격하게 발생하며, 이를 수신하는 것은 포지션이 변경되었음을 보장합니다.
내역에 대한 주문 이전 거래를 수신하면 해당 주문이 더 이상 활성(개방)되지 않고 주문 내역으로 이전되었음을 보장합니다.


이 문구에 관해서는.

분명히 비동기 거래가있는 터미널의 초기 버전 중 하나에 대한 문서에서 남아있었습니다. 곧 제거하겠습니다. 죄인은 총에 맞을 것입니다.

정말 감사합니다!

그리고 처형에 참여할 수 있도록 기관총(최악의 경우 루즈)을 주시겠습니까? :)

 

MQ.알렉산더!

거래와 포지션에 대해 좀 더 자세한 설명을 듣고 싶습니다.

당신이 썼기 때문에:

 Изменение позиции в терминале происходит строго в результате получения сделочной транзакции, соответственно её получение является гарантией того что позиция поменялась.

그리고 실제로 다음과 같은 사실이 밝혀졌습니다.

테스트 엑스퍼트 빌드 1375 데모 오픈(2회 출시)

 //+------------------------------------------------------------------+
//|                                              Test_deff_order.mq5 |
//|                                                   Copyright 2016 |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016"
#property link        "https://www.mql5.com"
#property version    "1.00"
//
uint   order_req_id;
ulong order_ticket;
ulong magic= 987142563 ;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   OrderPlace();
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   
  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction ( const MqlTradeTransaction & trans,
                         const MqlTradeRequest & request,
                         const MqlTradeResult & result)
  {
     switch ( trans.type )
    {
       case TRADE_TRANSACTION_REQUEST :
         if ((order_req_id > 0 ) && (order_req_id==result.request_id))
        {
           if (result.retcode== TRADE_RETCODE_PLACED ) order_ticket=result.order;
        }
       break ;
       case TRADE_TRANSACTION_DEAL_ADD :
         if ((order_ticket!= 0 ) && (trans.order==order_ticket))
        {
         Print ( "Deal done. Ticket: " ,trans.order);
        }
       break ;
       case TRADE_TRANSACTION_HISTORY_ADD :
         if ((order_ticket!= 0 ) && (trans.order==order_ticket))
        {
         Print ( "History done. Ticket: " ,order_ticket);
         if ( HistoryOrderSelect (order_ticket))
         {
           double vol_cur = HistoryOrderGetDouble (order_ticket, ORDER_VOLUME_CURRENT );
           double vol_init = HistoryOrderGetDouble (order_ticket, ORDER_VOLUME_INITIAL );
           datetime time_setup= datetime ( HistoryOrderGetInteger (order_ticket, ORDER_TIME_SETUP ));
           double deals_vol = GetDealsVolume( Symbol (),order_ticket,time_setup);
           Print ( "Volume initial: " ,vol_init, " Volume current: " ,vol_cur, " Deals done: " ,deals_vol);
           if ( PositionSelect ( Symbol ()))
           {
             Print ( "Position exists." );
           }
           else
           {
             Print ( "Position NOT exists." );
           }
         }
        }
       break ;
    }
  }
///----
double GetDealsVolume( const string a_symbol, const ulong a_ticket, const datetime start)
  {
   double volume= 0 ;
   if ( HistorySelect (start- 180 , TimeTradeServer ()+ 180 ))
     {
       int deals= HistoryDealsTotal ();
       if (deals> 0 )
        {
         for ( int i=deals- 1 ; i>= 0 ; i--)
           {
             ulong deal_ticket= HistoryDealGetTicket (i);
             ulong ticket= ulong ( HistoryDealGetInteger (deal_ticket, DEAL_ORDER ));
             if (( ticket> 0 ) && (ticket==a_ticket))
              {
               volume+= HistoryDealGetDouble (deal_ticket, DEAL_VOLUME );
              }
           }
        }
     }
   return ( volume );
  } 
//---
//+------------------------------------------------------------------+
//| Place order                                                      |
//+------------------------------------------------------------------+
void OrderPlace()
{
   ResetLastError ();
   MqlTradeRequest request={ 0 };
   MqlTradeResult   result={ 0 };
  order_ticket= 0 ;
  order_req_id= 0 ;
    
//--- Fill structure
  request.action= TRADE_ACTION_DEAL ; //PENDING;
  request.magic=magic;
  request.symbol= Symbol ();
  request.volume= 1 ;
   double step= SymbolInfoDouble ( Symbol (), SYMBOL_TRADE_TICK_SIZE ); 
  request.price= 0 ; //SymbolInfoDouble(Symbol(), SYMBOL_ASK);//-step;
  request.type = ORDER_TYPE_BUY ; //BUY_LIMIT;
  request.comment = "" ;      
  request.type_filling = ORDER_FILLING_IOC ; ///
  request.type_time = ORDER_TIME_DAY ;
   if ( OrderSendAsync (request, result))
  {
     if (result.retcode== TRADE_RETCODE_PLACED ) 
    {
      order_req_id=result.request_id;
    }
     else
    {
       Print ( __FUNCTION__ , ": Error! Retcode: " , GetLastError ());
    }
  }
   else
  {
     Print ( __FUNCTION__ , ": Order not sent!" );
  }
}   
//+------------------------------------------------------------------+

결과는 다음과 같습니다.

두 번 모두 TRADE_TRANSACTION_HISTORY_ADD 트랜잭션이 먼저 발생했지만

첫 번째 경우에는 위치가 없었지만 두 번째 경우에는 위치가 있었습니다!

이것을 이해하는 방법 ?

터미널 로그를 고정하는 것을 잊었습니다:

 2016.08 . 15 15 : 37 : 14.935 Experts expert Test_deff_order (GAZR- 9.16 ,M1) loaded successfully
2016.08 . 15 15 : 37 : 17.694 Trades   '1007932' : exchange buy 1.00 GAZR- 9.16 at market
2016.08 . 15 15 : 37 : 17.702 Trades   '1007932' : exchange buy 1.00 GAZR- 9.16 at market placed for execution in 8 ms
2016.08 . 15 15 : 37 : 17.721 Trades   '1007932' : deal # 7487011 buy 1.00 GAZR- 9.16 at 13897 done (based on order # 50942179 )
2016.08 . 15 15 : 37 : 46.456 Trades   '1007932' : exchange sell 1.00 GAZR- 9.16 at market, close # 50942179 buy 1.00 GAZR- 9.16 13897
2016.08 . 15 15 : 37 : 46.463 Trades   '1007932' : exchange sell 1.00 GAZR- 9.16 at market, close # 50942179 buy 1.00 GAZR- 9.16 13897 placed for execution in 7 ms
2016.08 . 15 15 : 37 : 46.497 Trades   '1007932' : deal # 7487015 sell 1.00 GAZR- 9.16 at 13892 done (based on order # 50942187 )
2016.08 . 15 15 : 37 : 50.348 Experts expert Test_deff_order (GAZR- 9.16 ,M1) removed
2016.08 . 15 15 : 37 : 51.845 Experts expert Test_deff_order (GAZR- 9.16 ,M1) loaded successfully
2016.08 . 15 15 : 37 : 53.776 Trades   '1007932' : exchange buy 1.00 GAZR- 9.16 at market
2016.08 . 15 15 : 37 : 53.786 Trades   '1007932' : exchange buy 1.00 GAZR- 9.16 at market placed for execution in 9 ms
2016.08 . 15 15 : 37 : 53.807 Trades   '1007932' : deal # 7487017 buy 1.00 GAZR- 9.16 at 13898 done (based on order # 50942195 )
2016.08 . 15 15 : 37 : 58.632 Trades   '1007932' : exchange sell 1.00 GAZR- 9.16 at market, close # 50942195 buy 1.00 GAZR- 9.16 13898
2016.08 . 15 15 : 37 : 58.639 Trades   '1007932' : exchange sell 1.00 GAZR- 9.16 at market, close # 50942195 buy 1.00 GAZR- 9.16 13898 placed for execution in 7 ms
2016.08 . 15 15 : 37 : 58.664 Trades   '1007932' : deal # 7487020 sell 1.00 GAZR- 9.16 at 13892 done (based on order # 50942197 )
2016.08 . 15 15 : 41 : 52.483 Experts expert Test_deff_order (GAZR- 9.16 ,M1) removed
 

prototrader님 , 하지만 제가 당신에게 친밀한 질문을 드리겠습니다. 왜 역사적 주문 은 사랑하고 거래 는 좋아하지 않습니까? :-))

MQ Alexander 는 다음과 같이 말했습니다.

Что касается ордеров, позиций и сделок.

도움말에 나와 있는 것처럼 - 거래의 순서는 보장되지 않습니다 - 히스토리로 주문을 이관하는 거래는 거래 거래보다 먼저 받을 수 있습니다.
터미널 에서 위치 변경은 각각 트랜잭션 트랜잭션 을 수신한 결과 엄격하게 발생하며, 수신은 위치가 변경되었음을 보장합니다.
내역에 대한 주문 이전 거래를 수신하면 해당 주문이 더 이상 활성(개방)되지 않고 주문 내역으로 이전되었음을 보장합니다.

그리고 귀하의 경우

 case TRADE_TRANSACTION_DEAL_ADD


거의 비어...

그리고 또 다른 서정적 인 메모. MT5의 개념에 따르면 역사적 질서의 존재는 일종의 거래 조작을 시도했다는 사실을 반영합니다. 그리고 이것이 이루어졌다는 사실이 아닙니다. 그리고 알아보려면 거래를 시작해야 합니다. 그것은 이미 거래 작업의 결과를 반영합니다. 그런 다음 코드에서 거래를 처리하는 것이 더 논리적입니다...

 
Dennis Kirichenko :

prototrader , 하지만 내가 당신에게 친밀한 질문을 드리겠습니다. 왜 역사적 주문 은 사랑하고 거래 는 좋아하지 않습니까? :-))

MQ Alexander 는 다음과 같이 말했습니다.

그리고 귀하의 경우


거의 비어...

나는 당신의 개인적인 질문에 대답하고 있습니다.

당신은 아마도 FOREX에서 일하고 하나의 주문을 다룰 것입니다.

따라서 이해하지도 못하는 문제에 지속적으로 "올라가"십시오.

자동차에 두 개의 운전대와 두 명의 운전자가 있고 두 사람 모두 자동차만 바라보고 있다고 상상해 보십시오.

도로. 첫 번째 운전자는 두 번째 운전자가 핸들을 돌렸다는 것을 어떻게 알 수 있습니까(오른쪽으로 가봅시다)?

자세히 살펴보십시오.

모든 기본 논리는 시장 주문 실행을 기반으로 하므로,

아직 제한 이 있고 보류 중인 주문 이 있음을 알려드립니다.

완전히 수행할 수는 없지만 부분적으로 수행할 수 있습니다.

 
prostotrader :

자세히 살펴보십시오.

그리고 거기에서 무엇을 보아야 합니까?

TRADE_TRANSACTION_HISTORY_ADD의 경우 실수로 위치 정보를 얻는다는 것을 이해하십니까?

그리고 당신은 이미 이것을 들었습니다 ...
 

prostotrader :

모든 기본 논리는 시장 주문 실행을 기반으로 하므로,

아직 제한 이 있고 보류 중인 주문 이 있음을 알려드립니다.

완전히 수행할 수는 없지만 부분적으로 수행할 수 있습니다.

자기야, 내 원시적인 논리는 네가 판단할 일이 아니야...
 
Dennis Kirichenko :
자기야, 내 원시적인 논리는 네가 판단할 일이 아니야...

그리고 누가 판단할까요?

나는 당신의 발언으로 당신의 능력을 판단합니다!

사진이 확실히 못생겼네요 :(

그래서 "교수"가 더 이해하기 쉬운가요?

그리고 MQ Alexander 가 당신에게 책임을 위임했다는 것을 기억하지 못합니다.