Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 589

 
admoon:



При по шаговой проверке индикатора обнаружил дребезг срабатываний в подпрограмме, стоящей за if {} и в котором нет W.  Для пояснения сути вопроса привожу упрощенный код:

//--- input parameters

input int w=10;

//---

   {

  int i;

//---

    int co=0;

  for(i=0;i<=w;i++)if(w==10){co++; Alert(co);}

//--- return value of prev_calculated for next call

   return(rates_total);

  }

Результат (арлеты): 

2016.05.30 00:45:14.064 1 (EURUSD,H1)   11

2016.05.30 01:10:35.972 1 (EURUSD,H1)   10

........... и т.д. до 1.

 2016.05.30 00:45:14.064        1 (EURUSD,H1)   1

Правило:  Если выражение в скобках истинно, то выполняется оператор1.

В коде: оператор1 выполняется ВСЕГДА.

По моему if()должно сработать только один раз, при истинности условия в скобках. А по факту срабатывает при каждой проверке условия и все выражения в {} выполняются на каждом шаге и жуют машинное время.

Вопросы : ПОЧЕМУ переменная CO выросла за цикл от 0 до 11? Почему Alert срабатывает на каждом шаге?

Ну сколько можно повторять-то вам?

Смотрите: у вас w равна 10,
Проверяете w на равность 10: "if(w==10){co++; Alert(co);}" Как считаете, это выражение истинно?
Тогда почему вопрос у вас?

 
admoon:



При по шаговой проверке индикатора обнаружил дребезг срабатываний в подпрограмме, стоящей за if {} и в котором нет W.  Для пояснения сути вопроса привожу упрощенный код:

//--- input parameters

input int w=10;

//---

   {

  int i;

//---

    int co=0;

  for(i=0;i<=w;i++)if(w==10){co++; Alert(co);}

//--- return value of prev_calculated for next call

   return(rates_total);

  }

Результат (арлеты): 

2016.05.30 00:45:14.064 1 (EURUSD,H1)   11

2016.05.30 01:10:35.972 1 (EURUSD,H1)   10

........... и т.д. до 1.

 2016.05.30 00:45:14.064        1 (EURUSD,H1)   1

Правило:  Если выражение в скобках истинно, то выполняется оператор1.

В коде: оператор1 выполняется ВСЕГДА.

По моему if()должно сработать только один раз, при истинности условия в скобках. А по факту срабатывает при каждой проверке условия и все выражения в {} выполняются на каждом шаге и жуют машинное время.

Вопросы : ПОЧЕМУ переменная CO выросла за цикл от 0 до 11? Почему Alert срабатывает на каждом шаге?

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Andrey Barinov, 2016.05.30 10:38

Судя по всему у вас опечатка в коде, и хотели написать вот так:

int i;
//---
   int co=0;
   for(i=0;i<=w;i++)
     {
      if(i==10)
        {
         co++; 
         Alert(co);
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);

 
Здравствуйте Господа! У меня возникла небольшая проблемка в написании советника(( советник открывает отложенные ордера в большинстве случаев все нормально но иногда открыть ордера нужно очень близко к текущей цене, так вот как прописать что бы отложенные ордера открывались МАКСИМАЛЬНО близко из возможного?
 
barudkinarseniy:
Здравствуйте Господа! У меня возникла небольшая проблемка в написании советника(( советник открывает отложенные ордера в большинстве случаев все нормально но иногда открыть ордера нужно очень близко к текущей цене, так вот как прописать что бы отложенные ордера открывались МАКСИМАЛЬНО близко из возможного?
Вроде разобрался) Если кому интересно получилось вот так
 double ilow = iLow(Symbol(),TimeFrames_3,1);
 double ihigh = iHigh(Symbol(),TimeFrames_3,1);
 
 double OpenPriceBuy = NormalizeDouble(MathMax(ihigh,Ask + Point*SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL)),Digits);
 double OpenPriceSell = NormalizeDouble(MathMin(ilow,Bid - Point*SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL)),Digits);
 
 int StepST = (int)MathMax(OpenPriceBuy - OpenPriceSell,SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL));
 double lots = LotsByRisk(StepST);
 
Artyom Trishkin:

Ну сколько можно повторять-то вам?

Смотрите: у вас w равна 10,
Проверяете w на равность 10: "if(w==10){co++; Alert(co);}" Как считаете, это выражение истинно?
Тогда почему вопрос у вас?

     Приношу свои извинения за дурацкий вопрос и благодарю Вас за Ваше терпение и понимание. Подвел механический перенос пробника if(w==10){ Alert(I,"/",F); по программе в поисках ошибки по шагам. Такое бывает, когда упираешься в стену  собственного не понимания причины, но стоит не надолго отстраниться от проблемы и вопрос решается как бы сам собой. И то, что воспринималось как "дребезг", на самом деле оказывается не учтенным запросом из другой части программы. С благодарностью, Владимир.

 

Здравствуйте, помогите, пожалуйста, с математикой.

Как узнать каким будет лот пятой позиции, если известен лот первoй и то, что лот каждой новой позиции увеличивается в арифметической прогрессии.

Второй вариант лот увеличивается с геометрической прогрессией.

 
mila.com:

Здравствуйте, помогите, пожалуйста, с математикой.

Как узнать каким будет лот пятой позиции, если известен лот первoй и то, что лот каждой новой позиции увеличивается в арифметической прогрессии.

Второй вариант лот увеличивается с геометрической прогрессией.

В гугле забанили? Сочувствую, за что вас так жестоко? ))

арифметическая прогрессия задана формулой

геометрическая прогрессия задана формулой 

 

Не соображаю, по идее для первого варианта достаточно первый лот умножить на 5, если увеличивается на старт лот

Для второго варианта: лот первой позиции* коэффициент*5 …но

 
mila.com:

Не соображаю, по идее для первого варианта достаточно первый лот умножить на 5

Для второго варианта лот первой позиции* коэффициент*5 …но

Да ничего, сам со школы математику забыл )) Откопал книгу по математике, перепечатываю определение ариф. прогрессии, тут понятнее написано.

-------------

Последовательность чисел, каждое из которых, начиная со второго, получается из предыдущего прибавлением постоянного числа d, называемого разность ариф. прогр.

Если первый член a1, то ариф. прогр. с длиной n имеет вид:

a1, a1+d, a1+2*d, ...., a1 + n*d

код на MQL вот такой, накидал простой примерчик

#define LEN 5 // задали длину последовательности

int start()
{
    int d = 4;    // это разность, любое значение
    int a[LEN];   // тут храним ариф. посл.
    a[0] = 3;     // любое стартовое значение, задаете сами
    Print(0, "  ", a[0]);

    for (int n = 1; n < 4; n++)
    {
       a[n] = a[0] + (n*d);
       Print(n, "  ", a[n]);
    }
}

2016.05.31 23:08:52.433 ChangeTimeFrame EURUSD.e,M1: 3  15
2016.05.31 23:08:52.433 ChangeTimeFrame EURUSD.e,M1: 2  11
2016.05.31 23:08:52.433 ChangeTimeFrame EURUSD.e,M1: 1  7
2016.05.31 23:08:52.433 ChangeTimeFrame EURUSD.e,M1: 0  3
 
Alexey Volchanskiy:

Да ничего, сам со школы математику забыл ))

Пойду погуляю, потом код для геометрической прогр. напишу
Причина обращения: