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

 
the size of local variables is too large (more than 512 kb)

¿Qué significa este error de compilación y cómo puedo solucionarlo? Tengo una clase con unas 80.000 líneas. ¿Tengo que hacer dos clases? Esto es una tontería. ¿Qué sentido tiene esta versión de 64 bits si todo está limitado de tal manera?
 
Juer:
¿Cómo se puede saber la causa de la larga compilación (más de 10 minutos)? El archivo ex5 resultante pesa unos 12mb, no tanto. ¿Cómo puedo diagnosticar y solucionar los motivos que provocan una compilación tan larga?

https://www.mql5.com/ru/forum/165399#comment_3968004

Optimizar=0

Creo que lo tengo resuelto.

Время компиляции
Время компиляции
  • 2017.01.02
  • www.mql5.com
Всем привет! Код компилируется очень долго (около минуты). Строк кода - около 4000. От чего зависит время и как можно ускорить...
 
Al modificar un pedido, el pedido al que se refiere OrderGetDouble debe especificarse antes de point=
 
Ivan Ivanov:
Al modificar una orden, debemos especificar la orden, a la que OrderGetDouble hace referencia, antes de point=

Gracias Iván, lo estoy probando pero no me funciona.

No entiendo la lógica en sí, cómo seleccionar una orden para su modificación por tipo y no por ticket y luego consultar sus propiedades.

Porque la propia modificación de la orden tiene el ticket como campo obligatorio y no hay ningún tipo de orden.

m_trade.OrderModify(ticket,Bid-(SHAG_s*_Point),Ask+((SLL_s-SHAG_s) *_Point),Ask-((TPP_s+SHAG_s)*_Point),0,0,0);

En mi caso, hay dos órdenes abiertas: Buy_Stop y Sell_Stop. La secuencia de su apertura puede ser cualquiera.

El número de billete no me sirve de nada.

En la condición de comprobación, puedo averiguar si Sell_Stop (por ejemplo) está entre las órdenes abiertas.

Pero no encuentro cómo debo dirigir a esta orden particular Sell_Stop, para que cuando se llame aOrderModify

para modificar exactamente Sell_Stop, y no algo que por casualidad estaba bajo el ticket.

Tengo la sensación de que la sintaxis del lenguaje me hace recorrer todos los pedidos del ticket, sólo para rellenar el campo del ticket enOrderModify.

Aquí es donde me confundí con la modificación de la orden. He perdido la lógica del proceso.

 

¿Existe una función para adjuntar a un gráfico de EA? Como ChartIndicatorAdd().

¿O cómo puedo adjuntar programáticamente un EA a un gráfico determinado, si no hay una plantilla?

 

¿Cómo se traduce a mql5?

OP_LOTS = (((AccountBalance() * _LosPercent) / 100) / MarketInfo(Symbol(), MODE_TICKVALUE)) / (pp);
        OP_LOTS = MathRound(OP_LOTS / MarketInfo(Symbol(), MODE_LOTSTEP)) * MarketInfo(Symbol(), MODE_LOTSTEP);
        OP_LOTS = MathMax(OP_LOTS, MarketInfo(Symbol(), MODE_MINLOT));
        OP_LOTS = MathMin(OP_LOTS, MarketInfo(Symbol(), MODE_MAXLOT));
 
Sprut112:

¿Cómo se traduce a mql5?

double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT);
double lotMax = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
double lotMin = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
double lotStep = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
int digits = (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS);
Funciona en ambas versiones.
 

Por favor, avisa.

Hay un ejemplo en la ayuda: Algoritmo general de trabajo con órdenes.

  {
//--- получим общее количество ордеров
   int orders=OrdersTotal();
//--- пробежим по списку ордеров
   for(int i=0;i<orders;i++)
   {
   ResetLastError();
//--- скопируем в кэш ордер по его номеру в списке
   ulong ticket=OrderGetTicket(i);
   if(ticket!=0)// если ордер успешно скопирован в кэш, работаем с ним
   {
   double price_open   =OrderGetDouble(ORDER_PRICE_OPEN);
   datetime time_setup =OrderGetInteger(ORDER_TIME_SETUP);
   string symbol       =OrderGetString(ORDER_SYMBOL);
   long magic_number   =OrderGetInteger(ORDER_MAGIC);
   if(magic_number    ==m_magic)
   {
//  обработаем ордер с заданным ORDER_MAGIC
   }
   PrintFormat("Ордер #%d по %s был выставлен %s, ORDER_MAGIC=%d",ticket,symbol,TimeToString(time_setup),magic_number);
   }
   else  // вызов OrderGetTicket() завершился неудачно
   {
   PrintFormat("Ошибка при получении ордера из списка в кэш. Код ошибки: %d",GetLastError());
   }
   }
  }

En la compilación recibo una advertencia sobre el tipodatetime, aparentemente, hay un conflicto de conversión de tipos.

No entiendo cuál es el problema; según la Ayuda,ORDER_TIME_SETUP es de tipodatetime.

¿Cuál es el problema y cómo solucionarlo?

 
vladzeit:

Por favor, avisa.

Hay un ejemplo en la ayuda: Algoritmo general de trabajo con órdenes.

Al compilar recibo una advertencia sobre el tipodatetime, aparentemente, hay un conflicto de conversión de tipos.

No entiendo cuál es el problema; según la Ayuda,ORDER_TIME_SETUP es de tipodatetime.

¿Cuál es el problema y cómo solucionarlo?

datetime time_setup =(datetime)OrderGetInteger(ORDER_TIME_SETUP);
//....
long magic_number   =(long)OrderGetInteger(ORDER_MAGIC);

OrderGetInteger debe ser convertido al tipo correcto, al igual que INT

 
Konstantin Nikitin:

OrderGetInteger necesita ser convertido al tipo correcto, al igual que INT

Gracias por el ejemplo.

Por favor, aclare... si he entendido bien.

con this=(datetime)OrderGetInteger. estamos diciendo a OrderGetInteger que adopte el tipo explícitodatetime.?

¿Esta regla se aplica a todas las funciones que no tienen un tipo explícito o no coinciden con el tipo de la variable que se asigna? ¿O es sólo un caso especial?

Quiero entender si esto es una regla o sólo hay que recordarlo como un caso especial.