どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 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 parsing」テンプレートへのご投稿ありがとうございました。:)

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」自体がその関数の値を決定するように設定されているんだ!
ここで、私にもちょっとした発見が!^^
ゆりさん、いつもありがとうございます。:)


最終的な明確化のために、このようなことも可能です。

?


あなたの例は正しくありません。パラメータを持つ関数を呼び出す 場合は、パラメータの値をカンマで区切って大括弧で囲んで指定する必要があります。また、すべての関数に値が割り当てられているわけではないことも知っておく必要があります。関数型がvoidの場合、何の意味もなく、何らかのアクションを実行したり、変数を計算したりすることを目的としています。後者の場合、この関数の結果を利用するために、これらの変数の名前を知っておく必要がある。

 
Link_x:

if(GetTypeLastClosePos == OP_BUY)

コンパイラはこの行で、変数が宣言されていないというエラーを出します。

せめてこれくらいはしてほしい。

if(GetTypeLastClosePos() == OP_BUY)
 
artmedia70:

ポイント2について、一例を挙げます。

不要なものが少ない



くだらない質問で申し訳ないのですが、なぜ最後に閉じた注文を見つけるために、履歴を全部掘り返しているのですか?端から1つ目を見つけて、すぐに出てくるんですね。
 
Roger:


くだらない質問で申し訳ないのですが、なぜ最後に閉じた注文を探すために履歴を掘り返しているのですか?端から1つ目を見つけてすぐに退出する、という理解でいいのでしょうか。
かつて、ユーザーがソートした形で履歴が保存される場合の問題が議論されたことがありました。それゆえ(念のため)、検索はきっちりと。
 
artmedia70:
以前、ユーザーがソートした履歴がそのまま保存される問題について議論されたことがありました。それゆえ(念のため)、検索はきっちりと。

ユーザーが視覚的に認識するために履歴をソートすることができるだけで、履歴の位置番号を変更することはできません。
 
Roger:
ユーザーが行えるのは視覚的なソートのみで、ストーリー内の位置番号を変更することはできません。

これは良いことだと思います。でも、昔は違ったんです。今、私はフォーラムで情報を探すことはありません - それは長い時間前だった。だから、もしまた同じことが起きたらどうしようと思ったんです。間違った結果を出すくらいなら、オーダーを駆け足でこなすほうがいい。
 
Roger:
ユーザーが行えるのは視覚的なソートのみで、ストーリー内の位置番号を変更することはできません。

実は、テスターでの注文は本当に期待するしかない。
 
TheXpert:
実は、テスターでの注文は本当に期待するしかない。


気がつかなかったが、まあいいや、反論はしない。深さを10〜20にすれば十分でしょう。しかし、その全貌は......。それはちょっとやりすぎだと私は思います。