Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1097

 
Vladimir Karputov:

Dopo l'esecuzione di un ordine di compravendita, appare una POSIZIONE, non un ORDINE!

Ci sono dei server dove si può riprodurre una tale situazione

PositionGetTicket(0) = 73401069 
PositionSelect(_Symbol) = true 
OrderGetTicket(0) = 73401069 
PositionsTotal() = 1
OrdersTotal() = 1, ORDER_STATE_STARTED


Cioè abbiamo il seguente ordine nel terminale allo stesso tempo

#73401069 2019.06.08 21:42:42 buy 1.00 BO Volatility 100 Index 0.5150 0.0000 0.0000 0.5150 0.00 0.00 0.00 Hello! 0


e la stessa posizione da esso

#73401069 2019.06.08 21:42:42 buy 1.00 BO Volatility 100 Index 0.5150 0.0000 0.0000 0.5150 0.00 0.00 0.00 Hello! 0
 
Vladimir Karputov:

Quindi prima descrivi a parole cosa stai facendo e cosa vuoi ottenere. Usa "BUY trade order" e "SELL trade order" invece di ORDER. Il risultato è una "posizione BUY" o una "posizione SELL".

OK, semplifichiamo la nostra discussione con esempi in codice. Ecco il codice scritto in MQL4 - sono interessato alla versione tester, cioè ai controlli minimi, ecc:

//+------------------------------------------------------------------+
//|                                                        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

int ticket1=-1;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ticket1=-1;
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(ticket1<0) ticket1=OrderSend(_Symbol,OP_BUY,0.1,Ask,30,NormalizeDouble(Ask-100*_Point,_Digits),NormalizeDouble(Ask+100*_Point,_Digits));

   if(OrderSelect(ticket1,SELECT_BY_TICKET))
     {
      if(OrderCloseTime()>0)
        {
         int cmd=OrderType()==OP_BUY ? OP_SELL : OP_BUY;
         double tp = cmd==OP_BUY ? NormalizeDouble(Ask+100*_Point,_Digits) : NormalizeDouble(Bid-100*_Point,_Digits);
         double sl = cmd==OP_BUY ? NormalizeDouble(Ask-100*_Point,_Digits) : NormalizeDouble(Bid+100*_Point,_Digits);
         ticket1=OrderSend(_Symbol,cmd,0.1,Ask,30,sl,tp);
        }
     }
  }
//+------------------------------------------------------------------+

L'essenza di TS: quando aprite un ordine di acquisto all'inizio e ricordate il ticket dell'ordine (lavorate sul ticket), poi controllate se l'ordine è chiuso - vedete che tipo di ordine e mettete l'ordine opposto e ricordate il ticket e così via

Ho bisogno di un esempio simile da riprodurre in MQL5 usando SB CTrade

 
Igor Makanu:

OK, semplifichiamo la nostra discussione agli esempi nel codice, ecco il codice scritto in MQL4 - mi interessa la versione per tester, cioè un minimo di controlli, ecc:

L'essenza di TS: quando aprite un ordine di acquisto all'inizio e ricordate il ticket dell'ordine (lavorate sul ticket), poi controllate se l'ordine è chiuso - vedete che tipo di ordine e mettete l'ordine opposto e ricordate il ticket e così via

Ho bisogno di un esempio simile da riprodurre in MQL5 usando SB CTrade

Qui è dove il piccolo batterista dirà quello che pensa di te))))
 
Alexey Viktorov:
Ora il piccolo tamburino ti dirà cosa pensa di te))))

lasciatelo parlare, ma abbiamo bisogno di sapere se il numero di ticket è aperto o chiuso, se è chiuso, abbiamo bisogno di sapere che tipodi ordine di trade aveva la posizione chiusa

(in grassetto - è comunque un ordine! - perché nel conto della testata TC)

 
Igor Makanu:

Ok, semplifichiamo la nostra discussione con esempi in codice. Ho scritto un codice in MQL4 - sono interessato alla versione Tester, cioè il minimo di controlli, ecc:

Il secondo OrderSend contiene un errore. E la normalizzazione non è necessaria. Nel forum (e non solo) il codice è più facile da leggere quando è più corto.
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);
    }
  }

Ho bisogno di un esempio simile da riprodurre in MQL5 usando CTrade SB

Ho bisogno di un esempio simile da riprodurre in MQL5 usando CTrade SB.

 

Quindi, le basi sono ilPOSITION_IDENTIFIER, ma non il biglietto di posizione. Questo è importante proprio a causa della 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:

Ora sarà molto più facile risolvere il problema.

Quando scrivi l'esempio, guarda un po'avanti.

 
fxsaber:
Il secondo OrderSend contiene un errore. Non ho bisogno di normalizzazione. Sul forum (e non solo) è più facile leggere il codice quando è più corto.

Sì, vedo, ho scritto il codice al volo - l'ho eseguito nel tester - funziona, l'ho copiato nel forum


fxsaber:

Dovrà sforzarsi un po' di più.

Ecco perché ho chiesto aiuto sul forum! - Ho deciso di valutare le capacità di SB CTrade - ho preso un compito elementare come esempio e finora il risultato è stato negativo!


Vladimir Karputov:

Ora sarà molto più facile risolvere il problema.

Ti conosco come membro attivo del forum. Potresti riprodurre il mio, o meglio il codice corretto difxsaber, usando CTrade Server sotto MQL5?

 
Igor Makanu:

Sì, vedo, ho scritto il codice al volo - l'ho eseguito nel tester - funziona, l'ho copiato nel forum

Quando inizio a scrivere un EA, comincio sempre con una pagina bianca (lo raccomando). Probabilmente la maggior parte delle volte inizia con un'intestazione con On-functions.

 
Igor Makanu:

Ecco perché ho chiesto aiuto sul forum! - Ho deciso di valutare le capacità di CTrade - ho preso un compito elementare come esempio e finora il risultato è stato negativo!

C'è un esempio ancora più breve.

forum sul trading, sistemi di trading automatico e test di strategie di trading

Caratteristiche del linguaggio mql5, sottigliezze e trucchi

fxsaber, 2018.02.15 11:48

OrderCloseBy(OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0), OrderSend(_Symbol, OP_SELL, 1, Bid, 0, 0, 0));

È difficile da gestire in MT5 se non nel tester.

Motivazione: