Формула для filling - страница 2

 
fxsaber:

Не помню, как она работает.

Типичный ответ человека, не прокомментировавшего сложный код.  :)

Удивительно, как люди пишут еще более сложные конструкции, совершенно не описывая, как они работают - потом же все это забывается, и если что - приходится заново разбираться !

 
George Merts:

Типичный ответ человека, не прокомментировавшего сложный код.  :)

Удивительно, как люди пишут еще более сложные конструкции, совершенно не описывая, как они работают - потом же все это забывается, и если что - приходится заново разбираться !

Вы показали

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Формула для filling

George Merts, 2018.02.27 06:47

Вот так, на мой взгляд, куда понятнее:

if((iFillingMode == 0 ||  (Type >= ORDER_FILLING_RETURN) || ((FillingMode & (Type + 1)) != Type + 1)) == true)
    {
    if(ExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE) || (ExeMode == SYMBOL_TRADE_EXECUTION_INSTANT) 
        return(ORDER_FILLING_RETURN)
    else   
        if(FillingMode == SYMBOL_FILLING_IOC)
            return(ORDER_FILLING_IOC)
          else
            return(ORDER_FILLING_FOK); 
    }           
else
    return((ENUM_ORDER_TYPE_FILLING)Type);

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

 

Есть же метод FillingCheck в классе CTrade

//+------------------------------------------------------------------+
//| Checks and corrects type of filling policy                       |
//+------------------------------------------------------------------+
bool CTrade::FillingCheck(const string symbol)
  {
//--- get execution mode of orders by symbol
   ENUM_SYMBOL_TRADE_EXECUTION exec=(ENUM_SYMBOL_TRADE_EXECUTION)SymbolInfoInteger(symbol,SYMBOL_TRADE_EXEMODE);
//--- check execution mode
   if(exec==SYMBOL_TRADE_EXECUTION_REQUEST || exec==SYMBOL_TRADE_EXECUTION_INSTANT)
     {
      //--- neccessary filling type will be placed automatically
      return(true);
     }
//--- get possible filling policy types by symbol
   uint filling=(uint)SymbolInfoInteger(symbol,SYMBOL_FILLING_MODE);
//--- check execution mode again
   if(exec==SYMBOL_TRADE_EXECUTION_MARKET)
     {
      //--- for the MARKET execution mode
      //--- analyze order
      if(m_request.action!=TRADE_ACTION_PENDING)
        {
         //--- in case of instant execution order
         //--- if the required filling policy is supported, add it to the request
         if((filling&SYMBOL_FILLING_FOK)==SYMBOL_FILLING_FOK)
           {
            m_type_filling=ORDER_FILLING_FOK;
            m_request.type_filling=m_type_filling;
            return(true);
           }
         if((filling&SYMBOL_FILLING_IOC)==SYMBOL_FILLING_IOC)
           {
            m_type_filling=ORDER_FILLING_IOC;
            m_request.type_filling=m_type_filling;
            return(true);
           }
         //--- wrong filling policy, set error code
         m_result.retcode=TRADE_RETCODE_INVALID_FILL;
         return(false);
        }
      return(true);
     }
//--- EXCHANGE execution mode
   switch(m_type_filling)
     {
      case ORDER_FILLING_FOK:
         //--- analyze order
         if(m_request.action==TRADE_ACTION_PENDING)
           {
            //--- in case of pending order
            //--- add the expiration mode to the request
            if(!ExpirationCheck(symbol))
               m_request.type_time=ORDER_TIME_DAY;
            //--- stop order?
            if(m_request.type==ORDER_TYPE_BUY_STOP || m_request.type==ORDER_TYPE_SELL_STOP ||
               m_request.type==ORDER_TYPE_BUY_LIMIT || m_request.type==ORDER_TYPE_SELL_LIMIT)
              {
               //--- in case of stop order
               //--- add the corresponding filling policy to the request
               m_request.type_filling=ORDER_FILLING_RETURN;
               return(true);
              }
           }
         //--- in case of limit order or instant execution order
         //--- if the required filling policy is supported, add it to the request
         if((filling&SYMBOL_FILLING_FOK)==SYMBOL_FILLING_FOK)
           {
            m_request.type_filling=m_type_filling;
            return(true);
           }
         //--- wrong filling policy, set error code
         m_result.retcode=TRADE_RETCODE_INVALID_FILL;
         return(false);
      case ORDER_FILLING_IOC:
         //--- analyze order
         if(m_request.action==TRADE_ACTION_PENDING)
           {
            //--- in case of pending order
            //--- add the expiration mode to the request
            if(!ExpirationCheck(symbol))
               m_request.type_time=ORDER_TIME_DAY;
            //--- stop order?
            if(m_request.type==ORDER_TYPE_BUY_STOP || m_request.type==ORDER_TYPE_SELL_STOP ||
               m_request.type==ORDER_TYPE_BUY_LIMIT || m_request.type==ORDER_TYPE_SELL_LIMIT)
              {
               //--- in case of stop order
               //--- add the corresponding filling policy to the request
               m_request.type_filling=ORDER_FILLING_RETURN;
               return(true);
              }
           }
         //--- in case of limit order or instant execution order
         //--- if the required filling policy is supported, add it to the request
         if((filling&SYMBOL_FILLING_IOC)==SYMBOL_FILLING_IOC)
           {
            m_request.type_filling=m_type_filling;
            return(true);
           }
         //--- wrong filling policy, set error code
         m_result.retcode=TRADE_RETCODE_INVALID_FILL;
         return(false);
      case ORDER_FILLING_RETURN:
         //--- add filling policy to the request
         m_request.type_filling=m_type_filling;
         return(true);
     }
//--- unknown execution mode, set error code
   m_result.retcode=TRADE_RETCODE_ERROR;
   return(false);
  }

Можно его подправить под свои нужды

 
fxsaber:
 

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

Ну, дык я себе все и забрал.  Хрен с ним, что не вполне понятно, что там и к чему. Раз работает - не будем трогать.

Просто я люблю, когда мне все ясно, и вот таких сложных выражений нет.

 
Vladimir Karputov:
.....

или через системную SymbolInfoInteger:

Вот простой пример, результат которого я не могу понять.

//+------------------------------------------------------------------+ 
//| Checks if the specified filling mode is allowed                  | 
//+------------------------------------------------------------------+ 
bool IsFillingTypeAllowed(string symbol,int fill_type)
  {
//--- Obtain the value of the property that describes allowed filling modes 
   int filling=(int)SymbolInfoInteger(symbol,SYMBOL_FILLING_MODE);
//--- Return true, if mode fill_type is allowed 
   return((filling & fill_type)==fill_type);
  }

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{ ENUM_ORDER_TYPE_FILLING fill;
  for(fill=0;fill<3;fill++)
    if ( IsFillingTypeAllowed(_Symbol,fill) )
         Print("YES : ",fill," = ",EnumToString(fill));
    else Print(" NO : ",fill," = ",EnumToString(fill));
}

Результат сервера :

2018.02.27 15:28:42.950    TestFilling2 (EURUSDmicro,H1)    YES : 0 = ORDER_FILLING_FOK
2018.02.27 15:28:42.950    TestFilling2 (EURUSDmicro,H1)     NO : 1 = ORDER_FILLING_IOC
2018.02.27 15:28:42.950    TestFilling2 (EURUSDmicro,H1)    YES : 2 = ORDER_FILLING_RETURN

Кажется 1 = ORDER_FILLING_IOC не должно работать , но на самом деле именно тот режим работает. Почему так ?


 
Ivan Ivanov:

Вот простой пример, результат которого я не могу понять.

Результат сервера :

2018.02.27 15:28:42.950    TestFilling2 (EURUSDmicro,H1)    YES : 0 = ORDER_FILLING_FOK
2018.02.27 15:28:42.950    TestFilling2 (EURUSDmicro,H1)     NO : 1 = ORDER_FILLING_IOC
2018.02.27 15:28:42.950    TestFilling2 (EURUSDmicro,H1)    YES : 2 = ORDER_FILLING_RETURN

Кажется 1 = ORDER_FILLING_IOC не должно работать , но на самом деле именно тот режим работает. Почему так ?


Я же говорил что в зависимости от брокера или типа счета,  значение filling получается 0,1,2 и 3

int filling=(int)SymbolInfoInteger(symbol,SYMBOL_FILLING_MODE);
 

Вы точно проверяете то, что нужно?

Вот скрипт

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   Print("ORDER_FILLING_FOK=",ORDER_FILLING_FOK);
   Print("ORDER_FILLING_IOC=",ORDER_FILLING_IOC);
   Print("ORDER_FILLING_RETURN=",ORDER_FILLING_RETURN);
   Print("----------");
   Print("SYMBOL_FILLING_FOK=",SYMBOL_FILLING_FOK);
   Print("SYMBOL_FILLING_IOC=",SYMBOL_FILLING_IOC);
  }

и результат


 
Rashid Umarov:

Вы точно проверяете то, что нужно?

Вот скрипт

и результат


Я говорил о filling, что на разных MT5, получается  0,1,2,3

void OnStart()
  {
   
   int  filling=(int)SymbolInfoInteger(_Symbol,SYMBOL_FILLING_MODE);
   Print("filling=",filling);
   
  }

Вот на скрине результаты, чтобы обходить их я применил вот это:


 if(filling != 1 )  request.type_filling=ORDER_FILLING_FOK | ORDER_FILLING_IOC;


 

 
Petros Shatakhtsyan:

Я говорил о filling, что на разных MT5, получается  0,1,2,3

Вот на скрине результаты, чтобы обходить их я применил вот это:

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

 
Rashid Umarov:

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

Я делаю именно такие выводы для того, что надо было более простое решение придумать, а не предлагать такой длинный пример FillingCheck.

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