Проверка средств при постановке ордера.

 

Есть функция проверки маржи (прилагается).

Но периодически по паре GBPUSD вылетает ошибка:

2018.11.19 22:06:38.196 Core 1 2014.01.07 13:05:40   current account state: Balance: 649.22, Credit: 0.00, Commission: 0.00, Accumulated: 0.00, Assets: 0.00, Liabilities: 0.00, Equity 662.10, Margin: 460.11, FreeMargin: 201.99

2018.11.19 22:06:38.196 Core 1 2014.01.07 13:05:40   calculated account state: Assets: 0.00, Liabilities: 0.00, Equity 662.10, Margin: 690.21, FreeMargin: -28.11
2018.11.19 22:06:38.196 Core 1 2014.01.07 13:05:40   not enough money for order [#35 buy stop 0.14 / 0.14 GBPUSD.m at 1.64358]


Сама функция:

bool CheckMoneyForTrade(string symb,double lots,ENUM_ORDER_TYPE type)
  {
//--- получим цену открытия
   MqlTick mqltick;
   SymbolInfoTick(symb,mqltick);
   double price=0;
   if(type==ORDER_TYPE_BUY)
   price=mqltick.ask+Dist()*_Point;
   if(type==ORDER_TYPE_SELL)
      price=mqltick.bid-Dist()*_Point;
//--- значения необходимой и свободной маржи
   double margin,free_margin=AccountInfoDouble(ACCOUNT_MARGIN_FREE);
//--- вызовем функцию проверки
   if(!OrderCalcMargin(type,symb,lots,price,margin))
     {
      //--- что-то пошло не так, сообщим и вернем false
      Print("Error in ",__FUNCTION__," code=",GetLastError());
      return(false);
     }
//--- если не хватает средств на проведение операции
   if(margin>free_margin)
     {
      //--- сообщим об ошибке и вернем false
      Print("No money for ",EnumToString(type)," ",lots," ",symb);
      return(false);
     }
//--- проверка прошла успешно
   return(true);
  }

Требуется выставить стоп-ордер.

Что не так?

 
Vitaly Stepanov:

Что не так?

Попробуйте вывести на экран значение ваших переменных margin и free_margin

 
Vitaly Stepanov:

Есть функция проверки маржи (прилагается).

Но периодически по паре GBPUSD вылетает ошибка:

2018.11.19 22:06:38.196 Core 1 2014.01.07 13:05:40   current account state: Balance: 649.22, Credit: 0.00, Commission: 0.00, Accumulated: 0.00, Assets: 0.00, Liabilities: 0.00, Equity 662.10, Margin: 460.11, FreeMargin: 201.99

2018.11.19 22:06:38.196 Core 1 2014.01.07 13:05:40   calculated account state: Assets: 0.00, Liabilities: 0.00, Equity 662.10, Margin: 690.21, FreeMargin: -28.11
2018.11.19 22:06:38.196 Core 1 2014.01.07 13:05:40   not enough money for order [#35 buy stop 0.14 / 0.14 GBPUSD.m at 1.64358]


Сама функция:

Требуется выставить стоп-ордер.

Что не так?

а как у вас получаются разные значения одновременно?

 
Taras Slobodyanik:

а как у вас получаются разные значения одновременно?

Тестер возвращает такой ответ.
 
тогда надо сделать принт всех параметров/значений, в этом моменте, и посмотреть что к чему
 
bool CheckMoneyForTrade(string symb,double lots,double price,ENUM_ORDER_TYPE type)
  {
//--- значения необходимой и свободной маржи
   double margin,free_margin=AccountInfoDouble(ACCOUNT_MARGIN_FREE);
//--- вызовем функцию проверки
   if(!OrderCalcMargin(type,symb,lots,price,margin))
     {
      //--- что-то пошло не так, сообщим и вернем false
      Print("Error in ",__FUNCTION__," code=",GetLastError());
      return(false);
     }
//--- если не хватает средств на проведение операции
   if(margin>=free_margin)
     {
      //--- сообщим об ошибке и вернем false
      Print("No money for ",EnumToString(type)," ",free_margin," ",margin);
      return(false);
     }
  Print("OK ",EnumToString(type)," ",margin," ",free_margin);   
//--- проверка прошла успешно
   return(true);
  }

Модификация ордера:

2018.12.02 20:17:51.431 Core 1 2014.04.28 09:40:40   OK ORDER_TYPE_BUY_STOP 0.0 96.08

// Функция проверила возможность установки BUY_STOP. Маржа = 0, свободная маржа = 96.08. Дальше;

2018.12.02 20:17:51.431 Core 1 2014.04.28 09:40:40   order modified [#61 buy stop 0.08 GBPUSD.m at 1.68255]

2018.12.02 20:17:51.431 Core 1 2014.04.28 09:40:40   CTrade::OrderSend: modify #61 at 1.68255 (sl: 0.00000 tp: 0.00000) [done]

2018.12.02 20:17:51.431 Core 1 2014.04.28 09:40:40   The order is modified. Modify parameters:10009 (1.68255)

// Бот пишет, что ордер модифицирован. Дальше тестер:

2018.12.02 20:17:51.431 Core 1 2014.04.28 09:55:40   current account state: Balance: 353.42, Credit: 0.00, Commission: 0.00, Accumulated: 0.00, Assets: 0.00, Liabilities: 0.00, Equity 381.10, Margin: 268.86, FreeMargin: 112.24

2018.12.02 20:17:51.431 Core 1 2014.04.28 09:55:40   calculated account state: Assets: 0.00, Liabilities: 0.00, Equity 381.10, Margin: 403.46, FreeMargin: -22.36
2018.12.02 20:17:51.431 Core 1 2014.04.28 09:55:40   not enough money for order [#61 buy stop 0.08 / 0.08 GBPUSD.m at 1.68255]


Дальше опять все хорошо:

2018.12.02 20:17:51.431 Core 1 2014.04.28 09:55:40   OK ORDER_TYPE_BUY_STOP 0.0 112.24

Функция одобряет установку ордера, бот размещает BUY_STOP.

В чем дело?

 
Vitaly Stepanov:

Модификация ордера:

2018.12.02 20:17:51.431 Core 1 2014.04.28 09:40:40   OK ORDER_TYPE_BUY_STOP 0.0 96.08

// Функция проверила возможность установки BUY_STOP. Маржа = 0, свободная маржа = 96.08. Дальше;

2018.12.02 20:17:51.431 Core 1 2014.04.28 09:40:40   order modified [#61 buy stop 0.08 GBPUSD.m at 1.68255]

2018.12.02 20:17:51.431 Core 1 2014.04.28 09:40:40   CTrade::OrderSend: modify #61 at 1.68255 (sl: 0.00000 tp: 0.00000) [done]

2018.12.02 20:17:51.431 Core 1 2014.04.28 09:40:40   The order is modified. Modify parameters:10009 (1.68255)

// Бот пишет, что ордер модифицирован. Дальше тестер:

2018.12.02 20:17:51.431 Core 1 2014.04.28 09:55:40   current account state: Balance: 353.42, Credit: 0.00, Commission: 0.00, Accumulated: 0.00, Assets: 0.00, Liabilities: 0.00, Equity 381.10, Margin: 268.86, FreeMargin: 112.24

2018.12.02 20:17:51.431 Core 1 2014.04.28 09:55:40   calculated account state: Assets: 0.00, Liabilities: 0.00, Equity 381.10, Margin: 403.46, FreeMargin: -22.36
2018.12.02 20:17:51.431 Core 1 2014.04.28 09:55:40   not enough money for order [#61 buy stop 0.08 / 0.08 GBPUSD.m at 1.68255]


Дальше опять все хорошо:

2018.12.02 20:17:51.431 Core 1 2014.04.28 09:55:40   OK ORDER_TYPE_BUY_STOP 0.0 112.24

Функция одобряет установку ордера, бот размещает BUY_STOP.

В чем дело?

Дело в том, что Вы ищете не под тем фонарем. Судя по принтам все вычисления текущей маржи и маржи после исполнения отложенного ордера вычисляются в функции OrderCalcMargin(). Именно она Вам пишет, что не хватит маржи для исполнения отложенного ордера. А Вы эти сообщения игнорируете. У меня получается, что плечо у Вас 1:100.

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

При срабатывании отложника и открытии позиции, тестер-терминал с матюками удаляет ордер.

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

Вопрос: как в этом случае решить вопрос с проверкой средств?

Причина обращения: