[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate. Non posso andare da nessuna parte senza di te. - pagina 275

 

La domanda è.

Come ottenere un numero senza meno, se risulta che Open[1] < Close[1] e quando si sottrae Open[1]-Close[1] ottengo il valore con un meno, come fare che fosse sempre un valore positivo, ho bisogno di calcolare la distanza tra Open e Close forse c'è un altro modo?

Grazie.

 
Martingeil >> :

La domanda è.

Come ottenere un numero senza meno, se risulta che Open[1] < Close[1] e quando si sottrae Open[1]-Close[1] ottengo il valore con un meno, come fare che fosse sempre un valore positivo, ho bisogno di calcolare la distanza tra Open e Close forse c'è un altro modo?

>> Grazie.

https://docs.mql4.com/ru/math/MathAbs

 

;) >> Grazie!

 

Buona giornata!

Quando si scriveva un EA per MT4, c'era la necessità di determinare programmaticamente (cioè nel codice dell'EA stesso) se almeno un ordine di questo EA era aperto o meno. Potete consigliarmi se esiste una tale funzione? Forse, se c'è, sarebbe qualcosa del genere

Bool (è stato aperto un ordine EA con questo numero magico)

{risposta= Vero/Falso}

?

Esperti - aiuto per favore - ci stiamo già scervellando

P.S.- provato l'opzione con i numeri d'ordine - non ha funzionato

 
waitra >> :

Buona giornata!

Quando si scrive un EA per MT4, c'era la necessità di determinare programmaticamente (cioè nel codice dell'EA stesso) se almeno un ordine di questo EA era aperto o meno. Sapete se esiste una tale funzione?

Questa funzione funzionerà?

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru/                  |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество позиций.                                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++)                                    {
    if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES))      {
      if (OrderSymbol()== sy || sy=="")                   {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op)                   {
            if ( mn<0 || OrderMagicNumber()== mn) kp++;
          }}}}}
  return( kp);
}

Esempio d'uso: mettiamo questa funzione alla fine del nostro codice e la controlliamo quando apriamo una posizione:



if ( NumberOfPositions(NULL,OP_BUY, Magic)< 1) {
// если нет окрытых OP_BUY позиций с заданным магиком, покупаем
ticket=OrderSend(Symbol(),0, Lots,Ask, Slippage,Bid- SL*Point,
                      Ask+ TP*Point, NULL, Magic ,0,Blue);
                                              }

Se non cerchiamo posizioni ma ordini pendenti, possiamo usare questa funzione

Funzione NumberOfOrders().
Questa funzione restituisce il numero di ordini. Puoi limitare la lista degli ordini da controllare usando i parametri della funzione:
sy - Nome dello strumento. Se impostiamo questo parametro, 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.

https://www.mql5.com/ru/forum/107476/page12

 

Si prega di spiegare cosa forniscono i file:

#include <stdlib.mqh>
#include <stderror.mqh>

Se possibile, in qualche modo semplice.

Grazie.

 
Serbov писал(а) >>

Si prega di spiegare cosa forniscono i file:

Se possibile, in qualche modo semplice.

Grazie.

Si tratta dei cosiddetti "file di libreria". questi file immagazzinano funzioni di uso frequente. sono usati per evitare di caricare il sorgente. se il file di libreria è "dichiarato", le funzioni del file dichiarato possono essere usate come se fossero incluse nel sorgente.

 
Serbov >> :

Per favore, spiegate cosa ci danno i file:

Se possibile, per favore mantenetelo semplice.

Grazie.

Quando si usa (chiamando) una funzione da questi file (già inizialmente incorporati in mt4) noi, in caso di funzionamento errato dell'EA, possiamo vedere nel log il numero dell'errore che abbiamo fatto nel codice.

Per esempio, chiamiamo la funzione GetLastError() :

ticket= OrderSend(Symbol(),OP_BUY, lots,Ask,3, SL, TP,"Name_Expert", Magic,0, clOpenBuy );
   if( ticket < 0)
 {Print("Ошибка открытия ордера BUY #", GetLastError());  } 

In questo caso, se abbiamo fatto un errore nel codice o impostato parametri esterni errati, vedremo il numero di questo errore nel log.

Per esempio, 130.

E la decodifica del numero può essere trovata su -https://book.mql4.com/ru/appendix/errors

E non abbiamo bisogno di passare attraverso tutto il codice, perché sappiamo già dove si trova l'errore!

 
rid писал(а) >>

Questa funzione funzionerà?


Esempio di utilizzo: mettiamo la funzione stessa alla fine del codice (fuori dalla funzione START) e poi la controlliamo quando apriamo una posizione:



Se non cerchiamo posizioni ma ordini pendenti, possiamo usare

Funzione NumberOfOrders().
Questa funzione restituisce il numero di ordini. Puoi limitare la lista degli ordini da controllare usando i parametri della funzione:
sy - Nome dello strumento. Se si specifica questo parametro, 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.

https://www.mql5.com/ru/forum/107476/page12

Grazie mille per il suggerimento, abbiamo provato ma non ha funzionato, per favore controlla se c'è un errore da qualche parte nel codice:

bool Open_Buy()

{

   bool res=false;    


if( условие_1)        { 

       if ( NumberOfPositions(NULL, Magic)< 1) // если нет открытых позиций с заданным магиком

          { res=true; }}

else  

   {

    if( условие_1) 

       { 

       if ( NumberOfPositions(NULL, Magic)> 1) // если советник уже открывал позиции

       {

          if ( условие_2)              { 

             res=true; }

           } 

}}

return( res);

}

Se vogliamo controllare se c'è una condizione di Vendita o di Acquisto e non abbiamo aperto o chiuso un ordine, in questo caso, solo la prima condizione funzionerà. E se l'EA ha già aperto ordini in passato, allora, quando viene aperto un ordine, la prima + la seconda condizione dovrebbero scattare.

Ho dato un'occhiata al link fornito da te, forse ExistOrders(); è più adatto?

(ma onestamente non riuscivo a collocarlo, dato che a quanto pare mi manca l'abilità per il momento).

 

Non avete chiamato la funzione correttamente.

La vostra funzione si chiama così: se (NumberOfPositions(NULL,Magic)> 1)

Dovrebbe apparire così:

if( условие_1)        { 

       if ( NumberOfPositions(NULL,-1, Magic)< 1) 
// если нет открытых позиций с заданным магиком

          { res=true; }}

Sentite la differenza (avete lasciato fuori "-1") ! e RICEVETE IL VOSTRO CODICE.

Per controllarlo, potete stampare un commento sul grafico. Per esempio, così (all'inizio della funzione START).

Comment ("Количество текущих открытых советником позций = ",
                                  NumberOfPositions(NULL,-1,Magic)  );
Magic_2=Magic*3;
Per quanto riguarda la tua seconda condizione, io ("senza pensarci troppo") imposterei un mago diverso e una funzione separata Open_Buy_2() per aprire le posizioni dalla seconda condizione !

Il codice della seconda condizione sarebbe come questo

 if ( условие_2)                          { 
  if ( NumberOfPositions(NULL,-1, Magic)== 1)   {
    if ( NumberOfPositions(NULL,-1, Magic_2)< 1) { 
..... ..... 
Motivazione: