Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 184

 
enum EAct{PUSH,POP};

template<typename T>
void TempCondition(T &value,EAct act){
   static T temp=T();
   switch(act){
      case PUSH: temp=value; break;
      case POP: value=temp;
   }
}

#define  sortArray(_lArray,_lField) do {                     \
   for(int i = 0; i < ArraySize(_lArray); i++) {            \
      TempCondition(_lArray[i],PUSH);                       \
      for(int a = 1; a <= i; a++) {                         \
         if(_lArray[i]._lField < _lArray[a - 1]._lField){   \
            for(int b = i; b >= a; b--) {                   \
               _lArray[b] = _lArray[b - 1];                 \
               }                                            \
               TempCondition(_lArray[a - 1],POP);           \
               break;}}}} while(false)


struct STest{
   double a;
   int b;
};

void OnStart()
{
    STest test[700];
    sortArray(test,a);
}

Dovrebbe funzionare. Ma non consiglierei di farlo in questo modo).

 
Koldun Zloy:

Questo è effettivamente ottimale. E permette di impostare condizioni di ordinamento più complesse.

Per esempio:

Sì e comunque non ci sono altre soluzioni.

Il punto del modello è di essere universale. Se passate un'altra struttura nel vostro esempio che non contiene almeno un campo a,b,c, non compilerà. Cioè, la funzione non può lavorare con due tipi di dati diversi allo stesso tempo.

 
I commenti non relativi a questo argomento sono stati spostati in "Tutte le domande dei neofiti su MQL4 e MQL5, aiuto e discussione su algoritmi e codici".
 

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Pannello di controllo per il trading. AIUTO PER MQL5 NECESSARIO

Vladimir Karputov, 2020.08.18 09:04

Questo codice non funzionerebbe - non puoi confrontare polpette e quadrati:

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      ulong OrderTicket=OrderGetTicket(i);
      if(OrderTicket>0 && PositionSelectByTicket(OrderTicket))
        {
         // Stop long позиции------------------------------------------
         if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
           {
            int cur_tr; //трейлинг
            double ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
            double newSl = ask - cur_tr*_Point;
            double positionSl = PositionGetDouble(POSITION_SL);
            double positionTP = PositionGetDouble(POSITION_TP);
            if(newSl > positionSl || positionSl == 0)
              {
               CTrade trade;
               trade.PositionModify(OrderTicket,newSl,positionTP);
              }
           }
        }
     }

Questa condizione funzionerà se l'ordine pendente è parzialmente eseguito e genera una posizione. Allora un ordine e una posizione con lo stesso ticket esisteranno allo stesso tempo.

Per questo motivo la seguente costruzione ha senso in alcune situazioni.

::PositionSelectByTicket(::OrderGetInteger(ORDER_TICKET))
 
Se volete azzerare i dati MQL della posizione o dell'ordine selezionato.
PositionSelectByTicket(0); // Обнуляет PositionGet*
OrderSelect(0);            // Обнуляет OrderGet*
 

Forum sul trading, sistemi di trading automatico e test di strategia

Biblioteche: MT4Orders

fxsaber, 2020.08.20 15:44

Per coloro che lavorano con le transazioni asincrone, sarà utile conoscere le impostazioni per il numero massimo possibile di transazioni asincrone non elaborate nel vostro account.

Questo non è difficile da scoprire.

Alert: 60 - Too many trade requests


Fate attenzione, potete incorrere in un limite.

 
fxsaber:

Renat ha detto molto tempo fa che non solo si può rimanere incastrati in un limite, ma si può anche essere bloccati da un DC

 
fxsaber:

Questa condizione sarà attivata se l'ordine pendente è parzialmente eseguito e genera una posizione. Allora un ordine e una posizione con lo stesso ticker esisteranno allo stesso tempo.

Il seguente codice in un conto demoRannForex-Server può riprodurre immediatamente questa situazione eseguendo questo EA.

// Воспроизведение ситуации наличия позиции и отложенного ордера с одинаковыми тикетами.

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

MqlTradeResult Result = {0};
MqlTradeRequest Request = {0};

int OnInit()
{

        Request.action = TRADE_ACTION_PENDING;
        Request.symbol = _Symbol;
        Request.volume = 100;
        Request.price = Ask;
        Request.type = ORDER_TYPE_BUY_LIMIT;
        
        return(!OrderSend(Request, Result)); // Выставили лимитник по текущей цене.
}

#define  TOSTRING(A) #A + " = " + DoubleToString(A, _Digits)

void OnTradeTransaction( const MqlTradeTransaction&, const MqlTradeRequest&, const MqlTradeResult& )
{
  if (OrderSelect(Result.order) && (OrderGetInteger(ORDER_STATE) == ORDER_STATE_PARTIAL)) // Если наш лимитник исполнился частично
  {
    if (Ask - OrderGetDouble(ORDER_PRICE_OPEN) < 100 * _Point)                            // и находится близко от текущей цены
    {
        Request.action = TRADE_ACTION_MODIFY;
        Request.order = Result.order;
        Request.price = Ask - 1000 * _Point;

      // тогда передвигаем его подальше.
      if (OrderSend(Request, Result)) // Если синхронный OrderSend выполнился успешно, то торговое окружение должно соответствовать.
      {
        // Проверка соответствия торгового окружения.
        if (OrderSelect(Request.order) &&                                                                // Если получилось взять данные нашего ордера
            NormalizeDouble(OrderGetDouble(ORDER_PRICE_OPEN) - Request.price, _Digits))                  // и цена ордера не равна цене успешного OrderSend
          Alert("Bug:" + TOSTRING(OrderGetDouble(ORDER_PRICE_OPEN)) + " != " + TOSTRING(Request.price)); // сообщаем о баге MT5.
      }
    }
    else
      ExpertRemove();
  }     
}


Risultato.


A proposito, lo script mostra (non sempre la prima volta) un bug nell'esecuzione di OrderSend sincrono.

Alert: Bug:OrderGetDouble(ORDER_PRICE_OPEN) = 0.89837 != Request.price = 0.88837

Dopo che OrderSend è stato eseguito per alcune decine/centinaia di millisecondi, il prezzo dell'ordine è quello vecchio, e non quello che è stato piazzato con successo da OrderSend.


Tornando all'argomento dei biglietti identici, possiamo trarre alcune conclusioni.

  1. Se un ordine limite parziale è sospeso, la scheda "Ordini e compravendite" non mostrerà la compravendita generata.
  2. Su una copertura, un singolo ordine può generare più operazioni IN con prezzi diversi. Il risultato sarà un prezzo di apertura frazionato (relativo ai pip) della posizione.
  3. Puoi chiudere la posizione generata senza rimuovere la Put parziale. Ma se dopo che l'ordine pendente è scattato, allora verrà aperto un trade con il ticket, uguale al ticket della posizione, che è stato chiuso prima. Cioè, ci può essere una situazione in cui si chiude una posizione con un certo biglietto. E poi una posizione riappare con lo stesso ticker.
  4. L'esecuzione parziale può essere implementata in modo diverso, a seconda del software del broker. Quanto sopra è un'implementazione standard di MT5.

Se qualcuno è riuscito a riprodurlo su un altro server di trading, per favore condivida il nome.

Stringa di ricerca: Oshibka 010.

 
fxsaber:


  1. Potete chiudere la posizione generata senza cancellare la Put parziale. Ma se dopo che l'ordine pendente è scattato, aprirà un trade con un ticket uguale al ticket della posizione precedentemente chiusa. Cioè, ci può essere una situazione in cui si chiude una posizione con un certo biglietto. E poi una posizione appare di nuovo con lo stesso biglietto.

Non è un biglietto unico? Come può essere?

Sia gli ordini che gli scambi hanno biglietti unici?

 
Andrey Khatimlianskii:

Non è un biglietto unico? Come può essere?

La spiegazione che si può trovare è che finché c'è un ordine di apertura, c'è sempre una posizione. Solo che non è sempre visibile - il volume è zero. E questa posizione ha un biglietto unico. Bene, su una copertura per questo motivo è abbastanza possibile che ci siano in-trigger sulla stessa posizione dopo i corrispondenti trade in e out.

Gli ordini e le offerte hanno anche biglietti unici?

Sono unici. Ma naturalmente ORDER_TICKET può essere uguale a DEAL_TICKET.

Motivazione: