MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 673

 

마지막 답변을 하고 나서 그림이 정리되기 시작했고 가장 분명한 것은 프로그래머가 되는 것이 내 운명이 아니라는 것 :-)

지금까지 가장 간단한 목록으로 시작했으며 결과는 다음과 같습니다.


2018.10.20 08:42:43.343 _t1 CADJPY,일일: tmp1[4] = 86.09999999999999 2018.10.15 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,일일: tmp1[3] = 85.98999999999999 2018.10.16 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,일일: tmp1[2] = 86.76000000000001 2018.10.17 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,일일: tmp1[1] = 86.5 2018.10.18 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,일일: tmp1[0] = 85.72 2018.10.19 00:00:00



어떤 경우에는 어떤 이유로 가격이 임의의 방향에서 한 점 뒤의 두 유효 숫자의 차원을 초과합니다.

그리고 이것은 계산 오류 없이 발생하며 차트 기반 tmp1[i]=close[i]의 가격 값 출력일 뿐입니다.

이것은 어떻게든 극복할 수 있습니까 아니면 그냥 무시할 수 있습니까?



 

그것에서 5와 관련된 모든 것을 버리고 4를 위한 템플릿을 얻을 수 있습니다.


이것은 5가 4와 어떻게 다른지 아는 사람들에게 쓸 수 있으며 그것은 확실히 내가 아닙니다 :-)


 //--- Проверка количества доступных баров
   if (rates_total< fmax (period_ma, 4 )) return 0 ;


숫자 4는 어디에서 왔습니까? 신성한 의미는 무엇입니까?

 
psyman :


이것은 5가 4와 어떻게 다른지 아는 사람들에게 쓸 수 있으며 그것은 확실히 내가 아닙니다 :-)



숫자 4는 어디에서 왔습니까? 신성한 의미는 무엇입니까?

당신은 확실히 듣지 않고 읽지 않습니다 ... 그것은 동일했습니다.

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

MQL4에 대한 모든 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론

Artyom Trishkin , 2018.10.18 09:26

 //+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
//--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)
   if (rates_total< 4 ) return 0 ;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated; // 0 - пришел новый тик, новый бар формироваться не начал. 1 - пришел новый тик и начал формироваться новый бар.
   if (limit> 1 ) 
               // если вписать "limit>0", то на нулевом баре будет расчёт только нулевого бара, на каждом новом баре будет полный перерасчёт всей истории
               // если вписать "limit>1", то на нулевом баре будет расчёт только нулевого бара, на открытии нового бара - пересчёт первого и нулевого,
               // при подгрузке истории и на первом запуске - перерасчёт всей истории
     {
      limit=rates_total- 1 ;
       // здесь должна быть инициализация всех используемых буферов индикатора необходимыми значениями (обычно EMPTY_VALUE и 0)
     }
//--- Расчёт индикатора
   for ( int i=limit; i>= 0 && ! IsStopped (); i--)
     {
       // необходимые действия по расчёту индикатора
     }

//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+

 
psyman :

마지막 답변을 하고 나서 그림이 정리되기 시작했고 가장 분명한 것은 프로그래머가 되는 것이 내 운명이 아니라는 것 :-)

지금까지 가장 간단한 목록으로 시작했으며 결과는 다음과 같습니다.


2018.10.20 08:42:43.343 _t1 CADJPY,일일: tmp1[4] = 86.09999999999999 2018.10.15 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,일일: tmp1[3] = 85.98999999999999 2018.10.16 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,일일: tmp1[2] = 86.76000000000001 2018.10.17 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,일일: tmp1[1] = 86.5 2018.10.18 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,일일: tmp1[0] = 85.72 2018.10.19 00:00:00



어떤 경우에는 어떤 이유로 가격이 임의의 방향에서 한 점 뒤의 두 유효 숫자의 차원을 초과합니다.

그리고 이것은 계산 오류 없이 발생하며 차트 기반 tmp1[i]=close[i]의 가격 값 출력일 뿐입니다.

이것은 어떻게든 극복할 수 있습니까 아니면 그냥 무시할 수 있습니까?



모든 것이 정상입니다. 분수를 인쇄하려면 필요한 정밀도로 DoubleToString()을 사용 하면 됩니다. 이 경우 필요한 정밀도는 Digits()여야 합니다.

 
psyman :

마지막 답변을 하고 나서 그림이 정리되기 시작했고 가장 분명한 것은 프로그래머가 되는 것이 내 운명이 아니라는 것 :-)

지금까지 가장 간단한 목록으로 시작했으며 결과는 다음과 같습니다.


2018.10.20 08:42:43.343 _t1 CADJPY,일일: tmp1[4] = 86.09999999999999 2018.10.15 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,일일: tmp1[3] = 85.98999999999999 2018.10.16 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,일일: tmp1[2] = 86.76000000000001 2018.10.17 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,일일: tmp1[1] = 86.5 2018.10.18 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,일일: tmp1[0] = 85.72 2018.10.19 00:00:00


어떤 경우에는 어떤 이유로 가격이 임의의 방향에서 한 점 뒤의 두 유효 숫자의 차원을 초과합니다.

그리고 이것은 계산 오류 없이 발생하며 차트 기반 tmp1[i]=close[i]의 가격 값 출력일 뿐입니다.

이것은 어떻게든 극복할 수 있습니까 아니면 그냥 무시할 수 있습니까?

이것은 실수에 대한 일반적인 값입니다. 프로그램 작성 방법을 배울 수 있습니다. 모두가 이것으로 시작합니다. 많이 읽고 자신의 코드를 작성하고 작성하려고 노력하면 됩니다.

실수의 정확성, 사마귀 및 그것이 모두 메모리에 저장되는 방식에 대해 인터넷에서 Google을 검색할 수 있습니다. 저장 원칙은 어디에서나 동일합니다.

아름다운 출력을 원하면 DoubleToStr()을 사용하십시오

 
Igor Makanu :

이것은 실수에 대한 일반적인 값입니다. 프로그램 작성 방법을 배울 수 있습니다. 모두가 이것으로 시작합니다. 많이 읽고 자신의 코드를 작성하고 작성하려고 노력하면 됩니다.

실수의 정확성, 사마귀 및 그것이 모두 메모리에 저장되는 방식에 대해 인터넷에서 Google을 검색할 수 있습니다. 저장 원칙은 어디에서나 동일합니다.

아름다운 출력을 원하면 DoubleToStr() 을 사용하십시오

호환되는 기능을 사용할 수 있는 경우 사용할 수 있도록 제공하는 것이 좋습니다. 그리고 이 서사시가 다시 시작됩니다. 이 경우: DoubleToString()

 

동일한 도구에 대한 고문의 출시를 어떻게 금지할 수 있습니까?

예를 들어, 어드바이저는 eur/usd 창에서 작업하고 eur/usd에 대해 다른 창에서 실행하면 일부 경고 메시지가 표시됩니다. 도움을 주시면 감사하겠습니다.

 
gans71 :

동일한 도구에 대한 고문의 출시를 어떻게 금지할 수 있습니까?

예를 들어, 어드바이저는 eur/usd 창에서 작업하고 eur/usd에 대해 다른 창에서 실행하면 일부 경고 메시지가 표시됩니다. 도움을 주시면 감사하겠습니다.

포럼을 검색하여 한 고문에서 다른 고문으로 데이터를 전송해야 합니다.

또는 터미널의 전역 변수를 사용합니다(이것이 가장 쉬운 방법입니다). 첫 번째 Expert Advisor가 거기에 값을 쓸 수 있으며 Expert Advisors의 후속 복사본은 이 값을 읽고 https://www로 시작되지 않습니다. mql5.com/en/docs/globals

Документация по MQL5: Глобальные переменные терминала
Документация по MQL5: Глобальные переменные терминала
  • www.mql5.com
Глобальные переменные существуют в клиентском терминале 4 недели с момента последнего обращения, после этого автоматически уничтожаются. Обращением к глобальной переменной считается не только установка нового значения, но и чтение значения глобальной переменной.
 
Igor Makanu :

포럼을 검색하여 한 고문에서 다른 고문으로 데이터를 전송해야 합니다.

또는 터미널의 전역 변수를 사용합니다(이것이 가장 쉬운 방법입니다). 첫 번째 Expert Advisor가 거기에 값을 쓸 수 있으며, Expert Advisors의 후속 복사본은 이 값을 읽고 https://www로 시작되지 않습니다. mql5.com/en/docs/globals

어드바이저는 동일합니다. 동일한 도구에서 실행되지 않도록 금지해야 합니다.
 
gans71 :
어드바이저는 동일합니다. 동일한 도구에서 실행되지 않도록 금지해야 합니다.

그리고? 2 분 안에 당신은 인증서를 공부할 수 없습니다

문자열을 전역 변수 로 전송하는 방법에 관한 것이라면 유일한 방법은 전역 변수 이름을 만드는 것입니다. 귀하의 경우 EURUSD에 대한 고문을 시작했으며 다음을 확인하십시오.

if(GlobalVariableCheck(_Symbol)) .....

그러한 변수가 없으면 다음과 같은 변수를 만드십시오.

if(GlobalVariableSet(_Symbol,Magic)==0) Print("글로벌 변수 # 쓰기 오류 ",GetLastError());

그런 다음 EA가 종료되면 전역 변수를 삭제해야 합니다.

어쩐지 터미널이 가까이에 있지 않고 검색 방향을 표시 한 것 같습니다