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

 
Timofey Voroshilov:
кому интересно по работать по сигналам
Темой не ошиблись?
[Удален]  
Vitalie Postolache:
Для начала, чтобы быть уверенным, что говорим об одном и том же, что для вас означает тик на форексе?

Я посчитал, что здесь идет разговор про ФОРТС, т.к.:

Да, меня интересует использование MQL5 с "биржевым" исполнением"

Хотя, конечно, могу ошибаться...

И ранее этот же человек писал:

Добрый день!

Существует ли возможность в MT5 получать сделки по всем инструментам открытым в Market Watch в одном советнике? Интересуют именно сделки (ticks), а не изменения стакана.

Спасибо.  

То, скорее всего, речь все же о ФОРТС. И в данном случае речь про тики, которые привели к сделкам.
 
Alexey Kozitsyn:

Я посчитал, что здесь идет разговор про ФОРТС, т.к.:

Хотя, конечно, могу ошибаться...

И т.е. ранее этот же человек писал:

То, скорее всего, речь все же о ФОРТС. И в данном случае речь про тики, которые привели к сделкам.
А, тогда я невнимательно прочитал, извиняюсь. 
 

Подскажите, пожалуйста, что означает запись в терминале

Symbol EURUSD mapped to EURUSDmicro

в первый раз с микросчетами столкнулась

 
Здравствуйте, объясните пожалуйста как снять деньги, если их не показывает на счету.
 
Rashid9821:
Здравствуйте, объясните пожалуйста как снять деньги, если их не показывает на счету.
Может тогда попробовать снять с демо-счёта? Там показывает?
 

Почему ничего не рисуется?

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |                                                                |
//+------------------------------------------------------------------+
#include <Canvas\Canvas.mqh>
//+------------------------------------------------------------------+
CCanvas     eee;           // the canvas object
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   uint clr=4294967295;

   eee.Create("name",1000,1000,COLOR_FORMAT_ARGB_RAW);
   eee.Erase(clr);
   eee.Update(true);
   Sleep(10000);
//---
   eee.Destroy();
  }
//+------------------------------------------------------------------+


 

 

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

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

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

Позиция открывается правильно, на первом баре если сдвиг 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
   }
  }
 
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 (предварительно включите окно "Окно данных").