копирование масивов???

 

Подскажите , пожалуйста, в чём моя ошибка. 

Передо мной стойт такая задача: 

Нужно сохранить параметры от двух последних тиков.
И так, как это сделать так чтобы при каждом новом тике, эти параметры сохранились.
Я делаю так.
-обьявляю в начале 2 массива:
Mas_Old и Mas_New
old-это параметры предпоследнего тика;
New-это параметры последнего тика;

не даю им никакого значения;

Потом копируем один масив в другой //*****ArrayCopy(Mas_Old,Mas_New)
обнуляем последний(свежий)             //*****ArrayInitialize(Mas_New,0);
даём ему новые параметры.

Когда компилирую, то есть ошибки,вот они
'Mas_Old'-variable not defined
'Maz_New'-variable not defined

Как я могу дать им значения, если при каждом новом тике, мне нужны данные последнего, и предпоследнего тиков, а не те которые я буду задавать их в начале , при их обьявление?
 
Где код?
 

Я немножко, изменил код, теперь ошибок нет.

Но проблема старая, индикатор не показывает разные значения двух последних тиков

а показывает в обоих массивов значение последнего тика. 

Вот код

//+------------------------------------------------------------------+

//|                                            prostoi indicator.mq4 |

//|                        Copyright 2012, MetaQuotes Software Corp. |

//|                                        http://www.metaquotes.net |

//+------------------------------------------------------------------+

#property copyright "Copyright 2012, MetaQuotes Software Corp."

#property link      "http://www.metaquotes.net"


#property indicator_chart_window

//+------------------------------------------------------------------+

//| Custom indicator initialization function                         |

//+------------------------------------------------------------------+

int init()

  {

//---- indicators

//----

   return(0);

  }

//+------------------------------------------------------------------+

//| Custom indicator deinitialization function                       |

//+------------------------------------------------------------------+

int deinit()

  {

//----

   

//----

   return(0);

  }

//+------------------------------------------------------------------+

//| Custom indicator iteration function                              |

//+------------------------------------------------------------------+

int start()

  {

//----


    string Mas_Old[1],Mas_New[1]       ,                                         

    z=TimeToStr(MarketInfo(Symbol(), MODE_TIME), TIME_DATE|TIME_SECONDS);  

     ArrayCopy(Mas_Old, Mas_New)      ;             

     ArrayInitialize(Mas_New,0)             ; 

     Mas_New[1]=z                              ;

     Alert("Mas_New="+Mas_New1])    ;             

     Alert("Mas_Old="+Mas_Old[1])       ; 

     //----

   return(0);

  }

//+------------------------------------------------------------------+

 
Mihail10:

Я немножко, изменил код, теперь ошибок нет.

Но проблема старая, индикатор не показывает разные значения двух последних тиков

а показывает в обоих массивов значение последнего тика. 



Ваши массивы какого типа???

Почитайте про ArrayInitialize().

 

У меня массивы типа "string".

Понял, ArrayInitalize() , в данном случае ,не пригоден.

Так как же очистить такой массив при приходе каждого нового тика? 

 
Mihail10:

У меня массивы типа "string".

Понял, ArrayInitalize() , в данном случае ,не пригоден.

Так как же очистить такой массив при приходе каждого нового тика? 

Не понятно:

1 - зачем использовать stirng переменные для сохранения значение времени???

2 - зачем использовать массивы с размером 1???

 

ок,более конкретно.

В интернете прочитал что, для того чтобы иметь данные времени в формате ЧЧ:ММ:СС от двух последних тиков, то необходимо вначале создать два пустых массива:

Mas_Old    --для "старого" тика

Mas_New   -- для нового тика

В начале эти массивы  пустые.

Потом  через ArrayCopy(Mas_Old,Mas_New) копируем, пока ещё пустой Mas_New в Mas_Old

Далее объявляем string переменную "z",и присваиваем ей значение времени последнего тика

   z=TimeToStr(MarketInfo(Symbol(), MODE_TIME), TIME_DATE|TIME_SECONDS);

Потом присваиваем  "z" массиву "Mas_New"

 Mas_New[1]=z ;

       Ну и для наглядности выведем результаты на экран содержимого этих двух массивов через Alert().

К сожалению , при выводе на экран cодержимое этих двух массивов одинаковое, и является информацией от последнего тика.

 

Решение проблемы наверняка не такое и сложное, но пока мои результаты поиска нулевые.

Буду рад любой подсказке с вашей стороны. 

 
Mihail10:

ок,более конкретно.

В интернете прочитал что, для того чтобы иметь данные времени в формате ЧЧ:ММ:СС от двух последних тиков, то необходимо вначале создать два пустых массива:

Mas_Old    --для "старого" тика

Mas_New   -- для нового тика

В начале эти массивы  пустые.

Потом  через ArrayCopy(Mas_Old,Mas_New) копируем, пока ещё пустой Mas_New в Mas_Old

Далее объявляем string переменную "z",и присваиваем ей значение времени последнего тика

   z=TimeToStr(MarketInfo(Symbol(), MODE_TIME), TIME_DATE|TIME_SECONDS);

Потом присваиваем  "z" массиву "Mas_New"

 Mas_New[1]=z ;

       Ну и для наглядности выведем результаты на экран содержимого этих двух массивов через Alert().

К сожалению , при выводе на экран cодержимое этих двух массивов одинаковое, и является информацией от последнего тика.

 

Решение проблемы наверняка не такое и сложное, но пока мои результаты поиска нулевые.

Буду рад любой подсказке с вашей стороны. 

 

Сначала ознакомьтесь с TimeCurrent(), а затем почитайте про GetTickCount(). Может что-то прояснится?!

А для усвоения материала это:

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
void start()
{
    int    Razn[5];
    string ls_Razn = "";
    static int    Array[] = {0,0,0,0,0,0};
    static double prePrice = 0.0;
//----
    for (int i = 5; i > 0; i--) {Array[i] = Array[i-1];}
    Array[0] = GetTickCount();
    for (i = 0; i < 5; i++)
    {
        Razn[i] = Array[i] - Array[i+1];
        ls_Razn = StringConcatenate (ls_Razn, "\n  Время", i, ": ", fTimeToStr (Razn[i]));
    }
    Comment ("\n  Старая цена: " + DoubleToStr (prePrice, Digits) +
            "\n  Новая цена: " + DoubleToStr (Bid, Digits) + ls_Razn);
    prePrice = Bid;     
//----
}
//+------------------------------------------------------------------+ 
string fTimeToStr (int fi_Time)
{
    string ls_Time = StringConcatenate (TimeToStr (fi_Time / 1000, TIME_SECONDS), ":", fi_Time % 1000, " ms.");
//----
    if (StringFind (ls_Time, "00:") != -1) ls_Time = StringSubstr (ls_Time, 3);
//----
    return (ls_Time); 
}
 
Mihail10:

Я немножко, изменил код, теперь ошибок нет.

Но проблема старая, индикатор не показывает разные значения двух последних тиков

а показывает в обоих массивов значение последнего тика. 

Вот код

//+------------------------------------------------------------------+

//|                                            prostoi indicator.mq4 |

//|                        Copyright 2012, MetaQuotes Software Corp. |

//|                                        http://www.metaquotes.net |

//+------------------------------------------------------------------+

#property copyright "Copyright 2012, MetaQuotes Software Corp."

#property link      "http://www.metaquotes.net"


#property indicator_chart_window

//+------------------------------------------------------------------+

//| Custom indicator initialization function                         |

//+------------------------------------------------------------------+

int init()

  {

//---- indicators

//----

   return(0);

  }

//+------------------------------------------------------------------+

//| Custom indicator deinitialization function                       |

//+------------------------------------------------------------------+

int deinit()

  {

//----

   

//----

   return(0);

  }

//+------------------------------------------------------------------+

//| Custom indicator iteration function                              |

//+------------------------------------------------------------------+

int start()

  {

//----


    string Mas_Old[1],Mas_New[1]       ,                                         

    z=TimeToStr(MarketInfo(Symbol(), MODE_TIME), TIME_DATE|TIME_SECONDS);  

     ArrayCopy(Mas_Old, Mas_New)      ;             

     ArrayInitialize(Mas_New,0)             ; 

     Mas_New[1]=z                              ;

     Alert("Mas_New="+Mas_New1])    ;             

     Alert("Mas_Old="+Mas_Old[1])       ; 

     //----

   return(0);

  }

//+------------------------------------------------------------------+



Стесняюсь, но все-таки спрошу:

1. если в массивах по одному элементу, то зачем массивы ? Какая такая "сермяжная" истина в массиве из одного элемента ? Чем это лучше, чем простое использование обычных переменных.

2.  Какой смысл в хранении действительных чисел (тип double) в строковых массивах ?

или просто тормозов добавить в исполняемый код "просто таки жуть как необходимо" ?  ;)

ЗЫ Вопросы риторические. 

 
Mihail10:

ок,более конкретно.

В интернете прочитал что,  ...

Буду рад любой подсказке с вашей стороны. 

 

Прочитайте ещё  весь учебник, в частности  здесь - по Вашему  вопросу. Действуйте по аналогии, добавляйте время.

 

Спасибо всем. 

Постараюсь найти выход из ситуаций. 

Причина обращения: