Ответ
 
Опции темы
Старый 28.09.2015, 10:34   #4201 (permalink)
Программист mql4 mql5
 
Аватар для AlexeyVik
 
Регистрация: 19.11.2009
Сообщений: 2,525
Репутация: 3646
AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik
Сказал(а) спасибо: 1,113
Поблагодарили 3,650 раз(а) в 1,470 сообщениях
Поинты: 2007
Сообщение от hoz Посмотреть сообщение
Здарова Алексей. Моя видимо

А вот это очень странно. Смысла нет пересчитывать условие на всех барах, которые мы сравниваем. Это не логично. Если сравниваем 100 баров, то проще сравнивать на каждом расчётном баре текущий и предыдущий. А не все сравниваемые. Как-то мне такой вариант вообще не нравится...
В принципе такой вариант тоже приемлем, но надо внимательно учесть обнуление счётчика. И лучше сделать два счётчика для разных направлений.
Может лучше продолжить на одном форуме? Скажи на каком тебе удобней. Или на одном больше не отвечай.
AlexeyVik на форуме   Ответить с цитированиемОтветить с цитированием  
2 пользователя(ей) сказали cпасибо:
hoz (28.09.2015), Viko2000 (28.09.2015)
Старый 28.09.2015, 10:55   #4202 (permalink)
Активный участник
 
Аватар для yurez83
 
Регистрация: 15.08.2013
Сообщений: 151
Репутация: 91
yurez83
Сказал(а) спасибо: 267
Поблагодарили 90 раз(а) в 43 сообщениях
Поинты: 70
Сообщение от AlexeyVik Посмотреть сообщение
А ты попробуй посчитать вручную что возвращает твоя функция int Proverka (double znah1 , double znah2) при первом обращении к ней.

Самый простой вариант обойти твою проблему, вызвать эту функцию из инита.
посчитал, да и через принт вывел в терминале, первое значение 1 или 2 (в зависимости от первоначального положения цены) , потом нули, если не изменяется положение цены, относительно машки..
как не возвращать первое значение функциии не могу придумать..
ваше второе предложение не понял. что даст вызов функции из инита?
нужно насколько я представляю в функции пока не присвоится значение переменной last не производить сравнивание с переменной current.
мозги сейчас взорвутся..

Сообщение от hoz Посмотреть сообщение
Если машка пересечена, т.е. Proverka возвратит 1 или 2, то по-любому вызовется условие:
так это и нужно. при любом пересечении ценой мувинга нужно чтобы закрывались профитные ордера и на бай и на селл..

Последний раз редактировалось yurez83; 28.09.2015 в 11:05.
yurez83 вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 28.09.2015, 11:28   #4203 (permalink)
Элитный участник
 
Аватар для lavandos
 
Регистрация: 29.04.2015
Адрес: Мидгард
Сообщений: 412
Репутация: 1310
lavandos lavandos lavandos lavandos lavandos lavandos lavandos lavandos lavandos lavandos
Сказал(а) спасибо: 582
Поблагодарили 1,310 раз(а) в 261 сообщениях
Поинты: 63
Люди, такой вопрос, имеем любой стрелочник, можно ли теоретически, а лучше практически написать простейшую сову по таким условиям?
Миниатюры:
Нажмите на изображение для увеличения
Название: Screenshot_2.png
Просмотров: 33
Размер:	25.2 Кб
ID:	220774  

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

Тот, кто наблюдает за игрой со стороны, часто видит в ней больше, чем её участники. (с)
lavandos на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 28.09.2015, 11:47   #4204 (permalink)
hoz
Активный участник
 
Аватар для hoz
 
Регистрация: 01.04.2011
Сообщений: 530
Репутация: 111
hoz hoz
Сказал(а) спасибо: 59
Поблагодарили 112 раз(а) в 88 сообщениях
Поинты: 538
Отправить сообщение для hoz с помощью ICQ
Сообщение от lavandos Посмотреть сообщение
Люди, такой вопрос, имеем любой стрелочник, можно ли теоретически, а лучше практически написать простейшую сову по таким условиям?
Да. Условие будет простое: Если стрелка появилась, значит установить ордер. В чём вопрос то?
Обычно, стрелка в буфере находится. Соответственно, проверяется на... если значение заданного буфера не пустое, то... установить ордер.
hoz вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 28.09.2015, 12:27   #4205 (permalink)
Программист mql4 mql5
 
Аватар для AlexeyVik
 
Регистрация: 19.11.2009
Сообщений: 2,525
Репутация: 3646
AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik
Сказал(а) спасибо: 1,113
Поблагодарили 3,650 раз(а) в 1,470 сообщениях
Поинты: 2007
Сообщение от yurez83 Посмотреть сообщение
посчитал, да и через принт вывел в терминале, первое значение 1 или 2 (в зависимости от первоначального положения цены) , потом нули, если не изменяется положение цены, относительно машки..
как не возвращать первое значение функциии не могу придумать..
ваше второе предложение не понял. что даст вызов функции из инита?
нужно насколько я представляю в функции пока не присвоится значение переменной last не производить сравнивание с переменной current.
мозги сейчас взорвутся..



так это и нужно. при любом пересечении ценой мувинга нужно чтобы закрывались профитные ордера и на бай и на селл..
Так я-же сказал что это самый простой способ. Вызвать функцию, тогда переменной last будет присвоено значение и при вызове её из старта будет нормальное сравнение.
Правильно представляешь. Дополни условие && last > 0 и будет тебе счастье. Тогда при первом вызове присвоится значение переменной last и только при втором вызове будет сравнение с current Ну и результат одинаковый.

Последний раз редактировалось AlexeyVik; 28.09.2015 в 12:32.
AlexeyVik на форуме   Ответить с цитированиемОтветить с цитированием  
2 пользователя(ей) сказали cпасибо:
Viko2000 (28.09.2015), yurez83 (28.09.2015)
Старый 28.09.2015, 14:15   #4206 (permalink)
Активный участник
 
Аватар для yurez83
 
Регистрация: 15.08.2013
Сообщений: 151
Репутация: 91
yurez83
Сказал(а) спасибо: 267
Поблагодарили 90 раз(а) в 43 сообщениях
Поинты: 70
Сообщение от AlexeyVik Посмотреть сообщение
Так я-же сказал что это самый простой способ. Вызвать функцию, тогда переменной last будет присвоено значение и при вызове её из старта будет нормальное сравнение.
всё разобрался.. закинул в инит. спасибо.
yurez83 вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 28.09.2015, 18:52   #4207 (permalink)
hoz
Активный участник
 
Аватар для hoz
 
Регистрация: 01.04.2011
Сообщений: 530
Репутация: 111
hoz hoz
Сказал(а) спасибо: 59
Поблагодарили 112 раз(а) в 88 сообщениях
Поинты: 538
Отправить сообщение для hoz с помощью ICQ
Сообщение от AlexeyVik Посмотреть сообщение
В принципе такой вариант тоже приемлем, но надо внимательно учесть обнуление счётчика. И лучше сделать два счётчика для разных направлений.
Может лучше продолжить на одном форуме? Скажи на каком тебе удобней. Или на одном больше не отвечай.
Сам хотел предложить на распыляться. Вот именно! Я и думаю, как избавится от пересчёта всех сравниваемых последовательностей на каждой итерации. То что их должно быть 2, т.к. направления разные тоже понятно. Но пока что даже с одним не работает. Потому 2 направления не резон реализовывать.
Вот что я имею, если не писать как договаривались. Имею ввиду тут не использовал буферы и вложенный цикл

Скрытый текст

PHP код:
bool ExistencePositiveSequence (int fi_Index)
{
   if (
ClusterDelta::cdVolume (fi_Index) > ClusterDelta::cdVolume (fi_Index 1))
   {
      
sequenceCount++;
      
      return (
true);
   }
   
sequenceCount 0;
   
   return (
false);
}
//+---------------------------------------------------------------------------------------------------------------------------------------+
//|                                               Custom indicator iteration function                                                     |
//+---------------------------------------------------------------------------------------------------------------------------------------+
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 limit rates_total prev_calculated;
   
   while (
rates_total limit sequenceCount)
   {
      
limit--;
   }
/*   if (prev_calculated == 0) limit--;
   else limit++;
*/   
   
for (int i limit>= 0i--)
   {
      if ( (
ExistencePositiveSequence (i) == true) && (sequenceCount == 3) )
        
CDraw.DrawObject (_Symbol_Period,  OBJ_ARROW_UPiTime[i], Open[i]);
   }
   
//--- return value of prev_calculated for next call
   
return (rates_total);

[свернуть]



Что по Вашему тут не так? На мой взгляд всё очень просто и очевидно. Есть что сказать?

Последний раз редактировалось NSerega; 30.09.2015 в 21:42.
hoz вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 29.09.2015, 05:23   #4208 (permalink)
Программист mql4 mql5
 
Аватар для AlexeyVik
 
Регистрация: 19.11.2009
Сообщений: 2,525
Репутация: 3646
AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik
Сказал(а) спасибо: 1,113
Поблагодарили 3,650 раз(а) в 1,470 сообщениях
Поинты: 2007
Сообщение от hoz Посмотреть сообщение
Сам хотел предложить на распыляться. Вот именно! Я и думаю, как избавится от пересчёта всех сравниваемых последовательностей на каждой итерации. То что их должно быть 2, т.к. направления разные тоже понятно. Но пока что даже с одним не работает. Потому 2 направления не резон реализовывать.
Вот что я имею, если не писать как договаривались. Имею ввиду тут не использовал буферы и вложенный цикл

PHP код:
bool ExistencePositiveSequence (int fi_Index){   if (ClusterDelta::cdVolume (fi_Index) > ClusterDelta::cdVolume (fi_Index 1))   {      sequenceCount++;            return (true);   }   sequenceCount 0;      return (false);}//+---------------------------------------------------------------------------------------------------------------------------------------+//|                                               Custom indicator iteration function                                                     |//+---------------------------------------------------------------------------------------------------------------------------------------+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 limit = rates_total - prev_calculated;      while (rates_total - limit < sequenceCount)   {      limit--;   }/*   if (prev_calculated == 0) limit--;   else limit++;*/      for (int i = limit; i >= 0; i--)   {      if ( (ExistencePositiveSequence (i) == true) && (sequenceCount == 3) )        CDraw.DrawObject (_Symbol, _Period,  OBJ_ARROW_UP, i, Time[i], Open[i]);   }   //--- return value of prev_calculated for next call   return (rates_total);} 
Что по Вашему тут не так? На мой взгляд всё очень просто и очевидно. Есть что сказать?

Мне кажется здесь абсолютно неуместна отдельная функция, а ты к ним неравнодушен.
Вот как я представляю себе вариант без вложенного цикла.

Два условия, у1 и у2 и к ним две переменные, с1 и с2 как счётчики. Заданное количество повторов условия н = 3
В основном цикле индикатора проверка, выполнено у1 ... с1++ и с2 = 0
На следующем баре повторилось условие у1 -- с1++ и с2 опять = 0
Пока у1 не достигло значения н, а выполнено у2 ... с2++ и с1 = 0
Как только один из счётчиков станет равен н рисуем стрелку и обнуляем счётчик, а второй и так обнулён.
Если возможен вариант невыполнения обоих условий, то надо предусмотреть этот вариант и обнулить оба счётчика.

ps; Хотя определение выполнено-ли условие наверное можно и в функцию вынести. А ты проверял что возвращает ClusterDelta::cdVolume (fi_Index)
Может там что-то не так? В принципе я не нашёл откровенной ошибки. Разве что на нулевом баре будут проблемы. Надо сделать чтобы код выполнялся 1 раз на баре.

Последний раз редактировалось AlexeyVik; 29.09.2015 в 05:41.
AlexeyVik на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 29.09.2015, 17:46   #4209 (permalink)
hoz
Активный участник
 
Аватар для hoz
 
Регистрация: 01.04.2011
Сообщений: 530
Репутация: 111
hoz hoz
Сказал(а) спасибо: 59
Поблагодарили 112 раз(а) в 88 сообщениях
Поинты: 538
Отправить сообщение для hoz с помощью ICQ
Сообщение от AlexeyVik Посмотреть сообщение
Мне кажется здесь абсолютно неуместна отдельная функция, а ты к ним неравнодушен.

Есть такое. Люблю читабельный код. Когда каждая функция отвечает за канкретное действие. А не пихать всё в одном месте.


Сообщение от AlexeyVik Посмотреть сообщение
Вот как я представляю себе вариант без вложенного цикла.

Два условия, у1 и у2 и к ним две переменные, с1 и с2 как счётчики. Заданное количество повторов условия н = 3
В основном цикле индикатора проверка, выполнено у1 ... с1++ и с2 = 0
На следующем баре повторилось условие у1 -- с1++ и с2 опять = 0
Пока у1 не достигло значения н, а выполнено у2 ... с2++ и с1 = 0
Как только один из счётчиков станет равен н рисуем стрелку и обнуляем счётчик, а второй и так обнулён.
Если возможен вариант невыполнения обоих условий, то надо предусмотреть этот вариант и обнулить оба счётчика.

Алексей, в приципе теоритически Вы правы. Но тут есть один момент. В данном случае, если переменная не глобальная, а локальная, то обнулять счётчик не нужно по условию. Достаточно обнулять при входе в функцию.

Сообщение от AlexeyVik Посмотреть сообщение
ps; Хотя определение выполнено-ли условие наверное можно и в функцию вынести. А ты проверял что возвращает ClusterDelta::cdVolume (fi_Index)
Может там что-то не так? В принципе я не нашёл откровенной ошибки.

По поводу ClusterDelta::cdVolume (fi_Index) я разумеется проверял код. Там всё чётко. На самом деле, там 2 разных метода. Есть отрицательная дельта, а есть положительная.

Сообщение от AlexeyVik Посмотреть сообщение
Разве что на нулевом баре будут проблемы. Надо сделать чтобы код выполнялся 1 раз на баре.

С чего бы то вдруг нанулевом баре быть проблеме? Я ж как Вы предложили проверку сделал.

В общем, на данный момент я всё левое затёр. Имеется вот что а данный момент.

Скрытый текст

PHP код:
//+---------------------------------------------------------------------------------------------------------------------------------------+
//|                                                                                                           HighestBarOfTheSequence.mq4 |
//|                                                                                                                                   hoz |
//+---------------------------------------------------------------------------------------------------------------------------------------+
#property copyright "hoz"
#property version   "1.00"
#property strict

#property indicator_chart_window            // Индикатор выводится в окне графика
#property indicator_buffers 1               // Используется 2 буфера индикатора

input int countCamparedBars 3;            // Количество объёма определённого признака в последовательности
double   highestValue[];                    // Буфер максимальных значение объёма за N-баров

//+---------------------------------------------------------------------------------------------------------------------------------------+
//|                                                                OnInit()                                                               |
//+---------------------------------------------------------------------------------------------------------------------------------------+
int OnInit()
{
   
IndicatorBuffers(1);
   
   
// Связывание буфферов с индексами и определение стилей
   
SetIndexBuffer (0highestValue);
   
SetIndexStyle (0,  DRAW_ARROW03clrBlack);
   
SetIndexArrow (0241);
//---
   
return (INIT_SUCCEEDED);
}
//+---------------------------------------------------------------------------------------------------------------------------------------+
//|                                     Возвращаем флаг наличия возрастающей последовательности хаёв                                      |
//+---------------------------------------------------------------------------------------------------------------------------------------+
bool ExistencePositiveSequence (int fi_Indexint fi_CountCamparedBars)
{
   
int cnt 0;

   for (
int i fi_Indexfi_Index fi_CountCamparedBarsi++)
   {
      if (
High[i] > High[1])
        
cnt++;
   }
   
   if (
cnt == fi_CountCamparedBars)
     return (
true);
   
   return (
false);
}
/*bool ExistencePositiveSequence (int fi_Index, int bars)
{
   int cx = 0;
   
   if (High[fi_Index] > High[fi_Index + 1])
   {
      cx++;
      
      while (High[fi_Index + cx] > High[fi_Index + cx + 1]){
         cx++;
         if (cx >= bars) return true;
         
      }
   }
   return (false);
}*/
//+---------------------------------------------------------------------------------------------------------------------------------------+
//|                                                             OnCalculate()                                                             |
//+---------------------------------------------------------------------------------------------------------------------------------------+
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 limit rates_total prev_calculated;
   
   while ( (
rates_total limit ) < countCamparedBars)
   {
      
limit--;
   }
   
   for (
int i limit>= 0i--)
   {
      if (
ExistencePositiveSequence (icountCamparedBars) == true)
      {
         
highestValue[i] = High[i];
      }
   }
   
//--- return value of prev_calculated for next call
   
return (rates_total);

[свернуть]


Исходник прилагаю. При запуске критическая ошибка выхода за пределы массива. Ваша проверка не помогла!
Если код который закомментирован раскомментировать, а ниже приведённый закомментировать, тогда индикатор работает.

Скрытый текст

PHP код:
bool ExistencePositiveSequence (int fi_Indexint fi_CountCamparedBars)
{
   
int cnt 0;

   for (
int i fi_Indexfi_Index fi_CountCamparedBarsi++)
   {
      if (
High[i] > High[1])
        
cnt++;
   }
   
   if (
cnt == fi_CountCamparedBars)
     return (
true);
   
   return (
false);

[свернуть]


Почему понимаете?
То ли я что-то не допонимаю... то ли ... Вроде бы простая ситуация, но я что-то застрял.
Вложения:
Тип файла: mq4 HighestBarOfTheSequence.mq4 (3.9 Кб, 11 просмотров)
hoz вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 29.09.2015, 18:35   #4210 (permalink)
Программист mql4 mql5
 
Аватар для AlexeyVik
 
Регистрация: 19.11.2009
Сообщений: 2,525
Репутация: 3646
AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik
Сказал(а) спасибо: 1,113
Поблагодарили 3,650 раз(а) в 1,470 сообщениях
Поинты: 2007
Сообщение от hoz Посмотреть сообщение
Алексей, в приципе теоритически Вы правы. Но тут есть один момент. В данном случае, если переменная не глобальная, а локальная, то обнулять счётчик не нужно по условию. Достаточно обнулять при входе в функцию.
Учись у Буратино.


Потом, а почему локальная? Как-же ты хочешь подсчитывать если переменная будет обнуляться на каждом тике? Ну можно объявить локальную статическую... а чем она отличается от глобальной? НЕ GV!!!

Всё остальное позже посмотрю повнимательней.
Что касается нулевого бара:
Сначала индикатор пересчитывает исторические данные по одному разу на бар. Тут всё нормально. Но дойдя до нулевого, прошла проверка 1 раз... выполнено условие у1, счётчик ++ но когда поступил новый тик на этом-же баре он пересчитывается поновой и условие выполнено второй раз... затем третий... и вот тебе условие выполнено 3 раза... ставим стрелку. Но глазками мы видим что там её быть не должно...
Миниатюры:
Нажмите на изображение для увеличения
Название: 6069685.jpg
Просмотров: 113
Размер:	30.5 Кб
ID:	220898  

Последний раз редактировалось AlexeyVik; 29.09.2015 в 18:38.
AlexeyVik на форуме   Ответить с цитированиемОтветить с цитированием  
Пользователь сказал cпасибо:
DomovenokBrest (30.09.2015)
Старый 29.09.2015, 18:44   #4211 (permalink)
hoz
Активный участник
 
Аватар для hoz
 
Регистрация: 01.04.2011
Сообщений: 530
Репутация: 111
hoz hoz
Сказал(а) спасибо: 59
Поблагодарили 112 раз(а) в 88 сообщениях
Поинты: 538
Отправить сообщение для hoz с помощью ICQ
Сообщение от AlexeyVik Посмотреть сообщение
Учись у Буратино.


Потом, а почему локальная? Как-же ты хочешь подсчитывать если переменная будет обнуляться на каждом тике? Ну можно объявить локальную статическую... а чем она отличается от глобальной? НЕ GV!!!

Всё остальное позже посмотрю повнимательней.
Что касается нулевого бара:
Сначала индикатор пересчитывает исторические данные по одному разу на бар. Тут всё нормально. Но дойдя до нулевого, прошла проверка 1 раз... выполнено условие у1, счётчик ++ но когда поступил новый тик на этом-же баре он пересчитывается поновой и условие выполнено второй раз... затем третий... и вот тебе условие выполнено 3 раза... ставим стрелку. Но глазками мы видим что там её быть не должно...
Теоритически то всё складно. А косяк то в чём?
hoz вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 29.09.2015, 19:22   #4212 (permalink)
Программист mql4 mql5
 
Аватар для AlexeyVik
 
Регистрация: 19.11.2009
Сообщений: 2,525
Репутация: 3646
AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik
Сказал(а) спасибо: 1,113
Поблагодарили 3,650 раз(а) в 1,470 сообщениях
Поинты: 2007
Сообщение от hoz Посмотреть сообщение
Теоритически то всё складно. А косяк то в чём?
Чтобы не выскакивало за пределы массива достаточно убавить ещё на 1 limit

while ( (rates_total - limit ) < countCamparedBars+1)
{
limit--;
}

Вот так подправь свой код.

Скрытый текст

Код:
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 limit = rates_total - prev_calculated;
   
   while ( (rates_total - limit ) < countCamparedBars+1)
   {
      limit--;
   }
   
   for (int i = limit; i >= 0; i--)
   {
    if(NewBar(i))
     {
      if (ExistencePositiveSequence (i, countCamparedBars) == true)
      {
         highestValue[i] = High[i];
      }
     }
   }
   
//--- return value of prev_calculated for next call
   return (rates_total);
}

bool NewBar(int n)
{
   static datetime lastbar = 0;
   datetime curbar = Time[n];
   if(lastbar != curbar)
    {
     lastbar = curbar;
     return (true);
    }
   else return(false);
}//******************************************************************|
[свернуть]


А во-вторых, ты хотел избавиться от пересчёта 3х баров на каждом баре, а сам так и пишешь во внешней функции новый цикл.

Последний раз редактировалось NSerega; 30.09.2015 в 21:41.
AlexeyVik на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 29.09.2015, 19:25   #4213 (permalink)
hoz
Активный участник
 
Аватар для hoz
 
Регистрация: 01.04.2011
Сообщений: 530
Репутация: 111
hoz hoz
Сказал(а) спасибо: 59
Поблагодарили 112 раз(а) в 88 сообщениях
Поинты: 538
Отправить сообщение для hoz с помощью ICQ
Сообщение от AlexeyVik Посмотреть сообщение
Чтобы не выскакивало за пределы массива достаточно убавить ещё на 1 limit

while ( (rates_total - limit ) < countCamparedBars+1)
{
limit--;
}
Поправь свой код вот так.

Скрытый текст

Код:
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 limit = rates_total - prev_calculated;
   
   while ( (rates_total - limit ) < countCamparedBars+1)
   {
      limit--;
   }
   
   for (int i = limit; i >= 0; i--)
   {
    if(NewBar())
     {
      if (ExistencePositiveSequence (i, countCamparedBars) == true)
      {
         highestValue[i] = High[i];
      }
     }
   }
   
//--- return value of prev_calculated for next call
   return (rates_total);
}

bool NewBar()
{
   static datetime lastbar = 0;
   datetime curbar = Time[0];
   if(lastbar != curbar)
    {
     lastbar = curbar;
     return (true);
    }
   else return(false);
}//******************************************************************|
[свернуть]


А во-вторых, ты хотел избавиться от пересчёта 3х баров на каждом баре, а сам так и пишешь во внешней функции новый цикл.
Пишу новый цикл, т.к. никто не подсказал как избавится. Хочу для начала хоть так как все запустить. А потом уже заняться оптимизацией. Ибо покачто вообще не рашел. Я вообще удивляюсь. Вроде бы простая вещь, а кого не спроси не могут понять почему... Хотя разговаривал с программистами со стажем.

Последний раз редактировалось NSerega; 30.09.2015 в 21:41.
hoz вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 29.09.2015, 19:37   #4214 (permalink)
Программист mql4 mql5
 
Аватар для AlexeyVik
 
Регистрация: 19.11.2009
Сообщений: 2,525
Репутация: 3646
AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik
Сказал(а) спасибо: 1,113
Поблагодарили 3,650 раз(а) в 1,470 сообщениях
Поинты: 2007
Сообщение от hoz Посмотреть сообщение
Пишу новый цикл, т.к. никто не подсказал как избавится. Хочу для начала хоть так как все запустить. А потом уже заняться оптимизацией. Ибо покачто вообще не рашел. Я вообще удивляюсь. Вроде бы простая вещь, а кого не спроси не могут понять почему... Хотя разговаривал с программистами со стажем.
Я исправил свой предыдущий пост. В этом варианте функция NewBar() работает только с нулевым баром, а для исторических надо чуток не так.

Я теперь не могу понять что ты хочешь увидеть?
Вот что показывает этот индикатор. В чём косяк-то?
Миниатюры:
Нажмите на изображение для увеличения
Название: EURUSDM5.png
Просмотров: 8
Размер:	18.8 Кб
ID:	220906  
AlexeyVik на форуме   Ответить с цитированиемОтветить с цитированием  
Пользователь сказал cпасибо:
hoz (29.09.2015)
Старый 29.09.2015, 19:54   #4215 (permalink)
hoz
Активный участник
 
Аватар для hoz
 
Регистрация: 01.04.2011
Сообщений: 530
Репутация: 111
hoz hoz
Сказал(а) спасибо: 59
Поблагодарили 112 раз(а) в 88 сообщениях
Поинты: 538
Отправить сообщение для hoz с помощью ICQ
Сообщение от AlexeyVik Посмотреть сообщение
Я исправил свой предыдущий пост. В этом варианте функция NewBar() работает только с нулевым баром, а для исторических надо чуток не так.

Я теперь не могу понять что ты хочешь увидеть?
Вот что показывает этот индикатор. В чём косяк-то?
Вот в еденичке косяк и был, на самом деле. И не пахало ни на истории, ни на реале. Щяс перекомпилил с +1 и работает везде. Значяит косяк был именно в этом куске кода. Как он мне дался...
hoz вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 29.09.2015, 19:58   #4216 (permalink)
Программист mql4 mql5
 
Аватар для AlexeyVik
 
Регистрация: 19.11.2009
Сообщений: 2,525
Репутация: 3646
AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik
Сказал(а) спасибо: 1,113
Поблагодарили 3,650 раз(а) в 1,470 сообщениях
Поинты: 2007
Сообщение от hoz Посмотреть сообщение
Вот в еденичке косяк и был, на самом деле. И не пахало ни на истории, ни на реале. Щяс перекомпилил с +1 и работает везде. Значяит косяк был именно в этом куске кода. Как он мне дался...
Ну... Это-же элементарно, выходит за пределы массива, значит надо убавить индекс... или вообще проверить какой индекс используется. Я встречал вопрос, при отрицательном индексе чел не мог понять в чём ошибка...

Вот тебе другой вариант твоего индикатора

Скрытый текст

Код:
//+---------------------------------------------------------------------------------------------------------------------------------------+
//|                                                                                                           HighestBarOfTheSequence.mq4 |
//|                                                                                                                                   hoz |
//+---------------------------------------------------------------------------------------------------------------------------------------+
#property copyright "hoz"
#property version   "1.00"
#property strict

#property indicator_chart_window            // Индикатор выводится в окне графика
#property indicator_buffers 1               // Используется 2 буфера индикатора

input int countCamparedBars = 3;            // Количество объёма определённого признака в последовательности
double   highestValue[];                    // Буфер максимальных значение объёма за N-баров
int cnt = 0;

//+---------------------------------------------------------------------------------------------------------------------------------------+
//|                                                                OnInit()                                                               |
//+---------------------------------------------------------------------------------------------------------------------------------------+
int OnInit()
{
   IndicatorBuffers(1);
   
   // Связывание буфферов с индексами и определение стилей
   SetIndexBuffer (0, highestValue);
   SetIndexStyle (0,  DRAW_ARROW, 0, 3, clrBlack);
   SetIndexArrow (0, 241);
//---
   return (INIT_SUCCEEDED);
}
//+---------------------------------------------------------------------------------------------------------------------------------------+
//|                                     Возвращаем флаг наличия возрастающей последовательности хаёв                                      |
//+---------------------------------------------------------------------------------------------------------------------------------------+
bool ExistencePositiveSequence (int fi_Index)
{

      if (High[fi_Index+1] > High[fi_Index + 2])
       cnt++;
     else cnt = 0;
   return(true);
}
//+---------------------------------------------------------------------------------------------------------------------------------------+
//|                                                             OnCalculate()                                                             |
//+---------------------------------------------------------------------------------------------------------------------------------------+
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 limit = rates_total - prev_calculated;
   
   while ( (rates_total - limit ) < countCamparedBars+1)
   {
      limit--;
   }
   
   for (int i = limit; i >= 0; i--)
   {
    if(NewBar(i))
     {
      ExistencePositiveSequence(i);
       if(cnt == countCamparedBars)
        {
         highestValue[i] = High[i];
         cnt = 0;
        }
     }
   }
   
//--- return value of prev_calculated for next call
   return (rates_total);
}

bool NewBar(int n)
{
   static datetime lastbar = 0;
   datetime curbar = Time[n];
   if(lastbar != curbar)
    {
     lastbar = curbar;
     return (true);
    }
   else return(false);
}//******************************************************************|
[свернуть]

В этом варианте если будет подряд 5 выполнений условия, то первые 3 посчитает и поставит стрелку, а следующие 2 проигнорирует.

Стоп... При открытии нового бара хай будет равен открытию этого бара. Соответственно сравнивать можно только 1 со 2-ым. Иначе будет работать не правильно.
Миниатюры:
Нажмите на изображение для увеличения
Название: EURUSDM5.png
Просмотров: 5
Размер:	20.4 Кб
ID:	220909  

Последний раз редактировалось NSerega; 30.09.2015 в 21:41.
AlexeyVik на форуме   Ответить с цитированиемОтветить с цитированием  
Пользователь сказал cпасибо:
hoz (30.09.2015)
Старый 30.09.2015, 16:02   #4217 (permalink)
hoz
Активный участник
 
Аватар для hoz
 
Регистрация: 01.04.2011
Сообщений: 530
Репутация: 111
hoz hoz
Сказал(а) спасибо: 59
Поблагодарили 112 раз(а) в 88 сообщениях
Поинты: 538
Отправить сообщение для hoz с помощью ICQ
Сообщение от AlexeyVik Посмотреть сообщение
Стоп... При открытии нового бара хай будет равен открытию этого бара. Соответственно сравнивать можно только 1 со 2-ым. Иначе будет работать не правильно.
Алексей, есть 2 вопроса:
1. Что Вас не устраивет, в открытии нового бара выше хая предыдущего бара? Ведь по факту он если откроется выше предыдущего бара, его хай уже выше предыдущего бара! Считаю излишним сдвигацца на бар назад..
2. Зачем Вам понадобилась проверка но новый бар? Я подобных проверок не встречал в индикаторах? Хотя хз, они ж запускаются я не в курсе как. Если советник работает постоянно, и если не ограничить будет молотить безлимитно, как индюк себя ведёт я не проверял. т.к. не было ещё мотива. Но, ни метаквоты, ни кто другой не используют подобные проверки. По крайне мере я не встречал их, когда анализировал чужой код. Сейчас чужой код особо не смотрю, т.к. хватает опыта писать самому, но иногда.. как видно встречаются трамплины.
hoz вне форума   Ответить с цитированиемОтветить с цитированием  
Пользователь сказал cпасибо:
AlexeyVik (30.09.2015)
Старый 30.09.2015, 16:42   #4218 (permalink)
Программист mql4 mql5
 
Аватар для AlexeyVik
 
Регистрация: 19.11.2009
Сообщений: 2,525
Репутация: 3646
AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik
Сказал(а) спасибо: 1,113
Поблагодарили 3,650 раз(а) в 1,470 сообщениях
Поинты: 2007
Сообщение от hoz Посмотреть сообщение
Алексей, есть 2 вопроса:
1. Что Вас не устраивет, в открытии нового бара выше хая предыдущего бара? Ведь по факту он если откроется выше предыдущего бара, его хай уже выше предыдущего бара! Считаю излишним сдвигацца на бар назад..
2. Зачем Вам понадобилась проверка но новый бар? Я подобных проверок не встречал в индикаторах? Хотя хз, они ж запускаются я не в курсе как. Если советник работает постоянно, и если не ограничить будет молотить безлимитно, как индюк себя ведёт я не проверял. т.к. не было ещё мотива. Но, ни метаквоты, ни кто другой не используют подобные проверки. По крайне мере я не встречал их, когда анализировал чужой код. Сейчас чужой код особо не смотрю, т.к. хватает опыта писать самому, но иногда.. как видно встречаются трамплины.
Когда я тебе говорил о том, что на каждом тике надо будет проверять выполнение условия на заданном количестве баров, ты мне объяснял что хочешь сделать так, чтобы считать только один бар и увеличивать на единичку счётчик.
Потом ты выложил код именно с проверкой всей глубины. И где-то у меня в голове началась каша, надавал не нужных советов, а оказалось что проблема совсем в другом.

Открытие бара выше хая первого меня не беспокоит. Видимо ты не правильно понял. Наоборот, при нормальном открытии High[1] всегда, за исключением гепов, будет выше Open[0] и соответственно в момент открытия бара High[1] будет выше High[0]
Вот посмотри последний пример. Если не проверять на новый бар, то будет так как я тебе уже объяснял. На каждом тике будет проверяться условие High[0] > High[1] и сначала счётчик будет обнулён, но потом когда условие будет выполнено то оно будет выполнено при каждом тике и счётчик будет увеличиваться на каждом тике.

Что касается того, что никто не применял для меня не аргумент. Всё определяется целесообразностью. Если есть необходимость в проверке открытия нового бара, или даже просто нет необходимости пересчитывать что-то в индикаторе на каждом тике, потому что результат будет однозначно такой-же как и на предыдущей обработке то этим надо воспользоваться. Это разгружает систему или хотя-бы МТ.

Функция OnCalculate обрабатывается так-же как и OnTick на каждом тике.
Вот как-то так.
AlexeyVik на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 30.09.2015, 21:07   #4219 (permalink)
Новичок форума
 
Аватар для derzerack
 
Регистрация: 30.11.2012
Сообщений: 12
Репутация: 7
derzerack
Сказал(а) спасибо: 34
Поблагодарили 1 раз в 1 сообщении
Поинты: 22

По умолчанию Запутался в логике


Возможно кто то решал уже подобный вопрос. Хочу реализовать минимизацию убытков на случай если цена пошла совсем не туда. Попытаюсь объяснить что хочу и что не получается.
1) При наступлении определённых условий выставляется 3 ордера на одном расстоянии друг от друга (рассмотрим случай на покупку) 1 ордер сразу покупает, ниже лимитник на покупку, ещё ниже лимитник на продажу(страхующий).
2) мне надо сделать так чтоб при наступлении условия (Х) закрывалась эта серия ордеров. т.е. 2 бай 1 селл. Но... у меня получается что либо лимитники сразу закрываются, либо селл не закрывается вместе со всеми.

на скрине попытался описать ситуацию. Чувствую что решение простое но сам что то не могу догнать. Как сделать так чтоб условия на закрытие не закрывали преждевременно противоположный ордер в серии?

Извиняюсь если плохо объяснил.
Миниатюры:
Нажмите на изображение для увеличения
Название: 2015-09-30 23-55-21 Скриншот экрана.png
Просмотров: 20
Размер:	20.6 Кб
ID:	221059  
derzerack вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 01.10.2015, 05:56   #4220 (permalink)
Программист mql4 mql5
 
Аватар для AlexeyVik
 
Регистрация: 19.11.2009
Сообщений: 2,525
Репутация: 3646
AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik
Сказал(а) спасибо: 1,113
Поблагодарили 3,650 раз(а) в 1,470 сообщениях
Поинты: 2007
Сообщение от derzerack Посмотреть сообщение
Возможно кто то решал уже подобный вопрос. Хочу реализовать минимизацию убытков на случай если цена пошла совсем не туда. Попытаюсь объяснить что хочу и что не получается.
1) При наступлении определённых условий выставляется 3 ордера на одном расстоянии друг от друга (рассмотрим случай на покупку) 1 ордер сразу покупает, ниже лимитник на покупку, ещё ниже лимитник на продажу(страхующий).
2) мне надо сделать так чтоб при наступлении условия (Х) закрывалась эта серия ордеров. т.е. 2 бай 1 селл. Но... у меня получается что либо лимитники сразу закрываются, либо селл не закрывается вместе со всеми.

на скрине попытался описать ситуацию. Чувствую что решение простое но сам что то не могу догнать. Как сделать так чтоб условия на закрытие не закрывали преждевременно противоположный ордер в серии?

Извиняюсь если плохо объяснил.
Во-первых, лимитник на продажу ниже быть не может.
Во-вторых, вся беда в условии (Х). И соответственно какой вопрос, такой и ответ:
Не правильно работает условие Х, примени условие У
AlexeyVik на форуме   Ответить с цитированиемОтветить с цитированием  
Пользователь сказал cпасибо:
RoboMaks (02.10.2015)
Ответ

Метки
mql4, mql4 помощь, вопросы mql4


Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Выкл.
Pingbacks are Выкл.
Refbacks are Выкл.



Текущее время: 20:09. Часовой пояс GMT.


Перевод: zCarot
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd.
SEO by vBSEO