Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1266

 

Buon tempo a tutti voi!

Ho una domanda sulla funzione ResultDeal() nella classe CTrade.

Il fatto è che nello Strategy Tester questa funzione restituisce il trade ticket senza alcun problema, ma quando si lancia l'EA sul Chart restituisce sempre "zero", nonostante il fatto che la funzione ResultRetcode() restituisca sempre "TRADE_RETCODE_DONE".

Codice di esempio:

/////////////////////////////////////////////////////////////////////
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
/////////////////////////////////////////////////////////////////////
CTrade Trade;
CSymbolInfo SymbolInfo;

uint Retcode;
ulong TicketDeal;
bool first_calc;
bool second_calc;
bool third_calc;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
//---
   TicketDeal = 9999999;
   
   first_calc = true;
   second_calc = false;
   third_calc = false;   
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
//---
   if(first_calc)
   {
      first_calc = false;
      second_calc = true;
      
      SymbolInfo.Name(Symbol());
      SymbolInfo.RefreshRates();
      Trade.Buy(1.0, Symbol(), SymbolInfo.Ask(), 0.0, 0.0, "BUY");
//---
      Retcode = Trade.ResultRetcode();
      if(Retcode == TRADE_RETCODE_DONE) TicketDeal = Trade.ResultDeal();
      
      Print("first_calc ////////////////////////////////////");
      Print("PositionsTotal(): ", PositionsTotal());
      Print("Retcode: ", Retcode, "; TicketDeal: ", TicketDeal);
   }
   else
   {
      if(second_calc)
      {
         second_calc = false;
         third_calc = true;
//---
         Retcode = Trade.ResultRetcode();
         if(Retcode == TRADE_RETCODE_DONE) TicketDeal = Trade.ResultDeal();
         
         Print("second_calc ////////////////////////////////////");
         Print("PositionsTotal(): ", PositionsTotal());
         Print("Retcode: ", Retcode, "; TicketDeal: ", TicketDeal);
      }
      else
      {
         if(third_calc)
         {
            third_calc = false;
//---
            Retcode = Trade.ResultRetcode();
            if(Retcode == TRADE_RETCODE_DONE) TicketDeal = Trade.ResultDeal();
            
            Print("third_calc ////////////////////////////////////");
            Print("PositionsTotal(): ", PositionsTotal());
            Print("Retcode: ", Retcode, "; TicketDeal: ", TicketDeal);
         }
         else
         {
            //Print("TicketDeal: ", Trade.ResultDeal());
         }
      }
   }   
}
//+------------------------------------------------------------------+

Registro di esecuzione nel Tester:

2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:00   first_calc ////////////////////////////////////
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:00   PositionsTotal(): 1
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:00   Retcode: 10009; TicketDeal: 2
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:02   second_calc ////////////////////////////////////
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:02   PositionsTotal(): 1
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:02   Retcode: 10009; TicketDeal: 2
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:05   third_calc ////////////////////////////////////
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:05   PositionsTotal(): 1
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:05   Retcode: 10009; TicketDeal: 2

Registro delle esecuzioni sul grafico:

2020.11.25 18:08:13.991 _TestSelect (EURUSD,M1) first_calc ////////////////////////////////////
2020.11.25 18:08:13.991 _TestSelect (EURUSD,M1) PositionsTotal(): 0
2020.11.25 18:08:13.991 _TestSelect (EURUSD,M1) Retcode: 10009; TicketDeal: 0
2020.11.25 18:08:14.026 _TestSelect (EURUSD,M1) second_calc ////////////////////////////////////
2020.11.25 18:08:14.027 _TestSelect (EURUSD,M1) PositionsTotal(): 1
2020.11.25 18:08:14.027 _TestSelect (EURUSD,M1) Retcode: 10009; TicketDeal: 0
2020.11.25 18:08:14.260 _TestSelect (EURUSD,M1) third_calc ////////////////////////////////////
2020.11.25 18:08:14.260 _TestSelect (EURUSD,M1) PositionsTotal(): 1
2020.11.25 18:08:14.260 _TestSelect (EURUSD,M1) Retcode: 10009; TicketDeal: 0


Cosa sto facendo di sbagliato? Come posso ottenere un biglietto commerciale in tempo reale?

E la seconda domanda (di minore importanza), perché subito dopo l'esecuzione di un trade la funzione PositionsTotal() restituisce "zero"? E mostra dati affidabili con il prossimo tick. È possibile ottenere subito queste informazioni?


File:
 
ZAKST:

Buon tempo a tutti voi!

Ho una domanda sulla funzione ResultDeal() nella classe CTrade.

Il fatto è che nello Strategy Tester questa funzione restituisce il trade ticket senza alcun problema, ma quando si lancia l'EA sul Chart restituisce sempre "zero", nonostante il fatto che la funzione ResultRetcode() restituisca sempre "TRADE_RETCODE_DONE".

Codice di esempio:

Registro di esecuzione nel Tester:

Registro delle esecuzioni sul grafico:


Cosa sto facendo di sbagliato? Come posso ottenere un biglietto commerciale in tempo reale?

E la seconda domanda (di minore importanza), perché subito dopo l'esecuzione di un trade la funzione PositionsTotal() restituisce "zero"? E mostra dati affidabili con il prossimo tick. È possibile ottenere subito queste informazioni?


Hmm... improvvisamente i dati di cui ho bisogno in tempo reale sono restituiti dalla funzione ResultOrder() della stessa classeCTrade, anche se non ho usato ordini pendenti...

La domanda è la stessa: cosa sto sbagliando?

 

C'è una macro come questa.

#define  Warning if(ComentWarnig)LogWarnig.Write(__FILE__":"+IntegerToString(__LINE__,4,'0')+" ",

Io lo uso così.

Warning"Warnig  сработал. ");

Domanda: cosa deve essere corretto nella definizione della macro per poterla utilizzare in questo modo?

Warning("Warnig  сработал. ");

cioè con una parentesi tra Warning e "Warnig lavorato. "Cercato di usare una parentesi nella definizione della macro

#define  Warning( if(ComentWarnig)LogWarnig.Write(__FILE__":"+IntegerToString(__LINE__,4,'0')+" ",

ma il compilatore non mi permette di usare una parentesi.

 
ZAKST:

Hmm... Improvvisamente, la funzione ResultOrder() della stessa classeCTrade restituisce i dati di cui ho bisogno in tempo reale, anche se non ho usato ordini pendenti...

La domanda è la stessa: cosa sto sbagliando?

Basta capire il sistema di ordini di MT5, ordine - commercio - posizione.

ResultOrder è l'ordine di apertura. La posizione sarà con POSITION_IDENTIFIER uguale al biglietto di questo ordine.

Tutti gli accordi possono essere trovati nella storia attraverso l'identificatore di posizione. Non confondere con il biglietto della posizione, può cambiare, e l'identificatore è costante.

s.s. Il tester è diverso in quanto non c'è ritardo nell'esecuzione dell'ordine e l'affare viene creato immediatamente. Nella vita reale, il tempo passa e al momento di creare con successo un ordine non c'è ancora un accordo, deve essere catturato negli eventi OnTrade
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Тикет позиции. Уникальное число, которое присваивается каждой вновь открытой позиции. Как правило, соответствует тикету ордера, в результате которого она была открыта, за исключением случаев изменения тикета в результате служебных операций на сервере. Например, начисления свопов переоткрытием позиции. Для нахождения ордера, которым была открыта...
 
pivomoe:

C'è una macro come questa.

Io lo uso così.

Domanda: cosa deve essere corretto nella definizione della macro per poterla utilizzare in questo modo?

cioè con una parentesi tra Warning e "Warnig lavorato. "Cercato di usare una parentesi nella definizione della macro

ma il compilatore non ti permette di usare una parentesi.

vuoi usare una forma parametrica, ma hai specificato una forma non parametrica. dovrebbe andare così

#define  Warning(CUSTOM) (if(ComentWarnig)LogWarnig.Write(__FILE__":"+IntegerToString(__LINE__,4,'0')+"",string(CUSTOM)))


Warning("Warnig  сработал. ");
 

Non mi sono spiegato bene. Cominciamo dall'inizio. Ora sto usando la macro in questo modo:

Warning,"Warnig  сработал. i=",i);

Ecco la macro stessa:

#define  Warning if(LogWarnig)MoiLoggerWarnig.Write(__FILE__":"+IntegerToString(__LINE__,4,'0')

Nella chiamata macro tra "Warning," e ");" Un numero arbitrario di parametri di tipi arbitrari. Tutto questo si ottiene ricaricando ripetutamente la funzioneWrite.

Domanda. Cosa devo correggere nella macro per poterla chiamare così:

Warning("Warnig  сработал. i=",i);
 
pivomoe:

Non mi sono spiegato bene. Cominciamo dall'inizio. Ora sto usando la macro in questo modo:

Ecco la macro stessa:

Nella chiamata macro tra "Warning," e ");" Un numero arbitrario di parametri di tipi arbitrari. Tutto questo si ottiene ricaricando ripetutamente la funzioneWrite.

Domanda. Cosa dovrebbe essere corretto nella macro per permettere la sua chiamata in questo modo:

Risposta: anche ricaricare la macro più volte)

Ma è meglio usare l'operatore + per le stringhe e convertire tutto in stringhe, allora non hai bisogno di una versione di funzione (e macro) con molti parametri

 
Aleksey Mavrin:

Basta capire il sistema di ordini di MT5, ordine - commercio - posizione.

ResultOrder è l'ordine di apertura. La posizione sarà con POSITION_IDENTIFIER uguale al biglietto di questo ordine.

Tutti gli accordi possono essere trovati nella storia attraverso l'identificatore di posizione. Non confondere con il biglietto della posizione, può cambiare, e l'identificatore è costante.

s.w. Il tester è diverso in quanto non c'è ritardo nell'esecuzione dell'ordine e subito nasce un affare. Nel commercio reale il tempo passa e al momento del successo dell'esecuzione non c'è ancora un accordo, deve essere catturato negli eventi OnTrade.
Grazie per la vostra risposta. Me ne occuperò))
 
Ciao, come posso accedere alle proprietà di un indicatore da un EA? Per esempio, voglio cambiare il colore di una linea di un EA conoscendo la maniglia dell'indicatore. Ho cercato nell'aiuto, ma non ho trovato nulla, forse non sto cercando abbastanza?
 
Tango_X:
Ciao, come posso accedere alle proprietà dell'indicatore da un EA? Per esempio voglio cambiare il colore della linea da un EA se conosco la maniglia dell'indicatore. L'ho cercato, ma non l'ho trovato, forse sto cercando troppo?

Un indicatore per questo deve avere un parametro di colore in ingresso. Cioè, deve essere un indicatore personalizzato.

Motivazione: