Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 111

 
Trendy:

Большое спасибо! Мне это было необходимо для сравнения характеристик свечей (больше, меньше и т.д.)Прикрутил -работает. Только не могу взять в толк как он так сравнивает тип данных string? или double to string не переводит число в строку? :-D


PS. В индикаторе это не пашет - только в скрипте... Проблема в том, что хотя в программе на графике характеристики бара передаются с 5 знаками после запятой, при вызове High[i] - вылезает только 4 знака после запятой.

Пишу:

Alert ("doubletostr High = ", DoubleToStr(High[1],5));
if (DoubleToStr(High[2],5)>(DoubleToStr(High[3],5)))
{
Alert ("Больше");
}
if (DoubleToStr(High[2],5)<(DoubleToStr(High[3],5)))
{
Alert ("Меньше");

}

Пашет, результат пишет с пятью знаками, больше/меньше считает. Проблема в том, что в индикаторе строковый массив не выведется на график. Поэтому...

...пишу:

Alert ("Normalizedouble High = ", NormalizeDouble(High[1],5));

Не пашет - результат - > 1,1234

Я не понимаю разработчиков - зачем так всё было усложнять? Почему если он на графике показывает столько знаков то и вызываемой функции он пять знаков не нацарапает? Может есть какой-то простой выход?


Всё ещё даже интересней:

переводим

Alert ("iFractals doubletostr= ", DoubleToStr(iFractals(0,0,MODE_UPPER,2),Digits));

Пишет: 1,32169 - ОК

Переводим обратно в числовое значение через StrToDouble:

Alert ("iFractals StrToDoubledoubletostr= ", StrToDouble(DoubleToStr(iFractals(0,0,MODE_UPPER,2),Digits)));

Результат: 1,3217

Здесь должен быть мем с Джеки-Чаном где он непонимает фишку.)

 
hoz:

И что Алерт выдаёт по факту?

Написано 0.01 Но по факту 0...0100.
 
Trendy:

Всё ещё даже интересней:

переводим

Alert ("iFractals doubletostr= ", DoubleToStr(iFractals(0,0,MODE_UPPER,2),Digits));

Пишет: 1,32169 - ОК

Переводим обратно в числовое значение через StrToDouble:

Alert ("iFractals StrToDoubledoubletostr= ", StrToDouble(DoubleToStr(iFractals(0,0,MODE_UPPER,2),Digits)));

Результат: 1,3217

Здесь должен быть мем с Джеки-Чаном где он непонимает фишку.)


DoubleToStr() используется для вывода сообщений с нужной вам точностью. Стандартный Print(), Alert(), итд, выводят с точностью 4 знака.

Когда хотите видеть число с нужной вам точностью, вот тогда и используйте DoubleToStr(), а не в расчётах.

Не нужно ничего переводить туда-сюда ... ;)

 
semiromid:

Написано 0.01 Но по факту 0...0100.


Вывод то 100 * point = 100 * 0.00001 = 0.001пп (если для пятизнака)

Выше значение lBUY было изменено. Поэтому, как я вижу, условие:

if(lBUY==0.01)

Не выполнится. И, соответственно, значение lBUY останется прежним.

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


Хм. Пока что тоже самое. Вот что имеем:

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
bool isCloseByTakeLastOpenPos(int delta)
{
   datetime lastOrderCloseTime = 0,               // Время закрытия последнего открытого ордера
            lastOOTHist = -1;                     // Время открытия последнего открытого ордера из истории
   int j = -1;
   
   for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() > 1) continue;               // Все удалённые отложки нас не интересуют..
  
      if (lastOrderCloseTime < OrderCloseTime())   // Находим время закрытия..
      {
         lastOrderCloseTime = OrderCloseTime();   // ..последней закрытой позиции в истории
         j = i;
      }
   }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY))
   {
      if (OrderProfit() + OrderCommission() + OrderSwap() <= 0) return (false);
      if (MathAbs(OrderProfit() - OrderClosePrice()) > delta * pt) return (false);
      else
      {
         lastOOTHist = OrderOpenTime();
         Comment("FUNC isCloseByTakeLastOpenPos : lastOOTHist = ", lastOOTHist);
      }
   }
   else
   {
      Comment("FUNC isCloseByTakeLastOpenPos : не удалось выбрать ордер в истории");
      Print("FUNC isCloseByTakeLastOpenPos : не удалось выбрать ордер в истории");
      return(false);
   }
  
   for(int h=OrdersTotal()-1; h>=0; h--)
   {
      if (OrderSelect(h, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderMagicNumber() != i_magic)   continue;
         if (OrderSymbol() != Symbol())       continue;
         if (OrderType() > 1)                 continue;
         if (lastOOTHist < OrderOpenTime()) return(false);  // Выбранная рыночная позиция открыта позже закрытой по тейку
      }
      else {Print("FUNC isCloseByTakeLastOpenPos : не удалось выбрать рыночный ордер");return(false);}
   }
   
   return (true);
}
 
artmedia70:

DoubleToStr() используется для вывода сообщений с нужной вам точностью. Стандартный Print(), Alert(), итд, выводят с точностью 4 знака.

Когда хотите видеть число с нужной вам точностью, вот тогда и используйте DoubleToStr(), а не в расчётах.

Не нужно ничего переводить туда-сюда ... ;)


Это понятно... теперь...) Но вся соль в том что мне нужно как то выковырять пятую цифру для расчётов(

И если DoubleToStr() для этого не годится то тогда вообще в этом языке не предусмотрена такая возможность? оО Это очень странно. Неужели разработчики этого не предусмотрели?

 
hoz:


Хм. Пока что тоже самое. Вот что имеем:

А что должно быть не то же самое? ;)
 
Trendy:

Это понятно... теперь...) Но вся соль в том что мне нужно как то выковырять пятую цифру для расчётов(

И если DoubleToStr() для этого не годится то тогда вообще в этом языке не предусмотрена такая возможность? оО Это очень странно. Неужели разработчики этого не предусмотрели?


В расчётах используется даже больше цифр, чем вам кажется. Если хотите видеть с нужной точностью - используйте DoubleToStr(). По другому не увидите.
 

Господа программисты! Пожалуйста подскажите, как объединить советника с индикатором?

К примеру взят простой бот mo_bidir.mq4, который торгует своим алгоритмом, и мне нужно что бы он продолжал открывать сделки по своему алгоритму но после сигнала 3х МА -

Например по сигналу - Three Moving Averages:

FastEMA>MediumEMA>SlowEMA (тренд вверх) - бот покупает

FastEMA<MediumEMA<SlowEMA (тренд вниз) – бот продаёт

Inp_Signal_ThreeEMA_FastPeriod = 8;

Inp_Signal_ThreeEMA_MediumPeriod = 38;

Inp_Signal_ThreeEMA_SlowPeriod = 48;

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

 
Добрый день всем трейдерам. Может этот вопрос уже обговаривался, но некоторые советники из код-бейс не компилируются в новых билдах, компилятор ругается что это декомпилированна версия. Но это похоже на ерунду, версии не декомпилировались никогда
Причина обращения: