ORDER_POSITION_ID - 페이지 21

 
Mikalas :

...

그러나 나는 이것을 주문을 통해 구현하고 싶었습니다 (부분적으로 실행된 주문은 며칠 "비용"이 듭니다).

...

마이클, 그리고 맞아요! 왜 그들은 그것을 구현하지 않았습니까? 순 위치를 분석할 때 조만간 포함된 주문을 분석하지 않고는 할 수 없다는 사실에 직면하게 될 것임을 이해하십시오. 이 문제를 연구하는데 단 한 달도 투자하지 않고 이 갈퀴를 여러 번 밟은 사람으로서 이 말씀을 드리는 바입니다. :) 또한, 로봇 트레이딩이 한 대가 아니라 여러 대가 동시에 또한 전체 위치에 대한 각 로봇의 기여도를 고려해야 하며 영장 없이는 할 수 없습니다. 필요한 모든 정보는 주문 및 이를 기반으로 하는 거래에 존재하며, 반대로 거래를 단일 순 위치에 일치시키면 정보가 되돌릴 수 없게 삭제됩니다.

그러나 주문 및 거래 분석을 기반으로 시스템을 구축하는 경우 주문의 부분 실행 을 고려해야 합니다. 이렇게 하려면 주문의 가상 버전을 만들고 새로운 거래의 흐름을 제어해야 합니다. 다음 알고리즘이 있습니다.

1. 새로운 거래가 도착했습니다(HistoryDealsTotal() 카운터가 변경되었습니다).

2. 이 거래가 주문에 의해 시작된 경우 하나의 단일 거래를 포함하는 새 주문을 생성합니다(COrder* 주문 = new Order(deal)).

3. 다음으로 이미 존재하는 가상 주문 목록에서 동일한 식별자를 가진 주문을 찾습니다. 그러한 주문이 발견되면 생성된 주문의 거래를 발견된 주문의 거래와 결합하고 속성을 업데이트하고 생성된 주문을 삭제합니다. 동일한 주문이 아직 목록에 없으면 목록에 추가하기만 하면 됩니다.

따라서 시스템은 완전히 결정적입니다. 새로운 거래가 있을 때마다 가상 주문의 상태가 변경되며 실제 주문이 실행에 중단되었거나 이미 기록으로 이동되었는지 여부는 중요하지 않습니다. 우리는 항상 시스템에서 실제로 실행된 볼륨으로 볼 수 있습니다.

 
Contender :
그리고 포지션을 닫고 주문의 채워지지 않은 부분을 제거하지 않으면 다른 포지션이 열립니다(또는 변경)?

좋은 질문!

주문이 유효하면 내역에 없습니다(확실히 확인됨).

물론 유효한 주문은 다른 위치를 열 수 있지만

부분적으로 다시 실행하면 ORDER_POSITION_ID가 할당되지 않습니다.

즉, ORDER_POSITION_ID는 히스토리에서만 볼 수 있습니다.

 
C-4 :

예, 이것은 증권 거래소에서 발생하며 이러한 상황을 고려해야 합니다. 이것은 지정가 주문의 근본적인 단점 중 하나입니다.

귀하의 예에서 다음을 대체 할 수 있다고 생각합니다.

에:

왜냐하면 모든 매수 및 매도 거래는 일종의 주문에 의해 시작됩니다.

아니요, 할 수 없습니다. 청산에 거래가 있지만 티켓이 없기 때문입니다(또는 오히려 ticket = 0 ).

그러나 그들은 가격과 유형(구매 및 판매)이 있으며 물론 IN 및 OUT이 있습니다.

 
C-4 :

마이클, 그리고 맞아요! 왜 그들은 그것을 구현하지 않았습니까? 순 위치를 분석할 때 조만간 포함된 주문을 분석하지 않고는 할 수 없다는 사실에 직면하게 될 것임을 이해하십시오. 이 문제를 연구하는데 단 한 달도 투자하지 않고 이 갈퀴를 여러 번 밟은 사람으로서 이 말씀을 드리는 바입니다. :) 또한, 로봇 트레이딩이 한 대가 아니라 여러 대가 동시에 또한 전체 위치에 대한 각 로봇의 기여도를 고려해야 하며 여기에서도 영장 없이는 할 수 없습니다. 필요한 모든 정보는 주문 및 이를 기반으로 하는 거래에 존재하지만, 거래를 단일 순 포지션으로 매칭하면 반대로 정보를 비가역적으로 삭제합니다.

그러나 주문 및 거래 분석을 기반으로 시스템을 구축하는 경우 주문의 부분 실행 을 고려해야 합니다. 이렇게 하려면 주문의 가상 버전을 만들고 새로운 거래의 흐름을 제어해야 합니다. 다음 알고리즘이 있습니다.

1. 새로운 거래가 도착했습니다(HistoryDealsTotal() 카운터가 변경되었습니다).

2. 이 거래가 주문에 의해 시작된 경우 하나의 단일 거래를 포함하는 새 주문을 생성합니다(COrder* 주문 = new Order(deal)).

3. 다음으로 이미 존재하는 가상 주문 목록에서 동일한 식별자를 가진 주문을 찾습니다. 그러한 주문이 발견되면 생성된 주문의 거래를 발견된 주문의 거래와 결합하고 속성을 업데이트하고 생성된 주문을 삭제합니다. 동일한 주문이 아직 목록에 없으면 목록에 추가하기만 하면 됩니다.

따라서 시스템은 완전히 결정적입니다. 새로운 거래가 있을 때마다 가상 주문의 상태가 변경되며 실제 주문이 실행에 중단되었거나 이미 기록으로 이동되었는지 여부는 중요하지 않습니다. 우리는 항상 시스템에서 실제로 실행된 볼륨으로 볼 수 있습니다.

Vasily, 나는 모든 것을 구현했습니다 (당신과 같지 않지만 나쁘지도 않습니다), 나는 단지 검색 시간을 줄이고 싶었습니다 ...
 
Serj_Che :

문제가 해결되고 관계가 정리되었습니다)

관련 질문이 나왔습니다.

주문이 내역이나 시장에서 어디에 있든 상관없고 티켓이 변경되지 않기 때문에 속성을 보기 위해 티켓으로 주문 을 선택하는 것은 매우 불편합니다.

여기저기서 주문을 찾아야한다는 것이 밝혀졌습니다.

MT4 쿼드러플처럼 하기가 쉽지 않을텐데, 오더가 선택되면 어디에 위치하든 상관없습니다.

MT4 도움말에서:

누가 그것에 대해 생각합니까?

추신: Mikhail이 새로운 것을 생산하지 않기 위해 분기의 지속에 반대하지 않기를 바랍니다.


미칼라스 :

P-4, 토론이 건설적인 방식으로 진행되어 매우 기쁩니다!

따라서 (예를 들어 한 달에) 내 이익이 얼마인지 알기 위해 위치의 "순"가격이 필요합니다.

...

기능에서(지금 사용):

...

질문은 관련이 있습니다. 일반적으로 MetaTrader5 API는 매우 낮은 수준입니다. 하지만... 증권 거래소에서의 거래에는 많은 뉘앙스가 있습니다. 많은 거래가 있는 주문 실행, 거래를 순 포지션에 일치시키고 청산을 통해 이전하는 것, 풍부한 중개 작업 등. 따라서 MetaTrader5 API(및 MT5 자체)는 모든 거래소 터미널이 되어야 합니다.

또 다른 질문은 해당 API를 MQL5로 작성된 상위 레벨 래퍼에 래핑할 수 있고 이를 통해 하위 레벨 MT5 기능을 사용할 수 있다는 것입니다. 내 래퍼에서 Mikhail의 이익 계산 작업은 다음과 같습니다.

 for ( int i = 0 ; i < TransactionsTotal(); i++)
{
     if (TransactionSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
         ENUM_TRANS_TYPE trans_type = TransactionType();
         if (trans_type == TRANS_HEDGE_POSITION)
         {
               if (HedgePositionGetInteger(HEDGE_POSITION_MAGIC) != myMagic) continue ;   // Работаем только со своими позициями.
               if (HedgePositionGetString(HEDGE_POSITION_SYMBOL) != Symbol ()) continue ; // Работаем только с позициями на своем инструменте.
               double profit = HedgePositionGetDouble(HEDGE_POSITION_PROFIT_POINTS); //Профит в пунктах
               double currency = HedgePositionGetDouble(HEDGE_POSITION_PROFIT_CURRENCY); //Профит в валюте депозита.
               double price_open = HedgePositionGetDouble(HEDGE_POSITION_PRICE_OPEN); //Фактическая цена открытия позиции без клирингов и пр. изменений.
               double sl = HedgePositionGetDouble(HEDGE_POSITION_SL); //Узнаем уровень стоп-лосса позиции, если он есть, если нет - вернет нормализованный 0.0.
               if (HedgeOrderSelect(ORDER_SELECTED_INIT)) //Выбираем ордер, открывающий текущую позицию.
              {
                 int deals = HedgeOrderGetInteger(HEDGE_ORDER_DEALS_TOTAL); //Получаем количество сделок, открывающего ордера.
              }
               // Ну и так далее...
         }   
    }
}
 
Mikalas :

아니요, 할 수 없습니다. 청산에 거래가 있지만 티켓이 없기 때문입니다(또는 오히려 ticket = 0 ).

그러나 그들은 가격과 유형(구매 및 판매)이 있으며 물론 IN 및 OUT이 있습니다.

빌어 먹을 권리:

그런 다음 당신에 대한 슬픔.

 
Mikalas :
Vasily, 나는 모든 것을 구현했습니다 (당신과 같지 않지만 나쁘지도 않습니다), 나는 단지 검색 시간을 줄이고 싶었습니다 ...
그런데 로봇의 다방향 입력에 어떻게 대처합니까? 결국 한 전문가 의 시장 진입 은 다른 로봇의 입장에서 탈출구가 될 수 있습니다.
 
Mikalas :

좋은 질문!

주문이 유효하면 내역에 없습니다(확실히 확인됨).

물론 유효한 주문은 다른 위치를 열 수 있지만

부분적으로 다시 실행되고 ORDER_POSITION_ID가 할당되지 않습니다.

즉, ORDER_POSITION_ID는 히스토리에서만 볼 수 있습니다.

여기에 다른 매복이 있습니다. 이 주문에서 실행된 트랜잭션의 일부는 한 위치에 속하고 다른 부분은 다른 새 위치에 속합니다. 그렇다면 문제는 조만간 기록에 기록될 때 어떤 위치 식별자가 할당될 것인가 하는 것입니다.
 
C-4 :
그런데 로봇의 다방향 입력에 어떻게 대처합니까? 결국 한 전문가 의 시장 진입 은 다른 로봇의 입장에서 탈출구가 될 수 있습니다.
교차로가 없습니다.
 
C-4 :
여기에 다른 매복이 있습니다. 이 주문에서 실행된 트랜잭션의 일부는 한 위치에 속하고 다른 부분은 다른 새 위치에 속합니다. 그렇다면 문제는 조만간 기록에 기록될 때 어떤 위치 식별자가 할당될 것인가 하는 것입니다.

완전히 채워진 주문은 열거나 수정한 위치의 ID를 받습니다.

단, 이력(ID)으로만 사용 가능합니다.