Обсуждение статьи "Создание эксперта, торгующего на разных инструментах" - страница 5

 
Interesting:
По Tnew[1]   Invalid array range - похоже это выход за приделы диапазона. Не забывайте что нумерация элементов массива начинаетсянет

нет доступа к редактированию сообщения от 2010.07.16 22:41 2010.07.16 22:41:25

Заменить:8.Почему Exp_TEMA.mq5, при тестировании, открывает сделки внутри бара? на

8.Почему Exp_TEMA.mq5, при тестировании, открывает многократные сделки в одном баре? 

 
ias:
нет доступа к редактированию сообщения от 2010.07.16 22:41 2010.07.16 22:41:25

Сообщения можно редактировать только в течение 3 дней  с момента публикации.

 

ias:

8.Почему Exp_TEMA.mq5, при тестировании, открывает многократные сделки в одном баре? 

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

Interesting:
Логично будт предположить то, что там нет проверки наличия ранее открытых позиций и установленных отложников...

Interesting:
Логично будт предположить то, что там нет проверки наличия ранее открытых позиций и установленных отложников...

В Exp_TEMA.mq5 отложенные ордера не используются.Открытые ранее позиции проверяются в:

//+X================================================================X+
bool BuyPositionOpen
                    ...
   if(PositionSelect(symbol))return(false);
//+X================================================================X+
bool SellPositionOpen
                    ...
   if(PositionSelect(symbol))return(false);
//+X================================================================X+
bool BuyPositionClose(const string symbol, ulong deviation)
...
   if(PositionSelect(symbol))
     {
      if(PositionGetInteger(POSITION_TYPE) != POSITION_TYPE_BUY) return(false);
     }
    else  return(false);
//+X================================================================X+
bool SellPositionClose(const string symbol, ulong deviation)
...
   if(PositionSelect(symbol))
    {
     if(PositionGetInteger(POSITION_TYPE) != POSITION_TYPE_SELL)return(false);
    }
   else return(false); 

Возможно ,что то не так, в: 

//+X================================================================X+
bool IsNewBar(int Number, string symbol, ENUM_TIMEFRAMES timeframe)
  {
//----+
   static datetime Told[];
   datetime Tnew[1];
   
   //----+ Объвление переменной для хранения размеров массивов переменных
   static int Size_ = 0;
   
   //----+ Изменение размеров массивов переменных
   if (Number + 1 > Size_)
    {
     uint size = Number + 1;
     //----
     if (ArrayResize(Told, size) == -1)
      {
       string word = "";
       StringConcatenate(word, "IsNewBar( ", Number,
                    " ): Ошибка!!! Не удалось изменить размеры массивов переменных!!!"); 
       Print(word); 
       //----          
       int error = GetLastError();
       ResetLastError();
       if (error > 4000)
        {
         StringConcatenate(word, "IsNewBar( ", Number, " ): Код ошибки ", error);
         Print(word); 
        }  
       //----                                                                                                                                                                                                  
       Size_ = -2;
       return(false);
      }
    }
   
   CopyTime(symbol, timeframe, 0, 1, Tnew); 
   if (Tnew[0] != Told[Number])
    {
     Told[Number] = Tnew[0];
     return(true);
    }
//----+
   return(false);
  }

 или в:

//+X================================================================X+
bool TradeSignalCounter
                      (
                       int Number,
                       string Symbol_,
                       bool Trade,
                       int period,
                       ENUM_APPLIED_PRICE ApPrice,
                       bool& UpSignal[],
                       bool& DnSignal[],
                       bool& UpStop[],
                       bool& DnStop[]
                      )
  
  {
//----+
   //----+ Проверка запрета на торговлю
   if (!Trade)return(true);
   
   //----+ Объявление переменной для хранения итогового размера массивов переменных
   static int Size_ = 0;
   
   //----+ Объявление массива для хранения хэндлов индикаторов как статической переменной
   static int Handle[];
   
   static int Recount[], MinBars[];
   double TEMA[4], dtema1, dtema2;
   
   //----+ Инициализация 
   if (Number + 1 > Size_) // Вход в блок инициализации только на первом старте
    {
     Size_ = Number + 1; // Для этого номера вход в блок закрыт
     
     //---- Изменение размеров массивов переменных
     ArrayResize(Handle,   Size_);
     ArrayResize(Recount,  Size_);
     ArrayResize(MinBars,  Size_);
     
     //---- Определение минимально количества баров, достаточного для расчёта 
     MinBars[Number] = 3 * period;
     
     //---- Предварительное обнуление ячеек массивов
     DnSignal[Number] = false;
     UpSignal[Number] = false;
     DnStop  [Number] = false;
     UpStop  [Number] = false;
     
     //---- Исользуем массив как таймсерию
     ArraySetAsSeries(TEMA, true);
     
     //----+ Получение хендла индикатора
     Handle[Number] = iTEMA(Symbol_, PERIOD_CURRENT, period, 0, ApPrice);
    }
     
   //----+ Проверка количества баров на достаточность для расчёта 
   if (Bars(Symbol_, 0) < MinBars[Number])return(true);

   //----+ Получение торговых сигналов 
   if (IsNewBar(Number, Symbol_, PERIOD_CURRENT) || Recount[Number]) // Вход в блок на смене бара или при неудачном копировании данных
    {
     DnSignal[Number] = false;
     UpSignal[Number] = false;
     DnStop  [Number] = false;
     UpStop  [Number] = false;
     
     //----+ Используя хэндлы индикатора, копируем значения индикаторного
                   // буфера в специально подготовленный для этого статический массив
     if (CopyBuffer(Handle[Number], 0, 0, 4, TEMA) < 0)
      {
       Recount[Number] = true; // так как данные не получены, то следует вернуться 
                                 //в этот блок получения торговых сигналов на следующем тике!
       return(false); // выходим из функции TradeSignalCounter() без получения торговых сигналов
      }
      
     //---- Все операции копирования из индикаторного буфера завершены успешно
     Recount[Number] = false; // можно не возвращаться в этот блок до очередной смены бара
     
     int Digits_ = SymbolInfoInteger(Symbol_, SYMBOL_DIGITS) + 4;
     dtema2 = NormalizeDouble(TEMA[2] - TEMA[3], Digits_);
     dtema1 = NormalizeDouble(TEMA[1] - TEMA[2], Digits_);
     
     //---- Определение сигналов входа
     if (dtema2 > 0 && dtema1 < 0) DnSignal[Number] = true;
     if (dtema2 < 0 && dtema1 > 0) UpSignal[Number] = true;
     
     //---- Определение сигналов выхода
     if (dtema1 > 0) DnStop[Number] = true;
     if (dtema1 < 0) UpStop[Number] = true;
    }
//----+
   return(true);
  } 

 Многократные сделки в одном баре при тестировании Exp_TEMA.mq5 на  EURUSD, периоде D1

 
ias, это лучше к автору статьи обратиться...

 
ias:

Почему Exp_TEMA.mq5, при тестировании, открывает сделки внутри бара? на

Почему Exp_TEMA.mq5, при тестировании, открывает многократные сделки в одном баре? 

Всё дело в том, что в контексте данной статьи стояла задача реализации простейшего, мультивалютного эксперта, без загромождения основной идеи второстепенными, мешающими пониманию сути деталями.  А наполнение деталями то у каждого своё. В вашей ситуации всё решается элементарно. Переменные  торговых сигналов делаются входными для торговых функций и связанными по ссылке, а после совершения сделки внутри торговых функций эти переменные обнуляют.
Документация по MQL5: Торговые функции
Документация по MQL5: Торговые функции
  • www.mql5.com
Торговые функции - Документация по MQL5
 
GODZILLA:
Всё дело в том, что в контексте данной статьи стояла задача реализации простейшего, мультивалютного эксперта, без загромождения основной идеи второстепенными, мешающими пониманию сути деталями.  А наполнение деталями то у каждого своё. В вашей ситуации всё решается элементарно. Переменные  торговых сигналов делаются входными для торговых функций и связанными по ссылке, а после совершения сделки внутри торговых функций эти переменные обнуляют.
Покажите, пожалустайста, на примере вышего эксперта  Exp_TEMA.mq5, как это сделать.
 

ias:
Покажите, пожалустайста, на примере вышего эксперта  Exp_TEMA.mq5, как это сделать.

 

На мой взгляд, изучение и понимание языка программирования в том и заключается, что индивид сам решает мелкие задачи по перестройке кода под собственные нужды. В противном случае зачем вообще нужен этот сайт и статьи по программированию? Для демонстрации способностей авторов статей? Кто сам не хочет разбираться, может использовать ресурс https://www.mql5.com/ru/job
Например, в MQL4 в простейшем виде я реализовал данный подход вот так https://www.mql5.com/ru/articles/1516. Для MQL5 ничегошеньки не меняется и всё делается абсолютно аналогично.

 

 
GODZILLA:

С большим уважением отношусь к автору статьи "Создание эксперта, торгующего на разных инструментах".
1.Представленный, в статье код эксперта Exp_TEMA.mq5,открывает многократные сделки в одном баре,при тестировании,
 о  чем сообщалось ранее по данной теме.Это обстоятельство подтверждает наличие неправильного кода или ошибки в эксперте, в устранеии которой заинтересованы многие посетители сайта.
2.ответ Рош по теме "Советники:мультик": "Кроме того, функцию определения нового бара можно реализовать без использования функции копирования времени." - также подтверждает возможность более рационального написания функции IsNewBar() в эксперте.
Хотелось бы увидеть, как автор профессионально устранит данные недостатки, так как ошибки могут делать все, а исправлять их правильно могут только профессионалы.
 
ias:

Ежели внимательно присмотреться к тем торговым системам, которые представлены в статье, то можно сделать вывод, что они переворотные. Стоплосс в таких системах играет второстепенную роль и ставится на весьма приличном расстоянии от входа, исчисляемом в несколько свечей как минимум. Профессионализм в изложении материала заключается в разворачивании предмета в максимально простом виде без захламления дополнительными прибамбахами, а не на хождении на поводу у публики, не желающей думать самостоятельно. Любое учебное пособие всегда ущербно с точки зрения идеала. И это считается приемлемым и нормальным. Будет в дальнейшем такой заказ обстоятельного изложения этой детали построения торговых систем, будет и подробный обзор реализации, который тоже не так чтобы и совсем прост. 
А по поводу копирования времени могу сказать вполне определённо, я сам от более рационального написания функции IsNewBar() в эксперте никакой существенной разницы не увидел, хотя и мерил! Даже статью по этой теме писал. Это если бы было бы существенное ухудшение работы кода, то тогда было бы понятно.
А при некотором желании я, например, без проблем в пух и прах могу разнести любую статью с этого сайта. Но я ценю информацию прежде всего за то что она есть в наличии, а не за то, что она соответствует моим представлениям об идеале.
Так что устранять надуманные недостатки и при этом существенно загромождать код, который и так не так чтобы и прост, я по вполне понятным и вполне профессиональным причинам, естественно, не собираюсь.
Причина обращения: