Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 705

 
multiplicator:
por alguna razón el terminal no muestra errores)

¿No puedes hacerlo tú mismo?

 
multiplicator:
Por alguna razón el terminal no muestra errores)

¿Qué tiene que ver la terminal con esto? Tienes que tener en cuenta la graduación del volumen en tu programa.

Intente enviar programáticamente una orden para abrir una posición con el lote 0,000001, o 0,12345678, o 100000,1, etc.

 
Алексей Тарабанов:

¿No puedes hacerlo tú mismo?

¿Qué? No se ve.
 
Artyom Trishkin:


Intente enviar una orden programada para abrir una posición con el lote 0.12345678

se abre con el lote 0,12.

La cuestión es normalizar o no normalizar.

 
Artem, ¿por qué no te olvidas de ellos?
 
Alekseu Fedotov:

Prueba con este.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.05.2008                                                     |
//|  Описание : Возвращает нормализованное значение торгуемого лота.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    lo - нормализуемое значение лота.                                       |
//|    ro - способ округления          (   False    - в меньшую,               |
//|                                        True     - в большую сторону)       |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//+----------------------------------------------------------------------------+
double NormalizeLot(double lo, bool ro=False, string sy="") {
  double l, k;
  if (sy=="" || sy=="0") sy=Symbol();
  double ls=MarketInfo(sy, MODE_LOTSTEP);
  double ml=MarketInfo(sy, MODE_MINLOT);
  double mx=MarketInfo(sy, MODE_MAXLOT);

  if (ml==0) ml=0.1;
  if (mx==0) mx=100;

  if (ls>0) k=1/ls; else k=1/ml;
  if (ro) l=MathCeil(lo*k)/k; else l=MathFloor(lo*k)/k;

  if (l<ml) l=ml;
  if (l>mx) l=mx;

  return(l);
}


aquí es donde no está claro:
  if (ls>0) k=1/ls; else k=1/ml;
¿qué diferencia hay entre el paso del lote más que cero o menos?
 
Алексей Тарабанов:
Artem, ¿por qué no te olvidas de ellos?
Vete a la mierda.
ir a dormir.
 
multiplicator:

se abre con un lote de 0,12.

La cuestión es normalizar o no normalizar.

Estoy harto. ¿Qué tiene que ver el lote con el precio al que abrió, paciente?

 
Алексей Тарабанов:

Estoy harto. ¿Qué tiene que ver el lote con el precio al que lo abriste, paciente?

Viejo, nadie te ha preguntado nada. Vete a dormir.

Cuando leo sus mensajes en el foro, pienso "este hombre tiene un cerebro débil".
 
Alekseu Fedotov:

Prueba con este.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.05.2008                                                     |
//|  Описание : Возвращает нормализованное значение торгуемого лота.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    lo - нормализуемое значение лота.                                       |
//|    ro - способ округления          (   False    - в меньшую,               |
//|                                        True     - в большую сторону)       |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//+----------------------------------------------------------------------------+
double NormalizeLot(double lo, bool ro=False, string sy="") {
  double l, k;
  if (sy=="" || sy=="0") sy=Symbol();
  double ls=MarketInfo(sy, MODE_LOTSTEP);
  double ml=MarketInfo(sy, MODE_MINLOT);
  double mx=MarketInfo(sy, MODE_MAXLOT);

  if (ml==0) ml=0.1;
  if (mx==0) mx=100;

  if (ls>0) k=1/ls; else k=1/ml;
  if (ro) l=MathCeil(lo*k)/k; else l=MathFloor(lo*k)/k;

  if (l<ml) l=ml;
  if (l>mx) l=mx;

  return(l);
}

Aquí divide por el tamaño del paso de lote, descarta el resto, y luego toma cuántos de estos pasos de lote obtuvo.

Podría haber un error aquí.

Por ejemplo, ponemos el valor en la función: 7 lotes.
El broker tiene un volumen de lote mínimo de 5 y un paso de lote de 2.


Dividirá 7 por el incremento del lote. Tomará el número de partes enteras. Y multiplicar de nuevo por el incremento del lote. El resultado será de 6 lotes. Y tratará de abrir una orden con este volumen.
Pero la orden sólo puede abrirse con los volúmenes 5, 7, 9, etc.


Sería mejor restar el tamaño mínimo del lote (5) a nuestro lote (7). Y con el resto a trabajar.

realizar todas las acciones con el resto, que tiene una función.

Cuente cuántos pasos enteros hay, el tamaño del paso del lote. A continuación, multiplique el número de pasos por el tamaño de paso del lote. Esto nos da 2.

A continuación, este 2 se suma de nuevo al tamaño del lote mínimo (5). el resultado es 5+2=7.


Pero este es un ejemplo fantástico.
Los corredores tienen ahora un lote mínimo e incrementos de lote de 0,01
o lote mínimo e incrementos de lote de 0,1