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

 
Pavel Nikiforov:
Объясните пожалуйста в чем косяк. По задумке функция должна перебирать открытые позиции и подсчитывать количество с заданным магиком. Но  по факту из всего списка выбирает только одну, открытую другим советником с одним и тем же тикетом и магиком, соответственно count всегда =0.

В общем сам разобрался, выбирать нужно через PositionGetSymbol:

//+------------------------------------------------------------------+
int OpenPositions()//проверка открытых позиций по Magic number 
  {
   int count=0;
     for(int z=PositionsTotal()-1; z>=0; z --) // Перебор всех позиций
     {
       if(PositionGetSymbol(z)!=_Symbol) // Найдена позиция с заданным символом
        {
         Print(__FUNCSIG__" позиция не выбрана ",GetLastError()); continue;
        }
      long  ticket = PositionGetInteger(POSITION_TICKET);
            Print(__FUNCSIG__" ТИКЕТ ", IntegerToString(ticket));
      ulong myMN=PositionGetInteger(POSITION_MAGIC);
            Print(__FUNCSIG__" МАГИК ", IntegerToString(myMN));
      if(myMN==Magic)
            count++;
     }
   return(count);
  }
//+------------------------------------------------------------------+
 
Pavel Nikiforov:

В общем сам разобрался, выбирать нужно через PositionGetSymbol:

Плохо разобрался. Выбирать на hadge счёте надо функцией PositionGetTicket(i) и затем проверять символ и магик.

Документация по MQL5: Торговые функции / PositionGetTicket
Документация по MQL5: Торговые функции / PositionGetTicket
  • www.mql5.com
Торговые функции / PositionGetTicket - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Комментарии, не относящиеся к этой теме, были перенесены в "Вопросы от начинающих MQL4 MT4 MetaTrader 4".
 
Alexey Viktorov:

Плохо разобрался. Выбирать на hadge счёте надо функцией PositionGetTicket(i) и затем проверять символ и магик.

Ну да так лучше, другие функции тоже глючили на демке, стало работать.

 

добрый день подскажите по такому индикатору https://www.mql5.com/ru/forum/94447#comment_6780067

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

нужно чтоб эти сигналы шли только при  изменении на 10 пунктов  и больше

Файлы:
1.png  48 kb
 
yesterday35:

добрый день подскажите по такому индикатору https://www.mql5.com/ru/forum/94447#comment_6780067

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

нужно чтоб эти сигналы шли только при  изменении на 10 пунктов  и больше

Этот индикатор не пункты считает, а сигму или СКО (среднеквадратичное отклонение). По выборке из N последних тиков (50 по дефолту). Строит канал из 3-х сигм. Если цена выскочила из канала, то помечает это место. Но главная беда в том что исходный ценовой ряд имеет далеко не нормальное распределение с очень тяжелыми хвостами. По сути этот индикатор игрушка-пособие.

 

Здравствуйте. 

Пишу небольшую программу. Столкнулся с совершенной не понятной ситуаций.

В коде есть вот такие две строчки. Они находятся в самом конце OnTester() не в цикле.

Print("Мат ожидание ставки  ",MatOgidanieStavk(KKef,VVer,Stavka)," Ставка ",Stavka);
Print("Ставка =",Stavka);

А вот совершенно неожиданный результат выполнения этих строчек.

Мат ожидание ставки  447.0461599959392 Ставка -1.0
Ставка =3912.820000338397

Вот определение функции MatOgidanieStavk

double MatOgidanieStavk(double Kef,double Ver,double &BestStavka)
{
 .......... 
   BestStavka=-1;// Первое обращении к этой переменой.
............
return MatOgidanie;
}
 
pivomoe:

Здравствуйте. 

Пишу небольшую программу. Столкнулся с совершенной не понятной ситуаций.

В коде есть вот такие две строчки. Они находятся в самом конце OnTester() не в цикле.

А вот совершенно неожиданный результат выполнения этих строчек.

Вот определение функции MatOgidanieStavk

Stavka инициализирована до принта?

как определяется, что обращение первое внутри функции?

какой результат ожидали?

 

Спасибо. Разобрался с проблемой.

Разгадка оказалась в, том, что переменная Stavka  до Print. Была равна -1. Её значение и передалось в функцию Print и сохранилось в виде копии. Моя функция MatOgidanieStavk изменила саму переменную Stavka, а не её копию которую будет выводить Print.

 
Так и должно быть. 

2795/2797 будет 0. т.к округление не происходит. Нужно или так написать  s3 = (double)s2/s1; или тип для s2 и s1 выбрать сразу double

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