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

 
Vitalii Ananev :

Close[2] 대신 두 번째 막대에 표시기 값을 입력하고(예: iRSI(.......,2) ) Close[1] 대신 표시기 값을 첫 번째 막대에 넣습니다. 그리고 uroven은 레벨 값 입니다.

나머지는 이미 당신에게 말했습니다.

고맙습니다.
 
누군가가 MT5 차트의 오른쪽에서 오늘의 사이드 볼륨을 건너 MT4에서 찾았을 수도 있습니다. 여기 https://www.mql5.com/en/code/9777 . 두 가지 옵션이 있습니다. 변수를 다시 작성하거나 준비된 변수를 찾으십시오. 글쎄, 아니면 나는 주문의 요점이 보이지 않는다,,,,,,, 하나의 균형 이론을 확인해야 한다 ,,,, 왼쪽에서 어제의 프로필을 그리는 MT5에 대한 이 작업에 대한 데이터베이스에서 발견 그러나 한 가지 중요한 결점은 오늘날 일어나고 있는 일을 설명 하지 못하는 것입니다. 그래서 나는 현재 거래 순간에 무슨 일이 일어나고 있는지에 대한 정보로 차트 템플릿을 보완하고 싶습니다.
Рыночный профиль ( Market Profile)
Рыночный профиль ( Market Profile)
  • 투표: 6
  • 2006.10.11
  • Collector
  • www.mql5.com
Рыночный профиль ( Market Profile) использует альтернативное представление информации как о горизонтальном, так и о вертикальном движении рынка.
 
Maria Baburina :

상태:


ProfitSellDBL은 여기에서 계산됩니다.

Profit_Upgr = 0.01

Traal_Start__Upgr은 int 유형의 외부 변수로 설정되고 5와 같습니다.

Traal_Size__Upgr은 유사하게 4와 같습니다.

TV - 틱 값, =10

SumLotSellDBL = 0.04

나는 그것을 읽었다. Traal_Start__Upgr, Tral_Size__Upgr 및 외부 변수를 이중으로 정의하면 어떻게 작동하는지 살펴보았습니다. 저것들. 모든 것이 캐스팅 및 데이터 손실 없이 동일한 유형일 때. 결과는 동일합니다. 내가 뭘 잘못 이해했나?
 
Maria Baburina :
나는 그것을 읽었다. Traal_Start__Upgr, Tral_Size__Upgr 및 외부 변수를 이중으로 정의하면 어떻게 작동하는지 살펴보았습니다. 저것들. 모든 것이 캐스팅 및 데이터 손실 없이 동일한 유형일 때. 결과는 동일합니다. 내가 뭘 잘못 이해했나?

시각 장애인과 청각 장애인의 대화. 누군가가 확인할 수 있게 하려면 다른 시스템에서 컴파일하고 확인할 수 있는 가능한 최소 코드가 필요합니다. 코드 없음 - 말할 것도 없습니다.

추가됨: 디버깅 사용( Debugging ) :

프리셋

중단점

디버깅 시작

관찰된 표현

호출 스택 보기

단계별 디버깅

디버깅 일시 중지, 재개 및 종료

기록에 대한 디버깅

 

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

오류, 버그, 질문

비교 , 2016.04.03 18:21

런타임 에러

 #property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1

class CLASS
{
public :
   double Buffer[];
  
  CLASS( void )
  {
     SetIndexBuffer ( 0 , this .Buffer);
  }
};

CLASS* Class;

void OnInit ( void )
{
  Class = new CLASS;
    
   delete Class;

  Class = new CLASS;

  Class.Buffer[ 0 ] = 0 ; // array out of range
  
   delete Class;
  
   return ;
}

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[] )
{  
   return (rates_total);
}

넷에서 이것은 쾅! 상위 5위 안에 드는 것입니다. 이것은 쿼드에 비해 또 다른 아키텍처 제한 사항입니까? 이것에 대한 토론에 대한 링크를 제공하십시오. 내가 직접 찾지 못했습니다.


 
OnCalculate 의 터미널 자체(수동이 아님)에 의한 첫 번째 호출 후에만 표시기 버퍼 에 무언가를 할당할 수 있다는 것을 올바르게 이해하고 있습니까?
 
comp :
OnCalculate 의 터미널 자체(수동이 아님)에 의한 첫 번째 호출 후에만 표시기 버퍼 에 무언가를 할당할 수 있다는 것을 올바르게 이해하고 있습니까?

OnCalculate()를 호출한 후 표시기 버퍼에 액세스할 수 있습니다. 이 경우 표시기 버퍼 자체는 전역 변수 영역에 선언되어야 합니다 .

 //+------------------------------------------------------------------+
//|                                                  Accelerator.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright    "2009, MetaQuotes Software Corp."
#property link          "http://www.mql5.com"
#property description "Accelerator/Decelerator"

//---- indicator settings
#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots    1
#property indicator_type1   DRAW_COLOR_HISTOGRAM
#property indicator_color1  Green,Red
#property indicator_width1   2
#property indicator_label1   "AC"
//--- indicator buffers
double ExtACBuffer[];
double ExtColorBuffer[];
double ExtFastBuffer[];
double ExtSlowBuffer[];
double ExtAOBuffer[];
double ExtSMABuffer[];
//--- handles for MAs
int     ExtFastSMAHandle;
int     ExtSlowSMAHandle;
//--- bars minimum for calculation
#define DATA_LIMIT 37
 

내가 찾던 것을 찾은 것 같지만 고대 코드에서 오류가 발생합니다.

수정을 도와주세요 ...... 쉬운 경우

화면 오른쪽에 배치하는 데 도움이 된다면 일반적으로

 
Karputov Vladimir :

OnCalculate()를 호출한 후 표시기 버퍼에 액세스할 수 있습니다.

결과적으로, 당신은 틀렸습니다. CAM 터미널이 OnCalculate를 호출할 때만 액세스할 수 있습니다. 동시에 MT4에서는 조건이 더 유연합니다. OnCalculate를 한 번만 호출하면 충분합니다. 그리고 MT5에서는 SetIndexBuffer 이후 매번 ITSELF 터미널의 OnCalculate 호출을 기다려야 합니다. 증거

 #property strict

#property indicator_chart_window
#property indicator_buffers 1

#ifdef __MQL5__
   #property indicator_plots 1
#endif   

#ifdef __MQL5__
   #define TRUE true
   #define FALSE false
#endif   

class CLASS
{
public :
   double Buffer[];
  
  CLASS( void )
  {
    :: SetIndexBuffer ( 0 , this .Buffer);
  }

   #define TIMESERIES(X)                                                  \
     :: ArraySetAsSeries (X, TRUE );                                        \
     Size = :: MathMin (Copy ##X(::Symbol(), :: Period (), 0 , bars, X), Size);  

   static int FullOnCalculate( void )
  {
     int Spread[];
     long RealVolume[];
    
     int Size = INT_MAX ;
    
     #ifdef __MQL4__
       const int bars = :: Bars ;
     #endif

     #ifdef __MQL5__
       const int bars = :: Bars (:: Symbol (), :: Period ());
     #endif

     TIMESERIES(Spread)
    TIMESERIES(RealVolume)
    
     #ifdef __MQL4__
       return (:: OnCalculate (Size, 0 , Time , Open , High , Low , Close , RealVolume, Volume , Spread));
     #endif

     #ifdef __MQL5__
       datetime Time [];
       double Open [];
       double High [];
       double Low [];
       double Close [];
       long TickVolume[];
  
      TIMESERIES( Time )
      TIMESERIES( Open )
      TIMESERIES( High )
      TIMESERIES( Low )
      TIMESERIES( Close )
      TIMESERIES(TickVolume)
    
       return (:: OnCalculate (Size, 0 , Time , Open , High , Low , Close , RealVolume, TickVolume, Spread));
     #endif    
   }  
};

CLASS* Class;

bool FirstRunOnCalculate = TRUE ; // Необходимо TRUE, т.к. вызов OnCalculate только самим терминалом инициирует индикаторный буфер

void OnChartEvent ( const int id, const long & lparam, const double & dparam, const string & sparam )
{
   if (id == CHARTEVENT_CHART_CHANGE )
  {
     Print ( __FUNCTION__ );
    
    :: OnDeinit ();
    
    ::Class = new CLASS;
        
   if (!FirstRunOnCalculate)    
    CLASS::FullOnCalculate(); // Тут будет задница для MT5 (в MT4 - без проблем), т.к. после SetIndexBuffer в MT5 надо дожидаться вызова OnCalculate САМИМ терминалом
  }
  
   return ;
}

void OnDeinit ( const int Reason = 0 )
{
   if (:: CheckPointer (::Class) == POINTER_DYNAMIC )
     delete ::Class;

   return ;
}

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[] )
{  
   Print ( __FUNCTION__ );  

   if (FirstRunOnCalculate)
    FirstRunOnCalculate = FALSE ;
  
   if (:: CheckPointer (::Class) != POINTER_INVALID )
    ::Class.Buffer[ 0 ] = 0 ; // array out of range - MT5-ERROR!!!

   return (rates_total);
}

MT4에서 이 표시기는 문제 없이 갈 것이고, MT5에서는 오류와 함께 즉시 충돌할 것입니다. 결과적으로 MT4에서는 ITSELF 터미널이 OnCalculate에 대한 첫 번째 호출을 기다린 다음 SetIndexBuffer를 통한 재정의를 포함하여 버퍼로 원하는 모든 작업을 수행하는 것으로 충분합니다. 그러나 MT5에서는 EVERY SetIndexBuffer 이후에 터미널 ITSELF에서 OnCalculate에 대한 첫 번째 호출을 다시 기다려야 합니다.

이 기능은 설명서 어디에서도 다루지 않습니다. 그리고, 마찬가지로, "초보자"의 정의에 맞지 않습니다.

MT5가 MT4와 동일한 동작을 할 것으로 기대할 수 있습니까? 저것들. ITSELF 터미널에서 OnCalculate에 대한 첫 번째 호출 후 문제 없이 SetIndexBuffer를 호출 할 수 있도록 하시겠습니까?

 
comp :

결과적으로, 당신은 틀렸습니다. CAM 터미널이 OnCalculate를 호출할 때만 액세스할 수 있습니다. 동시에 MT4에서는 조건이 더 유연합니다. OnCalculate를 한 번만 호출하면 충분합니다. 그리고 MT5에서는 SetIndexBuffer 이후 매번 ITSELF 터미널의 OnCalculate 호출을 기다려야 합니다. 증거

MT4에서 이 표시기는 문제 없이 갈 것이고, MT5에서는 오류와 함께 즉시 충돌할 것입니다. 결과적으로 MT4에서는 ITSELF 터미널이 OnCalculate에 대한 첫 번째 호출을 기다린 다음 SetIndexBuffer를 통한 재정의를 포함하여 버퍼로 원하는 모든 작업을 수행하는 것으로 충분합니다. 그러나 MT5에서는 EVERY SetIndexBuffer 이후에 터미널 ITSELF에서 OnCalculate에 대한 첫 번째 호출을 다시 기다려야 합니다.

이 기능은 설명서 어디에서도 다루지 않습니다. 그리고, 마찬가지로, "초보자"의 정의에 맞지 않습니다.

MT5가 MT4와 동일한 동작을 할 것으로 기대할 수 있습니까? 저것들. ITSELF 터미널에서 OnCalculate에 대한 첫 번째 호출 후 문제 없이 SetIndexBuffer를 호출 할 수 있도록 하시겠습니까?

장황하게 말하지 마십시오. 자연스럽게 OnCalculate를 호출하는 것은 터미널 자체에 의한 호출을 의미합니다.
OnCalculate() 함수는 Calculate 이벤트 를 기반으로 지표 값을 계산해야 하는 경우 사용자 지정 지표에서만 호출됩니다 . 이것은 일반적으로 지표가 계산되는 기호에 대해 새 틱이 도착할 때 발생합니다. 이 경우 지표는 이 기호의 가격 차트에 첨부할 필요가 없습니다.
사유: