Ваши вопросы по языку MQL4

AlexeyVik

Программист mql4 mql5
Здарова Алексей. Моя видимо :)

А вот это очень странно. Смысла нет пересчитывать условие на всех барах, которые мы сравниваем. Это не логично. Если сравниваем 100 баров, то проще сравнивать на каждом расчётном баре текущий и предыдущий. А не все сравниваемые. Как-то мне такой вариант вообще не нравится...
В принципе такой вариант тоже приемлем, но надо внимательно учесть обнуление счётчика. И лучше сделать два счётчика для разных направлений.
Может лучше продолжить на одном форуме? Скажи на каком тебе удобней. Или на одном больше не отвечай.
 

yurez83

Активный участник
А ты попробуй посчитать вручную что возвращает твоя функция int Proverka (double znah1 , double znah2) при первом обращении к ней.

Самый простой вариант обойти твою проблему, вызвать эту функцию из инита.

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

Если машка пересечена, т.е. Proverka возвратит 1 или 2, то по-любому вызовется условие:

так это и нужно. при любом пересечении ценой мувинга нужно чтобы закрывались профитные ордера и на бай и на селл..
 
Последнее редактирование:

lavandos

Элитный участник
Люди, такой вопрос, имеем любой стрелочник, можно ли теоретически, а лучше практически написать простейшую сову по таким условиям? :please:
 

Вложения

  • Screenshot_2.png
    Screenshot_2.png
    25,2 КБ · Просмотры: 55

hoz

Активный участник
Люди, такой вопрос, имеем любой стрелочник, можно ли теоретически, а лучше практически написать простейшую сову по таким условиям? :please:

Да. Условие будет простое: Если стрелка появилась, значит установить ордер. В чём вопрос то?
Обычно, стрелка в буфере находится. Соответственно, проверяется на... если значение заданного буфера не пустое, то... установить ордер.
 

AlexeyVik

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



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

yurez83

Активный участник
Так я-же сказал что это самый простой способ. Вызвать функцию, тогда переменной last будет присвоено значение и при вызове её из старта будет нормальное сравнение.

всё разобрался.. закинул в инит. спасибо. ;)
 

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);
}


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

AlexeyVik

Программист mql4 mql5
Сам хотел предложить на распыляться. Вот именно! Я и думаю, как избавится от пересчёта всех сравниваемых последовательностей на каждой итерации. То что их должно быть 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 раз на баре.
 
Последнее редактирование:

hoz

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


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


Вот как я представляю себе вариант без вложенного цикла.

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


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

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


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

Разве что на нулевом баре будут проблемы. Надо сделать чтобы код выполнялся 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 (0, highestValue);
   SetIndexStyle (0,  DRAW_ARROW, 0, 3, clrBlack);
   SetIndexArrow (0, 241);
//---
   return (INIT_SUCCEEDED);
}
//+---------------------------------------------------------------------------------------------------------------------------------------+
//|                                     Возвращаем флаг наличия возрастающей последовательности хаёв                                      |
//+---------------------------------------------------------------------------------------------------------------------------------------+
bool ExistencePositiveSequence (int fi_Index, int fi_CountCamparedBars)
{
   int cnt = 0;

   for (int i = fi_Index; i < fi_Index + fi_CountCamparedBars; i++)
   {
      if (High[i] > High[i + 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; i >= 0; i--)
   {
      if (ExistencePositiveSequence (i, countCamparedBars) == true)
      {
         highestValue[i] = High[i];
      }
   }
   
//--- return value of prev_calculated for next call
   return (rates_total);
}

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

PHP:
bool ExistencePositiveSequence (int fi_Index, int fi_CountCamparedBars)
{
   int cnt = 0;

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

Почему понимаете?
То ли я что-то не допонимаю... то ли ... Вроде бы простая ситуация, но я что-то застрял.
 

Вложения

  • HighestBarOfTheSequence.mq4
    3,9 КБ · Просмотры: 35

AlexeyVik

Программист mql4 mql5
Алексей, в приципе теоритически Вы правы. Но тут есть один момент. В данном случае, если переменная не глобальная, а локальная, то обнулять счётчик не нужно по условию. Достаточно обнулять при входе в функцию.
Учись у Буратино. :D
attachment.php


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

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

Вложения

  • 6069685.jpg
    6069685.jpg
    30,5 КБ · Просмотры: 254
Последнее редактирование:

hoz

Активный участник
Учись у Буратино. :D
attachment.php


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

Всё остальное позже посмотрю повнимательней.
Что касается нулевого бара:
Сначала индикатор пересчитывает исторические данные по одному разу на бар. Тут всё нормально. Но дойдя до нулевого, прошла проверка 1 раз... выполнено условие у1, счётчик ++ но когда поступил новый тик на этом-же баре он пересчитывается поновой и условие выполнено второй раз... затем третий... и вот тебе условие выполнено 3 раза... ставим стрелку. Но глазками мы видим что там её быть не должно...
Теоритически то всё складно. А косяк то в чём?оО
 

AlexeyVik

Программист mql4 mql5
Теоритически то всё складно. А косяк то в чём?оО
Чтобы не выскакивало за пределы массива достаточно убавить ещё на 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х баров на каждом баре, а сам так и пишешь во внешней функции новый цикл.
 
Последнее редактирование модератором:

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())
     {
      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х баров на каждом баре, а сам так и пишешь во внешней функции новый цикл.

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

AlexeyVik

Программист mql4 mql5
Пишу новый цикл, т.к. никто не подсказал как избавится. Хочу для начала хоть так как все запустить. А потом уже заняться оптимизацией. Ибо покачто вообще не рашел. Я вообще удивляюсь. Вроде бы простая вещь, а кого не спроси не могут понять почему...:facepalm: Хотя разговаривал с программистами со стажем.
Я исправил свой предыдущий пост. В этом варианте функция NewBar() работает только с нулевым баром, а для исторических надо чуток не так.

Я теперь не могу понять что ты хочешь увидеть?
Вот что показывает этот индикатор. В чём косяк-то?
 

Вложения

  • EURUSDM5.png
    EURUSDM5.png
    18,8 КБ · Просмотры: 25
  • Like
Реакции: hoz

hoz

Активный участник
Я исправил свой предыдущий пост. В этом варианте функция NewBar() работает только с нулевым баром, а для исторических надо чуток не так.

Я теперь не могу понять что ты хочешь увидеть?
Вот что показывает этот индикатор. В чём косяк-то?

Вот в еденичке косяк и был, на самом деле. И не пахало ни на истории, ни на реале. Щяс перекомпилил с +1 и работает везде. Значяит косяк был именно в этом куске кода. Как он мне дался...:facepalm:
 

AlexeyVik

Программист mql4 mql5
Вот в еденичке косяк и был, на самом деле. И не пахало ни на истории, ни на реале. Щяс перекомпилил с +1 и работает везде. Значяит косяк был именно в этом куске кода. Как он мне дался...:facepalm:
Ну... Это-же элементарно, выходит за пределы массива, значит надо убавить индекс... или вообще проверить какой индекс используется. Я встречал вопрос, при отрицательном индексе чел не мог понять в чём ошибка...

Вот тебе другой вариант твоего индикатора
Код:
//+---------------------------------------------------------------------------------------------------------------------------------------+
//|                                                                                                           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
    EURUSDM5.png
    20,4 КБ · Просмотры: 21
Последнее редактирование модератором:
  • Like
Реакции: hoz

hoz

Активный участник
Стоп... При открытии нового бара хай будет равен открытию этого бара. Соответственно сравнивать можно только 1 со 2-ым. Иначе будет работать не правильно.

Алексей, есть 2 вопроса:
1. Что Вас не устраивет, в открытии нового бара выше хая предыдущего бара? Ведь по факту он если откроется выше предыдущего бара, его хай уже выше предыдущего бара! Считаю излишним сдвигацца на бар назад..
2. Зачем Вам понадобилась проверка но новый бар? Я подобных проверок не встречал в индикаторах? Хотя хз, они ж запускаются я не в курсе как. Если советник работает постоянно, и если не ограничить будет молотить безлимитно, как индюк себя ведёт я не проверял. т.к. не было ещё мотива. Но, ни метаквоты, ни кто другой не используют подобные проверки. По крайне мере я не встречал их, когда анализировал чужой код. Сейчас чужой код особо не смотрю, т.к. хватает опыта писать самому, но иногда.. как видно встречаются трамплины.
 

AlexeyVik

Программист mql4 mql5
Алексей, есть 2 вопроса:
1. Что Вас не устраивет, в открытии нового бара выше хая предыдущего бара? Ведь по факту он если откроется выше предыдущего бара, его хай уже выше предыдущего бара! Считаю излишним сдвигацца на бар назад..
2. Зачем Вам понадобилась проверка но новый бар? Я подобных проверок не встречал в индикаторах? Хотя хз, они ж запускаются я не в курсе как. Если советник работает постоянно, и если не ограничить будет молотить безлимитно, как индюк себя ведёт я не проверял. т.к. не было ещё мотива. Но, ни метаквоты, ни кто другой не используют подобные проверки. По крайне мере я не встречал их, когда анализировал чужой код. Сейчас чужой код особо не смотрю, т.к. хватает опыта писать самому, но иногда.. как видно встречаются трамплины.
Когда я тебе говорил о том, что на каждом тике надо будет проверять выполнение условия на заданном количестве баров, ты мне объяснял что хочешь сделать так, чтобы считать только один бар и увеличивать на единичку счётчик.
Потом ты выложил код именно с проверкой всей глубины. И где-то у меня в голове началась каша, надавал не нужных советов, а оказалось что проблема совсем в другом.

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

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

Функция OnCalculate обрабатывается так-же как и OnTick на каждом тике.
Вот как-то так.
 

derzerack

Интересующийся
Запутался в логике

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

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

Извиняюсь если плохо объяснил.
 

Вложения

  • 2015-09-30 23-55-21 Скриншот экрана.png
    2015-09-30 23-55-21 Скриншот экрана.png
    20,6 КБ · Просмотры: 35

AlexeyVik

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

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

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