Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 1098

 

Hmm, situação estranha, como a actividade no tópico que levantei, tinha uma pergunta, do meu ponto de vista específico, mas em vez de uma resposta até agora obtive "porque é que precisas dela?

Quero fazê-lo com SB CTrade, aqui está um exemplo (compilado a partir de 2 exemplos meus): Abrimos cadanovo bar a 9 TF por uma encomenda, memorizamos o bilhete e determinamos a direcção de uma encomenda fechada pelo número do bilhete.

Na MQL4, o código para o testador ficaria assim

//+------------------------------------------------------------------+
//|                                                        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);
           }
        }
  }

precisamos de um código para o testador, ou seja, o número mínimo de verificações e o trabalho mais rápido possível no optimizador.

como escrever este código em MQL5 com SB CTrade ?

 
Igor Makanu:

Hmm, situação estranha, como a actividade no tópico que levantei, tinha uma pergunta, do meu ponto de vista específico, mas em vez de uma resposta até agora obtive "porque é que precisas dela?

Quero fazê-lo com SB CTrade, aqui está um exemplo (compilado a partir de 2 exemplos meus): Abrimos cada novo bar a 9 TF por uma encomenda, memorizamos o bilhete e determinamos a direcção de uma encomenda fechada pelo número do bilhete.

Na MQL4, o código para o testador ficaria assim

como escrever este código em MQL5 usando SB CTrade ?

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

FAQ de Iniciantes MQL5 MT5 MetaTrader 5

Vladimir Karputov, 2019.07.21 12:56

Portanto, a base é oPOSITION_IDENTIFIER, mas não o bilhete de posição. É importante só por causa da rede:

POSITION_IDENTIFIER

O identificador da posição é um número único, que é atribuído a cada posição recentemente aberta e não muda ao longo da sua vida útil. Corresponde ao bilhete da ordem com que a posição foi aberta.

O identificador da posição é especificado em cada ordem (ORDER_POSITION_ID) e cada comércio (DEAL_POSITION_ID) que o abriu, alterou ou fechou. Utilize este imóvel para procurar ordens e negócios relacionados com a posição.

Quando uma posição é invertida em modo de rede (uma única entrada/saída), o identificador POSITION_IDENTIFIER da posição não é alterado. No entanto, POSITION_TICKET é alterado para o bilhete de encomenda, o que resultou na inversão. No modo de cobertura, não há inversão de posição.

longo


Assim, temos de manter um registo do identificador de posição (POSITION_IDENTIFIER).


Agora, uma tarefa mais precisa: na primeira corrida, abrimos uma POSIÇÃO DE COMPRA e memorizamo-la (AVISO: devemos memorizar o ID da posição, não o bilhete). Se a posição tiver sido fechada, abrimos uma posição oposta: por exemplo, era uma vez uma posição COMPRAR, depois foi fechada, o que significa que abrimos imediatamente uma posição VENDER.


Agora será muito mais fácil resolver o problema.


 
Vladimir Karputov:

ou seja, a CTrade não sabe como detectar independentemente se uma encomenda está aberta ou fechada, qual foi o tipo da última encomenda fechada?

que biblioteca devo utilizar para este fim?

 
Igor Makanu:

ou seja, o CTrade não sabe como detectar independentemente se uma encomenda está aberta ou fechada? qual foi o tipo da última encomenda fechada?

Que biblioteca devemos utilizar para este fim?

Já lhe disse uma centena de vezes, por isso, por favor retire a palavra "ordem" do seu vocabulário. Enquanto não o fizer, não poderá seguir em frente. De qualquer modo, provavelmente não poderei ajudá-lo. Isso é lamentável.

 
Vladimir Karputov:

Bem, já lhe disse uma centena de vezes - tire a palavra "mandado" do seu vocabulário. Enquanto não o fizer, não pode seguir em frente. De qualquer modo, provavelmente não o posso ajudar. É uma pena.

Bem, diga-me o que quer dizer com isso:

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:

Bem, já lhe disse uma centena de vezes - tire a palavra "mandado" do seu vocabulário. Enquanto não o fizer, não pode seguir em frente. De qualquer modo, provavelmente não o posso ajudar. É uma pena.

OK? Deixe-me reformular a pergunta:

Como utilizar um bilhete lembrado com CTrade::ResultOrder()

para descobrir:

1. se a posição está fechada?

2. Que tipo de acordo tinha a posição fechada?

3. precisamos de tratar simultaneamente de 9 posições, encomendas ou bilhetes, ou ... OnAnyTerminologia sobre uma conta de cobertura


nesta formulação é a minha pergunta inequívoca? (exemplo reprodutível sob MQl4 publicado acima)

ZS: Não posso esquecer a palavra ordem, infelizmente esta palavra é usada na ajuda juntamente com outros termos:https://www.mql5.com/ru/docs/standardlibrary/tradeclasses/ctrade/ctraderequestorder

 
Igor Makanu:

Hm, é uma situação estranha, parecia ter levantado o tema, a minha pergunta era específica do meu ponto de vista, mas em vez de uma resposta, recebi "porque é que precisa dela?

A razão é a incompetência dos respondentes. Demorei cinco minutos a escrevê-lo e uma tentativa de o verificar.


MT4

Fórum sobre negociação, sistemas de negociação automatizados e testador de estratégias

Perguntas de principiantes 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;
  }
}


Não precisa de ser um forte proficiente para escrever isto, apenas precisa de conhecer as noções básicas do MT5.


ZS Na rede existe uma pequena nuance na determinação do tipo de posição fechada. Mas não desempenha aqui um papel.

 
fxsaber:

Não precisa de ser forte para escrever isto, só precisa de conhecer o básico do MT5.

Obrigado!

Sim, estava à procura de uma solução se não a conseguisse escrever em cinco linhas com SB

Mas o quanto eu compreendi, que um SB CTrade não será capaz de resolver o meu problema? E tive de usar também o CPositionInfo? - Se eu quiser acompanhar 9 posições por várias TFs ao mesmo tempo?

ZS: Estou sentado na ajuda MQL5 com a TV inteligente - funções comerciais bastante bem descritas, o uso do SatB está sob uma questão .... penso que faz sentido utilizar o SB para estratégias primitivas, um pouco mais complicado - a funcionalidade é insuficiente ou não é óbvia, talvez precise de mais prática - vou tentar "torcer" o SB


Mais uma vez obrigado!

 
fxsaber:

A razão é a incompetência assim respondida. Demorei cinco minutos a escrever e uma tentativa de verificação.


MT4


MT5


Não precisa de ser um forte proficiente para escrever isto, apenas precisa de conhecer as noções básicas do MT5.


Não precisa de conhecer o básico, só precisa de conhecer o básico do MT5. Mas não importa aqui.

Aqui é onde

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

há uma potencial armadilha.

Na lista histórica, os mandados não estão dispostos pela ordem em que aparecem nessa lista. Tropeçou nisto ao desenvolver a biblioteca. Eu confiava nisso. Mas afinal não foi assim tão simples. Tentar definir ordens de limite e paragem por sua vez na seguinte ordem: limite -> paragem -> limite -> paragem -> limite -> paragem e eliminar cada uma em qualquer ordem e ver qual a última ordem registada na lista do histórico. Ficará surpreendido.

 
Artyom Trishkin:

Aqui é onde

há um erro potencial.

Na lista histórica, as ordens não estão dispostas na ordem em que aparecem na lista. Encontrei-o ao desenvolver a biblioteca. Eu confiava nisso. Mas afinal não foi assim tão simples. Tentar definir ordens de limite e paragem por sua vez na seguinte ordem: limite -> paragem -> limite -> paragem -> limite -> paragem e eliminar cada uma em qualquer ordem e ver qual a última ordem registada na lista do histórico. Ficará surpreendido.

Não há aí qualquer erro, uma vez que a lista é gerada através de HistorySelectByPosition.

Razão: