Por supuesto, comprobaremos su caso.
Pero en general la función OrderSend funciona según la ayuda.
Возвращаемое значение
En caso de que lacomprobación básica de las estructuras (comprobación de punteros) tenga éxito, devuelve true - no indica la ejecución exitosa de la operación comercial. Para obtener una descripción más detallada del resultado de la función, debemos analizar los campos de la estructura delresultado.
- www.mql5.com
Por supuesto, comprobaremos su caso.
Pero en general, la función OrderSend funciona según la ayuda.
No, no me quejo, sólo quiero entender. Tal vez metí la pata en otra parte... También analicé los campos de la estructura de resultados donde creía que debían estar [como me enseñaron :)].
Pero según entiendo, al menos se supone que la transición al siguiente operador debe hacerse sólo después de que el terminal maneje completamente la función OrderSend() [incluyendo la obtención y manejo de los campos de la estructura de resultados]?
(Perdón, en la pregunta anterior cometí un error tipográfico: especifiqué solicitud en lugar de resultado)
El primer día del Campeonato ha demostrado que mi Asesor Experto no funciona como se pretende, es decir, en lugar de una sola orden pendiente coloca varias órdenes pendientes unidireccionales. Esta es aproximadamente la misma estructura:
Pregunta: ¿El terminal espera a que la función OrderSend() del primer bloque termine de procesar [es decir, espera a que se reciba la solicitud], o pasa inmediatamente al siguiente operador (bloque) tras enviar una solicitud de operación al servidor?Confirmo el problema. Después de establecer el OrderSend() de una orden pendiente, OrdersTotal no siempre lo ve.
He establecido una pausa después de OrderSend(). Pero no ayudó al robot en el campeonato de hoy :)
Una colección de enlaces a una discusión en otro hilo:
https://www.mql5.com/ru/forum/2236/page13/#comment_27472
https://www.mql5.com/ru/forum/2236/page13/#comment_27486
https://www.mql5.com/ru/forum/2236/page13/#comment_27503
https://www.mql5.com/ru/forum/2236/page14/#comment_27531(sobre la asincronía)
https://www.mql5.com/ru/forum/2236/page14/#comment_27552
- www.mql5.com
Buenas tardes a todos.
Estoy tratando de hacer un programa que simplemente abra una orden de acuerdo al mercado, es decir, envío un Símbolo, Volumen y Tipo de Orden, en un bucle hasta que aparezca una Posición con la dirección deseada.
El registro da
2012.01.09 16:08:42 Operaciones '9066293' : falló la compra instantánea de 1,00 EURUSD a 0,0000 (desviación: 103117312) [Paradas no válidas].
Entonces, si abro en el mercado, ¿por qué tengo que especificar el precio de apertura? No necesito ninguna parada.
Yo abriría por F9.
Por favor, aconséjame en qué he metido la pata o escribe algún código para abrir un pedido.
Estoy llenando la estructura con ese mínimo:
uint zOrderSend (string zSymbol, double zVolume, string zORDER_TYPE) { zSymbol = "EURUSD"; zVolume = 1; zORDER_TYPE ="Buy"; Alert ("*****************", zSymbol," ", zVolume," ", zORDER_TYPE); //--- готовим запрос MqlTradeRequest request; request.action=TRADE_ACTION_DEAL; // request.magic=0; request.symbol=zSymbol; // request.volume=zVolume; request.volume=zVolume; // request.price=0; // request.sl=0; // request.tp=0; // request.deviation=SymbolInfoInteger("EURUSD",SYMBOL_SPREAD); // slippage // request.deviation=50; //--- сформируем тип ордера if (zORDER_TYPE == "Buy" ) {request.type = ORDER_TYPE_BUY ;} // тип ордера = 0 if (zORDER_TYPE == "Sell") {request.type = ORDER_TYPE_SELL;} // тип ордера = 1 Alert ("Тип ордера: request.type = ",request.type); request.type_filling = ORDER_FILLING_FOK; request.type_time = ORDER_TIME_GTC; // request.comment = "";Toda la prueba del Asesor Experto para abrir una posición está en el archivo.
Buenas tardes a todos.
Estoy tratando de hacer un programa que simplemente abra una orden de mercado. Es decir, envío allí un Símbolo, Volumen y Tipo de Orden, en un bucle hasta que aparezca una Posición con la dirección que quiero.
Y algo me da = Invalid Stops, mientras que no necesito ningún Stops para una orden de mercado. No sé en qué me estoy equivocando...
La prueba completa del Asesor Experto para abrir una posición está en el archivo.
Aquí tienes, debería funcionar.
//+------------------------------------------------------------------+ //| Deal.mq5 | //| Copyright 2012, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2012, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- create timer EventSetTimer(1); //--- return(0); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- destroy timer EventKillTimer(); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- if(zOrderSend(_Symbol,0.1,ORDER_TYPE_BUY)==10009) // 10009 TRADE_RETCODE_DONE Заявка выполнена { Alert("Купили!"); } else Alert("Не купили...."); } //+------------------------------------------------------------------+ //| Timer function | //+------------------------------------------------------------------+ void OnTimer() { //--- } //+------------------------------------------------------------------+ uint zOrderSend(string zSymbol,double zVolume,ENUM_ORDER_TYPE zORDER_TYPE) { MqlTradeRequest request; MqlTradeCheckResult ch_result; MqlTradeResult result; // обнулим структуру запроса перед заполнением ZeroMemory(request); Alert("*****************",zSymbol," ",zVolume," ",zORDER_TYPE); // заполняем структуру request.action=TRADE_ACTION_DEAL; request.type_filling=ORDER_FILLING_AON; request.symbol=zSymbol; request.type=zORDER_TYPE; request.deviation=30; request.sl=0.0; request.tp=0.0; request.volume=zVolume; if(zORDER_TYPE==ORDER_TYPE_BUY)request.price=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); if(zORDER_TYPE==ORDER_TYPE_SELL)request.price=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); // выводим на печать заполненную структуру торгового запроса Alert(" ENUM_TRADE_REQUEST_ACTIONS request.action; // Тип выполняемого действия =",request.action,"="); Alert(" ulong request.magic; // Штамп эксперта (идентификатор magic number) =", request.magic, "=" ); Alert(" ulong request.order; // Тикет ордера =", request.order, "=" ); Alert(" string request.symbol; // Имя торгового инструмента =", request.symbol, "=" ); Alert(" double request.volume; // Запрашиваемый объем сделки в лотах =", request.volume, "=" ); Alert(" double request.price; // Цена =", request.price, "=" ); Alert(" double request.stoplimit; // Уровень StopLimit ордера =", request.stoplimit, "=" ); Alert(" double request.sl; // Уровень Stop Loss ордера =", request.sl, "=" ); Alert(" double request.tp; // Уровень Take Profit ордера =", request.tp, "=" ); Alert(" ulong request.deviation; // Максимально приемлемое отклонение от запрашиваемой цены =", request.deviation, "=" ); Alert(" ENUM_ORDER_TYPE request.type; // Тип ордера =", request.type, "=" ); Alert(" ENUM_ORDER_TYPE_FILLING request.type_filling; // Тип ордера по исполнению =", request.type_filling, "=" ); Alert(" ENUM_ORDER_TYPE_TIME request.type_time; // Тип ордера по времени действия =", request.type_time, "=" ); Alert(" datetime request.expiration; // Срок истечения ордера (для ордеров типа ORDER_TIME_SPECIFIED) =", request.expiration, "=" ); Alert(" string request.comment; // Комментарий к ордеру =", request.comment, "=" ); // отправляем структуру запроса на проверку if(OrderCheck(request,ch_result)==false) { Alert("OrderCheck выявил ошибку: "+IntegerToString(ch_result.retcode)+"/"+ch_result.comment); return ch_result.retcode; } // отправляем запрос на торговый сервер if(OrderSend(request,result)==false) { Alert("OrderSend возвратил ошибку: "+IntegerToString(result.retcode)+"/"+result.comment); return result.retcode; } // выводим на печать структуру ответа сервера Alert("Код результата операции сервера: " + IntegerToString(result.retcode)); Alert("deal Тикет сделки " + IntegerToString(result.deal)); Alert("order Тикет ордера " + IntegerToString(result.order)); Alert("volume Объем сделки " + DoubleToString (result.volume)); Alert("price Цена в сделке " + DoubleToString (result.price)); Alert("bid(цены реквоты) " + DoubleToString (result.bid)); Alert("ask(цены реквоты) " + DoubleToString (result.ask)); Alert("Комментарий: "+result.comment); return result.retcode; } //+------------------------------------------------------------------+
Ahí lo tienes, debería funcionar.
Gracias. Está funcionando. Y tan rápido que no tiene tiempo de actualizar la información de la Posición.
Como resultado, se realizan 2 pedidos.
Se puede arreglar con una pausa de 1 milisegundo.
if(zOrderSend(_Symbol,0.1,ORDER_TYPE_BUY)==10009) // 10009 TRADE_RETCODE_DONE Заявка выполнена { Sleep (1); Alert("Купили!"); } else Alert("Не купили...."); }
... no tiene tiempo para actualizar la información de la posición.
Como resultado, se realizan 2 pedidos.
Esto puede resolverse con una pausa de 1 milisegundo.
Sólo hay que tener en cuenta que la pausa no es una panacea:
Sólo hay que tener en cuenta que una pausa no es una panacea:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
El primer día del Campeonato ha demostrado que mi Asesor Experto no funciona como se pretende, es decir, en lugar de una sola orden pendiente coloca varias órdenes pendientes unidireccionales. Se trata aproximadamente de la siguiente estructura:
Pregunta: ¿El terminal espera a que la función OrderSend() del primer bloque termine de procesar [es decir, espera a que se reciba la solicitud], o pasa inmediatamente al siguiente operador (bloque) después de enviar una solicitud de operación al servidor?