Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 408

 
khorosh:
Чтобы оценить правильность кода, нужно точно знать, что хотел автор получить. Вашей информации недостаточно. Что вы хотели получить не совсем понятно. Если вы хотели скомпенсировать убыток после закрытия сетки путём открытия противоположного ордера, рассчитывая что цена пройдёт в направлении этого последнего ордера какое-то количество пунктов, то процесс компенсации зависит как от лота этого ордера, так и от расстояния, которое цена пройдёт в благоприятном направлении. Значит для вычислении лота надо задаться ещё величиной дистанции, которую должна пройти цена для компенсации убытка. Хотя возможно вы имели ввиду что-то другое.


да, надо было написать точнее. Просто я уже два раза полностью излагал, что должна делать эта функция, но никто не ответил. Еще раз, что это функция должна делать. Смотрите, допустим у меня есть сетка ордеров. Открыты они с одинаковым шагом или нет - не важно. Какой-то ордер открылся раньше, какой-то позже, то есть каждая позиция прошла разное количество пунктов с разным лотом. По определенным условиям сетка закрывается И МНЕ НАДО ВЫЧИСЛИТЬ ЛОТ, НЕОБХОДИМЫЙ ДЛЯ ПОКРЫТИЯ УБЫТКА ОТ ЭТОЙ СЕТКИ ЗА TP ПУНКТОВ. Чтобы не писать две зеркальный функции я ввел в функции параметр otype.

Но все же где-то засела ошибка. Прошу помочь ее исправить.

double FindRightLot (int otype) // функция поиска лота, необходимого для выхода из просадки после 
                               //закрытия сетки ордеров
{
  double Lot=0; double TotalLot=0;
  for (int i = OrdersTotal()-1; i>0; i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
    {
       if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType() == otype)
       {
         if (otype == OP_BUY)
         {
           Lot = NormalizeDouble (((OrderOpenPrice()-Bid)*Point)*OrderLots()/TP,2); 
           if (Lot>0)
           {
              TotalLot= TotalLot+Lot;
           }
         }
           
       
         else if (otype == OP_SELL)
         {
           Lot = NormalizeDouble (((Ask-OrderOpenPrice())*Point)*OrderLots()/TP,2);
           if (Lot>0)
           {
            TotalLot= TotalLot+Lot;
           }
           
         }
       }
     }
   }
   return (TotalLot);
   
 }
 
BeerGod:

А можно как то реализовать корректно что бы закрывалось начиная с нулевого ? Если можно строчку кода пожалуйста.
Переберите весь список (ордеров) в нужном направлении и занесите значения Тикетов в массив, а затем удаляйте ордера перебором этого массива.
 
BeerGod:

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


На скорую руку:

//+------------------------------------------------------------------+
//|                 Закрыть все ордера                               |
//+------------------------------------------------------------------+


double ClossAllOrders ()

{
  for(int i=0; i<OrdersTotal(); )
  {
    if ( !OrderSelect(i, SELECT_BY_POS) )
      break;
    
    int type   = OrderType();

    bool result = false;
    
    switch(type)
    {
      //Close opened long positions
      case OP_BUY       : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), Slippage, Lime );
                          break;
      
      //Close opened short positions
      case OP_SELL      : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), Slippage, Lime );
                          break;

      //Close pending orders
      case OP_BUYLIMIT  :
      case OP_BUYSTOP   :
      case OP_SELLLIMIT :
      case OP_SELLSTOP  : result = OrderDelete( OrderTicket() );
    }
    
    if(result == false)
    {
      Print("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );
      i++;
      Sleep(500);
    }  
  }
}

// End
 
Trader7777:

да, надо было написать точнее. Просто я уже два раза полностью излагал, что должна делать эта функция, но никто не ответил. Еще раз, что это функция должна делать. Смотрите, допустим у меня есть сетка ордеров. Открыты они с одинаковым шагом или нет - не важно. Какой-то ордер открылся раньше, какой-то позже, то есть каждая позиция прошла разное количество пунктов с разным лотом. По определенным условиям сетка закрывается И МНЕ НАДО ВЫЧИСЛИТЬ ЛОТ, НЕОБХОДИМЫЙ ДЛЯ ПОКРЫТИЯ УБЫТКА ОТ ЭТОЙ СЕТКИ ЗА TP ПУНКТОВ. Чтобы не писать две зеркальный функции я ввел в функции параметр otype.

Но все же где-то засела ошибка. Прошу помочь ее исправить.



Я бы пошёл другим путём. Вначале вычислил бы убыток от закрытия сетки. Ну а далее всё просто. Убыток = Прибыли от следующего ордера. Выразите прибыль от ордера через лот и ТР и из уравнения найдёте лот.
 
Contender:


На скорую руку:


Спасибо Вам огромное, всё работает корректно, спасибо всем кто откликнулся!


 
khorosh:
Я бы пошёл другим путём. Вначале вычислил бы убыток от закрытия сетки. Ну а далее всё просто. Убыток = Прибыли от следующего ордера. Выразите прибыль от ордера через лот и ТР и из уравнения найдёте лот.


убыток от закрытия сетки в деньгах или пунктах?
 
Trader7777:

убыток от закрытия сетки в деньгах или пунктах?
В валюте депозита.
 
а как учесть то, что у каждой пары разная цена пункта?
 
Trader7777:
а как учесть то, что у каждой пары разная цена пункта?
А зачем вам это?
 
Trader7777:
а как учесть то, что у каждой пары разная цена пункта?

Здесь можно посмотреть как это реализуется


https://www.mql5.com/ru/code/7275

https://www.mql5.com/ru/forum/113937/page2

https://docs.mql4.com/ru/constants/marketinfo

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