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

 
Ihor Herasko :


사실, 질문입니다. 수면은 어떤 식으로든 지표의 데이터 재계산에 영향을 주어서는 안 됩니다. 버퍼를 채우는 데 문제가 있습니다. 재현 가능한 코드가 있습니까?

표시기는 주문형으로 작성되었습니다 - 야생 OOP가 있습니다. 이해가 되지 않습니다 :(

나는 테스터의 작업과 실제 계정 사이의 불일치에 대한 이유를 찾을 때까지이 문제로 밤새도록 보냈습니다. 아마도 잠을 자고 나면 비밀 논리의 일부를 제거하고 표시 할 것입니다.

 
Aleksey Vyazmikin :

문제가 발생했습니다. 표시기 기반 EA는 실제 계정에서 올바르게 작동하지만 테스터, OHLC 및 모든 틱 모두에 대한 틱 생성 모드에 있습니다 . 결과는 동일합니다. 오류의 결과는 0 막대의 빈 표시기 버퍼입니다(표시기를 계산하는 데 사용되는 상위 TF에 새 막대가 나타날 때만). 그러나 EA에 Sleep을 추가하여 표시기 카운트를 만들 수 있었고 틱 생성 모드에 따라 이 Sleep이 달라야 한다는 것이 밝혀졌습니다. Sleep(15000)은 모든 틱에서 생성하기에 충분하고 Sleep (30000)은 OHLC에 필요합니다).

따라서 틱 생성 모드에 따라 다른 지연 시간이 모델링되는 것이 논리적으로 밝혀지기 때문에 Sleep의 상황이 정상인지 여부에 대한 질문이 발생합니다!?

개발자 여러분, 나는 그 이유가 무엇인지 이해할 수 없기 때문에 표시기로 설명 된 상황에 대해 명확히 해달라고 요청합니다. 코드 또는 테스터의 오류입니다!

지표와 고문은 개인적으로 제공 할 준비가되어 있으며 누구에게 말하십시오.

지표에는 시계열이 아직 준비되지 않았다는 농담이 있습니다. 가격을 어레이에 즉시 복사할 수 없습니다. 이렇게 하려면 TF에서 히스토리를 사용할 수 있는지 확인해야 합니다. 그렇지 않은 경우 루프에서 다시 복사를 시도하고 로드될 때까지 기다립니다.

이것은 프로그래머의 비뚤어진 손입니다. 그가 그것에 대해 알지 못했다면

슬립은 정상이 아니다
 
void OnChartEvent (             const int id,         // идентификатор события   
                               const long & lparam,   // параметр события типа long 
                               const double & dparam, // параметр события типа double 
                               const string & sparam // параметр события типа string 
                              )
   {
   Print (My_Name, " ---  " , id, "    lparam = " , lparam, "    dparam = " , dparam, "    sparam = " , sparam, "    ChartID() = " , ChartID () );         // <<|+|+|+<<  // 

   }                              

설명을 부탁드립니다..

키를 누릅니다 = 이벤트 ID = 0을 얻습니다. 이것은 여러 번 반복될 수 있습니다. 결과는 스페이스바를 누를 때까지 동일합니다.

스페이스바가 눌림 = 이벤트 ID = 0을 수신합니다. 그 후, 키보드를 사용한 조작이 이벤트로 이어지지 않습니다.

혼미에서 벗어나기 위해 마우스 버튼을 누릅니다 = 이벤트 ID = 4를 수신합니다. 그 후 키보드를 다시 클릭할 수 있습니다 = 클릭할 때마다 이벤트가 발생합니다. 스페이스바를 누를 때까지 = 같은 결과입니다.

질문: 제가 바보입니까, 뭔가를 이해하지 못하는 것입니까, 아니면 그렇게 되어서는 안 되는 것입니까? 링크를 제공하세요.

 
Nikita Chernyshov :

안녕 동료들.

문제는 mql4에서 위치 수 를 계산하기 위해 다음과 같은 함수를 작성할 수 있다는 것입니다.

이 비즈니스는 mql5에서 어떻게 구현됩니까? Magick으로 위치를 계산하는 방법은 무엇입니까? 아니면 종류별로?

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

 #include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

MT5에서 작동합니다.

 
Maxim Dmitrievsky :

지표에는 시계열이 아직 준비되지 않았다는 농담이 있습니다. 가격을 어레이에 즉시 복사할 수 없습니다. 이렇게 하려면 TF에서 히스토리를 사용할 수 있는지 확인해야 합니다. 그렇지 않은 경우 루프에서 다시 복사를 시도하고 로드될 때까지 기다립니다.

이것은 프로그래머의 비뚤어진 손입니다. 그가 그것에 대해 알지 못했다면

슬립은 정상이 아니다

테스터에서 어떻게 이것이 가능합니까? 문제가 실제인지 아니면 테스터에 기록이 없는지 이해합니다... 하지만 이 검사는 어떻게 보여야 합니까?

개발자들은 내 메시지를 무시합니다. 유감입니다.

 
Aleksey Vyazmikin :

테스터에서 어떻게 이것이 가능합니까? 문제가 실제인지 아니면 테스터에 기록이 없는지 이해합니다... 하지만 이 검사는 어떻게 표시되어야 하나요?

개발자들은 내 메시지를 무시합니다. 유감입니다.

가격이 복사되었는지 확인하고 Copyclose 또는 -1을 반환하는 것은 복사되지 않았음을 의미합니다.

 
Maxim Dmitrievsky :

가격이 복사되었는지 확인하고 Copyclose 또는 -1을 반환하는 것은 복사되지 않았음을 의미합니다.

표시기는 새 막대가 나타날 때 1회 계산되며, 올바르게 이해하면 다음과 같이 구현됩니다.

 //+------------------------------------------------------------------+
//| 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[])
  {
   static int counted_bars= 0 ;
   if (rates_total==prev_calculated) return (rates_total);

이것은 간단한 인쇄로 확인됩니다.

따라서 상황이 명확하지 않습니다. 계산할 가격이 없다고 가정하면 표시기가 1회 계산 되고 버퍼가 비어 있는 상태로 유지되지만 그렇지 않습니다. EA와 기다립니다. 지표가 천천히 계산되고 테스터가 단순히 기다리지 않을 수 있습니까? 그러나 그것을 확인하는 방법?

 
Aleksey Vyazmikin :

표시기는 새 막대가 나타날 때 1회 계산되며, 올바르게 이해하면 다음과 같이 구현됩니다.

이것은 간단한 인쇄로 확인됩니다.

따라서 상황이 명확하지 않습니다. 계산할 가격이 없다고 가정하면 표시기가 1회 계산 되고 버퍼가 비어 있는 상태로 유지되지만 그렇지 않습니다. EA와 기다립니다. 지표가 천천히 계산되고 테스터가 단순히 기다리지 않을 수 있습니까? 그러나 그것을 확인하는 방법?

타이머로 시간을 맞춰야 할 수도 있습니다

 
Maxim Dmitrievsky :

타이머로 시간을 맞춰야 할 수도 있습니다

예, EA의 타이머를 사용하면 테스트가 타이머가 없는 것보다 약간 더 진행되지만 Sleep 보다는 나쁩니다. 타이머는 본질적으로 Sleep 과 동일합니다.

문제가 무엇인지 이해하는 것 같습니다. 지표는 다른 두 지표의 데이터에 따라 계산되며 코드는 다른 지표의 계산된 막대 수를 요청합니다.

 //+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CChannel:: BarsCalculated ( void )
  {
   int upchbars= BarsCalculated (m_upch);
   int dnchbars= BarsCalculated (m_dnch);
   if (upchbars<=dnchbars) return (upchbars);
   return (dnchbars);
  }

및 예상 예상 막대 수

 int barsch=(InpChPeriod== PERIOD_CURRENT ?rates_total: Bars ( _Symbol ,InpChPeriod));

이 두 값이 일치하지 않으면 버퍼가 채워지지 않은 것으로 나타납니다.

   if (!channel.CreateChannel() || barsch<= 0 || barsch!=channel. BarsCalculated () || channel.FillChBuffers(rates_total,calculated,time)== 0 )
     {
       for (;counted_bars<rates_total;counted_bars++)
        {
         ZigzagBuffer[counted_bars]= 0.0 ;
         ZigzagStepBuffer[counted_bars]= 0.0 ;
         UpChBuffer[counted_bars]= 0.0 ;
         DnChBuffer[counted_bars]= 0.0 ;
         InfoZigzagBuffer[counted_bars]= 0.0 ;
         InfoUpChBuffer[counted_bars]= 0.0 ;
         InfoDnChBuffer[counted_bars]= 0.0 ;
         InfoDirectBuffer[counted_bars]= 0.0 ;
         InfoBegPriceBuffer[counted_bars]= 0.0 ;
         InfoEndPriceBuffer[counted_bars]= 0.0 ;
         InfoBegTimeBuffer[counted_bars]= 0.0 ;
         InfoEndTimeBuffer[counted_bars]= 0.0 ;
         InfoStartPriceBuffer[counted_bars]= 0.0 ;
         InfoStartTimeBuffer[counted_bars]= 0.0 ;
         InfoZigzagTotal[counted_bars]=InfoZigzagTotal[counted_bars- 1 ];
        }
       if (InpInfEnd) CopyInfoBuffers(rates_total- 1 ,( int )InfoZigzagTotal[rates_total- 1 ]);
       return (calculated);
     }

내가 올바르게 이해하면 표시기는 하나의 스레드에서 실행되고 우선 순위는 생성 시간에 따라 구축됩니다. 내가 EA에서 액세스하는 표시기가 더 높은 우선 순위를 가지며 먼저 계산을 수행한 다음 계산이 끝나면 해당 표시기에 흐름을 제공합니다(버퍼 데이터에 따라 ) 계산이 이루어져야 합니다.

충분한 크기의 절전 모드를 설정하면 표시기가 다시 계산된다는 인쇄 내용이 표시됩니다(아직 어떻게 하는지 이해하지 못함). 왜 13초 후에만?

 2019.01 . 22 19 : 50 : 16.992 2019.01 . 21 23 : 45 : 00    barsch= 6275
2019.01 . 22 19 : 50 : 16.992 2019.01 . 21 23 : 45 : 00    BarsCalculated = 6274

2019.01 . 22 19 : 50 : 16.993 2019.01 . 21 23 : 45 : 13    barsch= 6275
2019.01 . 22 19 : 50 : 16.993 2019.01 . 21 23 : 45 : 13    BarsCalculated = 6275

타이머 표시기가 없습니다.

그리고 올바른 계산을 하려면 어떻게 해야 할까요? 버퍼의 값을 기다리기 전에 EA에 있는 동안 사용하려고 해도 도움이 되지 않습니다. 중단됩니다.

 
안녕하세요! 내 EA에 한 단계 더 나아가 후행 중지를 구현하고 싶었습니다. Codebase와 Macd Sample의 템플릿 외에는 아무것도 찾지 못했습니다. 아마도 다른 옵션이 있습니까?