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

 
Vladimir Karputov :

거래 주문 실행 후 POSITION이 나타납니다! 주문하지 마십시오!

이 상황을 재현할 수 있는 서버가 있습니다.

 PositionGetTicket ( 0 ) = 73401069 
PositionSelect ( _Symbol ) = true 
OrderGetTicket ( 0 ) = 73401069 
PositionsTotal () = 1
OrdersTotal () = 1 , ORDER_STATE_STARTED


저것들. 우리는 동시에 터미널에 그런 주문이 있습니다

 # 73401069 2019.06 . 08 21 : 42 : 42 buy 1.00 BO Volatility 100 Index 0.5150 0.0000 0.0000 0.5150 0.00 0.00 0.00 Hello! 0


그리고 그와 같은 입장

 # 73401069 2019.06 . 08 21 : 42 : 42 buy 1.00 BO Volatility 100 Index 0.5150 0.0000 0.0000 0.5150 0.00 0.00 0.00 Hello! 0
 
Vladimir Karputov :

그러므로 무엇을 하고 있고 무엇을 받고 싶은지 먼저 말로 설명하십시오. ORDER 대신 "BUY trade order" 및 "SELL trade order"를 사용하십시오. 결과적으로 "BUY 포지션" 또는 "SELL 포지션"을 얻습니다.

좋습니다. 대화를 코드의 예제로 단순화하겠습니다. 저는 MQL4로 코드를 작성했습니다. 테스터용 버전, 즉 최소한의 검사 등에 관심이 있습니다.

 //+------------------------------------------------------------------+
//|                                                        tst__.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict

int ticket1=- 1 ;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   ticket1=- 1 ;
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   if (ticket1< 0 ) ticket1= OrderSend ( _Symbol ,OP_BUY, 0.1 ,Ask, 30 , NormalizeDouble (Ask- 100 * _Point , _Digits ), NormalizeDouble (Ask+ 100 * _Point , _Digits ));

   if ( OrderSelect (ticket1,SELECT_BY_TICKET))
     {
       if (OrderCloseTime()> 0 )
        {
         int cmd=OrderType()==OP_BUY ? OP_SELL : OP_BUY;
         double tp = cmd==OP_BUY ? NormalizeDouble (Ask+ 100 * _Point , _Digits ) : NormalizeDouble (Bid- 100 * _Point , _Digits );
         double sl = cmd==OP_BUY ? NormalizeDouble (Ask- 100 * _Point , _Digits ) : NormalizeDouble (Bid+ 100 * _Point , _Digits );
         ticket1= OrderSend ( _Symbol ,cmd, 0.1 ,Ask, 30 ,sl,tp);
        }
     }
  }
//+------------------------------------------------------------------+

TS의 의미: 첫 출시 시 구매 주문을 열고 주문 티켓 을 기억한 다음(티켓에 대해 작업함) 주문이 마감되었는지 확인합니다. 주문 유형을 보고 반대 주문을 합니다. 티켓 등을 원으로 기억하십시오.

SB CTrade를 사용하여 MQL5에서 재현하려면 비슷한 예가 필요합니다.

 
Igor Makanu :

좋아, 대화를 코드의 예제로 단순화합시다. 저는 MQL4로 코드를 작성했습니다. 테스터용 버전, 즉 최소 검사 등에 관심이 있습니다.

TS의 의미: 첫 출시 시 구매 주문을 열고 주문 티켓 을 기억한 다음(티켓에 대해 작업함) 주문이 마감되었는지 확인합니다. 주문 유형을 보고 반대 주문을 합니다. 티켓 등을 원으로 기억하십시오.

SB CTrade를 사용하여 MQL5에서 재현하려면 비슷한 예가 필요합니다.

이제 어린 양이 당신에 대해 생각하는 모든 것을 말할 것입니다))))
 
Alexey Viktorov :
이제 어린 양이 당신에 대해 생각하는 모든 것을 말할 것입니다))))

그에게 말하게 하십시오. 그러나 티켓 번호로 포지션 이 열려 있는지 닫혀 있는지 알아야 합니다. 닫혀 있는 경우 닫힌 위치 에 어떤 유형 의 거래 주문 이 있었는지 알아내야 합니다.

(굵게 표시 - 여전히 주문입니다! - TS의 헤지 계정에 있기 때문에)

 
Igor Makanu :

좋아, 대화를 코드의 예제로 단순화합시다. 저는 MQL4로 코드를 작성했습니다. 테스터용 버전, 즉 최소 검사 등에 관심이 있습니다.

두 번째 OrderSend 에 오류가 있습니다. 그리고 정규화가 필요하지 않습니다. 포럼에서 (뿐만 아니라) 코드는 짧을수록 읽기 쉽습니다.
 void OnTick ()
  {
   static int ticket1 = - 1 ;
   
   if (ticket1< 0 ) ticket1= OrderSend ( _Symbol ,OP_BUY, 0.1 ,Ask, 30 ,Ask- 100 * _Point ,Ask+ 100 * _Point );

   if ( OrderSelect (ticket1,SELECT_BY_TICKET) && OrderCloseTime())
    {
     int cmd= 1 -OrderType();
     double open = cmd ? Bid : Ask;
     double tp = open - (cmd ? 1 : - 1 ) * 100 * _Point ;
     double sl = open + (cmd ? 1 : - 1 ) * 100 * _Point ;
     ticket1= OrderSend ( _Symbol ,cmd, 0.1 ,open, 30 ,sl,tp);
    }
  }

SB CTrade를 사용하여 MQL5에서 재현하려면 비슷한 예가 필요합니다.

여기에서 시도해야합니다.

 

따라서 기본의 기초는 포지션 ID( POSITION_IDENTIFIER )이지만 포지션 티켓은 아닙니다. 이것은 네팅 때문에 중요합니다 .

POSITION_IDENTIFIER

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

 

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

 

네팅 모드에서 포지션이 반전되면(단일 인/아웃 거래에 의해) 포지션 ID POSITION_IDENTIFIER는 변경되지 않습니다. 그러나 동시에 POSITION_TICKET은 취소로 이어진 주문의 티켓으로 변경됩니다. 헤지 모드에서는 포지션 반전이 제공되지 않습니다.


따라서 위치 식별자(POSITION_IDENTIFIER)를 기억하고 추적해야 합니다.


이제 작업이 개선되었습니다. 처음 시작할 때 구매 위치를 열고 기억하십시오(주의: 위치 식별자는 기억해야 하지만 티켓은 기억하지 않아야 함). 포지션이 마감된 경우 반대 포지션을 엽니다. 예를 들어 BUY 포지션이 있었다가 닫혔습니다. 즉, SELL 포지션이 즉시 열립니다.


이제 문제를 해결하는 것이 훨씬 쉬울 것입니다.

 
Vladimir Karputov :

이제 문제를 해결하는 것이 훨씬 쉬울 것입니다.

예제를 작성할 때 조금 앞을 내다 보십시오.

 
fxsaber :
두 번째 OrderSend에 오류가 있습니다. 그리고 정규화가 필요하지 않습니다. 포럼에서 (뿐만 아니라) 코드는 짧을수록 읽기 쉽습니다.

예, 알겠습니다. 코드를 즉석에서 작성했습니다. 테스터에서 실행했습니다. 작동합니다. 포럼에 복사했습니다.


fxsaber :

여기에서 시도해야합니다.

그래서 포럼에 도움을 요청했습니다! - SB CTrade의 가능성을 평가하기로 결정했습니다. - 기본 작업을 예로 들었고 지금까지 결과는 부정적이었습니다!


블라디미르 카르푸토프 :

이제 문제를 해결하는 것이 훨씬 쉬울 것입니다.

나는 당신이 포럼의 활성 회원이라는 것을 알고 있습니다. MQL5에서 CTrade SB를 사용하여 내 fxsaber 코드를 재생산하거나 수정해 주실 수 있습니까?

 
Igor Makanu :

예, 알겠습니다. 코드를 즉석에서 작성했습니다. 테스터에서 실행했습니다. 작동합니다. 포럼에 복사했습니다.

Expert Advisor를 쓰기 시작하면 항상 처음부터 시작합니다(권장합니다). 아마도 대부분 On-functions가 있는 헤더로 시작합니다.

 
Igor Makanu :

그래서 포럼에 도움을 요청했습니다! - SB CTrade의 가능성을 평가하기로 결정했습니다. - 기본 작업을 예로 들었고 지금까지 결과는 부정적이었습니다!

더 짧은 예가 있습니다.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

mql5 언어의 특징, 미묘함 및 작업 방법

fxsaber , 2018.02.15 11:48

 OrderCloseBy ( OrderSend ( _Symbol , OP_BUY , 1 , Ask , 0 , 0 , 0 ), OrderSend ( _Symbol , OP_SELL , 1 , Bid , 0 , 0 , 0 ));

테스터가 아니라면 MT5에서는 어렵습니다.

사유: