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

 

Gumko:

Gumko : ¿Y cuánto tiempo va a tardar esta tarea en aparecer primero...?

Lleva 2 días parado.

Esperé entre 8 y 10 días, luego me rendí y lo apagué.
 
Me pregunto cuánta carga de CPU tiene el software Tester en segundo plano.
 

Hola a todos.

Modificación y problemas.

Función externa:

bool ModifyPosition(const string symbol,double StopLoss,double Takeprofit){
//---- estructura vinculante y resultados comerciales
Solicitud MqlTradeRequest;
MqlTradeResult resultado;
//---- estructura de inicialización de la búsqueda de comercio MqlTradeRequest para la modificación de la posición
request.action = TRADE_ACTION_SLTP;
request.symbol = symbol;
request.sl = StopLoss;
request.tp = Takeprofit;
cadena palabra = "";
StringConcatenate(word,
"<< ============ Modifyposition(): Modifica la posición ",
símbolo," ============ >>>");
Print(word);
//---- modificar la posición y comprobar los resultados de la búsqueda de operaciones
if(!OrderSend(request,result)|| result.deal==0)
{
Print("Modificar error =", GetLastError();
return(false);
}
return(true);
}

Pero no funciona así.

¿Cómo hacerlo?

Gracias :)

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Типы торговых операций
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Типы торговых операций
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Типы торговых операций - Документация по MQL5
 
mario065: Pero no funciona así, ¿cómo lo hago? Gracias :)

Inténtalo de esta manera:

MqlTradeRequest request={0};
MqlTradeResult  result ={0};
 
Yedelkin:

Inténtalo de esta manera:

Yedelkin,

Gracias, no funcionó.

He comprobado si cuenta correctamente para el inicio de la llamada a la función.

Así es como lo hice:

double Oferta = NormalizeDouble(SymbolInfoDouble(Currency,SYMBOL_BID),_Digits);
double Ask = NormalizeDouble(SymbolInfoDouble(Currency,SYMBOL_ASK),_Digits);
double Open = NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),_Digits);
double SL = NormalizeDouble(PositionGetDouble(POSITION_SL),_Digits);
if(Open > 0){
start_buy = Ask - Open; Print("start_buy=",start_buy);
start_sel = Open - Bid;Print("start_sel=",start_sel);
}

Sorpresa en el registro:

MR 0 Core 1 10:21:49 2012.10.01 10:12:42 deal #2 sell 0.10 EURUSD at 1.28146 done (based on order #2)
GH 0 Core 1 10:21:49 2012.10.01 01 01:12:42 operación realizada [#2 vender 0,10 EURUSD a 1,28146]
NI 0 Core 1 10:21:49 2012.10.01 01 01:12:42 orden realizada vender 0.10 a 1.28146 [#2 vender 0.10 EURUSD a 1.28146 (0.00000)
OF 0 Core 1 10:21:49 2012.10.01 01 01:12:43 start_buy=0.00012999999999635
DR 0 Core 1 10:21:49 2012.10.01 01:12:43 start_sel=5.000000000010552e-005
LE 0 Core 1 10:21:49 2012.10.01 01:12:43 start_buy=0.000109999998325
ES 0 Core 1 10:21:49 2012.10.01 01:12:43 start_sel=7.00000000000145e-005

Por supuesto, me preguntaba sólo sela, ¿de dónde salieron los números?

Creo que he escrito la función correctamente como se muestra:

Modificación de SL y TP

Orden de operación para modificar los niveles de StopLoss y/o TakeProfit. Requiere 4 campos:

  • símbolo de
  • acción
  • sl
  • tp
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций - Документация по MQL5
 
mario065: Gracias, no funcionó.

¿Qué es lo que ha "fallado" exactamente?

mario065 : He comprobado si cuenta correctamente para iniciar la llamada a la función, así es como lo he hecho:

Inserte el código correctamente (Ctrl+Alt+M):

  double Bid  = NormalizeDouble(SymbolInfoDouble(Currency,SYMBOL_BID),_Digits);
  double Ask  = NormalizeDouble(SymbolInfoDouble(Currency,SYMBOL_ASK),_Digits);
  double Open = NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),_Digits);
  double SL   = NormalizeDouble(PositionGetDouble(POSITION_SL),_Digits);
  if(Open > 0)
    {
     start_buy = Ask - Open;Print("start_buy=",start_buy);
     start_sel = Open - Bid;Print("start_sel=",start_sel);
    }

En este caso, la normalización debe utilizarse en una secuencia diferente.

1. como los valores de tipo SymbolInfoDouble(Currency,SYMBOL_BID) provienen del servidor, ya se consideran normalizados. Y no es necesario normalizarlos por segunda vez. Es decir, pueden escribirse simplemente:

double Bid  = SymbolInfoDouble(Currency,SYMBOL_BID);

2. Pero después de cualquier operación aritmética la normalización desaparece, así que si necesitas obtener un número normalizado, debes escribirlo así:

start_buy = NormalizeDouble(Ask - Open,_Digits);

Todavía estoy pensando en el resto.

 
mario065: Sorpresa en el registro:

DR 0 Core 1 10:21:49 2012.10.01 01:12:43 start_sel=5.000000000010552e-005
ES 0 Core 1 10:21:49 2012.10.01 01:12:43 start_sel=7.0000000145e-005

Por supuesto, sólo se interesa por el sel - ¿de dónde salen esas cifras?

7,00000000000145e-005 es sólo una forma de escribir el valor de un número real. Creo que se llama "científico". Para más detalles, véase."Guía de referencia MQL5 / Conceptos básicos del lenguaje / Tipos de datos / Tipos reales (double, float)".
 
Yedelkin:
7,00000000000145e-005 es sólo una de las formas de escribir el valor de un número real. Creo que se llama "científico". Para más detalles, véase."Guía de referencia MQL5 / Conceptos básicos del lenguaje / Tipos de datos / Tipos reales (double, float)".

Yedelkin,

Gracias por abordar el problema.

Aquí está el código. Las funciones para abrir la posición fueron escritas por Nikolay Kositsin.

Archivos adjuntos:
MTB_E.mq5  9 kb
 
Por favor, indique cómo y dónde especificar en el EA la MA perteneciente a la ventana nº 2.
Por ejemplo, he añadido una MA a MFI y quiero registrar esta MA en mi EA. No sé dónde y cómo hacerlo.

Gracias por su respuesta)
 
mario065: Aquí está el código. Las funciones para abrir el puesto fueron escritas por Nikolay Kositsin. Nikolay Kositsin.

1. Yo diría lo siguiente: utiliza el código de otra persona con mucho cuidado. Porque el código de otro significa también los errores de otro.

2. Aquí(https://www.mql5.com/ru/forum/6343/page64#comment_357008) te sugerí que intentaras poner a cero correctamente las variables antes de utilizarlas. Pero su código aún no ha implementado esta sugerencia. Además, su código contiene construcciones del tipo

//+------------------------------------------------------------------+
//| Modify position.                                                 |
//+------------------------------------------------------------------+
bool ModifyPosition(const string symbol,double StopLoss,double Takeprofit)
  {
//---- обявяване на структурата и резултата на търговското искане
   MqlTradeRequest request;
   MqlTradeResult result;
//---- структурна инициализация на  търговското искане MqlTradeRequest за модифициране на  позиция
   request.action       = ...
   request.symbol       = ...
   request.sl           = ...
   request.tp           = ...
   ...
//---- модифицираме позицията и  проверяваме резултата от търговското искане
   if(!OrderSend(request,result) || result.deal==0)
     {
      ...
     }
   ZeroMemory(request);
   ZeroMemory(result);
   return(true);
  }

Como ves, en esta construcción las variables request y result se ponen a cero no antes de ser utilizadas sino después de serlo. Además, cuando estas variables locales se ponen a cero, la función deja de funcionar, es decir, dicha puesta a cero no tiene sentido. En otras palabras, esta construcción es un buen ejemplo de cómo las variables MqlTradeRequest y MqlTradeResult no deben ponerse a cero. Por lo tanto, si usted está ansioso, por favor, trate de limpiar las variables correctamente. Si algo va mal, por favor, describa con detalle qué es lo que "no funciona".

3. La Biblioteca Estándar tiene una clase de comercio"MQL5 Reference / Standard Library / Trade Classes / CTrade". Intenta averiguar cómo aplicarlo en la práctica. En la fase inicial de inmersión en el idioma, esta clase puede ser suficiente. Por ejemplo, esta clase tiene el siguiente método:"MQL5 Reference / Standard Library / Trade Classes / 2CTrade/ PositionModify". Se implementa de la siguiente manera:

//+------------------------------------------------------------------+
//| Modify specified opened position                                 |
//+------------------------------------------------------------------+
bool CTrade::PositionModify(const string symbol,const double sl,const double tp)
  {
//--- check stopped
   if(IsStopped(__FUNCTION__)) return(false);
//--- clean
   ClearStructures();
//--- setting request
   m_request.action=TRADE_ACTION_SLTP;
   m_request.symbol=symbol;
   m_request.magic =m_magic;
   m_request.sl    =sl;
   m_request.tp    =tp;
//--- action and return the result
   return(OrderSend(m_request,m_result));
  }

La línea 'ClearStructures();' en ella borra la variable m_request antes de usarla.

Razón de la queja: