Максисальная длина названия символа на FOREX - страница 8

 
fxsaber:

Фактически, это забивание. Т.к. можно не дожидаясь отслеживать. Единственная безальтернативность OnTradeTransaction, это если ордер отклонен. Например, по нехватке денег.


Получается, что сделали сотню Async-операций, заполнив массив (список) соответствующими мэджиками и реквестами. Как только в OnTradeTransaction получили ответ по реквесту, убрали элемент из списка. Как только увидели засвет мэджика из списка среди живых/мертвецов - убрали запись. Так достигается контроль более-менее. Правильно понял?


Вы можете вместо мэджика еще использовать другие поля - SL/TP, Comment.

Да, именно так. OnTradeTransaction никогда не отключается, просто с периодичностью вызывается функция проверки (если не сработал OnTradeTransaction ). Как только определилось всё с ордером, флаги обнуляются.

Как оспользовать комментарий ронятно, а как SL/TP?

 
fxsaber:

А зачем ждать, когда можно проверять на каждом On-пуке?

Потому что в моих стратегиях важно что именно пришло в OnTradeTransaction.

Я не мспользую On-пуке :)

Добавлено

Если смобытие пришло в  OnTradeTransaction то всё обнуляется, таким образом нет никаких заминок.

 
prostotrader:

Как оспользовать комментарий ронятно, а как SL/TP?

Выше дополнил...

Выставляете фейковый SL, в значении которого хранится нужная Вам инфа. Например, я так в MT4 сохранял цену открытия позиции, которая зафиллилась через лимитник.

 
prostotrader:

Потому что в моих стратегиях важно что именно пришло в OnTradeTransaction.

Так прямо в OnTradeTransaction и делать проверку на мэджики. Ну я бы так делал.


Вообще, идея с мэджиками, как альтернатива реквестам, классная!

 
fxsaber:

Выше дополнил...

Выставляете фейковый SL, в значении которого хранится нужная Вам инфа. Например, я так в MT4 сохранял цену открытия позиции, которая зафиллилась через лимитник.

А разве можно выставить SL, если нет позиции?

 
prostotrader:

А разве можно выставить SL, если нет позиции?

Возможно, что нельзя это сделать для маркетов. Давно уже только через лимитные ордера торгую.

 
fxsaber:

Возможно, что нельзя это сделать для маркетов. Давно уже только через лимитные ордера торгую.

"Стремноватое" решение хранить инфу подобным образом. Ну, да Вам виднее.

Так как рынок ФОРЕКС меня вообще не интересует, то 6 символов из имени символа и 65365 могиков на одном чарте для моих нужд хватает с лихвой,

тем более за торговый день можно осуществить только 2000 транзакций. 

 
prostotrader:

Так как рынок ФОРЕКС меня вообще не интересует, то 6 символов из имени символа и 65365 могиков на одном чарте для моих нужд хватает с лихвой,

тем более за торговый день можно осуществить только 2000 транзакций. 

Дело не в форексе. И там такие же проблемы с OnTradeTransaction. Поэтому универсальное решение

#include <crc64.mqh> // https://www.mql5.com/en/blogs/post/683577

string GetMagicString()
{
  return(MQLInfoString(MQL_PROGRAM_PATH/*MQL_PROGRAM_NAME*/) + _Symbol + (string)ChartID()/* + (string)_Period*/);
}

// Формирует мэджик с изменяемой частью ReserveBits для прописывания туда Num-значения
ulong GetMagic( const int Num = 0, const int ReserveBits = 12 )
{
  uchar Bytes[];
  
  return((crc64(0, Bytes, (StringToCharArray(GetMagicString(), Bytes))) << ReserveBits) + (Num % (1 << ReserveBits)));
}

// Определяет, свой ли исходный мэджик с изменяемой частью ReserveBits
bool IsMyMagic( const ulong Magic, const int ReserveBits = 12 )
{
  return(GetMagic(0, ReserveBits) >> ReserveBits == Magic >> ReserveBits);
}

#define PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{  
  for (int i = 0; i < 10; i++)
  {
    PRINT(GetMagic(i));
    PRINT(IsMyMagic(GetMagic(i)));
  }
  
  PRINT(IsMyMagic(MathRand()));
}
 

Конечно, событийная модель неудобная в данном случае. Например, если нужно не выходя из On-функции сделать Async-операции и получить по ним результат.

Сейчас такое поведение возможно релизовать через костыль.

  1. Пишется индикатор (без буферов и входных переменных) с OnTradeTransaction, который пишет все транзакции в общедоступное место (например, в ресурс).
  2. Советник этот индикатор создает через iCustom.
  3. В любом месте выполнения советник может посмотреть все пришедшии транзакции, что записал индикатор.

Таким образом получается огромная гибкость.

Например, можно отправить сотню Async-ордеров и не выходя из глубоких потрохов дождаться их выполнения, продолжив далее выполнять свой код.


Речь, конечно, идет про реквесты. И мэджик-тема тут не при чем.


ЗЫ Хотя было бы разумно, чтобы штатно выполнялись записи транзакций в общедоступный массив со стороны разработчиков. Без индикатора.

 
fxsaber:

Дело не в форексе. И там такие же проблемы с OnTradeTransaction. Поэтому универсальное решение

ЗЫ Хотя можно (и даже лучше) обойтись без битовых операций - просто crc64 + Num.
2018.08.25 22:10:48.913 Test (BR-9.18,M1)       1749671450686091264
2018.08.25 22:10:48.914 Test (BR-9.18,M1)       1749671450686091265
2018.08.25 22:10:48.914 Test (BR-9.18,M1)       1749671450686091264
2018.08.25 22:10:48.914 Test (BR-9.18,M1)       1749671450686091265
2018.08.25 22:10:48.914 Test (BR-9.18,M1)       1749671450686091264
2018.08.25 22:10:48.914 Test (BR-9.18,M1)       1749671450686091265
2018.08.25 22:10:48.914 Test (BR-9.18,M1)       1749671450686091264
2018.08.25 22:10:48.914 Test (BR-9.18,M1)       1749671450686091265
2018.08.25 22:10:48.914 Test (BR-9.18,M1)       1749671450686091272
2018.08.25 22:10:48.914 Test (BR-9.18,M1)       1749671450686091273

Есть совпадения...