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

 
Artyom Trishkin :

OnInit()에서 심볼의 시계열을 호출합니다. iTime(Symbol,Timeframe,1);

OnTick()에서 맨 처음에 해당 iFunc()를 통해 필요한 시계열의 필수 막대를 요청합니다. 최소한 동일한 if( iTime(Symbol,Timeframe,10)==0) return;

그러면 어드바이저는 새 막대의 정의에 도달하지 않고 다음 틱을 기다립니다.

OnInit()에서 시계열 데이터를 요청하여 데이터 페이징을 활성화했습니다.

OnTick()에서 EA에 필요한 최소 기록의 가용성을 확인하고 아직 사용할 수 없는 경우 다음 틱을 기다리기 위해 떠납니다.

그리고 EA가 요구하는 모든 데이터가 수신될 때까지 다음 틱을 계속 기다립니다.

필요한 모든 데이터가 다운로드되고 수신되는 즉시 EA는 새 막대와 필요한 기록 작업을 시작합니다.

직렬 데이터를 최신 상태로 유지하려면 2분에 한 번 이상 직렬 데이터에 액세스해야 합니다. 약 1분 30초(90초) 동안 두 번째 타이머를 만들고 iTime(Symbol,Timeframe,1)과 같이 원하는 기호의 시계열을 참조하기만 하면 됩니다. 수신된 데이터를 확인하지 않고 스토리를 "이동"하십시오. 그러면 기호의 모든 데이터가 항상 최신 상태가 됩니다.

물론 모든 TF에 대해 새 막대를 확인하는 옵션을 시도하겠지만 동기적으로 발생하지 않는 것은 MT4가 아닙니다. 그리고 문제는 막대에 있는 것이 아니라 표시기에서 호출된 표시기를 해결하지 못하는 데 있습니다. 표시기는 차례로 EA에서 호출됩니다.

나는 잠시 일하기 때문에 아이디어에 따르면 이야기는 항상 관련이 있어야합니다.

그리고 우리는 테스트를 위해 이러한 모든 검사를 수행하지만 실제 생활에서는 테스터의 고정 상태보다 모든 것이 느리게 작동하기 때문에 작업 속도가 느려질 것입니다. 표시기는 실제 계정 에서 올바르게 작동한다는 것을 반복합니다.

 

이런식으로 문제를 풀면서 메인코드를 시작하기 전에 실패한 인디케이터의 준비상태를 확인했다.

 //При появлении нового бара проверяем корректность расчета индикаторов
       if (isNewBar_Predv_Calc_Ind()== true )Predv_Calc_Ind= true ;
       if (Predv_Calc_Ind== true )
      {
       double arr_DonUp=ZZ_Vibor( 0 , 2 , 0 );
       double arr_DonDown=ZZ_Vibor( 0 , 3 , 0 );
       double arr_DonUp_m2=ZZ_Vibor( 1 , 2 , 0 );
       double arr_DonDown_m2=ZZ_Vibor( 1 , 3 , 0 );
       double arr_DonUp_m5=ZZ_Vibor( 2 , 2 , 0 );
       double arr_DonDown_m5=ZZ_Vibor( 2 , 3 , 0 );
       double arr_DonUp_m15=ZZ_Vibor( 3 , 2 , 0 );
       double arr_DonDown_m15=ZZ_Vibor( 3 , 3 , 0 );
       if (arr_DonUp< 1      || arr_DonDown< 1     ||
          arr_DonUp_m2< 1   || arr_DonDown_m2< 1 ||
          arr_DonUp_m5< 1   || arr_DonDown_m5< 1 ||
          arr_DonUp_m15< 1 || arr_DonDown_m15< 1
         ) return ;
       else {Predv_Calc_Ind= false ;}      
      }
//Операции выполняются только при появлении следующего бара   
   if (!isNewBar()) return ;

그러나 이 접근 방식은 보편적이지 않습니다. 모든 지표를 어떻게 나열해야 합니까? 테스터의 환경이 올바르게 작동하도록 하는 더 보편적인 또 다른 방법이 있습니까?

 
Artyom Trishkin :

OnTick()에서 EA에 필요한 최소 기록의 가용성을 확인하고 아직 사용할 수 없는 경우 다음 틱을 기다리기 위해 떠납니다.

그리고 EA가 요구하는 모든 데이터가 수신될 때까지 다음 틱을 계속 기다립니다.

필요한 모든 데이터가 다운로드되고 수신되는 즉시 EA는 새 막대와 필요한 기록 작업을 시작합니다.

역사의 가용성을 확인하기 위해 어떻게 제안합니까, 나는 뭔가를 이해하지 못했습니다 ...

 
fxsaber :

MQL4 함수 앞에 이 행을 추가하십시오.

MT5에서 작동합니다.

멋진. 정말 감사합니다!

 
좋은 하루, 젊은 연금 수급자는 MT5에서 그러한 버튼을 만들고 싶었습니다.

MT5에서 그런 버튼을 구현할 수 있다고 말해주세요. 누군가 이미 코드를 공유하도록 했을 수도 있습니다.


"시작" 버튼과 "모든 주문 닫기" 버튼. 화면 주위를 이동합니다. MT5, 모든 쌍, 모든 시간대, 4/5 표지판. 센트 로트를 포함한 초기 로트 0.01.
미끄러짐 및 재인용을 제공합니다.

"시작" 버튼의 기능
내가 수동으로 fibo를 늘린 후 이전에 현재 가격으로 BAY 또는 SELL에서 즉시 1에서 11 주문을 열어야합니다.
확장된 fibo의 방향으로 얼마나 많은 주문을 열고 어떤 주문(1, 2, 5, 7 또는 모두 11)을 열 것인지 설정에서 선택합니다.
주문별 설정에서 로트 사이즈를 수동으로 지정하거나 동적으로 증감할 수 있었습니다.

TP - 이익실현 은 61.8의 fibo 수준에서 1에서 11까지 오름차순으로 설정됩니다. 78.6; 100.0;
161.8; 185.4; 200.0; 261.8; 285.0; 423.6; 561.8; 685.4

SL - 제로 피보 라인에서 - 2 스프레드(자동으로 계산됨)의 손절매 .

TS - Trailing Stop 은 그 뒤에 있는 모든 주문을 가져옵니다.
1. 후행은 가격이 61.8 수준에 도달한 경우 모든 주문의 SL을 38.2 + 2 스프레드 수준으로 이동합니다.
2. 후행은 가격이 100.0 수준에 도달한 경우 나머지 모든 주문의 SL을 50.0+2 스프레드 수준으로 이동합니다.
3. 후행은 가격이 161.8 수준에 도달한 경우 나머지 모든 주문의 SL을 78.6+2 스프레드 수준으로 이동합니다.
4 . 후행은 가격이 261.8.5에 도달하면 나머지 모든 주문의 SL을 100.0+2 스프레드 수준으로 이동합니다.
5. 후행은 가격이 423.6 수준에 도달한 경우 나머지 모든 주문의 SL을 200.0+2 스프레드 수준으로 이동합니다.
6. 후행은 가격이 561.8 수준에 도달한 경우 나머지 모든 주문의 SL을 423.6+2 스프레드 수준으로 이동합니다.

"모든 주문 닫기" 버튼의 기능 - 모든 주문을 강제로 마감합니다.
 

안녕하세요, CsymbolInfo 클래스의 Ask 및 Bid 가격에서 다소 명확하다면 예를 들어 SessionInterest 또는 SessionBuyOrdersVolume 또는 SessionPriceLimitMin을 얻는 방법, 0을 제공합니다. 왜 그런지 이해할 수 없습니다.

 
Александр Юрин :

안녕하세요, CsymbolInfo 클래스의 Ask 및 Bid 가격에서 다소 명확하다면 예를 들어 SessionInterest 또는 SessionBuyOrdersVolume 또는 SessionPriceLimitMin을 얻는 방법, 0을 제공합니다. 왜 그런지 이해할 수 없습니다.

거래 서버가 이 정보를 브로드캐스트하면 해당 정보를 받게 됩니다.

일반적으로 이 정보는 주식 기호에 대해 브로커에 의해 브로드캐스트됩니다(브로커와 거래 센터를 혼동하지 마십시오).

 
Vladimir Karputov :

거래 서버가 이 정보를 브로드캐스트하면 해당 정보를 받게 됩니다.

일반적으로 이 정보는 주식 기호에 대해 브로커에 의해 브로드캐스트됩니다(브로커와 거래 센터를 혼동하지 마십시오).

Broker Opening , RTS Index Futures, 나는 그것이 최소한 SessionPriceLimitMin 및 SessionPriceLimitMax를 브로드캐스트해야 한다고 가정합니다. 오프닝이 정말로 번역되지 않습니까 ... 예를 들어 다음과 같이 처방합니다.

Print(m_symbol.Ask()," ",m_symbol.SessionBuyOrdersVolume()); - 고문으로부터

저널에는 Ask price만 표시됩니다.

파일:
y2a4cgbfjw.png  63 kb
 

현재 TF까지의 모든 TF 이동과 함께 마지막 막대의 날짜를 올바르게 결정하는 코드를 작성하는 데 도움을 요청합니다.

 int               N_bar= iBarShift ( Symbol (), PERIOD_CURRENT , iTime ( Symbol (),PERIOD_H1, 0 )); //номер текущего бара
datetime          StopDt= iTime ( Symbol (), PERIOD_CURRENT ,N_bar+ 1 ); //только для минуток и то может быть не корректно!

Print ( "StopDt_Shift=" , TimeToString (StopDt, TIME_DATE | TIME_MINUTES ));

이러한 코드는 일반적으로 작동하지만 현재 차트가 M1이므로 현재 막대의 시작 시간이 실제(가장 가까운 분으로 반올림된) 막대와 일치하는 경우에만 작동합니다. 그리고 일치하지 않으면 서로 다른 TF에 따라 다양한 사건이 발생합니다. 예를 들어, 지난 시간에 마지막 막대 M1의 시작 날짜를 찾아야 합니다. 시간이 12이면 문제가 없으면 시간은 12:59이고, 13시간이면 시간이 됩니다. 시간별 막대가 14:00에 열리지 않고 14:05에 iBarShift 함수가 14:00에 가장 가까운 막대, 즉 13:59를 반환했기 때문에 이미 13:58이 됩니다.

추가: 이 작업을 수행한 것 같습니다.

 datetime          StopDt= iTime ( Symbol (), PERIOD_CURRENT , Bars ( Symbol (), PERIOD_CURRENT , iTime ( Symbol (),TF_iDeltaP,_Shift- 1 ), iTime ( Symbol (), PERIOD_CURRENT , 0 )));
 
Александр Юрин :

Broker Opening , RTS Index Futures, 나는 그것이 최소한 SessionPriceLimitMin 및 SessionPriceLimitMax를 브로드캐스트해야 한다고 가정합니다. 오프닝이 정말로 번역되지 않습니까 ... 예를 들어 다음과 같이 처방합니다.

Print(m_symbol.Ask()," ",m_symbol.SessionBuyOrdersVolume()); - 당신의 고문으로부터

저널에 가격 물어보기만 나옵니다.

서버 실제 또는 데모?
사유: