Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 143
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Насчёт int(round) согласен. Спасибо. Явное приведение типов не помешает. Хотя работало и без явного приведения.
У меня нет никаких ошибок. Билд последний.
Спасибо, помогло обновление МТ5. Ошибка пропала. билд был от 23 июля 2013. В старом билде, кстати, не было варнингов по приведению типов, потому я их и не замечал.
Ну вот кто бы мог ожидать таких серьёзных ошибок от компилятора.
Спасибо, помогло обновление МТ5. Ошибка пропала. билд был от 23 июля 2013. В старом билде, кстати, не было варнингов по приведению типов, потому я их и не замечал.
Ну вот кто бы мог ожидать таких серьёзных ошибок от компилятора.
Необходимо найти минимум во временном промежутке. Составил следующий код для определения времени:
Для поиска минимумов в данном промежутке использую функцию CopyLow:
Далее, если правильно понимаю у меня получается одномерный массив Low[],
ищу в нем минимум с помощью ArrayMinimum:
Попробовал задать сегодня время стартовое 1 час, стоп 2 часа и вызвать Alert для проверки min=-1.
Вопрос: для данной задачи правильно ли выбраны функции для решения этой задачи или у где-то ошибка? Необходимо получить минимальную цену.
Пытался разобраться с этим вопросом по Справочнику, но там пример с применением классов, а я к этому пока не подготовлен.
Я хочу написать советник пока без применения классов. Всё постороннее мною исключено из рассмотрения и для получения 3-х скользящих по каждой
используемой валюте написал следующий кусок программы:
input int Kurtz_Period=5; // период быстрой скользящей Kurtz
input int Mittel_Period=8;
input int Long_Period=13;
int maHandle; // хэндл индикатора Moving Average
double ma_buf[]; // это буферный массив для отсчетов скользящей, получаемых с функции МА
// и которые затем будут переписываться в соответствующие массивы
datetime Time_buf[]; //базовый массив времени открытия баров
datetime Time_[6][150]; // массив времени открытия баров
double Kurtz[6][70]; //это массив для быстрой скользящей Kurtz , номера строк здесь совпадают с номерами используемых валют, а столбцы – это отсчеты скользящих
double Mittel[6][70]; // это массив для среднепериодной скользящей Mittel
double Long[6][70]; // это массив для длиннопериодной скользящей Long
string Name_symbol[6] = { "AUDUSD","EURUSD", "GBPUSD", "USDCAD", "USDCHF", "USDJPY" } ; // это текстовый массив названий валют:
int nomer_instr; // это номер инструмента (валюты), только для организации циклов по валютам
int OnInit()
{
//-----
//-------
}
void OnDeinit(const int reason)
{
//---
ArrayFree(Time_buf);
ArrayFree( ma_buf ); // обнуляем освободившийся массив
//-------
}
void OnTick()
{
//---------------------
ArraySetAsSeries(Time_buf, true); //устанавливаем индексацию для массива time_array как в таймсерии
ArraySetAsSeries(ma_buf, true); //устанавливаем индексацию для массива ma_buf как в таймсерии
for( nomer_instr=0; nomer_instr<=5; nomer_instr++ ) // это цикл по всем используемым валютам
{
int digit = int( SymbolInfoInteger( Name_symbol[nomer_instr], SYMBOL_DIGITS)); // это число знаков в котировке валюты
CopyTime( Name_symbol[nomer_instr], PERIOD_M1,0,160,Time_buf); // копируем в буфер исторические данные time для каждого бара
for( i=1; i<=145; i++ ) Time[nomer_instr][i]=Time_buf[i]; // время открытия 1-вых баров
//#############################################################################################
// БЛОК формирования отсчетов первых 3-х скользящих: Kurtz, Mittel, Long
manHandle = iMA( Name_symbol[nomer_instr],PERIOD_M1, Kurtz_Period , 0, MODE_SMMA, PRICE_CLOSE );
if( CopyBuffer(maHandle,0,0,155,ma_buf)<0 )
{
Alert("Ошибка копирования буферов индикатора ---PERIOD_M1,Kurtz_Period--- Moving Average - номер ошибки:",GetLastError());
return;
}
for( i=1; i<=45; i++ ) Kurtz[nomer_instr][ i ] = NormalizeDouble( ma_buf[i], digit);
/*
//===============================================================
// БЛОК проверки смещения баров как в таймсерии и точности нормализации чисел
// быстрая скользящая МА-5
if( Multi_Torgi == 0 && Optim_parametrov == nomer_instr ) // это ключ для выбора режима работы советника, сейчас он в режиме отладки программы
{
for( i=1; i<=5; i++ )
{
if(i==1) Alert("====================");
if(i==1) Alert(" время открытия 1-го бара: Time[nomer_instr][1]=",Time[nomer_instr][1] );
Alert(" номер бара: i=",i,", MA_buf[i]=",MA_buf[i],", Kurtz[nomer_instr][i]=",Kurtz[nomer_instr][i]);
}
}
//=================================================================
*/
//---------------------------------------------------------------------------------------------------------------------------
maHandle = iMA( Name_symbol[nomer_instr],PERIOD_M1, Mittel_Period, 0, MODE_SMMA, PRICE_CLOSE );
if(CopyBuffer(maHandle,0,0,155,ma_buf)<0)
{
Alert("Ошибка копирования буферов индикатора ===PERIOD_M1, Mittel_Period,=== Moving Average - номер ошибки:",GetLastError());
return;
}
for( i=1; i<=45; i++ ) Mittel[nomer_instr][ i ] = NormalizeDouble( ma_buf[i], digit);
//----------------------------------------------------------------------------------------------------------------------
maHandle = iMA( Name_symbol[nomer_instr],PERIOD_M1, Long_Period, 0, MODE_SMMA, PRICE_CLOSE );
if(CopyBuffer(maHandle,0,0,155,ma_buf)<0)
{
Alert("Ошибка копирования буферов индикатора ===PERIOD_M1, Long_Period,===Moving Average - номер ошибки:",GetLastError());
return;
}
for( i=1; i<=45; i++ ) Long[nomer_instr][ i ] = NormalizeDouble( ma_buf[i], digit);
// конец БЛОКа формирования отсчетов первых 3-х скользящих: Kurtz, Mittel, Long
//#############################################################################################
} // конец цикла по используемым валютам
//============================================================
Другие операторы программы
//============================================================
//-----------------------------------------
}// конец функции OnTick()
//+------------------------------------------------------------------+
По данной программе при компиляции ошибки не выявляются, но при тестировании в Журнале по каждой скользящей выдаётся сообщение
об ошибке: 4806 – это « запрошенные данные не найдены».
Подскажите пожалуйста, где у меня ошибка.
Спасибо.
Не ужели Вы принцип приведения типов так и не поняли? Это же так просто:
Теперь вроде понятно) Выходит int st операнд более маладшего типа чем datetime tp[].
Поэтому не преобразования в секунды в операции:
Попробовал найти минимум в промежутке времени. Не уверен, что правильно делаю. Можете посмотреть предыдущее сообщение?
Как можно вызывать Alert или Comment без новых тиков, чтобы делать проверки в выходные дни?
Необходимо найти минимум во временном промежутке. Составил следующий код для определения времени:
Для поиска минимумов в данном промежутке использую функцию CopyLow:
Далее, если правильно понимаю у меня получается одномерный массив Low[],
ищу в нем минимум с помощью ArrayMinimum:
Попробовал задать сегодня время стартовое 1 час, стоп 2 часа и вызвать Alert для проверки min=-1.
Вопрос: для данной задачи правильно ли выбраны функции для решения этой задачи или у где-то ошибка? Необходимо получить минимальную цену.
Читаем внимательно:
Возвращаемое значение
Функция возвращает индекс найденного элемента с учетом серийности массива. В случае неудачи функция возвращает -1.
поэтому, надо так:
Проверять и тестировать в выходные и не только, надо скриптами.
Проверять и тестировать в выходные и не только, надо скриптами.