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

 
Порт-моне тв #:

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

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

 

добрый день!

дополнил советник функцией открытия доп ордера

по задумке:

- внутри временного интервала получен сигнал

- открывается основной ордер, закрытие стоп/тейк

- если закрытие осн ордера по стопу, сразу же открывается один доп.ордер в противоположном направлении

- закрытие  доп.ордера по  стоп/тейк

- ждем следующий временной интервал и новый сигнал в нем, и т.д.

у меня получилось это реализовать, но открывается больше чем один доп ордер, т.е. один, потом еще один и т.д. до первой профитной сделки.

Что добавить/убавить в коде, чтобы открывался только один доп. ордер после основного?

//+-----------------------------------------------------------------------------------------------+
//|                                                                               SMA рабочий.mq4 |
//|                                                                                               |
//|                                                                                               |
//+-----------------------------------------------------------------------------------------------+
#property copyright "Copyright 2021"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//Перечисление всех часов. Это необходимо для меню ввода часа.
enum Enum_Hour{
   h00=00,     //00:00
   h01=01,     //01:00
   h02=02,     //02:00
   h03=03,     //03:00
   h04=04,     //04:00
   h05=05,     //05:00
   h06=06,     //06:00
   h07=07,     //07:00
   h08=08,     //08:00
   h09=09,     //09:00
   h10=10,     //10:00
   h11=11,     //11:00
   h12=12,     //12:00
   h13=13,     //13:00
   h14=14,     //14:00
   h15=15,     //15:00
   h16=16,     //16:00
   h17=17,     //17:00
   h18=18,     //18:00
   h19=19,     //19:00
   h20=20,     //20:00
   h21=21,     //21:00
   h22=22,     //22:00
   h23=23,     //23:00
};
 
// Параметры советника
input string  sParametersEA = "";     // Параметры советника
input double  Lot           = 0.01;   // Количество лотов
input int     StopLoss      = 560;    // Стоп (SL)
input int     TakeProfit    = 200;    // Тейк (TP)

input int     Slippage      = 3;      // Проскальзование (в пунктах)
input int     Magic         = 1;      // Индентификатор советника
input int     DigitsLot     = 2;      // Точность лотности
input Enum_Hour StartHour   = h07;      //Час начала работы.
input Enum_Hour LastHour    = h17;       //Час окончания работы.

input string  sParametersMA = "";     // Параметры индикатора
input int     PeriodMA      = 14;     // Период мувинга
input int     MovingShift   = 1;      // Сдвиг мувинга
// Глобальные переменные
datetime Start,newbar;
double dMA;
bool CheckActiveHours()
{
   //По умолчанию операции отключены
   bool OperationsAllowed=false;
   //Проверяем, находится ли текущий час между разрешенными часами работы, если да, то возвращаем true.
   if(StartHour==LastHour && Hour()==StartHour) OperationsAllowed=true;
   if(StartHour<LastHour && Hour()>=StartHour && Hour()<=LastHour) OperationsAllowed=true;
   if(StartHour>LastHour && ((Hour()>=LastHour && Hour()<=23) || (Hour()<=StartHour && Hour()>0))) OperationsAllowed=true;
   return OperationsAllowed;
}

//+-----------------------------------------------------------------------------------------------+
int OnInit()
  {
Start          = TimeCurrent();
return(INIT_SUCCEEDED);
 
  }
