Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 720
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
кому интересно по работать по сигналам
Для начала, чтобы быть уверенным, что говорим об одном и том же, что для вас означает тик на форексе?
Я посчитал, что здесь идет разговор про ФОРТС, т.к.:
Да, меня интересует использование MQL5 с "биржевым" исполнением"
Хотя, конечно, могу ошибаться...
И ранее этот же человек писал:
Добрый день!
Существует ли возможность в MT5 получать сделки по всем инструментам открытым в Market Watch в одном советнике? Интересуют именно сделки (ticks), а не изменения стакана.
Спасибо.
Я посчитал, что здесь идет разговор про ФОРТС, т.к.:
Хотя, конечно, могу ошибаться...
И т.е. ранее этот же человек писал:
То, скорее всего, речь все же о ФОРТС. И в данном случае речь про тики, которые привели к сделкам.Подскажите, пожалуйста, что означает запись в терминале
Symbol EURUSD mapped to EURUSDmicro
в первый раз с микросчетами столкнулась
Здравствуйте, объясните пожалуйста как снять деньги, если их не показывает на счету.
Почему ничего не рисуется?
//| 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_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
}
}
Здравствуйте.
Прошу помощи.
Сигнал при пересечении линий индикаторов на первом баре.
Позиция открывается правильно, на первом баре если сдвиг ma_shiftT =0 и ma_shiftD=0, если сдвиг ma_shiftT = -1 и ma_shiftD= 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)
Определить факт пересечения можно только сравнив положение линий на втором баре и первом. ДЛЯ ДАННОЙ ПОСТАВЛЕННОЙ ЗАДАЧИ.
Необходимо учесть направление индексации массивов. Тогда получится
Если условие выполнено, то факт пересечения налицо. Направление пересечения определишь сам.
ps; А, ну да... Я невнимательно смотрел определение факта пересечения. Ну в любом случае лишние значения не нужны. Наверное они и сбили тебя с толку.
Здравствуйте.
Прошу помощи.
Сигнал при пересечении линий индикаторов на первом баре.
Позиция открывается правильно, на первом баре если сдвиг ma_shiftT =0 и ma_shiftD=0, если сдвиг ma_shiftT = -1 и ma_shiftD= 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 (предварительно включите окно "Окно данных").