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

 
Ivan_Invanov :
일반적으로 귀하의 답변으로 판단하면 귀하는 프로그램이 어떻게 작동하는지 실제로 이해하지 못합니다. 이것은 어리석은 질문처럼 보입니다. 예, 이전 해설자가 그녀가 멈춘다고 생각하는 것처럼. 다른 언어로 프로그래밍을 해본 경험으로 보아 그녀는 몸을 순환적으로 실행하고 이벤트가 오면 그 속으로 뛰어들고 있다고 생각합니다. 프로그램이 루프에서 본문을 실행하는 경우 프로그램이 그렇게 작성된 이유가 설명됩니다.

"new tick" 이벤트가 도착하면 프로그램은 OnTick() 처리기에서 시작하여 끝까지 실행하고 중지합니다. 새로운 진드기의 출현으로 모든 것이 처음부터 반복됩니다. 프로그램 실행 중에 다음 틱이 도착하고 프로그램이 아직 이전 틱 처리를 완료하지 않은 경우(아직 실행 중임) 이 틱은 건너뜁니다.

MQL 프로그램은 루프되지 않습니다. OnInit(), OnDeinit() 및 OnTick()의 세 가지 진입점이 있습니다.

시작 시 OnInit()이 실행되고 틱이 도착하면 OnTick()이 실행되고 완료되면 OnDeinit()가 실행됩니다.

다른 핸들러도 있습니다. 그러나 다른 사람에게 여기에 복사해 달라고 요청하는 것보다 그냥 도움말을 여는 것이 좋습니다.

Документация по MQL5: Программы MQL5
Документация по MQL5: Программы MQL5
  • www.mql5.com
Для того чтобы mql5-программа могла работать, она должна быть скомпилирована (кнопка "Компилировать" или клавиша F7). Компиляция должна пройти без ошибок (допускаются предупреждения, которые необходимо проанализировать). При этом в соответствующей директории Эксперты, пользовательские индикаторы и скрипты прикрепляются к одному из открытых...
 

안녕하세요. 내 표시기에서 작업하는 동안 터미널을 다시 시작할 때 충돌을 발견했습니다. 이 버그를 기반으로 테스트할 작은 소스를 만들었습니다.

 //+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

class Loader {
private :
   string symbol;
   ENUM_TIMEFRAMES timeframe;

public :  
  Loader(): symbol( Symbol ()), timeframe(Period()) 
  {
     Print ( __FUNCTION__ + " symbol: " + symbol + " timeframe: " + EnumToString (timeframe));
     ResetLastError ();
     Print ( __FUNCTION__ + " bars: " + ( string ) iBars (symbol, timeframe)); // Данный вызов iBars() даёт 0 при перезапуске терминала
     Print ( __FUNCTION__ + " Error: " + ( string ) GetLastError ());
     Print ( __FUNCTION__ + " bars (2): " + ( string ) iBars ( Symbol (), Period ())); // Этот же вызов iBars() работает нормально
  }
};

Loader * loader;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit () {
//--- indicator buffers mapping
  loader = new Loader();
//---
   return ( INIT_SUCCEEDED );
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason) {
   delete loader;
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const int begin,
                 const double &price[]
) {
   return (rates_total);
}

이 예제가 차트에 표시되면(또는 시스템이 시작된 후 터미널이 처음 실행되는 경우 ) 모든 것이 제대로 작동합니다. 로그에는 다음과 같이 나와 있습니다.

2020.06.24 21:05:50.773 Loader::Loader symbol: EURUSD timeframe: PERIOD_H1

2020.06.24 21:05:50.773 로더::로더 바: 140433

2020.06.24 21:05:50.773 로더::로더 오류: 0

2020.06.24 21:05:50.773 로더::로더 바(2): 140433


그러나 이 표시기로 터미널을 다시 시작하면 오류가 발생합니다.

2020.06.24 21:07:34.963 로더::로더 기호: EURUSD 기간: PERIOD_H1

2020.06.24 21:07:34.963 로더::로더 바: 0

2020.06.24 21:07:34.963 로더::로더 오류: 4401

2020.06.24 21:07:34.964 로더::로더 바(2): 140433

심볼 및 타임프레임이 정상적으로 초기화됨

2020.06.24 21:07:34.963 로더::로더 기호: EURUSD 기간: PERIOD_H1

그러나 iBars(symbol, timeframe)는 어떤 이유로 0을 제공합니다.

2020.06.24 21:07:34.963 로더::로더 바: 0

이로 인해 오류 4401이 발생합니다.

그러나 iBars(Symbol(), Period())는 훌륭하게 작동합니다.

2020.06.24 21:07:34.964 로더::로더 바(2): 140433

log 메시지에 따라 symbol = Symbol(), timeframe = Period()이지만(지연 중에도 터미널을 다시 시작할 때). iBars(symbol, timeframe)는 절대적으로 정확한 기호와 시간 프레임을 사용하여 0을 반환하는 반면 iBars(Symbol(), Period())는 로그에 따라 함수의 매개변수가 동일한 경우 제대로 작동합니까?

Запуск платформы - Для продвинутых пользователей - Справка по MetaTrader 5
Запуск платформы - Для продвинутых пользователей - Справка по MetaTrader 5
  • www.metatrader5.com
По завершении установки в меню "Пуск" создается группа программ торговой платформы, а на рабочем столе дополнительно помещается ярлык программы. Используйте их для запуска. Нельзя запускать одновременно две копии платформы из одной директории. Чтобы одновременно запустить несколько копий, установите соответствующее количество программ в разные...
파일:
Test.mq5  7 kb
 
이 스레드의 운영자를 아는 사람은 누구입니까?
 

MetaQuotes Demo에서 데모 MT4 계정을 여는 방법은 무엇입니까? 이전에는 문제 없이 작동했지만 이제 대화 상자의 마지막 페이지에 다음과 같이 표시됩니다. 등록, 잠시만 기다려 주십시오. 이 상태에서는 영원히 유휴 상태로 유지되고 로그인 및 암호 필드는 비어 있습니다. 로그에 메시지가 없습니다. "데모"와 "실제" 및 다른 유형의 계정을 모두 시도했습니다.

UPD. 나는 한 브로커의 데모를 시도했습니다 - 같은 쓰레기.

 
Artyom Trishkin :

"new tick" 이벤트가 도착하면 프로그램은 OnTick() 처리기에서 시작하여 끝까지 실행하고 중지합니다. 새로운 진드기의 출현으로 모든 것이 처음부터 반복됩니다. 프로그램 실행 중에 다음 틱이 도착하고 프로그램이 아직 이전 틱 처리를 완료하지 않은 경우(아직 실행 중임) 이 틱은 건너뜁니다.

MQL 프로그램은 루프되지 않습니다. OnInit(), OnDeinit() 및 OnTick()의 세 가지 진입점이 있습니다.

시작 시 OnInit()이 실행되고 틱이 도착하면 OnTick()이 실행되고 완료되면 OnDeinit()가 실행됩니다.

다른 핸들러도 있습니다. 그러나 다른 사람에게 여기에 복사해 달라고 요청하는 것보다 그냥 도움말을 여는 것이 좋습니다.

고맙습니다. 네, 프로그램 본문에 함수가 작성되어 있다는 것을 이해합니다. 어디선가 그녀의 전화를 놓쳤을 수도 있습니다.
 
Ivan_Invanov :
고맙습니다. 네, 프로그램 본문에 함수가 작성되어 있다는 것을 이해합니다. 어디선가 그녀의 전화를 놓쳤을 수도 있습니다.

당신이 말하는 것을 어떻게 볼 수 있습니까? 예를 들어 주십시오.

 
Artyom Trishkin :

당신이 말하는 것을 어떻게 볼 수 있습니까? 예를 들어.

다시 한 번 감사합니다. 네, 전화를 눈치채지 못하고 그냥 보기만 하다가 거래를 여는 함수로 호출되었습니다 .
 
Ivan_Invanov :
고맙습니다. 네, 프로그램 본문에 함수가 작성되어 있다는 것을 이해합니다. 어디선가 그녀의 전화를 놓쳤을 수도 있습니다.

mql4에서 기능은 드럼 위아래로 임의의 순서로 작성되며 조만간 작동하는 것처럼 보일 수 있습니다. C++에는 그런 게 없고, 모든 함수는 쓰는 순서대로만 작동하고, 호출하려면 호출 사이트보다 먼저 정의해야 하고, 그렇지 않으면 프로그램이 크래시된다. 그 사람은 내가 다른 방법으로 함수를 작성할 수 있는 방식으로 그것을 하는 방법을 보여주었지만 C ++로 그것을 하는 방법을 기억하지 못하고 이것은 별로 중요하지 않습니다.

 
Ivan_Invanov :

인사말. 도와주세요, 제발. 질문이 있습니다. 내가 올바르게 이해하고 있습니까? 프로그램은 처음부터 끝까지 실행되지만 틱과 같은 이벤트가 도착하면 중단 되고 ontick 함수 가 실행을 시작한 다음 실행을 끝내고 프로그램이 처음부터 다시 실행된다는 것? 이 질문은 이것과 관련이 있습니다. 예를 들어 거래 로트의 크기를 어디에 써야합니까? 프로그램 본문에서 또는 온틱 기능에서?

예를 들어 프로그램의 본문에서 로트 계산이 수행되는 터미널에 있는 공식 봇을 보고 왜 그런지 이해가 되지 않았습니다.

내 몫은 이렇게 계산된다

 #property link        "http://www.mql5.com"
input double CheckLots = 0.01 ;
input int     Persent   = 5 ;
   double Lots= NormalizeDouble (AccountBalance()*CheckLots/ 1000 - 0.005 , 2 );  

어드바이저의 시작 부분에 서서 ... 코드의 맨 끝에 넣습니다.

OnTick 함수에서 Lot 변수가 호출되면 EA가 찾아서 다시 계산합니다.

 

@Artyom 트리쉬킨

이 스레드의 중재자입니까?