Возможно ли ограничить Equity? - страница 3

 

Сколько людей, столько мнений :). Вопрос в том, человек просто решил обойтись частичным цитированием или ошибочно принял одну строку кода за волшебную палочку. chv прав если рассматривать код начиная от OrderSelect(). Но прав и Irtron, если рассматривать только эту строку. Вот такая диалектика :)

 


Нет, OrderDelete удалит лишь один ордер, выбранный до того функцией OrderSelect(). Как прошагать по всем ордерам, смотрите на форуме здесь, функции Игоря Ким (KimIV). Оттуда собственно код удаления, должен быть внутри цикла по ордерам:

if (OrderType()==OP_BUYLIMIT
||  OrderType()==OP_BUYSTOP
||  OrderType()==OP_SELLLIMIT
||  OrderType()==OP_SELLSTOP)
{
  OrderDelete(OrderTicket());
}

можно даже проще

в одну строчку

if (OrderType()>1){ OrderDelete(OrderTicket());}

 
olyakish:


Нет, OrderDelete удалит лишь один ордер, выбранный до того функцией OrderSelect(). Как прошагать по всем ордерам, смотрите на форуме здесь, функции Игоря Ким (KimIV). Оттуда собственно код удаления, должен быть внутри цикла по ордерам:

if (OrderType()==OP_BUYLIMIT
||  OrderType()==OP_BUYSTOP
||  OrderType()==OP_SELLLIMIT
||  OrderType()==OP_SELLSTOP)
{
  OrderDelete(OrderTicket());
}

можно даже проще

в одну строчку

if (OrderType()>1){ OrderDelete(OrderTicket());}


Станислав Стариков из Metaquotes предупреждал как-то на форуме, что внутренние значения констант и недокументированные функции терминала могут быть изменены без предупреждения. В данной языковой конструкции (OrderType()>1) Вы закладываетесь на конкретные текущие значения этих констант, и в случае их изменения и, главное, изменения порядка их сортировки этот код станет работать неверно, и если в Вашем советнике сотни и тысячи строк кода, Вы далеко не быстро сможете найти эту ошибку. Подумайте, стоит ли оно того, вместо нормальной записи сравнения на равенство, независимо от значений OP_xxx?

 
Irtron:
chv:

Нет, OrderDelete удалит лишь один ордер, выбранный до того функцией OrderSelect()

Нет, OrderDelete() удалит ордер с тикетом, переданным ему в качестве параметра. Если, конечно, таковой имеется в списке отложенных. До того ничего такого не надо.


Данная указанная конструкция:

OrderDelete(OrderTicket());

Удалит ордер, выбранный до этого через OrderSelect(), так как OrderTicket вернёт именно этот тикет для передачи аргумента в OrderDelete:

int OrderTicket( ) 
Возвращает номер тикета для текущего выбранного ордера.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().
Если OrderSelect() не был предварительно выбран, результат вызова OrderTicket будет не тот, который ожидается.
 
chv:

Станислав Стариков из Metaquotes предупреждал как-то на форуме, что внутренние значения констант и недокументированные функции терминала могут быть изменены без предупреждения. В данной языковой конструкции (OrderType()>1) Вы закладываетесь на конкретные текущие значения этих констант, и в случае их изменения и, главное, изменения порядка их сортировки этот код станет работать неверно, и если в Вашем советнике сотни и тысячи строк кода, Вы далеко не быстро сможете найти эту ошибку. Подумайте, стоит ли оно того, вместо нормальной записи сравнения на равенство, независимо от значений OP_xxx?

Какое отношение имеют документированные константы OP_*** ко внутренним значениям команд IPC, о которых говорил Slawa?
Зачем же преподносить свое личное, и необязательно правильное, мнение, как "официальное"? Уже не в первый раз ведь.
 
Irtron:
chv:

Станислав Стариков из Metaquotes предупреждал как-то на форуме, что внутренние значения констант и недокументированные функции терминала могут быть изменены без предупреждения. В данной языковой конструкции (OrderType()>1) Вы закладываетесь на конкретные текущие значения этих констант, и в случае их изменения и, главное, изменения порядка их сортировки этот код станет работать неверно, и если в Вашем советнике сотни и тысячи строк кода, Вы далеко не быстро сможете найти эту ошибку. Подумайте, стоит ли оно того, вместо нормальной записи сравнения на равенство, независимо от значений OP_xxx?

Какое отношение имеют документированные константы OP_*** ко внутренним значениям команд IPC, о которых говорил Slawa?
Зачем же преподносить свое личное, и необязательно правильное, мнение, как "официальное"? Уже не в первый раз ведь.


А зачем давать MQL новичкам форума неправильный стиль кодирования? Многие это воспримут как должное и будут, не дай Бог, копировать. Для именованных перечислимых констант никогда нельзя делать предположения относительно сравнения их внутренних значений, иного, чем == или !=. Чему они на самом деле равны, к прикладному программному слою никак не относится. Это другой уровень ПО, не надо их смешивать. Есть такое понятие, как читабельность кода. Из сравнения с четырьмя константами через логическое ИЛИ ясно, что имелось ввиду. А сравнение OrderType() > 1 ничего толком не говорит о его логике, не зная значений этих констант, что прикладному разработчику совсем не нужно знать.

Вы знаете, что больше: INTERNET_DEFAULT_HTTPS_PORT или INTERNET_DEFAULT_SOCKS_PORT, и чему они равны? Это константы Win API из C++ headers wininet.h. Думаю вряд ли, и разработчику это всё равно, он сравнивает их по имени. Честно, я знать не знаю, чему равны OP_xxx: 1, 2, 3 или 100, 200, 350, какая разница. Это именованные константы. Не надо учить людей плохому стилю кодирования, лучше покажите им хороший.

 
chv:
int OrderTicket( ) 
Возвращает номер тикета для текущего выбранного ордера.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().
Если OrderSelect() не был предварительно выбран, результат вызова OrderTicket будет не тот, который ожидается.

Я не проверял, но подозреваю что даже если OrderSelect() был вызван энное число тиков/баров назад, OrderTicket() всё ещё будет содержать полученное тогда значение, то есть формально корректное. И лично мной ожидаемое :) . А вот ордера с таким тикетом может уже не оказаться.
 
lna01:
chv:
int OrderTicket( ) 
Возвращает номер тикета для текущего выбранного ордера.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().
Если OrderSelect() не был предварительно выбран, результат вызова OrderTicket будет не тот, который ожидается.

Я не проверял, но подозреваю что даже если OrderSelect() был вызван энное число тиков/баров назад, OrderTicket() всё ещё будет содержать полученное тогда значение, то есть формально корректное. И лично мной ожидаемое :) . А вот ордера с таким тикетом может уже не оказаться.
Кстати, похоже на то. У меня периодически (достаточно редко) при модификации ордера выскакивает ошибка "Not order for modification". Заметил, что это бывает на сильных движениях, когда ордер во время отработки торгового тайм-аута закрывается по рынку сам:

// проверяем, существует ли такой ордер
if (IsMyOrder(tic, SELECT_BY_TICKET, MODE_TRADES, NewMagicID) == true)
{
// проверяем, свободен ли торговый поток; если занят, отрабатывем тайм-аут
CheckTradeContext(TimeOut);
//
// после отработки тайм-аута еще раз проверяем, существует ли такой ордер
if (IsMyOrder(tic, SELECT_BY_TICKET, MODE_TRADES, NewMagicID) == true)
{
// [... ToDo ...]
}
// [... ToDo ...]
}

Проверка, принадлежит ли выбранный ордер данному эксперту:

bool IsMyOrder(int pos, int mode_select, int mode_pool, int n_magic)
{
return(OrderSelect(pos, mode_select, mode_pool) && OrderSymbol() == Symbol() && OrderMagicNumber() == n_magic);
}

TimeOut = 60 сек.
 
chv - разработчики никогда не поменяют константы OP_xxx, и догадайтесь сами почему. А по поводу стиля - хм, а с чего Вы решили, что это плохой стиль? Надо бы ИМХОй прикрываться - сколько людей,  столько и мнений.
Лично я пишу
if (OrderType() > OP_SELL) OrderDelete(OrderTicket());
Видимо, не так много народу программировало на каком-нибудь спектруме или 286-м - когда каждая лишняя команда - большие тормоза при вычислении.
Короче, каждый программирует как считает нужным - не надо навязывать свой "единственно правильный" стиль
 
chv:


А зачем давать MQL новичкам форума неправильный стиль кодирования? Многие это воспримут как должное и будут, не дай Бог, копировать. Для именованных перечислимых констант никогда нельзя делать предположения относительно сравнения их внутренних значений, иного, чем == или !=. Чему они на самом деле равны, к прикладному программному слою никак не относится. Это другой уровень ПО, не надо их смешивать. Есть такое понятие, как читабельность кода. Из сравнения с четырьмя константами через логическое ИЛИ ясно, что имелось ввиду. А сравнение OrderType() > 1 ничего толком не говорит о его логике, не зная значений этих констант, что прикладному разработчику совсем не нужно знать.

Вы знаете, что больше: INTERNET_DEFAULT_HTTPS_PORT или INTERNET_DEFAULT_SOCKS_PORT, и чему они равны? Это константы Win API из C++ headers wininet.h. Думаю вряд ли, и разработчику это всё равно, он сравнивает их по имени. Честно, я знать не знаю, чему равны OP_xxx: 1, 2, 3 или 100, 200, 350, какая разница. Это именованные константы. Не надо учить людей плохому стилю кодирования, лучше покажите им хороший.


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

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

PS
Интересно, по каким понятиям происходит выделение терминов в постах. Мне таки нравится читабельность кода и прикладному. Все остальное не шибко важно, что ли? :)