Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 64

 
Leser: Si prega di consigliare come e dove specificare nell'EA il MA appartenente alla finestra n. 2. Per esempio, ho aggiunto una MA a MFI e voglio registrare questa MA nel mio EA. Non so dove e come farlo.
Vuoi entrare nei dettagli? Il tuo Expert Advisor sta già usando l'indicatore MFI e vuoi che usi il secondo indicatore - l'indicatore MA? Oppure, il vostro Expert Advisor non usa alcun indicatore e avete bisogno che usi l'indicatore MA?
 
Yedelkin:

1. Direi questo: usate il codice di qualcun altro con molta attenzione. Perché il codice di qualcun altro significa anche gli errori di qualcun altro.

2. Qui(https://www.mql5.com/ru/forum/6343/page64#comment_357008) ho suggerito di provare ad azzerare correttamente le variabili prima di usarle. Ma il tuo codice non ha ancora implementato questo suggerimento. Inoltre, il vostro codice contiene costrutti del tipo seguente:

Vedete, in questo costrutto le variabili request e result sono azzerate non prima del loro utilizzo, ma dopo il loro utilizzo. Inoltre, quando queste variabili locali sono azzerate, la funzione smette di funzionare, cioè l'azzeramento stesso non ha senso. In altre parole, tale costruzione è un buon esempio di come le variabili MqlTradeRequest e MqlTradeResult non dovrebbero essere azzerate. Quindi, se siete impazienti, per favore, provate a cancellare le variabili correttamente. Se qualcosa va storto, per favore, descrivete in dettaglio cosa "non funziona".

3. La Libreria Standard ha una classe commerciale"MQL5 Reference / Standard Library / Trade Classes / CTrade". Cercate di capire come applicarlo nella pratica. Nella fase iniziale di immersione nella lingua, questa classe può essere abbastanza sufficiente. Per esempio, questa classe ha il seguente metodo:"MQL5 Reference / Standard Library / Trade Classes / 2CTrade/ PositionModify". È implementato come segue:

La linea "ClearStructures();" cancella la variabile m_request prima di usarla.

Yedelkin,

Grazie mille :)

L'ho cercato e ho visto il mio errore.

Posso scriverlo in questo modo:

//+------------------------------------------------------------------+
//| Clear structures request,result and check_result                 |
//+------------------------------------------------------------------+
void ClearStructures()
  {
   MqlTradeRequest request;
   MqlTradeResult result;
   MqlTradeCheckResult check_result;
   ZeroMemory(request);
   ZeroMemory(result);
   ZeroMemory(check_result);
  } 

Ma mi sono piaciuti i tuoi suggerimenti:

   MqlTradeRequest request={0};
   MqlTradeResult result={0};
I risultati sono sempre gli stessi.

Ora la posizione non si trova, mi affaticherò con questo compito.

Grazie.

 

Yedelkin,

Vi scrivo perché state rispondendo adeguatamente.

Ho due sors-MT4 e MT5.

Perché non funziona su MT5, sono uguali.

File:
MTB_1E.mq4  4 kb
MTB_E.mq5  9 kb
 
mario065: Due sors - MT4 e MT5. Perché non funziona su MT5 - sono uguali.

Purtroppo, non capisco affatto MT4. Darò un'occhiata e se trovo qualcosa ti farò sapere.

Addendum. In generale, si aspetterà l'apertura del mercato e si riporterà ciò che esattamente avrebbe dovuto funzionare, ma non ha funzionato.

 
Yedelkin:

Purtroppo, non capisco affatto MT4. Darò un'occhiata e se trovo qualcosa ti farò sapere.

Addendum. In generale, si aspetta l'apertura del mercato e si descrive ciò che avrebbe dovuto funzionare, ma non ha funzionato.

Quindi lo faccio per me e per chi, se necessario.

Ecco i commenti:

Se l'indicazione dei pip bolshego zero per la modifica per due yazikas (MT4 e MT5):

if(TradeTrailing>0)

if(MStop > 0)

Se questi pips (Bid - pips) bolshe aprire posishon:

if((NormalizeDouble(Bid, Digits)-TradeTrailing)>=OrderOpenPrice())

if(NormalizeDouble(Bid - MStop,4) >= Open)
Se stop = 0 o Bid - pipsi dal trailing >= dalla definizione Open Posishon + pips:
if(OrderStopLoss()==0 || (NormalizeDouble(Bid, Digits)-TradeTrailing)>=(OrderStopLoss()+0.0005))

if(SL == 0 || NormalizeDouble(Bid - MStop,4) >= NormalizeDouble(SL + MStop,4))

modifica:

ОrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid, Digits)-TradeTrailing,OrderTakeProfit(),0,Blue);

ModifyPosition(Symbol(),NormalizeDouble(Bid - MStop,4),TP);

Questo è tutto.

Voglio fare una funzione separata per la modifica.

 
Yedelkin:
Puoi essere più specifico? Il tuo Expert Advisor sta già usando l'indicatore MFI e ora hai bisogno che usi il secondo indicatore - l'indicatore MA? Oppure, il vostro Expert Advisor non usa nessun indicatore, ma avete bisogno che usi l'indicatore MA?
Il mio Expert Advisor usa MFI, ma non riesco a capire come scrivere l'indicatore MA! La condizione principale è la posizione del MA. La MA non è sul grafico (finestra 1), ma nella finestra con l'indicatore MFI (finestra 2).
 
Leser: Il mio Expert Advisor usa MFI, ma non riesco a capire come scrivere l'indicatore MA! La condizione principale è la posizione del MA. La MA non è sul grafico (finestra #1), ma nella finestra con l'indicatore MFI (finestra #2).

Se l'Expert Advisor usa MFI, allora il suo codice deve contenere una linea con l'ottenimento dell'handle di questo indicatore:"MQL5 Reference / Technical Indicators / iMFI ". Di conseguenza, la gestione dell'indicatore di media mobile è descritta qui:"MQL5 Reference Guide / Technical Indicators / iMA ".

Prova anche a leggere l'articolo"Indicatore per indicatore in MQL5".

 
mario065: Ecco il commento: Se un Bid-STOPS_LEVEL è più di zero per la modifica: Se questo Bid-STOPS è più di Open Positions: Se Stop = 0 o Bid-STOPS è trailing >= da Open Positions + definizione di Pips: Modifica: Questo è tutto. Vorrei fare una funzione separata per la modifica.

1. Purtroppo non hai specificato cosa "non funziona". Avete dichiarato la logica del programma (come dovrebbe funzionare), ma non avete dichiarato dove la logica è rotta e come è rotta. Senza una descrizione dettagliata del problema, si possono solo fare commenti sul codice.

2. La funzione bool ModifyPosition(const string symbol,double StopLoss,double Takeprofit) contiene tali linee:

   if(!OrderSend(request,result) || result.deal==0)
     {
      Print("Modify error =", GetLastError());
      return(false);
     }

Se guardate la descrizione della struttura di MqlTradeResult, potete vedere che il campo deal è descritto come segue

affare

Deal ticket, se un accordo è stato eseguito. È segnalato durante un'operazione commerciale TRADE_ACTION_DEAL

Poiché la vostra funzione ModifyPosition() esegue un'operazione completamente diversa, il valore di result.deal dovrebbe essere sempre zero. Di conseguenza, l'operatore
if(!OrderSend(request,result) || result.deal==0)

sarà sempre attivato, anche se la modifica ha avuto successo, e allo stesso tempo stamperà un messaggio di errore.

2. Guarda le linee del punto 2 precedente. Lì si usa la funzione GetLastError() che ha lo scopo di restituire il codice dell'ultimo errore. Ma non si cancella affatto la variabile che contiene il codice di errore prima di usarla, quindi anche se la modifica ha successo, si stampa un errore che potrebbe essersi verificato molto prima che la richiesta di modificare la posizione fosse inviata. Dovrebbe andare più o meno così:

ResetLastError();   
if(!OrderSend(request,result))
   { 
    ... 
    Print("Modify error =", GetLastError());
    ...
   }

3. Guardate queste linee:

          if(SL == 0 || NormalizeDouble(Bid - MStop,4) >= SL) 
           {
            ModifyPosition(Symbol(),NormalizeDouble(Bid - MStop,4),TP);
           }

Supponiamo che al prossimo tick la vostra condizioneNormalizeDouble(Bid - MStop,4) == SL sia scattata. Supponiamo che SL==1,11110. Ma poi anche ModifyPosition(Symbol(),1.11110,TP). Cioè questa modifica specificherà i livelli precedentemente impostati.

E cosa succederà, se l'uguaglianza NormalizeDouble(Bid - MStop,4) == SL funzionerà di nuovo sul prossimo tick?) Soprattutto se consideriamo che (a) la normalizzazione viene effettuata su quattro cifre, quando ci possono essere quotazioni a cinque cifre, (b) le richieste di trading possono essere eseguite sul server con un certo ritardo.

4. Esiste anche una proprietà di carattere come SYMBOL_TRADE_STOPS_LEVEL. Ma questo livello non è controllato nel vostro codice. Cioè, se il candidato per un nuovo stop loss per una posizione Buy è specificato come SL_new, sarebbe utile controllare la condizione if(Bid-STOPS_LEVEL>SL_new).

 

Infatti, provate a cercare nel Manuale di riferimento il confronto tra numeri reali. Per quanto mi ricordo, sconsiglia vivamente di confrontare due numeri reali in questo modo: if(double_1 == double_2).

 

Yedelkin,

Grazie mille, Reshetov mi ha anche mostrato dov'è l'errore.

Ecco la funzione stessa:

//+------------------------------------------------------------------+
//| Modify position.                                                 |
//+------------------------------------------------------------------+
bool ModifyPosition(const string symbol,double StopLoss,double Takeprofit){
//---- обявяване на структурата и резултата на търговското искане
   MqlTradeRequest request={0};
   MqlTradeResult result={0};
//---- структурна инициализация на  търговското искане MqlTradeRequest за модифициране на  позиция
   request.action       = TRADE_ACTION_SLTP;
   request.symbol       = symbol;
   request.sl           = StopLoss;
   request.tp           = Takeprofit;
   string word          = "";
   StringConcatenate(word,
                     "<<< ============ Modifyposition():   Модифицираме позицията  ",
                     symbol," ============ >>>");
   Print(word);
//---- модифицираме позицията и  проверяваме резултата от търговското искане
   if(!OrderSend(request,result))
     {
      Print("Modify error =", GetLastError());
      return(false);
     }
   return(true);
  }

Ed ecco come avrei dovuto fare la funzione stessa:

  double buy_trail = 0;
  double sel_trail = 0;
  double SL,TP,Open;
  if(PositionSelect(Symbol())){
    if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
      {
      Open = PositionGetDouble(POSITION_PRICE_OPEN);
      SL   = PositionGetDouble(POSITION_SL);
      TP   = PositionGetDouble(POSITION_TP);
      Bid  = SymbolInfoDouble(Symbol(),SYMBOL_BID);
      buy_trail = NormalizeDouble(Bid - Open,Digits());
      if(buy_trail > MStop)
       {
        if(NormalizeDouble((Bid - MStop),Digits()) >= Open && Open > SL)
          {
           ModifyPosition(Symbol(),Open,TP);
          }
          if(NormalizeDouble((Bid - MStop),Digits()) > SL && Open <= SL)
           {
            ModifyPosition(Symbol(),NormalizeDouble((SL + 0.001),Digits()),TP);
           }
        }
      }
    if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
      {
      Open = PositionGetDouble(POSITION_PRICE_OPEN);
      SL   = PositionGetDouble(POSITION_SL);
      TP   = PositionGetDouble(POSITION_TP);
      Ask  = SymbolInfoDouble(Symbol(),SYMBOL_ASK);
      sel_trail = NormalizeDouble(Open - Ask,Digits());
      if(sel_trail > MStop)
       { 
        if(NormalizeDouble((Ask + MStop),Digits()) <= Open && Open < SL)
          {
           ModifyPosition(Symbol(),Open,TP);
          }
          if(NormalizeDouble((Ask + MStop),Digits()) < SL && Open >= SL)
           {
            ModifyPosition(Symbol(),NormalizeDouble((SL - 0.001),Digits()),TP);
           }
        }
      }
     }

Ora tutto funziona bene.

Grazie.