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

 

모두 좋은 시간!

CTrade 클래스의 ResultDeal() 함수에 대해 질문이 있습니다.

사실은 전략 테스터 에서 이 함수가 문제 없이 거래 티켓을 반환하고 차트 에 Expert Advisor를 놓을 때 ResultRetcode() 함수가 항상 "TRADE_RETCODE_DONE"을 반환한다는 사실에도 불구하고 항상 "0"을 반환한다는 것입니다.

코드 예:

 /////////////////////////////////////////////////////////////////////
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
/////////////////////////////////////////////////////////////////////
CTrade Trade;
CSymbolInfo SymbolInfo;

uint Retcode;
ulong TicketDeal;
bool first_calc;
bool second_calc;
bool third_calc;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
{
//---
   TicketDeal = 9999999 ;
   
   first_calc = true ;
   second_calc = false ;
   third_calc = false ;   
//---
   return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
{
//---
   if (first_calc)
   {
      first_calc = false ;
      second_calc = true ;
      
      SymbolInfo.Name( Symbol ());
      SymbolInfo.RefreshRates();
      Trade.Buy( 1.0 , Symbol (), SymbolInfo.Ask(), 0.0 , 0.0 , "BUY" );
//---
      Retcode = Trade.ResultRetcode();
       if (Retcode == TRADE_RETCODE_DONE ) TicketDeal = Trade.ResultDeal();
      
       Print ( "first_calc ////////////////////////////////////" );
       Print ( "PositionsTotal(): " , PositionsTotal ());
       Print ( "Retcode: " , Retcode, "; TicketDeal: " , TicketDeal);
   }
   else
   {
       if (second_calc)
      {
         second_calc = false ;
         third_calc = true ;
//---
         Retcode = Trade.ResultRetcode();
         if (Retcode == TRADE_RETCODE_DONE ) TicketDeal = Trade.ResultDeal();
         
         Print ( "second_calc ////////////////////////////////////" );
         Print ( "PositionsTotal(): " , PositionsTotal ());
         Print ( "Retcode: " , Retcode, "; TicketDeal: " , TicketDeal);
      }
       else
      {
         if (third_calc)
         {
            third_calc = false ;
//---
            Retcode = Trade.ResultRetcode();
             if (Retcode == TRADE_RETCODE_DONE ) TicketDeal = Trade.ResultDeal();
            
             Print ( "third_calc ////////////////////////////////////" );
             Print ( "PositionsTotal(): " , PositionsTotal ());
             Print ( "Retcode: " , Retcode, "; TicketDeal: " , TicketDeal);
         }
         else
         {
             //Print("TicketDeal: ", Trade.ResultDeal());
         }
      }
   }   
}
//+------------------------------------------------------------------+

테스터의 실행 로그:

 2020.11 . 25 18 : 08 : 54.225 Core 1    2020.11 . 23 00 : 05 : 00    first_calc ////////////////////////////////////
2020.11 . 25 18 : 08 : 54.225 Core 1    2020.11 . 23 00 : 05 : 00    PositionsTotal (): 1
2020.11 . 25 18 : 08 : 54.225 Core 1    2020.11 . 23 00 : 05 : 00    Retcode: 10009 ; TicketDeal: 2
2020.11 . 25 18 : 08 : 54.225 Core 1    2020.11 . 23 00 : 05 : 02    second_calc ////////////////////////////////////
2020.11 . 25 18 : 08 : 54.225 Core 1    2020.11 . 23 00 : 05 : 02    PositionsTotal (): 1
2020.11 . 25 18 : 08 : 54.225 Core 1    2020.11 . 23 00 : 05 : 02    Retcode: 10009 ; TicketDeal: 2
2020.11 . 25 18 : 08 : 54.225 Core 1    2020.11 . 23 00 : 05 : 05    third_calc ////////////////////////////////////
2020.11 . 25 18 : 08 : 54.225 Core 1    2020.11 . 23 00 : 05 : 05    PositionsTotal (): 1
2020.11 . 25 18 : 08 : 54.225 Core 1    2020.11 . 23 00 : 05 : 05    Retcode: 10009 ; TicketDeal: 2

차트의 실행 로그:

 2020.11 . 25 18 : 08 : 13.991 _TestSelect (EURUSD,M1) first_calc ////////////////////////////////////
2020.11 . 25 18 : 08 : 13.991 _TestSelect (EURUSD,M1) PositionsTotal (): 0
2020.11 . 25 18 : 08 : 13.991 _TestSelect (EURUSD,M1) Retcode: 10009 ; TicketDeal: 0
2020.11 . 25 18 : 08 : 14.026 _TestSelect (EURUSD,M1) second_calc ////////////////////////////////////
2020.11 . 25 18 : 08 : 14.027 _TestSelect (EURUSD,M1) PositionsTotal (): 1
2020.11 . 25 18 : 08 : 14.027 _TestSelect (EURUSD,M1) Retcode: 10009 ; TicketDeal: 0
2020.11 . 25 18 : 08 : 14.260 _TestSelect (EURUSD,M1) third_calc ////////////////////////////////////
2020.11 . 25 18 : 08 : 14.260 _TestSelect (EURUSD,M1) PositionsTotal (): 1
2020.11 . 25 18 : 08 : 14.260 _TestSelect (EURUSD,M1) Retcode: 10009 ; TicketDeal: 0


내가 무엇을 잘못하고 있지? 실시간으로 거래 티켓을 얻는 방법은 무엇입니까?

그리고 두 번째 질문(덜 중요함)은 Chart 에서 거래를 한 직후 PositionsTotal() 함수가 "0"을 반환하는 이유입니다. 그리고 다음 틱의 출현으로 신뢰할 수 있는 데이터를 보여줍니다. 이 정보를 즉시 얻을 수 있습니까?


파일:
 
ZAKST :

모두 좋은 시간!

CTrade 클래스의 ResultDeal() 함수에 대해 질문이 있습니다.

사실은 전략 테스터 에서 이 함수가 문제 없이 거래 티켓을 반환하고 차트 에 Expert Advisor를 놓을 때 ResultRetcode() 함수가 항상 "TRADE_RETCODE_DONE"을 반환한다는 사실에도 불구하고 항상 "0"을 반환한다는 것입니다.

코드 예:

테스터의 실행 로그:

차트의 실행 로그:


내가 무엇을 잘못하고 있지? 실시간으로 거래 티켓을 얻는 방법은 무엇입니까?

그리고 두 번째 질문(덜 중요함)은 차트 에서 거래를 한 직후 PositionsTotal() 함수가 "0"을 반환하는 이유입니다. 그리고 다음 틱의 출현으로 신뢰할 수 있는 데이터를 보여줍니다. 이 정보를 즉시 얻을 수 있습니까?


흠.. 보류 주문을 사용하지 않았는데 갑자기 같은 CTrade 클래스ResultOrder () 함수에서 필요한 실시간 데이터가 반환됩니다.

같은 질문: 내가 뭘 잘못하고 있니?

 

그런 매크로가 있습니다.

 #define Warning if (ComentWarnig)LogWarnig.Write( __FILE__ ":" + IntegerToString ( __LINE__ , 4 , '0' )+ " " ,

저는 이렇게 사용합니다.

Warning "Warnig  сработал. " );

질문: 매크로를 이렇게 사용할 수 있도록 매크로 정의에서 수정해야 할 사항은 무엇입니까?

Warning( "Warnig  сработал. " );

즉, Warning과 "Warnig works" 사이에 대괄호가 있습니다. 매크로 정의에서 대괄호를 사용하려고 했습니다.

 #define Warning( if (ComentWarnig)LogWarnig.Write( __FILE__ ":" + IntegerToString ( __LINE__ , 4 , '0' )+ " " ,

그러나 컴파일러는 괄호를 허용하지 않습니다.

 
ZAKST :

흠.. 보류 주문을 사용하지 않았는데 갑자기 같은 CTrade 클래스ResultOrder () 함수에서 필요한 실시간 데이터가 반환됩니다.

같은 질문: 내가 뭘 잘못하고 있니?

MT5 주문 시스템인 주문-거래-포지션에 익숙해지기만 하면 됩니다.

ResultOrder - 개시 주문. 위치는 이 주문의 티켓과 동일한 POSITION_IDENTIFIER 입니다.

모든 거래는 위치 ID별로 기록에서 찾을 수 있습니다. 포지션 티켓과 혼동하지 않도록 변경될 수 있지만 식별자는 일정합니다.

추신 테스터는 지체없이 주문이 실행되고 즉시 거래가 발생한다는 점에서 다릅니다. 실생활에서는 시간이 흐르고 주문이 성공적으로 생성되는 시점에는 아직 거래가 없으며 OnTrade 이벤트에 잡아야 합니다.
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Тикет позиции. Уникальное число, которое присваивается каждой вновь открытой позиции. Как правило, соответствует тикету ордера, в результате которого она была открыта, за исключением случаев изменения тикета в результате служебных операций на сервере. Например, начисления свопов переоткрытием позиции. Для нахождения ордера, которым была открыта...
 
pivomoe :

그런 매크로가 있습니다.

나는 이것을 이렇게 사용한다.

질문: 매크로를 이렇게 사용할 수 있도록 매크로 정의에서 수정해야 할 사항은 무엇입니까?

즉, Warning과 "Warnig works" 사이에 대괄호가 있습니다. 매크로 정의에서 대괄호를 사용하려고 했습니다.

그러나 컴파일러는 괄호를 허용하지 않습니다.

매개변수가 아닌 양식을 등록했지만 매개변수 양식을 사용하려고 합니다. 이런 것이 필요합니다

 #define Warning(CUSTOM) ( if (ComentWarnig)LogWarnig.Write( __FILE__ ":" + IntegerToString ( __LINE__ , 4 , '0' )+ "",string(CUSTOM)))


Warning( "Warnig  сработал. " );
 

제가 설명을 잘 못했어요. 먼저 가자. 지금은 다음과 같은 매크로를 사용하고 있습니다.

Warning, "Warnig  сработал. i=" ,i);

다음은 매크로 자체입니다.

 #define Warning if (LogWarnig)MoiLoggerWarnig.Write( __FILE__ ":" + IntegerToString ( __LINE__ , 4 , '0' )

"경고"와 ");" 사이의 매크로 호출에서 임의 유형의 임의 수의 매개변수. 이것은 모두 쓰기 기능을 반복적으로 다시 로드하여 달성됩니다.

문제. 다음과 같이 호출할 수 있도록 매크로에서 수정해야 하는 사항:

Warning( "Warnig  сработал. i=" ,i);
 
pivomoe :

제가 설명을 잘 못했어요. 먼저 가자. 지금은 다음과 같은 매크로를 사용하고 있습니다.

다음은 매크로 자체입니다.

"경고"와 ");" 사이의 매크로 호출에서 임의 유형의 임의 수의 매개변수. 이것은 모두 쓰기 기능을 반복적으로 다시 로드하여 달성됩니다.

문제. 다음과 같이 호출할 수 있도록 매크로에서 수정해야 하는 사항:

답변: 매크로를 반복적으로 다시 로드)

그러나 문자열에 + 연산자를 사용하고 모든 것을 문자열로 변환하는 것이 더 낫습니다. 그러면 많은 매개변수가 있는 함수(및 매크로) 버전이 필요하지 않습니다.

 
Aleksey Mavrin :

MT5 주문 시스템인 주문-거래-포지션에 익숙해지기만 하면 됩니다.

ResultOrder - 개시 주문. 위치는 이 주문의 티켓과 동일한 POSITION_IDENTIFIER 입니다.

모든 거래는 위치 ID별로 기록에서 찾을 수 있습니다. 포지션 티켓과 혼동하지 않도록 변경될 수 있지만 식별자는 일정합니다.

추신 테스터는 지체없이 주문이 실행되고 즉시 거래가 발생한다는 점에서 다릅니다. 실생활에서는 시간이 흐르고 주문이 성공적으로 생성되는 시점에는 아직 거래가 없으며 OnTrade 이벤트에 잡아야 합니다.
답변 해주셔서 감사합니다. 정리하겠습니다))
 
안녕하세요! EA에서 지표 속성에 액세스하는 방법. 예를 들어 표시기 핸들을 알고 있는 Expert Advisor에서 선의 색상을 변경하고 싶습니다. 나는 도움을 찾았지만 아무것도 찾지 못했습니다. 아마도 내가 나쁘게 찾고 있습니까?
 
Tango_X :
안녕하세요! EA에서 지표 속성에 액세스하는 방법. 예를 들어 표시기 핸들을 알고 있는 Expert Advisor에서 선의 색상을 변경하고 싶습니다. 나는 도움을 찾았지만 아무것도 찾지 못했습니다. 아마도 내가 나쁘게 찾고 있습니까?

이에 대한 표시기에는 색상 입력 매개변수가 있어야 합니다. 즉, 사용자 지정 지표 여야 합니다.

사유: