기고글 토론 "MQL5 소개: 간단한 전문가 자문 및 사용자 지정 지표 작성 방법" - 페이지 3

 

문제 4: 기사에는 다음과 같은 내용이 나와 있습니다:

...이 프로그램에서 주문 보내기 함수를 호출하는 대부분의 경우에 공통적으로 사용되는 값을 요청 구조에 입력해 보겠습니다:

   request.symbol      =Symbol();
   request.volume      =Lots;
   request.tp          =0;
   request.deviation   =0;
   request.type_filling=ORDER_FILLING_AON;

request.symbol 요소에는 거래 작업이 수행되는 상품의 기호 이름이 포함되고, request.volume 요소에는 금융 상품 계약의 값이 포함되며, request.tp 요소에는 TakeProfit 가격 값이 포함됩니다 (일부 경우 주문의 TakeProfit 값이 지정되지 않으므로 request.tp 구조 요소에 0을 넣습니다).....

그런데 요청.tp 구조 요소에 0을 넣는 이유는 무엇일까요? 보류 중인 매수 주문이 있는 경우 request.tp=0은 TP가 항상 현재 입찰가보다 낮다는 것을 의미하기 때문입니다 . 그리고 이러한 TP 값을 가진 주문은 TP 매개변수의 값이 잘못 지정되었기 때문에 거부되거나 서버가 주문을 수락한 후 즉시 현재 입찰가로 체결되어야 합니다.

 

질문 5: 문서에 다음과 같은 내용이 나와 있습니다:

... OnTick 함수( )에서 사용할 로컬 변수와 그 유형을 지정해 보겠습니다:

double h[], l[], ma[], atr_h[], atr_l[],
          lev_h, lev_l, StopLoss,
          StopLevel=_Point*SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL),
          Spread   =NormalizeDouble(SymbolInfoDouble(Symbol(),SYMBOL_ASK) - SymbolInfoDouble(Symbol(),SYMBOL_BID),_Digits);

... StopLevel 변수는 현재 가격에서 주문한 주문까지의 최소 거리(가격 단위)인 STOP_LEVEL 값을 저장하는 데 사용됩니다. 이 값은 포인트 가격(미리 정의된 변수 _Point)과 STOP_LEVEL 값(포인트 단위)의 곱으로 구합니다. SymbolInfoInteger 함수는 STOP_LEVEL 값을 반환합니다. 이 함수의 첫 번째 매개변수는 상품의 심볼 이름이고 두 번째 매개변수는 요청된 속성의 식별자....입니다.

MQL5 참조 매뉴얼에도"SYMBOL_TRADE_STOPS_LEVEL은 현재 종가에서 스톱 주문을 설정하기 위한 최소 증거금(핍 단위 )입니다" 라고 명시되어 있습니다. 제가 보기에 두 경우 모두 불평등을 충족하는 문제입니다.

주문_가격_현재-요청가>=SYMBOL_TRADE_STOPS_LEVEL(Sell_Stop 주문의 경우).

그렇다면 전문가 조언자 코드가 최소 스톱레벨 들여쓰기를 초과할 때 매수(매도)와 스톱로스 사이의 거리를 확인하는 이유는 무엇인가요?

               ...// 새 손절매가 현재 가격에 근접하지 않나요?
               && NormalizeDouble(SymbolInfoDouble(Symbol(),SYMBOL_BID)-StopLoss-StopLevel,_Digits)>0
               
               ...// 새 손절매가 현재 가격에 근접하지 않나요?
               && NormalizeDouble(StopLoss-SymbolInfoDouble(Symbol(),SYMBOL_ASK)-StopLevel,_Digits)>0

모든 경우에 이러한 확인이 필요합니까, 아니면 특정 전략 구현의 특성입니까? 간단히 말해, 최소 스톱레벨 마진이 초과되었는지 확인하기 위해 지정가 주문을 낼 때 항상 매수(매도)와 스톱로스 사이의 거리를 확인해야 하나요?

 
Yedelkin:

그런데 구조 요소 request.tp에 0을 넣는 이유는 무엇일까요? 보류 중인 매수 주문이 있는 경우 요청.tp=0은 TP가 항상 현재 입찰가보다 낮다는 것을 의미하기 때문입니다 . 그리고 이러한 TP 값을 가진 주문은 TP 매개 변수의 값이 잘못 지정되어 거부되거나 서버가 주문을 수락한 후 현재 입찰가로 즉시 체결되어야 합니다.
0은 TP가 없음을 의미합니다.
 
Yedelkin:

간단히 말해, 최소 스톱레벨 마진이 초과되었는지 확인하기 위해 지정가 주문을 낼 때 항상 매수(매도)와 스톱로스 사이의 거리를 확인해야 하나요?

시장에 매우 근접한 설정 주문으로 작업하는 경우 최소 마진을 위해 항상 지정가 주문의 SL/TP/입력 가격 수준을 확인해야 합니다.

시장과 수십, 수백 포인트 떨어진 곳에서 스탑 또는 지정가 주문으로 작업하는 경우에는 이러한 확인을 생략할 수 있습니다.

 
Renat:

시장가에 매우 근접한 설정 주문으로 작업하는 경우 항상 지정가 주문의 SL/TP/입력가 수준을 확인하여 최소 인덴트를 확인해야 합니다.

질문 5.1.

전문가 자문에게 각 지정가 주문에 대해 세 가지 레벨(진입가/SL/TP)을 계산하도록 하고 있습니다.

진입가 레벨이 현재 시장가 대비 얼마나 가깝거나 먼지 미리 알 수 없으므로 최소 증거금 준수 여부를 진입가 레벨을 확인해도 문제가 발생하지 않습니다.

하지만 나머지 두 SL/TP 레벨은 어떤 레벨을 기준으로 확인해야 할까요? 진입가 레벨이 현재 시장가로부터 상당히 멀리 떨어져 있을 수 있기 때문에 현재 시장가를 기준으로 SL/TP 레벨을 확인하는 것은 다소 비논리적이며, 이러한 확인은 모든 관련성을 잃게 됩니다. 그렇기 때문에 전문가 조언자에서 | 진입가-TP(SL)|>SYMBOL_TRADE_STOPS_LEVEL 조건을 확인하도록 제공했습니다. 일반적으로 Expert Advisor는 이러한 조건에서도 잘 작동하지만, EA 코드를 최적화하기 시작했을 때 서버의 대기 주문 처리 관점에서 이러한 확인이 필요한지 궁금했습니다. 전문가 조언자의 코드는이 조건을 확인하는 데 과부하가 걸리지 않습니다 (전문가 조언자의 전략 자체에는 이러한 확인이 필요하지 않음).

다시 말해, 진입가/SL/TP 레벨이 3개인 지정가 주문은 항상 최소 마진에 대해 SL/TP 레벨을 확인해야 하나요? 그렇다면 어떤 레벨(가격) 대비 최소 마진을 확인해야 하나요?

 

내 글을 편집할 수 있는 기능이 누락되었습니다. 그래서 여기에 추가하겠습니다:

= 각 지정가 주문에 대해 전문가 어드바이저는 진입가/SL/TP의 세 가지 레벨을 독립적으로 계산합니다. "시장에 더 가까운지정가 주문 설정 "이라는 목적은 추구하지 않습니다. =

 

보류 중인 레벨의 SL 및 TP는 진입 가격에서 최소 레벨 이상 떨어져 있지 않도록 평가됩니다.

MT4에서도 동일한 방식으로 작동합니다.

 
Renat:

보류 중인 레벨의 SL과 TP는 엔트리 가격에서 최소 레벨 이상 떨어져 있도록 평가됩니다.

MT4에서도 같은 방식으로 작동합니다.

이제 모든 것을 이해했습니다. 처음에는 모든 것이 기사에 따라, 즉 올바르게 수행되었습니다.

그리고 저는 MT4에 익숙하지 않으므로 그러한 질문은 "더미에서"입니다. 감사합니다!

 
Renat:

...시장에 매우 근접한 주문을 설정하는 작업이 있는 경우 항상 지정가 주문의 SL/TP/입력가 레벨을 확인하여 최소 인덴트를 확인하십시오.

...보류중인 레벨의 SL 및 TP는 진입 가격에서 최소 레벨 이상 떨어져 있지 않도록 추정됩니다.

질문 6: 지정가 주문을 할 때 최소 들여쓰기를 확인하면 명확합니다. 이제 오픈 포지션의 TP/SL을 수정할 때 최소 증거금을 확인할 때의 특징에 대해 질문이 있습니다.

상황: 오픈 포지션에는 고정 TP와 "풀업" SL이 있으며, 가격이 유리한 방향으로 움직일 때 고정 TP에 접근합니다. 지정가 주문 설정과 유사하게, 전문가는 오픈 포지션의 TP/SL을 수정하기 위해 주문을 보낼 때마다 TP와 SL 레벨 모두에 대해 최소 들여쓰기를 확인합니다.

그러나 CTrade 클래스의 PositionModify 함수에 대한 설명에서 tp 매개변수는 "테이크프로핏이 트리거될 새 가격(또는 변경이 필요하지 않은 경우 이전 값)"이라고 명시되어 있습니다.

따라서 질문은 이전에 설정한 TP 레벨의 변경이 필요하지 않은 경우 오픈 포지션의 TP/SL을 수정하기 위해 주문을 보낼 때 현재(실제) 가격에서 이 TP 레벨의 최소 마진을 확인해야 하는가? 아니면 이러한 상황에서는 수정하는 SL과 관련하여 최소 마진을 확인하는 것으로 충분합니까?

즉, 오픈 포지션의 TP/SL을 수정하기 위해 주문을 보낼 때 이 TP 레벨이 이미 이전에 설정되어 변경 대상이 아닌 경우 TP와 관련된 최소 마진을 확인하지 않을 수 있습니까? 그리고 수정 주문에서 이전 TP 값을 지정하기 만하면됩니까?

 

"indicator_TP_en.mql5" 파일을 다운로드한 후 "indicator_TP.mql5"로 이름을 변경하세요.