Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Не поставляешь сигналы и не продаешь приложения? Не проблема, заработать могут все!
Владимир
16
Владимир 2015.11.26 20:52 

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

То есть, если в убытке только последний, то только его. Если два последних убыточны, то сумму за два и т.д. Если ордер закрыт в минус, то ничего не нужно.

Пытался написать, но чего-то не получается:

double sumloss()
{
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
   {
      OrderSelect(trade, SELECT_BY_POS, MODE_HISTORY);
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
      {
         if(OrderProfit()<0)
         {
            count+=count+OrderProfit();
         }
         if(OrderProfit()>=0)
         {
            return(count);
         }
      }
      
   }
   return(count);
}
Ihor Herasko
8459
Ihor Herasko 2015.11.26 21:03  
calvuscaput:

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

То есть, если в убытке только последний, то только его. Если два последних убыточны, то сумму за два и т.д. Если ордер закрыт в минус, то ничего не нужно.

Пытался написать, но чего-то не получается:

Во-первых, значение OrderProfit() - вещественное, а не целое. Вы же его прибавляете к целочисленному count.

Во-вторых, в выражении:

count+=count+OrderProfit();

не нужно указывать справа от арифметической операции переменную count. Таким образом, Вы к значению профита добавляете значение предыдущего общего убытка. Нужно сделать либо так:

count += OrderProfit();

либо так:

count = count + OrderProfit();

В-третьих, функция OrderProfit() не учитывает сумму комиссии и свопов. Поэтому их тоже лучше бы учитывать (функции OrderCommission() и OrderSwap()).

В-четвертых,  Вы выбираете ордера из истории ордеров, а нумерацию ведете по рабочим ордерам (OrdersTotal() - это количество рабочих ордеров; для истории следует использовать OrdersHistoryTotal()).

В-пятых,  список ордеров истории вовсе не обязательно содержит ордера в порядке очередности их закрытия. Поэтому при поиске соседних закрытых ордеров лучше проверять время их закрытия и на этом основании строить собственную последовательность закрытия ордеров.

Владимир
16
Владимир 2015.11.29 17:55  
Scriptong:

Во-первых, значение OrderProfit() - вещественное, а не целое. Вы же его прибавляете к целочисленному count.

Во-вторых, в выражении:

не нужно указывать справа от арифметической операции переменную count. Таким образом, Вы к значению профита добавляете значение предыдущего общего убытка. Нужно сделать либо так:

либо так:

В-третьих, функция OrderProfit() не учитывает сумму комиссии и свопов. Поэтому их тоже лучше бы учитывать (функции OrderCommission() и OrderSwap()).

В-четвертых,  Вы выбираете ордера из истории ордеров, а нумерацию ведете по рабочим ордерам (OrdersTotal() - это количество рабочих ордеров; для истории следует использовать OrdersHistoryTotal()).

В-пятых,  список ордеров истории вовсе не обязательно содержит ордера в порядке очередности их закрытия. Поэтому при поиске соседних закрытых ордеров лучше проверять время их закрытия и на этом основании строить собственную последовательность закрытия ордеров.

Cпасибо, добрый человек, за то что помогаешь таким идиотам как я.
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий