오류, 버그, 질문 - 페이지 2101

 
damirqa :

안녕하세요! https://www.mql5.com/ru/articles/100 에서 MQL5를 배우기 시작했습니다. 코드를 실행했는데 오류 4756이 발생했고 설명서를 살펴보았지만 더 쉬워지지 않았습니다. 좋아요, 간단한 것(경고/인쇄...)부터 시작하겠습니다. 가장 중요한 기능 중 하나는 OrderSend입니다. OrderSend를 사용하는 방법에 대한 forum\documentation 검색을 시작했습니다. 이 기사 https://www.mql5.com/ru/docs/constants/tradingconstants/enum_trade_request_actions 에서 구매 위치를 여는 코드를 보았습니다. 오류 4756 및 retcode 10030을 받았습니다. 10030 - 이것이 OrderSend 속성이라는 것을 깨달았지만 이 속성을 사용하는 방법(다른 사람의 코드를 보았음)과 가장 중요한 것은 무엇을 위한 것인지 이해하지 못했습니다. 그런 다음 https://www.mql5.com/ru/docs/trading/ordersend 를 열고 코드를 복사하고 실행했습니다. 모든 것이 정상이었고 작동했습니다.
그러나 나는 여전히 오류 4756이 나타나는 이유와 10030뿐만 아니라 그것을 제거하는 방법을 이해하지 못합니다.

사이의 코드를 살펴보니

제 생각에는 거의 동일하며 이러한 오류가 나타나는 위치(4756 및 10030)를 보지 못합니다. 손가락으로 가리키며 설명해주세요

구조의 한 필드가 채워지지 않았습니다. 그리고 편차 는 충분하지 않지만 이것은 그러한 실수가 아닙니다.

즉시 실행

즉시 실행 모드(스트리밍 가격의 거래 모드)에서 포지션을 여는 거래 주문. 9개의 필드가 필요합니다.

  • 행동
  • 기호
  • 용량
  • 가격
  • 티피
  • 일탈
  • 유형
  • type_filling

매직 및 댓글 필드를 설정할 수도 있습니다.

시장 실행

시장 실행 모드(시장에서 거래 주문 실행 모드)에서 포지션을 여는 거래 주문. 5개의 필드가 필요합니다.

  • 행동
  • 기호
  • 용량
  • 유형
  • type_filling

매직 및 댓글 필드를 설정할 수도 있습니다.


 

어떤 종류의 업데이트가 도착했는지, 1736, 내용은 무엇이며 어디에서 읽을 수 있습니까?

 

차트에 표시할 표시기 버퍼를 프로그래밍 방식으로 결정할 수 있는 기회를 제공할 것을 제안합니다.

트레이더가 지표를 시작했다고 가정하고 계산에 사용되는 버퍼의 수와 차트에 지표 를 그리는 데 사용되는 버퍼의 수를 모릅니다.

다음을 통해 사용자 지정 지표 참조

int ChartIndicatorGet (
                chart_id , // 차트 ID
    정수              하위 창              // 서브 윈도우 번호
    상수 문자열     indicator_shortname     // 인디케이터의 짧은 이름
);


드로잉 버퍼의 배열을 요청할 수도 있습니다.

int ChartIndicatorGet (
                chart_id , // 차트 ID
    정수              하위 창              // 서브 윈도우 번호
    상수 문자열     indicator_shortname     // 인디케이터의 짧은 이름

int & IndicatorVisualBuffer[] // 그리기 버퍼의 수... );


이렇게 하면 차트에 설치된 알 수 없는 지표로 작업하는 기능이 확장됩니다.

 
Vladimir Pastushak :

차트에 표시할 표시기 버퍼를 프로그래밍 방식으로 결정할 수 있는 기회를 제공할 것을 제안합니다.

트레이더가 지표를 시작했다고 가정하고 계산에 사용되는 버퍼의 수와 차트에 지표 를 그리는 데 사용되는 버퍼의 수를 모릅니다.

를 통해 지표를 참조

int ChartIndicatorGet (
                chart_id , // 차트 ID
    정수              하위 창              // 서브 윈도우 번호
    상수 문자열     indicator_shortname     // 인디케이터의 짧은 이름
);


드로잉 버퍼 배열을 요청할 수도 있습니다.

int ChartIndicatorGet (
                chart_id , // 차트 ID
    정수              하위 창              // 서브 윈도우 번호
    상수 문자열     indicator_shortname     // 인디케이터의 짧은 이름

int & IndicatorVisualBuffer[] // 그리기 버퍼의 수... );


이렇게 하면 차트에 설치된 알 수 없는 지표로 작업하는 기능이 확장됩니다.

무엇을 반환

 int    ChartIndicatorGet (
   long            chart_id,               // идентификатор графика
   int             sub_window             // номер подокна
   const string    indicator_shortname     // короткое имя индикатора
   );

그리고 추가의 용도는 무엇입니까? 입력 매개변수를 추가하고 응답으로 동일한 표시기 핸들을 얻는 것이 좋습니다...

그리고 그것이 어렵지 않다면 어떤 목적으로 그러한 필요가 생겼습니까? 아이러니가 없는 질문. 결국, 어떤 것이 제안된다면, 제 생각에는 제안의 필요성에 대해 설득력 있는 논거를 제시하는 것이 필요합니다.

 
Alexey Viktorov :

무엇을 반환

추가의 용도는 무엇입니까? 입력 매개변수를 추가하고 응답으로 동일한 표시기 핸들을 얻는 것이 좋습니다...

그리고 그것이 어렵지 않다면 어떤 목적으로 그러한 필요가 생겼습니까? 아이러니가 없는 질문. 결국, 어떤 것이 제안된다면, 제 생각에는 제안의 필요성에 대해 설득력 있는 논거를 제시하는 것이 필요합니다.


사용자는 표시기를 넣습니다.

EA는 자동으로 이를 찾아 버퍼 데이터를 가져와 신호를 수신합니다.


지금 이것을 구현하려면 iCustom을 가져와야 하고 어떻게든 매개변수 목록을 규정할 수 있다면 버퍼에 문제가 있는 것입니다....

Copy를 사용하여 프로그래밍 방식으로 버퍼 수를 계산할 수 있지만 프로그래밍 방식으로 그리는 버퍼를 이해하는 것은 불가능합니다...

 
Vladimir Pastushak :

사용자는 표시기를 넣습니다.

EA는 자동으로 이를 찾아 버퍼 데이터를 가져와 신호를 수신합니다.


지금 이것을 구현하려면 iCustom을 가져와야 하고 어떻게든 매개변수 목록을 규정할 수 있다면 버퍼에 문제가 있는 것입니다....

Copy를 사용하여 프로그래밍 방식으로 버퍼 수를 계산할 수 있지만 프로그래밍 방식으로 그리는 버퍼를 이해하는 것은 불가능합니다...

왜 불가능합니까? iCustom()을 통해 INDICATOR_CALCULATIONS 버퍼를 가져올 수 있습니까?

흥미로운 질문이지만 이 주제에 대해 논의할 내용은 아닙니다. 개인적으로 나는 이것이 프로그래머의 작업을 어떻게든 향상시키거나 용이하게 할 수 있는지 의심합니다. 너무 다른 지표가 존재하고 적용 조건이 너무 다릅니다. 그런 다음 그래픽 구성의 유형 을 결정한 다음 다른 것을 결정하고 위시리스트가 눈덩이처럼 커지는 방식을 결정하도록 요청해야 합니다.

 
Alexey Viktorov :

왜 불가능합니까? iCustom()을 통해 INDICATOR_CALCULATIONS 버퍼를 가져올 수 있습니까?

흥미로운 질문이지만 이 주제에 대해 논의할 내용은 아닙니다. 개인적으로 나는 이것이 프로그래머의 작업을 어떻게든 향상시키거나 용이하게 할 수 있는지 의심합니다. 너무 다른 지표가 존재하고 적용 조건이 너무 다릅니다. 그런 다음 그래픽 구성의 유형 을 결정한 다음 다른 것을 결정하고 위시리스트가 눈덩이처럼 커지는 방식을 결정하도록 요청해야 합니다.


이론적으로 기본적으로 표시기에 입력되는 것은 프로그래머의 코드에 대해 말하는 것이 아니라 외부에서 사용할 수 있어야 합니다... 버퍼, 번호, 구성 유형, 색상 및 기타 표준...

 

내가 겪은 문제는 다음과 같습니다.

나는 차트 ID를 1000 또는 10000으로 나눈 나머지를 마술처럼 사용하기로 결정했습니다. 일반적으로 중요하지 않습니다.

그러나 어떤 이유로 다른 ChartID()를 사용하면 나눗셈의 나머지 부분이 갑자기 동일하게 나타납니다. 질문: 왜?

스크립트 확인

 /********************Script program start function*******************/
void OnStart ()
{
   long chartID = ChartID (), d = 100000 ;
   Print ( "ChartID - " , ChartID ());
   Print ( "fmod(ChartID(), " ,  d, ") = " , fmod ( ChartID (), d));
} /*******************************************************************/

결과

 2018.01 . 15 13 : 01 : 45.881 Script 00 EURUSD,M15: removed
2018.01 . 15 13 : 01 : 45.881 00 EURUSD,M15: uninit reason 0
2018.01 . 15 13 : 01 : 45.881 00 EURUSD,M15: fmod ( ChartID (), 100000 ) = 749 12
2018.01 . 15 13 : 01 : 45.881 00 EURUSD,M15: ChartID - 1314725038414749 07
2018.01 . 15 13 : 01 : 45.881 00 EURUSD,M15: initialized
2018.01 . 15 13 : 01 : 45.871 Script Test\ 00 EURUSD,M15: loaded successfully
2018.01 . 15 13 : 01 : 40.361 Script 00 EURUSD,H1: removed
2018.01 . 15 13 : 01 : 40.361 00 EURUSD,H1: uninit reason 0
2018.01 . 15 13 : 01 : 40.361 00 EURUSD,H1: fmod ( ChartID (), 100000 ) = 749 12
2018.01 . 15 13 : 01 : 40.361 00 EURUSD,H1: ChartID - 1314725038414749 08
2018.01 . 15 13 : 01 : 40.361 00 EURUSD,H1: initialized
2018.01 . 15 13 : 01 : 40.351 Script Test\ 00 EURUSD,H1: loaded successfully

나눗셈의 나머지 부분이 정확히 같아야 하기 때문에 각각 74907 및 74908이 표시될 것으로 예상되었습니다.


그리고 이 질문에 대한 답을 듣고 싶습니다.

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

오류, 버그, 질문

알렉세이 빅토 로프 , 2018.01.09 14:21

MT5 테스터 에서 "Edit field" OBJ_EDIT 개체는 그 안에 포함된 값을 편집할 수 없습니다. 이것은 의도된 것입니까 아니면 버그입니까?

터미널과 테스터에서는 MT4가 편집되지만 테스터에서는 MT5가 원하지 않아 개체를 만들 때 프로그래밍 방식으로 입력한 값이 완전히 사라집니다.


 
Alexey Viktorov :

그러나 어떤 이유로 다른 ChartID()를 사용하면 나눗셈의 나머지 부분이 갑자기 동일하게 나타납니다. 질문: 왜?

입력 fmod가 두 배이기 때문입니다. double은 많은 수의 정수를 저장할 수 없습니다. 예를 들어 귀하의 경우:

 Print ( DoubleToString (( double ) 1314725038414749 07 , 0 )); // 1314725038414749 12

이렇게 하세요

 long fmod ( const long Value, const long Value2 )
{
   return (Value % Value2);
}


float를 예로 사용하면 double의 기능을 빠르게 이해할 수 있습니다.

 #define PRINT(A) Print ( #A + " = " + ( string )(A))

void OnStart ()
{
   for ( int i = 0 ; i < INT_MAX ; i++)
     if (( int )( float )i != i)
    {
      PRINT(i);
      PRINT(( float )i);
      PRINT(( double )i);
      
       break ;
    }
}


결과

i = 16777217
( float )i = 16777216.0
( double )i = 16777217.0


ZY double은 전체 범위 내 정보를 잃지 않으며, long에서는 그렇지 않습니다.

 
fxsaber :

입력 fmod가 두 배이기 때문입니다. double은 많은 수의 정수를 저장할 수 없습니다. 예를 들어 귀하의 경우:

이렇게 하세요

물론 이제 제안 된 옵션을 확인하지만 그러한 인증 코드도있었습니다.

 /********************Script program start function*******************/
void OnStart ()
{
   long chartID = ChartID (), d= 100000 ;
   Print ( "ChartID - " , ChartID ());
   Print ( "fmod(ChartID(), " ,  d, ") = " , fmod ( ChartID (), d));
   printf ( "LONG_MAX = %I64d" , LONG_MAX );
   printf ( "DBL_MAX = %.16e" , DBL_MAX );
   Print ( "DBL_MAX-LONG_MAX = " , DBL_MAX - LONG_MAX );
} /*******************************************************************/

결과

 2018.01 . 15 14 : 07 : 20.440 Script 00 EURUSD,M15: removed
2018.01 . 15 14 : 07 : 20.440 00 EURUSD,M15: uninit reason 0
2018.01 . 15 14 : 07 : 20.440 00 EURUSD,M15: DBL_MAX - LONG_MAX = 17976931348623157081452742373170435679807 0567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368
2018.01 . 15 14 : 07 : 20.440 00 EURUSD,M15: DBL_MAX = 1.7976931348623157 e+ 308
2018.01 . 15 14 : 07 : 20.440 00 EURUSD,M15: LONG_MAX = 9223372036854775807
2018.01 . 15 14 : 07 : 20.440 00 EURUSD,M15: fmod ( ChartID (), 100000 ) = 74912
2018.01 . 15 14 : 07 : 20.440 00 EURUSD,M15: ChartID - 131472503841474907
2018.01 . 15 14 : 07 : 20.440 00 EURUSD,M15: initialized
2018.01 . 15 14 : 07 : 20.430 Script Test\ 00 EURUSD,M15: loaded successfully

이는 값 잘림이 발생하지 않아야 함을 나타냅니다.


그러나이 옵션을 확인하여 제안 된 내용을 약간 변경했습니다.

 /********************Script program start function*******************/
void OnStart ()
{
   long chartID = ChartID (), d= 100000 ;
   Print ( "ChartID - " , ChartID ());
   Print ( "fmod(ChartID(), " ,  d, ") = " , ( long ) fmod ( ChartID (), d));
   Print ( "ChartID() % " , d, " = " , ChartID () % d);
} /*******************************************************************/

예상 옵션을 얻었습니다.

 2018.01 . 15 14 : 17 : 51.301 Script 00 EURUSD,M15: removed
2018.01 . 15 14 : 17 : 51.301 00 EURUSD,M15: uninit reason 0
2018.01 . 15 14 : 17 : 51.301 00 EURUSD,M15: ChartID () % 100000 = 74907
2018.01 . 15 14 : 17 : 51.301 00 EURUSD,M15: fmod ( ChartID (), 100000 ) = 74912
2018.01 . 15 14 : 17 : 51.301 00 EURUSD,M15: ChartID - 131472503841474907
2018.01 . 15 14 : 17 : 51.301 00 EURUSD,M15: initialized
2018.01 . 15 14 : 17 : 51.291 Script Test\ 00 EURUSD,M15: loaded successfully

또 다른 질문이 나타납니다

MathMod 가 fmod 와 같으면 두 숫자 를 나눈 나머지 실수를 반환합니다. 그리고 문서에 따른 %

나머지 분 = 시간 % 60 ;


그렇다면 왜 차이가 나는가?
사유: