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

 
Vitaly Muzichenko # :


가장 좋은 방법은 다음과 같습니다.
 //+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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[])
{
   int H= 100 ;
   double b, a;
   if (prev_calculated== 0 ) {
     ArrayInitialize (Buffer1, EMPTY_VALUE );
     ArrayInitialize (Buffer2, EMPTY_VALUE );
  }

  b= SymbolInfoDouble ( Symbol (), SYMBOL_BID );
  a= SymbolInfoDouble ( Symbol (), SYMBOL_ASK );

   if (rates_total-prev_calculated== 1 ) {
    Buffer1[H+ 1 ]= EMPTY_VALUE ;
    Buffer2[H+ 1 ]= EMPTY_VALUE ;
  }
   else if (rates_total == prev_calculated) { // сдвигаем данные только когда количество баров не поменялось (в случае появления нового бара они сдвигаются системой терминала)
     for ( int j=H; j> 0 ; j--) { 
      Buffer1[j]=Buffer1[j- 1 ];
      Buffer2[j]=Buffer2[j- 1 ];
    }
  }
   // записываем новые данные
  Buffer1[ 0 ]=b;
  Buffer2[ 0 ]=a;
   return (rates_total);
}
 
JRandomTrader 링 버퍼 로 사용하면 첫 번째 요소의 현재 위치를 기억하고 있습니까?

기발한 아이디어! 누가 그것을 발명했으며 실제 적용은 무엇입니까? 나는 그것이 슬라이딩 윈도우 차트에만 독점적으로 사용되는지 의심합니다 ...

 
Mihail Matkovskij # :

기발한 아이디어! 누가 그것을 발명했으며 실제 적용은 무엇입니까? 나는 그것이 슬라이딩 윈도우 차트에만 독점적으로 사용되는지 의심합니다 ...

사실, 롤백할 수 있는 데이터의 양을 아는 것은 불필요하지 않습니다. 이 링 버퍼는 제한된 길이로 인해 "스스로 밟기" 때문에...

 
Mihail Matkovskij # :
가장 좋은 방법은 다음과 같습니다.

확인했습니다. 예, 이것은 좋은 결정입니다. 왼쪽.

그래도 ArrayCopy 의 작업을 확인하고 싶습니다.

---

저는 이렇게 하기로 결정했습니다. 그렇지 않으면 그래프가 아름답게 깨지지 않습니다.

 #property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots    2
#property indicator_type1    DRAW_LINE
#property indicator_color1    clrDodgerBlue
#property indicator_label1    "Bid"
#property indicator_type2    DRAW_LINE
#property indicator_color2    clrRed
#property indicator_label2    "Ask"

double Buffer1[];
double Buffer2[];
int H;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit ()
{
   SetIndexBuffer ( 0 ,Buffer1);
   ArraySetAsSeries (Buffer1, true );
   SetIndexBuffer ( 1 ,Buffer2);
   ArraySetAsSeries (Buffer2, true );
   ArrayInitialize (Buffer1, EMPTY_VALUE );
   ArrayInitialize (Buffer2, EMPTY_VALUE );
   IndicatorSetInteger ( INDICATOR_DIGITS , Digits ());
   IndicatorSetString ( INDICATOR_SHORTNAME , "Tick:" );
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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[])
{
  H=( int ) ChartGetInteger ( 0 , CHART_FIRST_VISIBLE_BAR );
   if (prev_calculated== 0 ) {
     ArrayInitialize (Buffer1, EMPTY_VALUE );
     ArrayInitialize (Buffer2, EMPTY_VALUE );
  }

   double b= SymbolInfoDouble ( Symbol (), SYMBOL_BID );
   double a= SymbolInfoDouble ( Symbol (), SYMBOL_ASK );

   if (rates_total-prev_calculated== 1 ) {
    Buffer1[H+ 1 ]= EMPTY_VALUE ;
    Buffer2[H+ 1 ]= EMPTY_VALUE ;
  } else if (rates_total == prev_calculated) { // сдвигаем данные только когда количество баров не поменялось (в случае появления нового бара они сдвигаются системой терминала)
     for ( int j=H; j> 0 ; j--) {
      Buffer1[j]=Buffer1[j- 1 ];
      Buffer2[j]=Buffer2[j- 1 ];
    }
  }
// записываем новые данные
  Buffer1[ 0 ]=b;
  Buffer2[ 0 ]=a;
   return (rates_total);
}
//+------------------------------------------------------------------+
void OnChartEvent ( const int id,         // идентификатор события
                   const long & lparam,   // параметр события типа long
                   const double & dparam, // параметр события типа double
                   const string & sparam   // параметр события типа string
                 )
{
   if (id== CHARTEVENT_CHART_CHANGE ) {
    H=( int ) ChartGetInteger ( 0 , CHART_FIRST_VISIBLE_BAR );
     int B= Bars ( Symbol (), 0 );
     for ( int j=H; j<B; j++) {
      Buffer1[j]= EMPTY_VALUE ;
      Buffer2[j]= EMPTY_VALUE ;
    }
  }
}
//+------------------------------------------------------------------+
 
JRandomTrader 링 버퍼 로 사용하면 첫 번째 요소의 현재 위치를 기억하고 있습니까?

Vitaly의 예는 이 아이디어를 사용할 수 있습니다. 그러나 당신은 여전히 그에게 중요한 사이클에서 벗어날 수 없습니다. 어느 쪽이든 루프를 사용하거나 ArrayCopy 기능을 사용하여 링 버퍼에서 표시기 버퍼로 데이터를 전송해야 합니다. 그리고 무엇이 바뀔까요?

 
Mihail Matkovskij # :

기발한 아이디어! 누가 그것을 발명했으며 실제 적용은 무엇입니까? 나는 그것이 슬라이딩 윈도우 차트에만 독점적으로 사용되는지 의심합니다 ...

누가 생각해 냈습니까? 끝이 없습니다. 여러 번 재창조 된 것 같습니다. 아이디어는 매우 분명합니다.

예를 들어, 저는 무엇보다도 히스토리에 저장되지 않고 순간적인 가치만 있는 데이터의 이동 평균을 계산하는 데 사용합니다.

데이터 전송에서 이것은 태곳적부터 사용되었습니다.

 
Mihail Matkovskij # :

Vitaly의 예는 이 아이디어를 사용할 수 있습니다. 그러나 당신은 여전히 그에게 중요한 사이클에서 벗어날 수 없습니다. 어느 쪽이든 루프를 사용하거나 ArrayCopy 기능을 사용하여 링 버퍼에서 표시기 버퍼로 데이터를 전송해야 합니다. 그리고 무엇이 바뀔까요?

새 값을 삽입하고 올바른 위치에서 즉시 복사할 수 있습니다. 복사 주기는 남아 있지만 이동 주기는 없습니다.

 
Vitaly Muzichenko # :

확인했습니다. 예, 이것은 좋은 결정입니다. 왼쪽.

그래도 ArrayCopy 의 작업을 확인하고 싶습니다.

ArrayCopy를 사용하면 다른 어레이의 데이터만 전송할 수 있습니다. 그러나 당신은 그들을 이동할 수 없습니다. 링 버퍼를 사용하여 데이터를 전송할 수 있습니다 ... 그러나 ArrayCopy로 수행하는 방법은 원형 모션이 있으면 ... 명확하지 않습니다. 그리고 원칙적으로 이것을 이해할 필요는 없습니다. 사이클을 사용하는 일반적인 오프셋은 속도 측면에서 그다지 중요하지 않습니다. 적어도 나는 더 빠른 것을 모른다. 어셈블러 만 더 빠를 수 있습니까? ... 일반적으로. 모든 것을 그대로 두십시오. 작동합니다.

 
JRandomTrader # :

새 값을 삽입하고 올바른 위치에서 즉시 복사할 수 있습니다. 복사 주기는 남아 있지만 이동 주기는 없습니다.

예를 들어주세요. 주제가 될 것입니다.

업그레이드 코드 사용 가능

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
  • 2022.02.13
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 
Mihail Matkovskij # :

ArrayCopy를 사용하면 다른 어레이의 데이터만 전송할 수 있습니다. 그러나 당신은 그들을 이동할 수 없습니다. 링 버퍼를 사용하여 데이터를 전송할 수 있습니다 ... 그러나 ArrayCopy로 수행하는 방법은 원형 모션이 있으면 ... 명확하지 않습니다. 그리고 원칙적으로 이것을 이해할 필요는 없습니다. 사이클을 사용하는 일반적인 오프셋은 속도 측면에서 그다지 중요하지 않습니다. 적어도 나는 더 빠른 것을 모른다. 어셈블러, 무엇이 더 빠를 수 있습니까? ... 일반적으로. 모든 것을 그대로 두십시오. 작동합니다.

이제 코드가 작동하지만 주기 때문에 속도에 대한 의구심이 있습니다.

그것은 무엇입니까?

차익 거래의 가능성에 대해 여러 주방을 확인하고 싶습니다. 표시기는 값의 차이를 표시하고 100ms마다 타이머에서 작동합니다. 이 상황에서는 코드 실행 지연이 중요합니다.