Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 705

 
multiplicator:
per qualche motivo il terminale non mostra errori)

Non puoi farlo da solo?

 
multiplicator:
Per qualche motivo il terminale non mostra errori)

Cosa c'entra il terminale? Devi prendere in considerazione la classificazione del volume nel tuo programma.

Provate a inviare programmaticamente un ordine per aprire una posizione con lotto 0,000001, o 0,12345678, o 100000,1, ecc.

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

Non puoi farlo da solo?

Cosa? Non si vede.
 
Artyom Trishkin:


Prova a inviare un ordine programmato per aprire una posizione con lotto 0,12345678

si apre con il lotto 0,12.

La questione è se normalizzare o non normalizzare.

 
Artem, perché non li dimentichi?
 
Alekseu Fedotov:

Prova questo.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}


Qui è dove non è chiaro:
  if (ls>0) k=1/ls; else k=1/ml;
che differenza fa il passo del lotto più di zero o meno.
 
Алексей Тарабанов:
Artem, perché non li dimentichi?
Vaffanculo.
andare a dormire.
 
multiplicator:

si apre con un lotto di 0,12.

La questione è normalizzare o non normalizzare.

Non ne posso più. Cosa c'entra il lotto con il prezzo a cui ha aperto, paziente?

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

Non ne posso più. Cosa c'entra il lotto con il prezzo a cui l'hai aperto, paziente?

Vecchio, nessuno ti ha chiesto niente, vai a dormire.

Quando leggo i suoi post sul forum, penso "quest'uomo ha un cervello debole".
 
Alekseu Fedotov:

Prova questo.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}

Qui divide per la dimensione del passo di lotto, scarta il resto, poi prende quanti di questi passi di lotto ha ottenuto.

Potrebbe esserci un errore qui.

Per esempio, mettiamo il valore nella funzione: 7 lotti.
Il broker ha un volume di lotto minimo di 5 e un passo di lotto di 2.


Dividerà 7 per l'incremento del lotto e prenderà il numero di parti intere. E moltiplicare di nuovo per l'incremento del lotto. Il risultato sarà di 6 lotti e cercherà di aprire un ordine con questo volume.
Ma l'ordine può essere aperto solo con i volumi 5, 7, 9, ecc.


Sarebbe meglio sottrarre la dimensione minima del lotto (5) dal nostro lotto (7). E con il resto al lavoro.

eseguire tutte le azioni con il resto, che ha una funzione.

Calcola quanti passi interi ci sono, la dimensione del passo del lotto. Poi moltiplicare il numero di passi per la dimensione del passo del lotto. Questo ci dà 2.

Poi questo 2 viene nuovamente aggiunto alla dimensione del lotto minimo (5). il risultato è 5+2=7.


Ma questo è un esempio fantastico.
I broker ora hanno un lotto minimo e incrementi di lotto di 0,01
o lotto minimo e incrementi di lotto di 0,1