O grande e terrível MT4 para sempre (ou como fazer uma transição estratégica) - página 16

 

isto funciona bem - (dependendo de qual finalidade!?)

#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:

que funciona bem - (dependendo de qual finalidade!?)

Não se envolva. Eles têm lá um CD especial que constrói todo tipo de intrigas para capturar os bugs MT.

 
Alexey Viktorov:

Um CD especial que constrói todo tipo de intrigas para capturar os bugs MT.

A maioria dos corretores trabalha de acordo com o mesmo esquema: Result.deal == 0.

Por exemplo, a Signals é a corretora mais popular para o escalpe.

Entre corretores conceituados é bastante difícil encontrar onde a MT5 trabalha de acordo com um esquema diferente.

 
SanAlex:

isto funciona bem - (dependendo de qual finalidade!?)


O que exatamente "funciona bem"?
Você tem um erro em seu código, que já foi apontado acima.
 
fxsaber:

A maioria dos corretores trabalha de acordo com o mesmo esquema: Result.deal == 0.

Os sinais, por exemplo, é o corretor mais popular para o escalpe.

Entre os corretores conhecidos, é bastante difícil encontrar onde a MT5 trabalha de acordo com um esquema diferente.

Não sei que tipo de escalpelização funciona tanto que não se tem tempo para fechar uma posição.

Se você não se importa, ainda tente adicionar a verificação do número de posições

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

Acho que as duas posições estão abertas e fechadas. Não faria mal tentar obter os tipos destas duas posições. Se forem dirigidas de maneira diferente, isso confirmará minhas suspeitas.

 
Ihor Herasko:

Feito:

Resultado:

Bem, obtenha o status desta ordem.se o bilhete for conhecido.

O comércio fracassou, o preço de execução é 0.

Estrutura do resultado da solicitação comercial (MqlTradeResult)

Em resposta a uma solicitação comercial, o servidor comercial retorna dados contendo o resultado do processamento da solicitação comercial como uma estrutura especial predefinida 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:

Assim, obtenha o status desta ordem. Se o bilhete for conhecido.

O comércio fracassou, o preço de execução é 0.

O problema é esse: já passou. Quando o script termina a execução, uma ou duas posições são deixadas penduradas (dependendo de quantas impressões você insere no código).

Código:

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

Resultado:

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:

Não sei que tipo de escalpe funciona tão duro que não se pode fechar uma posição a tempo...

Tudo está a seu tempo. Apenas uma característica arquitetônica do MT5.

Se você não se importa, tente adicionar a verificação do número de posições

Esta verificação está presente no código fonte.

Acho que as duas posições estão abertas e fechadas. Também ajudaria a tentar obter os tipos dessas duas posições. Se forem dirigidas de maneira diferente, isso confirmaria minhas suspeitas.

Não existe uma posição de fechamento.

 
fxsaber:

Ainda não tenho tempo de afixar. Publicá-lo-ei dentro de 24 horas.

Não funcionou, eu encontrei problemas.

 
fxsaber:

Não deu certo, encontrou problemas.

Aguardamos ansiosamente por isso. Se precisar de alguma ajuda, por favor escreva.