Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1098

 

Hmm, strana situazione, come l'attività nel topic che ho sollevato, avevo una domanda, dal mio punto di vista specifica, ma invece di una risposta finora ho ottenuto "perché ti serve?

Voglio farlo con SB CTrade, ecco un esempio (compilato da 2 miei esempi): apriamo ogninuova barra a 9 TF con un ordine, memorizziamo il biglietto e determiniamo la direzione di un ordine chiuso dal numero del biglietto.

In MQL4, il codice per il tester sarebbe come questo

//+------------------------------------------------------------------+
//|                                                        tst__.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
input int TP = 100;
input int SL = 100;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CNewbar
  {
private:
   datetime          mnewtime;
   ENUM_TIMEFRAMES   mperiod;
public:
                     CNewbar()                        { mperiod=PERIOD_CURRENT;  mnewtime=TimeCurrent(); }
                     CNewbar(ENUM_TIMEFRAMES period)  { mperiod=period;          mnewtime=TimeCurrent(); }
   bool              NewBar(){ datetime t=iTime(NULL,mperiod,0); if(mnewtime<t){ mnewtime=t; return(true); } return(false);  }
  };

ENUM_TIMEFRAMES  TF[9]={PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1,PERIOD_W1,PERIOD_MN1};
CNewbar *BAR[9];
int ticket[9];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   for(int i=0;i<9;i++) BAR[i]=new CNewbar(TF[i]);
   ArrayInitialize(ticket,-1);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   for(int i=0;i<9;i++) delete BAR[i];
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   for(int i=0;i<9;i++)
      if(BAR[i].NewBar())
        {
         if(ticket[i]<0) ticket[i]=OrderSend(_Symbol,OP_BUY,0.1,Ask,30,Ask-SL*_Point,Ask+TP*_Point);
         if(OrderSelect(ticket[i],SELECT_BY_TICKET) && OrderCloseTime()>0)
           {
            int cmd=1-OrderType();
            double open=cmd ? Bid : Ask;
            double tp = open - (cmd ? 1 : -1) * TP * _Point;
            double sl = open + (cmd ? 1 : -1) * SL * _Point;
            ticket[i]=OrderSend(_Symbol,cmd,0.1,open,30,sl,tp);
           }
        }
  }

abbiamo bisogno di un codice per il tester, cioè il numero minimo di controlli e il lavoro più veloce possibile nell'ottimizzatore.

come scrivere questo codice in MQL5 con SB CTrade?

 
Igor Makanu:

Hmm, strana situazione, come l'attività nel topic che ho sollevato, avevo una domanda, dal mio punto di vista specifica, ma invece di una risposta finora ho ottenuto "perché ti serve?

Voglio farlo con SB CTrade, ecco un esempio (compilato da 2 miei esempi): apriamo ogni nuova barra a 9 TF con un ordine, memorizziamo il biglietto e determiniamo la direzione di un ordine chiuso dal numero del biglietto.

In MQL4, il codice per il tester sarebbe come questo

come scrivere questo codice in MQL5 usando SB CTrade?

Forum sul trading, sistemi di trading automatico e test di strategia

FAQ da principianti MQL5 MT5 MetaTrader 5

Vladimir Karputov, 2019.07.21 12:56

Quindi, la base è ilPOSITION_IDENTIFIER, ma non il biglietto di posizione. È importante solo per la rete:

IDENTIFICATORE DI POSIZIONE

L'identificatore di posizione è un numero unico, che viene assegnato ad ogni posizione appena aperta e non cambia durante la sua vita. Corrisponde al ticket dell'ordine con cui è stata aperta la posizione.

L'identificatore di posizione è specificato in ogni ordine (ORDER_POSITION_ID) e ogni trade (DEAL_POSITION_ID) che lo ha aperto, modificato o chiuso. Usa questa proprietà per cercare ordini e compravendite relative alla posizione.

Quando una posizione viene invertita in modalità netting (una singola operazione in/out), l'identificatore POSITION_IDENTIFIER della posizione non viene cambiato. Tuttavia, POSITION_TICKET è cambiato al biglietto d'ordine che ha portato all'inversione. Nella modalità di copertura non c'è inversione di posizione.

lungo


Quindi, dobbiamo tenere traccia dell'identificatore di posizione (POSITION_IDENTIFIER).


Ora, un compito più preciso: alla prima esecuzione, apriamo una POSIZIONE DI ACQUISTO e la memorizziamo (ATTENZIONE: dovremmo memorizzare l'ID della posizione, non il biglietto). Se la posizione è stata chiusa, apriamo una posizione opposta: ad esempio una volta c'era una posizione BUY, poi è stata chiusa, il che significa che apriamo subito una posizione SELL.


Ora sarà molto più facile risolvere il problema.


 
Vladimir Karputov:

cioè CTrade non sa come rilevare indipendentemente se un ordine è aperto o chiuso, quale era il tipo dell'ultimo ordine chiuso?

quale libreria dovrei usare per questo scopo?

 
Igor Makanu:

cioè CTrade non sa come rilevare indipendentemente se un ordine è aperto o chiuso, quale era il tipo dell'ultimo ordine chiuso?

Quale biblioteca dovremmo usare per questo scopo?

Te l'ho già detto un centinaio di volte, quindi per favore elimina la parola "ordine" dal tuo vocabolario. Finché non lo farai, non sarai in grado di andare avanti. Comunque, probabilmente non sarò in grado di aiutarti. Che peccato.

 
Vladimir Karputov:

Beh, te l'ho detto un centinaio di volte: elimina la parola 'mandato' dal tuo vocabolario. Finché non lo fai, non puoi andare avanti. Comunque, probabilmente non posso aiutarti. Che peccato.

Bene, ditemi cosa intendete con questo:

GN      0       16:24:14.030    Core 1  2018.06.06 08:00:00   Sell market. Ticket = 20
JF      0       16:24:14.030    Core 1  2018.06.06 08:00:00   Sell market. Identifier = 0
FQ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   ======closePosition======
HG      0       16:24:14.030    Core 1  2018.06.19 16:00:00   market buy 0.10 AUDUSD, close #20 (0.73633 / 0.73637 / 0.73633)
PH      0       16:24:14.030    Core 1  2018.06.19 16:00:00   deal #21  buy 0.10 AUDUSD at 0.73637 done (based on order #21)
 KJ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   deal performed [#21  buy 0.10 AUDUSD at 0.73637]
IL      0       16:24:14.030    Core 1  2018.06.19 16:00:00   order performed buy 0.10 at 0.73637 [#21  buy 0.10 AUDUSD at 0.73637]
RN      0       16:24:14.030    Core 1  2018.06.19 16:00:00   CTrade::OrderSend: market buy 0.10 position #20  AUDUSD [done at 0.73637]
HN      0       16:24:14.030    Core 1  2018.06.19 16:00:00   Позиция с магиком 2544113114312914, тикетом 20 и лотом 0.1 успешно закрыта.
LO      0       16:24:14.030    Core 1  2018.06.19 16:00:00   Очистка данных произведена.
CH      0       16:24:14.030    Core 1  2018.06.19 16:00:00   ======checkMargin======
OF      0       16:24:14.030    Core 1  2018.06.19 16:00:00   market buy 0.10 AUDUSD (0.73633 / 0.73637 / 0.73633)
DS      0       16:24:14.030    Core 1  2018.06.19 16:00:00   deal #22  buy 0.10 AUDUSD at 0.73637 done (based on order #22)
 RM      0       16:24:14.030    Core 1  2018.06.19 16:00:00   deal performed [#22  buy 0.10 AUDUSD at 0.73637]
DS      0       16:24:14.030    Core 1  2018.06.19 16:00:00   order performed buy 0.10 at 0.73637 [#22  buy 0.10 AUDUSD at 0.73637]
FF      0       16:24:14.030    Core 1  2018.06.19 16:00:00   CTrade::OrderSend: market buy 0.10 AUDUSD [done at 0.73637]
MJ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   magic = 2544113114312914
RR      0       16:24:14.030    Core 1  2018.06.19 16:00:00   balance = 11308.94
JK      0       16:24:14.030    Core 1  2018.06.19 16:00:00   lot = 0.10
HQ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   Buy market. Ticket = 22
CJ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   Buy market. Identifier = 20
HR      0       16:24:14.030    Core 1  2018.07.04 08:00:00   ======closePosition======
FI      0       16:24:14.030    Core 1  2018.07.04 08:00:00   market sell 0.10 AUDUSD, close #22 (0.74021 / 0.74025 / 0.74021)
RF      0       16:24:14.030    Core 1  2018.07.04 08:00:00   deal #23  sell 0.10 AUDUSD at 0.74021 done (based on order #23)
 ID      0       16:24:14.030    Core 1  2018.07.04 08:00:00   deal performed [#23  sell 0.10 AUDUSD at 0.74021]
GM      0       16:24:14.030    Core 1  2018.07.04 08:00:00   order performed sell 0.10 at 0.74021 [#23  sell 0.10 AUDUSD at 0.74021]
NQ      0       16:24:14.030    Core 1  2018.07.04 08:00:00   CTrade::OrderSend: market sell 0.10 position #22  AUDUSD [done at 0.74021]
PO      0       16:24:14.030    Core 1  2018.07.04 08:00:00   Позиция с магиком 2544113114312914, тикетом 22 и лотом 0.1 успешно закрыта.
FO      0       16:24:14.030    Core 1  2018.07.04 08:00:00   Очистка данных произведена.
CH      0       16:24:14.030    Core 1  2018.07.04 08:00:00   ======checkMargin======
OI      0       16:24:14.030    Core 1  2018.07.04 08:00:00   market sell 0.10 AUDUSD (0.74021 / 0.74025 / 0.74021)
JO      0       16:24:14.030    Core 1  2018.07.04 08:00:00   deal #24  sell 0.10 AUDUSD at 0.74021 done (based on order #24)
 LM      0       16:24:14.030    Core 1  2018.07.04 08:00:00   deal performed [#24  sell 0.10 AUDUSD at 0.74021]
ND      0       16:24:14.030    Core 1  2018.07.04 08:00:00   order performed sell 0.10 at 0.74021 [#24  sell 0.10 AUDUSD at 0.74021]
LI      0       16:24:14.030    Core 1  2018.07.04 08:00:00   CTrade::OrderSend: market sell 0.10 AUDUSD [done at 0.74021]
OJ      0       16:24:14.030    Core 1  2018.07.04 08:00:00   magic = 2544113114312914
RR      0       16:24:14.030    Core 1  2018.07.04 08:00:00   balance = 11335.85
DK      0       16:24:14.030    Core 1  2018.07.04 08:00:00   lot = 0.10
PN      0       16:24:14.030    Core 1  2018.07.04 08:00:00   Sell market. Ticket = 24
QE      0       16:24:14.030    Core 1  2018.07.04 08:00:00   Sell market. Identifier = 22
NR      0       16:24:14.030    Core 1  2018.07.19 00:00:00   ======closePosition======
NF      0       16:24:14.030    Core 1  2018.07.19 00:00:00   market buy 0.10 AUDUSD, close #24 (0.73968 / 0.73989 / 0.73968)
JI      0       16:24:14.030    Core 1  2018.07.19 00:00:00   deal #25  buy 0.10 AUDUSD at 0.73989 done (based on order #25)
 QK      0       16:24:14.030    Core 1  2018.07.19 00:00:00   deal performed [#25  buy 0.10 AUDUSD at 0.73989]
MM      0       16:24:14.030    Core 1  2018.07.19 00:00:00   order performed buy 0.10 at 0.73989 [#25  buy 0.10 AUDUSD at 0.73989]
PN      0       16:24:14.030    Core 1  2018.07.19 00:00:00   CTrade::OrderSend: market buy 0.10 position #24  AUDUSD [done at 0.73989]
DO      0       16:24:14.030    Core 1  2018.07.19 00:00:00   Позиция с магиком 2544113114312914, тикетом 24 и лотом 0.1 успешно закрыта.
LP      0       16:24:14.030    Core 1  2018.07.19 00:00:00   Очистка данных произведена.
KK      0       16:24:14.030    Core 1  2018.08.08 16:00:00   ======checkMargin======
RI      0       16:24:14.030    Core 1  2018.08.08 16:00:00   market sell 0.10 AUDUSD (0.73933 / 0.73937 / 0.73933)
GO      0       16:24:14.030    Core 1  2018.08.08 16:00:00   deal #26  sell 0.10 AUDUSD at 0.73933 done (based on order #26)
 OM      0       16:24:14.030    Core 1  2018.08.08 16:00:00   deal performed [#26  sell 0.10 AUDUSD at 0.73933]
JD      0       16:24:14.030    Core 1  2018.08.08 16:00:00   order performed sell 0.10 at 0.73933 [#26  sell 0.10 AUDUSD at 0.73933]
QI      0       16:24:14.030    Core 1  2018.08.08 16:00:00   CTrade::OrderSend: market sell 0.10 AUDUSD [done at 0.73933]
HN      0       16:24:14.030    Core 1  2018.08.08 16:00:00   Sell market. Ticket = 26
CF      0       16:24:14.030    Core 1  2018.08.08 16:00:00   Sell market. Identifier = 0
 
Vladimir Karputov:

Beh, te l'ho detto un centinaio di volte: elimina la parola 'mandato' dal tuo vocabolario. Finché non lo fai, non puoi andare avanti. Comunque, probabilmente non posso aiutarti. Che peccato.

Ok, lasciami riformulare la domanda:

Come si usa un biglietto memorizzato con CTrade::ResultOrder()

per scoprirlo:

1. se la posizione è chiusa?

2. che tipo di accordo aveva la posizione chiusa?

3. dobbiamo gestire simultaneamente 9 posizioni, ordini o biglietti, o ... OnAnyTerminology su un conto di copertura


in questa formulazione la mia domanda non è ambigua? (esempio riproducibile sotto MQl4 postato sopra)

ZS: Non posso dimenticare l'ordine delle parole, purtroppo questa parola è usata nell'aiuto insieme ad altri termini:https://www.mql5.com/ru/docs/standardlibrary/tradeclasses/ctrade/ctraderequestorder

 
Igor Makanu:

Hm, è una situazione strana, mi sembrava di aver sollevato l'argomento, la mia domanda era specifica dal mio punto di vista, ma invece di una risposta ho ottenuto "perché ti serve?

La ragione è l'incompetenza di chi risponde. Ho impiegato cinque minuti per scriverlo e un tentativo per controllarlo.


MT4

Forum sul trading, sistemi di trading automatico e tester di strategie

Domande dai principianti MQL5 MT5 MetaTrader 5

fxsaber, 2019.07.21 12:54

void OnTick()
  {
   static int ticket1 = -1;
   
   if(ticket1<0) ticket1=OrderSend(_Symbol,OP_BUY,0.1,Ask,30,Ask-100*_Point,Ask+100*_Point);

   if(OrderSelect(ticket1,SELECT_BY_TICKET) && OrderCloseTime())
    {
     int cmd=1-OrderType();
     double open = cmd ? Bid : Ask;
     double tp = open - (cmd ? 1 : -1) * 100 * _Point;
     double sl = open + (cmd ? 1 : -1) * 100 * _Point;
     ticket1=OrderSend(_Symbol,cmd,0.1,open,30,sl,tp);
    }
  }


MT5

#include <Trade\Trade.mqh>

#define  Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnTick()
{
  static CTrade Trade; // Не стал возиться с Deviation.
  static ulong ticket1 = 0;
 
  if (!ticket1)
    ticket1 = Trade.PositionOpen(_Symbol, ORDER_TYPE_BUY, 0.1, Ask, Ask - 100 * _Point, Ask + 100 * _Point) ? Trade.ResultOrder() : 0;
  else if (!PositionSelectByTicket(ticket1) && HistorySelectByPosition(ticket1))
  {
    ENUM_ORDER_TYPE cmd = (ENUM_ORDER_TYPE)HistoryOrderGetInteger(HistoryOrderGetTicket(HistoryOrdersTotal() - 1), ORDER_TYPE);
    double open = cmd ? Bid : Ask;
    double tp = open - (cmd ? 1 : -1) * 100 * _Point;
    double sl = open + (cmd ? 1 : -1) * 100 * _Point;
    ticket1 = Trade.PositionOpen(_Symbol, cmd, 0.1, open, sl, tp) ? Trade.ResultOrder() : 0;
  }
}


Non c'è bisogno di essere un forte esperto per scrivere questo, basta conoscere le basi di MT5.


ZS Sulle reti c'è una piccola sfumatura nel determinare il tipo di posizione chiusa. Ma qui non gioca un ruolo.

 
fxsaber:

Non è necessario essere forti per scrivere questo, basta conoscere le basi di MT5.

Grazie!

Sì, stavo cercando una soluzione se non potevo scriverlo in cinque righe con SB

Ma quanto ho capito, che un solo SB CTrade non sarà in grado di risolvere il mio problema? E devo usare anche CPositionInfo? - Se voglio accompagnare 9 posizioni di diversi TF allo stesso tempo?

ZS: sono seduto nell'aiuto MQL5 con smart TV - abbastanza ben descritto funzioni commerciali, l'uso di SatB è sotto una domanda .... Penso che abbia senso usare SB per strategie primitive, un po' più complicate - la funzionalità è insufficiente o non è ovvio usare, forse ho bisogno di più pratica - proverò a "torcere" il SB


Grazie ancora!

 
fxsaber:

Il motivo è l'incompetenza così risposto. Ho impiegato cinque minuti per scrivere e un tentativo per controllare.


MT4


MT5


Non c'è bisogno di essere un forte esperto per scrivere questo, basta conoscere le basi di MT5.


Non è necessario conoscere le basi, basta conoscere le basi di MT5. Ma qui non ha importanza.

Qui è dove

ENUM_ORDER_TYPE cmd = (ENUM_ORDER_TYPE)HistoryOrderGetInteger(HistoryOrderGetTicket(HistoryOrdersTotal() - 1), ORDER_TYPE);

c'è una potenziale insidia.

Nella lista storica i warrant non sono disposti nell'ordine in cui appaiono in quella lista. Mi sono imbattuto in questo durante lo sviluppo della biblioteca. Ci ho fatto affidamento. Ma si è rivelato che non è così semplice. Prova a impostare gli ordini limite e stop a turno nel seguente ordine: limite -> stop -> limite -> stop -> limite -> stop e cancella ciascuno in qualsiasi ordine e vedi quale ordine è l'ultimo registrato nella lista della storia. Sarete sorpresi.

 
Artyom Trishkin:

Qui è dove

c'è un potenziale errore.

Nella lista della cronologia, gli ordini non sono disposti nell'ordine in cui appaiono nella lista. Mi sono imbattuto in questo durante lo sviluppo della libreria. Ci ho fatto affidamento. Ma si è rivelato che non è così semplice. Prova a impostare gli ordini limite e stop a turno nel seguente ordine: limite -> stop -> limite -> stop -> limite -> stop e cancella ciascuno in qualsiasi ordine e vedi quale ordine è l'ultimo registrato nella lista della storia. Sarete sorpresi.

Non c'è nessun errore, poiché la lista è generata attraverso HistorySelectByPosition.