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

 

Ciao compagni!

MT5 ha degli strumenti meravigliosi e molto utili "Pulse Elliott Wave" e "correcting Elliott Wave".

La domanda è: posso integrare questi strumenti da MT5 in MT4?

Faccio trading in MT4 e non è molto conveniente passare a MT5 per l'analisi.

Oppure: quali sono gli altri modi per risolvere il problema?

 
Buon pomeriggio, la lingua ha un parametro di mercato come MarketInfo(Symbol(), MODE_TICKVALUE). Può descrivere in termini generali come viene calcolato questo valore?
 
mql_writer:
Buon pomeriggio, la lingua ha un parametro di mercato come MarketInfo(Symbol(), MODE_TICKVALUE). Puoi descrivere in termini generali come viene calcolato questo valore?

Questo è il valore del cambiamento minimo di prezzo (1 pip) nella valuta di deposito a 1,00 lotto! Il calcolo è molto semplice: 1.00(lotto)/1.36030(quotazione attuale dell'Euro) = 0.7351 in Euro.
 
borilunad:

Questo è il valore del cambiamento minimo di prezzo (1 pip) nella valuta di deposito a 1.00 lotto! Calcolato molto semplicemente: 1.00(lotto)/1.36030(quotazione attuale dell'Euro) = 0.7351 in Euro.

Tranne che una richiesta tramite marketinfo in qualche modo restituisce 10 per tutte le coppie tranne le coppie di yen ))))


Da dove avete preso questa formula?

 
evillive:

tranne che una query attraverso marketinfo in qualche modo restituisce 10 per tutte le coppie tranne le coppie di yen ))))


Da dove avete preso questa formula?


Faccio tutte le formule da solo e ora l'ho preso dal mio grafico.

E questo è di Doki:

MODE_TICKVALUE.

16

Dimensione del cambiamento minimo del prezzo del simbolo nella valuta di deposito

I calcoli non sono condivisi.

 
borilunad:


Faccio tutte le formule da solo e le ho ottenute dal mio grafico.

E questo viene dai Docks:

MODE_TICKVALUE

16

Dimensione della variazione minima del prezzo dello strumento nella valuta di deposito

I calcoli non sono condivisi.


Anche se per 1 lotto di eurodollari 1 pip costa davvero 10 dollari, quindi va bene.

E i calcoli non dovrebbero essere condivisi solo con coloro che si vergognano di mostrarli.

In questo caso la formula dovrebbe essere corretta - MODE_TICKVALUE = MODE_LOTSIZE * MODE_TICKSIZE - per Euro, la formula per i cross e Yen è un po' diversa

 
Top2n:


Ad essere onesti, non ho capito come applicarlo. Manca un millimetro, è un peccato fermarsi quando è quasi finito.

Task, non scrivere il prezzo nell'array se l'oggetto time(2° parametro+3600sec>current)||(1st parameter time - 2nd parameter time)<3600sec )

Perché emulare un errore?

Un errore serve a segnalare che, per qualche motivo legato a limitazioni/fallimenti del sistema, l'algoritmo non è riuscito ad eseguire e ad ottenere un risultato con alcune garanzie (naturalmente limitate, ma - ). La funzione FillAndPrint() mostra eloquentemente cosa significa una situazione di errore e cosa no. Quando si verifica un errore, non prova nemmeno a stampare il risultato. Se non ci sono errori, il risultato può essere affidabile. È così che la logica "errore/nessun errore" dovrebbe essere costruita.

Ma qui dobbiamo modificare l'algoritmo: dobbiamo anche applicare un filtro aggiuntivo.

Quindi deve essere fatto:

/******************************************************************************/
bool AddValueIfFiltered(double &array[], const string name) {
#define MIN_SECS_BETWEEN_PRICE1_AND_PRICE2 3600
#define MAX_SECS_AFTER_PRICE2              3600

  const datetime dt1 = (datetime)ObjectGet(name, OBJPROP_TIME1);
  const datetime dt2 = (datetime)ObjectGet(name, OBJPROP_TIME2);
  const datetime dt = TimeCurrent();

  Print("name = ", name, ", dt = ", dt, ", dt1 = ", dt1, ", dt2 = ", dt2);

  if (dt <= dt2 + MAX_SECS_AFTER_PRICE2 && dt1 + MIN_SECS_BETWEEN_PRICE1_AND_PRICE2 <= dt2) { // Фильтруем, прежде чем попытаться добавить
    if (!AddValue(array, ObjectGetValueByShift(name, 1))) { // Пытаемся добавить
      return false; // Ошибка, значение не добавлено
    }
  }

  return true; // Нет ошибки, значение, если удовлетворило условию фильтра, добавлено к массиву
}

/******************************************************************************/
bool AddValueIfFound(double &array[], const string name) {
  const int type = ObjectType(name);

  if (type == OBJ_TREND) {
    switch ((color)ObjectGet(name, OBJPROP_COLOR)) { // Тип color допустимо использовать в switch
    case Goldenrod:
    case Gainsboro:
    case White:
      if (!AddValueIfFiltered(array, name)) { // Пропускаем через фильтр
        return false;
      }
    }
  }

  return true; // Нет ошибки, значение, если найдено, добавлено к массиву
}

Prima abbiamo "filtrato" per tipi di oggetti e parametri, selezionando solo gli oggetti di cui abbiamo bisogno tra tutti quelli disponibili, e poi applichiamo un ulteriore filtro. È più o meno come lo farebbe una persona. È quello che farebbe un umano, giusto?

Per ognuno di questi piccoli sottocompiti, abbiamo bisogno di una funzione separata.

I numeri non dovrebbero essere nelle espressioni, tranne in casi molto speciali, per esempio, se è necessario raddoppiare, e questo raddoppio è nella natura dell'algoritmo. Allora il numero 2 può essere usato direttamente nelle espressioni. E in altri casi così rari.

In altri casi, si dovrebbe usare la mnemotecnica. In primo luogo, migliorano notevolmente la comprensione di ciò che sta accadendo in un dato luogo, e quindi aiutano a ridurre la probabilità di commettere un errore. E in secondo luogo, il valore stesso è fissato in un posto ed è facile cambiarlo se necessario, e sarà impossibile fare un errore rispetto al caso in cui il numero è usato ripetutamente nell'algoritmo, e senza usare la mnemotecnica bisogna correggere i numeri in diversi punti dell'algoritmo.

Risultato della corsa:

02:08:46 Script 2 EURUSDm,H1: loaded successfully
02:08:46 2 EURUSDm,H1: initialized
02:08:46 2 EURUSDm,H1: Sell:
02:08:46 2 EURUSDm,H1: name = downtrendline1, dt = 2014.06.24 22:09:02, dt1 = 2014.06.24 10:00:00, dt2 = 2014.06.24 17:00:00
02:08:46 2 EURUSDm,H1: Найдено объектов: 0
02:08:46 2 EURUSDm,H1: Buy:
02:08:46 2 EURUSDm,H1: name = uptrendline0, dt = 2014.06.24 22:09:02, dt1 = 2014.06.23 09:00:00, dt2 = 2014.06.24 16:00:00
02:08:46 2 EURUSDm,H1: Найдено объектов: 0
02:08:46 2 EURUSDm,H1: uninit reason 0
02:08:46 Script 2 EURUSDm,H1: removed

Non si trova un solo oggetto. Aumentate i valori di entrambe le mnemoniche 10 volte fino a 36000 (10 ore), ed eseguite di nuovo:

02:09:03 Script 2 EURUSDm,H1: loaded successfully
02:09:03 2 EURUSDm,H1: initialized
02:09:03 2 EURUSDm,H1: Sell:
02:09:03 2 EURUSDm,H1: name = downtrendline1, dt = 2014.06.24 22:09:14, dt1 = 2014.06.24 10:00:00, dt2 = 2014.06.24 17:00:00
02:09:03 2 EURUSDm,H1: Найдено объектов: 0
02:09:03 2 EURUSDm,H1: Buy:
02:09:03 2 EURUSDm,H1: name = uptrendline0, dt = 2014.06.24 22:09:14, dt1 = 2014.06.23 09:00:00, dt2 = 2014.06.24 16:00:00
02:09:03 2 EURUSDm,H1: Найдено объектов: 1
02:09:03 2 EURUSDm,H1: Price[0] = 1.35869
02:09:03 2 EURUSDm,H1: uninit reason 0
02:09:03 Script 2 EURUSDm,H1: removed

Una tendenza ha già "superato" il filtraggio. Ora ripristiniamo il valore del primo mnemonico a 3600 ed eseguiamolo:

02:09:12 Script 2 EURUSDm,H1: loaded successfully
02:09:12 2 EURUSDm,H1: initialized
02:09:12 2 EURUSDm,H1: Sell:
02:09:12 2 EURUSDm,H1: name = downtrendline1, dt = 2014.06.24 22:09:26, dt1 = 2014.06.24 10:00:00, dt2 = 2014.06.24 17:00:00
02:09:12 2 EURUSDm,H1: Найдено объектов: 1
02:09:12 2 EURUSDm,H1: Price[0] = 1.36152
02:09:12 2 EURUSDm,H1: Buy:
02:09:12 2 EURUSDm,H1: name = uptrendline0, dt = 2014.06.24 22:09:26, dt1 = 2014.06.23 09:00:00, dt2 = 2014.06.24 16:00:00
02:09:12 2 EURUSDm,H1: Найдено объектов: 1
02:09:12 2 EURUSDm,H1: Price[0] = 1.35869
02:09:12 2 EURUSDm,H1: uninit reason 0
02:09:12 Script 2 EURUSDm,H1: removed

Possiamo vedere che ora entrambe le linee di tendenza hanno "passato" il filtraggio. A proposito, raccomando di fare il debug di tutti i rami (parti) del programma in questo modo, non solo di un ramo.

Per aiutarvi a formalizzarlo in qualche modo, cercherò di spiegarlo in questo modo. Un programma è apparentemente come un piano.

Ogni voce principale del piano può essere suddivisa in voci di un sottopiano più piccolo. Quelli più piccoli in altri ancora più piccoli. I punti dei sottopiani più piccoli vengono eseguiti direttamente.

Ogni piano, sottopiano e anche i punti dei sottopiani più piccoli corrispondono a funzioni del programma. Gli elementi nei sottopiani più piccoli corrispondono a funzioni "finali" che chiamano solo funzioni di sistema, o addirittura non le chiamano affatto, ad esempio, AddValue() o DiffInSecs() sono esempi nella discussione precedente. Gli elementi del sottopiano sopra corrispondono alle funzioni che chiamano le funzioni che implementano gli elementi del sottopiano sotto. In quelli discussi sopra, questi sono MassTrendNumber(), AddValueIfFound(), AddValueIfFiltered(). Le funzioni di "basso livello" non dovrebbero chiamare funzioni di "alto livello", e le funzioni di "alto livello" fondamentalmente non dovrebbero saltare diversi livelli verso il basso, cioè dovrebbero chiamare solo funzioni fondamentalmente al livello inferiore. Questa regola è molto più severa per "basso livello" che per "alto livello".

Provate a costruire i vostri programmi organizzando le azioni in essi come funzioni (brevi) collegate da questo tipo di struttura ad albero, nel senso di chi chiama chi.

Questo programma ha un albero degenerato: un ramo che si "ramifica" più volte. E si "ramifica" non in due piccoli rami, ma in uno solo. Ma il punto che le funzioni di "alto livello" chiamano costantemente quelle di "basso livello" può essere visto. In questa modifica, ho inserito un ulteriore livello in questa struttura, un altro "ramo non ramificato" - AddValueIfFiltered().

 
Scusa se non ho visto subito il thread.
https://www.mql5.com/ru/forum/152102 Ho una domanda
 
borilunad:

Tutto è corretto! Con una quotazione a 4 cifre era sempre 1, e conuna quotazione a 5 cifre è ora 10, perché ci sono 10 volte più pip (e meno profondi). E il valore di un tick minimo dovrebbe essere calcolato dal prezzo corrente!

Ho 4 cifre ora, su ewardollar a 1 lotto 1 punto costa 10 dollari ed è sempre stato così. Per le croci il costo sarà da 8 a 16, la formula è un po' più complicata.

Per esempio, per l'euro sterlina marketinfo ha restituito 16,984, il tasso di cambio sterlina-dollaro = 1,6984, cioè 1 pip dell'euro sterlina vale 1 sterlina, moltiplicato per il valore del punto sterlina-dollaro, che è sempre 10,0 (100000 * 0,0001 = 10,0 o 100000 * 0,00010 = 10,0 - come si vuole).


Tutti questi calcoli sono corretti solo se il vostro conto è in dollari:

In questo caso, per xUSD (EURUSD, GBPUSD ecc.) tickvalue = lot*point = 100000*0.0001 = 10.0

per USDx (USDCHF, USDJPY ecc.) tickvalue = lot*point/Bid = 100000*0.01/101.93 = 9.8107

per xUSD/yUSD (EURGBP) tickvalue = Bid(yUSD)*lot*point = 1.6980*100000*0.0001 = 16.98

per i cross xUSD/USDy (EURJPY) tickvalue = lot*point/Bid(USDy) = 100000*0.01/101.91=9.8126

 
evillive:

Ho 4 cifre ora, su ewoldollar a 1 lotto 1 punto costa $10 e ha sempre fatto così. Per le croci il costo sarà da 8 a 16, la formula è un po' più complicata.

Per esempio, per la sterlina euro marketinfo ha restituito 16,984, il tasso di cambio di evodollaro = 1,3604, il tasso di cambio sterlina-dollaro = 1,6984, cioè, 1 pip della sterlina euro vale 1 sterlina, moltiplicato per il valore del punto di sterlina-dollaro, che è sempre 10,0 (100000*0,0001 = 10,0 o 100000*0,00010 = 10,0 - come si vuole).




Il mio è semplice e pratico! E all'epoca in cui c'era una citazione a 4 cifre, non avevo ancora scritto programmi, quindi non posso giudicare. :)

Buona notte!