Как кодировать? - страница 312

 

...

Как объявлен ваш LastProfitHigh?

Если она объявлена в теле функции (например, start()), то она всегда будет менять значение, если вы не объявите ее как статическую. Поэтому, если она объявлена как локальная (внутри функции), попробуйте объявить ее в глобальной области видимости или как статическую переменную, и таким образом она будет "наследовать" значения между двумя тиками.

aud4xtrader:
Привет всем,

Я новичок в кодинге и медленно изучаю язык и синтаксис, но у меня возник вопрос о том, как MT4 обновляет переменные.

Я попытался создать простой советник, который отображает самую высокую прибыль по текущей открытой сделке и должен обновляться только при достижении нового максимума, но происходит так, что сумма движется вниз и вверх, как и прибыль, я не могу увидеть ошибку в логике кода.

Я проверяю, чтобы убедиться, что выбранная сделка все еще открыта

t_CloseTime=OrderCloseTime(); //возвращает 0, если ордер не закрыт

if(t_CloseTime==0) //Ордер закрыт, если не ноль.

{

if(OrderProfit() > LastProfitHigh) LastProfitHigh=OrderProfit();

if(LastProfitHigh >= MinProfit && MinProfitReached==false) MinProfitReached=true;

}//endif

Итак, если логика верна, почему эта переменная "LastProfitHigh" поднимается и опускается?

Спасибо за помощь.
 

Новичок в кодировании

mladen:
Как объявлена ваша LastProfitHigh? Если она объявлена в теле функции (например, start()), то она всегда будет менять значение, если вы не объявите ее как статическую. Поэтому, если она объявлена как локальная (внутри функции), попробуйте объявить ее в глобальной области видимости или как статическую переменную, и таким образом она будет "наследовать" значения между двумя тиками.

Привет, Младен,

Я перенес переменную за пределы функции start() и объявил ее "static double", спасибо за ответ и надеюсь, что она будет отображаться правильно.

Логика кода изложена правильно?

 

aud4xtrader

Логика в порядке

Если вы перемещаете переменную за пределы старта, то вам не нужно объявлять ее статической (она автоматически становится глобальной переменной, когда находится вне тела любой функции - и "видна" через весь код) Если вы хотите, чтобы переменная оставалась локальной для какой-то функции и сохраняла предыдущее состояние (состояние на предыдущем тике, например), то вы объявляете ее статической.

Вот два примера, которые закончатся одним и тем же результатом

double previousProfit=0;

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();

}

aud4xtrader:
Здравствуйте, mladen,

Теперь я переместил переменную за пределы функции start() и объявил ее "static double", спасибо за ответ и надеюсь, что она будет отображаться правильно.

Логика кода изложена правильно?
 

Как написать код?

Все работает отлично, еще раз спасибо за отличную помощь.

mladen:
aud4xtrader

Логика в порядке

Если вы перемещаете переменную за пределы старта, то вам не нужно объявлять ее статической (она автоматически становится глобальной переменной, когда находится вне тела любой функции - и "видна" во всем коде) Если вы хотите, чтобы переменная оставалась локальной для какой-то функции и сохраняла ее предыдущее состояние (состояние на предыдущем тике, например), то вы объявляете ее статической.

Вот два примера, которые приведут к одному и тому же результату

double previousProfit=0;

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:
Попробуйте эти 2 функции
: Первая - выяснить, есть ли уже ордер с точно такой же ценой открытия

Второй - проверить, есть ли ордер, который находится на расстоянии nnn пунктов от желаемой цены

.

Обе возвращают true, если цена равна или если расстояние от цены некоторых текущих открытых ордеров находится в пределах указанного расстояния.

bool existsAtSamePrice(int magicNumber, double price)

{

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.

Pip:
Отлично! Спасибо.
 

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

У меня есть вопрос.

Если я хочу удалить все объекты, которые содержат в имени слово "example" с помощью команды ObjectDelete, как я должен написать код?

Для примера

Имя объекта

"Пример13241"

"Пример453623"

Я хочу удалить все объекты, содержащие слово "Example".

Большое спасибо

 

...

Используйте что-то вроде этого (это удалит все объекты, имена которых начинаются с "Example") :

string lookFor = "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);

}

dasio:
Привет,

У меня есть просьба.

Если я хочу удалить все объекты, которые содержат в названии слово "пример" с помощью команды ObjectDelete, как я должен написать код?

Для примера

Имя объекта

"Пример13241"

"Пример453623"

Я хочу удалить все объекты, содержащие слово "Example".

Большое спасибо
 
mladen:
Используйте что-то вроде этого (это удалит все объекты, имена которых начинаются с "Example") :
string lookFor = "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 буферов рисования, это значительно ограничивает вас.

dasio:
Спасибо, все отлично.

У меня есть еще один вопрос ^^.

Я создаю сегмент трендовой линии на графике с заданной длиной. Я могу задать цвет и все в порядке. Я хотел бы знать, можно ли задать более одного цвета для одной и той же линии тренда.

Например, для первой 1/3 части один цвет, для 2/3 части другой цвет и для 3/3 части еще один.

Это возможно?

Спасибо^^