Торговые системы: Как сократить код торгового эксперта, попутно упростив себе жизнь и уменьшив число возможных ошибок

 

New article Как сократить код торгового эксперта, попутно упростив себе жизнь и уменьшив число возможных ошибок has been published:

Простая концепция, изложенная в данной статье, позволит разработчикам МТС на MQL4 упростить существующие торговые системы, а также сократить время разработки новых систем за счет сокращения объема кода торговых экспертов.

Author: Roman Kramar

 
Прошу Вас прокомментировать, каким образом возвращается ноль или единица при модификации ордера, вопрос обсуждался на форуме. При этом утверждалось , что факт проведения модификации таким способом не выявляется.
if( OrderType() == OP_BUY )
{
    bool modified = OrderModify( OrderTicket(), OrderOpenPrice(), Bid - Point *
        TrailingStop, OrderTakeProfit(), OrderExpiration() );
 
    int error = GetLastError();
    if( !modified && error != ERR_NO_RESULT )
    {
        Print( "Failed to modify order " + OrderTicket() + ", error code: " +
            error );
    }
}
else
{
    modified = OrderModify( OrderTicket(), OrderOpenPrice(), Ask + Point *
        TrailingStop, OrderTakeProfit(), OrderExpiration() );
 
    error = GetLastError();
    if( !modified && error != ERR_NO_RESULT )
    {
        Print( "Failed to modify order " + OrderTicket() + ", error code: " +
            error );
    }
}
В данном случае  "bool modified" - возвращает факт модификации?
 
FION:
Прошу Вас прокомментировать, каким образом возвращается ноль или единица при модификации ордера, вопрос обсуждался на форуме. При этом утверждалось , что факт проведения модификации таким способом не выявляется.

В данном случае проводится проверка достаточного условия в плане безошибочности вызова функции OrderModify(). Переменная modified будет равна false, если вызов OrderModify() привел к ошибке, и true - если вызов OrderModify() прошел без ошибок (кроме случая с ERR_NO_RESULT, который обрабатывается отдельно) . Проверки действительной модификации ордера в данном коде не выполняется, т.к. в этом нет необходимости.

 
Попробовал писать как здесь советуют, и сразу наступило просветление. Теперь думаешь о стратегии , а не высматриваешь, где у тебя начинается else , а где кончается if.

Автору большое спасибо.

С уважением - С.Д.
 
Пожалуйста. Очень рад, что появляются сторонники моего подхода.
 

Уважаемый автор! Мне очень понравился Ваш подход к программированию, но лично у меня возникли небольшие проблеммы. Например, как встроить в код Вашего MACD Sampl-2 следующий фильтр: если предыдущая сделка убыточна, то следующая возможна только в противоположном направлении по сигналам MACD. То есть сигналы MACD на сделку в том же направлении - игнорируются.

 

Достаточно просто - примерно так (добавления выделены жирным):

int start()
{
    ...
 
      // check if we can enter the market
      if( MacdCurrent * tradeDirection < 0 && ( MacdCurrent - SignalCurrent ) * tradeDirection > 0
         && ( MacdPrevious - SignalPrevious ) * tradeDirection < 0 && MathAbs(MacdCurrent)>(MACDOpenLevel*Point)
         && ( MaCurrent - MaPrevious ) * tradeDirection > 0 )
        {
           OrderSelect( OrdersHistoryTotal() - 1, SELECT_BY_POS, MODE_HISTORY );
 
          double priceDelta = OrderClosePrice() - OrderOpenPrice();
 
          bool lastOrderWasProfitable = ( MathAbs( priceDelta ) >= Point &&
            sign( OrderClosePrice() - OrderOpenPrice() ) == orderDirection() );
 
          if( MathAbs( priceDelta ) < Point || lastOrderWasProfitable || tradeDirection == -orderDirection() )
                      {
             int orderType = iif( tradeDirection > 0, OP_BUY, OP_SELL );
             string orderTypeName = iifStr( tradeDirection > 0, "BUY", "SELL" );
 
             ...
           }
        }
 
    ...
}
 

Выражаю Вам признательность, Роман, за приведённый код. Однако он работает не совсем корректно. Он учитывает сделки только в течении суток, а надо минимум 2 недель. Я, к сожалению для себя, не могу справиться с этой задачей. Если у Вас есть время, Роман, буду весьма признателен.

 

Никаких ограничений по времени, прошедшему со времени последней сделки, в приведенном коде нет. Если он не работает на демо-счете вашего ДЦ, возможно он не предоставляет историю по сделкам более чем за сутки, но это сомнительно. Другой нюанс - приведенный код для простоты подразумевает, что на счете работает только один экземпляр данного эксперта, и нет никаких других сделок (совершаемых на других инструментах или вручную). Если вас не устраивает такое ограничение, тогда вам придется доработать процедуру получения результата последней сделки. Загляните сюда: 'как получить результат последней сделки?' - и поймете в какую сторону копать дальше.

 

Уважаемый Роман! Весьма признателен Вам за проявленное внимание к моим вопросам. Я обязательно воспользуюсь Вашим советом. Для прояснения вопроса хочу доложить условия тестирования: все тики, один час, 2007г. альпари, реальный счёт. Советник после убыточной сделки, например, продажа, вновь на следующие сутки открывает продажу и наоборот.

 
Приношу свои извинения автору. Приведённый код чередования сделок работает корректно.
Причина обращения: