Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 404

 

Ho iniziato a scrivere un wrapper per le funzioni di apertura e modifica degli ordini (ho pensato che avrebbe risolto i miei problemi con il ritorno dei valori da questi operatori) ma c'è lo stesso problema.

Spiegare qual è il problema (non importa cosa scrivo, c'è sempre un problema con il ritorno dei valori da OrderSend, OrderSelex e ModifyOrder)

Codice Wrapper .

int start()

{

se (segnale == 1)

{

OrderSendX(Symbol(),OP_BUY,0.1,Ask,0,500,500,"123",123,0,Red);

}

ritorno(0);

}

//-----------------------------------------------

int OrderSendX (simbolo stringa, int cmd, doppio volume, doppio prezzo, int slippage, doppio stoploss, doppio takeprofit, commento stringa,

int magic,datetime expiration,color arrow_color)

{

int err=GetLastError();

errare = 0;

bool exit_loop = false;

int ticket = -1;

int Retry = 10;

int cnt = 0;

if(cmd == OP_BUY || cmd == OP_SELL) //controlla il tipo di ordine da aprire

{

mentre(!exit_loop)

{

ticket = OrderSend(symbol,cmd,volume,price,slippage,stoploss,takeprofit,comment,magic,expiration,arrow_color);

err = GetLastError();

interruttore(err)

{

caso ERR_NO_ERROR:

exit_loop = true;

pausa;

{ caso ERR_SERVER_BUSY:

caso ERR_NO_CONNECTION:

caso ERR_INVALID_PRICE:

caso ERR_BROKER_BUSY:

caso ERR_TRADE_CONTEXT_BUSY:

cnt++;

pausa;

caso ERR_PRICE_CHANGED:

caso ERR_OFF_QUOTES:

caso ERR_REQUOTE:

RefreshRates();

continuare;

default:

exit_loop = true;

pausa;

}

se(cnt>Retry)

exit_loop = true;

se(!exit_loop)

{

Dormire(1000);

RefreshRates();

}

else

{

se(err !=ERR_NO_ERROR)

{

Stampa("Errore : " + err);

}

}

se(err ==ERR_NO_ERROR)

{

OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);

return(ticket);

}

Print("Errore di apertura dell'ordine dopo" + cnt + "tentativi");

ritorno(-1);

}

}

}

 
Leanid Aladzyeu:

Ho iniziato a scrivere un wrapper per le funzioni di apertura e modifica degli ordini (ho pensato che avrebbe risolto i miei problemi con il ritorno dei valori da questi operatori) ma c'è lo stesso problema.

Spiegatemi qual è il problema (non importa cosa ho scritto, ho sempre problemi con il ritorno dei valori da OrderSend, OrderSelex e ModifyOrder)

https://docs.mql4.com/ru/trading/ordermodify

bool res=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,Blue);
            if(!res)
               Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
            else
               Print("Цена Stop Loss ордера успешно модифицирована.");

OrderModify() restituisce sì, no

OrderModify - Документация на MQL4
  • docs.mql4.com
OrderModify - Документация на MQL4
 

Nessuno può spiegare.

Proviamo un altro esempio invece di copiare l'aiuto 100 volte a me.

Come dovrebbe essere corretto? Userò un esempio per capire le correzioni

{

SL=NormalizeDouble(Bid-TrailingStop*Point,Digits);

se(OrderStopLoss()!=SL)

OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0);

}

non inserire

"""ticket """= OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0); ogni volta è corretto?

 

E grazie a tutti quelli che hanno cercato di spiegare.

Purtroppo non capisco come designare una variabile ad una variabile che è predefinita come funzione.

 
Leanid Aladzyeu:

E grazie a tutti quelli che hanno cercato di spiegare.

Purtroppo non capisco come designare una variabile ad una variabile che è predefinita come funzione.

CaroLeanid. Imparate a leggere l'aiuto e a lavorare con gli errori e gli avvertimenti. Se non imparate a farlo, non riuscirete nemmeno a programmare correttamente. Queste sono le basi. Avete provato a tradurre ciò che è scritto negli avvertimenti? Capite il significato di funzioni che "devono essere controllate"? La guida descrive un esempio corretto di gestione di queste funzioni. Per esempio, OrderModify(). Guarda l'aiuto:

Valore di ritorno

Restituisce true se la funzione si completa con successo o false in caso di errore. Per ottenere informazioni sull'errore, è necessario chiamare la funzioneGetLastError().

e poi segue un esempio:

bool res=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,Blue);
if(!res)
   Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
else
   Print("Цена Stop Loss ордера успешно модифицирована.");

Come potete vedere, il valore di ritorno della funzione è gestito nell'operatore if-else. La variabile res è necessaria "per bellezza" per una ragione. È il risultato dell'esecuzione di una funzione di trading! La funzione da cui dipende il vostro denaro! Di conseguenza, per elaborare correttamente tutte le possibili varianti (l'elaborazione in questo esempio non è prevista), abbiamo bisogno della variabile res e del codice di errore restituito dalla funzione GetLastError(). Gli sviluppatori hanno intenzionalmente incluso gli avvertimenti come promemoria per non dimenticare che ci sono funzioni "importanti" per prestare attenzione all'elaborazione dei valori! Notate anche che se il valore non è controllato non ci sarà alcun errore! Cioè, in questo caso, la funzione funzionerà così com'è, ma se si verifica una situazione anomala, non verrà elaborata. La lista delle situazioni non standard sono codici di ritorno della funzione GetLastError().

Spero che sia più chiaro così.

Коды возврата торгового сервера - Документация на MQL4
  • docs.mql4.com
Коды возврата торгового сервера - Документация на MQL4
 
Leanid Aladzyeu:

Ho iniziato a scrivere un wrapper per le funzioni di apertura e modifica degli ordini (pensavo che avrebbe risolto il mio problema con la restituzione dei valori da questi operatori) ma c'è lo stesso problema.

E in questo caso non è necessario scrivere un wrapper. Non risolverà i problemi con l'avvertimento di controllare il valore di ritorno! Guardate gli esempi di queste funzioni e fate lo stesso!
 
Tapochun:
E in questo caso non abbiamo bisogno di scrivere un wrapper. Non risolverà il problema con l'avvertimento sul controllo del valore di ritorno! Date un'occhiata agli esempi di queste funzioni e fate lo stesso!

Come indicato nel riferimento dà un errore.

L'ho scritto così e va bene

if(OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0))

{

Print("La modifica ha avuto successo");

}

else Print("Errore nella modifica dell 'ordine");

 
Inserire correttamente il codice nei messaggi:Inserire correttamente il codice nel forum
 
Karputov Vladimir:
Inserire correttamente il codice nei messaggi:Inserire correttamente il codice nel forum
ecco a voi...
 
Leanid Aladzyeu:

Perché Trawling non funziona per vendere? Funziona per comprare!

Nessun errore o avvertimento, nella compilazione genetica.

Ecco il codice:

void Trailing()
  {
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(Bid-OrderOpenPrice()>TrailingStop*Point)
                 {
                  if(OrderStopLoss()<Bid-(TrailingStop+TrailingStep)*Point)
                    {
                     SL=NormalizeDouble(Bid-TrailingStop*Point,Digits);
                     if(OrderStopLoss()!=SL)
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0))
                          {
                           Print("Модификация прошла успешно.");
                          }
                     else Print("Ошибка модификации ордера.");
                    }
                 }
              }
            if(OrderType()==OP_SELL)
              {
               if(OrderOpenPrice()-Ask>TrailingStop*Point)
                 {
                  if(OrderStopLoss()>Ask+(TrailingStop+TrailingStep)*Point)
                    {
                     SL=NormalizeDouble(Ask+TrailingStop*Point,Digits);
                     if(OrderStopLoss()!=SL)
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0))
                          {
                           Print("Модификация прошла успешно.");
                          }
                     else Print("Ошибка модификации ордера.");
                    }
                 }
              }
           }
        }
     }
  }