Великий и ужасный МТ4 навсегда (или как грамотно выработать стратегию перехода) - страница 24

 
Artyom Trishkin:
По-русски? По-испански? По-английски? По-какому?

естественно на всех языках которые поддерживает терминал

формат не важен - это может быть СБ в виде класса, где конструктор получает в качестве параметра язык

или может быть группа пользовательских функций с окончанием кодировки языка GetTxtErrDescription_RU()

или даже штатная функция как GetLastError()

было бы желание


ладно, проехали, у меня все есть, а заботиться о вселенском благополучии чин не позволяет, пусть специально-обученные люди занимаются юзабилити и юзерфрендли

 

Я догадался почему у вас задваивает позиции.))) Потому, что в CodeBase вы разместили две библиотеки)))


 

а чем GetTickCount(); не нравится, он не тормозит весь код в отличие от Sleep, можно хоть 500мс воткнуть если пинг большой,

у меня в мультисимволе на каждую пару отдельный счетчик активируется после OrderSend, остальная логика продолжает работать

void OnStart()
  {
   MqlTradeRequest BuyRequest = {0};
   MqlTradeResult result = {0};
   BuyRequest.action = TRADE_ACTION_DEAL;
   BuyRequest.type = ORDER_TYPE_BUY;
   BuyRequest.symbol = _Symbol;
   BuyRequest.volume = 0.1;
   BuyRequest.type_filling = GetFilling();
//---
   while(1 && !IsStopped())
     {
      static uint LastOnCalculate = GetTickCount();
      if(GetTickCount() - LastOnCalculate > 5)
         //---
        {
         BuyRequest.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
         OrderSend(BuyRequest, result);
         LastOnCalculate = GetTickCount();
         continue;
        }
      if(PositionGetTicket(0) > 0 && PositionsTotal() >= 10)
        {
         Sleep(100);
         Print(PositionsTotal());
         return;
        }
     }
  }
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE_FILLING GetFilling(const uint Type = ORDER_FILLING_FOK)
  {
   const ENUM_SYMBOL_TRADE_EXECUTION ExeMode = (ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(_Symbol, SYMBOL_TRADE_EXEMODE);
   const int FillingMode = (int)::SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE);
   return((FillingMode == 0 || (Type >= ORDER_FILLING_RETURN) || ((FillingMode & (Type + 1)) != Type + 1)) ?
          (((ExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE) || (ExeMode == SYMBOL_TRADE_EXECUTION_INSTANT)) ?
           ORDER_FILLING_RETURN : ((FillingMode == SYMBOL_FILLING_IOC) ? ORDER_FILLING_IOC : ORDER_FILLING_FOK)) :
          (ENUM_ORDER_TYPE_FILLING)Type);
  }
//+------------------------------------------------------------------+
 
Fast235:

а чем GetTickCount(); не нравится, он не тормозит весь код в отличие от Sleep, можно хоть 500мс воткнуть если пинг большой,

Оно же активный цикл и кушает процессор. А если таких советников 50 в терминале? Из них штук 8 на одной паре, где на шпильке все 8 пойдут ордера отправлять.

 
traveller00:

Оно же активный цикл и кушает процессор. А если таких советников 50 в терминале? Из них штук 8 на одной паре, где на шпильке все 8 пойдут ордера отправлять.

активируется он на пол сек и все после отправки ордера, потом нет команды на него, потом уже идет проверка на наличие открытых позиций сперва

я как оптимизировал свой код, он стал работать быстрее и началось по 2 штук открываться) сперва Sleep  помогал, но он все тормозил, у меня 7 символов
 
fxsaber:

Я сам еще не пробовал MT4-style.  Теоретически должно работать. Пока нет возможности посмотреть.

Работает. Было интересно сравнить два варианта (с ожиданием позиции и без).


С ожиданием позиции после OrderSend.

#include <MT4Orders.mqh>

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnStart()
{
  while (OrdersTotal() < 30)
    OrderSend(_Symbol, OP_BUY, 0.1, Ask, 0, 0, 0);      
    
  Print(OrdersTotal());
}


Без ожидания позиции - результат сразу.

#include <fxsaber\TradesID\ByPass.mqh>
#include <MT4Orders.mqh>

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnStart()
{
  BYPASS ByPass;
  
  MT4ORDERS::OrderSend_MaxPause = 0; // Запрет на ожидание позиции после OrderSend
  
  while (OrdersTotal() < 30)
    if (ByPass.Is())
      ByPass += OrderSend(_Symbol, OP_BUY, 0.1, Ask, 0, 0, 0);      
    
  Print(OrdersTotal());
}


Был уверен, что второй вариант быстрее. Оказалось одинаковое время выполнения.


При ожидании ByPass.Is() ни разу не выдал false, без ожидания - 740 раз. В общем, костыль, похоже, работает.

 
Похоже, это единственное рабочее решение из представленных.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Великий и ужасный МТ4 навсегда (или как грамотно выработать стратегию перехода)

Igor Makanu, 2021.05.10 10:28

вроде так работает:

#include <Trade\Trade.mqh>
void OnStart()
{
   CTrade Trade;
   while(PositionsTotal() < 30)
   {
      if(OrdersTotal() > 0) continue;
      if(!Trade.Buy(0.01)) continue;
      if(OrdersTotal() == 0 && PositionsTotal() >= 30) return;
   }
}

но очень медленно, да и решение такое себе

Скорость у него нормальная. Отсутствие синхронизации 37 раз.

 
fxsaber:

Скорость у него нормальная. Отсутствие синхронизации 37 раз.

сейчас проверил на фх...н - быстро 5 раз по 10 ордеров этот скрипт открыл, а прошлый раз когда быстро, когда по 10 секунд 10 ордеров открывал на демке, да и закрытие ордеров тоже было не быстрым

вот выцарапал из лога для ордера 11143290:

LL 0 11:19:31.444 Trades '20615687': order #11143290 buy 0.1 / 0.1 EURUSD at market done in 1580.643 ms

PO 0 11:19:33.621 Trades '20615687': deal #1865643 buy 0.1 EURUSD at 1.21460 done (based on order #11143290)

CL 0 11:19:33.622 Trades '20615687': market buy 0.1 EURUSD

JF 0 11:19:33.679 Trades '20615687': accepted market buy 0.1 EURUSD

QO 0 11:19:33.679 Trades '20615687': market buy 0.1 EURUSD placed for execution

KM 0 11:22:41.224 Trades '20615687': market sell 0.1 EURUSD, close #11143290 buy 0.1 EURUSD 1.21460

DR 0 11:22:41.280 Trades '20615687': accepted market sell 0.1 EURUSD, close #11143290 buy 0.1 EURUSD 1.21460

KQ 0 11:22:41.282 Trades '20615687': market sell 0.1 EURUSD, close #11143290 buy 0.1 EURUSD 1.21460 placed for execution

ON 0 11:22:43.824 Trades '20615687': market sell 0.1 EURUSD, close #11143290 buy 0.1 EURUSD 1.21460

DO 2 11:22:43.880 Trades '20615687': failed market sell 0.1 EURUSD, close #11143290 buy 0.1 EURUSD 1.21460 [Order to close this position already exists]

JN 0 11:22:46.280 Trades '20615687': market sell 0.1 EURUSD, close #11143290 buy 0.1 EURUSD 1.21460

OL 2 11:22:46.336 Trades '20615687': failed market sell 0.1 EURUSD, close #11143290 buy 0.1 EURUSD 1.21460 [Order to close this position already exists]

 
Igor Makanu:

сейчас проверил на фх...н

Надо будет посмотреть этот сервер. Хорошо бы проверить предложенный здесь костыль, для кого это видится важным.

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

 
fxsaber:

Надо будет посмотреть этот сервер. Хорошо бы проверить предложенный здесь костыль, для кого это видится важным.

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

в ЛС бросил сервер

Причина обращения: