Domande dai principianti MQL4 MT4 MetaTrader 4 - pagina 19

 
Vitalie Postolache:
Non essere così ))))
il motivo non è mql4
 
Vitalie Postolache:

Non funziona molto così. Gli argomenti di questa funzione sono 1) la stringa da cercare; 2) la combinazione di caratteri da trovare; 3) l'inizio della ricerca (di default, dal carattere nullo della stringa nel passo 1).

Restituisce il numero di posizione nella stringa, in cui inizia la sottostringa cercata, o -1 se non viene trovata nessuna sottostringa.

Quindi, dovrebbe essere scritto così:

if(StringFind(OrderComment(),"[tp]",0)>-1) {действие при нахождении признака закрытия по TP}

Grazie per la risposta... Così, la funzioneStringFind con i suoi parametri ( string_value, string match_substring, int start_pos=0 ) è scritta nel codice comune in una riga con

argomenti corrispondenti ai dati dei parametri della funzione: stringa OrderComment(), stringa "[tp]", int 0 e se questa espressione ( racchiusa tra parentesi graffe) è maggiore di -1 , viene eseguito il seguente codice

if(StringFind(OrderComment(),"[tp]",0)>-1)

{

doppio OrderTakeProfit();

if(OrderSelect(12, SELECT_BY_POS)==true)

Print("Order #",OrderTicket()," profit: ", OrderTakeProfit());

else

Print("OrderSelect() returned error ",GetLastError());

bool PlaySound(

stringa payment // dove "payment" è ilnome del file nella cartella MT4 Sound

);

}

... Questo codice funzionerà in MQL4? ...

 
bablusut:

Grazie per la risposta ... Si scopre che la funzioneStringFind con i suoi parametri ( string_value, string match_substring, int start_pos=0 ) è scritta nel codice comune in una riga con

argomenti corrispondenti ai dati dei parametri della funzione: stringa OrderComment(), stringa "[tp]", int 0 e se questa espressione ( racchiusa tra parentesi graffe) è maggiore di -1 , viene eseguito il seguente codice

if(StringFind(OrderComment(),"[tp]",0)>-1)

{

doppio OrderTakeProfit();

if(OrderSelect(12, SELECT_BY_POS)==true)

Print("Order #",OrderTicket()," profit: ", OrderTakeProfit());

else

Print("OrderSelect() returned error ",GetLastError());

bool PlaySound(

stringa payment // dove "payment" è ilnome del file nella cartella MT4 Sound

);

}

... Questo codice funzionerà in MQL4? ...

double OrderTakeProfit(); - il codice dovrebbe avere un errore durante la compilazione.

Per quanto ho capito (sto ancora studiando), OrderTakeProfit(); richiede il profitto dell'ordine dal mercato. Così, il nostro Expert Advisor fa 2 richieste per queste poche righe OrderTakeProfit(); sembra che questa linea debba essere cancellata (double OrderTakeProfit(); )

 
bablusut:

Grazie per la risposta ... Si scopre che la funzioneStringFind con i suoi parametri ( string_value, string match_substring, int start_pos=0 ) è scritta nel codice comune in una riga con

argomenti corrispondenti ai dati dei parametri della funzione: stringa OrderComment(), stringa "[tp]", int 0 e se questa espressione ( racchiusa tra parentesi graffe) è maggiore di -1 , viene eseguito il seguente codice

if(StringFind(OrderComment(),"[tp]",0)>-1)

{

doppio OrderTakeProfit();

if(OrderSelect(12, SELECT_BY_POS)==true)

Print("Order #",OrderTicket()," profit: ", OrderTakeProfit());

else

Print("OrderSelect() returned error ",GetLastError());

bool PlaySound(

stringa payment // dove "payment" è ilnome del file nella cartella MT4 Sound

);

}

... Questo codice funzionerà in MQL4? ...

Questo è già stato menzionato:doppio OrderTakeProfit() - non fatelo. Questa funzione è dichiarata automaticamente e non deve essere dichiarata nuovamente. Il compilatore genererà un errore, poiché le funzioni standard non hanno bisogno di essere dichiarate prima.

if(OrderSelect(12, SELECT_BY_POS)==true) - se lo facciamo, allora, nella migliore delle ipotesi, questo sarà un altro ordine, e non quello per cui il commento è stato elaborato sopra. L'ordine deve essere già selezionato all'inizio prima cheif(StringFind(OrderComment(),"[tp]",0)>-1) e il contatore del ciclo deve essere usato come argomento del numero dell'ordine, non come costante, altrimenti il 12° ordine sarà controllato ad ogni iterazione.

 
Vitalie Postolache:

L'hanno già detto:doppio OrderTakeProfit() - non fatelo. Questa funzione è dichiarata automaticamente e non deve essere dichiarata ripetutamente. Il compilatore genererà un errore, poiché le funzioni standard non hanno bisogno di essere dichiarate prima.

if(OrderSelect(12, SELECT_BY_POS)==true) - se lo facciamo, allora, nella migliore delle ipotesi, questo sarà un altro ordine, e non quello per il quale il commento è stato elaborato sopra. L'ordine deve essere già stato selezionato all'inizio, prima cheif(StringFind(OrderComment(),"[tp]",0)>-1).

A1exPit:

double OrderTakeProfit(); - si suppone che vada in crash qui durante la compilazione.

Per quanto ho capito (lo capisco ancora io stesso), OrderTakeProfit(); fa richiesta di profitto dell'ordine al mercato. Così, il nostro Expert Advisor fa 2 richieste per queste poche righe OrderTakeProfit(); sembra che questa linea debba essere cancellata (double OrderTakeProfit(); )

Grazie per il commento - si è rivelato essere giusto.
 
"Vitalie Postolache:

L'hanno già detto:doppio OrderTakeProfit() - non fatelo. Questa funzione è dichiarata automaticamente e non deve essere dichiarata ripetutamente. Il compilatore genererà un errore, poiché le funzioni standard non hanno bisogno di essere dichiarate prima.

if(OrderSelect(12, SELECT_BY_POS)==true) - se lo facciamo, allora, nella migliore delle ipotesi, questo sarà un altro ordine, e non quello per il quale il commento è stato elaborato sopra. L'ordine deve essere già selezionato all'inizio, prima diif(StringFind(OrderComment(),"[tp]",0)>-1) e dovremmo impostare il contatore del ciclo come un argomento del numero dell'ordine, non una costante.

Grazie per la risposta ... La dichiarazione della funzionedouble OrderTakeProfit() è comprensibile, cancelliamola.

"Se abbiamo un solo contatore nel codice precedente, nella funzioneOrdersHistoryTotal, l'operatore loop for con il corpo(i=0;i<accTotal;i++) deve essereusato come argomento del numero d'ordine, il che significa che dobbiamo sostituire il corpo dell'operatore con il corpo della funzioneOrderSelect e lo otterremo

if(StringFind(OrderComment(),"[tp]",0)>-1)

{

if(OrderSelect(i=0;i<accTotale;i++)==true)

Print("Order #",OrderTicket()," profit: ", OrderTakeProfit());

else

Print("OrderSelect() returned error ",GetLastError());

bool PlaySound(

stringa payment // dove"payment" è ilnome del file nella cartella MT4 Sound

);

}

... Questo codice funzionerà in MQL4? ...




 
bablusut:

Grazie per la risposta ... La dichiarazione della funzionedouble OrderTakeProfit() è chiara, cancelliamola.

"Il contatore di loop dovrebbe essere usato come argomento del numero d'ordine" - nel codice precedente, abbiamo solo un contatore di loop, l'operatore loop for nella funzioneOrdersHistoryTotal con il corpo(i=0;i<accTotal;i++), significa che dovremmo sostituire il corpo dell'operatore con il corpo della funzioneOrderSelect e lo otterremo:

Di nuovo. Nel lavoro con l'ordine, il primo posto deve essere OrderSelect. E poi tutto il resto.

Se stiamo lavorando in un ciclo intorno all'ordine, l'ordine delle operazioni è il seguente

1. Controllo se(OrderSelect())

2. Controllando se è l'ordine giusto, di solito controlliamo il simbolo e il numero magico, e poi controlliamo il tipo if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic && OrderType()<2) - in questo caso solo gli ordini a mercato piazzati per il simbolo corrente e con il numero magico specificato sono elaborati

Elaborazione di altri dati come OrderComment(), OrderProfit(), ecc.

Sembrerebbe qualcosa del genere

for(int i=OrdersHistoryTotal()-1; i>=0; i--) //перебираем историю торгов
{
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) //если ордер выбран то работаем дальше, иначе смысла нет
      {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic && OrderType()<2) //Если ордер тот, что нам нужен (эту проверку можно и опустить, если нужно обработать все ордера в истории)
         {
            if(StringFind(OrderComment(),"[tp]",0)>-1) //если найден признак закрытия профитом
            Print("Order #",OrderTicket()," profit: ", OrderTakeProfit());
            if(StringFind(OrderComment(),"[sl]",0)>-1) //если найден признак закрытия стоплосс
            Print("Order #",OrderTicket()," loss: "OrderTakeProfit());
         }
      }
}
 
Come faccio a controllare se c'è un valore di segnale in un buffer o nell'altro dell'indicatore iCustom?
 
Vitalie Postolache:
Ancora una volta. OrderSelect dovrebbe essere al primo posto quando si lavora con un ordine. Poi tutto il resto.

Hanno deciso per tentativi ed errori a quanto pare, ma è costoso, ci sono stato io stesso...

Mi fischiano le orecchie ad essere onesti...

 
atik441:
come si controlla se c'è un valore di segnale nel buffer dell'indicatore iCustom?
Segui il link, è evidenziato nel tuo post.