Скачать MetaTrader 5

Массивы - как передать значение из одного в другой?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Торгуй как успешные трейдеры - подпишись на их сигналы!
Forex Trader
114255
Forex Trader 2005.11.03 23:11 
Добрый вечер!

У меня такая проблема!

Хочу заставить индикатор рисовать пики только если между ними не менее определенного числа пипсов.
Для того чтобы сравнивать значения пиков на разных свечах - помещаю их в массив подряд, сравниваю значения массива на этой свече и предыдущее, а потом выставляю предыдущее значение на последний бар на котором был обнаружен пик.

Проблема в том что значения из временного массива не передаются в значение массива буффера.
Я пытался передать их примерно так:
for(i=1;i<Bars;i++)
{
ind_buffer1[i]=Buffer11[i];
}
Научите, если кто понимает в чем моя проблема.

Спасибо !!!
Forex Trader
114255
Forex Trader 2005.11.03 23:26  
Я бы повнимательней посмотрел на все формальности, типа определены ли массивы, правильно ли названы в тек. месте, учитывается ли нулевой индекс и пр.
А для передачи данных между массивами одинаковой длины можно использовать ArrayCopy()
Forex Trader
114255
Forex Trader 2005.11.03 23:26  
Для того чтобы сравнивать значения пиков на разных свечах - помещаю их в массив подряд, сравниваю значения массива на этой свече и предыдущее, а потом выставляю предыдущее значение на последний бар на котором был обнаружен пик.
зачем? они и так в массивах - High[] и Low[] называются.
А остальное понять без кода тяжело..
Forex Trader
114255
Forex Trader 2005.11.03 23:57  
Для того чтобы сравнивать значения пиков на разных свечах - помещаю их в массив подряд, сравниваю значения массива на этой свече и предыдущее, а потом выставляю предыдущее значение на последний бар на котором был обнаружен пик.
зачем? они и так в массивах - High[] и Low[] называются.
А остальное понять без кода тяжело..


Спасибо за помощ, если Вам будет не трудно - посмотрите пожалуйста мой код, на данном этапе он почемуто вообще не работает. Может я чего не так сделал?

#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 SpringGreen
//---- buffers
double Points[];
double Buffer1[];
double Buffer11[];
double Buffer2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_ARROW,EMPTY,4,Red);
   SetIndexBuffer(0,Buffer1);
   SetIndexArrow(0, 108);
   SetIndexStyle(1,DRAW_ARROW,EMPTY,4,SpringGreen); 
   SetIndexBuffer(1,Buffer2);
  SetIndexArrow(1, 108);
//----
   return(0);
  }

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int counted_bars=IndicatorCounted();
   int c=0;int i;
   double preup;
   
   
//---- 
   for(i=1;i<Bars;i++)
   {  bool pointup = High[i]>High[i-1] && High[i]>High[i+1] && High[i]>High[i-2] && High[i]>High[i+2];
      bool pointdown = Low[i]<Low[i+1] && Low[i]<Low[i+2] && Low[i]<Low[i-1] && Low[i]<Low[i-2];
      if(pointup)
      {c++;
      Points[c]=High[i];// в массив Points  значения пиков(по условию) заносятся по очереди
      Buffer11[i]=High[i]; //в массив Buffer11 значения заносяться только по номерам баров  
      
      }
      else 
      Buffer11[i]=0;
      
      
    
   
 }
   
 for(i=1;i<Bars;i++)
   {
    if(Buffer11[i]!=0 && Points[c]> Points[c-1]+20*Point)
      { int curbar=0;int bar=0;
         for( int shift=1;curbar==0;shift++)
         {
            
            if(Buffer11[i+shift]==0)
                bar++;
            if(Buffer11[i+shift]!=0)
            curbar=bar+1;
         }
        Buffer1[i]=Buffer11[i];
        Buffer1[i+curbar]=Buffer11[i+curbar];
      }
    }
    // Если пик на баре i в массиве Buffer11 не равен нулю и подходит условию, 
    //что предыдущий пик меньше настоящего на 20 пунктов, то ищем в массиве Buffer11[] 
    //колво баров назад где стоял пердыдущий пик, а потом выводим в буффер 2 значения - 
      // значение настоящего пика и значение пика curbar баров назад. 
//----
   return(0);
  }
//+------------------------------------------------------------------+
Forex Trader
114255
Forex Trader 2005.11.04 23:51  
Для того чтобы сравнивать значения пиков на разных свечах - помещаю их в массив подряд, сравниваю значения массива на этой свече и предыдущее, а потом выставляю предыдущее значение на последний бар на котором был обнаружен пик.
зачем? они и так в массивах - High[] и Low[] называются.
А остальное понять без кода тяжело..

Ну так как komposter ?
Вы поможете разобраться с массивами?
Forex Trader
114255
Forex Trader 2005.11.05 02:34  
Насколько я понял, задача состоит в том, чтоб рисовать High\Low свечи если он (High\Low) отличается от предыдущего отрисованного на 20 пунктов?
Тогда нечего заморачиваться с массивами - берём 2 переменные, сохраняем в них предыдущие отрисованные пики и перед новой прорисовкой сравниваем значения. Примерно так:
double PrevHigh = 0.0, PrevLow = 10000.0;
int start
{
   for ( int i = Bars-1; i >= 0; i -- )
   {
      Buffer1[i] = 0.0; Buffer2[i] = 0.0;
      if ( High[i] - PrevHigh > 20*Point ) { PrevHigh = High[i]; Buffer1[i] = PrevHigh; }
      if ( PrevLow - Low[i] > 20*Point ) { PrevLow = Low[i]; Buffer2[i] = PrevLow; }
   }
}


я не проверял (пример набросал прямо здесь), но по идее должно работать ;)

Forex Trader
114255
Forex Trader 2005.11.05 22:19  
Насколько я понял, задача состоит в том, чтоб рисовать High\Low свечи если он (High\Low) отличается от предыдущего отрисованного на 20 пунктов?
Тогда нечего заморачиваться с массивами - берём 2 переменные, сохраняем в них предыдущие отрисованные пики и перед новой прорисовкой сравниваем значения.


Уважаемый komposter,
Втом то и дело, что High\Low - это не просто верхи низы свечей - это что-то вроде фракталов Вильямса
(у меня так определяется Пик -
bool pointup = High[i]>High[i-1] && High[i]>High[i+1] && High[i]>High[i-2] && High[i]>High[i+2]; -
т.е. проверяется что этот пик выше пиков двух свечей назад и 2х свечей вперед )

так что я не могу сравнивать все подряд соседние пики, мне нужно сравнить именно предыдущий фрактал и настоящий.
Прошу Вас потратить пару минут на просмотр кода- он не очень сложный и я даю пояснения по ходу кода!!!

Заранее спасибо.
С уважением SOLO.
Forex Trader
114255
Forex Trader 2005.11.06 00:48  
Во-первых (на будущее) - если использовать индекс [i-2], надо цикл делать не for(i=1;i<Bars;i++) а for(i=1;i<Bars-2;i++)
Во-вторых - цикл логичнее делать от Bars-1 до 0 (с начала графика до конца)
В-третьих, вершину +/- 2-х баров проще найти ф-цией Highest
И это будет выглядеть примерно так:
double PrevHigh = 0.0, PrevLow = 10000.0;
int start
{
   for ( int i = Bars-1; i >= 0; i -- )
   {
      Buffer1[i] = 0.0; Buffer2[i] = 0.0;
      double tmp_high = High[Highest( Symbol(), Period(), MODE_HIGH, 5, i-2 )];
      double tmp_low = Low[Lowest( Symbol(), Period(), MODE_LOW, 5, i-2 )];
      if ( High[i] >= tmp_high && tmp_high - PrevHigh > 20*Point ) { PrevHigh = High[i]; Buffer1[i] = PrevHigh; }
      if ( Low[i] <= tmp_low && PrevLow - tmp_low > 20*Point ) { PrevLow = Low[i]; Buffer2[i] = PrevLow; }
   }
}



Была бы чётко и однозначно сформулирована задача - код был бы проще и написал бы я его с первой попытки ;)

Forex Trader
114255
Forex Trader 2005.11.06 11:33  
Во-первых (на будущее) - если использовать индекс [i-2], надо цикл делать не for(i=1;i<Bars;i++) а for(i=1;i<Bars-2;i++)
Во-вторых - цикл логичнее делать от Bars-1 до 0 (с начала графика до конца)
В-третьих, вершину +/- 2-х баров проще найти ф-цией Highest
И это будет выглядеть примерно так:
double PrevHigh = 0.0, PrevLow = 10000.0;
int start
{
   for ( int i = Bars-1; i >= 0; i -- )
   {
      Buffer1[i] = 0.0; Buffer2[i] = 0.0;
      double tmp_high = High[Highest( Symbol(), Period(), MODE_HIGH, 5, i-2 )];
      double tmp_low = Low[Lowest( Symbol(), Period(), MODE_LOW, 5, i-2 )];
      if ( High[i] >= tmp_high && tmp_high - PrevHigh > 20*Point ) { PrevHigh = High[i]; Buffer1[i] = PrevHigh; }
      if ( Low[i] <= tmp_low && PrevLow - tmp_low > 20*Point ) { PrevLow = Low[i]; Buffer2[i] = PrevLow; }
   }
}



Была бы чётко и однозначно сформулирована задача - код был бы проще и написал бы я его с первой попытки ;)



Ув. komposter, спасибо Вам за советы, но по Вашему коду - индикатор будет сравнивать пастоящий High/Low с High/Low предыдущих 5ти баров, а если условие не верно, то предыдущее значение tmp_high/tmp_low потеряется, и на следующем баре вычислиться новое. Правильно я понимаю.

Кстати у меня в Вашем варианте почему-то вообще ничего не выводит : :((
Мой индюк был такой:
//+------------------------------------------------------------------+
//| SkolzKanal.mq4 |
//| Copyright © 2005, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 SpringGreen
//---- buffers
double Points[];
double Buffer1[];
double Buffer11[];
double Buffer2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle(0,DRAW_ARROW,2,4,Red);
SetIndexBuffer(0,Buffer1);
SetIndexArrow(0, 108);
SetIndexStyle(1,DRAW_ARROW,2,4,SpringGreen);
SetIndexBuffer(1,Buffer2);
SetIndexArrow(1, 108);
//----
return(0);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
int c=0;
double preup; int i;

double PrevHigh = 0.0, PrevLow = 10000.0;

for (i=Bars-1; i >= 0; i -- )
{
Buffer1[i] = 0.0; Buffer2[i] = 0.0;
double tmp_high = High[Highest( Symbol(), Period(), MODE_HIGH, 5, i-2 )];
double tmp_low = Low[Lowest( Symbol(), Period(), MODE_LOW, 5, i-2 )];
if ( High[i] >= tmp_high && tmp_high - PrevHigh > 20*Point ) { PrevHigh = High[i]; Buffer1[i] = PrevHigh; }
if ( Low[i] <= tmp_low && PrevLow - tmp_low > 20*Point ) { PrevLow = Low[i]; Buffer2[i] = PrevLow; }
}

return(0);
}

Кстати, о задаче:

В идеале она состоит в том чтобы:
1)
а)Найти пик 5ти свечей - это можно сделать любым способом: по Higest(), или по iFractals(), или просто сравнением High[i]>High[i-1] && High[i]>High[i+1] && High[i]>High[i-2] && High[i]>High[i+2];
Согласны?
б)Сохранить это значение, так чтобы оно не изменилось на следующей свече, чтобы его можно было позже сравнить не со следующих баром, а со значением следующего Фрактала.

2)
а) Найти следующий Фрактал вниз.
б) Сохранить значение для последующего сравнения.

3)
а) Найти следующий Фрактал Вверх
б) Сохранить значение для последующего сравнения.

4)
а )Сравнить значение первого фрактала вверх с предыдущим фракталом вниз, а
предыдущий фрактал вниз с последним фракталом вверх (проще говоря сравнить последние 3 фрактала) если разница значений между парами фракталов больше определенного числа (20, 30 ,40 - вообщем изменяемого вручную), то нарисовать эти точки.

5)
а)Вычислить 4ю точку равную разнице между 3-им и 1-ым фракталом + Фрактал вниз
б) Нарисовать эту точку на графике на баре номер которого будет больше на число баров между 1ым и 2ым фракталами относительно к бару 3-го пика.

6) Верхом всего этого было-бы соеденение верхних фракталов между собой и нижних точек между собой линиями.

Таким образом мы получим постоянно изменяющийся канал (скользящий канал), который будет учитывать только экстремумы определенного размаха.
Конечно Вы наверное заметили что я описал ситуацию однобоко, т.е. взял два фрактала вверх и один вниз, хотя должна быть предусмотрена и обратная ситуация.

Я понимаю, что эти экстремумы можно отфильтровать с помощью зигзага, но там алгоритм не совсем такой как мне нужно.

Так что задачка не из легких, и я пытаюсь решать ее по частям. На первом этапе хотябы научиться сравнивать образовавшиеся фракталы, хотя бы и только верхние - это не принципиально.

Во всяком случае я очень благодарен Вам за помощь и буду рад увидеть Ваши дальнейшие коментарии.
Forex Trader
114255
Forex Trader 2005.11.06 15:18  
Ув. komposter, спасибо Вам за советы, но по Вашему коду - индикатор будет сравнивать пастоящий High/Low с High/Low предыдущих 5ти баров, а если условие не верно, то предыдущее значение tmp_high/tmp_low потеряется, и на следующем баре вычислиться новое. Правильно я понимаю.
не предыдущих, а 2-х вперёд, 2-х назад и текущего.
Оно сравнивает текущий хай с хаем +\- 2 баров - если он и есть самый большой из них, то сравниваем больше ли он предыдущего отрисованного (PrevHigh)
Яснее надо излагать задачи ;)
Сейчас выяснилось, что сравнивать надо с предыдущим Low надо - я об этом первый раз слышу =)))
Надо чуть сложнее логику сделать, но массивы использовать смысла всё равно не вижу )
А если и использовать, то с помощью IndicatorBuffers() - добавить ещё 2 или 4 массива и их заполнять...
Попробуй сам, если не получится, пиши - разберёмся ;)
Forex Trader
114255
Forex Trader 2005.11.06 17:46  
Вообщем уже и без массивов все устроил, оргооомное спасибо компостеру, но все же не понятно, почему нельзя передавать элементы обычного массива в массив буффера :((

Напр:

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red

double Buffer[];
double Massiv[];

int init()
{

SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,108);

return(0);
}

int start()
{
for( int i=Bars;i>=0;i--)
{

Massiv[i]=High[i]; //присваеваем значение итому элементу массива
Buffer[i]=Massiv[i];// присваиваем итый элемент массива итому элементу массива буффера.
}

return(0);
}

------------------------ В итоге ничего не выводится :((((.

Это основной вопрос топика, а не то, что можно сделать все без массивов.

Хотя я как раз в этом случае смог без них обойтись:))
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий