Особенности языка mql5, тонкости и приёмы работы - страница 62

fxsaber
17801
fxsaber  
Vasiliy Pushkaryov:
А есть картинка, как это будет выглядеть? А то не совсем понятно, OBJ_CHART еще не использовал

Картинки нет. Но Вы можете ее построить руками. Выберите Вставка -> Объекты -> Графические объекты -> График и после такой вставки OBJ_CHART выберите в свойствах объекта "Рисовать объект как фон", отключив шкалы.

Vasiliy Pushkaryov
7336
Vasiliy Pushkaryov  
fxsaber:

Картинки нет. Но Вы можете ее построить руками. Выберите Вставка -> Объекты -> Графические объекты -> График и после такой вставки OBJ_CHART выберите в свойствах объекта "Рисовать объект как фон", отключив шкалы.


Спасибо, выглядит прикольно

fxsaber
17801
fxsaber  

В дебаг-режиме нельзя узнать значение, которое возвращает функция или выражение.

Например

void OnStart()
{
  double Angle = 1;
  double d = MathSin(Angle / 2) * MathSin(Angle * 2);
}

Например, что вернули выделенные функции.


Использую (не только в дебаг-режиме) такой способ

template <typename T>
T MyPrint( const T Value, const string Str )
{
  static const bool IsDebug = MQLInfoInteger(MQL_DEBUG);

//  if (IsDebug)
  {
//    DebugBreak(); // если хочется посмотреть средствами дебага

    Print(Str + " = " + (string)Value);
  }
  
  return(Value);
}

#define _P(A) MyPrint(A, __FUNCSIG__ ", Line = " + (string)__LINE__ + ": " + #A)

void OnStart()
{
  double Angle = 1;
  double d = _P(MathSin(Angle / 2)) * _P(MathSin(Angle * 2));
}


Результат

void OnStart(), Line = 21: MathSin(Angle/2) = 0.479425538604203
void OnStart(), Line = 21: MathSin(Angle*2) = 0.9092974268256817
fxsaber
17801
fxsaber  

Структура результата проверки торгового запроса (MqlTradeCheckResult)

Описание полей

Поле

Описание

balance

Значение баланса, которое будет после выполнения торговой операции

equity

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

margin

Размер маржи необходимый для требуемой торговой операции

margin_free

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

margin_level

Уровень маржи, который установится после выполнения  требуемой торговой операции

Эти поля соответствуют строке в во вкладке Торговля


Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура результата проверки торгового запроса
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура результата проверки торгового запроса
  • www.mql5.com
Прежде чем отправить торговому серверу запрос на торговую операцию, рекомендуется провести его проверку. Проверка осуществляется функцией OrderCheck(), которой передается сам проверяемый запрос и переменная типа структуры MqlTradeCheckResult. В эту переменную и будет записан результат проверки.
Artyom Trishkin
Модератор
58661
Artyom Trishkin  
fxsaber:

Эти поля соответствуют строке в во вкладке Торговля


Эти же значения показывают текущее состояние, а разве в структуре возвращаются не рассчитанные значения, которые будут после выполнения торговой операции?

fxsaber
17801
fxsaber  
Artyom Trishkin:

Эти же значения показывают текущее состояние, а разве в структуре возвращаются не рассчитанные значения, которые будут после выполнения торговой операции?

Показывает рассчитанные значения, которые были бы в этой строке, если бы торговый приказ исполнился.

fxsaber
17801
fxsaber  

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

Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения

Renat Fatkhullin, 2017.12.08 23:34

У нас нет структуры MqlDeal, так как форматы торговых записей плавающие и периодически расширяющиеся. Без этого нельзя расширять функционал платформы.

Поэтому единственный вариант, это доступаться к ним через Get функции. Причем доступ к остальным полям ранее затронутой записи в разы быстрее первого обращения, так как запись ложится в кеш.

В тесте выше номера сделок каждый раз новые, что постоянно сбивает кеш ранее выбранной сделки.

Artyom Trishkin
Модератор
58661
Artyom Trishkin  

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

MT5 vs MT4. Скорость заполнения массивов.

Renat Fatkhullin, 2017.12.12 12:19

1) Идея неправильная, локальные массивы быстрее не заполняются (грубо, не опускаясь на микро уровень)

2) Массивы быстро надо заполнять через штатные функции инициализации

3) Для максимизации скорости массив лучше держать вектором (одномерным), чтобы у тебя в руках оставалось больше шансов оптимизации доступа. Ибо многомерность жестко тебя ограничивает обязательными рамками и заставляет компилятор делать дополнительные постоянные вычисления многомерных индексов.

4) Массивы для быстрого доступа надо держать статическими, что резко уменьшает объем проверок на выходы за границы

fxsaber
17801
fxsaber  

Forum on trading, automated trading systems and testing trading strategies

Opening sell position in mql5

fxsaber, 2017.12.12 21:56

// true - not for trade by market-orders
bool IsBadFilling( const string Symb )
{
  return(!(SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE) & (SYMBOL_FILLING_IOC | SYMBOL_FILLING_FOK)));
}

void OnTick()
{
  if (IsBadFilling(_Symbol))
  {
    Print("Change symbol " + _Symbol + " or server " + AccountInfoString(ACCOUNT_SERVER) + " for trade by market!");
    
    ExpertRemove();    
  }
}


Result

2017.12.05 00:00:00   Change symbol EURUSD or server AMPGlobalClearing-Demo-CQG for trade by market!

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


Предлагаю, чтобы при нулевом SYMBOL_FILLING_MODE тестер подменял это значение на (SYMBOL_FILLING_IOC | SYMBOL_FILLING_FOK). Т.е. разрешал полноценную торговлю при невалидном задании брокера соответствующего поля символа.

fxsaber
17801
fxsaber  
// Опознает кривые COPY_TICKS_INFO-тики
// Отсутствие цены (высохшая сторона стакана - нулевая цена) не признается валидной ситуацией
bool IsTickInfoBad( const MqlTick &Tick )
{
  return(!Tick.ask || !Tick.bid || Tick.last || Tick.volume || ((Tick.flags & (0x7F ^ (TICK_FLAG_ASK | TICK_FLAG_BID))) != 0));
}

#define DEFINE_FIELD(A)             \
  if (!Ticks[i].##A)                \
    Ticks[i].##A = Ticks[i - 1].##A

// Корректирует ошибочные COPY_TICKS_INFO-тики
void CorrectTicksInfo( MqlTick &Ticks[] )
{
  const int Size = ArraySize(Ticks);
  
  for (int i = 1; i < Size; i++)
    if (IsTickInfoBad(Ticks[i]))
    {
      DEFINE_FIELD(bid);
      DEFINE_FIELD(ask);      
      
      Ticks[i].last = 0;
      Ticks[i].volume = 0;
      Ticks[i].flags = TICK_FLAG_ASK | TICK_FLAG_BID;
    }
}
Рекомендую что-то подобное делать каждый раз после CopyTicks(COPY_TICKS_INFO), чтобы ТС не слила счет случайно.