
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Всем доброго времени суток!
Я новичок в MQL, поэтому вопрос может показаться немного нубским.
Я пытаюсь создать простого эксперта с несколькими индикаторами. Я создал пару индикатором iMA (long_ma и short_ma ) и копирую их в массивы.
Сначала я создавал первым long_ma, а вторым short_ma. Соответственно учел и нумерацию индикаторов. Если long_ma копировался успешно, то при копировании short_ma, возникала ошибка 4806 (Запрошенные данные не найдены). Поменял местами long_ma и short_ma, и теперь short_ma создается нормально, а при копировании long_ma стала возникать ошибка 4806.
Нашел похожую проблему здесь https://www.mql5.com/ru/articles/5, но решение не помогло.
Посоветуйте, как можно исправить эту проблему?
Прилагаю на всякий случай исходный код:
//| strategy_2_ma_complex.mq5 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#include <Indicators\Trend.mqh>
int long_ma_sz=120; //длина иникатора
int long_ma_h=INVALID_HANDLE; //хэндл
double long_ma_a[]; //массив
double long_ma_bff[]; //буффер
int long_ma_id; //порядковый номер
int short_ma_sz=20; //длина иникатора
int short_ma_h=INVALID_HANDLE; //хэндл
double short_ma_a[]; //массив
double short_ma_bff[]; //буффер
int short_ma_id; //порядковый номер
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- create timer
EventSetTimer(60);
Print("--------------OnInit:start-----------------");
ArrayResize(long_ma_a,long_ma_sz);
ArrayResize(long_ma_bff,long_ma_sz);
ArrayResize(short_ma_a,short_ma_sz);
ArrayResize(short_ma_bff,short_ma_sz);
if(!create_short_ma())return(0);
if(!create_long_ma())return(0);
Print("--------------OnInit:finish-----------------");
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- destroy timer
EventKillTimer();
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// Print("-------------OnTick:begin-----------------");
get_short_ma();
get_long_ma();
//Print(short_ma_sz);
//for(int i=0;i<short_ma_sz;i++)
//{
// Print(short_ma_a[i]);
//}
// Print("--------------OnTick:end------------------");
}
//+------------------------------------------------------------------+
//| Timer function |
//+------------------------------------------------------------------+
void OnTimer()
{
//---
}
//+------------------------------------------------------------------+
//| Trade function |
//+------------------------------------------------------------------+
void OnTrade()
{
//---
}
//+------------------------------------------------------------------+
//| TradeTransaction function |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
const MqlTradeRequest& request,
const MqlTradeResult& result)
{
//---
}
//+------------------------------------------------------------------+
//| Tester function |
//+------------------------------------------------------------------+
double OnTester()
{
//---
double ret=0.0;
//---
//---
return(ret);
}
//+------------------------------------------------------------------+
//| TesterInit function |
//+------------------------------------------------------------------+
void OnTesterInit()
{
//---
}
//+------------------------------------------------------------------+
//| TesterPass function |
//+------------------------------------------------------------------+
void OnTesterPass()
{
//---
}
//+------------------------------------------------------------------+
//| TesterDeinit function |
//+------------------------------------------------------------------+
void OnTesterDeinit()
{
//---
}
//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
//---
}
//+------------------------------------------------------------------+
//| BookEvent function |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
{
//---
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//+----------------------Создаем индикаторы--------------------------+
bool create_long_ma(){
long_ma_h=iMA(
_Symbol,
PERIOD_CURRENT,
long_ma_sz,
0,
MODE_EMA,
PRICE_CLOSE
);
if(long_ma_h==INVALID_HANDLE)
{
PrintFormat("Failed to create handle of the iMA indicator for the symbol %s/%s, error code %d",
Symbol(),
EnumToString(Period()),
GetLastError()
);
return(false);
}
//long_ma_sz=ArraySize(long_ma_a);
//long_ma_id=0;
long_ma_id=1;
return(true);
}
bool create_short_ma(){
short_ma_h=iMA(
_Symbol,
PERIOD_CURRENT,
short_ma_sz,
0,
MODE_EMA,
PRICE_CLOSE
);
if(short_ma_h==INVALID_HANDLE)
{
//--- tell about the failure and output the error code
PrintFormat("Failed to create handle of the iMA indicator for the symbol %s/%s, error code %d",
Symbol(),
EnumToString(Period()),
GetLastError()
);
//--- the indicator is stopped early
return(false);
}
//short_ma_sz=ArraySize(short_ma_a);
//short_ma_id=1;
short_ma_id=0;
return(true);
}
//+------------------------------------------------------------------+
//+---------------- Добыча данных из индикаторов --------------------+
bool get_long_ma(){
Print("copy long ma:");
bool is_sscc=false;
int try_num=0;
int n_try=10;
while(!is_sscc&&(try_num<n_try))
{
ResetLastError();
is_sscc=CopyBuffer(
long_ma_h, // handle индикатора
long_ma_id,// номер буфера индикатора
0, // откуда начнем
long_ma_sz,// сколько копируем
long_ma_bff// массив, куда будут скопированы данные
)>=0;
int err=GetLastError();
if(!is_sscc&&err==4806)
{
for(int i=0;i<1000;++i)
if(BarsCalculated(long_ma_h)>0)
break;
//--- попытаемся скопировать данные индикатора iWPR еще раз
is_sscc=CopyBuffer(
long_ma_h, // handle индикатора
long_ma_id,// номер буфера индикатора
0, // откуда начнем
long_ma_sz,// сколько копируем
long_ma_bff// массив, куда будут скопированы данные
)>=0;
err=GetLastError();
}
if(!is_sscc)
{
PrintFormat("Failed to copy data from the iMA indicator, error code %d",err);
return(false);
}
try_num=try_num+1;
}
return(true);
}
bool get_short_ma(){
Print("copy short ma:");
bool is_sscc=false;
int try_num=0;
int n_try=10;
while(!is_sscc&&(try_num<n_try))
{
ResetLastError();
is_sscc=CopyBuffer(
short_ma_h, // handle индикатора
short_ma_id, // номер буфера индикатора
0, // откуда начнем
short_ma_sz, // сколько копируем
short_ma_bff // массив, куда будут скопированы данные
)>=0;
int err=GetLastError();
if(!is_sscc&&err==4806)
{
for(int i=0;i<1000;++i)
if(BarsCalculated(short_ma_h)>0)
break;
//--- попытаемся скопировать данные индикатора iWPR еще раз
is_sscc=CopyBuffer(
short_ma_h, // handle индикатора
short_ma_id, // номер буфера индикатора
0, // откуда начнем
short_ma_sz, // сколько копируем
short_ma_bff // массив, куда будут скопированы данные
)>=0;
err=GetLastError();
}
if(!is_sscc)
{
PrintFormat("Failed to copy data from the iMA indicator, error code %d",GetLastError());
return(false);
}
}
return(true);
}