Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 815

 
pivomoe:
No puedo entender si es normal que .

Hay muchas cosas que son difíciles de entender aquí. En particular, cuando se trata de la secuencia de transacciones, he encontrado que hay algunas inconsistencias en varios casos.
Por ejemplo, cuando se abre una posición, primero se abre formalmente una orden de mercado, que luego se convierte en una posición. Sin embargo, durante esta serie de operaciones de ametrallamiento se produce una situación en la que ya se ha abierto una posición, pero la orden aún no se ha cerrado. Es evidente que se trata del mismo hecho, pero las operaciones se organizan de forma fragmentaria, se emiten secuencialmente, y con este enfoque es en principio imposible reflejar correctamente la transformación de una orden de mercado en una posición.

En mi opinión, lo mejor es organizar el control de las operaciones: recordar las órdenes comerciales y controlar la composición de las órdenes y las posiciones simplemente por el hecho de su presencia en las listas correspondientes.
 

Hablando de pájaros.

¿Sabía que en estas operaciones se emiten órdenes de mercado con precio cero?
Por ejemplo, una persona quiere abrir una posición de compra a 1,2000, Sl=1,1000, Tr=1,3000.
Cuando se ejecuta esta transacción, lo primero que aparece es la orden de mercado con los siguientes datos:
Sl= 1.1000, Tr= 1.3000, es decir, con los números especificados y Price=0 (igual a cero). Sólo un tipo de orden de mercado con precio cero :) Y piensa lo que quieras.

 
pivomoe:

Para mayor comodidad. Una pequeña función es llamada desde MqlTradeTransaction. El elemento requerido se encuentra allí mediante la búsqueda de elementos de la clase. Y para este elemento, se llama a una de las funciones de la clase que hace algo útil.


Describa con más detalle lo que quiere conseguir exactamente. ¿Por qué llama a algo desde OnTradeTransaction?

Primero sólo en palabras, luego lo corregiremos en la dirección correcta.

 
User_mt5:
Se ejecuta la función del usuario Abc(), que implementa un algoritmo largo (en términos de tiempo).
Durante la ejecución de esta función, se producen algunos eventos, por ejemplo - Comercio, Temporizador, etc.
¿Es posible saber que estos eventos se produjeron sin finalizar la ejecución de la función Abc()?

No. Mientras una función esté contando, todo lo demás se saltará.

Es similar ala funciónSleep()- es decir, mientras su función está contando durante un tiempo muy largo, su comportamiento es similar al de Sleep - todos los demás eventos serán saltados.

 
User_mt5:

...


Absolutamente todo es transparente en OnTradeTransaction.

Primero: Laestructura MqlTradeTransaction se rellena de forma diferente según el tipo de transacción comercial (ENUM_TRADE_TRANSACTION_TYPE).

leer aquí:Estructura de una transacción comercial (MqlTradeTransaction)

Segundo: Para visualizar los resultados, podemos extraer este bloque de código del ejemploOrderSendAsync

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

y pegarlo en un Asesor Experto que se puede adjuntar a un gráfico. Luego puede abrir/cerrar posiciones manualmente y ver la impresión de los resultados en la pestaña de Expertos.

 
Vladimir Karputov:

No. Mientras una función esté contando, todo lo demás se saltará.

Es análoga ala funciónSleep()- es decir, mientras su función está contando durante un tiempo muy largo, su comportamiento es anflogico al de Sleep - todos los eventos de descanso serán saltados.

Gracias, es una pena.
¿Y cómo utilizar entonces el recurso del PC de forma eficaz? ¿Otra vez código en bucle y sondeo periódico de los parámetros?

 
Vladimir Karputov:

Absolutamente todo es transparente en OnTradeTransaction.

Gracias por la respuesta, eso es más o menos lo que hice. Más preguntas que conocimientos hasta ahora...

 
Vladimir Karputov:

Describa con más detalle lo que quiere conseguir exactamente. ¿Por qué llama a algo desde OnTradeTransaction?

Primero sólo en palabras, luego lo corregiremos en la dirección correcta.

He entendido que el problema no es con OnTradeTransaction. Mira qué lío tengo aquí:

Aquí está el código.

 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());

Y aquí está el resultado de su ejecución

2017.09.22 10:30:12 Fallo al seleccionar la posición por símbolo SBRF-12.17
2017.09.22 10:30:12 Volumen 0.0 Volumen 0.0

Intercambio las líneas 2 y 3. Es decir, el código es ahora

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());

Obtengo un resultado como este.

2017.09.22 10:30:12 Fallo al seleccionar la posición por símbolo SBRF-12.17
2017.09.22 10:30:12 SBRF-3.18 Volumen 1. 0

En ambos casos, el compilador no genera ninguna advertencia. Se adjunta el código del Asesor Experto de 80 líneas y la configuración de prueba. Broker BCS. La versión 1730.

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

Me he dado cuenta de que el problema no está en OnTradeTransaction. Mira qué lío tengo montado:

Aquí está el código.

Y aquí está el resultado de su ejecución

2017.09.22 10:30:12 Fallo al seleccionar la posición por símbolo SBRF-12.17
2017.09.22 10:30:12 Volumen 0.0 Volumen 0.0

Intercambio las líneas 2 y 3. Es decir, el código es ahora

Obtengo un resultado como este.

2017.09.22 10:30:12 Fallo al seleccionar la posición por símbolo SBRF-12.17
2017.09.22 10:30:12 SBRF-3.18 Volumen 1. 0

En ambos casos, el compilador no genera ninguna advertencia. Se adjunta el código del Asesor Experto de 80 líneas y la configuración de prueba. Broker BCS. La versión 1730.

Responderé este fin de semana. Lo siento.

 

El error parece estar en tratar de obtener información sobre más de 1 posición, en 1 línea(Print).

Sólo está disponible la información de 1 posición (seleccionada ) en cualquier momento:

- En el segundo caso es correcto, porque last Select devuelve true , que no has comprobado.

- Y en el primer caso : last Select devuelve false , que tampoco has comprobado, y el resultado es imprevisible.

..... obviamente Select==false restablece la información del anterior Select==true

Razón de la queja: