Типичный ответ человека, не прокомментировавшего сложный код. :)
Удивительно, как люди пишут еще более сложные конструкции, совершенно не описывая, как они работают - потом же все это забывается, и если что - приходится заново разбираться !
Типичный ответ человека, не прокомментировавшего сложный код. :)
Удивительно, как люди пишут еще более сложные конструкции, совершенно не описывая, как они работают - потом же все это забывается, и если что - приходится заново разбираться !
, что конструкция примитивнейшая. Но разбираться в этом нет ни малейшего желания. Помню только, что этому решению больше года, оно выдрано из одной библиотеки и проверено довольно жестко. Придумать было непросто, поэтому вспоминать все нюансы, которые учитывались при написании - ненужная потеря времени. Написал, проверил и забыл. Буду думать на эту тему только в случае, если найдется ситуация, когда не будет работать. Но это вряд ли.
//+------------------------------------------------------------------+//| Checks and corrects type of filling policy |//+------------------------------------------------------------------+bool CTrade::FillingCheck(conststring symbol)
{
//--- get execution mode of orders by symbolENUM_SYMBOL_TRADE_EXECUTION exec=(ENUM_SYMBOL_TRADE_EXECUTION)SymbolInfoInteger(symbol,SYMBOL_TRADE_EXEMODE);
//--- check execution modeif(exec==SYMBOL_TRADE_EXECUTION_REQUEST || exec==SYMBOL_TRADE_EXECUTION_INSTANT)
{
//--- neccessary filling type will be placed automaticallyreturn(true);
}
//--- get possible filling policy types by symboluint filling=(uint)SymbolInfoInteger(symbol,SYMBOL_FILLING_MODE);
//--- check execution mode againif(exec==SYMBOL_TRADE_EXECUTION_MARKET)
{
//--- for the MARKET execution mode//--- analyze orderif(m_request.action!=TRADE_ACTION_PENDING)
{
//--- in case of instant execution order//--- if the required filling policy is supported, add it to the requestif((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 modeswitch(m_type_filling)
{
caseORDER_FILLING_FOK:
//--- analyze orderif(m_request.action==TRADE_ACTION_PENDING)
{
//--- in case of pending order//--- add the expiration mode to the requestif(!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 requestif((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);
caseORDER_FILLING_IOC:
//--- analyze orderif(m_request.action==TRADE_ACTION_PENDING)
{
//--- in case of pending order//--- add the expiration mode to the requestif(!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 requestif((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);
caseORDER_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);
}
Помню только, что этому решению больше года, оно выдрано из одной библиотеки и проверено довольно жестко. Придумать было непросто, поэтому вспоминать все нюансы, которые учитывались при написании - ненужная потеря времени. Написал, проверил и забыл. Буду думать на эту тему только в случае, если найдется ситуация, когда не будет работать. Но это вряд ли.
Ну, дык я себе все и забрал. Хрен с ним, что не вполне понятно, что там и к чему. Раз работает - не будем трогать.
Просто я люблю, когда мне все ясно, и вот таких сложных выражений нет.
Вот простой пример, результат которого я не могу понять.
//+------------------------------------------------------------------+ //| 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 |//+------------------------------------------------------------------+voidOnStart()
{ ENUM_ORDER_TYPE_FILLING fill;
for(fill=0;fill<3;fill++)
if ( IsFillingTypeAllowed(_Symbol,fill) )
Print("YES : ",fill," = ",EnumToString(fill));
elsePrint(" NO : ",fill," = ",EnumToString(fill));
}
Я говорил о filling, что на разных MT5, получается 0,1,2,3
Вот на скрине результаты, чтобы обходить их я применил вот это:
SYMBOL_FILLING_MODE - это флаг, который определяет комбинацию допустимых значений. В данном случае - разрешенных политик исполнения. Вы же просто смотрите на значение этого поля и делаете какие-то выводы.
SYMBOL_FILLING_MODE - это флаг, который определяет комбинацию допустимых значений. В данном случае - разрешенных политик исполнения. Вы же просто смотрите на значение этого поля и делаете какие-то выводы.
Я делаю именно такие выводы для того, что надо было более простое решение придумать, а не предлагать такой длинный пример FillingCheck.
Не помню, как она работает.
Типичный ответ человека, не прокомментировавшего сложный код. :)
Удивительно, как люди пишут еще более сложные конструкции, совершенно не описывая, как они работают - потом же все это забывается, и если что - приходится заново разбираться !
Типичный ответ человека, не прокомментировавшего сложный код. :)
Удивительно, как люди пишут еще более сложные конструкции, совершенно не описывая, как они работают - потом же все это забывается, и если что - приходится заново разбираться !
Вы показали
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Формула для filling
George Merts, 2018.02.27 06:47
Вот так, на мой взгляд, куда понятнее:
, что конструкция примитивнейшая. Но разбираться в этом нет ни малейшего желания. Помню только, что этому решению больше года, оно выдрано из одной библиотеки и проверено довольно жестко. Придумать было непросто, поэтому вспоминать все нюансы, которые учитывались при написании - ненужная потеря времени. Написал, проверил и забыл. Буду думать на эту тему только в случае, если найдется ситуация, когда не будет работать. Но это вряд ли.
Есть же метод FillingCheck в классе CTrade
Можно его подправить под свои нужды
Помню только, что этому решению больше года, оно выдрано из одной библиотеки и проверено довольно жестко. Придумать было непросто, поэтому вспоминать все нюансы, которые учитывались при написании - ненужная потеря времени. Написал, проверил и забыл. Буду думать на эту тему только в случае, если найдется ситуация, когда не будет работать. Но это вряд ли.
Ну, дык я себе все и забрал. Хрен с ним, что не вполне понятно, что там и к чему. Раз работает - не будем трогать.
Просто я люблю, когда мне все ясно, и вот таких сложных выражений нет.
.....
или через системную SymbolInfoInteger:
Вот простой пример, результат которого я не могу понять.
Результат сервера :
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 не должно работать , но на самом деле именно тот режим работает. Почему так ?
Вот простой пример, результат которого я не могу понять.
Результат сервера :
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
Вы точно проверяете то, что нужно?
Вот скрипт
и результат
Вы точно проверяете то, что нужно?
Вот скрипт
и результат
Я говорил о filling, что на разных MT5, получается 0,1,2,3
Вот на скрине результаты, чтобы обходить их я применил вот это:
Я говорил о filling, что на разных MT5, получается 0,1,2,3
Вот на скрине результаты, чтобы обходить их я применил вот это:
SYMBOL_FILLING_MODE - это флаг, который определяет комбинацию допустимых значений. В данном случае - разрешенных политик исполнения. Вы же просто смотрите на значение этого поля и делаете какие-то выводы.
SYMBOL_FILLING_MODE - это флаг, который определяет комбинацию допустимых значений. В данном случае - разрешенных политик исполнения. Вы же просто смотрите на значение этого поля и делаете какие-то выводы.
Я делаю именно такие выводы для того, что надо было более простое решение придумать, а не предлагать такой длинный пример FillingCheck.