Скачать MetaTrader 5

ошибка в функции, подскажите где

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Веди личную переписку в профиле. Это безопасно!
Евгений
438
Евгений 2010.12.01 11:33 
int DlinnaPipSell()
{
int cik;
double dlinnaPipSell = 0;
for (cik = 0; cik < OrdersTotal(); cik++)
     {
     OrderSelect (cik, SELECT_BY_POS, MODE_TRADES);
     if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == MN)
          dlinnaPipSell = PriceBigSell() - OrderOpenPrice() + dlinnaPipSell;
     }
return (dlinnaPipSell / Point);
}

код, проще некуда, должен вычислять просадку всех сэлл ордеров в пунктах, по отношению к самому дорогому сэлл ордеру. PriceBigSell() возвращает наибольшую цену из всех сэлл ордеров (работает правильно), но не работает, выдает 0. Работает только в таком виде:

int DlinnaPipSell()
{
int cik;
double dlinnaPipSell = 0;
for (cik = 0; cik < OrdersTotal(); cik++)
     {
     OrderSelect (cik, SELECT_BY_POS, MODE_TRADES);
     if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == MN)
          dlinnaPipSell = OrderOpenPrice() - PriceBigSell() + dlinnaPipSell;
     }
return (MathAbs(dlinnaPipSell / Point));
}
подскажите что не правильно...Хочется обойтись без MathAbs
Alexey Subbotin
4998
Alexey Subbotin 2010.12.01 12:51  
объяви функцию как double DlinnaPipSell()
Евгений
438
Евгений 2010.12.01 13:14  
alsu:
объяви функцию как double DlinnaPipSell()


ошибку типа переменной исправлял но это не помагает
Alexey Subbotin
4998
Alexey Subbotin 2010.12.01 13:35  

не переменной, а функции

double DlinnaPipSell()
{
int cik;
double dlinnaPipSell = 0;
for (cik = 0; cik < OrdersTotal(); cik++)
     {
     OrderSelect (cik, SELECT_BY_POS, MODE_TRADES);
     if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == MN)
          dlinnaPipSell = PriceBigSell() - OrderOpenPrice() + dlinnaPipSell;
     }
return (dlinnaPipSell / Point);
}
так не работает?


плюс проверь, сколько раз вообще функция в if заходит.

EQU
323
EQU 2010.12.01 14:42  
vgeny:

код, проще некуда, должен вычислять просадку всех сэлл ордеров в пунктах, по отношению к самому дорогому сэлл ордеру. PriceBigSell() возвращает наибольшую цену из всех сэлл ордеров (работает правильно), но не работает, выдает 0. Работает только в таком виде:

подскажите что не правильно...Хочется обойтись без MathAbs

Любопытства ради - просто выведи значение Point в коммент.. Тем паче, когда это - делитель.. + Всё выражение..
Евгений
438
Евгений 2010.12.01 15:39  
alsu:

не переменной, а функции

   

 ну да.. не правильно выразился, извини, приводил к одному типу и функцию и переменные которые с ней работают, int или double результат тот же. Я уже думаю что это windows 7 конфликтует, потому что такая же функция, только для бай, работает:

int DlinnaPipBuy()
{
int cik;
double dlinna = 0;
for (cik = 0; cik < OrdersTotal(); cik++)
     {
     OrderSelect (cik, SELECT_BY_POS, MODE_TRADES);
     if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == MN)
          dlinna = OrderOpenPrice() -  BuyPriceSmall() + dlinna;
     }
return (dlinna / Point);
}
Mislaid
621
Mislaid 2010.12.01 17:23  

Все-таки, похоже, что PriceBigSell() работает неправильно, вопреки Вашей уверенности

Airat Safin
1300
Airat Safin 2010.12.02 03:32  

"код ... должен вычислять просадку ... "

1. "PriceBigSell() - OrderOpenPrice()" - это не просадка;

2. причина, вероятно, в том, что внутри "PriceBigSell()" имеется "OrderSelect()";

3. в любом случае, вызывать "PriceBigSell()" многократно внутри данного цикла представляется излишним, лучше вызывать один раз перед циклом;

4. возможно, "Dlinna" лучше изменить на "Dlina" или "Distance".

Евгений
438
Евгений 2010.12.02 09:55  
Ais:

"код ... должен вычислять просадку ... "

1. "PriceBigSell() - OrderOpenPrice()" - это не просадка;

2. причина, вероятно, в том, что внутрои "PriceBigSell()" имеется "OrderSelect()";

3. в любом случае, вызывать "PriceBigSell()" многократно внутри данного цикла представляется излишним, лучше вызывать один раз перед циклом;

4. возможно, "Dlinna" лучше изменить на "Dlina" или "Distance".

1 возможно стоило это назвать разницей в пунктах между самым дорогим и всеми остальными сэлл ордерами

2 там действительно есть OrderSelect() тк отбор ведется перебором, но как это может стать причиной?

3 да согласен дополнительные циклы внутри цикла замедляют (пусть даже и компы сейчас шустрые), красота и рациональность кода важней

4 не совсем понял как имя переменной влияет на работу, вроде бы это не зарезервированное слово.. 

Евгений
438
Евгений 2010.12.02 10:08  

вообще удивляют меня некоторые моменты:

for (cik = 0; cik < OrdersTotal(); cik++)

for (cik = OrdersTotal(); cik > 0; cik--)

на мой взгляд одинаковые головы цикла, только направление разное, но с одной работает поиск самова дорогова сэлл ордера, а с другой не работает

Vladyslav Goshkov
2067
Vladyslav Goshkov 2010.12.02 10:10  
vgeny:

вообще удивляют меня некоторые моменты:

for (cik = 0; cik < OrdersTotal(); cik++)

for (cik = OrdersTotal(); cik > 0; cik--)

на мой взгляд одинаковые головы цикла, только направление разное, но с одной работает поиск самова дорогова сэлл ордера, а с другой не работает

for (cik = OrdersTotal()-1; cik >= 0; cik--)
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий