Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 721

 
sile:

Здравствуйте.

Прошу помощи.

Сигнал при пересечении линий индикаторов на первом баре.

Позиция открывается правильно, на первом баре если сдвиг ma_shiftT =0 и ma_shiftD=0, если сдвиг ma_shiftT = -1 и ma_shiftD= 1, то позиция открывается на третьем или четвёртом баре.

Что сделать, чтобы открывалась позиция при пересечении на первом баре?


input int      ma_shiftT=-1;
input int      ma_shiftD=1;
int iTEMAHandle;   // хэндл индикатора iTEMA
int iDEMAHandle;    // хэндл индикатора
double ma1Val[]; // динамические массивы для хранения численных значений  для каждого бара
double maVal[];  // 

//+------------------------------------------------------------------+
int OnInit()
  {
//---
m_symbol.Name(Symbol());  
//--- Получить хэндл индикатора iTEMA
iTEMAHandle=iTEMA(_Symbol,PERIOD_CURRENT,30,ma_shiftT,PRICE_CLOSE);;
//---Получить хэндл индикатора
iDEMAHandle=iDEMA(_Symbol,PERIOD_CURRENT,30,ma_shiftD,PRICE_CLOSE);;
  
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- освобождаем хэндлы индикаторов
   IndicatorRelease(iTEMAHandle);

   IndicatorRelease(iDEMAHandle);
   }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
  
  //--- массив значений индикатора
   ArraySetAsSeries(ma1Val,true);

//--- массив значений индикатора
   ArraySetAsSeries(maVal,true);
  
  if(CopyRates(_Symbol,_Period,0,5,mrate)<0)
     {
      Alert("Ошибка копирования исторических данных - ошибка:",GetLastError(),"!!");
      return;
     }
//====
  if(CopyBuffer(iTEMAHandle,0,0,5,ma1Val)<0)
     {
      Alert("Ошибка копирования буферов индикатора TEMA - номер ошибки:",GetLastError(),"!!");
      return;
     }
   if(CopyBuffer(iDEMAHandle,0,0,5,maVal)<0)
     {
      Alert("Ошибка копирования буферов индикатора DEMA - номер ошибки:",GetLastError());
      return;
     }

   bool Sell_Condition_3=(maVal[2]<=ma1Val[2]);
   bool Sell_Condition_4=(maVal[1]>ma1Val[1]);
  
   if(Sell_Condition_3 && Sell_Condition_4)
   {
   // открываю позицию SELL
   }
  }

Во-первых: Зачем копировать 5 значений индикаторов если используется только один?

Во-вторых: Расположение линий индикаторов не говорит об их пересечении.

Скопировать достаточно 2 значения начиная с первого.

CopyBuffer(iTEMAHandle, 0, 1, 2, ma1Val)

CopyBuffer(iDEMAHandle, 0, 1, 2, maVal)

Определить факт пересечения можно только сравнив положение линий на втором баре и первом. ДЛЯ ДАННОЙ ПОСТАВЛЕННОЙ ЗАДАЧИ.

Необходимо учесть направление индексации массивов. Тогда получится

if(maVal[0] <= ma1Val[0] && maVal[1] > ma1Val[1])

Если условие выполнено, то факт пересечения налицо. Направление пересечения определишь сам.


ps; А, ну да... Я невнимательно смотрел определение факта пересечения. Ну в любом случае лишние значения не нужны. Наверное они и сбили тебя с толку.

 
sile:

Здравствуйте.

Прошу помощи.

Сигнал при пересечении линий индикаторов на первом баре.

Позиция открывается правильно, на первом баре если сдвиг ma_shiftT =0 и ma_shiftD=0, если сдвиг ma_shiftT = -1 и ma_shiftD= 1, то позиция открывается на третьем или четвёртом баре.

Что сделать, чтобы открывалась позиция при пересечении на первом баре?


input int      ma_shiftT=-1;
input int      ma_shiftD=1;
int iTEMAHandle;   // хэндл индикатора iTEMA
int iDEMAHandle;    // хэндл индикатора
double ma1Val[]; // динамические массивы для хранения численных значений  для каждого бара
double maVal[];  // 

//+------------------------------------------------------------------+
int OnInit()
  {
//---
m_symbol.Name(Symbol());  
//--- Получить хэндл индикатора iTEMA
iTEMAHandle=iTEMA(_Symbol,PERIOD_CURRENT,30,ma_shiftT,PRICE_CLOSE);;
//---Получить хэндл индикатора
iDEMAHandle=iDEMA(_Symbol,PERIOD_CURRENT,30,ma_shiftD,PRICE_CLOSE);;
  
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- освобождаем хэндлы индикаторов
   IndicatorRelease(iTEMAHandle);

   IndicatorRelease(iDEMAHandle);
   }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
  
  //--- массив значений индикатора
   ArraySetAsSeries(ma1Val,true);

//--- массив значений индикатора
   ArraySetAsSeries(maVal,true);
  
  if(CopyRates(_Symbol,_Period,0,5,mrate)<0)
     {
      Alert("Ошибка копирования исторических данных - ошибка:",GetLastError(),"!!");
      return;
     }
//====
  if(CopyBuffer(iTEMAHandle,0,0,5,ma1Val)<0)
     {
      Alert("Ошибка копирования буферов индикатора TEMA - номер ошибки:",GetLastError(),"!!");
      return;
     }
   if(CopyBuffer(iDEMAHandle,0,0,5,maVal)<0)
     {
      Alert("Ошибка копирования буферов индикатора DEMA - номер ошибки:",GetLastError());
      return;
     }

   bool Sell_Condition_3=(maVal[2]<=ma1Val[2]);
   bool Sell_Condition_4=(maVal[1]>ma1Val[1]);
  
   if(Sell_Condition_3 && Sell_Condition_4)
   {
   // открываю позицию SELL
   }
  }

Я прикрепил пример, который поможет Вам - в этом примере я копирую не несколько значений, а по одному. Сравнивая, по шагам, что возвращает мой и Ваш пример, Вы должны увидеть - как происходит индексация в массивах в Вашем примере (то есть Вы должны понять, где в массиве хранится элемент с бара 1 и где с бара 2).

Как работать с моим примером:

специально под настройки примера я создал и сохранил шаблон графика с именем, которое совпадает с именем примера - "Two iMA Shift minus shift plus.tpl". Этом шаблон сохраните в папку \MQL5\Profiles\Templates Вашего терминала. Теперь при запуске тестера, тестер подхватит этот шаблон и будет такая красивая картинка в тестере:

Безымянный 

Когда обнаружится пересечение тестер сам остановится на директиве

//---
   if(ma_one_1<ma_two_1 && ma_one_2>ma_two_2)
     {
      string text="ma_one_1 = "+DoubleToString(ma_one_1,Digits()+1)+"\n"+
                  "ma_two_1 = "+DoubleToString(ma_two_1,Digits()+1)+"\n"+
                  "ma_one_2 = "+DoubleToString(ma_one_2,Digits()+1)+"\n"+
                  "ma_two_2 = "+DoubleToString(ma_two_2,Digits()+1);
      Comment(text);
      DebugBreak();
     }

и Вы сможете в тестере, при помощи "Перекрестия" поводить по барам и увидеть значения индикаторов на баре 1 и на баре 2 (предварительно включите окно "Окно данных"). 

 

Здравствуйте!

У меня вопрос по спреду на FOREXе.

Когда спред расширяется это ASK приподнимается, BID уменьшается или они оба в разные стороны симметрично раздвигаются?

 
Sergey Zhukov:

Здравствуйте!

У меня вопрос по спреду на FOREXе.

Когда спред расширяется это ASK приподнимается, BID уменьшается или они оба в разные стороны симметрично раздвигаются?

Может быть как угодно. Одно остаётся неизменным - спред - это разница между ценой Ask и ценой Bid.
 
Vladimir Karputov:
Может быть как угодно. Одно остаётся неизменным - спред - это разница между ценой Ask и ценой Bid.
Правильно я понял, что когда спред начнет сужаться то они могут двигаться навстречу друг другу одновременно?
 
Sergey Zhukov:
Правильно я понял, что когда спред начнет сужаться то они могут двигаться навстречу друг другу одновременно?

"Одно остаётся неизменным - спред - это разница между ценой Ask и ценой Bid."

Других законов нет. 

 
Vladimir Karputov:

"Одно остаётся неизменным - спред - это разница между ценой Ask и ценой Bid."

Других законов нет. 

А как вы думаете, если, допустим, у меня покупка и спред начал расширяться, Ask пошел вверх, а Bid вниз, мне лучше закрыть позицию или подождать когда Ask пойдет вниз?
 
Sergey Zhukov:
А как вы думаете, если, допустим, у меня покупка и спред начал расширяться, Ask пошел вверх, а Bid вниз, мне лучше закрыть позицию или подождать когда Ask пойдет вниз?

Покупка (позиция BUY) закрывается по цене Bid. 

Другое дело, что Вы скорее всего спрашиваете: "что делать в периоды сверхвысокой волатильности?". Отвечаю - каждый решает по-своему. 

 
Vladimir Karputov:

Покупка (позиция BUY) закрывается по цене Bid. 

Другое дело, что Вы скорее всего спрашиваете: "что делать в периоды сверхвысокой волатильности?". Отвечаю - каждый решает по-своему. 

Да, точно, именно сверхвысокую волатильность я имел ввиду, попробую поискать на форуме, спасибо.
 
Vladimir Karputov:

Покупка (позиция BUY) закрывается по цене Bid. 

Другое дело, что Вы скорее всего спрашиваете: "что делать в периоды сверхвысокой волатильности?". Отвечаю - каждый решает по-своему. 

Да, уж... Где-бы такого брокера найти... Ссылкой не поделишься?
Причина обращения: