任何菜鸟问题,为了不给论坛添乱。专业人士,不要路过。没有你就无处可去 - 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个错误(s), 0个警告(s) 1 1


 

假设我运行一个EA,然后在使用Bid的第一个tick上,EA必须记住这个价格到某个点,也许是一天,也许是一个小时。

可以用什么来记住这个价格?

 
AlexeyVik:

而在你的例子中,int start()

我不知道为什么。(想知道)为什么,但是在634构建中,以及在711中,如果你声明一个数组而不指定它的大小,int start()和没有#property strict的话,整个数组中的值是0。

 
在记忆的帮助下,比如说,a=b。
 
tara:

而且最好不要超越。

在这里。

0个错误(s), 0个警告(s) 1 1


所以,在这个例子中,它不是动态数组...这是一个脚本,不是一个指标...不要利用我的不注意。
 
AlexeyVik:

我不知道为什么。(我想知道)为什么,但是在634版本以及711版本中,在int start()和没有#property strict的情况下,如果你声明一个数组而没有指定它的大小,那么整个数组中的值是0。


#property strict意味着正常的编程水平。" 我明白我在做什么。"
 
gheka:

假设我运行专家顾问,那么在使用Bid的第一个tick上,专家顾问必须记住这个价格到某个点,也许是一天,也许是一个小时。

我可以用什么来记忆呢?

没有什么诀窍。如果你想记住这个值并在一段时间内不改变它,你应该指定条件

If(event)给一个变量或数组项分配一些值。

同时,该变量或数组必须被声明为全局变量,或静态变量。