Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
...
Как объявлен ваш LastProfitHigh?
Если она объявлена в теле функции (например, start()), то она всегда будет менять значение, если вы не объявите ее как статическую. Поэтому, если она объявлена как локальная (внутри функции), попробуйте объявить ее в глобальной области видимости или как статическую переменную, и таким образом она будет "наследовать" значения между двумя тиками.
Привет всем,
Я новичок в кодинге и медленно изучаю язык и синтаксис, но у меня возник вопрос о том, как MT4 обновляет переменные.
Я попытался создать простой советник, который отображает самую высокую прибыль по текущей открытой сделке и должен обновляться только при достижении нового максимума, но происходит так, что сумма движется вниз и вверх, как и прибыль, я не могу увидеть ошибку в логике кода.
Я проверяю, чтобы убедиться, что выбранная сделка все еще открыта
t_CloseTime=OrderCloseTime(); //возвращает 0, если ордер не закрыт
if(t_CloseTime==0) //Ордер закрыт, если не ноль.
{
if(OrderProfit() > LastProfitHigh) LastProfitHigh=OrderProfit();
if(LastProfitHigh >= MinProfit && MinProfitReached==false) MinProfitReached=true;
}//endif
Итак, если логика верна, почему эта переменная "LastProfitHigh" поднимается и опускается?
Спасибо за помощь.Новичок в кодировании
Как объявлена ваша LastProfitHigh? Если она объявлена в теле функции (например, start()), то она всегда будет менять значение, если вы не объявите ее как статическую. Поэтому, если она объявлена как локальная (внутри функции), попробуйте объявить ее в глобальной области видимости или как статическую переменную, и таким образом она будет "наследовать" значения между двумя тиками.
Привет, Младен,
Я перенес переменную за пределы функции start() и объявил ее "static double", спасибо за ответ и надеюсь, что она будет отображаться правильно.
Логика кода изложена правильно?
aud4xtrader
Логика в порядке
Если вы перемещаете переменную за пределы старта, то вам не нужно объявлять ее статической (она автоматически становится глобальной переменной, когда находится вне тела любой функции - и "видна" через весь код) Если вы хотите, чтобы переменная оставалась локальной для какой-то функции и сохраняла предыдущее состояние (состояние на предыдущем тике, например), то вы объявляете ее статической.
Вот два примера, которые закончатся одним и тем же результатом
int start()
{
...
if (OrderProfit()>previiousProfit) previousProfit = OrderProfit();
}
[/PHP]
or the same thing but with static variable
[PHP]
int start()
{
static double previousProfit=0;
...
if (OrderProfit()>previiousProfit) previousProfit = OrderProfit();
}
Здравствуйте, mladen,
Теперь я переместил переменную за пределы функции start() и объявил ее "static double", спасибо за ответ и надеюсь, что она будет отображаться правильно.
Логика кода изложена правильно?Как написать код?
Все работает отлично, еще раз спасибо за отличную помощь.
aud4xtrader
Логика в порядке
Если вы перемещаете переменную за пределы старта, то вам не нужно объявлять ее статической (она автоматически становится глобальной переменной, когда находится вне тела любой функции - и "видна" во всем коде) Если вы хотите, чтобы переменная оставалась локальной для какой-то функции и сохраняла ее предыдущее состояние (состояние на предыдущем тике, например), то вы объявляете ее статической.
Вот два примера, которые приведут к одному и тому же результату
int start()
{
...
if (OrderProfit()>previiousProfit) previousProfit = OrderProfit();
}
[/PHP]
or the same thing but with static variable
[PHP]
int start()
{
static double previousProfit=0;
...
if (OrderProfit()>previiousProfit) previousProfit = OrderProfit();
}
Отлично! Спасибо.
Попробуйте эти 2 функции .
Обе возвращают true, если цена равна или если расстояние от цены некоторых текущих открытых ордеров находится в пределах указанного расстояния.
{
for (int i=OrdersTotal()-1; i>=0 ; i--)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if (OrderSymbol()!=Symbol()) continue;
if (OrderMagicNumber()!=magicNumber) continue;
if (CompareDouble(OrderOpenPrice(),price)) return(true);
}
return(false);
}
//
//
//
//
//
bool existsAtApproximatePrice(int magicNumber, double price, double distance)
{
for (int i=OrdersTotal()-1; i>=0 ; i--)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if (OrderSymbol()!=Symbol()) continue;
if (OrderMagicNumber()!=magicNumber) continue;
if (MathAbs(OrderOpenPrice()-price)< distance) return(true);
}
return(false);
}
//
//
//
//
//
bool CompareDouble(double val1, double val2)
{
return(NormalizeDouble(val1,Digits)==NormalizeDouble(val2,Digits));
}
Как кодировать?
Здравствуйте, Пип,
Спасибо за фрагменты кода, это здорово, что люди могут делиться идеями и стилями кодирования, по мере роста моих знаний я могу брать уроки у таких людей, как вы и mladen.
Отлично! Спасибо.
Здравствуйте,
У меня есть вопрос.
Если я хочу удалить все объекты, которые содержат в имени слово "example" с помощью команды ObjectDelete, как я должен написать код?
Для примера
Имя объекта
"Пример13241"
"Пример453623"
Я хочу удалить все объекты, содержащие слово "Example".
Большое спасибо
...
Используйте что-то вроде этого (это удалит все объекты, имена которых начинаются с "Example") :
int lookForLength = StringLen(lookFor);
for (int i=ObjectsTotal()-1; i>=0; i--)
{
string objectName = ObjectName(i);
if (StringSubstr(objectName,0,lookForLength) == lookFor) ObjectDelete(objectName);
}
Привет,
У меня есть просьба.
Если я хочу удалить все объекты, которые содержат в названии слово "пример" с помощью команды ObjectDelete, как я должен написать код?
Для примера
Имя объекта
"Пример13241"
"Пример453623"
Я хочу удалить все объекты, содержащие слово "Example".
Большое спасибоИспользуйте что-то вроде этого (это удалит все объекты, имена которых начинаются с "Example") :
int lookForLength = StringLen(lookFor);
for (int i=ObjectsTotal()-1; i>=0; i--)
{
string objectName = ObjectName(i);
if (StringSubstr(objectName,0,lookForLength) == lookFor) ObjectDelete(objectName);
}
Спасибо, это прекрасно.
У меня есть еще один вопрос ^^.
Я создаю отрезок трендовой линии на графике с заданной длиной. Я могу установить цвет и все в порядке. Я хотел бы знать, можно ли задать более одного цвета для одной и той же линии тренда.
Например, для первой 1/3 части один цвет, для 2/3 части другой цвет и для 3/3 части еще один.
Это возможно?
Спасибо^^
..
Короче говоря, если вы имеете в виду объекты, то ответ - нет. Для этого вам придется создать 3 объекта.
Если вы используете для этого буферы, то для трехцветной неперерисовывающейся линии вам понадобится 5 буферов рисования, а поскольку существует только 8 буферов рисования, это значительно ограничивает вас.
Спасибо, все отлично.
У меня есть еще один вопрос ^^.
Я создаю сегмент трендовой линии на графике с заданной длиной. Я могу задать цвет и все в порядке. Я хотел бы знать, можно ли задать более одного цвета для одной и той же линии тренда.
Например, для первой 1/3 части один цвет, для 2/3 части другой цвет и для 3/3 части еще один.
Это возможно?
Спасибо^^