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

 
Vladimir Karputov:

Após a execução de uma ordem comercial, aparece uma POSIÇÃO, não uma ORDEM!

Existem servidores onde se pode reproduzir uma tal situação

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


Ou seja, temos a seguinte ordem no terminal ao mesmo 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 a mesma posição da mesma

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

Portanto, descreva primeiro em palavras o que está a fazer e o que pretende obter. Utilize "BUY trade order" e "SELL trade order" em vez de ORDENAR. O resultado é uma "posição de COMPRA" ou uma "posição de VENDA".

OK, vamos simplificar a nossa discussão para exemplos em código. Aqui está o código escrito em MQL4 - Estou interessado na versão de teste, ou seja, verificações mínimas, etc:

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

A essência do TS: quando abre uma ordem de compra no início e se lembra do bilhete da ordem (trabalho no bilhete), depois verifique se a ordem está fechada - veja que tipo de ordem e coloque a ordem oposta e lembre-se do bilhete e assim por diante

Preciso de um exemplo semelhante para ser reproduzido em MQL5 usando SB CTrade

 
Igor Makanu:

OK, vamos simplificar a nossa discussão para exemplos no código, aqui está o código escrito em MQL4 - estou interessado na versão para testador, ou seja, verificações mínimas, etc:

A essência do TS: quando abre uma ordem de compra no início e se lembra do bilhete da ordem (trabalho no bilhete), depois verifique se a ordem está fechada - veja que tipo de ordem e coloque a ordem oposta e lembre-se do bilhete e assim por diante

Preciso de um exemplo semelhante para ser reproduzido em MQL5 usando SB CTrade

Aqui é onde o pequeno baterista dirá o que pensa de si))))
 
Alexey Viktorov:
Agora o pequeno baterista vai dizer-lhe o que pensa de si))))

deixá-lo falar, mas precisamos de saber se o número do bilhete está aberto ou fechado, se está fechado, precisamos de saber que tipode ordem comercial a posição fechada tinha

(em negrito - é uma ordem de qualquer forma! - porque na conta de cabeçalho do TC)

 
Igor Makanu:

OK, vamos simplificar a nossa discussão a exemplos em código. Escrevi um código em MQL4 - estou interessado na versão Tester, ou seja, no mínimo de verificações, etc:

O segundo OrderSend contém um erro. E a normalização é desnecessária. No fórum (e não só) o código é mais fácil de ler quando é mais curto.
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);
    }
  }

Preciso de um exemplo semelhante para ser reproduzido em MQL5 utilizando CTrade SB

Preciso de um exemplo semelhante para ser reproduzido em MQL5 utilizando CTrade SB.

 

Portanto, o básico é oPOSITION_IDENTIFIER, mas não o bilhete de posição. Isto é importante precisamente 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 esta propriedade 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 uma posição VENDER imediatamente.


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

 
Vladimir Karputov:

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

Ao escrever o exemplo, olhe um pouco à frente.

 
fxsaber:
O segundo OrderSend contém um erro. Não preciso de normalização. No fórum (e não só) é mais fácil ler o código quando este é mais curto.

Sim, estou a ver, escrevi o código na mosca - corri-o no testador - funciona, copiei-o para o fórum


fxsaber:

Terá de se esforçar um pouco mais.

Foi por isso que pedi ajuda no fórum! - Decidi estimar as capacidades da SB CTrade - tomei como exemplo uma tarefa elementar e até agora o resultado tem sido negativo!


Vladimir Karputov:

Agora vai tornar-se muito mais fácil resolver o problema.

Conheço-o como membro activo do fórum. Poderia reproduzir o meu, ou melhor, o códigofxsaber corrigido, usando o CTrade Server sob MQL5?

 
Igor Makanu:

Sim, estou a ver, escrevi o código na mosca - corri-o no testador - funciona, copiei-o para o fórum

Quando começo a escrever um EA, começo sempre com uma página em branco (recomendo-a). Provavelmente, a maioria das vezes começa com um cabeçalho com On-funções.

 
Igor Makanu:

Foi por isso que pedi ajuda no fórum! - Decidi avaliar as capacidades do CTrade - tomei como exemplo uma tarefa elementar e até agora o resultado tem sido negativo!

Há um exemplo ainda mais curto.

fórum sobre comércio, sistemas automatizados de comércio e teste de estratégias comerciais

Características da linguagem mql5, subtilezas e truques

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));

É difícil lidar com isso no MT5 se não no testador.

Razão: