[ARCHIVIO]Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non posso andare da nessuna parte senza di te - 5. - pagina 304

 
Chiripaha:

: )))))))) Sì, proprio così. Tutti i rimproveri accettati! - Per questo mi scuso ancora. - Sono tutte le conseguenze di un forte sviluppo (con esercizi speciali)

lato creativo, immaginativo, poetico, ecc... ma, allo stesso modo, ci sono due emisferi in un essere umano: creativo e razionale. La mia colpa è di averlo visto e di non averlo corretto.

Quindi, tutte le vostre affermazioni sono pertinenti e io sono colpevole.

Ma solo la questione rimane irrisolta...

Come risolverlo alla fine?

Se pensate che io non abbia sentito qualcosa, per favore chiarite. Capisco la tecnica del feedback (per poter "sentire"), ma non ho ancora visto una soluzione.

Come ottenere il numero giusto senza arrotondare in Double, fino al terzo posto decimale, per esempio nel valore di Ask = 1,20667?- Una soluzione come "StrToDouble(DoubleToStr(Ask,3)) = 1,2100 // 1,2100 è il risultato (cioè l'arrotondamento)" non ha funzionato.

Vi ringrazio in anticipo per la vostra tolleranza e comprensione.

DoubleToStr(Ask,3) !!! - Era qualcosa da vedere.

E la soluzione è nel file (è uno script di prova).

File:
test_ind.mq4  2 kb
 
alsu:

Ho guardato il tuo codice.... Sei troppo confuso))))

Non capisco bene, perché abbiamo bisogno di accumulare ticks, perché è sufficiente memorizzare in memoria (o anche non memorizzare, perché la barra corrente deve essere scritta in HST - altrimenti il grafico non sarà aggiornato) i parametri della barra corrente - sei numeri TOHLCV, e aggiornarli come necessario al ricevimento dei tick, e per rendere le barre cutoff da una data condizione (TimeCurrent()-O>1).

Provate a rielaborare il codice in questo modo, sarà ridotto di 8 volte, ve lo garantisco (ho controllato:)


Come questo? Rielaborato l'algoritmo, rimosso l'accumulatore, convertito in Expert Advisor, aggiunto la gradazione dei tick in bearish-bullish, aggiunto le code delle candele usando un algoritmo diverso, commentato tutto. Non ho niente con cui controllare, non ci sono zecche nel fine settimana. Per quanto riguarda il volume - mi sembra, era in FileFlush, funziona con il buffer. Per il futuro mi rifiuto di mettere qualcosa tra FileSeek e FileFlush...
File:
elz.jp.mq4  23 kb
 
IgRU4ek:

DoubleToStr(Ask,3) !!! - questo avrebbe dovuto essere visto.

E la soluzione è nel file (è uno script di prova).


Grazie mille.

Ancora non capisco il meccanismo - perché la mia versione non ha funzionato e perché "DoubleToStr(Ask,3) != DoubleToStr(Ask,Digits)" - A quanto pare, non tutte le caratteristiche delle funzioni sono rivelate nel libro di riferimento.

La tua funzione è stata analizzata - ho capito il modo in cui è stata risolta. Ma ero sicuro che ci deve essere un modo "più semplice" per risolverlo, perché l'insieme delle funzioni in un linguaggio di programmazione è progettato per risolvere problemi tipici con esse, piuttosto che creare queste funzioni tipiche per ogni utente stesso. Ho ingenuamente supposto che DoubleToStr() risolva proprio questo problema. - Non capisco allora il senso del suo utilizzo (quali sono le sue sfumature). Sono un utente comune, non un programmatore, per "scendere a questi dettagli". Quando usare i prodotti di creazione in questo caso, se tutto il tempo sarà speso nella programmazione dettagliata.

Grazie ancora. Ora cercherò di mettere tutto nel codice. Speriamo che tutto funzioni.

 
Chiripaha:

Grazie mille.

Ancora non capisco il meccanismo - perché la mia versione non ha funzionato e perché "DoubleToStr(Ask,3) != DoubleToStr(Ask,Digits)" - A quanto pare, non tutte le caratteristiche delle funzioni sono rivelate nel libro di riferimento.

La tua funzione è stata analizzata - ho capito il modo in cui è stata risolta. Ma ero sicuro che ci deve essere un modo "più semplice" per risolverlo, perché l'insieme delle funzioni in un linguaggio di programmazione è progettato per risolvere problemi tipici con esse, piuttosto che creare queste funzioni tipiche per ogni utente stesso. Ho ingenuamente supposto che DoubleToStr() risolva esattamente questo problema. - Non capisco allora il senso del suo utilizzo (quali sono le sue sfumature). Sono un utente comune, non un programmatore, per "scendere a questi dettagli". Quando usare i prodotti di creazione in questo caso, se tutto il tempo sarà speso nella programmazione dettagliata.

Grazie ancora. Ora cercherò di mettere tutto nel codice. Speriamo che tutto funzioni.

DoubleToStr() esegue una conversione con un numero in due passi: prima arrotonda (secondo le regole della matematica) il numero al segno giusto e poi lo converte in una stringa.
 

Prova per il tuo caso

doppio x = MathFloor(y*1000)/1000;

 
IgRU4ek:
DoubleToStr() esegue la conversione in un numero in due passi: prima arrotonda (con regole matematiche) il numero al segno giusto e poi lo converte in una stringa.


Grazie per il chiarimento. Non lo sapevo, naturalmente, e stavo dando la colpa a StrToDouble() in questo caso. Ma dopo il tuo chiarimento ora presumo che siano entrambi arrotondamenti :(

Perché l'arrotondamento non è chiaro. Se fosse necessario l'arrotondamento, sarebbe meglio in questo caso, in primo luogo, usare qualche funzione di arrotondamento (come richiesto) - la stessa normalizzazione. Allora ci sarebbero entrambe le possibilità con arrotondamento e senza. Altrimenti, avremmo un disordine inutile. Inoltre, non capisco perché si arrotonda quando ho solo bisogno di rendere un numero esistente di tipo diverso. Ce l'ho già (un numero), perché dovrei inventarlo in più.

 
Roger:

Prova per il tuo caso

doppio x = MathFloor(y*1000)/1000;


Esattamente! Una bella soluzione. L'ho già visto, ma mi è sfuggito qualcosa nel mio caso. Grazie mille anche a te, Alexander! - Ora avrò 2 soluzioni! : )) (Per il cartone animato "Prostokvashino")
 

Una domanda così teorica. Il prezzo di chiusura, in termini di tick, è un bid o ask dell'ultimo tick della candela? Ho notato che se l'offerta è scritta in Close[0], allora la quotazione sul corridore è la stessa del verbale.

Ci ho pensato... Offrire l'idea...

 
Zhunko:
Un sacco di errori. Forse dovresti guardare un esempio e farlo per analogia?


Fondamentalmente la stessa cosa. La mia comprensione, anche se non c'è niente di tutto ciò nel tutorial, è che l'inclusione è necessaria solo come collegamento tra l'Expert Advisor e la libreria.

La funzione è importata nell'inline, e le funzioni da importare sono dichiarate. Mettete un segno . tra le dichiarazioni;

Qui ho scritto un inlude e una libreria (con una sola funzione, ma è solo per un test).

L'inclusione è qui:

//+------------------------------------------------------------------+
//|                                       HozIncludeToScalper_M1.mqh |
//|                                                              hoz |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""

#import "Scalper_M1_lbr.ex4"

//+-------------------------------------------------------------------------------------+
//| Получаем машку с заданными параметрами                                              |
//+-------------------------------------------------------------------------------------+
double GetMA(int typeOfMA);

// Очередная функция

// Очередная функция

// Очередная функция

#import

Quando tutte le funzioni necessarie (usate da specifici gufi) sono dichiarate, mettete#import alla fine

Ecco la biblioteca stessa:

//+-------------------------------------------------------------------------------------+
//|                                                                  Scalper_M1_lbr.mq4 |
//|                                                                                 hoz |
//|                                                                                     |
//+-------------------------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""
#property library

//+-------------------------------------------------------------------------------------+
//| Получаем машку с заданными параметрами                                              |
//+-------------------------------------------------------------------------------------+
double GetMA(int typeOfMA)
{
   switch (typeOfMA)
   {
      case 1:      return (iMA(NULL, i_fastMATF, i_fastMAPeriod, i_fastMAShift, i_fastMAMethod, i_fastMAApplied, i_fastMAIndex));
      case 2:      return (iMA(NULL, i_slowMATF, i_slowMAPeriod, i_slowMAShift, i_slowMAMethod, i_slowMAApplied, i_slowMAIndex));
      case 3:      return (iMA(NULL, i_filtrMATF, i_filtrMAPeriod, i_filtrMAShift, i_filtrMAMethod, i_filtrMAApplied, i_filtrMAIndex));
   }
}

Non si compila nemmeno.

'i_fastMATF' - variable not defined     E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 38)
'i_fastMAPeriod' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 50)
'i_fastMAShift' - variable not defined  E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 66)
'i_fastMAMethod' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 81)
'i_fastMAApplied' - variable not defined        E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 97)
'i_fastMAIndex' - variable not defined  E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 114)
'i_slowMATF' - variable not defined     E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 38)
'i_slowMAPeriod' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 50)
'i_slowMAShift' - variable not defined  E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 66)
'i_slowMAMethod' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 81)
'i_slowMAApplied' - variable not defined        E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 97)
'i_slowMAIndex' - variable not defined  E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 114)
'i_filtrMATF' - variable not defined    E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 38)
'i_filtrMAPeriod' - variable not defined        E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 51)
'i_filtrMAShift' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 68)
'i_filtrMAMethod' - variable not defined        E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 84)
'i_filtrMAApplied' - variable not defined       E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 101)
'i_filtrMAIndex' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 119)
18 ошибок, 0 предупреждений     

Tu non dichiari nulla nella libreria e non hai errori, ma io sì, per qualche motivo. Non ho visto alcuna differenza.

 

Victor, hai molte variabili nella tua funzione e nessuna è dichiarata.

Il compilatore ha detto:

variabile non definita

Una variabile non è definita. Ce ne sono 18.

==============

A giudicare dal design della funzione, si tratta di una funzione altamente specializzata. Perché metterlo nella biblioteca? Soprattutto perché probabilmente sarà chiamato nel ciclo su ogni barra.

Stavi dicendo qualcosa sulla velocità e l'ottimizzazione. State creando un codice molto lento. In MQL4 non bisogna mettere le funzioni in un ciclo. Meno chiamate di funzione in un ciclo, più velocemente il codice viene eseguito.

==============

Molto tempo fa, quando ho iniziato a scrivere in MQL4, ho scritto il mio primo indicatore di indice forex. C'erano anche funzioni, operazioni con stringhe... Che pasticcio... Mi ci sono voluti 5 minuti per cambiare i TF.

Poi mi sono seduto e ho pensato, ho eliminato tutte le funzioni e le ho aperte proprio nel blocco di loop. Eliminato il lavoro con le stringhe, sostituendole con gli identificatori. Tutto ciò che poteva essere calcolato in anticipo e che non cambiava - è stato calcolato così (ottimizzazione). Spostato il codice in Expert Advisor. Di conseguenza, il calcolo più pesante durante il cambio di TF è stato di 15 secondi. Poi ho trasferito i calcoli in DLL. Ora ci vogliono circa 5 secondi.