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

 

Buon pomeriggio, signori. )) le scuse per il dilettantismo...

Non capisco come funziona OrderClose :(

Ho bisogno di un massimo di 1 ordine, cioè prima di aprirne uno nuovo, voglio che il precedente sia chiuso...

Perché non funziona così?


OrderClose(nom, 0.01, Bid,5, Red);

OrderSend(Symbol(), OP_SELL, 0.01 , NormalizeDouble(Bid,5), 3 , NormalizeDouble(Ask+0.0005,5), NormalizeDouble(Bid-0.0008,5), "", nom,0,Red);


il registro è fondamentalmente imprecare su un biglietto non valido.

in OrderClose invece di nom, cosa dovrei mettere? o sto pensando nella direzione sbagliata?)

 
Sergey Voytsekhovsky:

Prova minStopLoss = Prezzo corrente +/- (MaxValue(2*Spread, StopLoss));

L'ho provato. Due spread è 24, non funzionerà così, inizia a lavorare a 19 dal prezzo di chiusura. Dall'attuale prezzo di apertura lavora a tre spread.
Ho aumentato lo stop di un punto nel ciclo e ho aperto un ordine. Ha aperto per 19. La questione non è come impostarlo. La questione è come calcolare correttamente. Non ci sono prezzi; appaiono durante l'apertura manuale di un ordine se si imposta lo stop con il pulsante stop. È ridicolo, sto facendo una lettura di massa di questo forum. Ho trovato alcune funzioni nella 7a pagina (messaggio #65). Vi farò sapere quando l'avrò controllato.

 
Sergey Voytsekhovsky:

L'ho studiato, ma niente di nuovo, apparentemente è (nuovo per me) naturalmente, ovvio per tutti gli iniziati, autoesplicativo. Non ho trovato nulla di nuovo, tranne la caratteristica sopra descritta della disposizione reciproca dei buffer durante l'indicizzazione. Questa sequenza rispettata, ha ottenuto un'immagine ancora più ridicola.

Immagini qui sotto, file allegato

Forse siete molto sfortunati, ma non mi piace curiosare nel codice degli altri. Tanto più quando si tratta di ripararlo...

La prossima domanda: quanto spesso pensate che il valore dell'indicatore sarà esattamente 50?

         ColorHistogram_2Buffer1[i]=50; 

Per come ho capito il problema, dovrebbe essere un colore >50 e un altro <50, ma non ho visto ==50. Naturalmente, per eliminare la perdita nel caso ==50, dobbiamo aggiungere a uno dei confronti >=50 o l'altro <=50, come la religione permette. Può sembrare meglio.

E la seconda domanda: quanto pensate sia stato necessario cambiare tutta l'indicizzazione dei buffer? Dopo la reindicizzazione, hai sistemato tutto esattamente nel codice? Forse sarebbe più facile fare il buffer colore indice 4, e i buffer ausiliari 5 e 6 di conseguenza. Ci sarebbe meno bisogno di modificare e meno possibilità di fare qualche errore in più.

 
klok79:
L'ho provato. Due spread è 24, non funzionerà così, inizia a lavorare a 19 dal prezzo di chiusura. Dal prezzo aperto corrente funziona con tre spread.
Ho aumentato lo stop di un punto nel ciclo e ho aperto l'ordine. A 19 anni ha aperto. Non è una questione di come scegliere. La questione è come calcolarlo correttamente. Non ci sono prezzi che appaiono quando apro un ordine manualmente se imposto uno stop con il pulsante. È ridicolo, sto facendo una lettura di massa di questo forum. Ho trovato alcune funzioni nella 7a pagina (messaggio #65). Dovrò controllare e riferire.

Controllato. Opere
Tutto questo è strano, dice lo stesso minStopLoss = Current Price +/- (MaxValue(2*Spread, StopLoss)), solo che sotto Current Price si intende non il prezzo aperto dell'ordine ma il prezzo speculare.
Perché il doppio spread è adatto?
Sorgono altre due domande.
1. Perché SymbolInfoInteger è usato per ottenere i valori Digits() e Point(); ?
2. Perché si usa una voce (int) prima di chiamare la funzione SymbolInfoInteger? Da quanto ho capito, si tratta di una conversione forzata.

 
klok79:

Controllato. Funziona
Tutto questo è strano, scrivono ancora lo stesso minStopLoss = Current Price +/- (MaxValue(2*Spread, StopLeval)) ma il Current Price non è il prezzo di apertura dell'ordine ma il prezzo speculare.
Perché il doppio spread è adatto?
Sorgono altre due domande.
1. Perché SymbolInfoInteger è usato per ottenere i valori Digits() e Point(); ?
2. Perché si usa una voce (int) prima di chiamare la funzione SymbolInfoInteger? Da quanto ho capito, si tratta di una conversione forzata.

Per ottenere Point() SymbolInfoInteger non funzionerà in alcun modo).

In generale, è necessario ricordare che Point() o _Point è solo per il simbolo corrente. Per i caratteri diversi da quello su cui lavora l'EA, è necessario utilizzare questa stessa funzione.

La funzione SymbolInfoInteger restituisce non solo valori int, ma anche long, bool ed enumerazioni.

 

Sergey Voytsekhovsky, grazie per il tuo aiuto. E un'altra domanda, se non ti dispiace, per favore suggerisci la funzione inversa alla funzioneCharToStr
(per ottenere un codice da un simbolo), perché ho funzioni per questo in Beisic e Delphi, ma in C++, per quanto ne so, ci sono due metodi:
1 - FunzioneAscii_cod, che non è in mql4
2. - Conversione diretta del tipo. Ma il mio codice è
stringa st="A";
Stampa ("Codice carattere A=",(int)st);

Emette testo Codice carattere A=0.

Cosa fare?

 
klok79:

Sergey Voytsekhovsky, grazie per il suo aiuto. E un'altra domanda, se non ti dispiace, potresti suggerire la funzione inversa della funzioneCharToStr
(per ottenere il suo codice da un simbolo), dato che ho usato Beisic e Delphi, hanno funzioni per questo, mentre in C++, come ho capito, hanno due metodi:
1 - FunzioneAscii_cod, che non è in mql4
2. - Conversione diretta del tipo. Ma il mio codice è
stringa st="A";
Stampa ("Codice carattere A=",(int)st);

Emette testo Codice carattere A=0.

Cosa fare?

StringToCharArray, a differenza della funzione wiki, non converte solo un carattere alla volta, ma può convertire una stringa in un array di tipo ucar con i codici di tutti i caratteri della stringa.

Anche mql4 ha una tale funzione.

Документация по MQL5: Преобразование данных / StringToCharArray
Документация по MQL5: Преобразование данных / StringToCharArray
  • www.mql5.com
Посимвольно копирует преобразованную из unicode в ansi строку в указанное место массива типа uchar. Функция возвращает количество скопированных элементов. [in]  Количество элементов массива для копирования. Определяет длину результатной строки. По умолчанию -1, что означает копирование до конца массива, либо...
 
Alexey Viktorov:

Per ottenere Point() SymbolInfoInteger non funzionerà in alcun modo).

In generale, è necessario ricordare che Point() o _Point è solo per il simbolo corrente. Per i caratteri diversi da quello su cui lavora l'EA, si dovrebbe usare questa funzione.

La funzione SymbolInfoInteger restituisce non solo valori int, ma anche long, bool ed enumerazioni.

In realtà Point ha valore doppio. Questo significa che dovremmo chiamarlo da SymbolInfoDouble

 
Konstantin Nikitin:

Beh, Point in realtà ha un valore doppio. Significa che la richiesta dovrebbe essere fatta da SymbolInfoDouble

Si tratta di queste funzioni per MQL4 dal post #65:

//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,double stop_loss) {
   if(stop_loss==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,stop_loss),dg));
   else return(NormalizeDouble(fmax(price+(lv+1)*pt,stop_loss),dg));
}
//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,int stop_loss) {
   if(stop_loss==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,price-stop_loss*pt),dg));
   else return(NormalizeDouble(fmax(price+(lv+1)*pt,price+stop_loss*pt),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,double take_profit) {
   if(take_profit==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,take_profit),dg));
   else return(NormalizeDouble(fmin(price-(lv+1)*pt,take_profit),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,int take_profit) {
   if(take_profit==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,price+take_profit*pt),dg));
   else return(NormalizeDouble(fmin(price-(lv+1)*pt,price-take_profit*pt),dg));
}
//+------------------------------------------------------------------+
int StopLevel(string symbol_name) {
   int sp=(int)SymbolInfoInteger(symbol_name,SYMBOL_SPREAD);
   int lv=(int)SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
   return((lv==0)?sp*2:lv);
   }
//+------------------------------------------------------------------+

Non ho visto dove Point si ottiene tramite SymbolInfoInteger()

 
Artyom Trishkin:

Si tratta di quelle funzioni MQL4 del post #65:

Non ho visto dove Point si ottiene tramite SymbolInfoInteger()

Sì, lo stesso. Siamo scivolati attraverso di essa. L'importante è che capisca come stanno le cose...