Обновление платформы MetaTrader 4 build 670: виртуальный хостинг, web-запросы и работа с сигналами из MQL-программ - страница 19

 
rustein:
И в ручную, и через one click, и роботами, и скриптами...
Только переподключением  и удается увидеть заново позиции... Так что это я делаю каждые несколько минут, уже несколько часов.

ПС, Я могу дать данные, для входа, если создатели заинтересованы найти проблему. Можете сами посмотреть и порпобовать закрыть ордер. Свяжитесь со мной через е-майл.

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

Приносим свои извинения за доставленные неудобства.

 

Справка:

ArraySize

Возвращает количество элементов указанного массива.

int  ArraySize(
   const void&  array[]    // проверяемый массив
   );

В реальности так:

    int array[5];
    Alert (ArraySize (array) > -1);

не работает. Работает так:

    int array[5];
    Alert ((int) ArraySize (array) > -1);

- значит, функция возвращает значение типа uint. Поправьте справку.

P.S. Meat несколько дней назад подымал этот вопрос, а справка до сих пор не исправлена.

 

Похоже, принадлежу к числу немногих, кто использует тестер вдумчиво... Продолжаю его мучить. Одну ошибку уже нашел, теперь вторая.

Речь пойдет об учете комисси в тестере. Напишем тестовый советник расчета комиссии:

#property strict

#define A_MILLION 0.000001

int GetLotDigits( string Symb )
{
  int LotDigits = 0;
  double LotStep = MarketInfo(Symb, MODE_LOTSTEP);
  
  if (LotStep > 0)
    while (LotStep < 1 - A_MILLION)
    {
      LotStep *= 10;
      LotDigits++;
    }
  
  return(LotDigits);
}

double GetMaxLot( string Symb )
{
  return (NormalizeDouble(MathMin(AccountEquity() / MarketInfo(Symb, MODE_MARGINREQUIRED) - MarketInfo(Symb, MODE_LOTSTEP),
                                  MarketInfo(Symb, MODE_MAXLOT)), GetLotDigits(Symb)));                  
}

void OpenClose()
{
  string Symb = Symbol();
  double Lots = GetMaxLot(Symb);
  int Ticket = OrderSend(Symb, OP_SELL, Lots, Bid, 0, 0, 0);
  
  OrderClose(Ticket, Lots, Ask, 0);
  
  OrderSelect(Ticket, SELECT_BY_TICKET, MODE_HISTORY);
  
  return;
}

double GetOrderCommission( bool Alternative = FALSE )
{
  double Commission;
  
  if (Alternative && (OrderProfit() != 0))
    Commission = MathAbs(OrderCommission() * (OrderClosePrice() - OrderOpenPrice()) / (OrderOpenPrice() * OrderProfit()));
  else 
    Commission = -OrderCommission() * MarketInfo(OrderSymbol(), MODE_TICKSIZE) /
                 (OrderOpenPrice() * OrderLots() * MarketInfo(OrderSymbol(), MODE_TICKVALUE));
  
  return(Commission);
}

void init()
{
  OpenClose();
  
  Print("Commission1 (full round) = " + DoubleToStr(GetOrderCommission(TRUE) / A_MILLION) + " per mio.");
  Print("Commission2 (full round) = " + DoubleToStr(GetOrderCommission() / A_MILLION) + " per mio.");
  
  OrderPrint();
  
  return;
}

void start()
{
  return;
}

Залогинился на счет, где комиссия равна 36 у.е. за 1 миллион у.е. (полный круг).

Запуская в тестере данный советник выяснил, что комиссия считается корректно для разных символов и для разных валют торгового счета. Более того, если на том же торговом сервере зайти на счет с другой комиссией. То комиссия в тестере тоже изменится. Т.е. данные о  размере комиссии в тестере привязаны не к торговому серверу, а к торговому счету (config\accounts.ini - здесь, видимо ). Что есть правильно.

Однако, все же для одной валютной пары в тестере комиссия вычисляется неверно:

 

Речь идет о помеченной красным USDJPY. Причем для всех остальных XXXJPY комиссия вычисляется верно.

Да и из здравого смысла вы можете видеть по скрину, что за 10 лотов USDJPY ну никак нельзя заплатить комиссию в размере $0.35 (USD выставлена в качестве валюты тестерного торгового счета). Забегая вперед скажу, что на реальном торговом счете комиссия по USDJPY начислялась корректно. Т.е. проблема, похоже, именно в тестере.

 

Прошу разработчиков прокомментировать. И планируется ли добавление штатной возможности задавать комиссию в тестере?

 

Вот кстати к разговору о комиссиях:  Когда уже наконец можно будет программно узнать комиссию по инструменту? Разработчики, ну ё-маё!  Уж скоко лет об этом просим. Это реально необходимая вещь для торговли.  А всякие ваши танцы-шманцы с MQL, Сигналами и прочим - это уже вторично, т.к. не относится непосредственно к трейдингу.

 
Вопрос к Metaquotes. Не планируется ли в редакторе MetaEditor добавить функцию наложения логического условия по watch-переменным на точку останова?
 

Куда дели торговую панель? Положите на место!

 
Ashes:

Куда дели торговую панель? Положите на место!


Всё в терминале на месте. А Вы про какую панель?
 
Meat:

Вот кстати к разговору о комиссиях:  Когда уже наконец можно будет программно узнать комиссию по инструменту? Разработчики, ну ё-маё!  Уж скоко лет об этом просим. Это реально необходимая вещь для торговли.  А всякие ваши танцы-шманцы с MQL, Сигналами и прочим - это уже вторично, т.к. не относится непосредственно к трейдингу.

Запустите код выше в тестере (выбрать только валюту счета в тестере, отличную от USD - см. ниже) - сразу узнаете текущую комиссию у себя на счете. Хотя, конечно, вы имели в виду вариант прямых рук:

MarketInfo(SymbolName, MODE_COMMISSION);
Видимо, разработчики еще не совсем знают, какой ответ давать. Ведь комиссия в MT4 может начисляться двумя способами - относительный (процент от цены - самый распространенный в мире) и абсолютный (за лот, вне зависимости от смысла торгуемого символа).
 
ide92993:

Похоже, принадлежу к числу немногих, кто использует тестер вдумчиво... Продолжаю его мучить. Одну ошибку уже нашел, теперь вторая.

Речь пойдет об учете комисси в тестере. Напишем тестовый советник расчета комиссии:

Залогинился на счет, где комиссия равна 36 у.е. за 1 миллион у.е. (полный круг).

Запуская в тестере данный советник выяснил, что комиссия считается корректно для разных символов и для разных валют торгового счета. Более того, если на том же торговом сервере зайти на счет с другой комиссией. То комиссия в тестере тоже изменится. Т.е. данные о  размере комиссии в тестере привязаны не к торговому серверу, а к торговому счету (config\accounts.ini - здесь, видимо ). Что есть правильно.

Однако, все же для одной валютной пары в тестере комиссия вычисляется неверно:

 

Речь идет о помеченной красным USDJPY. Причем для всех остальных XXXJPY комиссия вычисляется верно.

Перехвалил разрабов из-за своей невнимательности к результатам выложенного выше советника для тестера. Оказывается, MT4-тестер неправильно вычисляет комиссию для всех USDXXX-символов, если в тестере в качестве валюты счета выбрана USD. Если в тестере выбрать отличную от USD-валюту (например, EUR или DKK) - комиссия будет вычисляться в тестере верно.


 

Это баг и очень серьезный. Но поскольку тестером, видимо, пользуются без понимания, что к чему, баг уже давно с седой бородой. Компетенция, однако...

Желающие могут портировать MQL4-код на MQL5 и проверить наличие подобного бага в MT5-тестере...

 

Что же касается всех XXXYYY, где XXX != USD. То комиссию для них вычисляет правильно (внимательно перебрал) , включая экзотику (NOKSGD и т.д.) и металлы. При этом вычисляет правильно для любых валют счета, выбранных в тестере.

 

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

 
barabashkakvn:

Всё в терминале на месте. А Вы про какую панель?


Я вот об этом:

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

Вопрос закрыт.