Обсуждение реализации советников. - страница 2

 
Georgiy Merts:
   

Я НЕ ПОНИМАЮ, как она работает.  Более того, и сам этот форумчанин при вопросе сказал, что уже не помнит, просто этот код уже многократно проверен, и ему можно доверять.

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

Кстати, занялся сегодня разбором этого ужаса.

Вот, что он означает:

ENUM_ORDER_TYPE_FILLING otfMyRes  = WRONG_VALUE;   

if(iFillingMode == 0 || (otfFilingType >= ORDER_FILLING_RETURN) || ((iFillingMode & (otfFilingType + 1)) != otfFilingType + 1))
	{
        if(steExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE || steExeMode == SYMBOL_TRADE_EXECUTION_INSTANT)
                otfMyRes = ORDER_FILLING_RETURN;
        else   
                if(iFillingMode == SYMBOL_FILLING_IOC)
                        otfMyRes = ORDER_FILLING_IOC;
                else
                        otfMyRes = ORDER_FILLING_FOK;
        }
   else      
        otfMyRes = otfFilingType;

return(otfMyRes);  

На мой взгляд, без этих "вопросиков", через if'ы и с отступами - гораздо более понятнее. Хотя, эффективность кода - совершенно одинакова.

Между прочим, сразу видно, что автор завязался на числовые значения iFillingMode  и otfFilingType, что, на мой взгляд, не есть хорошая практика.

 
Georgiy Merts:

Кстати, занялся сегодня разбором этого ужаса.

Вот, что он означает:

На мой взгляд, без этих "вопросиков", через if'ы и с отступами - гораздо более понятнее. Хотя, эффективность кода - совершенно одинакова.

Между прочим, сразу видно, что автор завязался на числовые значения iFillingMode  и otfFilingType, что, на мой взгляд, не есть хорошая практика.

В моей либе так:

#ifdef __MQL5__
   ENUM_ORDER_TYPE_FILLING COrder::GetFilling(ENUM_FILLING_MODE mFilling){
      if (!_fillingMode) return ORDER_FILLING_RETURN;
      else if (mFilling==FILLING_AUTO||mFilling==FILLING_FOK) return !(_fillingMode&SYMBOL_FILLING_FOK)?ORDER_FILLING_IOC:ORDER_FILLING_FOK;
      else return  !(_fillingMode&SYMBOL_FILLING_IOC)?ORDER_FILLING_FOK:ORDER_FILLING_IOC;}
#endif

_fillingMode - это макрос, который раскрывается в разыменование этого поля

fillingMode=(int)SymbolInfoInteger(symbol,SYMBOL_FILLING_MODE);
 
Georgiy Merts:

Так это другое дело.

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

Более того - я использую следующий код (для определения типа исполнения), который написан очень авторитетным форумчанином:

Я НЕ ПОНИМАЮ, как она работает.  Более того, и сам этот форумчанин при вопросе сказал, что уже не помнит, просто этот код уже многократно проверен, и ему можно доверять.

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

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

Красное - вот не поленился и еще раз проверил, при исполнении по рынку, нельзя ORDER_FILLING_RETURN, он только при биржевом (в доках ошибка), а именно это у уважаемого форумчанина и вернется)))

 
Vladimir Simakov:

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

Красное - вот не поленился и еще раз проверил, при исполнении по рынку, нельзя ORDER_FILLING_RETURN, он только при биржевом (в доках ошибка), а именно это у уважаемого форумчанина и вернется)))

Не знаю, не знаю. насколько этот код "тривиальный" в такой записи. У меня ушло не менее 15мин, чтобы разобраться в логике его работы, и только через расписывание по if'ам, мне стало понятно.

А насчет "в доках ошибка" - можно поподробнее ?

 
Georgiy Merts:

Не знаю, не знаю. насколько этот код "тривиальный" в такой записи. У меня ушло не менее 15мин, чтобы разобраться в логике его работы, и только через расписывание по if'ам, мне стало понятно.

А насчет "в доках ошибка" - можно поподробнее ?

При биржевом исполнении

SymbolInfoInteger(symbol,SYMBOL_FILLING_MODE)

возвращает 0, а вот при рыночном (проверял на Альпари)

SYMBOL_FILLING_IOC | SYMBOL_FILLING_FOK

, что равно 0х3. Если попробуешь при этом

MqlTradeRequest::filling_mode=ORDER_FILLING_RETURN

, то не откроется.

 
Vladimir Simakov:

то не откроется.

Проверил исходную функцию.

#include <MT4Orders.mqh>

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnTick()
{
  if (!OrdersTotal())
  {
    OrderSend(_Symbol, OP_BUY, 0.1, Ask, ORDER_FILLING_FOK, 0, 0);    
    OrderSend(_Symbol, OP_BUY, 0.1, Ask, ORDER_FILLING_IOC, 0, 0);    
    OrderSend(_Symbol, OP_BUY, 0.1, Ask, ORDER_FILLING_RETURN, 0, 0);    
  }  
}

Работает.

 
fxsaber:

Проверил исходную функцию.

Работает.

Попробуй на исполнении по рынку, а не на биржевом)

UPD: поправка, на немедленном исполнении, то, которое

SYMBOL_TRADE_EXECUTION_INSTANT

 
Vladimir Simakov:

Попробуй на исполнении по рынку, а не на биржевом)

UPD: поправка, на немедленном исполнении, то, которое

SYMBOL_TRADE_EXECUTION_INSTANT

Проверочный советник выше. Пробуйте.

 
Vladimir Simakov:

Попробуй на исполнении по рынку, а не на биржевом)

UPD: поправка, на немедленном исполнении, то, которое

SYMBOL_TRADE_EXECUTION_INSTANT

Это например счета типа стандарт в А-ри, верно?

И у брокеров с дилингом  всегда такое исполнение вроде как, да?

так для прояснения написал.

 

А зачем так мучиться ?

Используйте стандартные классы и не надо заполнить никаких структур (MqlTradeRequest) и не надо знать никаких Филлингов и Инстантов:


#include<Trade\SymbolInfo.mqh>
#include<Trade\AccountInfo.mqh>
#include<Trade\Trade.mqh>

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