Возникла задача, на первый взгляд вроде бы и несложная, но что-то никак не получается. Есть массив, в котором значения всегда идут подряд (в одих случаях значения могут идти по возрастанию, в других случаях - по убыванию). Есть некий уровень (на рисунке красным цветом). Нужно найти два значения массива, наиболее близких к уровню красной линии. На рисунке а) это будут значения массива с индексами 0 и 1. На рисунке б) это будут значения массива с индексами 2 и 1. На рисунках в) и е) это будут значения массива с индексами 0 и 0. На рисунках г) и д) это будут значения массива с индексами 2 и 2.
Пожалуйста подскажите, как решить эту задачу. Заранее благодарен.
ТОгда вообще не парься - чисто перенеси код индюка в эксперта как есть на выполнение торговых критериев и все - далее в сове по этим перенесенным торговым условиям с этого индюка открываешь позы через советника и все...
Сегодня суббота - выходной. Вы запускаете эксперта, происходит инициализация, но поскольку выходной и тика нет, функция старта не запускается (то есть Trade() не вызывается.). Для проверки правильности её работы нужно сунуть вызов этой функции в блок инициализации, ну или тестить в тестере.
После подстановки этой функции в Init() и добавлением проверочного кода Print(DayOfWeek()) выяснилось, что время берется серверное, а у сервера была пятница...
Позавчера тестер работал как нужно. Со вчерашнего вечера, любая версия стратегии в тестере открывает одну сделку и через секунду, либо несколько минут/часов истории, тестер заканчивает работу. Никаких ошибок, ничего.
Ниже приведен проблемный участок в полном виде, вычлененный из советника.
extern int MAGIC= 1;
int start()
{
//----int tt = 0;
double SchBuyLots = SchBuyLots_b(MAGIC);
double SchSellLots = SchSellLots_b(MAGIC);
double SchBuyLots100 = SchBuyLots100_b();
double SchSellLots100 = SchSellLots100_b();
double SchBuyLimitLots = SchBuyLimitLots_b(MAGIC);
double SchSellLimitLots = SchSellLimitLots_b(MAGIC);
double SchBuyStopLots100 = SchBuyStopLots100_b();
double SchSellStopLots100 = SchSellStopLots100_b();
double dy=0;
double dx=SchBuyLots+SchBuyLots100-SchSellLots-SchSellLots100;
if (dx!=0) dy=MathAbs(dx);
double zx=SchBuyLimitLots-SchSellLimitLots;
if (dx>0 && dy+zx!=SchSellStopLots100)tt=1; else tt=2;
Alert (dy+zx,"---",SchSellStopLots100,"---",tt);
//----return(0);
}
//+------------------------------------------------------------------+// ----------------- SchBuyLots() ---------------------------------------------// Функция возвращает суммарный лот Бай-ордеров для Магика//----------------------------------------------------------------double SchBuyLots_b(int MAGIC) {
double SchBuyLots=0;
int i;
string SMB=Symbol();
for (i=OrdersTotal()-1;i>=0;i--) {//Начало циклаif (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {}
else{//начало работы с выбранным ордеромif(OrderSymbol()== SMB && OrderMagicNumber()== MAGIC){
if(OrderType()==OP_BUY) {
SchBuyLots=SchBuyLots+OrderLots();
}
}
}//конец работы с выбранным ордером
}//Конец циклаreturn(SchBuyLots);
}
// ----------------------------------------------------------------------------// ----------------- SchSellLots() ---------------------------------------------// Функция возвращает суммарный лот Сейл-ордеров для Магика//-----------------------------------------------------------------double SchSellLots_b(int MAGIC) {
double SchSellLots=0;
int i;
string SMB=Symbol();
for (i=OrdersTotal()-1;i>=0;i--) {//Начало циклаif (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {}
else{//начало работы с выбранным ордеромif(OrderSymbol()== SMB && OrderMagicNumber()== MAGIC) {
if(OrderType()==OP_SELL) {
SchSellLots=SchSellLots+OrderLots();
}
}
}//конец работы с выбранным ордером
}//Конец циклаreturn(SchSellLots);
}
// -------------------------------------------------------------------------------// ----------------- SchBuyLots100() ---------------------------------------------// Функция возвращает суммарный лот Бай-ордеров для Магика 100//--------------------------------------------------------------------------------double SchBuyLots100_b() {
double SchBuyLots100=0;
int i;
string SMB=Symbol();
for (i=OrdersTotal()-1;i>=0;i--) {//Начало циклаif (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {}
else{//начало работы с выбранным ордеромif(OrderSymbol()== SMB && OrderMagicNumber()==100) {
if(OrderType()==OP_BUY) {
SchBuyLots100=SchBuyLots100+OrderLots();
}
}
}//конец работы с выбранным ордером
}//Конец циклаreturn(SchBuyLots100);
}
// --------------------------------------------------------------------------------// ----------------- SchSellLots100() ---------------------------------------------// Функция возвращает суммарный лот Сейл-ордеров для Магика 100//---------------------------------------------------------------------------------double SchSellLots100_b() {
double SchSellLots100=0;
int i;
string SMB=Symbol();
for (i=OrdersTotal()-1;i>=0;i--) {//Начало циклаif (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {}
else{//начало работы с выбранным ордеромif(OrderSymbol()== SMB && OrderMagicNumber()==100) {
if(OrderType()==OP_SELL) {
SchSellLots100=SchSellLots100+OrderLots();
}
}
}//конец работы с выбранным ордером
}//Конец циклаreturn(SchSellLots100);
}
// ----------------------------------------------------------------------------// ----------------- SchBuyLimitLots() ------------------------------------------// Функция возвращает суммарный лот BuyLimit-ордеров для Магика//------------------------------------------------------------------------------double SchBuyLimitLots_b(int MAGIC) {
double SchBuyLimitLots=0;
int i;
string SMB=Symbol();
for (i=OrdersTotal()-1;i>=0;i--) {//Начало циклаif (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {}
else{//начало работы с выбранным ордеромif(OrderSymbol()== SMB && OrderMagicNumber()== MAGIC){
if(OrderType()==OP_BUYLIMIT) {
SchBuyLimitLots=SchBuyLimitLots+OrderLots();
}
}
}//конец работы с выбранным ордером
}//Конец циклаreturn(SchBuyLimitLots);
}
// ----------------------------------------------------------------------------// ----------------- SchSellLimitLots() ----------------------------------------// Функция возвращает суммарный лот SellLimit-ордеров для Магика//-----------------------------------------------------------------------------double SchSellLimitLots_b(int MAGIC) {
double SchSellLimitLots=0;
int i;
string SMB=Symbol();
for (i=OrdersTotal()-1;i>=0;i--) {//Начало циклаif (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {}
else{//начало работы с выбранным ордеромif(OrderSymbol()== SMB && OrderMagicNumber()== MAGIC) {
if(OrderType()==OP_SELLLIMIT) {
SchSellLimitLots=SchSellLimitLots+OrderLots();
}
}
}//конец работы с выбранным ордером
}//Конец циклаreturn(SchSellLimitLots);
}
// -------------------------------------------------------------------------------// ----------------- SchBuyStopLots100() -----------------------------------------// Функция возвращает суммарный лот BuyStop-ордеров для Магика 100//--------------------------------------------------------------------------------double SchBuyStopLots100_b() {
double SchBuyStopLots100=0;
int i;
string SMB=Symbol();
for (i=OrdersTotal()-1;i>=0;i--) {//Начало циклаif (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {}
else{//начало работы с выбранным ордеромif(OrderSymbol()== SMB && OrderMagicNumber()==100) {
if(OrderType()==OP_BUYSTOP) {
SchBuyStopLots100=SchBuyStopLots100+OrderLots();
}
}
}//конец работы с выбранным ордером
}//Конец циклаreturn(SchBuyStopLots100);
}
// --------------------------------------------------------------------------------// ----------------- SchSellStopLots100() -----------------------------------------// Функция возвращает суммарный лот SellStop-ордеров для Магика 100//---------------------------------------------------------------------------------double SchSellStopLots100_b() {
double SchSellStopLots100=0;
int i;
string SMB=Symbol();
for (i=OrdersTotal()-1;i>=0;i--) {//Начало циклаif (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {}
else{//начало работы с выбранным ордеромif(OrderSymbol()== SMB && OrderMagicNumber()==100) {
if(OrderType()==OP_SELLSTOP) {
SchSellStopLots100=SchSellStopLots100+OrderLots();
}
}
}//конец работы с выбранным ордером
}//Конец циклаreturn(SchSellStopLots100);
}
// --------------------------------------------------------------------------------
Прошу обратить внимание на строку (практически в самом начале):
if (dx>0 && dy+zx!=SchSellStopLots100)tt=1; else tt=2;
По какой-то причине, при равенстве значений dy+zx и SchSellStopLots100 по отдельности (проверял с помощью аллертов) в данном выражении они перестают быть равны друг другу, и переменная tt принимает значение 1, а не 2.
Торговые условия с сервера на выходные поменялись... тестировать надо на отдельном терминале не подключенном к брокеру/сети, задавая специальной утилиткой нужный спред. Лучше поискать статьи по тестированию советников и как это правильно делать.
splxgf: Проверять лучше через ND или разницы по модулю меньше некоторой дельты.
По какой-то причине сложение dy и zx давая число 0.3 (в моём конкретном тесте существующей рыночной ситуации) при сравнении с этим числом ему не равно. Т.е. складываю dy+zx получаю 0.3. Сравниваю dy+zx с 0.3 - они не равны.
Сравниваю dy и zx с числами, которые они возвращают - равенства работают как и должны.
Позавчера тестер работал как нужно. Со вчерашнего вечера, любая версия стратегии в тестере открывает одну сделку и через секунду, либо несколько минут/часов истории, тестер заканчивает работу. Никаких ошибок, ничего.
Кто нибудь сталкивался? Подскажите
У тестера есть журнал. Там все написано. Здесь нет телепатов, чтобы читать журналы Вашего тестера на расстоянии.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Добрый день!
Возникла задача, на первый взгляд вроде бы и несложная, но что-то никак не получается. Есть массив, в котором значения всегда идут подряд (в одих случаях значения могут идти по возрастанию, в других случаях - по убыванию). Есть некий уровень (на рисунке красным цветом). Нужно найти два значения массива, наиболее близких к уровню красной линии. На рисунке а) это будут значения массива с индексами 0 и 1. На рисунке б) это будут значения массива с индексами 2 и 1. На рисунках в) и е) это будут значения массива с индексами 0 и 0. На рисунках г) и д) это будут значения массива с индексами 2 и 2.
Пожалуйста подскажите, как решить эту задачу. Заранее благодарен.
ТОгда вообще не парься - чисто перенеси код индюка в эксперта как есть на выполнение торговых критериев и все - далее в сове по этим перенесенным торговым условиям с этого индюка открываешь позы через советника и все...
Спасибо, разбираюсь :)
Не за что... все проходили через ЭТО. :-)
Сегодня суббота - выходной. Вы запускаете эксперта, происходит инициализация, но поскольку выходной и тика нет, функция старта не запускается (то есть Trade() не вызывается.). Для проверки правильности её работы нужно сунуть вызов этой функции в блок инициализации, ну или тестить в тестере.
После подстановки этой функции в Init() и добавлением проверочного кода Print(DayOfWeek()) выяснилось, что время берется серверное, а у сервера была пятница...
Заменил
на
и заработало, как надо.
Спасибо.
Здравствуйте, товарищи!
Столкнулся с неожиданной проблемой.
Позавчера тестер работал как нужно. Со вчерашнего вечера, любая версия стратегии в тестере открывает одну сделку и через секунду, либо несколько минут/часов истории, тестер заканчивает работу. Никаких ошибок, ничего.
Кто нибудь сталкивался? Подскажите
Здравствуйте.
Помогите, пожалуйста, найти ошибку.
Ниже приведен проблемный участок в полном виде, вычлененный из советника.
Прошу обратить внимание на строку (практически в самом начале):
По какой-то причине, при равенстве значений dy+zx и SchSellStopLots100 по отдельности (проверял с помощью аллертов) в данном выражении они перестают быть равны друг другу, и переменная tt принимает значение 1, а не 2.
Прошу Вас помочь найти недочёт.
Заранее благодарю.
(проверял с помощью аллертов)
Проверять лучше через ND или разницы по модулю меньше некоторой дельты.
По какой-то причине сложение dy и zx давая число 0.3 (в моём конкретном тесте существующей рыночной ситуации) при сравнении с этим числом ему не равно. Т.е. складываю dy+zx получаю 0.3. Сравниваю dy+zx с 0.3 - они не равны.
Сравниваю dy и zx с числами, которые они возвращают - равенства работают как и должны.
Загадка.
Прошу помочь.
Здравствуйте, товарищи!
Столкнулся с неожиданной проблемой.
Позавчера тестер работал как нужно. Со вчерашнего вечера, любая версия стратегии в тестере открывает одну сделку и через секунду, либо несколько минут/часов истории, тестер заканчивает работу. Никаких ошибок, ничего.
Кто нибудь сталкивался? Подскажите