//+-----------------------------------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+-----------------------------------------------------------------------------------------------+
void OnTick()
  {
  
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

if(CheckActiveHours()) 
{
Alert("Операции разрешены");  
// Если нет открытых ордеров, то входим в условие
      if(CountOrders()==0)
     {
      
// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     }
}
else Alert("Операции запрещены");

 if(CountOrders()==0 && GetTypeLastClosePos()==0)                   // GetTypeLastClosePos()==0) последним закрытым был ордер BUY
    {
     if (OrderProfit()<0) 
     {
      OrderSend(Symbol(),OP_SELL,Lot,Bid,3,Ask+StopLoss*Point,Bid-TakeProfit*Point,"продажа",Magic,0,clrRed);
     }
    }
 if(CountOrders()==0 && GetTypeLastClosePos()==1)                  // GetTypeLastClosePos()==0) последним закрытым был ордер SELL
    {
     if (OrderProfit()<0)
     {
      OrderSend(Symbol(),OP_BUY,Lot,Ask,3,Bid-StopLoss*Point,Ask+TakeProfit*Point,"покупка",Magic,0,clrGreen);
     } 
    }
 }   
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция проверки открытых оредров |
//+-----------------------------------------------------------------------------------------------+
int CountOrders() 
  {
   int cnt=0;
   int i=OrdersTotal()-1;
   for(int pos=i;pos>=0;pos--)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol)
           {
            if(OrderMagicNumber()==Magic) cnt++;
           }
        }
     }
   return(cnt);
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на покупку |
//|                    Open[1] и Close[1]- цены открытия и закрытия каждого бара текущего графика |
//+-----------------------------------------------------------------------------------------------+
bool bSignalBuy()
  {
   if(dMA > Open[1] && dMA < Close[1])  
      return(true);

   return(false);
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на продажу |
//+-----------------------------------------------------------------------------------------------+
bool bSignalSell()
  {
   if(dMA < Open[1] && dMA > Close[1])
      return(true);

   return(false);
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                            Функция открытия ордера на покупку |
//+-----------------------------------------------------------------------------------------------+
void vOrderOpenBuy()
  {
   if(newbar!=Time[0])
     {
   // Тикет ордера
      int iOTi = 0;   
   
      iOTi = OrderSend(Symbol(), OP_BUY, Lot, Ask, Slippage, 0, 0, "", Magic, 0, clrNONE);
      
   // Проверим открылся ли ордер
      if(iOTi > 0)
   // Есди да, то выставим уровни убытка и прибыли
         vOrderModify(iOTi);
      else
   // Если нет, то получим ошибку
         vError(GetLastError());
      newbar=Time[0];
     }
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                            Функция открытия ордера на продажу |
//+-----------------------------------------------------------------------------------------------+
void vOrderOpenSell()
  {
   if(newbar!=Time[0])
     {
   // Тикет ордера  
      int iOTi = 0;   
   //Print(bCheckOrders());
      iOTi = OrderSend(Symbol(), OP_SELL, Lot, Bid, Slippage, 0, 0, "", Magic, 0, clrNONE);
   
   // Проверим открылся ли ордер
      if(iOTi > 0)
   // Есди да, то выставим уровни убытка и прибыли
         vOrderModify(iOTi);
      else
   // Если нет, то получим ошибку
         vError(GetLastError());
      newbar=Time[0];
     }
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                                    Функция модификации ордера |
//+-----------------------------------------------------------------------------------------------+
void vOrderModify(int iOTi)
  {
   int    iOTy = -1;    // Тип ордера
   double dOOP = 0;     // Цена открытия ордера
   double dOSL = 0;     // Стоп Лосс
   int    iMag = 0;     // Идентификатор советника
   double dSL  = 0;     // Уровень убытка
   double dTP  = 0;     // Уровень прибыли

// Выберем по тикету открытый ордер, получим некоторые значения
   if(OrderSelect(iOTi, SELECT_BY_TICKET, MODE_TRADES))
     {
      iOTy = OrderType();
      dOOP = OrderOpenPrice();
      dOSL = OrderStopLoss();
      iMag = OrderMagicNumber();
     }

// Если ордер открыл данный советник, то входим в условие
   if(OrderSymbol() == Symbol() && OrderMagicNumber() == iMag)
     {
// Если Стоп Лосс текущего ордера равен нулю, то модифицируем ордер
      if(dOSL == 0)
        {
         if(iOTy == OP_BUY)
           {
            dSL = NormalizeDouble(dOOP - StopLoss * Point, Digits);
            dTP = NormalizeDouble(dOOP + TakeProfit * Point, Digits);

            bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0, clrNONE);
           }

         if(iOTy == OP_SELL)
           {
            dSL = NormalizeDouble(dOOP + StopLoss * Point, Digits);
            dTP = NormalizeDouble(dOOP - TakeProfit * Point, Digits);

            bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0, clrNONE);
           }
        }
     }
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                                      Функция обработки ошибок |
//+-----------------------------------------------------------------------------------------------+
void vError(int iErr)
  {
   switch(iErr)
     {
      case 129:   // Неправильная цена
      case 135:   // Цена изменилась
      case 136:   // Нет цен
      case 138:   // Новые цены
         Sleep(1000);
         RefreshRates();
         break;

      case 137:   // Брокер занят
      case 146:   // Подсистема торговли занята
         Sleep(3000);
         RefreshRates();
         break;
     }
  }
//+------------------------------------------------------------------+
//считаем последний ордер
//+------------------------------------------------------------------+
int GetTypeLastClosePos(string sy="", int mn=-1) {
  datetime t;
  int      i, k=OrdersHistoryTotal(), r=-1;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (t<OrderCloseTime()) {
            t=OrderCloseTime();
            r=OrderType();
          }
        }
      }
    }
  }
  return(r);
} 
//+------------------------------------------------------------------+
 
законопослушный гражданин #:

добрый день!

дополнил советник функцией открытия доп ордера

по задумке:

- внутри временного интервала получен сигнал

- открывается основной ордер, закрытие стоп/тейк

- если закрытие осн ордера по стопу, сразу же открывается один доп.ордер в противоположном направлении

- закрытие  доп.ордера по  стоп/тейк

- ждем следующий временной интервал и новый сигнал в нем, и т.д.

у меня получилось это реализовать, но открывается больше чем один доп ордер, т.е. один, потом еще один и т.д. до первой профитной сделки.

Что добавить/убавить в коде, чтобы открывался только один доп. ордер после основного?

if (OrderProfit()<0) 
Что это? Ордер должен быть предварительно выбран с помощью функции OrderSelect().
 
Tretyakov Rostyslav #:
Что это? Ордер должен быть предварительно выбран с помощью функции OrderSelect().

так он и выбран вроде

if(CountOrders()==0 && GetTypeLastClosePos()==0)                   // GetTypeLastClosePos()==0) последним закрытым был ордер BUY

    {

     if (OrderProfit()<0)   

     {

      OrderSend(Symbol(),OP_SELL,Lot,Bid,3,Ask+StopLoss*Point,Bid-TakeProfit*Point,"продажа",Magic,0,clrRed);

     }

    }

int CountOrders() 

  {

   int cnt=0;

   int i=OrdersTotal()-1;

   for(int pos=i;pos>=0;pos--)

     {

      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))

        {

         if(OrderSymbol()==_Symbol)

           {

            if(OrderMagicNumber()==Magic) cnt++;

           }

        }

     }

   return(cnt);

 
законопослушный гражданин #:

так он и выбран вроде


int CountOrders()  - возвращает кол-во ордеров. В данном случае к OrderProfit() никакого отношения не имеет

 
законопослушный гражданин #:

так он и выбран вроде

if(CountOrders()==0 && GetTypeLastClosePos()==0)                   // GetTypeLastClosePos()==0) последним закрытым был ордер BUY

    {

     if (OrderProfit()<0)   

     {

      OrderSend(Symbol(),OP_SELL,Lot,Bid,3,Ask+StopLoss*Point,Bid-TakeProfit*Point,"продажа",Magic,0,clrRed);

     }

    }

int CountOrders() 

  {

   int cnt=0;

   int i=OrdersTotal()-1;

   for(int pos=i;pos>=0;pos--)

     {

      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))

        {

         if(OrderSymbol()==_Symbol)

           {

            if(OrderMagicNumber()==Magic) cnt++;

           }

        }

     }

   return(cnt);

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

 
Valeriy Yastremskiy #:

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

спасибо

 
Tretyakov Rostyslav #:

int CountOrders()  - возвращает кол-во ордеров. В данном случае к OrderProfit() никакого отношения не имеет

ясно. подумаю 

 
законопослушный гражданин #:

ясно. подумаю 

//+-----------------------------------------------------------------------------------------------+
//|                                                                               SMA рабочий.mq4 |
//|                                                                                               |
//|                                                                                               |
//+-----------------------------------------------------------------------------------------------+
#property copyright "Copyright 2021"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//Перечисление всех часов. Это необходимо для меню ввода часа.
enum Enum_Hour{
   h00=00,     //00:00
   h01=01,     //01:00
   h02=02,     //02:00
   h03=03,     //03:00
   h04=04,     //04:00
   h05=05,     //05:00
   h06=06,     //06:00
   h07=07,     //07:00
   h08=08,     //08:00
   h09=09,     //09:00
   h10=10,     //10:00
   h11=11,     //11:00
   h12=12,     //12:00
   h13=13,     //13:00
   h14=14,     //14:00
   h15=15,     //15:00
   h16=16,     //16:00
   h17=17,     //17:00
   h18=18,     //18:00
   h19=19,     //19:00
   h20=20,     //20:00
   h21=21,     //21:00
   h22=22,     //22:00
   h23=23,     //23:00
};
 
// Параметры советника
input string  sParametersEA = "";     // Параметры советника
input double  Lot           = 0.01;   // Количество лотов
input int     StopLoss      = 560;    // Стоп (SL)
input int     TakeProfit    = 200;    // Тейк (TP)

input int     Slippage      = 3;      // Проскальзование (в пунктах)
input int     Magic         = 1;      // Индентификатор советника
input int     DigitsLot     = 2;      // Точность лотности
input Enum_Hour StartHour   = h07;      //Час начала работы.
input Enum_Hour LastHour    = h17;       //Час окончания работы.

input string  sParametersMA = "";     // Параметры индикатора
input int     PeriodMA      = 14;     // Период мувинга
input int     MovingShift   = 1;      // Сдвиг мувинга
// Глобальные переменные
datetime Start,newbar;
double dMA;
bool CheckActiveHours()
{
   //По умолчанию операции отключены
   bool OperationsAllowed=false;
   //Проверяем, находится ли текущий час между разрешенными часами работы, если да, то возвращаем true.
   if(StartHour==LastHour && Hour()==StartHour) OperationsAllowed=true;
   if(StartHour<LastHour && Hour()>=StartHour && Hour()<=LastHour) OperationsAllowed=true;
   if(StartHour>LastHour && ((Hour()>=LastHour && Hour()<=23) || (Hour()<=StartHour && Hour()>0))) OperationsAllowed=true;
   return OperationsAllowed;
}

//+-----------------------------------------------------------------------------------------------+
int OnInit()
  {
Start          = TimeCurrent();
return(INIT_SUCCEEDED);
 
  }
//+-----------------------------------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+-----------------------------------------------------------------------------------------------+
void OnTick()
  {
  
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

if(CheckActiveHours()) 
{
Alert("Операции разрешены");  
// Если нет открытых ордеров, то входим в условие
      if(CountOrders()==0)
     {
      
// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     }
}
else Alert("Операции запрещены");

 if(CountOrders()==0)                   // GetTypeLastClosePos()==0) последним закрытым был ордер BUY
    {
     if (GetProfitLastClosePos()<0 && GetTypeLastClosePos()==0) 
         OrderSend(Symbol(),OP_SELL,Lot,Bid,3,Ask+StopLoss*Point,Bid-TakeProfit*Point,"продажа",Magic,0,clrRed);
     if (GetProfitLastClosePos()<0 && GetTypeLastClosePos()==1)
         OrderSend(Symbol(),OP_BUY,Lot,Ask,3,Bid-StopLoss*Point,Ask+TakeProfit*Point,"покупка",Magic,0,clrGreen);
    }
 }   
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция проверки открытых оредров |
//+-----------------------------------------------------------------------------------------------+
int CountOrders() 
  {
   int cnt=0;
   int i=OrdersTotal()-1;
   for(int pos=i;pos>=0;pos--)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol)
           {
            if(OrderMagicNumber()==Magic) cnt++;
           }
        }
     }
   return(cnt);
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на покупку |
//|                    Open[1] и Close[1]- цены открытия и закрытия каждого бара текущего графика |
//+-----------------------------------------------------------------------------------------------+
bool bSignalBuy()
  {
   if(dMA > Open[1] && dMA < Close[1])  
      return(true);

   return(false);
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на продажу |
//+-----------------------------------------------------------------------------------------------+
bool bSignalSell()
  {
   if(dMA < Open[1] && dMA > Close[1])
      return(true);

   return(false);
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                            Функция открытия ордера на покупку |
//+-----------------------------------------------------------------------------------------------+
void vOrderOpenBuy()
  {
   if(newbar!=Time[0])
     {
   // Тикет ордера
      int iOTi = 0;   
   
      iOTi = OrderSend(Symbol(), OP_BUY, Lot, Ask, Slippage, 0, 0, "", Magic, 0, clrNONE);
      
   // Проверим открылся ли ордер
      if(iOTi > 0)
   // Есди да, то выставим уровни убытка и прибыли
         vOrderModify(iOTi);
      else
   // Если нет, то получим ошибку
         vError(GetLastError());
      newbar=Time[0];
     }
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                            Функция открытия ордера на продажу |
//+-----------------------------------------------------------------------------------------------+
void vOrderOpenSell()
  {
   if(newbar!=Time[0])
     {
   // Тикет ордера  
      int iOTi = 0;   
   //Print(bCheckOrders());
      iOTi = OrderSend(Symbol(), OP_SELL, Lot, Bid, Slippage, 0, 0, "", Magic, 0, clrNONE);
   
   // Проверим открылся ли ордер
      if(iOTi > 0)
   // Есди да, то выставим уровни убытка и прибыли
         vOrderModify(iOTi);
      else
   // Если нет, то получим ошибку
         vError(GetLastError());
      newbar=Time[0];
     }
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                                    Функция модификации ордера |
//+-----------------------------------------------------------------------------------------------+
void vOrderModify(int iOTi)
  {
   int    iOTy = -1;    // Тип ордера
   double dOOP = 0;     // Цена открытия ордера
   double dOSL = 0;     // Стоп Лосс
   int    iMag = 0;     // Идентификатор советника
   double dSL  = 0;     // Уровень убытка
   double dTP  = 0;     // Уровень прибыли

// Выберем по тикету открытый ордер, получим некоторые значения
   if(OrderSelect(iOTi, SELECT_BY_TICKET, MODE_TRADES))
     {
      iOTy = OrderType();
      dOOP = OrderOpenPrice();
      dOSL = OrderStopLoss();
      iMag = OrderMagicNumber();
     }

// Если ордер открыл данный советник, то входим в условие
   if(OrderSymbol() == Symbol() && OrderMagicNumber() == iMag)
     {
// Если Стоп Лосс текущего ордера равен нулю, то модифицируем ордер
      if(dOSL == 0)
        {
         if(iOTy == OP_BUY)
           {
            dSL = NormalizeDouble(dOOP - StopLoss * Point, Digits);
            dTP = NormalizeDouble(dOOP + TakeProfit * Point, Digits);

            bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0, clrNONE);
           }

         if(iOTy == OP_SELL)
           {
            dSL = NormalizeDouble(dOOP + StopLoss * Point, Digits);
            dTP = NormalizeDouble(dOOP - TakeProfit * Point, Digits);

            bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0, clrNONE);
           }
        }
     }
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                                      Функция обработки ошибок |
//+-----------------------------------------------------------------------------------------------+
void vError(int iErr)
  {
   switch(iErr)
     {
      case 129:   // Неправильная цена
      case 135:   // Цена изменилась
      case 136:   // Нет цен
      case 138:   // Новые цены
         Sleep(1000);
         RefreshRates();
         break;

      case 137:   // Брокер занят
      case 146:   // Подсистема торговли занята
         Sleep(3000);
         RefreshRates();
         break;
     }
  }
//+------------------------------------------------------------------+
//считаем последний ордер
//+------------------------------------------------------------------+
int GetTypeLastClosePos(string sy="", int mn=-1) {
  datetime t;
  int      i, k=OrdersHistoryTotal(), r=-1;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (t<OrderCloseTime()) {
            t=OrderCloseTime();
            r=OrderType();
          }
        }
      }
    }
  }
  return(r);
} 
//+------------------------------------------------------------------+
//считаем профит последнего ордера
//+------------------------------------------------------------------+
double GetProfitLastClosePos(string sy="", int mn=-1) {
  datetime t;
  double pr=0;
  int i, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (t<OrderCloseTime()) pr=OrderProfit()+OrderSwap()+OrderCommission();
          }
        }
      }
    }
  }
  return(pr);
} 
//+------------------------------------------------------------------+
 
Tretyakov Rostyslav #:
Зашивай при открытии в OrderComment()

У меня почему-то это не получалось. Как правильно через if это прописать и как при ordersend это послать?

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