FORTS: Как правильно составить запрос на открытие позиции по инструменту RTS

 

Всем привет!

Прошу помочь новичку.

Есть на рынке FORTS инструмент RTS-xx.xx

В спецификации инструмента есть параметр "Начальная маржа". На момент написания поста Начальная  маржа составляла 16079 рублей. Есть цены bid/ask (колеблются в районе 114580)

Если, используя интерфейс MetaTraider5, открыть позицию, объемом 1 с типом Биржевое исполнение, то это можно сделать, имея на счету сумму больше, чем начальная моржа, но явно меньше, чем реальная цена ask. Так было, когда я торговал на бирже "руками"

 

Я пытаюсь открыть такую позицию с помощью сл кода:

   if (Buy_Condition_1 && Buy_Condition_2)
      {
      
//--- 2. пример покупки по указанному символу
//--- количество знаков после запятой
   int    digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
//--- значение пункта
   double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT);
//--- получим цену покупки
   double price=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
//--- вычислим и нормализуем уровни SL и TP
   double SL=NormalizeDouble(price-200*point,digits);
   double TP=NormalizeDouble(price+1000*point,digits);
//--- заполним комментарий
   string comment="Buy "+_Symbol+" 1 at "+DoubleToString(price,digits);

   if(!trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,Lot,price,SL,TP,comment))
     {
      //--- сообщим о неудаче
      Print("Метод PositionOpen() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
            ". Описание кода: ",trade.ResultRetcodeDescription());
     }
   else
     {
      Print("Метод PositionOpen() выполнен успешно. Код возврата=",trade.ResultRetcode(),
            " (",trade.ResultRetcodeDescription(),")");
     }
}

 Далее, я запускаю тестер стратегий и получаю ошибку:

2016.12.14 16:11:35.082 2016.12.01 10:01:22   Метод PositionOpen() потерпел неудачу. Код возврата=10019. Описание кода: not enough money

2016.12.14 16:11:35.150 2016.12.01 10:01:22   current account state: Balance: 150000.00, Credit: 0.00, Commission: 0.00, Accumulated: 0.00, Assets: 0.00, Liabilities: 0.00, Equity 149623.80, Margin: 149614.00, FreeMargin: 9.80

2016.12.14 16:11:35.150 2016.12.01 10:01:22   calculated account state: Assets: 0.00, Liabilities: 0.00, Equity 149623.80, Margin: 150532.00, FreeMargin: -908.20

2016.12.14 16:11:35.150 2016.12.01 10:01:22   not enough money [exchange buy 1.00 RTS-12.16 at 104510 sl: 104310 tp: 105510]

  

Вот, как мне составить запрос так, чтобы, во-первых, получить ту реальную сумму, за которую можно открыть позицию и, собственно, открыть ее?

Спасибо.

 
canonier:

Всем привет!

Прошу помочь новичку.

Есть на рынке FORTS инструмент RTS-xx.xx

В спецификации инструмента есть параметр "Начальная маржа". На момент написания поста Начальная  маржа составляла 16079 рублей. Есть цены bid/ask (колеблются в районе 114580)

Если, используя интерфейс MetaTraider5, открыть позицию, объемом 1 с типом Биржевое исполнение, то это можно сделать, имея на счету сумму больше, чем начальная моржа, но явно меньше, чем реальная цена ask. Так было, когда я торговал на бирже "руками"

 

Я пытаюсь открыть такую позицию с помощью сл кода:

   if (Buy_Condition_1 && Buy_Condition_2)
      {
      
//--- 2. пример покупки по указанному символу
//--- количество знаков после запятой
   int    digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
//--- значение пункта
   double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT);
//--- получим цену покупки
   double price=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
//--- вычислим и нормализуем уровни SL и TP
   double SL=NormalizeDouble(price-200*point,digits);
   double TP=NormalizeDouble(price+1000*point,digits);
//--- заполним комментарий
   string comment="Buy "+_Symbol+" 1 at "+DoubleToString(price,digits);

   if(!trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,Lot,price,SL,TP,comment))
     {
      //--- сообщим о неудаче
      Print("Метод PositionOpen() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
            ". Описание кода: ",trade.ResultRetcodeDescription());
     }
   else
     {
      Print("Метод PositionOpen() выполнен успешно. Код возврата=",trade.ResultRetcode(),
            " (",trade.ResultRetcodeDescription(),")");
     }
}

 Далее, я запускаю тестер стратегий и получаю ошибку:

2016.12.14 16:11:35.082 2016.12.01 10:01:22   Метод PositionOpen() потерпел неудачу. Код возврата=10019. Описание кода: not enough money

2016.12.14 16:11:35.150 2016.12.01 10:01:22   current account state: Balance: 150000.00, Credit: 0.00, Commission: 0.00, Accumulated: 0.00, Assets: 0.00, Liabilities: 0.00, Equity 149623.80, Margin: 149614.00, FreeMargin: 9.80

2016.12.14 16:11:35.150 2016.12.01 10:01:22   calculated account state: Assets: 0.00, Liabilities: 0.00, Equity 149623.80, Margin: 150532.00, FreeMargin: -908.20

2016.12.14 16:11:35.150 2016.12.01 10:01:22   not enough money [exchange buy 1.00 RTS-12.16 at 104510 sl: 104310 tp: 105510]

  

Вот, как мне составить запрос так, чтобы, во-первых, получить ту реальную сумму, за которую можно открыть позицию и, собственно, открыть ее?

Спасибо.

Какой сервер применяется для тестов?
 
Это сервер Open-Broker. Я не знаю его ip. Это не демо, это реальный торговый сервер.
 
canonier:
Это сервер Open-Broker. Я не знаю его ip. Это не демо, это реальный торговый сервер.
Попробуйте написать в техподдержку Открытия. Или на форуме поискать, вроде была подобная тема где-то, но на демо MQ.
 
canonier:

Всем привет!

Прошу помочь новичку.

Есть на рынке FORTS инструмент RTS-xx.xx

В спецификации инструмента есть параметр "Начальная маржа". На момент написания поста Начальная  маржа составляла 16079 рублей. Есть цены bid/ask (колеблются в районе 114580)

Если, используя интерфейс MetaTraider5, открыть позицию, объемом 1 с типом Биржевое исполнение, то это можно сделать, имея на счету сумму больше, чем начальная моржа, но явно меньше, чем реальная цена ask. Так было, когда я торговал на бирже "руками"

 

Я пытаюсь открыть такую позицию с помощью сл кода:


Вот, как мне составить запрос так, чтобы, во-первых, получить ту реальную сумму, за которую можно открыть позицию и, собственно, открыть ее?

Спасибо.

//+------------------------------------------------------------------+
//| Expert Check money function                                      |
//+------------------------------------------------------------------+
bool CheckMoney(ENUM_ORDER_TYPE ord_type, const long volume, const double price)
{
  if (volume <= 0) return( false );
  bool res_check = false;
  double prim_go = 0;
  double free_margin = NormalizeDouble(( AccountInfoDouble( ACCOUNT_FREEMARGIN ) / 100 ) * 80, 2); //80% от свободных средств
  switch( ord_type )
  {
    case ORDER_TYPE_BUY_LIMIT:
      res_check = OrderCalcMargin( ord_type, Symbol(), volume, price, prim_go );
    break;
    case ORDER_TYPE_SELL_LIMIT:
      res_check = OrderCalcMargin( ord_type, Symbol(), volume, price, prim_go );
    break;                          
  }
//
  if(res_check)
  {
    if(free_margin >= prim_go)
    {
      return(true);
    }
  }
  Print(__FUNCTION__, ": Не хватает средств!");
  return(false);
}

Добавлено

Много раз уже писали, что для ФОРТС не стоит пользоваться стандартной библиотекой.

 
prostotrader:
//+------------------------------------------------------------------+
//| Expert Check money function                                      |
//+------------------------------------------------------------------+
bool CheckMoney(ENUM_ORDER_TYPE ord_type, const long volume, const double price)
{
  if (volume <= 0) return( false );
  bool res_check = false;
  double prim_go = 0;
  double free_margin = NormalizeDouble(( AccountInfoDouble( ACCOUNT_FREEMARGIN ) / 100 ) * 80, 2); //80% от сврбодных средств
  switch( ord_type )
  {
    case ORDER_TYPE_BUY_LIMIT:
      res_check = OrderCalcMargin( ord_type, Symbol(), volume, price, prim_go );
    break;
    case ORDER_TYPE_SELL_LIMIT:
      res_check = OrderCalcMargin( ord_type, Symbol(), volume, price, prim_go );
    break;                          
  }
//
  if(res_check)
  {
    if(free_margin >= prim_go)
    {
      return(true);
    }
  }
  Print(__FUNCTION__, ": Не хватает средств!");
  return(false);
}

Добавлено

Много раз уже писали, что для ФОРТС не стоит пользоваться стандартной библиотекой.

При чём здесь Ваше неумение писать код и стандартная библиотека? Если не умеете пользоваться, то хоть не несите околесицу в люди.
 
Vladimir Karputov:
При чём здесь Ваше неумение писать код и стандартная библиотека? Если не умеете пользоваться, то хоть не несите околесицу в люди.
Вы что ли умеете писать код?