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

 
Ihor Herasko:

Escribe al menos un bloque y muéstralo. El siguiente paso es sugerirlo aquí.

Sobre los arrays: aquí he declarado 4 arrays a nivel global:

// массивы, в которых будут храниться характеристики ордеров:
int _OrderTicket[],_OrderType[];
double _OrderOpenPrice[];
datetime _OrderOpenTime[];

Luego los puse a cero en la función de apertura de posiciones:

   // обнуляем массивы
   ArrayInitialize(_OrderTicket,0);
   ArrayInitialize(_OrderType,0);
   ArrayInitialize(_OrderOpenPrice,0);
   ArrayInitialize(_OrderOpenTime,0);

¿Cómo los lleno ahora? En el ejemplo con el que intento hacerlo, se aplica una variable adicional, pero no entiendo cómo utilizarla:

// переменная, которая будет хранить количество ордеров, 
// принадлежащих эксперту:
int _ExpertOrdersTotal=0;

Aunque no me queda muy claro por qué todas estas matrices, cuando puedo obtener los valores del ticket, tipo de posición, precio de apertura y tiempo de apertura con la función correspondiente.

 
novichok2018:

Sobre los arrays: aquí he declarado 4 arrays a nivel global:

Luego los puse a cero en la función de apertura de posiciones:

¿Cómo los lleno ahora? El ejemplo que intento utilizar aplica una variable adicional, pero no entiendo cómo utilizarla:

Aunque no me queda muy claro por qué todas estas matrices, cuando puedo obtener los valores del ticket, tipo de posición, precio de apertura y tiempo de apertura con la función correspondiente.

Pruebe a escribir desde cero, emitiendo todos los datos intermedios mediante Alert(. Por ejemplo

int ord=OrdersTotal();
if ! ord )
{
   Alert("Ордера отсутствуют. Выход");
   return;
} else   Alert("Всего ордеров = ", ord);

// Посмотрев, что получилось, добавляете:
int n;
int Ords[10];
for(n=0; n<ord && n<10; n++)
{
   OrderSelect(...
}

Y si tomas el ejemplo de alguien, tómalo completamente y estúdialo. A saber para qué utiliza el autor del ejemplo las matrices

 
novichok2018:

Sobre los arrays: aquí he declarado 4 arrays a nivel global:

Utiliza una matriz de estructuras. Será mucho más fácil acceder a él. Aquí hay una variante con una matriz estática. Es más fácil de entender. Pero yo también uso matrices dinámicas. Pero el código será un poco más grande con ellos.

#define MAX_ORDERS_CNT   int(500)
struct OrderInfo
{
   int      nTicket;
   int      nType;
   double   fOpenPrice;
   double   fSL;
   double   fTP;
   datetime dtOpenTime;
};

OrderInfo  arrstOrderInfo[MAX_ORDERS_CNT];

Luego los puse a cero en la función de apertura de posiciones:

No, no lo has hecho. Porque se declaran arrays dinámicos que tienen tamaño cero por defecto. Así que en este caso estas cuatro líneas de código no hacen nada.

Ahora, ¿cómo se rellenan? El ejemplo que intento utilizar tiene una variable adicional, pero no entiendo cómo utilizarla:

A continuación, se organiza un bucle de órdenes, en el que cada orden "propia" se almacena en una matriz:

g_nOrderCnt = 0;
for (int i = OrdersTotal() - 1; i >= 0; --i)
{
   if (!OrderSelect(i, SELECT_BY_POS))
      continue;

   if (OrderSymbol() != Symbol())   // Если нужны ордера только по текущему символу, к графику которого прикреплен советник
      continue;

   if (OrderMagicNumber != i_nMagicNumber)  // Если имеется входной параметр советника i_nMagicNumber, в котором указан ID ордеров советника
      continue;

   if (g_nOrderCnt < MAX_ORDERS_CNT)
      continue;

   g_arrstOrderInfo[g_nOrdersCnt].nTicket = OrderTicket();
   g_arrstOrderInfo[g_nOrdersCnt].nType = OrderType();
   g_arrstOrderInfo[g_nOrdersCnt].fOpenPrice = OrderOpenPrice();
   g_arrstOrderInfo[g_nOrdersCnt].fSL = OrderStopLoss();
   g_arrstOrderInfo[g_nOrdersCnt].fTP = OrderTakeProfit();

   ++g_nOrdersCnt;
}

Aunque no sé muy bien para qué sirven todas esas matrices, cuando puedo obtener los valores del ticket, el tipo de posición, el precio de apertura y la hora de apertura utilizando la función correspondiente.

Es mucho más rápido y conveniente trabajar con matrices, ya que en general, no todas las órdenes presentes en la cuenta necesitan ser procesadas por este EA en particular. Y así ahorraremos muchos esfuerzos y dinero.

Además, lo que he mencionado anteriormente es un caso general. El universalismo no siempre es necesario, por supuesto. Normalmente, estas matrices se crean en función de los requisitos de una estrategia. Por ejemplo, podemos dividir los pedidos por tipo a la vez: Compra, Venta, BuyStop, SellStop, BuyLimit, SellLimit. Entonces necesitaremos cuatro matrices de este tipo. Pero entonces no tendremos que volver a revisar toda la lista de órdenes abiertas cuando tomemos decisiones comerciales. Sólo necesitamos saber el número de pedidos de un determinado tipo y referirnos a la matriz necesaria.

Hay una cosa más importante a tener en cuenta: el cambio del conjunto de órdenes durante el procesamiento de un tick. Puede ocurrir que se reciba una lista de órdenes a la entrada de OnTick, y otra en algún punto intermedio. Esto conducirá a un error en el funcionamiento del programa que es difícil de detectar. Y la matriz de órdenes que ya estaba formada al entrar en OnTick no cambiará (a menos que, por supuesto, la cambie usted mismo durante la ejecución del programa).

 
STARIJ:

string s=FileReadString(F1); // Leer la cadena del archivo de texto
StringSplit(s, "," , a); // Elementos de cadena separados por comas en una matriz
datetime T1=StrToTime(a[4]); // Además, la transformación ...
int ord=StrToInteger(a[8]);
double Precio=StrToDouble(a[12]);

Gracias, justo lo que quería.



A continuación, hay 5 productos fabricados

Lanzamos una lectura de alerta (cualquiera)

por ejemplo el nivel "200"

Cuando salta la alerta, algo abre la pose, algo se borra, algo hace otras cosas. Quiero implementar un mecanismo para dar una señal de esta manera


P.D.

He terminado lo que quería, puedo enviarlo para su revisión. Se derrama perfectamente. Pero está prohibido publicar aquí.

 
Ihor Herasko:

Por ejemplo, es posible dividir los pedidos por tipo a la vez: Compra, Venta, BuyStop, SellStop, BuyLimit, SellLimit. Entonces necesitaremos cuatro matrices de este tipo. Pero entonces no tendremos que volver a revisar toda la lista de órdenes abiertas cuando tomemos decisiones comerciales. Sólo necesitamos saber el número de pedidos de un determinado tipo y referirnos a la matriz necesaria.

Eso es exactamente lo que necesito, o mejor dicho, sólo para laCompra y Venta. Lo principal para mi estrategia simple es no dejar que las posiciones abiertas interfieran entre sí para ver las condiciones de cierre. ¿Quizá podamos prescindir de las matrices? No los entiendo: cómo crearlos, cómo abordarlos... estoy a oscuras. Tal vez mi situación te resulte más clara en la captura de pantalla:

Parece que todo en el código es simple y funciona claramente, pero este es el único caso de incomprensión.

 
novichok2018:

Esto es exactamente lo que necesito, o mejor dicho, sólo para laCompra y Venta. Para mi sencilla estrategia, lo más importante es que las posiciones abiertas no interfieran con las condiciones de cierre de las demás. ¿Tal vez podamos prescindir de las matrices? No los entiendo: cómo crearlos, cómo abordarlos... estoy a oscuras. Tal vez mi situación te resulte más clara en la captura de pantalla:

Parece que todo en el código es simple y funciona claramente, pero este es el único caso de incomprensión.

Por supuesto, en lo más simple (y de mediana complejidad) es más conveniente sin arrays. Y cuando se llega al punto de usar cientos de órdenes, es mucho más fácil distinguir entre las órdenes. Por ejemplo, según OrderType() - uno para comprar 0, el otro para vender 1. La estrategia de su operador es buena: puede ganar 1 día o perder la mitad de un día. Lo único que necesitamos es cómo atrapar estas flechas. Y son demasiado frecuentes. Tiene sentido aprender primero a dar señales: de compra y de venta
 
LRA:
Por supuesto, en el más simple (y de mediana complejidad) sin matrices es más conveniente. Pero cuando se llega al punto de usar cientos de órdenes...

Podría ser la razón de mi situación que el registro escribe: 2018.01.25 20:22:12 2018_WPR14_AMarkets EURUSD,M5: OrderClose error 138 y repite sólidamente a

2018.01.26 16:38:12 2018_WPR14_AMarkets EURUSD,M5: Alerta: Total de órdenes = 3 ? En la captura de pantalla se puede ver que este período captura dos condiciones de cierre de la VENTA.

Y las señales para abrir una posición son activadas por una combinación de varios indicadores y cerradas por un indicador. Y no funcionan tan a menudo: puede estar en silencio durante unos días durante cinco minutos. Por ejemplo, desde el 1 de febrero de este año sólo se activaron 14 puestos.


 
novichok2018:

Podría ser la razón de mi situación que el registro escribe: 2018.01.25 20:22:12 2018_WPR14_AMarkets EURUSD,M5: OrderClose error 138 y repite sólidamente a

2018.01.26 16:38:12 2018_WPR14_AMarkets EURUSD,M5: Alerta: Total de órdenes = 3 ? En la captura de pantalla se puede ver que este periodo capta dos condiciones cercanas

¿Cuál es su situación? ¿Está diciendo que el terminal está haciendo una entrada de registro que está causando el error? ¿Y qué significa 138? ¿Sabes dónde buscar? Lo que se ve en la captura de pantalla es la mitad de la batalla. ¿Cómo explicar esto al Asesor Experto? Tienes que escribir alguna condición matemática - en lugar de ver la pantalla, el Asesor Experto opera con números

 
LRA:

¿Estás diciendo que el terminal hace una entrada en el registro, lo que causa el error? ... ¿Qué significa 138? ¿Sabes dónde buscar?

No, estoy diciendo que el probador falla en este intervalo de la historia, lo que impide que las señales funcionen correctamente. Porque las recotizaciones no pueden durar 24 horas.

 
novichok2018:

No, lo que quiero decir es que hay un fallo en el comprobador en este punto de la historia, que impide que las señales funcionen correctamente. Porque las recotizaciones no pueden durar 24 horas.

¿Requotes en el probador? Es la primera vez que lo oigo. El probador es el ideal - ni siquiera tiene deslizamiento

...algo está pateando el indicador, con tendencia al alza. Voy a comprar ... Lo tengo... Aunque no es suficiente quería subir el TP - ya funcionaba...

Así que configure un EA que si hace eso, entonces saldrá, y continuará en el siguiente tick. Y pruébalo en la demo

Razón de la queja: