Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 815

 
pivomoe:
Non riesco a capire se è normale che.

Ci sono molte cose difficili da capire qui. In particolare, quando si tratta della sequenza delle transazioni, ho scoperto che ci sono alcune incongruenze in un certo numero di casi.
Per esempio, quando si apre una posizione, viene formalmente aperto prima un ordine a mercato, che poi si trasforma in una posizione. Tuttavia, durante questa serie di transazioni a mitraglia c'è una situazione in cui una posizione è già stata aperta, ma l'ordine non è ancora stato chiuso. Chiaramente si tratta dello stesso evento, ma le transazioni sono organizzate in modo frammentario, emesse in sequenza, e con questo approccio è in linea di principio impossibile riflettere correttamente la trasformazione di un ordine di mercato in una posizione.

A mio parere, è meglio organizzare il controllo degli scambi: ricordare gli ordini di compravendita e monitorare la composizione degli ordini e delle posizioni semplicemente per il fatto della loro presenza nelle relative liste.
 

A proposito di uccelli.

Sapevate che gli ordini di mercato sono emessi in queste transazioni con un prezzo zero?
Per esempio, una persona vuole aprire una posizione Buy a 1.2000, Sl=1.1000, Tr=1.3000.
Quando questa transazione viene eseguita, la prima cosa che appare è l'ordine di mercato con i seguenti dati:
Sl= 1.1000, Tr=1.3000, cioè con le cifre selezionate e Price=0 (uguale a zero). Solo una specie di ordine di mercato con prezzo zero :) E pensa quello che vuoi.

 
pivomoe:

Per comodità. Una piccola funzione è chiamata da MqlTradeTransaction. L'elemento richiesto si trova lì attraverso la ricerca di elementi della classe. E per questo elemento, viene chiamata una delle funzioni di classe che fa qualcosa di utile.


Per favore, descrivi più dettagliatamente cosa vuoi ottenere esattamente? Perché state chiamando qualcosa da OnTradeTransaction?

Prima solo a parole, poi lo correggeremo nella giusta direzione.

 
User_mt5:
Viene eseguita la funzione Abc() dell'utente, che implementa un algoritmo lungo (in termini di tempo).
Durante l'esecuzione di questa funzione, hanno luogo alcuni eventi, per esempio - Trade, Timer, ecc.
È possibile sapere che questi eventi si sono verificati senza terminare l'esecuzione della funzione Abc()?

No. Mentre una funzione è in conteggio, tutto il resto viene saltato.

È simile allafunzioneSleep()- cioè mentre la vostra funzione sta contando per un tempo molto lungo, il suo comportamento è simile a Sleep - tutti gli altri eventi saranno saltati.

 
User_mt5:

...


Assolutamente tutto è trasparente in OnTradeTransaction.

Primo:la struttura MqlTradeTransaction è riempita diversamente a seconda del tipo di transazione commerciale (ENUM_TRADE_TRANSACTION_TYPE).

leggi qui:Struttura di una transazione commerciale (MqlTradeTransaction)

Secondo: Per visualizzare i risultati, possiamo estrarre questo blocco di codice dall'esempioOrderSendAsync

//+------------------------------------------------------------------+ 
//| TradeTransaction function                                        | 
//+------------------------------------------------------------------+ 
void OnTradeTransaction(const MqlTradeTransaction &trans, 
                        const MqlTradeRequest &request, 
                        const MqlTradeResult &result) 
  { 
//--- получим тип транзакции в виде значения перечисления  
   ENUM_TRADE_TRANSACTION_TYPE type=(ENUM_TRADE_TRANSACTION_TYPE)trans.type; 
//--- если транзакция является результатом обработки запроса, выведем только её название 
   if(type==TRADE_TRANSACTION_REQUEST) 
     { 
      Print(EnumToString(type)); 
      //--- выведем строковое описание обработанного запроса 
      Print("------------RequestDescription\r\n",RequestDescription(request)); 
      //--- выведем описание результата запроса 
      Print("------------ResultDescription\r\n",TradeResultDescription(result)); 
      //--- запомним тикет ордера для его удаления на следующей обработке в OnTick() 
      if(result.order!=0) 
        { 
         //--- удалим этот ордер по его тикету при следующем вызове OnTick() 
         order_ticket=result.order; 
         Print(" Тикет отложенного ордера ",order_ticket,"\r\n"); 
        } 
     } 
   else // для транзакций другого типа выведем полное описание 
//--- выведем описание полученной транзакции в Журнал 
      Print("------------TransactionDescription\r\n",TransactionDescription(trans));
 
//---      
  } 
//+------------------------------------------------------------------+ 
//| Возвращает текстовое описание транзакции                         | 
//+------------------------------------------------------------------+ 
string TransactionDescription(const MqlTradeTransaction &trans) 
  { 
//---  
   string desc=EnumToString(trans.type)+"\r\n"; 
   desc+="Symbol: "+trans.symbol+"\r\n"; 
   desc+="Deal ticket: "+(string)trans.deal+"\r\n"; 
   desc+="Deal type: "+EnumToString(trans.deal_type)+"\r\n"; 
   desc+="Order ticket: "+(string)trans.order+"\r\n"; 
   desc+="Order type: "+EnumToString(trans.order_type)+"\r\n"; 
   desc+="Order state: "+EnumToString(trans.order_state)+"\r\n"; 
   desc+="Order time type: "+EnumToString(trans.time_type)+"\r\n"; 
   desc+="Order expiration: "+TimeToString(trans.time_expiration)+"\r\n"; 
   desc+="Price: "+StringFormat("%G",trans.price)+"\r\n"; 
   desc+="Price trigger: "+StringFormat("%G",trans.price_trigger)+"\r\n"; 
   desc+="Stop Loss: "+StringFormat("%G",trans.price_sl)+"\r\n"; 
   desc+="Take Profit: "+StringFormat("%G",trans.price_tp)+"\r\n"; 
   desc+="Volume: "+StringFormat("%G",trans.volume)+"\r\n"; 
   desc+="Position: "+(string)trans.position+"\r\n"; 
   desc+="Position by: "+(string)trans.position_by+"\r\n"; 
//--- вернем полученную строку 
   return desc; 
  } 
//+------------------------------------------------------------------+ 
//| Возвращает текстовое описание торгового запроса                  | 
//+------------------------------------------------------------------+ 
string RequestDescription(const MqlTradeRequest &request) 
  { 
//--- 
   string desc=EnumToString(request.action)+"\r\n"; 
   desc+="Symbol: "+request.symbol+"\r\n"; 
   desc+="Magic Number: "+StringFormat("%d",request.magic)+"\r\n"; 
   desc+="Order ticket: "+(string)request.order+"\r\n"; 
   desc+="Order type: "+EnumToString(request.type)+"\r\n"; 
   desc+="Order filling: "+EnumToString(request.type_filling)+"\r\n"; 
   desc+="Order time type: "+EnumToString(request.type_time)+"\r\n"; 
   desc+="Order expiration: "+TimeToString(request.expiration)+"\r\n"; 
   desc+="Price: "+StringFormat("%G",request.price)+"\r\n"; 
   desc+="Deviation points: "+StringFormat("%G",request.deviation)+"\r\n"; 
   desc+="Stop Loss: "+StringFormat("%G",request.sl)+"\r\n"; 
   desc+="Take Profit: "+StringFormat("%G",request.tp)+"\r\n"; 
   desc+="Stop Limit: "+StringFormat("%G",request.stoplimit)+"\r\n"; 
   desc+="Volume: "+StringFormat("%G",request.volume)+"\r\n"; 
   desc+="Comment: "+request.comment+"\r\n"; 
//--- вернем полученную строку 
   return desc; 
  } 
//+------------------------------------------------------------------+ 
//| Возвращает текстовое описание результата обработки запроса       | 
//+------------------------------------------------------------------+ 
string TradeResultDescription(const MqlTradeResult &result) 
  { 
//--- 
   string desc="Retcode "+(string)result.retcode+"\r\n"; 
   desc+="Request ID: "+StringFormat("%d",result.request_id)+"\r\n"; 
   desc+="Order ticket: "+(string)result.order+"\r\n"; 
   desc+="Deal ticket: "+(string)result.deal+"\r\n"; 
   desc+="Volume: "+StringFormat("%G",result.volume)+"\r\n"; 
   desc+="Price: "+StringFormat("%G",result.price)+"\r\n"; 
   desc+="Ask: "+StringFormat("%G",result.ask)+"\r\n"; 
   desc+="Bid: "+StringFormat("%G",result.bid)+"\r\n"; 
   desc+="Comment: "+result.comment+"\r\n"; 
//--- вернем полученную строку 
   return desc; 
  }

e incollarlo in un Expert Advisor che può essere collegato a un grafico. Poi puoi aprire/chiudere manualmente le posizioni e guardare la stampa dei risultati nella scheda Experts.

 
Vladimir Karputov:

No. Mentre una funzione è in conteggio, tutto il resto viene saltato.

È analogo allafunzioneSleep()- cioè, mentre la vostra funzione sta contando per un tempo molto lungo, il suo comportamento è anflogico a Sleep - tutti gli eventi di riposo saranno saltati.

Grazie, è un peccato.
E come utilizzare efficacemente le risorse del PC? Ancora codice in loop e polling periodico dei parametri?

 
Vladimir Karputov:

Assolutamente tutto è trasparente in OnTradeTransaction.

Grazie per la risposta, è più o meno quello che ho fatto. Più domande che intuizioni finora...

 
Vladimir Karputov:

Per favore, descrivi più dettagliatamente cosa vuoi ottenere esattamente? Perché chiamate qualcosa da OnTradeTransaction?

Prima solo a parole, poi lo correggeremo nella giusta direzione.

Ho capito che il problema non è con OnTradeTransaction. Guarda che casino ho qui:

Ecco il codice.

 CPositionInfo PositionInfoKotiryemii,PositionInfoVedygii;
 
 if( !PositionInfoKotiryemii.Select("SBRF-3.18") )Print("Не удалось выбрать позицию по символ SBRF-3.18 ");
 if( !PositionInfoVedygii.Select("SBRF-12.17")   )Print("Не удалось выбрать позицию по символ SBRF-12.17 ");

 Print(PositionInfoKotiryemii.Symbol()," Объем ",PositionInfoKotiryemii.Volume()," ",PositionInfoVedygii.Symbol()," Объем ",PositionInfoVedygii.Volume());

Ed ecco il risultato della sua esecuzione

2017.09.22 10:30:12 Impossibile selezionare la posizione per simbolo SBRF-12.17
2017.09.22 10:30:12 Volume 0.0 Volume 0.0

Ho scambiato le linee 2 e 3. Cioè il codice è ora

CPositionInfo PositionInfoKotiryemii,PositionInfoVedygii;
 
 if( !PositionInfoVedygii.Select("SBRF-12.17")   )Print("Не удалось выбрать позицию по символ SBRF-12.17 ");
 if( !PositionInfoKotiryemii.Select("SBRF-3.18") )Print("Не удалось выбрать позицию по символ SBRF-3.18 ");
 
 Print(PositionInfoKotiryemii.Symbol()," Объем ",PositionInfoKotiryemii.Volume()," ",PositionInfoVedygii.Symbol()," Объем ",PositionInfoVedygii.Volume());

Ottengo un risultato come questo.

2017.09.22 10:30:12 Impossibile selezionare la posizione per simbolo SBRF-12.17
2017.09.22 10:30:12 SBRF-3.18 Volume 1.0 SBRF-3.18 Volume 1.0

In entrambi i casi il compilatore non genera avvertimenti. In allegato c'è il codice di Expert Advisor di 80 linee e le impostazioni di test. Broker BCS. La versione 1730.

Ошибки - Инструменты - Пользовательский интерфейс - Справка по MetaEditor
Ошибки - Инструменты - Пользовательский интерфейс - Справка по MetaEditor
  • www.metatrader5.com
На данной вкладке отображается журнал компиляции программ, содержащий сообщения об использованных при компиляции файлах, а также ошибки и предупреждения, возникшие в этом процессе. — описание события. Иконки, расположенные слева от описания свидетельствуют о типе события. означает ошибку, — предупреждение, а — информационное сообщение; Если...
File:
temp.mq5  7 kb
1.png  11 kb
 
pivomoe:

Ho capito che il problema non è con OnTradeTransaction. Guarda che casino che ho fatto:

Ecco il codice.

Ed ecco il risultato della sua esecuzione

2017.09.22 10:30:12 Impossibile selezionare la posizione per simbolo SBRF-12.17
2017.09.22 10:30:12 Volume 0.0 Volume 0.0

Ho scambiato le linee 2 e 3. Cioè il codice è ora

Ottengo un risultato come questo.

2017.09.22 10:30:12 Impossibile selezionare la posizione per simbolo SBRF-12.17
2017.09.22 10:30:12 SBRF-3.18 Volume 1.0 SBRF-3.18 Volume 1.0

In entrambi i casi il compilatore non genera avvertimenti. In allegato c'è il codice di Expert Advisor di 80 linee e le impostazioni di test. Broker BCS. La versione 1730.

Risponderò questo fine settimana. Mi dispiace.

 

L'errore sembra essere nel tentativo di ottenere informazioni su più di 1 posizione, in 1 riga(Print).

Solo le informazioni su 1 posizione (selezionata ) sono disponibili in qualsiasi momento:

- Nel secondo caso tutto è corretto, perché l'ultimo Select restituisce true, che non avete controllato.

- E nel primo caso: l'ultimo Select restituisce false, che non hai nemmeno controllato, e il risultato è imprevedibile.

..... ovviamente Select==false resetta le informazioni del precedente Select==true