Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 704

 
Alexander_K2:

C'è qualcosa di veramente sbagliato, però...

Cioè, faccio OrderSelect una volta e poi di nuovo dalla funzione... È una cosa incredibile...

  1. Hai selezionato un ordine su un biglietto
  2. Si va alla funzione che controlla il numero di ordini. Se c'è più di un ordine, tutti gli ordini disponibili sono selezionati uno per uno nel ciclo
  3. Al ritorno dalla funzione, l'ordine selezionato sarà quello che si trovava per ultimo nella lista degli ordini nel terminale del cliente (non sarà necessariamente l'ordine selezionato al punto 1).
  4. Poi si controlla il tempo di chiusura di un nuovo ordine, e si cerca di chiudere quello che si suppone sia stato selezionato dal biglietto, ma la sua selezione è già stata persa.

Semplice logica...

Guarda la sequenza delle operazioni che stai facendo.

Ovviamente, bisogna prima controllare la quantità, poi selezionare l'ordine richiesto, e poi eseguire le operazioni necessarie su di esso.

 
Maxim Kuznetsov:

in quale direzione vedete la matrice dell'ordine?

se ci sono possibili chiusure/cancellazioni durante la "revisione", è meglio guardare nella direzione opposta. Da OrdersTotal()-1 a 0 incluso.

Altrimenti potresti avere dei problemi :-)


Ho quasi scoperto il mio graal personale in questo modo una volta :-)

E la rimozione di vecchi ordini dalle "profondità del tempo" al presente (una volta ogni tanto, non tutti) ha sollevato la redditività del tester al cielo :-)

 
Artyom Trishkin:
  1. Hai selezionato un ordine per biglietto
  2. Siete entrati nella funzione per controllare il numero di ordini. Se c'è più di un ordine, tutti gli ordini disponibili saranno selezionati uno per uno per essere contati nel ciclo
  3. Al ritorno dalla funzione, l'ordine selezionato sarà quello che si trovava per ultimo nella lista degli ordini nel terminale del cliente (non deve necessariamente essere l'ordine selezionato al punto 1).
  4. Poi si controlla il tempo di chiusura di un nuovo ordine, e si cerca di chiudere quello che si suppone sia stato selezionato dal biglietto, ma la sua selezione è già stata persa.

Semplice logica...

Guarda la sequenza delle operazioni che stai facendo.

È ovvio che bisogna prima controllare la quantità, poi selezionare l'ordine giusto, e poi eseguire le operazioni necessarie su di esso

L'ho fatto in questo modo:

RefreshRates();
         total_orders_NZDUSD=TotalOrders("NZDUSD.I");
         if(OrderSelect(ticket_sell_NZDUSD, SELECT_BY_TICKET)==true)
         {
         ctm_ticket_sell_NZDUSD=OrderCloseTime();
         order_type_NZDUSD=OrderType();
            if(total_orders_NZDUSD>0)
            {
               if(ctm_ticket_sell_NZDUSD==0)
               {
                  if(order_type_NZDUSD==OP_SELL)
                  {
                  double AskNorm=NormalizeDouble(Ask,Digits);
                  OrderClose(ticket_sell_NZDUSD,0.01,AskNorm,0);
                  }
               }
            }
         }

Metti prima il conteggio dell'ordine e poi tutto il resto.

Grazie Artem. Devo il Graal ad esso. Questo era l'errore che mi stava uccidendo...

 

Come si calcola il numero di cifre decimali?

Per esempio, ho scoperto che il lotto minimo è 0,01.

MarketInfo("EURUSD",MODE_MINLOT)

come faccio a dedurre che il numero di cifre decimali è 2?
per normalizzare il volume dell'ordine con due cifre decimali.

 
multiplicator:

Come si calcola il numero di cifre decimali?

Per esempio, ho scoperto che il lotto minimo è 0,01.

come faccio a dedurre che il numero di cifre decimali è 2?
per normalizzare il volume dell'ordine a due cifre decimali in seguito.

Prova questo.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.05.2008                                                     |
//|  Описание : Возвращает нормализованное значение торгуемого лота.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    lo - нормализуемое значение лота.                                       |
//|    ro - способ округления          (   False    - в меньшую,               |
//|                                        True     - в большую сторону)       |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//+----------------------------------------------------------------------------+
double NormalizeLot(double lo, bool ro=False, string sy="") {
  double l, k;
  if (sy=="" || sy=="0") sy=Symbol();
  double ls=MarketInfo(sy, MODE_LOTSTEP);
  double ml=MarketInfo(sy, MODE_MINLOT);
  double mx=MarketInfo(sy, MODE_MAXLOT);

  if (ml==0) ml=0.1;
  if (mx==0) mx=100;

  if (ls>0) k=1/ls; else k=1/ml;
  if (ro) l=MathCeil(lo*k)/k; else l=MathFloor(lo*k)/k;

  if (l<ml) l=ml;
  if (l>mx) l=mx;

  return(l);
}
 
Alekseu Fedotov:

Prova questo.

Perché offrire roba così vecchia?

moltiplicatore:

Come calcolare il numero di cifre decimali?

Per esempio, ho imparato che il lotto minimo è 0,01.

Come posso scoprire che il numero di cifre decimali è 2?
Poi normalizzare il volume dell'ordine con due cifre decimali.

Ecco una funzione già pronta nell'articolo.

//+------------------------------------------------------------------+
//|  Проверяет объем ордера на корректность                          |
//+------------------------------------------------------------------+
bool CheckVolumeValue(double volume,string &description)
  {
//--- минимально допустимый объем для торговых операций
   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   if(volume<min_volume)
     {
      description=StringFormat("Объем меньше минимально допустимого SYMBOL_VOLUME_MIN=%.2f",min_volume);
      return(false);
     }

//--- максимально допустимый объем для торговых операций
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   if(volume>max_volume)
     {
      description=StringFormat("Объем больше максимально допустимого SYMBOL_VOLUME_MAX=%.2f",max_volume);
      return(false);
     }

//--- получим минимальную градацию объема
   double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);

   int ratio=(int)MathRound(volume/volume_step);
   if(MathAbs(ratio*volume_step-volume)>0.0000001)
     {
      description=StringFormat("Объем не является кратным минимальной градации SYMBOL_VOLUME_STEP=%.2f, ближайший корректный объем %.2f",
                               volume_step,ratio*volume_step);
      return(false);
     }
   description="Корректное значение объема";
   return(true);
  }

Non resta che aggiungere un'azione in funzione del risultato restituito da questa funzione.

Какие проверки должен пройти торговый робот перед публикацией в Маркете
Какие проверки должен пройти торговый робот перед публикацией в Маркете
  • www.mql5.com
Все продукты Маркета перед публикацией проходят обязательную предварительную проверку, так как небольшая ошибка в логике советника или индикатора может привести к убыткам на торговом счете. Именно поэтому нами разработана серия базовых проверок, призванных обеспечить необходимый уровень качества продуктов Маркета. Если в процессе проверки...
 
Vedo che quando lo apro, il terminale normalizza l'ordine al numero di decimali richiesto.
Ho messo molto così
OrderSend(Symbol(),OP_BUY,1.11111111,Ask,3,0,0);
e lo scambio si apre con un volume di 1,11.

Quindi forse non c'è bisogno di normalizzare nulla?
 
multiplicator:
Vedo che il terminale normalizza l'ordine al numero di decimali richiesto quando lo apro.
Forse non c'è bisogno di normalizzare nulla?

Se l'editore fa lo stesso - non c'è bisogno.

 
multiplicator:
Vedo che il terminale normalizza l'ordine al numero corretto di decimali quando si apre.
Forse non c'è bisogno di normalizzare nulla?

Se volete ottenere un errore dopo l'altro, non normalizzate.

 
Artyom Trishkin:

Se volete ottenere un errore dopo l'altro, non normalizzate.

per qualche motivo il terminale non mostra errori)
Motivazione: