Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 81

 
oldiol: Scrivo nel codice: if(!m_Trade.PositionClose(_Symbol,100))//--- chiudiamo la posizione dal simbolo corrente. Il risultato è che la posizione è invertita! Sarei molto grato per suggerimenti su come chiudere la posizione.
La posizione è invertita perché il programma invia due richieste identiche al server. Il programma invia due richieste identiche al server, perché il suo codice non controlla la presenza di una richiesta inviata in precedenza (e non controlla il risultato dell'elaborazione di questa richiesta sul server).
 
Yedelkin:
La posizione è invertita perché il programma invia due richieste identiche al server. Il programma invia due richieste identiche al server perché il suo codice non controlla una richiesta inviata in precedenza (e non controlla il risultato dell'elaborazione di questa richiesta sul server).
Per favore, correggi il mio codice con quello corretto...
 

Yedelkin scrive: il suo codice non controlla una richiesta inviata in precedenza. Puoi dirmi quale funzione controlla?

 
oldiol: Per favore correggete il mio codice con quello giusto...

Ognuno ha una comprensione diversa del codice giusto. Quindi alla fine devi scrivere il codice "corretto". E come altro suggerimento - prova a vedere se questo codice funziona nel modo giusto (uso schematico del flag sentRequest):

bool sentRequest=false;  //задать на уровне глобальных переменных программы
...

   if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
     {
      if(!sentRequest)
        {                           
         if(p_close1<buy_stop_level)
           {
            if(!m_Trade.PositionClose(_Symbol,100))
              Print("Метод PositionClose() потерпел неудачу. Код возврата=",m_Trade.ResultRetcode(),". Описание кода: ",m_Trade.ResultRetcodeDescription());
            else
               {
                Print("Метод PositionClose() выполнен успешно. Код возврата=",m_Trade.ResultRetcode()," (",m_Trade.ResultRetcodeDescription(),")");       
                sentRequest=true;
               }
            }  
         }
       else Print("Блок закрытия позиции: имеется POSITION_TYPE_BUY и ранее отосланный запрос на закрытие позиции");        
       }
    else 
      if(sentRequest) sentRequest=false;
 
Yedelkin:

Ognuno ha una comprensione diversa del codice giusto. Quindi alla fine devi scrivere il codice "corretto". E come altro suggerimento - prova a vedere se questo codice funziona nella chiave giusta (uso schematico del flag sentRequest):

Grazie mille! Provando...

 

Il risultato è il seguente: il codice chiude correttamente una posizione lunga e non ne apre una corta... Quando si riapre una posizione lunga, l'EA non la chiude secondo la condizione. Ci sono sempre messaggi nella finestra EA:

Come posso usare questo codice nel corpo dell'Expert Advisor, se funziona solo una volta)?

 

oldiol: При повторном открытии лонга, эксперт не закрывает больше позу по условию. В окне эксперта всё время идут сообщения:    Как же использовать этот код в теле эксперта, если он работает только 1 раз)?

Dovrebbe essere abbastanza semplice in questa materia. Nel codice schematico il flag sentRequest dovrebbe essere impostato a zero se la posizione aperta non è una posizione Buy (ultima linea di codice). Vedi perché questo flag non è impostato a zero nel tuo codice quando non c'è una posizione aperta o la posizione aperta non è una posizione Buy.

 

Urrà! Ha funzionato)))) Rimosso if(sentRequest) sentRequest=false; E scritto prima del blocco if(PositionsTotal()==0) sentRequest=false; Grazie mille a Yedelkin per il suo aiuto, buona fortuna!

 
oldiol Rimosso if(sentRequest) sentRequest=false; E scritto prima del blocco if(PositionsTotal()==0) sentRequest=false;
Quindi non c'era nessun controllo di posizione nel codice principale? Poi aggiungerei che la posizione per un particolare simbolo è selezionata usando le funzioni PositionGetSymbol o PositionSelect.
 

oldiol : Quando si riapre un long, EA non chiude più la posizione per condizione. Ci sono messaggi nella finestra EA tutto il tempo: come posso usare questo codice nel corpo EA, se funziona solo 1 volta)? Scusa, il mio errore... C'è un'altra condizione nel codice

if(PositionSelect(_Symbol)==true) // c'è una posizione aperta
{

POSIZIONE CHIUDERE BLOCCO

} // ... quindi

if(sentRequest) sentRequest=false;// lo mettiamo dietro la prossima parentesi e tutto funziona perfettamente. Yedelkin GRAZIE!