Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2155

 
законопослушный гражданин #:

в описании индикатора ADX сказано:

double  iADX(
   string       symbol,        // имя символа
   int          timeframe,     // таймфрейм
   int          period,        // период усреднения
   int          applied_price// используемая цена
   int          mode,          // источник данных
   int          shift          // сдвиг
   );

shift [in]  Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад). Разве этот сдвиг не предназначен для предотвращения перерисовки ? Или можете простыми словами пояснить, что же данный сдвиг создает?

И чему равен этот shift в коде
 
Tretyakov Rostyslav #:
И чему равен этот shift в коде

в коде его можно менять в настройках:

extern double  lot=0.01;
extern int     SL           = 200;   // стоп лосс 
extern int     TP           = 10;    // тейк профит
extern int     MAX_Lines    = 5;     // максимальное колличество отложенных ордеров каждого направления
extern int     DN           = 1;     // кол-во дней жизни лимиток  
extern double  Delta1       = 200;   // отступ от цены для выставения первой лимитки
extern int     Delta        = 100;   // расстояние между отложенными ордерами  
extern double  f            = 40;    // параметр границы флета по ADX
extern double  bar          = 2;     // сдвиг по барам ADX
extern double  timeframe    = 1;     // таймфрейм для индикатора ADX 0-текущий,1-1минута, 2-5минут, 3-15минут, 4-30минут, 5-1час,6-4часа, 7-день, 8-неделя, 9-месяц
extern int     magic        = 12345; // магик
input int      slippage     = 3;     // проскальзывание 

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

 
законопослушный гражданин #:

в коде его можно менять в настройках:

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

Тогда возможно отличаются котировки, в любом случае проблема в том, что показания индикатора в момент открытия ордера были разные

 

Пара вопросов по коду.

1) Как правильно прописать в коде, чтобы или советник определял наличие/отсутствие суффикса автоматически? Либо чтобы человек сам мог вводить суффикс, если он есть у его брокера.

Достаточно ли такого когда в разделе настроек?

input string Siffix="Auto";

2) Как прописать запрет торговли на других ТФ кроме определенного?

Пробовал через функцию запрета торговли определенных пар, подобный код, + ENUM_TIMEFRAMES tf = PERIOD_M15 использовать. Но польза нулевая.

 
Nikolay Shorin #:

Пара вопросов по коду.

1) Как правильно прописать в коде, чтобы или советник определял наличие/отсутствие суффикса автоматически? Либо чтобы человек сам мог вводить суффикс, если он есть у его брокера.

Достаточно ли такого когда в разделе настроек?

2) Как прописать запрет торговли на других ТФ кроме определенного?

Пробовал через функцию запрета торговли определенных пар, подобный код, + ENUM_TIMEFRAMES tf = PERIOD_M15 использовать. Но польза нулевая.

Это уже вопросы сюда там и код и готовый советник напишут.

 
Tretyakov Rostyslav #:

Тогда возможно отличаются котировки, в любом случае проблема в том, что показания индикатора в момент открытия ордера были разные

тестирование ведется на том же счете, демке, на котором идет торговля.котировки совпадают.

Проверил бары открытия. В условиях открытия прописано общее условие для ордеров обоих направлений:

 iflet=iADX( Symbol(), _timeframe, 14, PRICE_CLOSE,MODE_MAIN, bar);     // как индикатор орпределяет флэт
    ibuy=iADX( Symbol(), _timeframe, 14, PRICE_CLOSE,MODE_PLUSDI, bar);    // как индикатор орпеделяет где покупать
    isell=iADX(  Symbol(), _timeframe, 14, PRICE_CLOSE,MODE_MINUSDI, bar); // как индикатор орпеделяет где продавать
      
    if(iflet<f && ibuy>isell)                                            //условие для покупки и определение флета
    {
     for(x=1;x<=MAX_Lines;x++)  // считает сколько открыто линий сетки отложенными ордерами, чтобы не превышало указанное в исходных параметрах MAX_Lines
     {                                                                                                                                                                //сек/мин/ч/дн/
      if (OrderSend(Symbol(),OP_BUYLIMIT,lot,Ask-((Delta1-Delta)+Delta*x)*Point,slippage,Ask-((Delta1+Delta*(MAX_Lines-1))+SL)*Point,Ask+TP*Point,"",magic,TimeCurrent()+60*60*24*DN,Blue))
      {Print("Open BuyLimit: ",_Symbol);}
      else {Print("Error Open BuyLimit: ",_Symbol," / ",GetLastError());}
                   
     }
    }
      else 

    if(iflet<f && ibuy<isell)//условие для продажи и определение флета
    {
     for(x=1;x<=MAX_Lines;x++)
     {
                                                                                                                                                                       //сек/мин/ч/дн/    
      if (OrderSend(Symbol(),OP_SELLLIMIT,lot,Bid+((Delta1-Delta)+Delta*x)*Point,slippage,Bid+((Delta1+Delta*(MAX_Lines-1))+SL)*Point,Bid-TP*Point,"",magic,TimeCurrent()+60*60*24*DN,Red))
      {Print("Open SellLimit: ",_Symbol);}
      else {Print("Error Open SellLimit: ",_Symbol," / ",GetLastError());}  
     }

И это условие не было выполнено, т.е. вообще не должны были открыться никакие лимитки.

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

Это в принципе может решить проблему?

 
законопослушный гражданин #:

тестирование ведется на том же счете, демке, на котором идет торговля.котировки совпадают.

Проверил бары открытия. В условиях открытия прописано общее условие для ордеров обоих направлений:

И это условие не было выполнено, т.е. вообще не должны были открыться никакие лимитки.

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

Это в принципе может решить проблему?

Если у тебя сдвиг, то уже все равно open или close, т.к. цена уже не поменяется.

Возможно злую шутку играет сглаживание. Запусти в тестере индикатор ADX на всех тиках и посмотри как ведет себя линия.

 
законопослушный гражданин #:

тестирование ведется на том же счете, демке, на котором идет торговля.котировки совпадают.

Проверил бары открытия. В условиях открытия прописано общее условие для ордеров обоих направлений:

И это условие не было выполнено, т.е. вообще не должны были открыться никакие лимитки.

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

Это в принципе может решить проблему?

Можно попробовать так

    iflet=iADX( Symbol(), _timeframe, 14, PRICE_CLOSE,MODE_MAIN, 0);     // как индикатор орпределяет флэт
    iflet1=iADX( Symbol(), _timeframe, 14, PRICE_CLOSE,MODE_MAIN, 1);     // как индикатор орпределяет флэт
    ibuy=iADX( Symbol(), _timeframe, 14, PRICE_CLOSE,MODE_PLUSDI, 0);    // как индикатор орпеделяет где покупать
    isell=iADX(  Symbol(), _timeframe, 14, PRICE_CLOSE,MODE_MINUSDI, 0); // как индикатор орпеделяет где продавать
      
    if(iflet1<=f && iflet<f && ibuy>isell)                                            //условие для покупки и определение флета
    {
     for(x=1;x<=MAX_Lines;x++)  // считает сколько открыто линий сетки отложенными ордерами, чтобы не превышало указанное в исходных параметрах MAX_Lines
     {                                                                                                                                                                //сек/мин/ч/дн/
      if (OrderSend(Symbol(),OP_BUYLIMIT,lot,Ask-((Delta1-Delta)+Delta*x)*Point,slippage,Ask-((Delta1+Delta*(MAX_Lines-1))+SL)*Point,Ask+TP*Point,"",magic,TimeCurrent()+60*60*24*DN,Blue))
      {Print("Open BuyLimit: ",_Symbol);}
      else {Print("Error Open BuyLimit: ",_Symbol," / ",GetLastError());}
                   
     }
    }
      else 

    if(iflet1<=f && iflet<f && ibuy<isell)//условие для продажи и определение флета
    {
     for(x=1;x<=MAX_Lines;x++)
     {
                                                                                                                                                                       //сек/мин/ч/дн/    
      if (OrderSend(Symbol(),OP_SELLLIMIT,lot,Bid+((Delta1-Delta)+Delta*x)*Point,slippage,Bid+((Delta1+Delta*(MAX_Lines-1))+SL)*Point,Bid-TP*Point,"",magic,TimeCurrent()+60*60*24*DN,Red))
      {Print("Open SellLimit: ",_Symbol);}
      else {Print("Error Open SellLimit: ",_Symbol," / ",GetLastError());}  
     }
 
Tretyakov Rostyslav #:

Можно попробовать так

спасибо, завтра попробую как вы рекомендуете.

вот как всё выглядит и в тестере и на демке. Я сразу стал проверять на всех тиках на таймфрейме М1, на включенной визуализации, и во такая картина.

тест

 
законопослушный гражданин #:

в описании индикатора ADX сказано:

double  iADX(
   string       symbol,        // имя символа
   int          timeframe,     // таймфрейм
   int          period,        // период усреднения
   int          applied_price// используемая цена
   int          mode,          // источник данных
   int          shift          // сдвиг
   );

shift [in]  Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад). Разве этот сдвиг не предназначен для предотвращения перерисовки ? Или можете простыми словами пояснить, что же данный сдвиг создает?

В mql4 это индекс бара на котором надо получить значение индикатора. 0 — текущий, следующий слева — 1 и так далее…

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