Большое спасибо! Мне это было необходимо для сравнения характеристик свечей (больше, меньше и т.д.)Прикрутил -работает. Только не могу взять в толк как он так сравнивает тип данных 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
Я не понимаю разработчиков - зачем так всё было усложнять? Почему если он на графике показывает столько знаков то и вызываемой функции он пять знаков не нацарапает? Может есть какой-то простой выход?
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);
}
DoubleToStr() используется для вывода сообщений с нужной вам точностью. Стандартный Print(), Alert(), итд, выводят с точностью 4 знака.
Когда хотите видеть число с нужной вам точностью, вот тогда и используйте DoubleToStr(), а не в расчётах.
Не нужно ничего переводить туда-сюда ... ;)
Это понятно... теперь...) Но вся соль в том что мне нужно как то выковырять пятую цифру для расчётов(
И если DoubleToStr() для этого не годится то тогда вообще в этом языке не предусмотрена такая возможность? оО Это очень странно. Неужели разработчики этого не предусмотрели?
Это понятно... теперь...) Но вся соль в том что мне нужно как то выковырять пятую цифру для расчётов(
И если DoubleToStr() для этого не годится то тогда вообще в этом языке не предусмотрена такая возможность? оО Это очень странно. Неужели разработчики этого не предусмотрели?
В расчётах используется даже больше цифр, чем вам кажется. Если хотите видеть с нужной точностью - используйте DoubleToStr(). По другому не увидите.
Господа программисты! Пожалуйста подскажите, как объединить советника с индикатором?
К примеру взят простой бот mo_bidir.mq4, который торгует своим алгоритмом, и мне нужно что бы он продолжал открывать сделки по своему алгоритму но после сигнала 3х МА -
Причем мне нужно чтобы советник продолжал торговать на пятиминутке, а индикатор подавал сигналы с дневного или 4х часового таймфрейма, ну и что бы можно было менять таймфреймы в настройках бота.
Добрый день всем трейдерам. Может этот вопрос уже обговаривался, но некоторые советники из код-бейс не компилируются в новых билдах, компилятор ругается что это декомпилированна версия. Но это похоже на ерунду, версии не декомпилировались никогда
Большое спасибо! Мне это было необходимо для сравнения характеристик свечей (больше, меньше и т.д.)Прикрутил -работает. Только не могу взять в толк как он так сравнивает тип данных 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
Здесь должен быть мем с Джеки-Чаном где он непонимает фишку.)
И что Алерт выдаёт по факту?
Написано 0.01 Но по факту 0...0100.
Всё ещё даже интересней:
переводим
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(), а не в расчётах.
Не нужно ничего переводить туда-сюда ... ;)
Написано 0.01 Но по факту 0...0100.
Вывод то 100 * point = 100 * 0.00001 = 0.001пп (если для пятизнака)
Выше значение lBUY было изменено. Поэтому, как я вижу, условие:
Не выполнится. И, соответственно, значение lBUY останется прежним.
Переменная j должна быть явно инициализирована в самом начале функции отрицательным значением. Попробуйте. Дальше не смотрел пока ничего.
Хм. Пока что тоже самое. Вот что имеем:
DoubleToStr() используется для вывода сообщений с нужной вам точностью. Стандартный Print(), Alert(), итд, выводят с точностью 4 знака.
Когда хотите видеть число с нужной вам точностью, вот тогда и используйте DoubleToStr(), а не в расчётах.
Не нужно ничего переводить туда-сюда ... ;)
Это понятно... теперь...) Но вся соль в том что мне нужно как то выковырять пятую цифру для расчётов(
И если 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х часового таймфрейма, ну и что бы можно было менять таймфреймы в настройках бота.