Discussão do artigo "Biblioteca para criação simples e rápida de programas para MetaTrader (Parte XXII): classes de negociação - classe básica de negociação, controle de restrições" - página 2

 
Artyom Trishkin:

Portanto, após o processamento do evento, no final do módulo de verificação do tipo de evento, o que você tem na variável last_event? É isso que você precisa redefinir no EA. E não forçar a chamada do método de redefinição do último evento da biblioteca - a própria biblioteca o chama logo após enviar o evento para o gráfico e gravá-lo na lista de eventos.

Sim. Eu simplesmente errei e não coloquei uma linha no final.

last_event = engine.LastTradeEvent();
 
Alexey Viktorov:

Sim, só perdi uma linha no final.

Você pode simplesmente equipará-lo a TRADE_EVENT_NO_EVENT.
 
Artyom Trishkin:
Você pode simplesmente equipará-lo a TRADE_EVENT_NO_EVENT.

Isso não está funcionando. Ela é impressa em cada tick. A ordem é ativada no quinto tick, imprime "1" 4 vezes no registro e, em seguida, imprime "20" em cada tick.

//--- Se o último evento de negociação foi alterado
 if(engine.LastTradeEvent() != last_event)
  {
   last_event=engine.LastTradeEvent();
   switch(last_event)
    {
     case TRADE_EVENT_PENDING_ORDER_PLASED :
     Print(__FUNCTION__, "***", last_event);
     break;
     case TRADE_EVENT_PENDING_ORDER_REMOVED :
     
     break;
     case TRADE_EVENT_PENDING_ORDER_ACTIVATED :
      {
       Print(__FUNCTION__, "***", last_event);
       //OrderActivated();
     break;
      }
     case TRADE_EVENT_POSITION_OPENED :
     
     break;
     case TRADE_EVENT_POSITION_CLOSED :
     
     break;
//---
     
     default :
      break;
    }
   last_event = TRADE_EVENT_NO_EVENT;
  }
 
Alexey Viktorov:

Não está funcionando. Ela imprime em cada tick. A ordem é ativada no quinto tick, imprime "1" 4 vezes no registro e, em seguida, imprime "20" em cada tick.

Precisamos ver o que você criou lá. Ela funciona nos Expert Advisors de teste.
Estou no meu celular. Estarei lá em cerca de cinco horas.
 
Artyom Trishkin:
Precisamos ver o que você fez. Está funcionando nos consultores de teste.
Estou no meu celular. Não estarei lá por mais cinco horas.

Ainda não escrevi nada. Acima do código na postagem anterior está apenas isso.

//--- Inicialização do último evento de negociação
 static ENUM_TRADE_EVENT last_event = WRONG_VALUE;
//--- Se estiver trabalhando no testador
 if(MQLInfoInteger(MQL_TESTER))
  {
   engine.OnTimer();
  }
E abaixo do código, abrindo duas ordens OP_SELLLIMIT e OP_SELLSTOP
 
Alexey Viktorov:

Ainda não criei nada. Acima do código na mensagem anterior está apenas isso.

E abaixo do código, a abertura de duas ordens OP_SELLLIMIT e OP_SELLSTOP.
Preciso ver o código completo. Mande-o em uma mensagem privada ou aqui, se não for um segredo por trás de sete selos.
 
Artyom Trishkin:
Preciso ver o código completo. Envie-o em uma mensagem privada ou aqui, se não for um segredo atrás de sete selos.

Ainda não há nada lá.

/********************************************************************\
|Only_BUY_or_only_SELL.mq4 |
|© 2019, Alexey Viktorov |
| https://www.mql5.com/pt/users/alexeyvik/news |
\********************************************************************/
#property copyright "© 2019, Alexey Viktorov"
#property link      "https://www.mql5.com/pt/users/alexeyvik/news"
#property version   "1.00"
#property strict
#define  ndd(A) NormalizeDouble(A, _Digits)
//---
#include <DoEasy\Engine.mqh>
CEngine        engine;
//---
enum MY_ORDER_TYPE
{
 BUY   = OP_BUY,
 SELL  = OP_SELL,
};

struct POZ
{
 double profit;
 ulong  ticket;
 double priceGrid;
 double price;
}poz[];

sinput  MY_ORDER_TYPE   ordType         = SELL;   // Direção do comércio
sinput  double          lot             = 0.01;   // Tamanho do lote
 input  int             StepGrid        = 50;     // Espaçamento da grade
 input  double          desiredProfit   = 10;     // Lucro desejado
sinput  bool            Should_I_open   = false;  // Devo abrir uma nova série de posições?
sinput  int             magick          = 1;      // Número mágico
//---
int slip = 100;
double contract, stepGrid, priceGrid;
int totalPositions, levelNumb;//, levelBUY, levelSELL;

/*******************Expert initialization function*******************/
int OnInit()
{
 stepGrid = StepGrid*_Point;
 return(INIT_SUCCEEDED);
}/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
{
//--- Inicialização do último evento de negociação
 static ENUM_TRADE_EVENT last_event = WRONG_VALUE;
//--- Se estiver trabalhando no testador
 if(MQLInfoInteger(MQL_TESTER))
  {
   engine.OnTimer();
  }
//--- Se o último evento de negociação foi alterado
 if(engine.LastTradeEvent() != last_event)
  {
 //Print(__FUNCTION__, "***", last_event);
   last_event=engine.LastTradeEvent();
   switch(last_event)
    {
     case TRADE_EVENT_PENDING_ORDER_PLASED :
     Print(__FUNCTION__, "***", last_event);
     break;
     case TRADE_EVENT_PENDING_ORDER_REMOVED :
     
     break;
     case TRADE_EVENT_PENDING_ORDER_ACTIVATED :
      {
       Print(__FUNCTION__, "***", last_event);
       //OrderActivated();
     break;
      }
     case TRADE_EVENT_POSITION_OPENED :
     
     break;
     case TRADE_EVENT_POSITION_CLOSED :
     
     break;
     
     default :
      break;
    }
   last_event = TRADE_EVENT_NO_EVENT;
  }
 
 if(Should_I_open && OrdersTotal() == 0)
  {
   priceGrid = ndd(ordType == SELL ? Bid+stepGrid/2 : Bid-stepGrid/2);
   ENUM_ORDER_TYPE type = ENUM_ORDER_TYPE(ordType == OP_SELL ? OP_SELLLIMIT : OP_BUYSTOP);
   if(OrderSend(_Symbol, type, lot, priceGrid, slip, 0.0, 0.0, (string)priceGrid, magick) <= 0)
    Print(__FUNCTION__, GetLastError());
   priceGrid = ndd(ordType == SELL ? Bid-stepGrid/2 : Bid+stepGrid/2);
   type = ENUM_ORDER_TYPE(ordType == OP_SELL ? OP_SELLSTOP : OP_BUYLIMIT);
   if(OrderSend(_Symbol, type, lot, priceGrid, slip, 0.0, 0.0, (string)priceGrid, magick) <= 0)
    Print(__FUNCTION__, GetLastError());
  }
  return;
}/*******************************************************************/

void OrderActivated()
{
 Print(__FUNCTION__, "***", ENUM_TRADE_EVENT(engine.LastTradeEvent()));
 
}/*******************************************************************/

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
//--- Inicialização do último evento de negociação
 static ENUM_TRADE_EVENT last_event=WRONG_VALUE;
//--- Se estiver trabalhando no testador
 if(MQLInfoInteger(MQL_TESTER))
  {
   engine.OnTimer();
  }
//--- Se o último evento de negociação foi alterado
 if(engine.LastTradeEvent()!=last_event)
  {
   last_event=engine.LastTradeEvent();
  }
}/*******************************************************************/

/***************************Timer function***************************/
void OnTimer()
{
 if(!MQLInfoInteger(MQL_TESTER))
  engine.OnTimer();
}/*******************************************************************/

void OnDeinit(const int reason)
{
 Comment("");
}/*******************************************************************/
 
Alexey Viktorov:

Bem, ainda não há nada lá

Preciso executar seu código para obter uma resposta. Entrarei em contato com você quando estiver lá.
 
Artyom Trishkin:
Preciso executar seu código para obter uma resposta. Estarei lá, entrarei em contato com você.

Sei que você não está em casa e não estou apressando você.

 
Alexey Viktorov:

Sei que você não está em casa e não estou apressando você.

Não, pelo contrário - não estou no trabalho, mas em casa ;)