Ваши вопросы по языку MQL4

DIW35902345

Местный житель
Ну ты спросил! Сам-то понял? А какое число ордеров он должен открывать, не заданное?

это все демагогия , пока шла переписка ..., уже решил вопрос .,вот код , может кому и пригодится


int CountPosOnDay( )
{
int countPosCurDay = 0;

for (int i=OrdersTotal()-1; i >= 0; i--)
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
if( OrderMagicNumber()==MAGIC)
if (OrderSymbol()==Symbol() )
if( OrderType() <= OP_SELL )
if( TimeDay(OrderOpenTime()) == Day() )
countPosCurDay++;

for (int i=OrdersHistoryTotal()-1; i >= 0; i--)
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
if( OrderMagicNumber()==MAGIC)
if (OrderSymbol()==Symbol() )
if( OrderType() <= OP_SELL )
{
if( TimeDay(OrderOpenTime()) == Day() )
countPosCurDay++;
else
break; // далее более старая история
}

return(countPosCurDay);
}
 
Последнее редактирование:

digaysasha

Активный участник
это все демагогия , пока шла переписка ..., уже решил вопрос .,вот код , может кому и пригодится


int CountPosOnDay( )
{
int countPosCurDay = 0;

for (int i=OrdersTotal()-1; i >= 0; i--)
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
if( OrderMagicNumber()==MAGIC)
if (OrderSymbol()==Symbol() )
if( OrderType() <= OP_SELL )
if( TimeDay(OrderOpenTime()) == Day() )
countPosCurDay++;

for (int i=OrdersHistoryTotal()-1; i >= 0; i--)
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
if( OrderMagicNumber()==MAGIC)
if (OrderSymbol()==Symbol() )
if( OrderType() <= OP_SELL )
{
if( TimeDay(OrderOpenTime()) == Day() )
countPosCurDay++;
else
break; // далее более старая история
}

return(countPosCurDay);
}

огромное спасибки
 

_SERG_

Активный участник
это все демагогия , пока шла переписка ..., уже решил вопрос .,вот код , может кому и пригодится


int CountPosOnDay( )
{
int countPosCurDay = 0;

for (int i=OrdersTotal()-1; i >= 0; i--)
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
if( OrderMagicNumber()==MAGIC)
if (OrderSymbol()==Symbol() )
if( OrderType() <= OP_SELL )
if( TimeDay(OrderOpenTime()) == Day() )
countPosCurDay++;

for (int i=OrdersHistoryTotal()-1; i >= 0; i--)
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
if( OrderMagicNumber()==MAGIC)
if (OrderSymbol()==Symbol() )
if( OrderType() <= OP_SELL )
{
if( TimeDay(OrderOpenTime()) == Day() )
countPosCurDay++;
else
break; // далее более старая история
}

return(countPosCurDay);
}

Через год, не правильно посчитаешь, если история длинная.
Условие я тебе написал в http://forexsystemsru.com/948509-post3438.html, ну как дальше оформлять твоё дело.
(*Посты с ответами не путай. Не всё было для тебя, а чел теперь радуется. Даж "огромное спасибки" сказал.)
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
это все демагогия , пока шла переписка ..., уже решил вопрос .,вот код , может кому и пригодится


int CountPosOnDay( )
{
int countPosCurDay = 0;

for (int i=OrdersTotal()-1; i >= 0; i--)
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) // Условие выполнено, выполняется следующая строка.
if( OrderMagicNumber()==MAGIC) // Условие не выполнено, следующая строка не выполняется.
if (OrderSymbol()==Symbol() )// Не выполняется только эта строка.
if( OrderType() <= OP_SELL )// А эта строка выполняется. И если это не отложенный ордер, то результат будет истина и будет выполняться следующая строка.
if( TimeDay(OrderOpenTime()) == Day() )// Представь что это условие тоже истина...
countPosCurDay++; // Что тут получаем???

for (int i=OrdersHistoryTotal()-1; i >= 0; i--)
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
if( OrderMagicNumber()==MAGIC)
if (OrderSymbol()==Symbol() )
if( OrderType() <= OP_SELL )
{
if( TimeDay(OrderOpenTime()) == Day() )
countPosCurDay++;
else
break; // далее более старая история
}

return(countPosCurDay);
}
В таком варианте не гарантировано правильное выполнение твоей функции. Смотри мои комментарии в своём тексте.
Пока на счёте работает ОДИН советник как в тестере, ничего страшного. А если твой советник попадает в руки пользователя с характером экспериментатора или сам решишь что-то поэкспериментировать...

ps; Ой... Я не сразу заметил что в цикле-то выполняется только одна строка...
for (int i=OrdersTotal()-1; i >= 0; i--)
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
тоесть, получается что весь последующий код выполняется только с ордером в списке с индексом 0...
 
Последнее редактирование:

strannik-ps

VIP-участник
array out of range

Помогите победить array out of range.
Или посоветуйте альтернативный вариант без массива.
PHP:
int BarsDayStart(const datetime &time[], int y, int rates_total)
{
	MqlDateTime dt1, dt2;
	int x = y;
	TimeToStruct(time[y], dt1);
	TimeToStruct(time[x], dt2);
	while ((dt1.day_of_year == dt2.day_of_year) && (x < rates_total))
	{  
		x++;
		TimeToStruct(time[x], dt2);   // Тута блин косяк (array out of range)
	}
	return(x - 1);
 }
Спасибо!
 

AlexeyVik

Программист mql4 mql5
Помогите победить array out of range.
Или посоветуйте альтернативный вариант без массива.
PHP:
int BarsDayStart(const datetime &time[], int y, int rates_total)
{
    MqlDateTime dt1, dt2;
    int x = y;
    TimeToStruct(time[y], dt1);
    TimeToStruct(time[x], dt2);
    while ((dt1.day_of_year == dt2.day_of_year) && (x < rates_total))
    {  
        x++;
        TimeToStruct(time[x], dt2);   // Тута блин косяк (array out of range)
    }
    return(x - 1);
 }
Спасибо!
Массив объявлен статический или динамический? Проследи какое значение передаётся переменной y и какой размер массива. Максимальный индекс массива может быть от 0 до размер_массива -1

зы. а посмотрев повнимательней, думаю что будет достаточно поменять строки местами.

TimeToStruct(time[x], dt2); // Тута блин косяк (array out of range)
x++;
 
Последнее редактирование:

ShadowCandle

Гуру форума
Помогите победить array out of range.
заменить в условии на <rates_total-1
Почему приращение x++ идёт до получения значения? Условие допускает превышение х
Или поменять местами приращение и получение значения
TimeToStruct(time[x], dt2);
x++;
 

AlexeyVik

Программист mql4 mql5
заменить в условии на <rates_total-1
Почему приращение x++ идёт до получения значения? Условие допускает превышение х
Или поменять местами приращение и получение значения
TimeToStruct(time[x], dt2);
x++;
Упс. Пока я присматривался и правил свой пост ты уже выдал такое-же мнение. :D
 

strannik-ps

VIP-участник
Спасибо! но как то у меня не выходит.
Уже только молотком не стучал.
Посмотрите болванку может, что то напортачил.
Три дня воюю запутался уже.
 
Последнее редактирование:

strannik-ps

VIP-участник
Еще так пробовал
PHP:
int BarsDayStart(int y)
{
	int x = y;
	                //Можно упростить Но баг тогда здесь ↓
	while ((TimeDayOfYear(Time[y]) == TimeDayOfYear(Time[x])) && (x < Bars))
		x++;

	return(x - 1);
}
Короче любой вариант хоть простой, хоть извращенный итог ошибка.
 

AlexeyVik

Программист mql4 mql5
Еще так пробовал
PHP:
int BarsDayStart(int y)
{
    int x = y;
                    //Можно упростить Но баг тогда здесь ↓
    while ((TimeDayOfYear(Time[y]) == TimeDayOfYear(Time[x])) && (x < Bars))
        x++;

    return(x - 1);
}
Короче любой вариант хоть простой, хоть извращенный итог ошибка.
Ты что-то там круто начудил. :D
Расскажи что хотел получить в итоге. Может действительно лучше обойтись без структуры.
 

strannik-ps

VIP-участник
Ты что-то там круто начудил. :D
Расскажи что хотел получить в итоге. Может действительно лучше обойтись без структуры.

Там я чудил чтоб можно и к mq5 применить проверял на ошибки.
А получить хочу - плавающую дату открытия бара.
 

AlexeyVik

Программист mql4 mql5
Там я чудил чтоб можно и к mq5 применить проверял на ошибки.
А получить хочу - плавающую дату открытия бара.
Ничё не понял, но хотелось-бы.

1. int dayend = DayEndByDate(time, time[0], rates_total), daystart = BarsDayStart(time, dayend, rates_total);
недопустимо использовать одинаковые имена переменных для обычных переменных и массивов... Тем более если массив является таймсерией изменить которую нельзя. А ты её передаёшь в функцию как ссылку &time[]
2. Если ты х приравниваешь у
int x = y;
то и структура заполняется одинаковыми значениями.
TimeToStruct(time[y], dt1);
TimeToStruct(time[x], dt2);
А потом в цикле опять заполняешь структуру.
TimeToStruct(time[x], dt2); // Тута блин косяк ( array out of range )

А по идее должно быть заполнение структуры и чтение любого параметра из неё. типа так
что-то = dt1.day_of_year;
В это "что-то" будет загружен порядковый номер дня в году.

Что-то не могу разобраться в логике...
 
Последнее редактирование:

_SERG_

Активный участник
Ничё не понял, но хотелось-бы.

1. int dayend = DayEndByDate(time, time[0], rates_total), daystart = BarsDayStart(time, dayend, rates_total);
недопустимо использовать одинаковые имена переменных для обычных переменных и массивов... Тем более если массив является таймсерией изменить которую нельзя. А ты её передаёшь в функцию как ссылку &time[]
2. Если ты х приравниваешь у
int x = y;
то и структура заполняется одинаковыми значениями.
TimeToStruct(time[y], dt1);
TimeToStruct(time[x], dt2);
А потом в цикле опять заполняешь структуру.
TimeToStruct(time[x], dt2); // Тута блин косяк ( array out of range )

А по идее должно быть заполнение структуры и чтение любого параметра из неё. типа так
что-то = dt1.day_of_year;
В это "что-то" будет загружен порядковый номер дня в году.

Что-то не могу разобраться в логике...

КРЕЩУСЬ, но всёравно кажется что без индекса ну никак.
Нужно номер куда в стуктуру пишем указывать.
TimeToStruct(time[x], dt2[?]);

Может чёт и не допёр, но 5 копеек - тоже бабки.
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
КРЕЩУСЬ, но всёравно кажется что без индекса ну никак.
Нужно номер куда в стуктуру пишем указывать.
TimeToStruct(time[x], dt2[?]);

Может чёт и не допёр, но 5 копеек - тоже бабки.
Нет, переменная структуры имеет несколько значений как массив. Отличие только в том, что в массиве однотипные переменные, а в структуру можно напихать разные и int и double и string одновременно. А при чтении получается dt2.day_of_year можно понимать как dt2 это массив, а day_of_year это индекс массива.
Конечно это не совсем правильно, но по другому объяснить не могу.
 

_SERG_

Активный участник
Нет, переменная структуры имеет несколько значений как массив. Отличие только в том, что в массиве однотипные переменные, а в структуру можно напихать разные и int и double и string одновременно. А при чтении получается dt2.day_of_year можно понимать как dt2 это массив, а day_of_year это индекс массива.
Конечно это не совсем правильно, но по другому объяснить не могу.

Думаю, если в стуктуре в качестве поля использован массив, то индекс необходим. Пару символов, в коде и истина известна.
// dt2.day_of_year[] иначе не понять, какой day_of_year.

У меня ООП проблемки пока, но не боги горшки обжигают.
 

AlexeyVik

Программист mql4 mql5
Думаю, если в стуктуре в качестве поля использован массив, то индекс необходим. Пару символов, в коде и истина известна.
// dt2.day_of_year[] иначе не понять, какой day_of_year.

У меня ООП проблемки пока, но не боги горшки обжигают.
Ну зачем сочинять что попало? Вот структура

struct MqlDateTime
{
int year; // год
int mon; // месяц
int day; // день
int hour; // час
int min; // минуты
int sec; // секунды
int day_of_week; // день недели (0-воскресенье, 1-понедельник, ... ,6-суббота)
int day_of_year; // порядковый номер в году (1 января имеет номер 0)
};


Вот объявление переменной
MqlDateTime dt1;


Заполнение структуры
TimeToStruct(TimeCurrent(), dt1); // Можно любое другое время и дату.



и чтение полей структуры
dt1.year иди dt1.day или dt1.sec и прочие поля структуры в том числе и dt1.day_of_year


Конечно написав свою структуру можно попробовать засунуть в поле структуры массив, но надо-ли так изгаляться? А что касается стандартной структуры, то это недопустимо.
 

_SERG_

Активный участник
Ну зачем сочинять что попало? Вот структура

struct MqlDateTime
{
int year; // год
int mon; // месяц
int day; // день
int hour; // час
int min; // минуты
int sec; // секунды
int day_of_week; // день недели (0-воскресенье, 1-понедельник, ... ,6-суббота)
int day_of_year; // порядковый номер в году (1 января имеет номер 0)
};


Вот объявление переменной
MqlDateTime dt1;


Заполнение структуры
TimeToStruct(TimeCurrent(), dt1); // Можно любое другое время и дату.



и чтение полей структуры
dt1.year иди dt1.day или dt1.sec и прочие поля структуры в том числе и dt1.day_of_year


Конечно написав свою структуру можно попробовать засунуть в поле структуры массив, но надо-ли так изгаляться? А что касается стандартной структуры, то это недопустимо.

Да хэлп я перед эти прочитал, но идею не просёк, так шо звыняйтэ, дальше с дискуссии нет смысла принимать участие.
 

strannik-ps

VIP-участник
Пазл начал складываться.
Без #property strict ошибки нет, значит надо просто очистить массив.
Теперь у меня тупик, как это сделать.
Может есть у кого варианты?
Ничё не понял, но хотелось-бы.
Все просто - получение даты на новом баре, использовать можно в индикаторах для определения аккумуляции, в советниках как импульсную функцию, да и много куда можно засунуть.
 
Верх