OrderClose non funziona

 

Ciao,

Ho il seguente codice per il mio EA, per favore aiutatemi a capire perché l'OrderClose non viene attivato? Devo usare OrderSelect()? Qual è lo scopo di OrderSelect()? Grazie.

//+------------------------------------------------------------------+
//|                                                       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);
  }
//+------------------------------------------------------------------+


 
non dovete usare OrderSelect 4 OrderClose ma ne avete 2 per OrderTicket(), OrderLots()
 
qjol:
non devi usare OrderSelect 4 OrderClose ma ne hai 2 per OrderTicket(), OrderLots()


Caro qjol,

Non capisco bene cosa intendi, potresti spiegare per favore. Grazie, grazie a te.


 

nel tuo codice

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

stai usando OrderTicket() e OrderLots() e 4 queste funzioni devi usare OrderSelect()

Come potete vedere nella documentazione:

Nota

Il parametro pool è ignorato se l'ordine è selezionato dal numero del biglietto. Il numero del biglietto è un identificatore unico dell'ordine.

Per sapere da quale lista l'ordine è stato selezionato, bisogna analizzare il suo tempo di chiusura. Se il tempo di chiusura dell'ordine è uguale a 0, l'ordine è aperto o in sospeso e preso dalla lista delle posizioni aperte del terminale.

Si può distinguere una posizione aperta da un ordine pendente per il tipo di ordine. Se il tempo di chiusura dell'ordine non è uguale a 0, l'ordine è un ordine chiuso o un ordine pendente cancellato ed è stato selezionato dalla storia del terminale. Si differenziano anche per il tipo di ordine.

La funzione OrderSelect() copia i dati dell'ordine nell'ambiente del programma e tutte le ulteriori chiamate di OrderClosePrice(), OrderCloseTime(), OrderComment(), OrderCommission(), OrderExpiration(), OrderLots(), OrderMagicNumber(), OrderOpenPrice(), OrderOpenTime(), OrderPrint(), OrderProfit(), OrderStopLoss(), OrderSwap(), OrderSymbol(), OrderTakeProfit(), OrderTicket(), OrderType() restituiscono i dati copiati in precedenza. Ciò significa che in alcuni casi i dettagli dell'ordine (prezzo aperto, livelli SL/TP o data di scadenza) possono cambiare e i dati diventano non reali. Si raccomanda vivamente di chiamare la funzione OrderSelect() prima di richiedere i dati dell'ordine.

 

Quindi, se uso il numero di biglietto attuale e i Lotti, non c'è bisogno di usare OrderSelect, giusto? Io apro solo un ordine alla volta, posso sapere come ottenere il numero di ticket dell'ordine aperto?

Grazie ancora

 
chuale:

Quindi, se uso il numero di biglietto attuale e i Lotti, non c'è bisogno di usare OrderSelect, giusto? Io apro solo un ordine alla volta, posso sapere come ottenere il numero di ticket dell'ordine aperto?

Grazie ancora

La funzione OrderSend() restituisce il numero di ticket se ha successo. Ti suggerisco di leggere la sezione Book di questo sito dall'inizio alla fine per capire meglio come usare MQL, oltre a consultare la documentazione di riferimento per ogni funzione che usi per capire meglio quali parametri usare e quali sono i valori di ritorno.

 

Cari tutti,

Ho inserito OrderSelect(), ma OrderClose ancora non funziona, per favore aiutatemi.


//+------------------------------------------------------------------+
//|                                                       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);
  }
//+------------------------------------------------------------------+
 
Chi ti ha detto che il numero dell'ordine è 1?
 
Permetto solo un ordine aperto alla volta.
 

Ciao a tutti,


Ora inserisco ticket e Lotti nell'OrderClose senza usare OrderTicket() e OrderLots() ma non chiude anche l'ordine. Per favore aiutatemi.

//+------------------------------------------------------------------+
//|                                                       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:

Ciao a tutti,


Ora inserisco ticket e Lotti nell'OrderClose senza usare OrderTicket() e OrderLots() ma non chiude anche l'ordine. Per favore aiutatemi.



ticket è una variabile locale, quindi il prossimo tick non avrà lo stesso valore

Mettere fuori dalle funzioni per renderlo Globalscope

double     bar1;
double     bar2;
double     bar3;
int ticket;
Motivazione: