ФОРТС Прошу помощи - страница 30

 
demonsn:
Спасибо. Добавил ваш вариант как параллельную проверку. Теперь бы отловить нужный момент.

Уверен на 100%, что будет работать!

Потому что Вы не правильно заполняли структуру (не только поля, но и значения). 

Странно, что компилятор не "ругался". 

Вы:

MqlTradeRequest.action = TRADE_ACTION_DEAL;

 а нужно:

MtRequest.action = TRADE_ACTION_DEAL;
 

Да нет же! Тот код который в моём сообщении это не из советника, он для примера, это подправленный кусок из логов, в которые пишется отладочная информация из советника. Виноват, очепятолся )

В самом советнике структура заполняется как нужно, а вот результат проверки бывает разный. То корректно рассчитывает маржу, то какую-то ерунду выдаёт, типа как в примере.

Вот кусок из живого места

   MqlTradeRequest MtRequest = {0}; 

   switch(OrderType)
   {
      case ORDER_TYPE_BUY:         
         MtRequest.price     = CurrentTick.ask;         
         break;

      case ORDER_TYPE_SELL:         
         MtRequest.price     = CurrentTick.bid;
         break;

      default:
         LogFile.Log(LOG_PRINT,__FUNCTION__," error: Invalid OrderType");
         return(false);
   }

   MtRequest.tp        = 0.0;
   MtRequest.sl        = 0.0;
   MtRequest.action    = TRADE_ACTION_DEAL;
   MtRequest.magic     = 0;
   MtRequest.symbol    = strSymbol;
   MtRequest.volume    = dblLots;
   MtRequest.deviation = Config.Deviation;
   MtRequest.type      = OrderType;
   MtRequest.type_filling = Config.OrdersFillingType;
 

Сделайте так:

   MqlTradeRequest MtRequest = {0}; 
   MqlTradeRequest MtResult = {0}; 

   switch(OrderType)
   {
      case ORDER_TYPE_BUY:         
         MtRequest.price     = CurrentTick.ask;         
         break;

      case ORDER_TYPE_SELL:         
         MtRequest.price     = CurrentTick.bid;
         break;

      default:
         LogFile.Log(LOG_PRINT,__FUNCTION__," error: Invalid OrderType");
         return(false);
   }

   MtRequest.action    = TRADE_ACTION_DEAL;
   MtRequest.magic     = 77777777777777;
   MtRequest.symbol    = strSymbol;
   MtRequest.volume    = dblLots;
   MtRequest.type      = OrderType;
   MtRequest.type_filling = Config.OrdersFillingType;
   MtRequest.type_time = ORDER_TIME_DAY;
 

Вот опять попался момент в логе:

 MqlTradeRequest structure:
   action: Action Deal
   magic: 0
   order: 0
   symbol: Si-12.15
   volume: 2.00
   price: 63365
   stoplimit: 0
   sl: 0
   tp: 0
   deviation: 50
   type: ORDER_TYPE_SELL
   type_filling: ORDER_FILLING_FOK
   type_time: gtc
   expiration: 1970.01.01 00:00
   comment: (null)

 MqlTradeCheckResult structure:
   retcode: 10019 (There is not enough money to complete the request)
   balance: 133921.71
   equity: 132772.57
   profit: 0.00
   margin: 172148.68
   margin_free: -39376.11
   margin_level: 77.13
   comment: No money

При этом я эту же структуру передаю в OrderSend() и всё отлично открывается!

Кстати, билд 1194.

Продаю Si-12.15, 2 лота. ГО на 1 контракт 5090 рублей. По сделке должно быть ГО 5090*2 = 10180 руб. А функция возвращает 172148,68 рублей, это соответствует 172148,68 / 5090 = 33,82 контракта!

Что за чудеса...

 
demonsn:

Вот опять попался момент в логе:

При этом я эту же структуру передаю в OrderSend() и всё отлично открывается!

Кстати, билд 1194.

Продаю Si-12.15, 2 лота. ГО на 1 контракт 5090 рублей. По сделке должно быть ГО 5090*2 = 10180 руб. А функция возвращает 172148,68 рублей, это соответствует 172148,68 / 5090 = 33,82 контракта!

Что за чудеса...

1. Я Вам дал образец, как правильно заполнять структуру, а Вы игнорируете эти советы.

Зачем тогда спрашиваете? 

2. Билд 1194 не совместим и текущими серверами (Ренат говорил об этом. Используйте пока билд 1159 ). 

3. Я вообще не использую функцию OrderCheck(), а сам проверяю средства

//+------------------------------------------------------------------+
//| Expert Check money function                                      |
//+------------------------------------------------------------------+ 
bool CheckMoney( const string a_symbol, const long volume )
{
  if ( volume <= 0 )
  {
    Print( "Check Money: Объём лота указан не правильно!" );
    retutn ( false );
  } 
//---
  double a_go = SymbolInfoDouble( a_symbol, SYMBOL_MARGIN_INITIAL ) * double( volume);
  double free_margin = ( AccountInfoDouble( ACCOUNT_FREEMARGIN ) / 100 ) * 90; //90% от свободных средств
//---  
  if ( a_go <= free_margin )
  {
    return( true );
  }
  Print( "Check Money: Не достаточно средств!" );
  return( false );
}
 
Михаил:

1. Я Вам дал образец, как правильно заполнять структуру, а Вы игнорируете эти советы.

Зачем тогда спрашиваете? 

2. Билд 1194 не совместим и текущими серверами (Ренат говорил об этом. Используйте пока билд 1159 ). 

3. Я вообще не использую функцию OrderCheck(), а сам проверяю средства


1. Ну почему же игнорирую. Вовсе не игнорирую. Я ваш образец включил в код, теперь наблюдаю.

2. Вот блин! Не знал.

3. Тоже самое сделал. И функция почти один в один, кроме 90% (кстати, хорошая идея )

Я как раз и поднял этот вопрос потому что моя функция (аналогичная Вашей) проверяет ГО и разрешает открытие позиции, а штатная OrderCheck() иногда глючит.


Вероятно, это относится к пункту 2.

В терминале журнал пестрит сообщениями типа:

2015.10.22 21:28:13.966 Ticks   old tick @RTS (tick: 2015.10.22 18:28:21, last: 2015.10.22 18:28:22) 0/0
2015.10.22 21:28:13.966 Ticks   old tick RTS-12.15 (tick: 2015.10.22 18:28:21, last: 2015.10.22 18:28:22) 0/0
2015.10.22 21:28:13.966 Ticks   old tick @RTS (tick: 2015.10.22 18:28:21, last: 2015.10.22 18:28:22) 0/0
2015.10.22 21:28:13.966 Ticks   old tick RTS-12.15 (tick: 2015.10.22 18:28:21, last: 2015.10.22 18:28:22) 0/0
2015.10.22 21:28:13.966 Ticks   old tick @RTS (tick: 2015.10.22 18:28:21, last: 2015.10.22 18:28:22) 0/0
2015.10.22 21:28:13.966 Ticks   old tick RTS-12.15 (tick: 2015.10.22 18:28:21, last: 2015.10.22 18:28:22) 0/0
2015.10.22 21:27:40.995 Ticks   old tick @LKOH (tick: 2015.10.22 18:27:48, last: 2015.10.22 18:27:49) 0/0
2015.10.22 21:27:40.995 Ticks   old tick LKOH-12.15 (tick: 2015.10.22 18:27:48, last: 2015.10.22 18:27:49) 0/0
2015.10.22 21:26:38.952 Ticks   old tick @Si (tick: 2015.10.22 18:26:46, last: 2015.10.22 18:26:47) 0/0
2015.10.22 21:26:38.952 Ticks   old tick Si-12.15 (tick: 2015.10.22 18:26:46, last: 2015.10.22 18:26:47) 0/0
2015.10.22 21:26:38.952 Ticks   old tick @Si (tick: 2015.10.22 18:26:46, last: 2015.10.22 18:26:47) 0/0
2015.10.22 21:26:38.952 Ticks   old tick Si-12.15 (tick: 2015.10.22 18:26:46, last: 2015.10.22 18:26:47) 0/0
2015.10.22 21:26:38.952 Ticks   old tick @Si (tick: 2015.10.22 18:26:46, last: 2015.10.22 18:26:47) 0/0
2015.10.22 21:26:38.952 Ticks   old tick Si-12.15 (tick: 2015.10.22 18:26:46, last: 2015.10.22 18:26:47) 0/0
2015.10.22 21:26:38.952 Ticks   old tick @Si (tick: 2015.10.22 18:26:46, last: 2015.10.22 18:26:47) 0/0
2015.10.22 21:26:38.952 Ticks   old tick Si-12.15 (tick: 2015.10.22 18:26:46, last: 2015.10.22 18:26:47) 0/0
2015.10.22 21:26:38.952 Ticks   old tick @Si (tick: 2015.10.22 18:26:46, last: 2015.10.22 18:26:47) 0/0
 
demonsn:


1. Ну почему же игнорирую. Вовсе не игнорирую. Я ваш образец включил в код, теперь наблюдаю.

2. Вот блин! Не знал.

3. Тоже самое сделал. И функция почти один в один, кроме 90% (кстати, хорошая идея )

Я как раз и поднял этот вопрос потому что моя функция (аналогичная Вашей) проверяет ГО и разрешает открытие позиции, а штатная OrderCheck() иногда глючит.

Ну так используйте на ФОРТС всё своё, - это гораздо правильнее :)
 
Михаил:
Ну так используйте на ФОРТС всё своё, - это гораздо правильнее :)

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

А получается так, что приходится неделю отлавливать чужие ошибки и недоработки. В итоге всё переписывается под себя так, что от чужого кода не остаётся и следа.

 

Здравствуйте!

В окне тестирования появились склейки фьючерсов, что само по себе очень радует, однако, при попытке сопоставить склейку с контрактом, обнаружил, что по склейке совершенно не происходит сделок - на контрактах все нормально - сделок достаточно много. Проверял на четырех инструментах Si,RTS,GAZR,SBRF и периоде 01.01.2015 -24.10.2015.

 
Andrey Kotrin:

Здравствуйте!

В окне тестирования появились склейки фьючерсов, что само по себе очень радует, однако, при попытке сопоставить склейку с контрактом, обнаружил, что по склейке совершенно не происходит сделок - на контрактах все нормально - сделок достаточно много. Проверял на четырех инструментах Si,RTS,GAZR,SBRF и периоде 01.01.2015 -24.10.2015.

Тестер на фьючерсах не корректно работает.
Причина обращения: