Problema iterazione ed entrata in operazione

 

Salve, quello che voglio fare essenzialmente è questo: creare una funzione che verifica determinate condizioni (il valore attuale della candela deve uscire dalla mia area di tot in pip e deve rientrare di un altro tot in pip e poi devo entrare in operazione).

Per farlo la mia idea è stata quella di creare una funzione iterativa tra if e while (true). Quando all'interno dell'if più interno non metto istruzioni o metto istruzioni come int x = 0; i test funzionano correttamente, quando invece lì dentro metto un'apposita funzione che ho creato per entrare in operazione i test si bloccano in un punto e non vanno avanti.

I miei problemi quindi sono essenzialmente 3:

1) Questo metodo è corretto per ottenere il valore in tempo reale (latest_price)? Ce ne sono altri di più semplici?

double current_bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
double current_ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
latest_price = current_bid/current_ask;


2) Queste istruzioni sono corrette per entrare in operazione? Quando compilo l'ide dice "return value of 'OrderSend' should be checked"  come risolvo questo warning? request.volume implica il volume, giusto? E se io non volessi acquistare in base al volume?

MqlTradeRequest request = {};
request.action = TRADE_ACTION_DEAL;
request.magic = 1234;
request.symbol = NULL;
request.volume = 0.1;
request.sl = 30;
request.tp = 90;
request.type = ORDER_TYPE_BUY;
MqlTradeResult result = {};
OrderSend(request,result);


3) Questa essenzialmente è la struttura della mia funzione che, a quanto pare, manda in palla i test. Ma per esempio se commento la riga "compra();" i test non danno più problemi. Ho visto che anche semplicemente con un Print() i problemi si ripresentano allo stesso modo. Come dicevo i test continuano a funzionare se dentro il terzo if metto per esempio l'assegnazione di un valore a una variabile. Come posso risolvere il problema?

void funzione()
{
   if (condizione 1)
   {
      while (true)
      {
         if (condizione 2)
         {
            while (true)
            {
               if (condizione 3)
               {
                  // ENTRO IN OPERAZIONE
                  compra();
                  return;
               }
            }
         }
      }
   }
}

Spero di essermi spiegato in modo comprensibile. Vi sarei molto grato per qualsiasi tipo di aiuto e consiglio, grazie mille a tutti.

 
Samuele Quaresima:

Salve, quello che voglio fare essenzialmente è questo: creare una funzione che verifica determinate condizioni (il valore attuale della candela deve uscire dalla mia area di tot in pip e deve rientrare di un altro tot in pip e poi devo entrare in operazione).

Per farlo la mia idea è stata quella di creare una funzione iterativa tra if e while (true). Quando all'interno dell'if più interno non metto istruzioni o metto istruzioni come int x = 0; i test funzionano correttamente, quando invece lì dentro metto un'apposita funzione che ho creato per entrare in operazione i test si bloccano in un punto e non vanno avanti.

I miei problemi quindi sono essenzialmente 3:

1) Questo metodo è corretto per ottenere il valore in tempo reale (latest_price)? Ce ne sono altri di più semplici?


2) Queste istruzioni sono corrette per entrare in operazione? Quando compilo l'ide dice "return value of 'OrderSend' should be checked"  come risolvo questo warning? request.volume implica il volume, giusto? E se io non volessi acquistare in base al volume?


3) Questa essenzialmente è la struttura della mia funzione che, a quanto pare, manda in palla i test. Ma per esempio se commento la riga "compra();" i test non danno più problemi. Ho visto che anche semplicemente con un Print() i problemi si ripresentano allo stesso modo. Come dicevo i test continuano a funzionare se dentro il terzo if metto per esempio l'assegnazione di un valore a una variabile. Come posso risolvere il problema?

Spero di essermi spiegato in modo comprensibile. Vi sarei molto grato per qualsiasi tipo di aiuto e consiglio, grazie mille a tutti.

Ciao, al punto 1 ti dico che non hai bisogno di dividere bid per ask ma già bid e ask sono l'ultimo prezzo battuto.
Al punto 2 non hai indicato il prezzo ovvero essendo un buy quello dell'ask alla quale deve essere fatto il deal in più i valori di Sl e Tp devono essere indicati sempre (in questo caso) bid-30 per Sl e bid+90 per il TP (tieni a mente che se 30 e 90 sono pips dovrai indicarli con 0.0030 e 0.0090). Per il terzo punto non posso esserti di aiuto così. Per quello che riguarda il punto 2 dai un'occhiata alla documentazione sul MqlTradeRequest 
 
Michele Catanzaro #:
Ciao, al punto 1 ti dico che non hai bisogno di dividere bid per ask ma già bid e ask sono l'ultimo prezzo battuto.
Al punto 2 non hai indicato il prezzo ovvero essendo un buy quello dell'ask alla quale deve essere fatto il deal in più i valori di Sl e Tp devono essere indicati sempre (in questo caso) bid-30 per Sl e bid+90 per il TP (tieni a mente che se 30 e 90 sono pips dovrai indicarli con 0.0030 e 0.0090). Per il terzo punto non posso esserti di aiuto così. Per quello che riguarda il punto 2 dai un'occhiata alla documentazione sul MqlTradeRequest 

Grazie mille per la risposta.

Il problema al punto 3 è che i test una volta che entrano nel while si bloccano (cioè il while continua a girare all'infinito perché il valore corrente non cambia e quindi le condizioni seguenti non saranno mai soddisfatte)

 
Non so cosa vuoi fare ma il while è sempre true così il ciclo non ha mai fine. 
 
Michele Catanzaro #:
Non so cosa vuoi fare ma il while è sempre true così il ciclo non ha mai fine. 
Quello che vorrei è che mentre il ciclo va si continui ad aggiornare anche il valore corrente, perché devono verificarsi determinate condizioni prima di entrare in operazione, invece si ferma appena entro nel while e il valore corrente resta fermo sempre allo stesso valore, mentre invece dovrebbe avanzare ogni tick
 
Samuele Quaresima #:
Quello che vorrei è che mentre il ciclo va si continui ad aggiornare anche il valore corrente, perché devono verificarsi determinate condizioni prima di entrare in operazione, invece si ferma appena entro nel while e il valore corrente resta fermo sempre allo stesso valore, mentre invece dovrebbe avanzare ogni tick

O meglio, esiste già una funzione che mi consente di impostare dei parametri (essenzialmente devo controllare che dato un certo pivot se il valore sale di tot pip rispetto al pivot e poi ritorna al valore del mio pivot e scende di un altro tot di pip allora devo entrare in operazione) per poter appunto entrare in operazione senza dover creare ulteriori funzioni che complicano la cosa?

Se questa non esiste, è possibile fare qualcosa di simile? Ho provato con il while ma evidentemente questo non funziona

 
Il while ti crea un ciclo spiegami a cosa ti serve. 
 
Michele Catanzaro #:
Il while ti crea un ciclo spiegami a cosa ti serve. 

Quello che devo fare è, dato un pivot (un valore double, chiamiamolo K), verificare che il valore corrente prima superi di J pip il valore K (quindi il valore corrente deve essere maggiore o uguale a K+P), e poi che il valore corrente vada sotto al mio pivot di I pip (quindi il valore corrente deve essere minore o uguale a K-I), verificate queste due condizioni devo entrare in operazione.

Mi serve verificare queste condizioni in sequenza, prima una e poi l'altra.

Da qui l'uso del while dentro la mia funzione: la mia idea era quella di usare un ciclo che va finché non si verifica la prima condizione, poi quando è verificata si entra in un secondo ciclo contenente la seconda condizione e verificata quest'ultima si entra in operazione.

Il problema è che finché il while è attivo sembra come che la funzione OnTick smetta di funzionare e non aggiorna più il valore corrente.

 
Samuele Quaresima #:

Quello che devo fare è, dato un pivot (un valore double, chiamiamolo K), verificare che il valore corrente prima superi di J pip il valore K (quindi il valore corrente deve essere maggiore o uguale a K+P), e poi che il valore corrente vada sotto al mio pivot di I pip (quindi il valore corrente deve essere minore o uguale a K-I), verificate queste due condizioni devo entrare in operazione.

Mi serve verificare queste condizioni in sequenza, prima una e poi l'altra.

Da qui l'uso del while dentro la mia funzione: la mia idea era quella di usare un ciclo che va finché non si verifica la prima condizione, poi quando è verificata si entra in un secondo ciclo contenente la seconda condizione e verificata quest'ultima si entra in operazione.

Il problema è che finché il while è attivo sembra come che la funzione OnTick smetta di funzionare e non aggiorna più il valore corrente.

Per fare ciò ti bastano tre if. Ovvero dichiari altre 2 variabili di tipo bool, nella prima if controlli se il prezzo ha superato il valore di k+J, se si poni la prima variabile booleana su true, poi nella seconda if controlli se il prezzo è sceso sotto il valore di k-l se si modifichi la seconda variabile, nella terza if controlli se le 2 variabili sono vere e apri l'operazione. In ogni caso considera che prima di aprire la posizione dovresti fare prima un controllo se ci sono già posizioni aperte o meno. 
 
Michele Catanzaro #:
Per fare ciò ti bastano tre if. Ovvero dichiari altre 2 variabili di tipo bool, nella prima if controlli se il prezzo ha superato il valore di k+J, se si poni la prima variabile booleana su true, poi nella seconda if controlli se il prezzo è sceso sotto il valore di k-l se si modifichi la seconda variabile, nella terza if controlli se le 2 variabili sono vere e apri l'operazione. In ogni caso considera che prima di aprire la posizione dovresti fare prima un controllo se ci sono già posizioni aperte o meno. 

Grazie mille per la risposta. Non posso aprire più operazioni contemporaneamente? In caso avessi più pivot e dovessi controllare più aree contemporaneamente come la gestisco?

 
Un'idea potrebbe essere quella di andare a modificare il magic number per ogni area e controllare le posizioni così. 
Motivazione: