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

 
Igor Makanu:

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

На этом сервере (точнее, в софте брокера) стоит защита от спама. К следующей неделе планируют ее обновить, тогда тормоза уйдут.

 
fxsaber:

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

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

В MT4-style пока нет варианта?

Просто позапускать скрипт, открывающий 100 позиций, на разных серверах?

 
Andrey Khatimlianskii:

В MT4-style пока нет варианта?

Еще не приступал. Скорее всего, пользователь ничего не будет менять в коде. Задействоваться доп. функционал будет через макрос.

Просто позапускать скрипт, открывающий 100 позиций, на разных серверах?

Да, на разных серверах, но только другой скрипт. Если за минуты работы не возникает задвоения - прошел проверку успешно. Иначе - провал.

Библиотеки: TradesID
Библиотеки: TradesID
  • 2021.03.29
  • www.mql5.com
Статьи и техническая библиотека по автоматическому трейдингу: Библиотеки: TradesID
 
fxsaber:

Еще не приступал. Скорее всего, пользователь ничего не будет менять в коде. Задействоваться доп. функционал будет через макрос.

Сделал.

Библиотеки: MT4Orders
Библиотеки: MT4Orders
  • 2021.02.09
  • www.mql5.com
MT4Orders: Автор: fxsaber...
 

Было.

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

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

fxsaber, 2021.05.11 09:05

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

#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());
}

Стало.

#define MT4ORDERS_BYPASS_MAXTIME 1000000 // Максимальное время (в мкс.) на ожидание синхронизации торгового окружения
#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

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


Теперь ничем не отличается от MT4-варианта, включая надежность.

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

 

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

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

Igor Makanu, 2021.05.10 10:28

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

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

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

Что будет, если после выставления приказа на открытие 10й позиции, на следующей итерации при выполнении условия

while(PositionsTotal() < 10)

PositionTotal еще не успел обновиться (=9), а ордер уже успел уйти в историю и OrdersTotal()==0.

1. Тогда будет выполнен еще один Trade.Buy()?

2. Теоретически такое может повториться несколько итераций подряд?

Или я что-то не учел?

 
mktr8591:

Что будет, если после выставления приказа на открытие 10й позиции, на следующей итерации при выполнении условия

PositionTotal еще не успел обновиться (=9), а ордер уже успел уйти в историю и OrdersTotal()==0.

1. Тогда будет выполнен еще один Trade.Buy()?

2. Теоретически такое может повториться несколько итераций подряд?

Или я что-то не учел?

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

уверен в МТ4 так и построено, ожидание-пришло
 
mktr8591:

Что будет, если после выставления приказа на открытие 10й позиции, на следующей итерации при выполнении условия

PositionTotal еще не успел обновиться (=9), а ордер уже успел уйти в историю и OrdersTotal()==0.

1. Тогда будет выполнен еще один Trade.Buy()?

Конечно, будет. Ведь логика в коде именно такая.

2. Теоретически такое может повториться несколько итераций подряд?

Если Buy будет true, то почти нулевая вероятность, что на следующей итерации будет OrdersTotal() == 0. Т.е. открытие 12-ти позиций невозможно на практике.


Здесь очень примитивный случай показан. Задвоение часто выглядит так:

  1. Стоит лимитник OrdersTotal = 1, PositionsTotal = 0
  2. Лимитник исполняется. OrdersTotal = 0, PositionsTotal = 0.
  3. Открывается позиция. OrdersTotal = 0, PositionsTotal = 1.

Так вот на втором шаге советник видит, что ничего нет и выставляет лимитник. В итоге две открытые позиции.

Второй пункт - это и есть рассинхрон MT5. И теперь костыль его обходит.

 

Спасибо.

По поводу этого:

fxsaber:

Задвоения - это не сложности MT5, а архитектурный баг, когда Total()-функции показывают ложь.

Можно сказать, что баг, а можно преподнести иначе :-)

PositionsTotal() - это не количество открытых позиций, а размер Таблицы открытых позиций. Таблица позиций - это фактически кэш, аналогично кэшу истории сделок, только он обновляется не по запросу, а автоматически, но не мгновенно, а с небольшой задержкой. Из-за этого он может не содержать уже открытые позиции, или содержать уже закрытые.

с OrdersTotal() то же самое.

Если в справке так расписать, то будет намного меньше вопросов, жалоб и непонимания.

И в статье "Ордерa, позиции и сделки в MetaTrader 5" можно на это обратить внимание (сейчам там двусмысленно - "Результат выполнения функции PositionsTotal() не зависит от заполненности кэша позиций - она всегда возвращает реальное количество открытых позиций в базе терминала по всем символам.")


P.S. но тогда возникает закономерный вопрос - почему не сделать системную ф-ию/флаг для определения состояния синхронизации таблиц живых ордеров, позиций, сделок и выполненных ордеров, чтобы не плодить костыли?
 
mktr8591:

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

Скорее всего, внутри такого флага нет.

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