Обсуждение статьи "Библиотека для простого и быстрого создания программ для MetaTrader (Часть XXII): Торговые классы - Основной торговый класс, контроль ограничений" - страница 2

 
Artyom Trishkin:

Так вот после обработки события - в конце модуля проверки типа события, что у тебя в переменной last_event ? Вот её в советнике-то нужно сбрасывать. А не вызывать принудительно метод сброса последнего события библиотеки - она-то его как раз сама вызывает сразу же после отправки события на чарт и записи его в список событий.

Ну да. Просто промазал и одну строку не вставил в конце.

last_event = engine.LastTradeEvent();
 
Alexey Viktorov:

Ну да. Просто промазал и одну строку не вставил в конце.

Можешь просто приравнивать к TRADE_EVENT_NO_EVENT
 
Artyom Trishkin:
Можешь просто приравнивать к TRADE_EVENT_NO_EVENT

Чё-та не получается. На каждом тике печатает. Ордер активируется на пятом тике, в журнале 4 раза перчатает "1" и потом сыпет "20" на каждом тике.

//--- Если последнее торговое событие изменилось
 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:

Чё-та не получается. На каждом тике печатает. Ордер активируется на пятом тике, в журнале 4 раза перчатает "1" и потом сыпет "20" на каждом тике.

Нужно смотреть чего ты там наваял. В тестовых советниках же работает.
Я с мобильного. Буду только часов через пять на месте.
 
Artyom Trishkin:
Нужно смотреть чего ты там наваял. В тестовых советниках же работает.
Я с мобильного. Буду только часов через пять на месте.

Пока ничего не наваял. Выше кода, что в предыдущем сообщении только это

//--- Инициализация последнего торгового события
 static ENUM_TRADE_EVENT last_event = WRONG_VALUE;
//--- Если работа в тестере
 if(MQLInfoInteger(MQL_TESTER))
  {
   engine.OnTimer();
  }
И ниже по коду, открытие двух отложек OP_SELLLIMIT и OP_SELLSTOP
 
Alexey Viktorov:

Пока ничего не наваял. Выше кода, что в предыдущем сообщении только это

И ниже по коду, открытие двух отложек OP_SELLLIMIT и OP_SELLSTOP
Нужно весь код поглядеть. Кинь в личку, или сюда если не тайна за семью печатями.
 
Artyom Trishkin:
Нужно весь код поглядеть. Кинь в личку, или сюда если не тайна за семью печатями.

Ну нет там ещё ничего

/********************************************************************\
|                                          Only_BUY_or_only_SELL.mq4 |
|                                            © 2019, Alexey Viktorov |
|                       https://www.mql5.com/ru/users/alexeyvik/news |
\********************************************************************/
#property copyright "© 2019, Alexey Viktorov"
#property link      "https://www.mql5.com/ru/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;   //  Direction of trade
sinput  double          lot             = 0.01;   //  Lot size
 input  int             StepGrid        = 50;     //  Grid spacing
 input  double          desiredProfit   = 10;     //  Desired profit
sinput  bool            Should_I_open   = false;  //  Should I open a new series of positions?
sinput  int             magick          = 1;      //  Magick number
//---
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()
{
//--- Инициализация последнего торгового события
 static ENUM_TRADE_EVENT last_event = WRONG_VALUE;
//--- Если работа в тестере
 if(MQLInfoInteger(MQL_TESTER))
  {
   engine.OnTimer();
  }
//--- Если последнее торговое событие изменилось
 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)
{
//--- Инициализация последнего торгового события
 static ENUM_TRADE_EVENT last_event=WRONG_VALUE;
//--- Если работа в тестере
 if(MQLInfoInteger(MQL_TESTER))
  {
   engine.OnTimer();
  }
//--- Если последнее торговое событие изменилось
 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:

Ну нет там ещё ничего

Мне, чтобы что-либо тебе ответить, нужно запустить код твой. Буду на месте, отвечу.
 
Artyom Trishkin:
Мне, чтобы что-либо тебе ответить, нужно запустить код твой. Буду на месте, отвечу.

Я помню что ты не дома и не тороплю.

 
Alexey Viktorov:

Я помню что ты не дома и не тороплю.

Не, наоборот - я не на работе, но дома ;)