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

 
EVGENII SHELIPOV #:

Доброго времени суток !!!

Прошу помочь  в написании кода для закрытия мин и макс ордеров в сеточном советнике при достижении определенного уровня просадки 

Написал две функции для расчета профита мин и макс ордеров

Написал функцию которая калькулирует сумму этих ордеров. Вроде бы  здесь проблем нет.

Вопрос в том как закрыть только эти два ордера вот какую функцию я нашел ClosseAll(). 

Вопрос в том как вместо функции OrderTicket() которая закрывает все ордера 

прикрутить переменные  max_ticket и min_ticket которые определяют тикеты  только мин и макс ордеров в сетке

Или у ВАС есть ВАШЕ решение этого вопроса

void ClosseAll()
{
  int slip = MarketInfo(_Symbol,MODE_SPREAD)*2;
  for(int i = OrdersTotal()-1; i>=0; i--)
  {
     if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
     {
      if (OrderClose(max_ticket , OrderLots(), Bid, slip)&&OrderClose(min_ticket , OrderLots(), Bid, slip))
            Print("OK");
      else
            Print("Не удалось закрыть ордер! ",GetLastError());
     }
  }
}

и это исправь

if(OrderTicket() > max_ticket) max_ticket = OrderTicket();
 
makssub #:

Сорри, опять пишу криво. Попробую еще раз)

Есть сетка открытых ордеров. Мне нужно найти цену открытия (OrderOpenPrice) самого ближайший ордера к текущей цены. Чтобы дальше строить сетку, а то они у меня в чуть ли не в хаотичном порядке строятся.

Как писать перебор я понимаю, но выразить грамотно в языке, чтобы это корректно работало не могу ( как собака, все понимаю))

Если есть примеры или ссылка на примеры, напишите плз. MQL4

в цикле:

if (MathAbs(OrderOpenPrice()-Bid)<previous_value)
   {
   previous_value=MathAbs(OrderOpenPrice()-Bid);
   nearest_order=OrderTicket();
   }

перед циклом инициализируем previous_value=DBL_MAX a nearest_order=0

 
PapaYozh #:

А чем он, кстати, отличается кроме того, что его вызов происходит неявно при создании объекта?

да и плюс при вызове в конструкторе еще не распределена память, это не компилируется:

class A
{
public:
   int               val;
                     A() {}
};
//+------------------------------------------------------------------ +
class B
{
public:
   A                 a;
                     B():a(),a.val(10) {} //
};

а вот в теле конструктора, без проблем:

class A
{
public:
   int               val;
                     A() {}
};
//+------------------------------------------------------------------ +
class B
{
public:
   A                 a;
                     B():a() {a.val=10;}
};



по поводу конструкторов базового класса - их можно вызывать явно :

class A
{
public:
   int               val;
                     A(const int v): val(v) {}
                     A() {}
};
//+------------------------------------------------------------------ +
class B: public A
{
public:
                     B(): A(100) {}
};
 
MakarFX #:

и это исправь

Насчет проскальзывания у меня в начале советника  уже есть 

MakarFX #:

и это исправь

MakarFX #:

и это исправь

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init() 
{
   Spread = MarketInfo(Symbol(), MODE_SPREAD) * Point;
   MinLot = MarketInfo(Symbol(),MODE_MINLOT);
   return (0);
}

По результатам закрытия вот такой расклад закрываются только максимальные ордера


 
Taras Slobodyanik #:

в цикле:

перед циклом инициализируем previous_value=DBL_MAX a nearest_order=0

MakarFX #:

и это исправь

MakarFX #:

и это исправь

По ошибкам в журнале


 
Добрый день кто нибудь слышал о таких как MirachLtd-Real .У кого нибудь есть отзывы?

 
EVGENII SHELIPOV #:

Насчет проскальзывания у меня в начале советника  уже есть

Это проскальзывание именно для этой функции...чтоб не перебирать BUY или SELL

//--- global parameters
int max_ticket = 0;
int min_ticket = INT_MAX;
//+----------------------------------------------------------------------------+
void ClosseAll()
{
  int slipp = MarketInfo(_Symbol,MODE_SPREAD)*2;
  for(int i = OrdersTotal()-1; i>=0; i--)
  {
     if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
     {
      if (OrderClose(max_ticket , OrderLots(), Bid, slipp)&&OrderClose(min_ticket , OrderLots(), Bid, slipp))
            Print("OK");
      else
            Print("Не удалось закрыть ордер! ",GetLastError());
     }
  }
}
//+----------------------------------------------------------------------------+
//| Расчет профита максимального ордера в сетке                                |
//+----------------------------------------------------------------------------+
double GetProfitMaxOrder()
{
   double max_ticket_profit = 0 ;
      {
      for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
         {
         if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
            {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               {
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                  {
                  if(OrderTicket() > max_ticket) 
                     {
                     max_ticket = OrderTicket();
                     max_ticket_profit =  OrderProfit();
                     }
                  }
               }
            }
         }
      }
   return( max_ticket_profit);
}
//+----------------------------------------------------------------------------+
//| Расчет профита минимального ордера в сетке                                 |
//+----------------------------------------------------------------------------+
double GetProfitMinOrder()
{
   double min_ticket_profit = 0;
      {
      for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
         {
         if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
            {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) 
               {
               if (OrderType() == OP_BUY || OrderType() == OP_SELL)
                  {
                  if(OrderTicket() < min_ticket)
                     {
                     min_ticket = OrderTicket();
                     min_ticket_profit = OrderProfit(); 
                     }
                  }
               }
            }
         }
      }
   return(min_ticket_profit);
 
как лучше создавать объект класса: после описания класса или локально например в OnTick()? Второй вариант наверное крайне не экономен: нагрузка на ЦП, ОЗУ.
 
MakarFX #:

Это проскальзывание именно для этой функции...чтоб не перебирать BUY или SELL

int slipp = MarketInfo(_Symbol,MODE_SPREAD)*2;

Здесь всё правильно на пункт умножать не надо 

possible loss of data due to type conversion NEVALASHKA.mq4 376 13 

У меня предупреждение при компиляции


 
EVGENII SHELIPOV #:

Здесь всё правильно на пункт умножать не надо 

possible loss of data due to type conversion NEVALASHKA.mq4 376 13 

У меня предупреждение при компиляции


Умножать не надо MODE_SPREAD - Спрэд в пунктах

можешь проверить

   Print(MarketInfo(_Symbol,MODE_SPREAD)," / ",MarketInfo(_Symbol,MODE_SPREAD)*Point);

и сделай так

int slipp = (int)MarketInfo(_Symbol,MODE_SPREAD)*2;
Причина обращения: