OrderClose не работает

 

Здравствуйте,

У меня есть следующая кодировка для моего эксперта, пожалуйста, помогите мне, почему OrderClose не срабатывает? Нужно ли мне использовать OrderSelect()? Какова цель использования OrderSelect()? Спасибо.

//+------------------------------------------------------------------+
//|                                                       chuale.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.abc.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.abc.com"
#property version   "1.00"
#property strict

extern double   TakeProfit=500;
extern double   Lots=0.1;
extern double   StopLoss=280;

double     bar1;
double     bar2;
double     bar3;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
  
//---
   
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---
   
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
  {
  int ticket;
  int total=OrdersTotal();
  int    counted_bars=IndicatorCounted();
   if(counted_bars>0) counted_bars--;
   {
      bar1=(iClose(Symbol(),PERIOD_M1,2)-iClose(Symbol(),PERIOD_M1,3))*100;
      bar2=(iClose(Symbol(),PERIOD_M1,1)-iClose(Symbol(),PERIOD_M1,2))*100;
      bar3=(iClose(Symbol(),PERIOD_M1,0)-iClose(Symbol(),PERIOD_M1,1))*100;
      if (bar1+bar2>1)
      {
      if(total<1)
      ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"Chua EA",12345,0,Green);
      if (bar3<-1) OrderClose(OrderTicket(),OrderLots(),Bid,3,Green);
      }
      if (bar1+bar2<-1)
      {
      if(total<1)
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid+-TakeProfit*Point,"Chua EA",12345,0,Red);
      if (bar3>1)  OrderClose(OrderTicket(), OrderLots(),Ask,3,Red);
      }
   }
   
   return(0);
//---
   return(0);
  }
//+------------------------------------------------------------------+


 
не нужно использовать OrderSelect 4 OrderClose, но нужно 2 для OrderTicket(), OrderLots()
 
qjol:
Вам не нужно использовать OrderSelect 4 OrderClose, но у вас есть 2 для OrderTicket(), OrderLots()
.


Уважаемый qjol,

Я не совсем понимаю, что вы имеете в виду, не могли бы вы объяснить. Спасибо


 

в вашем коде

if (bar3>1)  OrderClose(OrderTicket(), OrderLots(),Ask,3,Red);

вы используете OrderTicket() и OrderLots() и 4 эти функции должны использовать OrderSelect()

Как вы можете видеть в документации:

Примечание

Параметр pool игнорируется, если заказ выбирается по номеру билета. Номер билета - это уникальный идентификатор заказа.

Чтобы узнать, из какого списка был выбран ордер, необходимо проанализировать время его закрытия. Если время закрытия ордера равно 0, то ордер является открытым или отложенным и взят из списка открытых позиций терминала.

Отличить открытую позицию от отложенного ордера можно по типу ордера. Если время закрытия ордера не равно 0, то ордер является закрытым или удаленным отложенным ордером и был выбран из истории терминала. Они также отличаются друг от друга типами ордеров.

Функция OrderSelect() копирует данные ордера в среду программы и все последующие вызовы OrderClosePrice(), OrderCloseTime(), OrderComment(), OrderCommission(), OrderExpiration(), OrderLots(), OrderMagicNumber(), OrderOpenPrice(), OrderOpenTime(), OrderPrint(), OrderProfit(), OrderStopLoss(), OrderSwap(), OrderSymbol(), OrderTakeProfit(), OrderTicket(), OrderType() функции возвращают данные, скопированные ранее. Это означает, что в некоторых случаях детали ордера (цена открытия, уровни SL/TP или дата истечения) могут измениться, и данные станут неактуальными. Настоятельно рекомендуется вызывать функцию OrderSelect() перед запросом данных ордера.

 

Итак, если я использую фактический номер билета и Lots, то нет необходимости использовать OrderSelect, верно? Я открываю только один ордер за раз, могу ли я узнать, как получить номер билета открытого ордера?

Еще раз спасибо

 
chuale:

Итак, если я использую фактический номер билета и Lots, то нет необходимости использовать OrderSelect, верно? Я открываю только один ордер за раз, могу ли я узнать, как получить номер билета открытого ордера?

Еще раз спасибо

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

 

Уважаемые все,

Я вставил OrderSelect(), но OrderClose все еще не работает, пожалуйста, помогите. Большое спасибо.


//+------------------------------------------------------------------+
//|                                                       chuale.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.abc.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.abc.com"
#property version   "1.00"
#property strict

extern double   TakeProfit=500;
extern double   Lots=0.1;
extern double   StopLoss=300;

double     bar1;
double     bar2;
double     bar3;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
  
//---
   
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---
   
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
  {
  int ticket;
  int total=OrdersTotal();
  int    counted_bars=IndicatorCounted();
   if(counted_bars>0) counted_bars--;
   {
      bar1=(iClose(Symbol(),PERIOD_M1,2)-iClose(Symbol(),PERIOD_M1,3))*100;
      bar2=(iClose(Symbol(),PERIOD_M1,1)-iClose(Symbol(),PERIOD_M1,2))*100;
      bar3=(iClose(Symbol(),PERIOD_M1,0)-iClose(Symbol(),PERIOD_M1,1))*100;
      if (bar2>1)
      {
      if(total<1)
      ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"Chua EA",12345,0,Green);
      OrderSelect(1,SELECT_BY_POS);
      if (bar3 <-1) OrderClose(OrderTicket(),Lots,Bid,3,Green);
      }
      if (bar2<-1)
      {
      if(total<1)
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid+-TakeProfit*Point,"Chua EA",12345,0,Red);
      if ( bar3>1)  OrderClose(OrderTicket(), Lots,Ask,3,Red);
      }
   }
   
   return(0);
//---
   return(0);
  }
//+------------------------------------------------------------------+
 
Кто вам сказал, что номер заказа - 1?
 
я разрешаю только один открытый ордер за раз.
 

Привет всем,


Теперь я вставляю билет и лоты в OrderClose без использования OrderTicket() и OrderLots(), но это не закрывает ордер. Пожалуйста, помогите.

//+------------------------------------------------------------------+
//|                                                       chuale.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.abc.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.abc.com"
#property version   "1.00"
#property strict

extern double   TakeProfit=500;
extern double   Lots=0.1;
extern double   StopLoss=300;

double     bar1;
double     bar2;
double     bar3;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
  
//---
   
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---
   
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
  {
  int ticket;
  int total=OrdersTotal();
  int    counted_bars=IndicatorCounted();
   if(counted_bars>0) counted_bars--;
   {
      bar1=(iClose(Symbol(),PERIOD_M1,2)-iClose(Symbol(),PERIOD_M1,3))*100;
      bar2=(iClose(Symbol(),PERIOD_M1,1)-iClose(Symbol(),PERIOD_M1,2))*100;
      bar3=(iClose(Symbol(),PERIOD_M1,0)-iClose(Symbol(),PERIOD_M1,1))*100;
      if (bar2>1)
      {
      if(total<1)
      ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"Chua EA",12345,0,Green);
      
      if (bar3 <-1) OrderClose(ticket,Lots,Bid,3,Green);
      }
      if (bar2<-1)
      {
      if(total<1)
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid+-TakeProfit*Point,"Chua EA",12345,0,Red);
      if ( bar3>1)  OrderClose(ticket, Lots,Ask,3,Red);
      }
   }
   
   return(0);
//---
   return(0);
  }
//+------------------------------------------------------------------+


 
chuale:

Привет всем,


Теперь я вставляю билет и лоты в OrderClose без использования OrderTicket() и OrderLots(), но это не закрывает ордер. Пожалуйста, помогите.



ticket - локальная переменная, поэтому при следующем тике она не будет иметь того же значения.

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

double     bar1;
double     bar2;
double     bar3;
int ticket;
Причина обращения: