Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 273

 
Lowech:
   int nomber = OrdersHistoryTotal();
   int tip=OrderType();
   if(OrderSelect(nomber,SELECT_BY_POS,MODE_HISTORY))  
Добрый день. Нужна помощь. Если есть закрытый ордер Sell то следующий ордер может быть открыт только Buy.Что в коде не так?, подскажите пожалуйста.

уже Вам ответили, что во второй строке этого фрагмента ошибка: Перед вызовом функции OrderType() ордер должен быть выбран с помощью функции OrderSelect().

в строке 3 ошибка: Но есть ли ордер с номером nomber?  Если бы минимальный номер был 1, т.е. счет начинался с 1, то максимальный номер был бы равен количеству (пусть всего ордеров 5: номера ордеров 1, 2, 3, 4, 5). Но ордера нумеруются с 0 - Ставим курсор на OrdersHistoryTotal и нажимаем F1, смотрим пример. Так какой максимальный номер ордера?

 
Aleksey Vyazmikin:

Ранее Вы предложили делить дату месяца на 7 и округлять, что и сделано во второй таблице.

Я не понимаю Ваш алгоритм.

Сейчас вот что я думаю:

1. Определяем день недели первого числа месяца

2. Узнаем, сколько осталось дней до конца недели (была среда (3) до понедельника 7-3=4)

3. 5 число - начало второй недели

4. дальше в цикле ищем какая неделя, если число попадает в диапазон от 5+7*x  до 5+7*(x+1), где х - номер недели за минус первой, то мы нашли неделю

но как то сложно может есть вариант легче?

Алексей, мы говорим о разном. В задаче было определить не в какую неделю месяца входит число месяца, а первый-ли день недели с таким названием в этом месяце. Это разные задачи и соответственно разные решения.

Я за свои 63 года так и не могу понять как считается номер недели в месяце. Допустим считаем как принято в России первый день недели понедельник. Если месяц начинается с воскресенья, то как считать в понедельник??? Началась вторая неделя? Или как??? Вопрос риторический, не надо начинать полемику по этому вопросу.

 
Alexey Viktorov:

Алексей, мы говорим о разном. В задаче было определить не в какую неделю месяца входит число месяца, а первый-ли день недели с таким названием в этом месяце. Это разные задачи и соответственно разные решения.

Я за свои 63 года так и не могу понять как считается номер недели в месяце. Допустим считаем как принято в России первый день недели понедельник. Если месяц начинается с воскресенья, то как считать в понедельник??? Началась вторая неделя? Или как??? Вопрос риторический, не надо начинать полемику по этому вопросу.


Понятно. Для меня вопрос определенный...

 
Alexey Viktorov:

Алексей, мы говорим о разном. В задаче было определить не в какую неделю месяца входит число месяца, а первый-ли день недели с таким названием в этом месяце. Это разные задачи и соответственно разные решения.

Я за свои 63 года так и не могу понять как считается номер недели в месяце. Допустим считаем как принято в России первый день недели понедельник. Если месяц начинается с воскресенья, то как считать в понедельник??? Началась вторая неделя? Или как??? Вопрос риторический, не надо начинать полемику по этому вопросу.

Поискал ответ в Яндексе - 4 способа. Мне нравится Четвертый способ: «Сквозной». 1 января начинается первая неделя года, через семь дней, 8 января — вторая неделя года и так далее до конца года. То же самое по месяцам
Онлайн калькулятор: Определение номера недели по дате
  • Timur пользователь planetcalc
  • planetcalc.ru
Калькулятор ниже определяет порядковый номер недели в году. Как выяснилось, это не совсем тривиальный вопрос, и есть целых четыре разных способа подсчитать номер недели. Первый способ: Стандарт ISO 8601 и соответствующий ему ГОСТ ИСО 8601-2001 «ПРЕДСТАВЛЕНИЕ ДАТ И ВРЕМЕНИ» — официальный способ расчета номера недели в Российской Федерации. По...
 
DarirunuВыходит очень сложно. Наверно есть более простой вариант. Может кто поделиться ?
//+-------------------------------------------------------+
//| Проверка дней недели                       PRVERKA.mq4|
//+-------------------------------------------------------+

#property strict
string Дни[7]={"Вс","Понедельник","Вторник","Среда","Четверг","Пятница","Сб"};
void OnStart()
{
  int День=Day(), ДеньН=DayOfWeek();
  Alert("----------------------");
  Alert("Сейчас на компьютере: ", TimeToStr(TimeLocal(),TIME_DATE));
  Alert("Последний тик с сервера: ", TimeToStr(TimeCurrent(),TIME_DATE), " Число ", День, " ", Дни[ДеньН]);

  int ДеньНачалаМесяца = (ДеньН-День+36) % 7;
  Alert("ДеньНеделиПервогоЧисла = ", Дни[ДеньНачалаМесяца]);

  int ЧислоПервойПятницы = ДеньНачалаМесяца==6?7:6-ДеньНачалаМесяца;
  int ЧислоВторогоПонедл = (ДеньНачалаМесяца<2?9:16)-ДеньНачалаМесяца;

  Alert("ЧислоПервойПятницы = ", ЧислоПервойПятницы, "  ЧислоВторогоПонедл = ", ЧислоВторогоПонедл);

  if(ЧислоВторогоПонедл>День)
  {
    Alert("Надо подождать числа ", ЧислоВторогоПонедл+1);
    return;
  }

  // Смотрим свечи, бары, бычьи, медвежьи
}
  вот по приведенному выше алгоритму  читать снизу вверх
 
STARIJ:

уже Вам ответили, что во второй строке этого фрагмента ошибка: Перед вызовом функции OrderType() ордер должен быть выбран с помощью функции OrderSelect().

в строке 3 ошибка: Но есть ли ордер с номером nomber?  Если бы минимальный номер был 1, т.е. счет начинался с 1, то максимальный номер был бы равен количеству (пусть всего ордеров 5: номера ордеров 1, 2, 3, 4, 5). Но ордера нумеруются с 0 - Ставим курсор на OrdersHistoryTotal и нажимаем F1, смотрим пример. Так какой максимальный номер ордера?

int 1 = OrdersHistoryTotal();
if (OrderSelect(1,SELECT_BY_POS,MODE_HISTORY))
   int tip=OrderType();
   

а теперь правильно?

 
Lowech:
int 1 = OrdersHistoryTotal();
if (OrderSelect(1,SELECT_BY_POS,MODE_HISTORY))   - так какой наибольший номер ордера?
   int tip=OrderType();

а теперь правильно?

напишите скрипт и после каждого оператора выводите на экран информацию + GetLastError()  функцией Alert() - посмотрите пример скрипта чуть выше
 
STARIJ:
напишите скрипт и после каждого оператора выводите на экран информацию + GetLastError()  функцией Alert() - посмотрите пример скрипта чуть выше

только для печати лучше код ошибки брать из переменной _LastError, иначе можно лёгким "отладочным принтом" разрушить логику

GetLastError() заодно делает неочевидную вещь для GetXXX() - она меняет внутреннее состояние, сбрасывая код ошибки в 0.

 
Maxim Kuznetsov:

только для печати лучше код ошибки брать из переменной _LastError, иначе можно лёгким "отладочным принтом" разрушить логику

GetLastError() заодно делает неочевидную вещь для GetXXX() - она меняет внутреннее состояние, сбрасывая код ошибки в 0.

ну это дело вкуса - или сохранить код ошибки в переменной и сбросить ошибку или сохранить в _LastError для дальнейшего использования

 
STARIJ:
  вот по приведенному выше алгоритму  читать снизу вверх
Быстро у Вас получилось. Как бары будете искать? В цикле или структуру времени использовать?
Причина обращения: