Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 739

 
korobok777:
Lot=NormalizeDouble(Balance*0.001,2);
 
Vinin:
Hai scritto qualcosa di sbagliato.

Sì, è un errore di battitura, l'ho corretto. O il principio è sbagliato? Il punto era che se il saldo è diviso per 10 senza un resto, il lotto è preso come il prodotto del lotto iniziale per 1/10 del saldo. Non è vero? Come allora?


Anche se Vadim ha scritto in modo più semplice qui, sì )))

 
evillive:

Sì, è un errore di battitura, l'ho corretto. O il principio è sbagliato? Il punto era che se il saldo viene diviso per 10 senza un resto, il lotto viene preso come il prodotto del lotto iniziale per 1/10 del saldo. Non è vero? Come si fa allora?


Anche se Vadim ha scritto in modo più semplice qui, sì )))

Il saldo è molto raramente diviso per 10 senza un resto. In altri casi (la maggior parte) ci sarebbe un lotto predefinito
 
evillive:
double StartLot=0.01;
if(MathMod(AccountBalance(),10)==0) Lot=StartLot*AccountBalance()/10;

E MarketInfo()?

E MODE_MINLOT, MODE_MAXLOT, MODE_LOTSTEP?

Dovete ancora entrare nella griglia delle cifre consentite dei valori del lotto:

#property strict

/******************************************************************************/
double getLot(double factor = 0.001) {
  double minLot = MarketInfo(Symbol(), MODE_MINLOT);

  if (minLot > 0) { // Проверка значения от функции MetaQuotes на вменяемость
    double maxLot = MarketInfo(Symbol(), MODE_MAXLOT);

    if (maxLot >= minLot) { // Проверка второго значения от функции MetaQuotes на вменяемость
      double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);

      if (lotStep > 0) { // Проверка третьего значения от функции MetaQuotes на вменяемость
        double rawLot = AccountBalance() * factor; // Грубо вычисленное значение лота

        // В процессе "рихтования" грубо вычисленного значения лота подразумевается, что "округление" происходит всегда к меньшему
        if (rawLot >= minLot && rawLot < maxLot + lotStep) { // Если грубо вычисленное значение "влезает" в диапазон разрешённых значений лотов
          int stepNum = int((rawLot - minLot) / lotStep); // Количество step'ов, которое надо "отступить вправо на числовой оси" от минимального значения лота (при преобразовании double -> int как раз и происходит нужный тип округления)

          return minLot + lotStep * stepNum; // Вычисляем значение лота в "разрядной сетке" разрешённых лотов.
        }
      }
    }
  }

  return 0; // Какие-то обстоятельства не позволили выдать значение в "разрядной сетке" разрешённых лотов; для индикации данного события выдаётся специальное значение 0.
}

/******************************************************************************/
void OnStart() {
  Print("AccountBalance() = ", AccountBalance(), ", getLot() = ", getLot());
}

L'ho eseguito e ho ottenuto qualcosa di simile alla verità:

0       20:09:49.699    Script 3 EURUSDm,H1: loaded successfully
0       20:09:49.699    3 EURUSDm,H1: initialized
0       20:09:49.699    3 EURUSDm,H1: AccountBalance() = 152.82, getLot() = 0.15
0       20:09:49.699    3 EURUSDm,H1: uninit reason 0
0       20:09:49.699    Script 3 EURUSDm,H1: removed

Nessun errore, credo.

 
simpleton:

E MarketInfo()?

E MODE_MINLOT, MODE_MAXLOT, MODE_LOTSTEP?

Dovete ancora entrare nella griglia delle cifre consentite dei valori del lotto:

L'ho eseguito e ho ottenuto qualcosa che assomiglia alla verità:

Non mi sembra di aver commesso un errore.

Grazie, mi è già stato spiegato :D

È chiaro che per me stesso scrivo con tutti i controlli, come dovrebbe essere, c'era solo uno schizzo di come portare il lotto al rapporto equilibrio/10, ma l'idea era infelice...

Ma hai molto testo, potrebbe essere più semplice:

  lotstep= MarketInfo(Symbol(),MODE_LOTSTEP);
  lotmax=MarketInfo(Symbol(), MODE_MAXLOT);
  lotmin=MarketInfo(Symbol(), MODE_MINLOT);

lot=lotstep*MathRound(AccountBalance()*0.001/lotstep);
if(lot < lotmin) lot = lotmin;
if(lot > lotmax) lot = lotmax;
 
simpleton:

E MarketInfo()?

E MODE_MINLOT, MODE_MAXLOT, MODE_LOTSTEP?

Dovete ancora entrare nella griglia delle cifre consentite dei valori del lotto:

L'ho eseguito e ho ottenuto qualcosa di simile alla verità:

Non sembra esserci alcun errore.

perché, quando un programmatore naturale intraprende un lavoro, una sola linea necessaria per raggiungere l'obiettivo si trasforma in un elenco lungo mezzo chilometro?

double Lot = NormalizeDouble(AccountBalance()/1000,2);
if(Lot<Min_Lot)Lot=Min_Lot;
 
_new-rena:

Perché quando un programmatore naturale intraprende un lavoro, una linea di codice necessaria per raggiungere l'obiettivo si trasforma in un elenco lungo mezzo chilometro?

Alcune persone hanno un passo molto non 0,01 ma, per esempio, 0,03 o anche 0,1. E come allora? I controlli sono necessari per tutti i casi, il cielo sa che non ci vuole molto tempo.
 
evillive:
Alcune persone non hanno un passo di 0,01 ma, per esempio, 0,03. Come allora? I controlli sono necessari per tutti i casi, meno male che non ci vuole molto tempo.
Impostate (sotto) nell'inite e non dovrete più disturbare il server e il computer
double Min_Lot=MarketInfo(Symbol(), MODE_MINLOT);
 
Sto parlando del campo, non del lotto minimo, ma va bene, lascia perdere.
 
_new-rena:

Perché quando un programmatore naturale intraprende un lavoro, una linea di codice necessaria per raggiungere l'obiettivo si trasforma in un elenco lungo mezzo chilometro?

Perché ogni sorta di merda ti aspetta ad ogni angolo, e devi proteggerti. Se non ti proteggi, ci sarà una qualità molto bassa, che potrebbe finire per costarti un sacco di soldi a lungo termine. Il 90% degli sforzi viene speso per difendersi dal diavolo e solo il 10% per risolvere il problema. Nel caso di MT4 e MQL4++ il rapporto è ancora più asimmetrico.

La merda inizia mentre si legge la documentazione:

Возвращаемое значение

Информация о финансовом инструменте. Часть информации о текущем финансовом инструменте хранится в предопределенных переменных.

Tutto. È obbligato a restituire le informazioni sullo strumento finanziario, e nient'altro. Non ci sono altri risultati. Otteniamo informazioni sullo strumento:

#property strict

/******************************************************************************/
void OnStart() {
  Print("MarketInfo(\"Фигня\", MODE_MINLOT) = ", MarketInfo("Фигня", MODE_MINLOT));
  Print("MarketInfo(\"Фигня\", MODE_MAXLOT) = ", MarketInfo("Фигня", MODE_MAXLOT));
  Print("MarketInfo(\"Фигня\", MODE_LOTSTEP) = ", MarketInfo("Фигня", MODE_LOTSTEP));
}

Vediamo quali sono i parametri del lotto per questo strumento:

0       21:12:18.980    Script 3 EURUSDm,H1: loaded successfully
0       21:12:18.980    3 EURUSDm,H1: initialized
0       21:12:18.980    3 EURUSDm,H1: MarketInfo("Фигня", MODE_MINLOT) = 0.0
0       21:12:18.980    3 EURUSDm,H1: MarketInfo("Фигня", MODE_MAXLOT) = 0.0
0       21:12:18.980    3 EURUSDm,H1: MarketInfo("Фигня", MODE_LOTSTEP) = 0.0
0       21:12:18.980    3 EURUSDm,H1: uninit reason 0
0       21:12:18.980    Script 3 EURUSDm,H1: removed

Parametri interessanti. Non so perché la documentazione non descrive il comportamento di questa funzione in caso di errori. Dovremo usare caratteristiche non documentate che abbiamo scoperto osservando il comportamento di questa funzione.

Così, la funzione MarketInfo() può restituire 0 per questi parametri richiesti i cui valori devono essere diversi da 0 per natura, che è una situazione di errore non documentata. Il codice deve controllare se si è verificato un errore durante la richiesta di ciascuno dei parametri. Solo per questo motivo, nel codice sono previsti 3 controlli.

Il prossimo. Ovviamente, la dimensione del lotto calcolata potrebbe non rientrare nella gamma di dimensioni del lotto consentite. Non controlliamo? O dovremmo programmare esplicitamente questa situazione e poi programmare la reazione ad essa nel codice di livello superiore, invece di "come succede"? Un esempio di come appare quando non tutto è programmato, e funziona come succede da solo, potrebbe essere un'altra fresca release di MT4, quando qualcosa si è spostato da qualche parte, da qualche parte ha miracolosamente glitchato, e da qualche parte ha smesso di funzionare del tutto. Forse questo non è il risultato desiderato?

Il codice è espanso e commentato in modo che si possa vedere il processo di pensiero e il modello di calcolo utilizzato. Dal momento che il modello di lotto impostato da MetaQuotes è implementato sotto forma di una "griglia di valori degli ordini spread" definita dai parametri MINLOT, MAXLOT e LOTSTEP, sarebbe più ragionevole calcolare il valore esatto del lotto in questi termini. Ecco perché il modello di calcolo è scritto in questi termini.

Non vedo nessun "mezzo chilometro" o altro. L'unica cosa è che il codice viene eseguito nello stile di raggiungere le massime prestazioni quando le funzioni vengono chiamate una sola volta e i valori risultanti vengono memorizzati in variabili, e ogni chiamata viene eseguita solo dopo un altro controllo quando risulta che il valore restituito non è un indicatore di errore e ha ancora senso continuare il calcolo. Una volta che diventa chiaro che si è verificato un errore, le risorse computazionali non vengono più sprecate in chiamate inutili.

Per rendere il codice più compatto, potremmo ottenere tutti e 3 i valori in una volta sola e controllare tutte e 3 le condizioni in un solo if. Ma in caso di errore sulla prima chiamata, le altre 2 chiamate sarebbero uno spreco di risorse computazionali.

Si noti che quando si programma un'espressione che usa la divisione per lotStep, abbiamo volutamente prestato attenzione al fatto che viene usata sotto gli if, che controllano solo che il valore di lotStep sia diverso da 0, cioè la divisione per 0 non può avvenire. In linea di principio, il codice può ancora essere migliorato dichiarando tutte le variabili come "double" e "int" e "const double" e "const int", proteggendosi da se stesso durante ulteriori possibili modifiche del codice. In particolare, se sotto il codice if, che ha appena controllato se il valore della variabile lotStep è diverso da 0, accidentalmente in qualche codice appena aggiunto in questo posto assegna erroneamente il valore 0 a questa variabile, allora un'ulteriore divisione per 0 si verificherà nell'espressione. Se la variabile è dichiarata come "const double", allora spero che il compilatore segnalerà immediatamente un tentativo non autorizzato di modificare la variabile lotStep, evitando così di fare un tale errore.

Quindi i "mezzi chilometri" sono dovuti a condizioni oggettive gravi, non al capriccio di qualcuno.

Come si chiama il ramo? Beh, se hai intenzione di aiutare, fallo bene, in modo che tu possa davvero imparare qualcosa.