Preguntas de los principiantes MQL4 MT4 MetaTrader 4 - página 85

 
deathmond1990:
Hola. La pregunta es: ¿Podemos cargar los valores de los ticks (los precios correspondientes) para un determinado período de negociación (es decir, para una sola vela) en una matriz unidimensional? Y hacerlo de tal manera que la matriz se forme durante la formación de una vela. ¿Es realista en MQL4? Le agradecería sus comentarios.


Es real. Un conjunto dinámico y listo.

//-----------------------+
int k=0;       //на глобальном уровне
double тики[];
//----------------
void OnTick()
  {
   ArrayResize(тики,k+1);
   тики[k]=Bid;
   k++;
  }
//+------------------------
 
Alekseu Fedotov:


De forma realista. Un conjunto dinámico y listo.

Muchas gracias =)
 
¡Saludos señores! No quiero que esto suene a inundación, pero no puedo prescindir de esta función. Así que chicos, ¿alguien puede ayudarme con esta función que recorre todas las órdenes y borra dos órdenes al mismo tiempo, la que tiene el lote más pequeño y beneficio negativo, y la que tiene el lote más grande y beneficio positivo.
 
Arseniy Barudkin:
¡Saludos señores! No quiero que esto suene a inundación, pero no puedo prescindir de esta función. Así que chicos, ¿alguien puede ayudarme con esta función que recorre todas las órdenes y borra dos órdenes al mismo tiempo, la de menor lote y beneficio negativo, y la de mayor lote y beneficio positivo, también de las órdenes existentes.

Intente buscarOrderCloseBy
 

¿Cómo hacer que los datos de todas las variables globales se guarden incluso después de cerrar el terminal en modo normal y anormal?

La pregunta se refiere a las variables declaradas al principio del código de esta manera:

#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern double  VAR1 = 1;

double VAR2[1000];

Necesito no perder los valores de VAR1 y VAR2 (el array se llena de datos durante el funcionamiento del Asesor Experto). Hasta ahora, la única idea es escribir los datos en un archivo (global.txt) en cada tick y luego, cuando se lanza el terminal, leer del archivo (global.txt) y recrear las variables y luego escribirlas de nuevo en cada tick. ¿Qué otras opciones hay?

 
smart_man:

¿Cómo asegurarse de que los datos de todas las variables globales se conservan incluso después de cerrar el terminal cliente en modo normal y anormal?

La pregunta se refiere a las variables declaradas así:

extern double  VAR1 = 1;

double VAR2[1000];

Necesito no perder los valores de VAR1 y VAR2 (el array se llena de datos durante el funcionamiento del Asesor Experto). Hasta ahora, la única idea es escribir los datos en un archivo (global.txt) en cada tick y luego, cuando se lanza el terminal, leer del archivo (global.txt) y recrear las variables y luego escribirlas de nuevo en cada tick. ¿Qué otras opciones hay?

Opción

Variables globales del terminal cliente

//--------

No debe confundirse con las variables declaradas globalmente

 
fxtz:

Pregunta ¿Puedo escribir un programa en Metatrader 4 para abrir de 2 a 250 posiciones de mi elección con un stoploss establecido y un beneficio establecido en un solo clic? No necesito abrir uno manualmente


¿Ha encontrado una empresa de corretaje en la que pueda abrir tantas órdenes para un solo instrumento? Por lo general, 100 órdenes es un límite para todos los instrumentos...

Y sí, podría abrir 100.

 
Alekseu Fedotov:

Intente buscarOrderCloseBy

Gracias. Pero tengo que seleccionar entradas de estas órdenes de al menos 3 órdenes, la mayoría de las veces hay más de 5 a 10 órdenes, ¿realmente tengo que calcular y comparar los lotes y beneficios de estas órdenes por separado?

 
Arseniy Barudkin: Tenemos que seleccionar los teletipos de las órdenes, así que ¿por qué debemos calcular y comparar los lotes y los beneficios de estas órdenes por separado?

La situación es mucho peor de lo que imaginas. Sólo un pedido, seleccionado por OrderSelect(), está disponible en un momento dado. Y cuando se selecciona el primer pedido, ¿con qué debemos compararlo? Los tipos inteligentes realmente hacen algo así

double МинПрофит=1000000, МаксПрофит=-1000000;
int МаксТикет=0, МинТикет=0;
for(int Номер=OrdersTotal-1; Номер>=0; Номер--)
{
   if(!OrderSelect(Номер,SELECT_BY_POS)) continue;
   if(OrderProfit()>МаксПрофит)
   {
      МаксТикет=OrderTicket();
      МаксПрофит=OrderProfit();
   }
   else if(OrderProfit()<МинПрофит)
   {
      МинТикет=OrderTicket();
      МинПрофит=OrderProfit();
   }
 }
Entonces mira el valor de los billetes encontrados: ¡¡¡de repente son cero!!!
 
STARIJ:

La situación es mucho peor de lo que imaginas. Sólo un pedido, seleccionado por OrderSelect(), está disponible en un momento dado. Y cuando se selecciona el primer pedido, ¿con qué debemos compararlo? Los tipos inteligentes realmente hacen algo así

Entonces mira el valor de los billetes encontrados: ¡¡¡de repente son cero!!!

Gracias por la ayuda. Hasta ahora lo he dejado así, ahora he decidido cambiar un poco las condiciones en las que se llama a la función. Y en general, me has ayudado mucho))
void MarginDefuse(double lot1=0,double lot2=0)
{
 int ticket1=0,ticket2=0,type=-1;
 double profit1=0,profit2=0;
 bool res1=false,res2=false;
 // Выделение
 for(int i=0; i<OrdersTotal(); i++)
 {
  if(!OrderSelect(i,SELECT_BY_POS)) continue; // Что-то помешало - идем к следующему
  if(OrderSymbol() != Symbol()) continue;          // Чужой график
  if(OrderType()<2 && OrderMagicNumber() == Magic)
  {
   if(OrderLots()>=lot1 && OrderProfit()<0)
   {
    ticket1=OrderTicket();
    lot1=OrderLots();
    type=OrderType();
    profit1=OrderProfit();
   }
  }
 }
 for(int i=OrdersTotal()-1; i>=0; i--)
 {
  if(!OrderSelect(i,SELECT_BY_POS)) continue; // Что-то помешало - идем к следующему
  if(OrderSymbol() != Symbol()) continue;          // Чужой график
  if(OrderType() != type && OrderType()<2 && OrderMagicNumber() == Magic)
  {
   if(OrderLots() >= lot2/Multipler && OrderProfit()>0 && OrderLots()>lot1)
   {
    ticket2 = OrderTicket();
    lot2 = OrderLots();
    profit2=OrderProfit();
   }
  }
 }
 if((profit1+profit2)>0 && lot1<lot2)
 {
  while (!RefreshRates());
  if(ticket1)
  {
   if(OrderSelect(ticket1,SELECT_BY_TICKET))
   res1=OrderCloseX(ticket1,lot1);
  }
  if(ticket2)
  {
   if(OrderSelect(ticket2,SELECT_BY_TICKET))
   res2=OrderCloseX(ticket2,lot2);
  }
  if(res1 && res2)
   DeletePos();
 }
}
Razón de la queja: