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

 
pivomoe :
괜찮은지 도무지 알 수가 없네요..

여기에는 이해하기 어려운 것이 많이 있습니다. 특히 거래의 순서를 다루다 보면 간혹 부조리한 부분이 있음을 알게 되었습니다.
예를 들어, 포지션을 개설할 때 시장가 주문이 먼저 공식적으로 개설된 다음 포지션으로 전환됩니다. 그러나 이 기관총 시리즈 거래 중에 포지션은 이미 열려 있지만 주문은 아직 마감되지 않은 상황이 있습니다. 동일한 이벤트임은 분명하지만 거래가 조각별로 정리되어 순차적으로 발행되며, 이러한 접근 방식으로는 시장 주문이 포지션으로 변환되는 것을 정확하게 반영하는 것이 기본적으로 불가능합니다.

제 생각에는 거래 통제를 구성하는 것이 가장 좋습니다. 거래 주문 을 기억하고 acc에 존재한다는 사실만으로 주문과 포지션의 구성을 통제하십시오. 기울기.
 

새에 대해 이야기합니다.

이러한 제로 비용 거래에서 시장가 주문이 발행된다는 사실을 알고 계셨습니까?
여기에서 예를 들어 한 사람이 1.2000, Sl= 1.1000, Tr=1.3000의 가격으로 매수 포지션을 열기를 원합니다.
이 작업을 실행할 때 가장 먼저 나타나는 것은 다음 데이터와 함께 시장 주문을 반영하는 트랜잭션입니다.
Sl= 1.1000, Тр=1.3000, 즉 주어진 숫자와 가격 = 0(0과 같음). 가격이 0인 이러한 시장 주문 :) 그리고 원하는 것을 생각하십시오.

 
pivomoe :

편안함을 위해. MqlTradeTransaction 에서 작은 함수가 호출됩니다. 클래스의 요소를 열거하여 원하는 요소가 있는 위치입니다. 그리고 이미 이 요소에 대해 유용한 작업을 수행하는 클래스 함수 중 하나가 호출됩니다.


정확히 무엇을 받고 싶은지 자세히 설명해 주세요. 왜 OnTradeTransaction에서 전화를 걸고 있습니까?

먼저 말만 하면 올바른 방향으로 교정해 드립니다.

 
User_mt5 :
긴(시간 내) 알고리즘을 구현하는 사용자 지정 함수 Abc()가 실행됩니다.
이 기능 을 실행 하는 동안 거래, 타이머 등의 이벤트가 발생합니다.
Abc() 함수의 실행을 완료하지 않고 이러한 이벤트가 발생했다는 사실을 알 수 있습니까?

아니요. 하나의 기능이 계산되는 동안 다른 모든 기능은 건너뜁니다.

이것은 Sleep() 함수 와 유사합니다. 즉, 함수가 매우 오랜 시간 동안 계산되는 동안 해당 동작은 Sleep과 유사합니다. 다른 모든 이벤트는 건너뜁니다.

 
User_mt5 :

...


절대적으로 모든 것은 OnTradeTransaction에서 투명합니다.

첫째: MqlTradeTransaction 구조는 무역 거래 유형( ENUM_TRADE_TRANSACTION_TYPE ) 에 따라 다르게 채워집니다 .

여기를 읽으십시오: 무역 거래 구조(MqlTradeTransaction))

두 번째: 결과를 시각화하기 위해 OrderSendAsync 예제에서 이 코드 블록을 가져올 수 있습니다.

 //+------------------------------------------------------------------+ 
//| TradeTransaction function                                        | 
//+------------------------------------------------------------------+ 
void OnTradeTransaction ( const MqlTradeTransaction &trans, 
                         const MqlTradeRequest &request, 
                         const MqlTradeResult &result) 
  { 
//--- получим тип транзакции в виде значения перечисления  
   ENUM_TRADE_TRANSACTION_TYPE type=( ENUM_TRADE_TRANSACTION_TYPE )trans.type; 
//--- если транзакция является результатом обработки запроса, выведем только её название 
   if (type== TRADE_TRANSACTION_REQUEST ) 
     { 
       Print ( EnumToString (type)); 
       //--- выведем строковое описание обработанного запроса 
       Print ( "------------RequestDescription\r\n" ,RequestDescription(request)); 
       //--- выведем описание результата запроса 
       Print ( "------------ResultDescription\r\n" ,TradeResultDescription(result)); 
       //--- запомним тикет ордера для его удаления на следующей обработке в OnTick() 
       if (result.order!= 0 ) 
        { 
         //--- удалим этот ордер по его тикету при следующем вызове OnTick() 
         order_ticket=result.order; 
         Print ( " Тикет отложенного ордера " ,order_ticket, "\r\n" ); 
        } 
     } 
   else // для транзакций другого типа выведем полное описание 
//--- выведем описание полученной транзакции в Журнал 
       Print ( "------------TransactionDescription\r\n" ,TransactionDescription(trans));
 
//---      
  } 
//+------------------------------------------------------------------+ 
//| Возвращает текстовое описание транзакции                         | 
//+------------------------------------------------------------------+ 
string TransactionDescription( const MqlTradeTransaction &trans) 
  { 
//---  
   string desc= EnumToString (trans.type)+ "\r\n" ; 
   desc+= "Symbol: " +trans.symbol+ "\r\n" ; 
   desc+= "Deal ticket: " +( string )trans.deal+ "\r\n" ; 
   desc+= "Deal type: " + EnumToString (trans.deal_type)+ "\r\n" ; 
   desc+= "Order ticket: " +( string )trans.order+ "\r\n" ; 
   desc+= "Order type: " + EnumToString (trans.order_type)+ "\r\n" ; 
   desc+= "Order state: " + EnumToString (trans.order_state)+ "\r\n" ; 
   desc+= "Order time type: " + EnumToString (trans.time_type)+ "\r\n" ; 
   desc+= "Order expiration: " + TimeToString (trans.time_expiration)+ "\r\n" ; 
   desc+= "Price: " + StringFormat ( "%G" ,trans.price)+ "\r\n" ; 
   desc+= "Price trigger: " + StringFormat ( "%G" ,trans.price_trigger)+ "\r\n" ; 
   desc+= "Stop Loss: " + StringFormat ( "%G" ,trans.price_sl)+ "\r\n" ; 
   desc+= "Take Profit: " + StringFormat ( "%G" ,trans.price_tp)+ "\r\n" ; 
   desc+= "Volume: " + StringFormat ( "%G" ,trans.volume)+ "\r\n" ; 
   desc+= "Position: " +( string )trans.position+ "\r\n" ; 
   desc+= "Position by: " +( string )trans.position_by+ "\r\n" ; 
//--- вернем полученную строку 
   return desc; 
  } 
//+------------------------------------------------------------------+ 
//| Возвращает текстовое описание торгового запроса                  | 
//+------------------------------------------------------------------+ 
string RequestDescription( const MqlTradeRequest &request) 
  { 
//--- 
   string desc= EnumToString (request.action)+ "\r\n" ; 
   desc+= "Symbol: " +request.symbol+ "\r\n" ; 
   desc+= "Magic Number: " + StringFormat ( "%d" ,request.magic)+ "\r\n" ; 
   desc+= "Order ticket: " +( string )request.order+ "\r\n" ; 
   desc+= "Order type: " + EnumToString (request.type)+ "\r\n" ; 
   desc+= "Order filling: " + EnumToString (request.type_filling)+ "\r\n" ; 
   desc+= "Order time type: " + EnumToString (request.type_time)+ "\r\n" ; 
   desc+= "Order expiration: " + TimeToString (request.expiration)+ "\r\n" ; 
   desc+= "Price: " + StringFormat ( "%G" ,request.price)+ "\r\n" ; 
   desc+= "Deviation points: " + StringFormat ( "%G" ,request.deviation)+ "\r\n" ; 
   desc+= "Stop Loss: " + StringFormat ( "%G" ,request.sl)+ "\r\n" ; 
   desc+= "Take Profit: " + StringFormat ( "%G" ,request.tp)+ "\r\n" ; 
   desc+= "Stop Limit: " + StringFormat ( "%G" ,request.stoplimit)+ "\r\n" ; 
   desc+= "Volume: " + StringFormat ( "%G" ,request.volume)+ "\r\n" ; 
   desc+= "Comment: " +request.comment+ "\r\n" ; 
//--- вернем полученную строку 
   return desc; 
  } 
//+------------------------------------------------------------------+ 
//| Возвращает текстовое описание результата обработки запроса       | 
//+------------------------------------------------------------------+ 
string TradeResultDescription( const MqlTradeResult &result) 
  { 
//--- 
   string desc= "Retcode " +( string )result.retcode+ "\r\n" ; 
   desc+= "Request ID: " + StringFormat ( "%d" ,result.request_id)+ "\r\n" ; 
   desc+= "Order ticket: " +( string )result.order+ "\r\n" ; 
   desc+= "Deal ticket: " +( string )result.deal+ "\r\n" ; 
   desc+= "Volume: " + StringFormat ( "%G" ,result.volume)+ "\r\n" ; 
   desc+= "Price: " + StringFormat ( "%G" ,result.price)+ "\r\n" ; 
   desc+= "Ask: " + StringFormat ( "%G" ,result.ask)+ "\r\n" ; 
   desc+= "Bid: " + StringFormat ( "%G" ,result.bid)+ "\r\n" ; 
   desc+= "Comment: " +result.comment+ "\r\n" ; 
//--- вернем полученную строку 
   return desc; 
  }

차트에 첨부될 어드바이저에 삽입합니다. 그런 다음 위치를 수동으로 열거나 닫을 수 있고 "전문가" 탭에서 결과의 출력물을 볼 수 있습니다.

 
Vladimir Karputov :

아니요. 하나의 기능이 계산되는 동안 다른 모든 기능은 건너뜁니다.

이것은 Sleep() 함수 와 유사합니다. 즉, 함수가 매우 오랜 시간 동안 계산되는 동안 해당 동작은 Sleep과 유사합니다. 다른 모든 이벤트는 건너뜁니다.

고맙습니다. 불행하다.
그렇다면 어떻게 PC의 자원을 효과적으로 사용할까요? 다시 루프된 코드와 매개변수의 주기적인 폴링?

 
Vladimir Karputov :

절대적으로 모든 것은 OnTradeTransaction에서 투명합니다.

답변 감사합니다. 기본적으로 제가 한 작업입니다. 지금까지는 이해보다 질문이 더 많았습니다.

 
Vladimir Karputov :

정확히 무엇을 받고 싶은지 자세히 설명해 주세요. 왜 OnTradeTransaction에서 전화를 걸고 있습니까?

먼저 말만 하면 올바른 방향으로 교정해 드립니다.

문제가 OnTradeTransaction에 없다는 것을 깨달았습니다. 내가 겪고 있는 공포를 보십시오:

다음은 코드입니다.

 CPositionInfo PositionInfoKotiryemii,PositionInfoVedygii;
 
 if ( !PositionInfoKotiryemii.Select( "SBRF-3.18" ) ) Print ( "Не удалось выбрать позицию по символ SBRF-3.18 " );
 if ( !PositionInfoVedygii.Select( "SBRF-12.17" )   ) Print ( "Не удалось выбрать позицию по символ SBRF-12.17 " );

 Print (PositionInfoKotiryemii. Symbol (), " Объем " ,PositionInfoKotiryemii. Volume (), " " ,PositionInfoVedygii. Symbol (), " Объем " ,PositionInfoVedygii. Volume ());

그리고 실행 결과는 다음과 같습니다.

2017.09.22 10:30:12 SBRF-12.17 기호로 위치 선택 실패
2017.09.22 10:30:12 볼륨 0.0 볼륨 0.0

2번과 3번 라인을 교환합니다. 즉, 코드는 이제 다음과 같습니다.

CPositionInfo PositionInfoKotiryemii,PositionInfoVedygii;
 
 if ( !PositionInfoVedygii.Select( "SBRF-12.17" )   ) Print ( "Не удалось выбрать позицию по символ SBRF-12.17 " );
 if ( !PositionInfoKotiryemii.Select( "SBRF-3.18" ) ) Print ( "Не удалось выбрать позицию по символ SBRF-3.18 " );
 
 Print (PositionInfoKotiryemii. Symbol (), " Объем " ,PositionInfoKotiryemii. Volume (), " " ,PositionInfoVedygii. Symbol (), " Объем " ,PositionInfoVedygii. Volume ());

나는이 결과를 얻는다.

2017.09.22 10:30:12 SBRF-12.17 기호로 위치 선택 실패
2017.09.22 10:30:12 SBRF-3.18 1.0 SBRF-3.18 1.0

두 경우 모두 컴파일러는 경고를 발행하지 않습니다 . 80줄 및 테스트 설정에 대한 전문가 코드를 첨부했습니다. 브로커 BCS. 버전 1730.

Ошибки - Инструменты - Пользовательский интерфейс - Справка по MetaEditor
Ошибки - Инструменты - Пользовательский интерфейс - Справка по MetaEditor
  • www.metatrader5.com
На данной вкладке отображается журнал компиляции программ, содержащий сообщения об использованных при компиляции файлах, а также ошибки и предупреждения, возникшие в этом процессе. — описание события. Иконки, расположенные слева от описания свидетельствуют о типе события. означает ошибку, — предупреждение, а — информационное сообщение; Если...
파일:
temp.mq5  7 kb
1.png  11 kb
 
pivomoe :

문제가 OnTradeTransaction에 없다는 것을 깨달았습니다. 내가 겪고 있는 공포를 보십시오:

다음은 코드입니다.

그리고 실행 결과는 다음과 같습니다.

2017.09.22 10:30:12 SBRF-12.17 기호로 위치 선택 실패
2017.09.22 10:30:12 볼륨 0.0 볼륨 0.0

2번과 3번 라인을 교환합니다. 즉, 코드는 이제 다음과 같습니다.

나는이 결과를 얻는다.

2017.09.22 10:30:12 SBRF-12.17 기호로 위치 선택 실패
2017.09.22 10:30:12 SBRF-3.18 1.0 SBRF-3.18 1.0

두 경우 모두 컴파일러는 경고를 발행하지 않습니다 . 80줄 및 테스트 설정에 대한 전문가 코드를 첨부했습니다. 브로커 BCS. 버전 1730.

주말에 답변드리겠습니다. 죄송합니다.

 

오류는 한 줄( Print )에서 2개 이상의 위치에 대한 정보를 얻으려고 하는 것 같습니다.

언제든지 1( 선택 ) 위치에 대한 정보만 사용할 수 있습니다 .

- 두 번째 경우에는 마지막 Select가 확인하지 않은 true 를 반환하기 때문에 모든 것이 정확합니다.

- 그리고 첫 번째 경우: 마지막 Select는 false를 반환합니다. 이 역시 확인하지 않았으며 결과는 예측할 수 없습니다.

..... 분명히 Select==false는 이전 Select==true의 정보를 재설정합니다.