Gracias, Sergey, por tu respuesta. Su respuesta me dejó aún más perplejo. ¿Cómo puede ser? Cuando ejecuto el script, se interrogan todas las órdenes pendientes establecidas. Como podemos ver en la imagen, hay dos en el gráfico, y al mismo tiempo, un billete está seleccionado y el otro no? No está del todo claro.
¿Puede explicarlo con más detalle?
La pregunta no la hago por curiosidad, sino para continuar con el autoestudio.
Saludos, Vladimir.
Aquí tienes un bucle en el que cambias el iterador i del índice máximo a 0. ¿Qué pasa dentro? Pues bien, esto es lo que ocurre: El primer comando que intentas obtener el parámetro ORDER_SYMBOL. ¡Pero de qué orden está tratando de obtenerlo, porque el orden se seleccionará tres líneas más abajo!
Sergey Gridnev #: Entonces, tienes un bucle en el que cambias el iterador i del índice máximo a 0. ¿Qué pasa dentro de él? Pues bien, esto es lo que ocurre: el primer comando que intentas obtener el parámetro ORDER_SYMBOL. ¡Pero, de qué orden está tratando de obtenerlo, porque el orden será seleccionado tres líneas más abajo!
Gracias, Sergey, por la explicación tan detallada y comprensible. He puesto la línea con el ticket de la orden pendiente justo después del inicio del ciclo y todo ha funcionado bien.
Sí... Presta atención y vuelve a prestar atención. Eso es lo que realmente me falta. Gracias de nuevo.
Hoy me he enfrentado a dos cuestiones más que no entiendo, pero en un código sacado íntegramente de la Referencia MQL5. Esta vez no he escrito nada, sino que he tomado un ejemplo ya hecho.
Modify Pending Order
Торговый приказ на модификацию уровней цен отложенного ордера. Требуется указание 7 полей:
action
order
price
sl
tp
type_time
expiration
Пример торговой операции TRADE_ACTION_MODIFY для модификации уровней цен отложенного ордера:
Esto está claro. Me sigue un ejemplo con este código:
#define EXPERT_MAGIC 123456// MagicNumber эксперта//+------------------------------------------------------------------+//| Модификация отложенных ордеров |//+------------------------------------------------------------------+voidOnStart()
{
//-- объявление и инициализация запроса и результатаMqlTradeRequest request={};
MqlTradeResult result={};
int total=OrdersTotal(); // количество установленных отложенных ордеров//--- перебор всех установленных отложенных ордеровfor(int i=0; i<total; i++)
{
//--- параметры ордераulong order_ticket=OrderGetTicket(i); // тикет ордераstring order_symbol=Symbol(); // символint digits=(int)SymbolInfoInteger(order_symbol,SYMBOL_DIGITS); // количество знаков после запятойulong magic=OrderGetInteger(ORDER_MAGIC); // MagicNumber ордераdouble volume=OrderGetDouble(ORDER_VOLUME_CURRENT); // текущий объем ордераdouble sl=OrderGetDouble(ORDER_SL); // текущий Stop Loss ордераdouble tp=OrderGetDouble(ORDER_TP); // текущий Take Profit ордераENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE); // тип ордераint offset = 50; // отступ от текущей цены для установки ордера, в пунктахdouble price; // цена срабатывания ордераdouble point=SymbolInfoDouble(order_symbol,SYMBOL_POINT); // размер пункта//--- вывод информации об ордереPrintFormat("#%I64u %s %s %.2f %s sl: %s tp: %s [%I64d]",
order_ticket,
order_symbol,
EnumToString(type),
volume,
DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),DoubleToString(sl,digits),
DoubleToString(tp,digits),
magic);
//--- если MagicNumber совпадает, Stop Loss и Take Profit не заданыif(magic==EXPERT_MAGIC && sl==0 && tp==0)
{
request.action=TRADE_ACTION_MODIFY; // тип торговой операции
request.order = OrderGetTicket(i); // тикет ордера
request.symbol =Symbol(); // символ
request.deviation=5; // допустимое отклонение от цены//--- установка уровня цены, тейк-профит и стоп-лосс ордера в зависимости от его типаif(type==ORDER_TYPE_BUY_LIMIT)
{
price = SymbolInfoDouble(Symbol(),SYMBOL_ASK)-offset*point;
request.tp = NormalizeDouble(price+offset*point,digits);
request.sl = NormalizeDouble(price-offset*point,digits);
request.price =NormalizeDouble(price,digits); // нормализованная цена открытия
}
elseif(type==ORDER_TYPE_SELL_LIMIT)
{
price = SymbolInfoDouble(Symbol(),SYMBOL_BID)+offset*point;
request.tp = NormalizeDouble(price-offset*point,digits);
request.sl = NormalizeDouble(price+offset*point,digits);
request.price =NormalizeDouble(price,digits); // нормализованная цена открытия
}
elseif(type==ORDER_TYPE_BUY_STOP)
{
price = SymbolInfoDouble(Symbol(),SYMBOL_ASK)+offset*point;
request.tp = NormalizeDouble(price+offset*point,digits);
request.sl = NormalizeDouble(price-offset*point,digits);
request.price =NormalizeDouble(price,digits); // нормализованная цена открытия
}
elseif(type==ORDER_TYPE_SELL_STOP)
{
price = SymbolInfoDouble(Symbol(),SYMBOL_BID)-offset*point;
request.tp = NormalizeDouble(price-offset*point,digits);
request.sl = NormalizeDouble(price+offset*point,digits);
request.price =NormalizeDouble(price,digits); // нормализованная цена открытия
}
//--- отправка запросаif(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки//--- информация об операции PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
//--- обнуление значений запроса и результатаZeroMemory(request);
ZeroMemory(result);
}
}
}
//+------------------------------------------------------------------+
Estoy tratando de entender la línea resaltada en amarillo. Enseguida surge una pregunta: ¿qué tiene que verPositionGetDouble(POSITION_PRICE_OPEN)si este ejemplo está relacionado con órdenes pendientes? Tal vez, debería haber una línea como esta:
Este es el primer punto. El segundo problema surge cuando intento ejecutar este script en un gráfico con una orden pendiente BUY_STOP que he establecido (aunque todo lo que sucede es similar a otros tipos de órdenes pendientes). Entonces, ¿qué pasa? No pasa nada. No veo ninguna modificación de una orden pendiente. ¿Quizás no entiendo algo?
Sasha, no se te ocurre nadapeor que usar ejemplos de la documentación o ejemplos de tumblr. Y también has perdido la bandera de la terminación forzada del bucle while en alguna parte. En definitiva... sin palabras.
Dudo que los ejemplos escritos en la documentación e incluso en la biblioteca estándar se comprueben a fondo. Hay muchos errores de este tipo. Los ejemplos, en mi opinión, sólo pueden servir de muestra...
Dudo que los ejemplos escritos en la documentación e incluso en la librería estándar sean revisados a fondo. Hay muchos errores de este tipo. Los ejemplos, en mi opinión, sólo pueden servir de muestra...
¡Hola Alexey!
Es muy triste que una empresa tan seria tenga una actitud tan pobre hacia los manuales.
Es muy triste que una empresa tan seria tenga una actitud tan poco seria con el manual.
Sinceramente, Vladimir.
Hay otro error en este ejemplo. O completamente ciego.
Entre los campos obligatorios listados hay una caducidad, pero en el código del ejemplo no veo dónde se asigna la caducidad. En su lugar, se asigna la desviación permitida del precio.
Todavía hay un error en este ejemplo. O me he quedado completamente ciego...
Entre los campos obligatorios de la lista está la expiración, pero en el código de ejemplo no veo dónde se asigna la expiración. En cambio, se especifica la desviación permitida del precio.
No sólo el tiempo de caducidad, sino que también debería estar ahí:
Типы торговых операций - Торговые константы - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Gracias, Sergey, por tu respuesta. Su respuesta me dejó aún más perplejo. ¿Cómo puede ser? Cuando ejecuto el script, se interrogan todas las órdenes pendientes establecidas. Como podemos ver en la imagen, hay dos en el gráfico, y al mismo tiempo, un billete está seleccionado y el otro no? No está del todo claro.
¿Puede explicarlo con más detalle?
La pregunta no la hago por curiosidad, sino para continuar con el autoestudio.
Saludos, Vladimir.
Entonces, tienes un bucle en el que cambias el iterador i del índice máximo a 0. ¿Qué pasa dentro de él? Pues bien, esto es lo que ocurre: el primer comando que intentas obtener el parámetro ORDER_SYMBOL. ¡Pero, de qué orden está tratando de obtenerlo, porque el orden será seleccionado tres líneas más abajo!
Gracias, Sergey, por la explicación tan detallada y comprensible. He puesto la línea con el ticket de la orden pendiente justo después del inicio del ciclo y todo ha funcionado bien.
Sí... Presta atención y vuelve a prestar atención. Eso es lo que realmente me falta. Gracias de nuevo.
Sinceramente, Vladimir.
Buenos días, estimados expertos.
Hoy me he enfrentado a dos cuestiones más que no entiendo, pero en un código sacado íntegramente de la Referencia MQL5. Esta vez no he escrito nada, sino que he tomado un ejemplo ya hecho.
Abro MQL5 Reference / Constantes, Enumeraciones y Estructuras / Estructuras de Datos / Estructura de una Solicitud de Comercio. Lo encuentro allí:
Estructura de la solicitud comercialEsto está claro. Me sigue un ejemplo con este código:
Estoy tratando de entender la línea resaltada en amarillo. Enseguida surge una pregunta: ¿qué tiene que ver PositionGetDouble(POSITION_PRICE_OPEN)si este ejemplo está relacionado con órdenes pendientes? Tal vez, debería haber una línea como esta:
Sólo lo encuentro en la pestaña de Expertos: Estimados expertos, por favor ayúdenme a entender este ejemplo, ¿por qué está en el directorio, pero su código no funciona?
Saludos, Vladimir.
Estimados expertos, por favor ayúdenme a entender este ejemplo, ¿por qué está en el libro de referencia, pero su código no funciona?
Sinceramente, Vladimir.
Ya escribí sobre ello hace unas páginas.
Este es el foro para el comercio, los sistemas de comercio automatizados y las pruebas de estrategia.
Cualquier pregunta de los novatos en MQL4 y MQL5, ayuda y discusión de algoritmos y códigos
Alexey Viktorov, 2022.02.20 10:24
Sasha, no se te ocurre nada peor que usar ejemplos de la documentación o ejemplos de tumblr. Y también has perdido la bandera de la terminación forzada del bucle while en alguna parte. En definitiva... sin palabras.Escribí sobre esto hace unas páginas
¡Hola Alexey!
Es muy triste que una empresa tan seria tenga una actitud tan pobre hacia los manuales.
Sinceramente, Vladimir.
¡Hola Alexey!
Es muy triste que una empresa tan seria tenga una actitud tan poco seria con el manual.
Sinceramente, Vladimir.
Hay otro error en este ejemplo. O completamente ciego.
Entre los campos obligatorios listados hay una caducidad, pero en el código del ejemplo no veo dónde se asigna la caducidad. En su lugar, se asigna la desviación permitida del precio.
Todavía hay un error en este ejemplo. O me he quedado completamente ciego...
Entre los campos obligatorios de la lista está la expiración, pero en el código de ejemplo no veo dónde se asigna la expiración. En cambio, se especifica la desviación permitida del precio.
No sólo el tiempo de caducidad, sino que también debería estar ahí:
Sinceramente, Vladimir.
No sólo eso, sino que también debería haber un tiempo de caducidad:
Sinceramente, Vladimir.
Me dirijo a Artem Trishkin, el moderador y organizador de esta rama.
Por su parte, ¿tiene usted la posibilidad de aprobar todas las preguntas relacionadas con la Guía MQL5 de MQL?
Si no es mucha molestia, ¿puede actualizar esta página al menos?
Sinceramente, Vladimir.Me dirijo a Artem Trishkin, el moderador y organizador de este hilo.
¿Tiene usted, por su parte, la posibilidad de transmitir a MQL5 todas las preguntas relacionadas con la Guía MQL5?
Si no te importa, al menos esta página puede ser actualizada ?
Respetuosamente, Vladimir.También puedes informar en este hilo.
También puedes informar en este hilo.
Gracias por el consejo, Alexey! Esperaré la respuesta en este hilo primero, pero si no pasa nada, lo reportaré en el tema de Errores, Bugs, Preguntas.
Sinceramente, Vladimir.