Советники: Diff_TF_MA_EA - страница 2

 
fxsaber:

В коде на самом деле есть еще ошибки. Например, хорошо показано, что использовать CSymbolInfo лишь ради СБ-style - зло.

Закрывать позиции через ранее собранный список тикетов - зло. Это очень распространенная ошибка.

Думаю, вот это говорит о многом:

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

Насчёт обработки кодов возврата сервера. Лично я их всегда обрабатываю. Здесь же - в тестере (я надеюсь, вы понимаете, что учебный советник делается для тестера и для дальнейших его доработок уже самостоятельно) - не стоит наверное лепить обработку всех необходимых кодов возврата. Равно, как и всегда иметь своё торговое окружение вполне себя оправдывает как для реальной торговли, так и, тем более для тестера.

Можно поглядеть чего там есть:

Сначала идёт заполнение данных о имеющихся позициях:

//--- Заполнение списков тикетов позиций
   int positions_total=PositionsTotal();
   if(prev_total!=positions_total)
     {
      FillingListTickets();
      prev_total=positions_total;
     }
   int num_b=NumberBuy();
   int num_s=NumberSell();

Затем, после проверки сигналов идёт открытие (тут открытие позиции Buy):

      if(open_long)
        {
         if(num_s>0) CloseSell();
         if(num_b==0)
           {
            double sl=(InpStopLoss==0   ? 0 : CorrectStopLoss(ORDER_TYPE_BUY,InpStopLoss));
            double tp=(InpTakeProfit==0 ? 0 : CorrectTakeProfit(ORDER_TYPE_BUY,InpTakeProfit));
            double ll=trade.CheckVolume(symb,lot,symbol_info.Ask(),ORDER_TYPE_BUY);
            if(ll>0 && CheckLotForLimitAccount(POSITION_TYPE_BUY,ll))
              {
               if(trade.Buy(ll,symb,0,sl,tp))
                  FillingListTickets();
              }
           }
        }

Если количество Sell больше нуля - закрыть. Советник свинговый - всегда только одна позиция. Значит и нету позиций Buy при наличии позиций Sell - тут проверять их количество излишне, равно как и обновлять ещё раз торговое окружение во внутренних массивах советника.
Далее он проверяет количество позиций Buy. Их количество больше нуля может быть только после открытия. А вот после закрытия Sell количество Buy обязательно равно нулю - свинговый советник. И тут нет необходимости гонять цикл в поисках того, о чём и так известно.

Далее идут минимальные проверки корректности и открытие позиции Buy. Сразу после возврата true идёт обновление внутренних массивов торгового окружения советника.

Всё лаконично и без излишеств. Поправьте, если я что-то тут не увидел.

 
fxsaber:

Там ошибка в enum-входе и вызове, а не в мин. дистанции. Но и она рассчитывается неверно, потому что


Не вижу. Покажите - интересно.

 
Artyom Trishkin:

Думаю, вот это говорит о многом:

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

Насчёт обработки кодов возврата сервера. Лично я их всегда обрабатываю. Здесь же - в тестере (я надеюсь, вы понимаете, что учебный советник делается для тестера и для дальнейших его доработок уже самостоятельно) - не стоит наверное лепить обработку всех необходимых кодов возврата. Равно, как и всегда иметь своё торговое окружение вполне себя оправдывает как для реальной торговли, так и, тем более для тестера.

Прочли невнимательно. Кодов возврата не хотел. Сам по себе CloseSell на тикетах - зло. Причем тут тестер, когда код должен корректно работать хотя бы на демо и не иметь явных потенциальных ошибок?

После CloseSell должен был быть RefreshRates. Этого нет, поэтому будут обломы даже в тестере, если включить режим задержки. Использование стандартной библы ради СБ-style - зло. И код это хорошо показывает.


Внеся совсем немного изменений в SymbolInfo.mqh получилось его компилировать и использовать в MT4. Но кому в здравом уме может это прийти в голову, когда он пишет что-то на MQL4?! Почему же это приходит в голову многим при кодинге на MQL5?! Мало того, что это кроет в себе кучу потенциальных ошибок, требует время на изучение, так еще и смотрится неуклюже.

 
fxsaber:

Прочли невнимательно. Кодов возврата не хотел. Сам по себе CloseSell на тикетах - зло. Причем тут тестер, когда код должен корректно работать хотя бы на демо и не иметь явных потенциальных ошибок?

После CloseSell должен был быть RefreshRates. Этого нет, поэтому будут обломы даже в тестере, если включить режим задержки. Использование стандартной библы ради СБ-style - зло. И код это хорошо показывает.

После CloseSell() идёт открытие Buy с нулевой ценой:

      if(open_long)
        {
         if(num_s>0) CloseSell();
         if(num_b==0)
           {
            double sl=(InpStopLoss==0   ? 0 : CorrectStopLoss(ORDER_TYPE_BUY,InpStopLoss));
            double tp=(InpTakeProfit==0 ? 0 : CorrectTakeProfit(ORDER_TYPE_BUY,InpTakeProfit));
            double ll=trade.CheckVolume(symb,lot,symbol_info.Ask(),ORDER_TYPE_BUY);
            if(ll>0 && CheckLotForLimitAccount(POSITION_TYPE_BUY,ll))
              {
               if(trade.Buy(ll,symb,0,sl,tp))
                  FillingListTickets();
              }
           }
        }

Зачем два раза RefreshRates() ? Вы код открытия в СБ в CTrade глядели? Я поглядел вот:

//+------------------------------------------------------------------+
//| Buy operation                                                    |
//+------------------------------------------------------------------+
bool CTrade::Buy(const double volume,const string symbol=NULL,double price=0.0,const double sl=0.0,const double tp=0.0,const string comment="")
  {
   CSymbolInfo sym;
//--- check volume
   if(volume<=0.0)
     {
      m_result.retcode=TRADE_RETCODE_INVALID_VOLUME;
      return(false);
     }
//--- check symbol
   sym.Name((symbol==NULL)?Symbol():symbol);
//--- check price
   if(price==0.0)        
     {                   
      sym.RefreshRates();
      price=sym.Ask();   
     }                   
//---
   return(PositionOpen(sym.Name(),ORDER_TYPE_BUY,volume,price,sl,tp,comment));
  }
//+------------------------------------------------------------------+
 
Artyom Trishkin:

После CloseSell() идёт открытие Buy с нулевой ценой:

Зачем два раза RefreshRates() ?

Затем, что вызываются Correct-функции.

Вы код открытия в СБ в CTrade глядели?

Include\Trade\*.mqh всегда смотрю/бдю, поскольку вражину нужно знать в лицо.

 
fxsaber:

Затем, что вызываются Correct-функции.

Include\Trade\*.mqh всегда смотрю/бдю, поскольку вражину нужно знать в лицо.

Вражина :)))

Да, теперь увидел - в коррект-функциях читается цена из m_tick-переменных СБ, которые заполняются при обновлении, а не напрямую через SymbolInfoDouble() - вот с ним не было бы возможной засады, о которой вы говорите. При том, что кода перед коррект-функциями не много, а обновление цен идёт сразу по приходу тика - в самом начале OnTick():

//--- Проверка нулевых цен
   if(!RefreshRates()) return;
 
Artyom Trishkin:

Вражина :)))

Да, теперь увидел - в коррект-функциях читается цена из m_tick-переменных СБ, которые заполняются при обновлении, а не напрямую через SymbolInfoDouble() - вот с ним не было бы возможной засады, о которой вы говорите. При том, что кода перед коррект-функциями не много, а обновление цен идёт сразу по прихожу тика - в самом начале OnTick():

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

Советники: Diff_TF_MA_EA

fxsaber, 2018.02.01 22:10

Внеся совсем немного изменений в SymbolInfo.mqh получилось его компилировать и использовать в MT4. Но кому в здравом уме может это прийти в голову, когда он пишет что-то на MQL4?! Почему же это приходит в голову многим при кодинге на MQL5?! Мало того, что это кроет в себе кучу потенциальных ошибок, требует время на изучение, так еще и смотрится неуклюже.

Кину камень и в MQL4-огород. Bid/Ask с вынужденным RefreshRates - зло. А ведь есть прекрасная макро-конструкция, которая дает безошибочный и лаконичный результат.
 
fxsaber:
Кину камень и в MQL4-огород. Bid/Ask с вынужденным RefreshRates - зло. А ведь есть прекрасная макро-конструкция, которая дает безошибочный и лаконичный результат.

Я вот всё ждал, когда же вы оседлаете своего конька-горбунка :)))

Вполне достаточно в данных коррект-функциях использовать SymbolInfoDouble() для получения нужных цен. Впрочем, в моих подобных функциях я так и делаю. Здесь же программист зря положился на данные, получаемые от объекта-символа - они выдаются старые - записываемые в m_tick только при обновлении.

 
Artyom Trishkin:

Я вот всё ждал, когда же вы оседлаете своего конька-горбунка :)))

Вполне достаточно в данных коррект-функциях использовать SymbolInfoDouble() для получения нужных цен. Впрочем, в моих подобных функциях я так и делаю. Здесь же программист зря положился на данные, получаемые от объекта-символа - они выдаются старые - записываемые в m_tick только при обновлении.

Здесь возникает логичный вопрос, кто его заставил лезть за простейшими данными в ООП? В MQL4 эти данные всегда получал без проблем, а тут что изменилось в сознании?

Конек-горбунок

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

MT4-Tester VS MT5-Tester

fxsaber, 2017.05.08 10:04

Благодаря сабжу нашелся виновник, так всегда бывает, когда есть возможность сравнивать.

Советник, показывающий баг

// MQL4&5-code

#property strict

#ifdef __MQL5__
  #define Bid (SymbolInfoDouble(_Symbol, SYMBOL_BID))
  #define Ask (SymbolInfoDouble(_Symbol, SYMBOL_ASK))
#endif // __MQL5__

#define PRINT(A) Print(#A + " = " + (string)(A));

void OnTick()
{
  static bool FirstRun = true;
  
  static const double PrevBid = Bid;
  static const double PrevAsk = Ask;
  
  if (FirstRun)
  {
    PRINT((PrevBid != Bid) || (PrevAsk != Ask))
    
    FirstRun = false;
  }
}


MT4

2017.05.08 10:57:33.056 2017.04.10 00:00:08  TDS_Test EURUSD,M1: (PrevBid!=Bid)||(PrevAsk!=Ask) = false


MT5

2017.05.08 11:01:31.266 2017.04.10 00:00:08   (PrevBid!=Bid)||(PrevAsk!=Ask) = true
 
Коды обновлены. Стандартную библиотеку посмотрим
Причина обращения: