Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1207

 

почему это цикл не заканчивается когда ... (второе условие для i < 2000 я добавил когда понял что цикл бесконечный) MQL4

cv * tvp * (double)stop < ml


double tvp  = SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE_PROFIT),
          vm   = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN),
          vs   = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP),
          ml   = AccountEquity() * (risk / 100.0),
          cv   = -1.0;
   
   for(int i = 0; cv * tvp * (double)stop < ml && i < 2000; i++)
     {
      if( (vm + vs * (double)i) * tvp * (double)stop < ml ) { cv = vm + vs * (double)i; Print(i," ",cv,"/",ml); };
     };


 
Alexandr Sokolov:

почему это цикл не заканчивается когда ... (второе условие для i < 2000 я добавил когда понял что цикл бесконечный)



Цикл не закончится пока 

cv * tvp * (double)stop < ml

А чтобы цикл завершился при выполнении этого условия, в теле цикла можно прописать так:

for(int i = 0; i < 2000; i++)
{
  if(cv * tvp * (double)stop < ml)
    break
  ...
}

или

for(int i = 0; cv * tvp * (double)stop >= ml; i++)
{
  if(i >= 2000)
    break;
  ...
}
 
Mihail Matkovskij:

В MQL4 только таким способом:

Результат:


Еше раз спасибо Вам за помощь. Буду Вам очень признателен, если подскажете еще как мне сделать следующее...
При помощи какой функции, или языковой конструкции можно  вычислить значение индекса элемента массива , которое у этого элемента массива было ДО сортировки.

Вот у меня есть массив А[] до сортировки (верхняя строка)  и тот же массив после сортировки. Элемент массива со значением 5 до сортировке находился под индексом 9
А после сортировки элемент массива со значением 5 находится уже под индексом 3.

Далее через функцию  я нахожу в отсортированном массиве ячейку со значением 5 и функция сохраняет в   W номер индекса этой ячейки в отсортированном массиве, который равен 3

ArraySort(А,10,0,MODE_ASCEND);

W = ArrayBsearch( А,5,WHOLE_ARRAY,0,MODE_ASCEND);

ВОПРОС. Каким образом после функции  ArrayBsearch() можно сохранить в переменную значение индекса ячейки со значением 5 которое у нее было в не отсортированном массиве.

То есть сохранить значение 9.
Спасибо за помощь.

 
 

Всем привет. Кто знает как задать отрицательное значение в пользовательском индикаторе и чтоб он работал? т.е. "Сдвиг индикатора относительно ценового графика."

Пример: Если ставишь в индикаторе Moving Average значение -4 он смещается относительно графика влево - и работает.

А вот если ставишь такое значение в код  индикатора - то индикатор перестает работать. и показывает значения всех ТФ красные.

Файлы:
 
ANDREY:

Еше раз спасибо Вам за помощь. Буду Вам очень признателен, если подскажете еще как мне сделать следующее...
При помощи какой функции, или языковой конструкции можно  вычислить значение индекса элемента массива , которое у этого элемента массива было ДО сортировки.

Вот у меня есть массив А[] до сортировки (верхняя строка)  и тот же массив после сортировки. Элемент массива со значением 5 до сортировке находился под индексом 9
А после сортировки элемент массива со значением 5 находится уже под индексом 3.

Далее через функцию  я нахожу в отсортированном массиве ячейку со значением 5 и функция сохраняет в   W номер индекса этой ячейки в отсортированном массиве, который равен 3

ArraySort(А,10,0,MODE_ASCEND);

W = ArrayBsearch( А,5,WHOLE_ARRAY,0,MODE_ASCEND);

ВОПРОС. Каким образом после функции  ArrayBsearch() можно сохранить в переменную значение индекса ячейки со значением 5 которое у нее было в не отсортированном массиве.

То есть сохранить значение 9.
Спасибо за помощь.

а вот не надо сортировать данные как ни попадя и просто так, без глобальной цели.

из текущего проекта: берём (короткий) массив, на выходе имеем индексы элементов в нужном порядке:

void BubleSortIndex5(double &data[5],int &index[5])
{
   for(int i=0;i<5;i++)
      index[i]=i;
   for(int i=0;i<4;i++) {
      for(int j=1;j<5;j++) {
         if (data[index[i]]>data[index[j]]) {
            int tmp=index[i];
            index[i]=index[j];
            index[j]=tmp;
         }
      }
   }
}


на бОльшие массивы надо менять алгоритм сортировки (пузырёк для больших не катит) - поменяйте.

основной посыл - ну не трогайте вы исходные данные. Оперируйте или ссылками или ещё лучше индексами массивов. Иначе информация теряется, которая потом будет ох как нужна

 
ANDREY:

Еше раз спасибо Вам за помощь. Буду Вам очень признателен, если подскажете еще как мне сделать следующее...
При помощи какой функции, или языковой конструкции можно  вычислить значение индекса элемента массива , которое у этого элемента массива было ДО сортировки.

Вот у меня есть массив А[] до сортировки (верхняя строка)  и тот же массив после сортировки. Элемент массива со значением 5 до сортировке находился под индексом 9
А после сортировки элемент массива со значением 5 находится уже под индексом 3.

Далее через функцию  я нахожу в отсортированном массиве ячейку со значением 5 и функция сохраняет в   W номер индекса этой ячейки в отсортированном массиве, который равен 3

ArraySort(А,10,0,MODE_ASCEND);

W = ArrayBsearch( А,5,WHOLE_ARRAY,0,MODE_ASCEND);

ВОПРОС. Каким образом после функции  ArrayBsearch() можно сохранить в переменную значение индекса ячейки со значением 5 которое у нее было в не отсортированном массиве.

То есть сохранить значение 9.
Спасибо за помощь.

Для этого вам нужно ответить на два вопроса. Что будете делать если:

1. Значений 5 будет несколько, в разных ячейках массива.

2. Значения 5 не будет в массиве.

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

 
sla100:

Всем привет. Кто знает как задать отрицательное значение в пользовательском индикаторе и чтоб он работал? т.е. "Сдвиг индикатора относительно ценового графика."

Пример: Если ставишь в индикаторе Moving Average значение -4 он смещается относительно графика влево - и работает.

А вот если ставишь такое значение в код  индикатора - то индикатор перестает работать. и показывает значения всех ТФ красные.

SetIndexShift .

Еще в iMA указывается сдвиг:

iMA

Возвращает значение технического индикатора Moving Average.

double  iMA(
   string       symbol,           // имя символа
   int          timeframe,        // таймфрейм
   int          ma_period,        // период
   int          ma_shift,         // сдвиг средней
   int          ma_method,        // метод усреднения
   int          applied_price,    // тип цены
   int          shift             // сдвиг
   );

Параметры

symbol

[in]  Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

timeframe

[in]  Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

ma_period

[in]  Период усреднения для вычисления индикатора.

ma_shift

[in]  Сдвиг индикатора относительно ценового графика.

ma_method

[in]  Метод усреднения. Может быть любым из значений перечисления ENUM_MA_METHOD.

applied_price

[in]  Используемая цена. Может быть одним из значений перечисления ENUM_APPLIED_PRICE.

shift

[in]  Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Возвращаемое значение

Значение технического индикатора Moving Average.

Пример:

  AlligatorJawsBuffer[i]=iMA(NULL,0,13,8,MODE_SMMA,PRICE_MEDIAN,i);

https://docs.mql4.com/ru/indicators/ima

А вот готовый пример, но на MQL5:  https://www.mql5.com/ru/docs/indicators/ima ,

который несложно перевести на MQL4.

SetIndexShift - Пользовательские индикаторы - Справочник MQL4
SetIndexShift - Пользовательские индикаторы - Справочник MQL4
  • docs.mql4.com
При положительном значении изображение линии смещается вправо, при отрицательном - влево. Значение, рассчитанное на текущем баре, рисуется с указанным смещением относительно текущего бара.
 

В настройках индикатора сдвига нет. Я залез в код и в коде поставил сдвиг -4 и индикатор перестал работать - показывает все ТФ красные. Вот сижу и думаю почему.

Торговые советники и собственные индикаторы - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
Торговые советники и собственные индикаторы - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
  • www.metatrader5.com
Среди программ для автоматического трейдинга можно выделить две большие категории: торговые роботы и индикаторы. Первые предназначены для совершения торговых операций на рынках, а вторые — для анализа котировок и выявления закономерностей в их изменении. При этом индикаторы могут использоваться непосредственно в роботах, образуя полноценную...
 
Mihail Matkovskij:

Для этого вам нужно ответить на два вопроса. Что будете делать, если:

1. Значений 5 будет несколько, в разных ячейках массива.

2. Значения 5 не будет в массиве.

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

Спасибо большое за быстрый отклик. В моем случае каждое значение элемента массива неповторимо и существует в единственном экземпляре. То есть значение 5 , как и другие значения, не повторяется.

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

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