Мы не можем воспроизвести у себя описанную Вами ситуацию.
Давайте больше подробностей
Генерирую в мастере эксперта на средней со стопом параболик. Запускаю тест по ценам открытия, нажимаю "отмена". Запускаю второй раз - получается описанная ситуация(при этом график баланса и эквити рисуется не заново, а продолжается). С экспертами не из мастера все в порядке.
Вы хотите быстро проверить торговую идею, не тратя времени на программирование? Выберите в "Мастере MQL5" нужный тип торговых сигналов, подключите модули сопровождения позиций и управления капиталом - на этом вся работа закончена. Создайте свои реализации модулей или закажите их через сервис "Работа" - и комбинируйте новые модули с уже существующими.
В режиме мультивалютного тестирования когда ждем появления нового бара на двух инструментах тестер ведет себя не корректно.
Немного пояснений. В функции isNewBar при появлении нового бара на основном инструменте в цикле ждем появление нового бара на другом финансовом инструменте.
Код прилагаю.
//в тестере баг в режиме мультивалютного тестирования//позиция открывается если на двух инструментах появился новый бар #include <Trade\Trade.mqh>#include <Trade\OrderInfo.mqh>#include <Trade\PositionInfo.mqh>//--- input parametersinputint Per=10;//период средней inputstring Instrum1="EURUSD";//первый инструментinputstring Instrum2="GBPUSD";//второй инструмент//-------------------------------------------------------
CTrade trade;//торговые функции
COrderInfo orderinfo;//информация об ордере
CPositionInfo posinfo;//информация о позицииint hiMA ;//хэндл индикатора intOnInit()
{
hiMA=iMA(_Symbol,_Period,Per,0,MODE_SMA,PRICE_OPEN) ;
if(hiMA < INVALID_HANDLE) return(-1) ;
return(0);
}
//====================================================================voidOnDeinit(constint reason)
{
IndicatorRelease(hiMA) ;
}
//=====================================================================voidOnTick()
{
if(!isNewBar(Instrum2)) return ;
//Print(" Это новый бар ");double Ma[1] ;//показания индикатора CopyBuffer(hiMA,0,0,1,Ma) ;
MqlTick price;// будет использоваться для получения текущих/последних котировок ценыbool possel=posinfo.Select(Instrum1) ;
SymbolInfoTick(Instrum1,price) ;
if(possel && price.bid > Ma[0] && posinfo.PositionType() == POSITION_TYPE_SELL)
{//цена выше средней закрываем короткую позу
trade.PositionClose(Instrum1) ; return ;
}
if( !possel && price.bid > Ma[0])
{//цена выше средней нет поз открываем длинную позу
trade.Buy(0.1,Instrum1,0,0,0,NULL) ; return ;
}
if( possel && price.ask < Ma[0] && posinfo.PositionType() == POSITION_TYPE_BUY)
{//цена ниже средней закрываем длинную позу
trade.PositionClose(Instrum1) ; return ;
}
if(!possel && price.ask < Ma[0])
{// цена ниже средней нет поз открываем короткую позу
trade.Sell(0.1,Instrum1,0,0,0,NULL) ;
}
return ;
}
//=======================================================================bool isNewBar(string other_symbol)
{//возвращает труе если новый бар на двух инструментахstaticdatetime last_bar_time=0;
int cntsleep ;
if(last_bar_time==0)
{//--- это первый вызов, запишем время открытия и выйдем
last_bar_time=(datetime)SeriesInfoInteger(_Symbol,Period(),SERIES_LASTBAR_DATE);
return(false);
}
datetime curr_time=(datetime)SeriesInfoInteger(Symbol(),Period(),SERIES_LASTBAR_DATE);
if(curr_time!=last_bar_time)
{//время открытия не совпадает это новый бар
last_bar_time=curr_time;
cntsleep=0 ;
while(!(curr_time == (datetime)SeriesInfoInteger(other_symbol,Period(),SERIES_LASTBAR_DATE)))
{// ждем появления нового бара на втором инструменте Sleep(5000);
if(cntsleep >10) return(false) ;// недождались
cntsleep++ ;
}
return(true) ;
}
return(false) ;
}
Язык программирования MQL5 позволяет решать задачи на совершенно новом уровне. Даже те задачи, которые уже вроде имеют решения, благодаря объектно-ориентированному программированию могут подняться на качественно новый уровень. В данной статье специально взят простой пример проверки появления нового бара на графике, который был преобразован в достаточно мощный и универсальный инструмент. Какой? Читайте в статье.
В режиме мультивалютного тестирования когда ждем появления нового бара на двух инструментах тестер ведет себя не корректно.
В чем именно Вы усматриваете баг, объясните конкретно, пожалуйста. Вы не сообщили ни деталей тестирования, ни полученного результата, ни ожидаемого результата.
Кроме того, обращаю ваше внимание на статью Основы тестирования в MetaTrader 5. В ней есть объяснение механизма генерации тиков и базовых понятий.
В чем именно Вы усматриваете баг, объясните конкретно, пожалуйста. Вы не сообщили ни деталей тестирования, ни полученного результата, ни ожидаемого результата.
Кроме того, обращаю ваше внимание на статью Основы тестирования в MetaTrader 5. В ней есть объяснение механизма генерации тиков и базовых понятий.
Все просто.
Запускаем советника на оптимизацию видим такой результат.
Выбираем например 4-й проход запускаем советника, получаем его нормальную работу со всеми сделками вот отчет.
Складывается ощущение. Что тестер в режиме оптимизации мультивалютника не может привязать сделку к бару если она открылась не на опен бара.
Если в функции isNewBar закоментировать цикл, по логике не ждать появление нового бара на другом инструменте то все работает. Версия терминала 5 билд 642.
Статьи читал, коды оттуда, ошибки не вижу. Хотя зная себя любимого пойду перечитаю.
-Alexey-: Генерирую в мастере эксперта на средней со стопом параболик. Запускаю тест по ценам открытия, нажимаю "отмена". Запускаю второй раз - получается описанная ситуация(при этом график баланса и эквити рисуется не заново, а продолжается). С экспертами не из мастера все в порядке.
Вот кусок кода. Как сделать так, чтобы при значении trpar2=false , параметры input int grusdchf=100; input int grusdjpy=100; не оптимиировались
//------------------------------------------------------------inputbool trpar1=true ;//разрешение торговли по EURUDSDinputint greurusd=100;//сетка для EURUSDinputint grgbpusd=100;//сетка для GBPUSD//------------------------------------------------------------inputbool trpar2=true;//inputint grusdchf=100;//inputint grusdjpy=100;////------------------------------------------------------------inputbool trpar3=true;//inputint graudjpy=100;//inputint grchfjpy=100;//
Вот кусок кода. Как сделать так, чтобы при значении trpar2=false , параметры input int grusdchf=100; input int grusdjpy=100; не оптимиировались
inputbool trpar2=true;
inputint grusdchf=100;
inputint grusdjpy=100;
if (trpair2==false) // если false то всегда 100
{
x_grusdchf=100;
x_grusdjpy=100;
}
else// если true то значения с перебора
{
x_grusdchf=grusdchf;
x_grusdjpy=grusdjpy;
}
Сталкивался с такой потребностью.Криво и жестоко ,но на правильный результат выходит.Флажки включены на всех трех входных данных.А далее блокируется при false.
Получается, что при передаче по ссылке (тип, передаваемый массив переменных типа): MyObject* &hobject[]
Смущает только то, что не нашёл информации про возможность передачи указателей и массивов указателей в качестве параметров функций. Но это не вопрос даже, а оговорка.
Мы не можем воспроизвести у себя описанную Вами ситуацию.
Давайте больше подробностей
Похоже что это баг.
В режиме мультивалютного тестирования когда ждем появления нового бара на двух инструментах тестер ведет себя не корректно.
Немного пояснений. В функции isNewBar при появлении нового бара на основном инструменте в цикле ждем появление нового бара на другом финансовом инструменте.
Код прилагаю.
Похоже что это баг.
В режиме мультивалютного тестирования когда ждем появления нового бара на двух инструментах тестер ведет себя не корректно.
В чем именно Вы усматриваете баг, объясните конкретно, пожалуйста. Вы не сообщили ни деталей тестирования, ни полученного результата, ни ожидаемого результата.
Кроме того, обращаю ваше внимание на статью Основы тестирования в MetaTrader 5. В ней есть объяснение механизма генерации тиков и базовых понятий.
В чем именно Вы усматриваете баг, объясните конкретно, пожалуйста. Вы не сообщили ни деталей тестирования, ни полученного результата, ни ожидаемого результата.
Кроме того, обращаю ваше внимание на статью Основы тестирования в MetaTrader 5. В ней есть объяснение механизма генерации тиков и базовых понятий.
Все просто.
Запускаем советника на оптимизацию видим такой результат.
Выбираем например 4-й проход запускаем советника, получаем его нормальную работу со всеми сделками вот отчет.
Складывается ощущение. Что тестер в режиме оптимизации мультивалютника не может привязать сделку к бару если она открылась не на опен бара.
Если в функции isNewBar закоментировать цикл, по логике не ждать появление нового бара на другом инструменте то все работает. Версия терминала 5 билд 642.
Статьи читал, коды оттуда, ошибки не вижу. Хотя зная себя любимого пойду перечитаю.
С праздником.
Генерирую в мастере эксперта на средней со стопом параболик. Запускаю тест по ценам открытия, нажимаю "отмена". Запускаю второй раз - получается описанная ситуация(при этом график баланса и эквити рисуется не заново, а продолжается). С экспертами не из мастера все в порядке.
Создайте заявку в сервисдеск, где укажите
Вот кусок кода. Как сделать так, чтобы при значении trpar2=false , параметры input int grusdchf=100; input int grusdjpy=100; не оптимиировались
Вот кусок кода. Как сделать так, чтобы при значении trpar2=false , параметры input int grusdchf=100; input int grusdjpy=100; не оптимиировались
Не выставлять флажки в тестере напротив этих параметров. Или уточните вопрос, а то вижу двусмысленность. :)
Вопрос:
Нужно передать в функцию массив указателей на объекты. По ссылке, разумеется (массив же).
Какой синтаксис использовать?
Зря сомневаюсь? Или таки нужно как-то иначе?
Вот кусок кода. Как сделать так, чтобы при значении trpar2=false , параметры input int grusdchf=100; input int grusdjpy=100; не оптимиировались
Вопрос:
Нужно передать в функцию массив указателей на объекты. По ссылке, разумеется (массив же).
Какой синтаксис использовать?
Зря сомневаюсь? Или таки нужно как-то иначе?
Объявление указателя (тип, переменная типа): MyObject* hobject
Объявление массива указателей (тип, массив переменных типа): MyObject* hobject[]
Получается, что при передаче по ссылке (тип, передаваемый массив переменных типа): MyObject* &hobject[]
Смущает только то, что не нашёл информации про возможность передачи указателей и массивов указателей в качестве параметров функций. Но это не вопрос даже, а оговорка.