포럼을 어지럽히 지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 6. - 페이지 727

 
AlexeyVik :

mql4 혁신은 어레이의 크기를 지정해야 한다는 것입니다.

무슨 공포에서?

 /*    Soft Fractals ZigZag Indicator - индикатор строит зигзаг по фракталам 
   с произвольными размерами правого и левого крыльев. */
#property copyright "Copyright 2012, Тарабанов А.В."
#property link        "alextar@bk.ru"
#property indicator_chart_window                    // Индикатор в главном окне
// Индикаторные буферы
#property indicator_buffers 4
#property indicator_width1 1                        // Толщина зигзага
#property indicator_color3 Green                   // Нижние вершины
#property indicator_width3 1
#property indicator_color4 Red                     // Верхние вершины
#property indicator_width4 1
double Min[]   , Max[],                             // Изломы зигзага
       Bottom[], Top[];                             // Вершины
// Константы
#define Version "iSFZZ"                              // Версия
#define Zero     0.00000001                          // Точность определения нуля
// Глобальные переменные
double       LastBottom , LastTop;                   // Предыдущие значения
int          iLastBottom, iLastTop;                 //    и их бары
datetime     tLastBottom, tLastTop;                 // Время предыдущих значений
bool         LastIsTop  , LastIsBottom;             // Предыдущий пик/впадина
extern bool ОтображатьВершины   = true ;             // Внешние переменные
extern int   БаровЛевееВершины   = 2 ,
            БаровПравееВершины  = 2 ,
            СимволНижнейВершины = 161 ,
            СимволВерхнейВершины= 161 ;
//+------------------------------------------------------------------+
int init(){
   int DrawFractals= DRAW_NONE ;
   if ( ОтображатьВершины ) DrawFractals= DRAW_ARROW ;
   // Атрибуты буферов
   SetIndexLabel( 0 , "Max" );
   SetIndexBuffer ( 0 ,Max);
   SetIndexStyle( 0 , DRAW_ZIGZAG );
   SetIndexEmptyValue( 0 , 0 );
   SetIndexLabel( 1 , "Min" );
   SetIndexBuffer ( 1 ,Min);
   SetIndexStyle( 1 , DRAW_ZIGZAG );
   SetIndexEmptyValue( 1 , 0 );
   SetIndexLabel( 2 , "Bottom" );
   SetIndexBuffer ( 2 ,Bottom);
   SetIndexStyle( 2 ,DrawFractals);
   SetIndexArrow( 2 ,СимволНижнейВершины);
   SetIndexEmptyValue( 2 , 0 );
   SetIndexLabel( 3 , "Top" );
   SetIndexBuffer ( 3 ,Top);
   SetIndexStyle( 3 ,DrawFractals);
   SetIndexArrow( 3 ,СимволВерхнейВершины);
   SetIndexEmptyValue( 3 , 0 );
   if ( БаровЛевееВершины < 1 ) БаровЛевееВершины= 1 ; // Контроль значений
   if ( БаровПравееВершины < 1 ) БаровПравееВершины= 1 ;
   LastBottom  = 0 ;                                 // Инициализация
   LastTop     = 0 ;
   iLastBottom = 0 ;
   iLastTop    = 0 ;
   tLastBottom = 0 ;
   tLastTop    = 0 ;
   LastIsTop   = false ;
   LastIsBottom= false ;
   return ( 0 );
}
//+------------------------------------------------------------------+
int start(){
   int i, History= Bars - 1 , BarsLost=History-IndicatorCounted();
   if ( BarsLost<History ){
       if ( BarsLost< 1 ) return ( 0 );                   // Не повторять на том-же баре
      i=BarsLost+БаровПравееВершины;               // Число баров пересчета
   }
   else i=History-БаровЛевееВершины;               // Просмотр на всей истории
   double C[];
   int dim= ArrayResize (C,БаровЛевееВершины+ 1 +БаровПравееВершины), j;
   if ( tLastTop> 0 ) iLastTop=iBarShift( NULL , 0 ,tLastTop);
   if ( tLastBottom> 0 ) iLastBottom=iBarShift( NULL , 0 ,tLastBottom);
   while ( i>БаровПравееВершины ){                   // Перебор слева направо
      j= 0 ;                                         // Поиск нижнего фрактала
      Bottom[i]= 0 ;
       while ( j < dim ){
         C[j]=Low[j+i-БаровПравееВершины];
         j++;
      }
       if ( C[БаровПравееВершины+ 1 ]-C[БаровПравееВершины]>-Zero
       && C[БаровПравееВершины- 1 ]-C[БаровПравееВершины]>-Zero ){
         Bottom[i]=C[БаровПравееВершины];           // Локальный минимум
         j= 1 ;
         while ( j < dim ){
             if ( ( j<БаровПравееВершины && Bottom[i]-C[j- 1 ]>Zero )
             || ( j>БаровПравееВершины && Bottom[i]-C[j]  >Zero ) ) {
               Bottom[i]= 0 ;                         // Нет фрактала
               break ;
            }
            j++;
      }  }
      j= 0 ;             // Поиск верхнего фрактала
      Top[i]= 0 ;
       while ( j<dim ){
         C[j]=High[j+i-БаровПравееВершины];
         j++;
      }
       if ( C[БаровПравееВершины]-C[БаровПравееВершины+ 1 ]>-Zero
       && C[БаровПравееВершины]-C[БаровПравееВершины- 1 ]>-Zero ){
         Top[i]=C[БаровПравееВершины];             // Локальный максимум
         j= 1 ;
         while ( j < dim ){
             if ( ( j<БаровПравееВершины && C[j- 1 ]-Top[i]>Zero )
             || ( j>БаровПравееВершины && C[j]  -Top[i]>Zero ) ) {
               Top[i]= 0 ;                           // Нет фрактала
               break ;
            }
            j++;
      }  }
       if ( Top[i]>Zero ){                           // Выбор вершины зигзага
         if ( Bottom[i]>Zero ){                     // Top и Bottom
             if ( LastIsTop || LastIsBottom ){       // Не начало зигзага
               Min[i]     =Bottom[i];               // Вертикальное колено
               Max[i]     =Top[i];
               LastBottom =Bottom[i];               // Запомнить Top и Bottom
               iLastBottom=i;
               LastTop    =Top[i];
               iLastTop   =i;
         }  }
         else {                                     // Top
             if ( !LastIsTop ){                       // LastIsBottom, или
               Max[i]      =Top[i];                 //    начало зигзага
               LastIsTop   = true ;
               LastIsBottom= false ; 
               LastTop     =Top[i];                 // Запомнить Top
               iLastTop    =i;
            }
             else {                                   // LastIsTop
               if ( Top[i]-LastTop>-Zero ){         // Перерисовка
                  Max[iLastTop]= 0 ;
                  Max[i]       =Top[i];
                  LastTop      =Top[i];             // Запомнить Top
                  iLastTop     =i;
      }  }  }  }
       else {
         if ( Bottom[i]>Zero ){                     // Bottom
             if ( !LastIsBottom ){                   // LastIsTop, или
               Min[i]      =Bottom[i];             //    начало зигзага
               LastIsTop   = false ;
               LastIsBottom= true ; 
               LastBottom  =Bottom[i];             // Запомнить Bottom
               iLastBottom =i;
            }
             else {                                   // LastIsBottom
               if ( LastBottom-Bottom[i]>-Zero ){   // Перерисовка
                  Min[iLastBottom]= 0 ;
                  Min[i]          =Bottom[i];
                  LastBottom      =Bottom[i];       // Запомнить Bottom
                  iLastBottom     =i;
      }   }  }  }
      i--;
   }
   if ( iLastTop> 0 ) tLastTop=Time[iLastTop];       // Время крайних изломов
   if ( iLastBottom> 0 ) tLastBottom=Time[iLastBottom];
   return ( 0 );
}
0 error(s), 0 warning(s)		1	1

 

모두에게 감사합니다!

 double arr[3];

arr[ 0 ] = 300.0 ;
arr[ 1 ] = 254.0 ;
arr[ 2 ] = Bid; 
Alert ( "В массиве arr под индексом 0 значение " , arr[ 0 ]); // 300
Alert ( "В массиве arr под индексом 1 значение " , arr[ 1 ]); // 254  
 Alert ( "В массиве arr под индексом 1 значение " , arr[ 2 ]); // Bid всё равно меняется на каждом тике, в чём же прикол этих массивов?, я с таким же успехом могу и так сделать
 Alert ( "В массиве arr под индексом 1 значение " , Bid); я думал что массив запоминает цену с первого тика и держит эту инфо на последующих тиках
 
tara :

무슨 공포에서?

네, 무릎을 꿇고 글을 쓰면서 그렇게 생각했습니다. 그리고 스크립트의 void OnStart()에 삽입하고 로그에서 배열 외부의 출력을 얻었을 때 이런 결론에 도달했습니다. 그리고 귀하의 예에서 int start() 이것은 #property strict가 없는 이전 버전의 쓰기입니다.

그리고 #property strict가 없으면 이것이 제공됩니다.

 #property version    "1.00"
//#property strict

double arr[];
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
   arr[ 0 ] = 300.0 ;
   arr[ 1 ] = 254.0 ;
   arr[ 2 ] = Bid;
   Alert ( "В массиве arr под индексом 0 значение " , arr[ 0 ]); // 300
   Alert ( "В массиве arr под индексом 1 значение " , arr[ 1 ]); // 254
   Alert ( "В массиве arr под индексом 2 значение " , arr[ 2 ]); // Bid
   
  }
//+------------------------------------------------------------------+


 

그리고 외출을 삼가하는 것이 좋습니다.

여기:

 /*    Soft Fractals ZigZag Indicator - индикатор строит зигзаг по фракталам 
   с произвольными размерами правого и левого крыльев. */
#property strict
#property copyright "Copyright 2012, Тарабанов А.В."
#property link        "alextar@bk.ru"
#property indicator_chart_window                    // Индикатор в главном окне
// Индикаторные буферы
#property indicator_buffers 4
#property indicator_width1 1                        // Толщина зигзага
#property indicator_color3 Green                   // Нижние вершины
#property indicator_width3 1
#property indicator_color4 Red                     // Верхние вершины
#property indicator_width4 1
double Min[]   , Max[],                             // Изломы зигзага
       Bottom[], Top[];                             // Вершины
// Константы
#define Version "iSFZZ"                              // Версия
#define Zero     0.00000001                          // Точность определения нуля
// Глобальные переменные
double       LastBottom , LastTop;                   // Предыдущие значения
int          iLastBottom, iLastTop;                 //    и их бары
datetime     tLastBottom, tLastTop;                 // Время предыдущих значений
bool         LastIsTop  , LastIsBottom;             // Предыдущий пик/впадина
extern bool ОтображатьВершины   = true ;             // Внешние переменные
extern int   БаровЛевееВершины   = 2 ,
            БаровПравееВершины  = 2 ,
            СимволНижнейВершины = 161 ,
            СимволВерхнейВершины= 161 ;
//+------------------------------------------------------------------+
int init(){
   int DrawFractals= DRAW_NONE ;
   if ( ОтображатьВершины ) DrawFractals= DRAW_ARROW ;
   // Атрибуты буферов
   SetIndexLabel( 0 , "Max" );
   SetIndexBuffer ( 0 ,Max);
   SetIndexStyle( 0 , DRAW_ZIGZAG );
   SetIndexEmptyValue( 0 , 0 );
   SetIndexLabel( 1 , "Min" );
   SetIndexBuffer ( 1 ,Min);
   SetIndexStyle( 1 , DRAW_ZIGZAG );
   SetIndexEmptyValue( 1 , 0 );
   SetIndexLabel( 2 , "Bottom" );
   SetIndexBuffer ( 2 ,Bottom);
   SetIndexStyle( 2 ,DrawFractals);
   SetIndexArrow( 2 ,СимволНижнейВершины);
   SetIndexEmptyValue( 2 , 0 );
   SetIndexLabel( 3 , "Top" );
   SetIndexBuffer ( 3 ,Top);
   SetIndexStyle( 3 ,DrawFractals);
   SetIndexArrow( 3 ,СимволВерхнейВершины);
   SetIndexEmptyValue( 3 , 0 );
   if ( БаровЛевееВершины < 1 ) БаровЛевееВершины= 1 ; // Контроль значений
   if ( БаровПравееВершины < 1 ) БаровПравееВершины= 1 ;
   LastBottom  = 0 ;                                 // Инициализация
   LastTop     = 0 ;
   iLastBottom = 0 ;
   iLastTop    = 0 ;
   tLastBottom = 0 ;
   tLastTop    = 0 ;
   LastIsTop   = false ;
   LastIsBottom= false ;
   return ( 0 );
}
//+------------------------------------------------------------------+
int start(){
   int i, History= Bars - 1 , BarsLost=History-IndicatorCounted();
   if ( BarsLost<History ){
       if ( BarsLost< 1 ) return ( 0 );                   // Не повторять на том-же баре
      i=BarsLost+БаровПравееВершины;               // Число баров пересчета
   }
   else i=History-БаровЛевееВершины;               // Просмотр на всей истории
   double C[];
   int dim= ArrayResize (C,БаровЛевееВершины+ 1 +БаровПравееВершины), j;
   if ( tLastTop> 0 ) iLastTop=iBarShift( NULL , 0 ,tLastTop);
   if ( tLastBottom> 0 ) iLastBottom=iBarShift( NULL , 0 ,tLastBottom);
   while ( i>БаровПравееВершины ){                   // Перебор слева направо
      j= 0 ;                                         // Поиск нижнего фрактала
      Bottom[i]= 0 ;
       while ( j < dim ){
         C[j]=Low[j+i-БаровПравееВершины];
         j++;
      }
       if ( C[БаровПравееВершины+ 1 ]-C[БаровПравееВершины]>-Zero
       && C[БаровПравееВершины- 1 ]-C[БаровПравееВершины]>-Zero ){
         Bottom[i]=C[БаровПравееВершины];           // Локальный минимум
         j= 1 ;
         while ( j < dim ){
             if ( ( j<БаровПравееВершины && Bottom[i]-C[j- 1 ]>Zero )
             || ( j>БаровПравееВершины && Bottom[i]-C[j]  >Zero ) ) {
               Bottom[i]= 0 ;                         // Нет фрактала
               break ;
            }
            j++;
      }  }
      j= 0 ;             // Поиск верхнего фрактала
      Top[i]= 0 ;
       while ( j<dim ){
         C[j]=High[j+i-БаровПравееВершины];
         j++;
      }
       if ( C[БаровПравееВершины]-C[БаровПравееВершины+ 1 ]>-Zero
       && C[БаровПравееВершины]-C[БаровПравееВершины- 1 ]>-Zero ){
         Top[i]=C[БаровПравееВершины];             // Локальный максимум
         j= 1 ;
         while ( j < dim ){
             if ( ( j<БаровПравееВершины && C[j- 1 ]-Top[i]>Zero )
             || ( j>БаровПравееВершины && C[j]  -Top[i]>Zero ) ) {
               Top[i]= 0 ;                           // Нет фрактала
               break ;
            }
            j++;
      }  }
       if ( Top[i]>Zero ){                           // Выбор вершины зигзага
         if ( Bottom[i]>Zero ){                     // Top и Bottom
             if ( LastIsTop || LastIsBottom ){       // Не начало зигзага
               Min[i]     =Bottom[i];               // Вертикальное колено
               Max[i]     =Top[i];
               LastBottom =Bottom[i];               // Запомнить Top и Bottom
               iLastBottom=i;
               LastTop    =Top[i];
               iLastTop   =i;
         }  }
         else {                                     // Top
             if ( !LastIsTop ){                       // LastIsBottom, или
               Max[i]      =Top[i];                 //    начало зигзага
               LastIsTop   = true ;
               LastIsBottom= false ; 
               LastTop     =Top[i];                 // Запомнить Top
               iLastTop    =i;
            }
             else {                                   // LastIsTop
               if ( Top[i]-LastTop>-Zero ){         // Перерисовка
                  Max[iLastTop]= 0 ;
                  Max[i]       =Top[i];
                  LastTop      =Top[i];             // Запомнить Top
                  iLastTop     =i;
      }  }  }  }
       else {
         if ( Bottom[i]>Zero ){                     // Bottom
             if ( !LastIsBottom ){                   // LastIsTop, или
               Min[i]      =Bottom[i];             //    начало зигзага
               LastIsTop   = false ;
               LastIsBottom= true ; 
               LastBottom  =Bottom[i];             // Запомнить Bottom
               iLastBottom =i;
            }
             else {                                   // LastIsBottom
               if ( LastBottom-Bottom[i]>-Zero ){   // Перерисовка
                  Min[iLastBottom]= 0 ;
                  Min[i]          =Bottom[i];
                  LastBottom      =Bottom[i];       // Запомнить Bottom
                  iLastBottom     =i;
      }   }  }  }
      i--;
   }
   if ( iLastTop> 0 ) tLastTop=Time[iLastTop];       // Время крайних изломов
   if ( iLastBottom> 0 ) tLastBottom=Time[iLastBottom];
   return ( 0 );
}

오류 0개, 경고 0개 하나 하나


 

내가 어드바이저를 시작했다고 가정해 보겠습니다. 바로 거기에서 Bid를 사용하는 첫 번째 틱에 어드바이저는 하루 또는 한 시간 동안 특정 시점까지 이 가격을 기억해야 합니다.

무엇을 기억하는 데 사용할 수 있습니까?

 
AlexeyVik :

그리고 귀하의 예에서 int start()

x.z. (알고 싶습니다) 하지만 빌드 711에서와 같이 빌드 634에서 int start() 및 #property strict 없이는 크기를 지정하지 않고 배열을 선언하면 전체 배열에서 값 0을 제공합니다...

 
기억의 도움으로. 예를 들어 a=b.
 
tara :

그리고 밖에 나가지 않는 것이 좋습니다.

여기:

오류 0개, 경고 0개 하나 하나


그래서 예제에서는 동적 배열 이 없습니다... 예제에서는 스크립트가 아니라 지표가 ... 내 부주의를 이용하지 마십시오.
 
AlexeyVik :

x.z. (알고 싶습니다) 하지만 빌드 711에서와 같이 빌드 634에서 int start() 및 #property strict 없이는 크기를 지정하지 않고 배열을 선언하면 전체 배열에서 값 0을 제공합니다...


#property strict는 일반적인 프로그래밍 수준을 의미합니다. "나는 내가 하는 일을 이해한다."
 
gheka :

내가 어드바이저를 시작했다고 가정해 보겠습니다. 바로 거기에서 Bid를 사용하는 첫 번째 틱에 어드바이저는 하루 또는 한 시간 동안 특정 시점까지 이 가격을 기억해야 합니다.

무엇을 기억하는 데 사용할 수 있습니까?

농담이 아니다. 값을 기억하고 일정 시간 동안 변경하지 않아야 하는 경우 조건을 설정해야 합니다.

if (event) 변수 또는 배열 요소에 값을 할당합니다.

이 경우 변수 또는 배열은 전역 변수 또는 정적 수준에서 선언되어야 합니다.