Помогите пожалуйста с написанием функции! - страница 2

 
barudkinarseniy:
Да считает, но только если ордера открыты в одну сторону например если бай то он считает только баевые, а когда поочередно открывается на бай потом на селл он замирает на количествах пунктов равному рассоянию между этими ордерами (для проверки я вывел этот profit функцией Comment на график)
Тогда нужен другой подход. Так как вы описали изначально -- считать не правильно.
 
Andrey F. Zelinsky:
Тогда нужен другой подход. Так как вы описали изначально -- считать не правильно.
А нет ни какой стандартной функции или предопределенной переменной может какой нибудь которая равняется этому профиту, ведь когда просто открыты сделки, во вкладке терминал можно выбрать профит в пунктах, он же как то их расчитывает. Просто я еще осваиваю програмирование по этому вопрос возможно глупый))
 
barudkinarseniy:
а когда поочередно открывается на бай потом на селл он замирает на количествах пунктов равному рассоянию между этими ордерами (для проверки я вывел этот profit функцией Comment на график)
А разве должно быть по-другому? Если прибыль Buy в пунктах растёт, знач прибыль Sell уменьшается, сумма Buy + Sell не меняется - это лок/замок. Если кол-во ордеров туда и сюда одинаково. Попробуйте открыть в одну сторону больше чем в другую - разомрёт
 
barudkinarseniy:
А нет ни какой стандартной функции или предопределенной переменной может какой нибудь которая равняется этому профиту, ведь когда просто открыты сделки, во вкладке терминал можно выбрать профит в пунктах, он же как то их расчитывает. Просто я еще осваиваю програмирование по этому вопрос возможно глупый))

Поскольку вы только осваиваете программирование, то упростите задачу -- посчитайте профит не в пунктах, а в деньгах.

Будет почти тоже самое, только проще для понимания:

//+------------------------------------------------------------------+
//Возвращает суммарный профит открытых позиций в валюте
double GetProfitOpenPos()
{
 double profit = 0;

 for(int i=0; i<OrdersTotal(); i++)
 {
  if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
  {
   if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() <= 1)
   {
    profit = profit + OrderProfit() + OrderSwap() + OrderCommission();
   }
  }
 }
 return(profit);
}
//+------------------------------------------------------------------+
 
 
Alexander Puzanov:
А разве должно быть по-другому? Если прибыль Buy в пунктах растёт, знач прибыль Sell уменьшается, сумма Buy + Sell не меняется - это лок/замок. Если кол-во ордеров туда и сюда одинаково. Попробуйте открыть в одну сторону больше чем в другую - разомрёт
Почему то я сразу не подумал, Спасибо)) И не могли бы вы мне помочь еще в одном деле))
 
Andrey F. Zelinsky:

Поскольку вы только осваиваете программирование, то упростите задачу -- посчитайте профит не в пунктах, а в деньгах.

Будет почти тоже самое, только проще для понимания:

Теперь точно заработало так как надо)) Надо было сразу так и сделать) Спасибо!!! Вы мне не поможете еще в одном деле!?
 
Не могу правильно обработать ошибки подскажите пожалуйста как грамотно это сделать вот на этом примере
//+------------------------------------------------------------------+
// Закрытие всех рыночных ордеров
void ClosePosFirstProfit()
{
 int cls,err;
 for(int i=OrdersTotal()-1; i>=0; i--)
 {
  if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
  {
   if(OrderSymbol()== Symbol() && OrderMagicNumber() == Magic)
   {
    if(OrderType()==OP_BUY)
    {
     cls = OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),Digits),slipage,CLR_NONE);
     if(cls)
     {
      Print("Ордер успешно закрыт!");
     }
     else
     {
      err = GetLastError();
      Print("Ошибка закрытия ордера ",err," !");
     }
    }
    if(OrderType()==OP_SELL)
    {
     cls = OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),Digits),slipage,CLR_NONE);
     if(cls)
     {
      Print("Ордер успешно закрыт!");
     }
     else
     {
      err = GetLastError();
      Print("Ошибка закрытия ордера ",err," !");
     }
    }
   }
  }
 }
}
//+------------------------------------------------------------------+
 
barudkinarseniy:
Не могу правильно обработать ошибки подскажите пожалуйста как грамотно это сделать вот на этом примере
//+------------------------------------------------------------------+
// Закрытие всех рыночных ордеров
void ClosePosFirstProfit()
{
 bool cls;
 for(int i=OrdersTotal()-1; i>=0; i--)
 {
  if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
  {
   if(OrderSymbol()== Symbol() && OrderMagicNumber() == Magic)
   {
    if(OrderType()==OP_BUY)
    {
     cls = OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),Digits),slipage,CLR_NONE);
     if(!cls)
     {
      Print("Ошибка закрытия ордера ",GetLastError()," !");
     }
    }
    else if(OrderType()==OP_SELL)
    {
     cls = OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),Digits),slipage,CLR_NONE);
     if(!cls)
     {
      Print("Ошибка закрытия ордера ",GetLastError()," !");
     }
    }
   }
  }
 }
}
//+------------------------------------------------------------------+

OrderClose() возвращает тип bool

и нет необходимости писать, что "ордер закрыт успешно", это и так понятно 

лучше чтобы эта функция ClosePosFirstProfit() возвращала признак успешной отработки по всем ордерам

 
Andrey F. Zelinsky:

OrderClose() возвращает тип bool

и нет необходимости писать, что "ордер закрыт успешно", это и так понятно 

лучше чтобы эта функция ClosePosFirstProfit() возвращала признак успешной отработки по всем ордерам

Я это сделал для тестера, прогоняю без визуализации и просматриваю журнал, а вот если советник уже запустить на реале хочу обработать ошибки например реквоты, а вообще какие еще часто могут возникать и какие действия выполнять при возникновении этих ошибок не знаю, и да было бы не плохо проверить остались ли открытые ордера(такая функция у меня имеется проверяет количество открытых именно рыночных ордеров) и в этом случае прогнать снова этот цикл несколько раз, но как правильно прописать это все 
 
Подскажите пожалуйста где можно поднабраться знаний по обработке ошибок в mql, ссылки на какие нибудь видяхи или форумы