任何菜鸟问题,为了不给论坛添乱。专业人士,不要路过。没有你就无处可去 - 6. - 页 403

 
Link_x:

如果你要拆开这个函数,你不应该剪掉函数的标题,那里有重要的信息。

返回最后打开的位置的类型或-1 - 这意味着如果没有关闭的位置,那么当函数被调用时,其值将等于-1。

sy - 工具的名称(货币对)。

mn - 神奇的数字。如果我们设置为-1,那么无论什么魔法数字,该函数都将返回最后一个封闭订单的类型。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает тип последней открытой позиции или -1               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
 
Link_x:
逐点回答,抱歉。
1 - 编程天才?
2 - 公平地说,除了粪便和其他腐烂产物,没有什么是多余的(坦率的意见,准备开始辩论,但在另一个主题:))。
3 - 现在一切都说得通了。:)
4 - 如此真实。我知道,我有点 "搞错 "了,用 "OrderSend "函数打字。

感谢你对 "Function-Brick解析 "模板的贡献。:)

1.让我们免于讽刺,好吗?它使你的学习变得舒适和轻松。天才与此有什么关系?
2.争论性的。
3.从你在代码中的评论来看,你根本不懂什么。
4.它发生了。

int GetTypeLastClosePos(string sy="", int mn=-1) {    
   datetime t;                                        // Переменная хранит время закрытия
   int      i, k=OrdersHistoryTotal(), r=-1;          // Объявление переменных i - индекс k - количество ордеров в истории r - будет хранить тип ордера
   if (sy=="0") sy=Symbol();                          // Если в функцию в качестве значения символа передан NULL, то будет использоваться текущий символ графика
   for (i=0; i<k; i++) {                              // Цикл по истории от нуля до OrdersHistoryTotal()
      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Если ордер с индексом i выбран в истории
// ---------------------- определение нужного нам ордера ордера ---------------------               
         if ((OrderSymbol()==sy || sy=="") &&         // если переданный символ совпадает с символом ордера или передано значение по-умолчанию
             (mn<0 || OrderMagicNumber()==mn)) {      // если передано значение по-умолчанию или магик ордера равен переданному в функцию значению
            if (OrderType()==OP_BUY || OrderType()==OP_SELL) { // если это или Buy или Sell
// --------------------- определение последнего закрытого ордера --------------------               
               if (t<OrderCloseTime()) {                       // если значение, записанное в t меньше времени закрытия ордера
                  t=OrderCloseTime();                          // запоминаем значение времени закрытия выбранного ордера для следующего сравнения
                  r=OrderType();                               // запоминаем тип ордера
                  }                                            // Конец блока определения времени закрытия.
               }                                               // Конец блока обработки найденного нужного ордера по типу (одного из возможных)
            }                                                  // Конец блока проверки по символу и магику
         }                                                     // Конец блока обработки выбранного ордера
      }                                                        // Идём проверять следующий ордер (если i всё ещё меньше k)
// -- после прохода в цикле по всей истории в r будет лежать тип ордера или -1 (если не нашли ничего) --               
   return(r);                                                  // возвращаем результат поиска (либо тип ордера, либо -1)
}                                                              // Аминь. 

关于第2点,一个例子。

int GetTypeLastClosePos(string sy, int mn) {    
   datetime t;                                        // Переменная хранит время закрытия
   int      i, k=OrdersHistoryTotal()-1, r=-1;        // Объявление переменных i - индекс k - количество ордеров в истории r - будет хранить тип ордера
   for (i=k; i>=0; i--) {                             // Обратный цикл по истории от OrdersHistoryTotal()-1 до нуля 
      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Если ордер с индексом i выбран в истории
// ---------------------- определение нужного нам ордера ордера ---------------------               
         if(OrderMagicNumber()!=mn) continue;         // если магик не тот - идём выбирать следующий ордер в истории
         if(OrderSymbol()!=sy)      continue;         // если переданный символ не равен символу ордера - идём выбирать следующий ордер в истории
         if (OrderType()>1)         continue;         // если это не Buy и не Sell - идём выбирать следующий ордер в истории
// --------------------- дальше имеем выбранный нужный нам ордер --------------------        
// -------------------------- определяем время его закрытия -------------------------               
         if (t<OrderCloseTime()) {                    // если значение, записанное в t меньше времени закрытия ордера
            t=OrderCloseTime();                       // запоминаем значение времени закрытия выбранного ордера для следующего сравнения
            r=OrderType();                            // запоминаем тип ордера
            }                                         // Конец блока определения времени закрытия.
         }                                            // Конец блока обработки выбранного ордера
      }                                               // Идём проверять следующий ордер (если i всё ещё больше k)
// -- после прохода в цикле по всей истории в r будет лежать тип ордера или -1 (если не нашли ничего) --               
   return(r);                                         // возвращаем результат поиска (либо тип ордера, либо -1)
}                                                     // Аминь. 

这里没有那么多不必要的东西

 
Link_x:

下面是一个实际使用自定义函数的例子:

.
谢谢你。
因此,你必须应用函数的名称来使用它,而变量 "r "本身的设置是为了确定该函数的值!
这是我的一个小发现!^^
再次感谢你,尤里。:)


为了最后澄清,这是有可能的。

?


你的例子是不正确的。当你调用一个 有参数的函数 时,你必须在括号里给出这些参数的值,用逗号隔开。你还应该知道,并不是所有的函数都被赋值。如果函数类型是无效的,它就没有任何意义,目的是为了执行一些动作或计算一些变量。在后一种情况下,有必要知道这些变量的名称,以便使用这个函数的结果。

 
Link_x:

if(GetTypeLastClosePos == OP_BUY)

编译器会在这一行给你一个错误,说该变量没有被声明。

你至少应该这样做。

if(GetTypeLastClosePos() == OP_BUY)
 
artmedia70:

关于第2点,一个例子。

不必要的项目较少



对不起,我的问题很愚蠢,但你为什么要翻阅整个历史记录来寻找最后一个已关闭的订单?你从最后找到第一个,然后直接出去,我想。
 
Roger:


对不起,我的问题很愚蠢,但你为什么要翻阅历史来寻找最后一个关闭的订单?按照我的理解,你从最后找到第一个,然后立即退出。
有一次,人们讨论了一个问题,当历史记录以用户排序的形式存储时,会出现问题。因此(为了安全起见),搜索的结果正是如此。
 
artmedia70:
曾经有人讨论过一个问题,即历史记录是按照用户的排序来存储的。因此(为了安全起见),搜索的结果正是如此。

用户只能对历史记录进行排序以获得视觉感受,历史记录中的位置数字不能被改变。
 
Roger:
用户只能在视觉上对故事进行排序,故事中的位置数字不能被改变。

这是件好事。但以前是不同的。现在我不会在论坛上寻找信息了--那是很久以前的事了。所以我在想,如果再发生这种情况怎么办?我宁愿跑遍所有的订单也不愿得到一个错误的结果。
 
Roger:
用户只能在视觉上对故事进行排序,故事中的位置数字不能被改变。

实际上,你只能真正希望在测试者中获得秩序。
 
TheXpert:
实际上,人们只能真正希望在测试器中获得秩序。


没有注意到,但好吧,我不争论。使深度达到10-20,应该足够了。但整个故事...在我看来,这有点过了。