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

 
rid >> :

Quando si usano (chiamano) funzioni da questi file (già implementate in mt4), 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() :

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 sulla pagina -https://book.mql4.com/ru/appendix/errors

E non dovremo cercare in tutto il codice, perché sappiamo già da questo numero - dove è stato fatto esattamente l'errore!

Permettetemi di correggere un po': la funzione GetLastError può essere chiamata senza il file di intestazione, ma per ottenere la descrizione dell'errore senza navigare nei siti dovreste collegare la libreria:

#include <stderr.mqh>
#include <stdlib.mqh>

...
Print("Ошибка открытия ордера BUY #", ErrorDescription(GetLastError()));
...
 
rid писал(а) >>

Non avete chiamato la funzione correttamente.

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

Dovrebbe apparire così:


Sentite la differenza (avete mancato il "-1")! e CAMBIATE IL VOSTRO CODICE.

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

Per quanto riguarda la tua seconda condizione, io ("senza pensare in modo intelligente") 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

rid,

Capisco anche perché la seconda condizione non funziona, forse ho spiegato male il problema:

Voglio che il mio EA sia in grado di controllare se gli ordini sono stati aperti da lui o no, anche se sono stati chiusi molto tempo fa. NumberOfPositions funziona, ma conta solo il numero di posizioni aperte. (ecco perché non funziona)

Nel codice del mio EA, c'è uno script che apre ogni posizione successiva tenendo conto dei dati della posizione precedente e se non c'era una posizione precedente, il primo ordine dovrebbe essere aperto senza questa condizione (altrimenti, l'EA non parte). Pertanto, ci dovrebbe essere una funzione che capisce se almeno un ordine di questo EA è stato aperto o meno (anche se l'ordine è stato poi chiuso). Se non c'è stato ancora nessun ordine (l'inizio del lavoro), allora il primo ordine viene aperto senza considerare la seconda condizione, e tutti gli ordini successivi vengono aperti considerando la seconda condizione, cioè usando i dati degli ordini precedenti.

È possibile modificare la funzione in questo modo?

 

Per favore, ditemi cosa mostra la funzione iTime.

Che cos'è questa baggianata di 10 cifre? Secondi?

Come si tradurrebbe in anno-mese-giorno-ora-minuti?

 

Capisco. Potete determinare se le posizioni sono state nella storia in questo modo:

  for (int i=0; i< OrdersTotal(); i++)                          {
    if (!(OrderSelect( i, SELECT_BY_POS, MODE_HISTORY ))) continue;
//выбираем из истории счета
    if (OrderSymbol() != Symbol()) continue;    
     if ( OrderMagicNumber()== Magic)                            {
              позиции = true;
                                                             }}
                  



Ma allora il vostro codice funzionerà solo in tester. Perché altrimenti dovrete cambiare il magik ogni volta che accendete l'EA online.

A quanto pare, è necessario impostare il tempo per il quale viene presa la storia dell'account.

Cioè, quando è stato aperto/chiuso l'ultimo scambio con il dato magik? Era sei mesi fa o 24 ore fa?

Ci sono funzioni che restituiscono il numero di barra (contando dalla barra corrente fino al fondo della storia) dell'ultimo trade aperto o chiuso.


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

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

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

  if ( sy=="" || sy=="0") sy=Symbol();
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()== sy) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op) {
            if ( mn<0 || OrderMagicNumber()== mn) {
              if ( t<OrderCloseTime()) t=OrderCloseTime();
            } } }} }  }  return(iBarShift( sy, tf, t, True));}

Per darvi un esempio. Ho usato queste funzioni nel mio codice in questo modo:
//======================================================================
// запретить торговлю - в день , если с начала текущих суток
//уже были открыты или закрыты позиции с заданным магиком
if ( NumberOfBarOpenLastPos(NULL, 1440,-1, Magic)==0 
     ||  NumberOfBarCloseLastPos(NULL, 1440,-1, Magic)==0 )
    Trade=false;       else Trade=true;
//================================================================

O come questo:
//======================================================================
// запрет торговли  , если за последние 85 баров графика Н1
//т.е. за посл.85 часов)уже были открыты   позиции  или
// закрыты позиции с заданным магиком
if ( NumberOfBarOpenLastPos(NULL, 60,-1, Magic)<=85 
     ||  NumberOfBarCloseLastPos(NULL,60,-1, Magic)<=85 )
    Trade=false;       else Trade=true;
 
Signori, aiuto! Come scrivere correttamente il codice per visualizzare un messaggio che l'ultima candela chiusa è bianca (su) o nera (giù). So che non ha senso, ma ancora .....

 

alle prese con lo stesso semplice problema... apre un mare di posizioni ma ne serve solo 1 al massimo e quando l'acquisto si chiude e arriva un segnale per aprire la vendita... Grande richiesta di suggerimento e correzione di ciò che è sbagliato nel codice qui sotto... Dove devo prescrivere un magik? Se non ti dispiace, fai un esempio stupido, quando compri incroci verso l'alto (non più di 1 ordine) e vendi verso il basso anch'esso non più di 1. Penso che questo risolverà immediatamente le domande di molti neofiti. Grazie in anticipo.

//---- input parameters
extern int       Ema1=14;
extern int       Ema2=48;
double Ema_1;
double Ema_2;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   int Orders = OrdersTotal(); 
   Ema_1 =iMA(NULL, 0, Ema1, 0,MODE_SMMA, PRICE_MEDIAN, 0);
   Ema_2 =iMA(NULL, 0, Ema2, 0,MODE_SMMA, PRICE_MEDIAN, 0);
   
   int ticket;
  if ( NumberOfPositions(NULL,OP_BUY)< 1 && Ema_1> Ema_2) 
    {
      ticket=OrderSend(Symbol(),OP_BUY,0.5,Ask,10,Ask-850*Point,Ask+550*Point,"kupil",16384,0,Green);
    } 
   if ( NumberOfPositions(NULL,OP_BUY)< 1 && Ema_1< Ema_2) 
    {
      ticket=OrderSend(Symbol(),OP_SELL,0.5,Bid,10,Ask+850*Point,Bid-550*Point,"kupil",16384,0,Green);
    } 
   return(0);
  }

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);
}
 

Un'altra domanda stupida:

- Come dichiarare un array il cui numero di elementi è dato da una variabile esterna.

 
chaynik_1 >> :
Signori, aiuto! Come scrivere correttamente il codice per visualizzare un messaggio che l'ultima candela chiusa è bianca (su) o nera (giù). So che non ha senso, ma ancora .....

È così.

if ((Open[1]-Close[1])<0  ) Comment ("1 свеча =  бычья");
 
alderru >> :

Un'altra domanda stupida:

- Come dichiarare un array il cui numero di elementi è dato da una variabile esterna.

https://docs.mql4.com/ru/array/ArrayResize

 
morok >> :

alle prese con lo stesso semplice problema... apre un mare di posizioni ma ne serve solo 1 al massimo e quando l'acquisto si chiude e arriva un segnale per aprire la vendita... Grande richiesta di suggerimento e correzione di ciò che è sbagliato nel codice qui sotto... Dove devo prescrivere un magik? Se non ti dispiace, fai un esempio stupido, quando compri incroci verso l'alto (non più di 1 ordine) e vendi verso il basso anch'esso non più di 1. Penso che questo risolverà immediatamente le domande di molti neofiti. Grazie in anticipo.

Prova così:

(dovete essere più attenti con NumberOfPositions(), è scritto nell'intestazione per una ragione:

/| Descrizione : | Descrizione : Restituisce il numero di posizioni.
//| Parametri: |
//| sy - nome dello strumento ("" o NULL - simbolo corrente) |
|| op - operazione ( -1 - qualsiasi posizione) |
//| mn - MagicNumber ( -1 - qualsiasi numero magico) |
//+----------------------------------------------------------------------------+

extern int       Magic=5675;
extern int       Ema1=14;
extern int       Ema2=48;
double Ema_1;
double Ema_2;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   //int Orders = OrdersTotal(); 
   Ema_1 =iMA(NULL, 0, Ema1, 0,MODE_SMMA, PRICE_MEDIAN, 0);
   Ema_2 =iMA(NULL, 0, Ema2, 0,MODE_SMMA, PRICE_MEDIAN, 0);   
   int ticket;
//------------------------------------------------
 if ( NumberOfPositions(NULL,OP_BUY, Magic)< 1 && Ema_1> Ema_2) 
    {
      ticket=OrderSend(Symbol(),OP_BUY,0.5,Ask,10,Ask-850*Point,Ask+550*Point,"kupil",16384,0,Green);
    } 
//------------------------------------------------------
   if ( NumberOfPositions(NULL,OP_SELL, Magic)< 1 && Ema_1< Ema_2) 
    {
      ticket=OrderSend(Symbol(),OP_SELL,0.5,Bid,10,Ask+850*Point,Bid-550*Point,"kupil",16384,0,Green);
    } 
//------------------------------------------------------
   return(0);
  }

//жжжжжжжжж Пользовательские функции жжжжжжж

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);
}
Motivazione: