Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 70

 
wishmast:

Скажите, почему при переборе ордеров функцией OrdersTotal() пишут -1.

Пример: for (i=OrdersTotal()-1 ;i>=0; i--)

почему не просто  OrdersTotal() ?

Счет ордеров в этой функции начинается с 0 или с 1? То есть если есть один ордер,  OrdersTotal() равен 0 или 1?

счет с нуля
 
wishmast:

Скажите, почему при переборе ордеров функцией OrdersTotal() пишут -1.

Пример: for (i=OrdersTotal()-1 ;i>=0; i--)

почему не просто  OrdersTotal() ?

Счет ордеров в этой функции начинается с 0 или с 1? То есть если есть один ордер,  OrdersTotal() равен 0 или 1?

OrdersTotal() показывает количество, то есть если есть один ордер то OrdersTotal() будет равен единице, а вот в списке ордеров отчет начинается с нуля

0 - первый ордер

1 - второй ордер

2 - третий

и так далее.

По этому если мы начинаем перебор с конца списка, нужно от общего количества ордеров OrdersTotal() отнять единицу. 

 
Sergey Gritsay:

OrdersTotal() показывает количество, то есть если есть один ордер то OrdersTotal() будет равен единице, а вот в списке ордеров отчет начинается с нуля

0 - первый ордер

1 - второй ордер

2 - третий

и так далее.

По этому если мы начинаем перебор с конца списка, нужно от общего количества ордеров OrdersTotal() отнять единицу. 

но если в первом выражении не отнимать единицу это не будет ошибкой, если у нас один ордер то произойдет две итерации. Разве что ни к чему две итерации делать когда все что нужно за одну можно сделать, поэтому -1, правильно понимаю?
 
wishmast:
но если в первом выражении не отнимать единицу это не будет ошибкой, если у нас один ордер то произойдет две итерации. Разве что ни к чему две итерации делать когда все что нужно за одну можно сделать, поэтому -1, правильно понимаю?
да правильно
 
Sergey Gritsay:
да правильно

Не совсем правильно.

Можно использовать префиксный декремент.

for(int i = OrdersTotal(); i >= 0; --i)
 
trader781:
так как у нас есть пачка ордеров почему нельзя взять и сразу вытащить нужный? (нужные)  и сделать с ними то что хочется? например ордер (i-4)
Потому, что это будет работать только в тестере МТ4. Или при торговле только на одном символе и только одним этим советником.
 
Vitalie Postolache:
Потому, что это будет работать только в тестере МТ4. Или при торговле только на одном символе и только одним этим советником.

ну если подумать, советник один и тот же на каждую пару, общий только баланс счета(переключатель будет в последнюю очередь)

фильтр идет по всем ордерам уовлетворяющим условию рыночные-тип-открытые советником-если символ совпадает

что не так то? 

 
trader781:

ну если подумать, советник один и тот же на каждую пару, общий только баланс счета(переключатель будет в последнюю очередь)

фильтр идет по всем ордерам уовлетворяющим условию рыночные-тип-открытые советником-если симовл совпадает

что не так то? 

Ну вам же выше объяснили уже, что не так. Ордера считать только свои, а индексы массива брать на общее количество - получится массив с пустыми ячейками. И зачем это надо? А если массив не пустой был, то в "лишних" полях - ненужный мусор, приводящий к ошибкам, а ведь речь о деньгах.
 
Vitalie Postolache:
Ну вам же выше объяснили уже, что не так. Ордера считать только свои, а индексы массива брать на общее количество - получится массив с пустыми ячейками. И зачем это надо? А если массив не пустой был, то в "лишних" полях - ненужный мусор, приводящий к ошибкам, а ведь речь о деньгах.

ок, делаем так

struct myorder
{
int    Ticket;
double orderopenprice;
int   ordertype;
double profit;
double stoploss;
double  lot;
};

myorder orders[];

int i;
int count1=0;
void CalcOrders()
{
for(i=OrdersTotal()-1; i>=0; i--)
     {
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) && (OrderSymbol()==Symbol())
         && (OrderMagicNumber()==Magic) && (OrderType()<2))
         orders[count1].Ticket=OrderTicket();
         orders[count1].lot=OrderLots();
         orders[count1].orderopenprice=OrderOpenPrice();
         orders[count1].ordertype=OrderType();
         orders[count1].profit=OrderProfit();
         orders[count1].stoploss=OrderStopLoss();
         count1++;
     }
}    


 правильно?

 
Помогите записать условие: если размер свободных средств на счёте менее 50% от депозита то {действие}  МТ5