Не могу закрыть часть лота по профиту

 

Здравствуйте!
Помогите подалуйста с кодом, скажите что здесь не так! Смысл в следующем: При достижении определенного профита (переменная profitclose = 100 ), закрывается часть лота, который высчитывается (часть задается переменной chastlota = 5 ). Если профит еще увеличивается на profitclose = 100, закрывается еще часть лота, которая уже высчитана. Но почемуто при тестировании он закрывает что зря и куда зря, даже в убыток. Что я сделал неправильно?

Приводится часть кода. Функция взята из учебника и модифицирована. Была трейлингстоп.

extern int chastlota = 5;
extern int profitclose = 100;

int droblot = 1;

b = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);    //Выбираем ордер который есть cenaotk = OrderOpenPrice(); tip = OrderType(); if  (cenaotk-Bid >= profitclose*droblot && tip == 1) { dellots(); } if  (cenaotk-Bid <= profitclose*droblot && tip == 0) { dellots(); }




int dellots()
{
string str=Symbol();                        // Финанс. инструмент
b = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);    //Выбираем ордер который есть
      Lot = OrderLots();
      Ticket = OrderTicket();                           // Номер выбранн. орд.
      Type = OrderType();
      ErrorOrder = 0;  
          if (Ticket > 0 && Type == 1)
         {
            Error0 = 1;                                 
            while (Error0 == 1)
            {
            lotsdel = NormalizeDouble(Lot/chastlota,1);
               if (lotsdel < MarketInfo(str, MODE_MINLOT))
                {
                lotsdel = NormalizeDouble(MarketInfo(str, MODE_MINLOT),1);
                }
               if (lotsdel > MarketInfo(str, MODE_MAXLOT))
                {
                 lotsdel = NormalizeDouble(MarketInfo(str, MODE_MAXLOT),1);
                }
            RefreshRates();
            a = OrderClose(Ticket,lotsdel,Ask,3);           
            Sleep(1000);
            Error = GetLastError();                    //Получаем значение ошибки
            Error0 = Fun_Error(Error);                 
            Ticket = 0;
            }
            droblot = droblot + 1;
            return;
           }
         if (Ticket > 0 && Type == 0)
         {
            Error0 = 1;                                   
            while (Error0 == 1)
            {
            lotsdel = NormalizeDouble(Lot/chastlota,1);
             if (lotsdel < MarketInfo(str, MODE_MINLOT))
                {
                lotsdel = NormalizeDouble(MarketInfo(str, MODE_MINLOT),1);
                }
               if (lotsdel > MarketInfo(str, MODE_MAXLOT))
                {
                 lotsdel = NormalizeDouble(MarketInfo(str, MODE_MAXLOT),1);
                }
            RefreshRates();
            a = OrderClose(Ticket,lotsdel,Bid,3);             
            Sleep(1000);   
            Error = GetLastError();                        //Получаем значение ошибки
            Error0 = Fun_Error(Error);                   
            Ticket = 0;
            }
         droblot = droblot + 1;
         return;
         }
       }
 
Конечно он будет закрывать что попало. У вас в функции dellots переменная i откуда берется? В учебнике ведь наверное цикл был, который вы успешно потеряли.
 
Но ведь как написано в документации в переменную i передается, в моем случае, порядковый номер позиции в списке. Мне этот номер не нужен, потому что позиция может быть открыта только одна.
 

Тогда ставьте жесто ноль вместо i.

 
David177 писал (а) >>
Что я сделал неправильно?
cenaotk-Bid >= profitclose*droblot   ->  cenaotk-Bid >= profitclose*droblot*Point
 
нет, не то. Я попробовал, теперь периодически закрывает по убытку и то иногда. Здесь какая то ошибка в коде, но сам я уже третий день не могу найти.
 
David177 писал (а) >>
нет, не то. Я попробовал, теперь периодически закрывает по убытку и то иногда. Здесь какая то ошибка в коде, но сам я уже третий день не могу найти.
int total=OrdersTotal(); 
for (i=total-1;i>=0;i--)
{
  if(OrderType()>1) continue;
  double cenaotk = OrderOpenPrice();
  int ticket=OrderTicket();   
  if (OrderType()==OP_BUY)
   if  (Bid - cenaotk >= profitclose*droblot*Point)
     dellots(ticket);
  if (OrderType()==OP_SELL)
   if  (cenaotk-Ask >= profitclose*droblot*Point)
     dellots(ticket);
}
.....
void dellots(int ticket)
{
  .....
}
 
if  (cenaotk-Bid <= profitclose*droblot && tip == 0)	
Для ордеров на покупку это условие истинно практически всегда.

 
Спасибо Valmars! Вот это грамотный код и ничего лишнего! Вроде теперь мой эксперт работает! Немного не так как нужно, но уже гораздо ближе к истине! Никаких бредовых закрытий! Будем работать дальше.
 
Одну строчку забыл
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
 
Roger писал (а) >>
Одну строчку забыл

Да

Причина обращения: