Il grande e terribile MT4 per sempre (o come strategizzare una transizione) - pagina 16

 

questo funziona bene - (dipende da quale scopo!?)

#include <Trade\Trade.mqh>
CTrade Trade;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int total=PositionsTotal();
   int Ordertotal=OrdersTotal();
   while(!IsStopped() && (total <= 1))  // Закончим, когда появится более одной позиции.
      if(total == 1)
         Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.
      else
         if(Ordertotal!=0)
            Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
  }
//+------------------------------------------------------------------+
 
SanAlex:

che funziona bene - (dipende da quale scopo!?)

Non farti coinvolgere. Lì c'è un detective speciale che costruisce ogni sorta di intrighi per catturare gli insetti di MT.

 
Alexey Viktorov:

Un DC speciale che costruisce ogni sorta di intrighi per catturare gli insetti MT.

La maggior parte dei broker lavora secondo lo stesso schema: Result.deal == 0.

Per esempio, Signals è il broker più popolare per lo scalping.

Tra i broker rispettabili è abbastanza difficile trovare dove MT5 funziona secondo uno schema diverso.

 
SanAlex:

questo funziona bene - (dipende da quale scopo!?)


Cosa esattamente "funziona bene"?
Hai un errore nel tuo codice, che è già stato sottolineato sopra.
 
fxsaber:

La maggior parte dei broker lavora secondo lo stesso schema: Result.deal == 0.

Signals, per esempio, è il broker più popolare per lo scalping.

Tra i broker conosciuti è abbastanza difficile trovare dove MT5 funziona secondo uno schema diverso.

Non so che tipo di scalping funziona così tanto da non avere il tempo di chiudere una posizione...

Se non ti dispiace, prova ancora ad aggiungere il controllo del numero di posizioni

    else if(!PositionsTotal() && !OrdersTotal())

Credo che le due posizioni siano aperte e chiuse. Non sarebbe male cercare di ottenere i tipi di queste due posizioni. Se sono diretti in modo diverso, ciò confermerà i miei sospetti...

 
Ihor Herasko:

Fatto:

Risultato:

Bene ottenere lo stato di questo ordine, se il biglietto è noto.

L'operazione è fallita, il prezzo di esecuzione è 0.

Struttura del risultato della richiesta di compravendita (MqlTradeResult)

In risposta a una richiesta di compravendita, il server commerciale restituisce dati contenenti il risultato dell'elaborazione della richiesta di compravendita come una speciale struttura predefinita MqlTradeResult.

struct MqlTradeResult
  {
   uint     retcode;          // Код результата операции
   ulong    deal;             // Тикет сделки, если она совершена
   ulong    order;            // Тикет ордера, если он выставлен
   double   volume;           // Объем сделки, подтверждённый брокером
   double   price;            // Цена в сделке, подтверждённая брокером
   double   bid;              // Текущая рыночная цена предложения (цены реквота)
   double   ask;              // Текущая рыночная цена спроса (цены реквота)
   string   comment;          // Комментарий брокера к операции (по умолчанию заполняется расшифровкой кода возврата торгового сервера)
   uint     request_id;       // Идентификатор запроса, устанавливается терминалом при отправке 
   uint     retcode_external; // Код ответа внешней торговой системы
  };

 
Rashid Umarov:

Quindi ottenere lo stato di questo ordine, se il biglietto è noto.

L'operazione è fallita, il prezzo di esecuzione è 0.

Questo è il punto: è passato. Quando lo script finisce, una o due posizioni rimangono sospese (a seconda di quante stampanti si inseriscono nel codice).

Codice:

#define  PRINT(A) Print(#A + " = " + (string)(A))

#include <Trade\Trade.mqh>

void OnStart()
{
  CTrade Trade;
  
  while (!IsStopped() && (PositionsTotal() <= 1)) // Закончим, когда появится более одной позиции.
    if (PositionsTotal() == 1)
    {
      Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.
      Print("Закрытие, т. к. PositionsTotal() равно 1");
    }
    else if (!OrdersTotal())
    {
      printf("Перед открытием. PositionsTotal: %d, OrdersTotal: %d", PositionsTotal(), OrdersTotal());
      Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
      PRINT(Trade.ResultRetcodeDescription());
      PRINT(Trade.ResultDeal());
      PRINT(Trade.ResultOrder());
      PRINT(Trade.ResultComment());
      if (OrderSelect(Trade.ResultOrder()))
         PRINT(OrderGetInteger(ORDER_STATE));
      printf("После открытия. PositionsTotal: %d, OrdersTotal: %d", PositionsTotal(), OrdersTotal());
    }
    
  Print("Выход. PostionsTotal: ", PositionsTotal());
}

Risultato:

2021.05.05 14:25:14.738 Test (EURUSD,M1)        Перед открытием. PositionsTotal: 0, OrdersTotal: 0
2021.05.05 14:25:14.821 Test (EURUSD,M1)        Trade.ResultRetcodeDescription() = done at 0.00000
2021.05.05 14:25:14.821 Test (EURUSD,M1)        Trade.ResultDeal() = 0
2021.05.05 14:25:14.821 Test (EURUSD,M1)        Trade.ResultOrder() = 2249888681
2021.05.05 14:25:14.821 Test (EURUSD,M1)        Trade.ResultComment() = Request executed
2021.05.05 14:25:14.821 Test (EURUSD,M1)        EnumToString(ENUM_ORDER_STATE(OrderGetInteger(ORDER_STATE))) = ORDER_STATE_PLACED
2021.05.05 14:25:14.821 Test (EURUSD,M1)        После открытия. PositionsTotal: 1, OrdersTotal: 1
2021.05.05 14:25:14.899 Test (EURUSD,M1)        Закрытие, т. к. PositionsTotal() равно 1
2021.05.05 14:25:14.899 Test (EURUSD,M1)        Выход. PostionsTotal: 2
 
Alexey Viktorov:

Non so che tipo di scalping lavora così tanto da non poter chiudere una posizione in tempo...

Lì tutto è a tempo. Solo una caratteristica architettonica di MT5.

Se non vi dispiace, provate ad aggiungere il controllo del numero di posizioni

Questo controllo è presente nel codice sorgente.

Penso che le due posizioni siano aperte e vicine. Non sarebbe male cercare di ottenere i tipi di queste due posizioni. Se sono diretti in modo diverso, ciò confermerebbe i miei sospetti...

Non esiste una posizione di chiusura.

 
fxsaber:

Non ho ancora trovato il tempo di pubblicarlo. Lo pubblicherò entro 24 ore.

Non ha funzionato, ho trovato dei problemi.

 
fxsaber:

Non ha funzionato, ha trovato problemi.

Non vedo l'ora. Se c'è qualcosa per cui hai bisogno di aiuto, per favore scrivi.