Discusión sobre el artículo "Biblioteca para el desarrollo rápido y sencillo de programas para MetaTrader (Parte XXII): Clases comerciales - Clase comercial principal, control de limitaciones" - página 2

 
Artyom Trishkin:

Así que después de procesar el evento, al final del módulo de comprobación del tipo de evento, ¿qué tienes en la variable last_event? Eso es lo que necesitas resetear en el EA. Y no llamar forzosamente al método de reinicio del último evento de la librería - la propia librería lo llama justo después de enviar el evento al gráfico y escribirlo en la lista de eventos.

Sí. Se me pasó y no puse una línea al final.

last_event = engine.LastTradeEvent();
 
Alexey Viktorov:

Sí. Sólo me perdí una línea al final.

Puedes equipararlo a TRADE_EVENT_NO_EVENT.
 
Artyom Trishkin:
Puedes equipararlo a TRADE_EVENT_NO_EVENT.

No funciona. Imprime en cada tick. La orden se activa en el quinto tick, imprime "1" 4 veces en el log y luego imprime "20" en cada tick.

//--- Si el último evento comercial ha cambiado
 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);
       //PedidoActivado();
     break;
      }
     case TRADE_EVENT_POSITION_OPENED :
     
     break;
     case TRADE_EVENT_POSITION_CLOSED :
     
     break;
//---
     
     default :
      break;
    }
   last_event = TRADE_EVENT_NO_EVENT;
  }
 
Alexey Viktorov:

No funciona. Imprime en cada tick. La orden se activa en el quinto tick, imprime "1" 4 veces en el registro y luego imprime "20" en cada tick.

Necesitas ver lo que has creado ahí. Funciona en Expert Advisors de prueba.
Estoy en mi móvil. Estaré allí en unas 5 horas.
 
Artyom Trishkin:
Tenemos que ver lo que has hecho. Está funcionando en los asesores de pruebas.
Estoy en mi móvil. No estaré allí hasta dentro de cinco horas.

Todavía no he escrito nada. Por encima del código en el post anterior es sólo esto.

//--- Inicialización del último evento comercial
 static ENUM_TRADE_EVENT last_event = WRONG_VALUE;
//--- Si trabaja en el probador
 if(MQLInfoInteger(MQL_TESTER))
  {
   engine.OnTimer();
  }
Y debajo del código, abriendo dos órdenes OP_SELLLIMIT y OP_SELLSTOP
 
Alexey Viktorov:

Todavía no he creado nada. Por encima del código en el mensaje anterior es sólo esto.

Y debajo del código, la apertura de dos órdenes OP_SELLLIMIT y OP_SELLSTOP.
Necesito ver el código completo. Tíralo en un mensaje privado, o aquí si no es un secreto tras siete sellos.
 
Artyom Trishkin:
Necesito ver el código completo. Tíralo en un mensaje privado, o aquí si no es un secreto tras siete sellos.

No hay nada allí todavía.

/********************************************************************\
|Only_BUY_or_only_SELL.mq4 |
|© 2019, Alexey Viktorov |
| https://www.mql5.com/es/users/alexeyvik/news |
\********************************************************************/
#property copyright "© 2019, Alexey Viktorov"
#property link      "https://www.mql5.com/es/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;   // Dirección del comercio
sinput  double          lot             = 0.01;   // Tamaño del lote
 input  int             StepGrid        = 50;     // Espaciado de la cuadrícula
 input  double          desiredProfit   = 10;     // Beneficio deseado
sinput  bool            Should_I_open   = false;  // ¿Debo abrir una nueva serie de posiciones?
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()
{
//--- Inicialización del último evento comercial
 static ENUM_TRADE_EVENT last_event = WRONG_VALUE;
//--- Si trabaja en el probador
 if(MQLInfoInteger(MQL_TESTER))
  {
   engine.OnTimer();
  }
//--- Si el último evento comercial ha cambiado
 if(engine.LastTradeEvent() != last_event)
  {
 //Print(__FUNCTION__, "***", último_evento);
   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);
       //PedidoActivado();
     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)
{
//--- Inicialización del último evento comercial
 static ENUM_TRADE_EVENT last_event=WRONG_VALUE;
//--- Si trabaja en el probador
 if(MQLInfoInteger(MQL_TESTER))
  {
   engine.OnTimer();
  }
//--- Si el último evento comercial ha cambiado
 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:

Bueno, todavía no hay nada

Tengo que ejecutar su código para obtener una respuesta. Me pondré en contacto con usted cuando esté allí.
 
Artyom Trishkin:
Tengo que ejecutar tu código para obtener una respuesta. Ahora vuelvo.

Sé que no estás en casa y no te estoy apresurando.

 
Alexey Viktorov:

Sé que no estás en casa y no te estoy metiendo prisa.

No, al contrario: no estoy en el trabajo, sino en casa ;)