Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 133

 
Aliaksandr Kryvanos:

Привет!

Подскажите кто-нибудь аналог замены MaxLotCheck() из МТ5 для МТ4, спасибо

Самой функции нет. Нужно писать свою. Со всеми проверками должно в строк 10-20 уместиться.

 
Ihor Herasko:

Самой функции нет. Нужно писать свою. Со всеми проверками должно в строк 10-20 уместиться.

Хорошо, но вот сама формула?

 
Aliaksandr Kryvanos:

Хорошо, но вот сама формула?

Смотрим исходник:

//+------------------------------------------------------------------+
//| Access functions OrderCalcMargin(...).                           |
//| INPUT:  name            - symbol name,                           |
//|         trade_operation - trade operation,                       |
//|         price           - price of the opening position,         |
//|         percent         - percent of available margin [1-100%].   |
//+------------------------------------------------------------------+
double CAccountInfo::MaxLotCheck(const string symbol,const ENUM_ORDER_TYPE trade_operation,
                                 const double price,const double percent) const
  {
   double margin=0.0;
//--- checks
   if(symbol=="" || price<=0.0 || percent<1 || percent>100)
     {
      Print("CAccountInfo::MaxLotCheck invalid parameters");
      return(0.0);
     }
//--- calculate margin requirements for 1 lot
   if(!OrderCalcMargin(trade_operation,symbol,1.0,price,margin) || margin<0.0)
     {
      Print("CAccountInfo::MaxLotCheck margin calculation failed");
      return(0.0);
     }
//---
   if(margin==0.0) // for pending orders
      return(SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX));
//--- calculate maximum volume
   double volume=NormalizeDouble(FreeMargin()*percent/100.0/margin,2);
//--- normalize and check limits
   double stepvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP);
   if(stepvol>0.0)
      volume=stepvol*MathFloor(volume/stepvol);
//---
   double minvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   if(volume<minvol)
      volume=0.0;
//---
   double maxvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   if(volume>maxvol)
      volume=maxvol;
//--- return volume
   return(volume);
  }
Тут нужно заменить ENUM_ORDER_TYPE и OrderCalcMargin.
 
Ёмаё) исходник..., спасибо
 

Всё же непонятно.... 

margin = MarketInfo(Symbol(), MODE_MARGINREQUIRED)

и

double margin;

OrderCalcMargin(ORDER_TYPE_BUY,Symbol(),1.0,SymbolInfoDouble(Symbol(),SYMBOL_ASK),margin);


возвращают разные числа маржи для открытия 1 лота

 
Aliaksandr Kryvanos:

Всё же непонятно.... 

margin = MarketInfo(Symbol(), MODE_MARGINREQUIRED)

и

double margin;

OrderCalcMargin(ORDER_TYPE_BUY,Symbol(),1.0,SymbolInfoDouble(Symbol(),SYMBOL_ASK),margin);


возвращают разные числа маржи для открытия 1 лота

Сравниваете явно на разных терминалах )) Вверху - МТ4, внизу - МТ5. Значит, сервера разные, условия торговли - разные. Самое простое - разные плечи.

Что получили по факту, какие значения?

 

Да, всё верно, плечо другое, на одном 1/300, на втором 1/2000

спасибо

 

Всем привет!

Мой советник использует многоступенчатый поиск точки входа, для этого с момента старта сначала проверяет историю на предмет наличия сигналов, далее работает в режиме реального времени. Так вот в тестере стратегий, все исправно работает с историей, а когда запускаю в реальном времени, то он не правильно сканирует историю и пропускает сигналы, в чем может быть проблема?

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

 
ArturR:

Всем привет!

Мой советник использует многоступенчатый поиск точки входа, для этого с момента старта сначала проверяет историю на предмет наличия сигналов, далее работает в режиме реального времени. Так вот в тестере стратегий, все исправно работает с историей, а когда запускаю в реальном времени, то он не правильно сканирует историю и пропускает сигналы, в чем может быть проблема?

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

Производите отладку по частям. Выделите сканирование истории в скрипт. Выводите с помощью Alert() подробную информацию: прежде всего количество баров в истории, начальную и конечную дату, ... потом процесс сканирования. Возможно, удобнее это все записать в файл
 
STARIJ:
Производите отладку по частям. Выделите сканирование истории в скрипт. Выводите с помощью Alert() подробную информацию: прежде всего количество баров в истории, начальную и конечную дату, ... потом процесс сканирования. Возможно, удобнее это все записать в файл

Спасибо, за совет, почитаю как это сделать.

Есть еще один вопрос, когда запускаю отладку в реальном времени, то метатрейдер4 всегда запускает его на швейцарском франке, может кто нибудь знает, что подкрутить чтобы он запускался на паре которая нужна мне?

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