新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 273

 
Lowech:
   int nomber = OrdersHistoryTotal();
   int tip=OrderType();
   if(OrderSelect(nomber,SELECT_BY_POS,MODE_HISTORY))  
下午好。我需要一些帮助。如果有一个关闭的卖出订单,下一个订单可能只为买入而打开。 代码中的问题是什么? 请告知。

你已经被告知这个片段的第二行包含一个错误:在调用 OrderType()函数 之前,必须用OrderSelect()函数 来选择订单。

第3行有一个错误:但是有一个数字为1的订单吗? 如果最小的数字是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)的范围内,其中x-星期数减1,那么我们就找到了这个星期

但这很复杂,也许有一个更简单的方法?

阿列克谢,我们谈论的是不同的事情。问题不在于确定每月哪一周的数字,而在于确定该月中有此名称的第一日。这些是不同的任务,因此也是不同的解决方案。

63年来,我仍然搞不清楚如何计算每月的周数。例如,在俄罗斯,星期一被认为是一周的第一天。如果这个月是从星期天开始的,那么星期一怎么算呢?第二周开始了吗?还是什么?这个问题是修辞性的,没有必要为此展开论战。

 
Alexey Viktorov:

阿列克谢,我们在谈论不同的事情。问题不是要确定这个月的数字在哪个星期,而是要确定它是否是这个月里有这个名字的那个星期的第一天。这些是不同的任务,因此也是不同的解决方案。

63年来,我仍然不明白如何计算每个月的周数。比方说,在俄罗斯,一周的第一天是星期一。如果一个月从星期天开始,那么星期一如何计算?第二周开始了吗?还是什么?这个问题是修辞性的,没有必要为此展开论战。


我明白了。这对我来说是一个确定的问题...

 
Alexey Viktorov:

阿列克谢,我们在谈论不同的事情。问题不是要确定这个月的数字在哪个星期,而是要确定它是否是这个月里有这个名字的那个星期的第一天。这些是不同的任务,因此也是不同的解决方案。

63年来,我仍然搞不清楚如何计算每月的周数。例如,在俄罗斯,星期一被认为是一周的第一天。如果这个月是从星期天开始的,那么星期一怎么算呢?第二周开始了吗?还是什么?这个问题是修辞性的,没有必要为此展开论战。

在Yandex上查找了答案--4种方法。我喜欢第四种方式:"交叉"。1月1日是一年中的第一周,七天后,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行有一个错误:但是有一个数字为1的订单吗? 如果最小的数字是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:
这里是上面的算法,可以从下往上阅读。
这很迅速。你将如何搜索酒吧?在一个循环中还是使用时间结构?