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

 
EVGENII SHELIPOV #:

Buona giornata!!!

Per favore aiutatemi a scrivere il codice per chiudere gli ordini min e max in una griglia EA quando viene raggiunto un certo livello di drawdown

Ho scritto due funzioni per calcolare il profitto degli ordini max e min

Ho anche scritto una funzione che calcola l'importo di questi ordini. Sembra che non ci siano problemi qui.

La domanda è come chiudere solo questi due ordini, ho trovato la funzione ClosseAll().

La domanda è come cambiare la funzione OrderTicket() che chiude tutti gli ordini

allegare le variabili max_ticket e min_ticket che determinano i biglietti dei soli ordini min e max nella griglia

O TU hai la TUA soluzione a questo problema

void ClosseAll()
{
  int slip = MarketInfo(_Symbol,MODE_SPREAD)*2;
  for(int i = OrdersTotal()-1; i>=0; i--)
  {
     if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
     {
      if (OrderClose(max_ticket , OrderLots(), Bid, slip)&&OrderClose(min_ticket , OrderLots(), Bid, slip))
            Print("OK");
      else
            Print("Не удалось закрыть ордер! ",GetLastError());
     }
  }
}

e sistemarlo.

if(OrderTicket() > max_ticket) max_ticket = OrderTicket();
 
makssub #:

Scusa, sto scrivendo di nuovo male. Lasciami provare di nuovo)

C'è una griglia di ordini aperti. Ho bisogno di trovare il prezzo di apertura (OrderOpenPrice) dell'ordine più vicino al prezzo corrente. Per continuare a costruire la griglia, ma i miei ordini sono costruiti quasi caoticamente.

Capisco come scrivere il superamento, ma non sono in grado di esprimerlo correttamente nella lingua (sono come un cane, capisco tutto)).

Se avete esempi o link ad esempi, postateli, per favore. MQL4

in un ciclo:

if (MathAbs(OrderOpenPrice()-Bid)<previous_value)
   {
   previous_value=MathAbs(OrderOpenPrice()-Bid);
   nearest_order=OrderTicket();
   }

prima del ciclo inizializzare precedente_valore=DBL_MAX a nearest_order=0

 
PapaYozh #:

A proposito, in cosa è diverso, a parte il fatto che viene chiamato implicitamente quando l'oggetto viene creato?

e in più quando lo chiami nel costruttore non c'è ancora memoria allocata, non compila:

class A
{
public:
   int               val;
                     A() {}
};
//+------------------------------------------------------------------ +
class B
{
public:
   A                 a;
                     B():a(),a.val(10) {} //
};

ma nel corpo del costruttore, nessun problema:

class A
{
public:
   int               val;
                     A() {}
};
//+------------------------------------------------------------------ +
class B
{
public:
   A                 a;
                     B():a() {a.val=10;}
};



sui costruttori di classi base - possono essere chiamati esplicitamente:

class A
{
public:
   int               val;
                     A(const int v): val(v) {}
                     A() {}
};
//+------------------------------------------------------------------ +
class B: public A
{
public:
                     B(): A(100) {}
};
 
MakarFX #:

Sistemate anche questo.

A proposito dello slittamento che ho già all'inizio del consigliere

MakarFX #:

e risolvere il problema.

MakarFX #:

fissare questo

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init() 
{
   Spread = MarketInfo(Symbol(), MODE_SPREAD) * Point;
   MinLot = MarketInfo(Symbol(),MODE_MINLOT);
   return (0);
}

Solo gli ordini massimi sono chiusi secondo i risultati di chiusura


 
Taras Slobodyanik #:

nel ciclo:

inizializzare previous_value=DBL_MAX a nearest_order=0 prima del ciclo

MakarFX #:

e correggere questo

MakarFX #:

e risolvere il problema.

Per gli errori nel registro


 
Buon pomeriggio Qualcuno ha sentito parlare di MirachLtd-Real, qualcuno ha qualche feedback?

 
EVGENII SHELIPOV #:

A proposito dello slippage che ho già all'inizio dell'EA

Questo slippage è esattamente per questa funzione...così non dovete passare attraverso BUY o SELL

//--- global parameters
int max_ticket = 0;
int min_ticket = INT_MAX;
//+----------------------------------------------------------------------------+
void ClosseAll()
{
  int slipp = MarketInfo(_Symbol,MODE_SPREAD)*2;
  for(int i = OrdersTotal()-1; i>=0; i--)
  {
     if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
     {
      if (OrderClose(max_ticket , OrderLots(), Bid, slipp)&&OrderClose(min_ticket , OrderLots(), Bid, slipp))
            Print("OK");
      else
            Print("Не удалось закрыть ордер! ",GetLastError());
     }
  }
}
//+----------------------------------------------------------------------------+
//| Расчет профита максимального ордера в сетке                                |
//+----------------------------------------------------------------------------+
double GetProfitMaxOrder()
{
   double max_ticket_profit = 0 ;
      {
      for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
         {
         if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
            {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               {
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                  {
                  if(OrderTicket() > max_ticket) 
                     {
                     max_ticket = OrderTicket();
                     max_ticket_profit =  OrderProfit();
                     }
                  }
               }
            }
         }
      }
   return( max_ticket_profit);
}
//+----------------------------------------------------------------------------+
//| Расчет профита минимального ордера в сетке                                 |
//+----------------------------------------------------------------------------+
double GetProfitMinOrder()
{
   double min_ticket_profit = 0;
      {
      for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
         {
         if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
            {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) 
               {
               if (OrderType() == OP_BUY || OrderType() == OP_SELL)
                  {
                  if(OrderTicket() < min_ticket)
                     {
                     min_ticket = OrderTicket();
                     min_ticket_profit = OrderProfit(); 
                     }
                  }
               }
            }
         }
      }
   return(min_ticket_profit);
 
Come è meglio creare un oggetto di classe: dopo la descrizione della classe o localmente, per esempio in OnTick()? La seconda opzione non è probabilmente molto economica: carico di CPU e RAM.
 
MakarFX #:

Questo slippage è solo per questa funzione...così non dovete passare attraverso BUY o SELL

int slipp = MarketInfo(_Symbol,MODE_SPREAD)*2;

Non c'è bisogno di moltiplicare per un punto qui

possibile perdita di dati dovuta alla conversione del tipo NEVALASHKA.mq4 376 13

Ricevo un avvertimento in fase di compilazione


 
EVGENII SHELIPOV #:

Non c'è bisogno di moltiplicare per un punto

possibile perdita di dati dovuta alla conversione del tipo NEVALASHKA.mq4 376 13

Ricevo un avvertimento in fase di compilazione


Non moltiplicare MODE_SPREAD - Spread in pip

puoi controllare

   Print(MarketInfo(_Symbol,MODE_SPREAD)," / ",MarketInfo(_Symbol,MODE_SPREAD)*Point);

e fare così

int slipp = (int) MarketInfo(_Symbol,MODE_SPREAD)*2;