Caratteristiche utili da KimIV - pagina 12

 

La funzione IndexByTicket().

Restituisce l'indice (numero ordinale nella lista generale degli ordini impostati o delle posizioni aperte) dell'ordine o della posizione sul ticket. Se IndexByTicket() non trova un ordine o una posizione con il ticket richiesto, restituisce -1. Possiamo limitare la lista di ordini o posizioni da controllare usando i parametri della funzione:

  • sy - Nome dello strumento. Se si specifica questo parametro, la funzione controllerà solo gli ordini e le posizioni dello strumento specificato. NULL significa lo strumento corrente, e "" (di default) significa qualsiasi strumento.
  • op - Operazione di trading, tipo di ordine pendente o posizione. Valori validi: OP_BUY, OP_BUYLIMIT, OP_BUYSTOP, OP_SELL, OP_SELLLIMIT, OP_SELLSTOP o -1. Il valore predefinito di -1 indica qualsiasi ordine o posizione.
  • mn - Identificatore di un ordine o posizione (MagicNumber). Il valore predefinito -1 significa qualsiasi MagicNumber.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 20.04.2007                                                     |
//|  Описание : Возвращает индекс ордера или позиции по тикету                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    ti - тикет ордера, позиции                                              |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int IndexByTicket(int ti, string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if ((mn<0 || OrderMagicNumber()==mn) && OrderTicket()==ti) return(i);
      }
    }
  }
  return(-1);
}
 

Ho scritto la funzione IndexByTicket() in un EA personalizzato. Mi ricordo che non potevo farne a meno, altrimenti perché l'avrei scritto? Ma non ricordo come è stato usato lì o perché l'ho praticamente scritto :-) Cercare il codice sorgente del consulente è noioso. Ce ne sono centinaia.

Comunque, non vedo il senso di fare esempi come quelli che ho già dato. Se siamo intelligenti, possiamo capire dove "mettere" i parametri. E se qualcuno ha una buona idea per usare la funzione IndexByTicket(), la posti qui. Cercherò di realizzarlo.


Un breve annuncio.

Le funzioni SelectByTicket() e SelectByTicketFromHistory() sono state abolite. Non li userò io stesso, quindi non vedo il motivo di pubblicarli. Coloro che desiderano discutere su questo argomento sono sempre i benvenuti. Mostrerò tutti i miei deliri così come sono.

 

La funzione NumberOfOrders().

Questa funzione restituisce il numero di ordini e funzionalmente sovrascrive completamente ExistOrders(). Per sostituire la funzione ExistOrders() con la funzione NumberOfOrders(), è necessario e sufficiente controllare il valore di ritorno affinché sia maggiore di zero. Puoi limitare la lista degli ordini da controllare usando i parametri della funzione:

  • sy - Nome dello strumento. Se questo parametro è dato, la funzione controllerà solo gli ordini dello strumento specificato. NULL significa strumento corrente, e "" (di default) significa qualsiasi strumento.
  • op - Tipo di ordine in sospeso. Valori validi: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP o -1. Il valore predefinito di -1 indica qualsiasi ordine.
  • mn - Identificatore dell'ordine (MagicNumber). Il valore predefinito -1 significa qualsiasi MagicNumber.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Возвращает количество ордеров.                                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int NumberOfOrders(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), ko=0, ot;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
      if (ot>1 && ot<6) {
        if ((OrderSymbol()==sy || sy=="") && (op<0 || ot==op)) {
          if (mn<0 || OrderMagicNumber()==mn) ko++;
        }
      }
    }
  }
  return(ko);
}
 

Esempi di come usare la funzione NumberOfOrders().

  1. Ottieni l'importo totale di tutti gli ordini
    NumberOfOrders();
  2. Ottieni il numero di ordini piazzati per il simbolo corrente
    NumberOfOrders(NULL);
  3. Ottenere il numero di ordini BuyLimit per qualsiasi simbolo
    NumberOfOrders("", OP_BUYLIMIT);
  4. Ottieni il numero di ordini SellStop con il numero magico 123456 per EURUSD
    NumberOfOrders("EURUSD", OP_SELLSTOP, 123456);
  5. Ottieni il numero di ordini con un numero magico 2345 per il simbolo corrente
    NumberOfOrders(NULL, -1, 2345);

In allegato c'è di nuovo uno script funzionante con gli esempi di cui sopra.

 
KimIV:

La funzione NumberOfOrders().

Questa funzione restituisce il numero di ordini e funzionalmente sovrascrive completamente ExistOrders(). Per sostituire la funzione ExistOrders() con la funzione NumberOfOrders(), è necessario e sufficiente controllare il valore di ritorno affinché sia maggiore di zero. Puoi limitare la lista degli ordini da controllare usando i parametri della funzione:

  • sy - Nome dello strumento. Se questo parametro è dato, la funzione controllerà solo gli ordini dello strumento specificato. NULL significa strumento corrente, e "" (di default) significa qualsiasi strumento.
  • op - Tipo di ordine in sospeso. Valori validi: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP o -1. Il valore predefinito di -1 significa qualsiasi ordine.
  • mn - Identificatore dell'ordine (MagicNumber). Il valore predefinito di -1 significa qualsiasi MagicNumber.

Sono un po' confuso. Per qualche ragione, vedo qualche contraddizione. Proprio qui:

"...è necessario e sufficiente controllare che il valore di ritorno sia maggiore di zero".

Se spunti "questo e solo questo", allora la funzione sul numero di ordini non ha senso!

È per questo che ho iniziato a darci dentro. Ho inserito questa funzione nel mio Expert Advisor. Ho impostato m=1 nei parametri e condizione per aprire le posizioni.

if (NumberOfOrders("", -1, MagicNumber)<m) {//если открытых позиций МЕНЬШЕ m

Ma è come se l'Expert Advisor non vedesse questa limitazione! E apre gli ordini ad ogni segnale.

Quale può essere il problema qui?

 
rid писал (а):
Sono un po' confuso. Per qualche ragione, vedo una certa contraddizione. Proprio qui:
"...è necessario e sufficiente controllare che il valore di ritorno sia maggiore di zero".
Se controlliamo "questo e solo questo", allora la funzione per il numero di ordini non ha senso!

hmm... Sembra che tu non faccia attenzione alla quantità di informazioni restituite da ciascuna delle funzioni ExistOrders() e NumberOfOrders(). La funzione ExistOrders() restituisce solo informazioni sull'esistenza di ordini, e la funzione NumberOfOrders() restituisce informazioni sul numero di ordini. L'informazione sul numero di ordini contiene l'informazione sull'esistenza di ordini. Quando abbiamo bisogno di rispondere alla domanda se un ordine esiste o no, l'informazione sul numero di ordini è ridondante. Ecco perché ho detto che se vogliamo sostituire la funzione ExistOrders() con la funzione NumberOfOrders (), dobbiamo controllare il valore restituito dalla funzione NumberOfOrders() per assicurarci che sia maggiore di zero. Dopo tutto, è chiaro che se questo valore è uguale a zero, non ci sono ordini, e se questo valore è maggiore di zero, gli ordini sono presenti. La funzione ExistOrders() può essere usata quando non abbiamo bisogno di informazioni sulla quantità dell'ordine, mentre la funzione NumberOfOrders() può essere usata quando non abbiamo bisogno di informazioni sulla quantità dell'ordine e quando ne abbiamo bisogno. In questo senso, la funzione NumberOfOrders() sostituisce completamente la funzione ExistOrders().

rid:

Ecco perché ho iniziato a indagare. Ho inserito questa funzione nel mio Expert Advisor. Ho impostato m=1 nei parametri e condizione per aprire le posizioni.

if (NumberOfOrders("", -1, MagicNumber)<m) {//если открытых позиций МЕНЬШЕ m

Ma è come se l'Expert Advisor non vedesse questo vincolo! E apre gli ordini ad ogni segnale.

Quale può essere il problema qui?

Quindi... e qui sembra che lei confonda le posizioni con i mandati. Per me sono cose diverse. Cosa sono le posizioni? Sono operazioni OP_BUY e OP_SELL, mentre gli ordini sono OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT e OP_SELLSTOP. Apro posizioni e imposto ordini. E cosa si apre? La funzione NumberOfOrders() è progettata per lavorare con gli ordini.
 

Grazie. Ho tutto. Sia sulla prima domanda che sulla seconda.

In altre parole, la funzione "estesa" NumberOfOrders() essenzialmente include già la funzione IndexByTicket()

Sì, infatti. Ho aperto OP_BUY e OP_SELL!

Resta da dare un esempio della vostra prossima funzione che funziona esattamente con le posizioni. (non con ordini).

Mi ricordo che l'hai già postato da qualche parte su questo forum. Non riesco a trovarlo.

 
rid писал (а):
Resta da dare un esempio della vostra prossima funzione che funziona esattamente con le posizioni. (non con ordini)

Ho finito con le funzioni per gli ordini. Poi ci sono le funzioni per le posizioni. Ce ne sono circa 30.


rid ha scritto (a):
Mi ricordo che da qualche parte nel forum l'hai già postato. Non riesco a trovarlo.

cerca

 

Caro Igor, chiedo il tuo aiuto! Ho bisogno di aggiungere un EA in modo che possa prendere posizioni su diversi strumenti. Ci sono 2 EAs in funzione, MACD standard e Ema, ognuno con 6 posizioni, ma solo una posizione si apre... Ho letto i vostri commenti su questo, ma siccome non sono bravo con la lingua, non riesco a capire dove aggiungere cosa... Se non ti dispiace, per favore aiuta... copiato Ema consigliere... Grazie!



//+------------------------------------------------------------------+
//| Parabolic.mq4 |
//| Vitalik |
//| wwwita@mail.ru |
//+------------------------------------------------------------------+
extern double Lots=0.1;
extern double Pip=5;
extern double MoveBack=3;
extern int chk=0;
extern double SL=20;
//+------------------------------------------------------------------+
//|
//+------------------------------------------------------------------+
int start()
{
double hi=High[1];
double lo=Low[1];
double EMA, EMA1, EMA2, EMA3;
int cnt=0, ticket, total;
EMA=iMA(0,0,5,0,MODE_EMA,PRICE_MEDIAN,1);
EMA1=iMA(0,0,10,0,MODE_EMA,PRICE_MEDIAN,1);
EMA2=iMA(0,0,5,0,MODE_EMA,PRICE_MEDIAN,0);
EMA3=iMA(0,0,10,0,MODE_EMA,PRICE_MEDIAN,0);
total=OrdersTotal();
if(total<1)
{
if(AccountFreeMargin()<(1000*Lots))
{
Print("Non hai soldi. Fondi liberi = ", AccountFreeMargin());
return(0);
}
if(((EMA>EMA1) && (EMA2<EMA3)) || ((EMA<EMA1) && (EMA2>EMA3))
{
chk=1;
Print("La posizione è possibile!");
}
if(chk==1)
{
if(EMA3-EMA2>2*Point && Bid>=(lo+MoveBack*Point))
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,
"EMA position:",16385,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL order open : ",OrderOpenPrice());
chk=0;
}
else
{
Print("Error opening SELL order : ",GetLastError());
return(0);
}
}
if(EMA2-EMA3>2*Point && Ask<=(hi-MoveBack*Point))
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,
"EMA position:",16385,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order open : ",OrderOpenPrice());
chk=0;
}
else
{
Print("Order BUY open error : ",GetLastError());
return(0);
}
}
}
return(0);
}
for(cnt=0;cnt<totale;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && // è una posizione aperta? OP_BUY o OP_SELL
OrderSymbol()==Symbol()) // lo strumento corrisponde?
{
if(OrderType()==OP_BUY) // posizione lunga aperta
{
// controlliamo se è già ora di chiudere?
if(Bid>=(OrderOpenPrice()+Pip*Point))
{
chk=0;
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // chiude la posizione
return(0); // esce
}
if(Bid<=(OrderOpenPrice()-SL*Point))
{
chk=0;
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // chiudere la posizione
return(0); // uscire
}
}
else // altrimenti questa è una posizione corta
{
// controllare se è già tempo di chiudere?
if(Ask<=(OrderOpenPrice()-Pip*Point))
{
chk=0;
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // chiudere la posizione
return(0); // uscire
}
if(Ask>=(OrderOpenPrice()+SL*Point))
{
chk=0;
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // chiude la posizione
return(0); // esce
}
}
}
}
return(0);
}
//+------------------------------------------------------------------+
 

Igor, ti ho fatto una domanda nella "Libreria di funzioni per lavorare con i file INI", ma non c'è stata risposta :(