//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 19.02.2008 |//| Описание : Возвращает тип последней открытой позиции или -1 |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+
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)
} // Аминь.
また、関数を分解するのであれば、関数のヘッダーを切ってはいけませんでした、そこには重要な情報があります。
最後にオープンしたポジションの型、または -1 を返します。これは、クローズしたポジションが ない場合、この関数が呼ばれると、その値は -1 に等しくなることを意味します。
sy - 商品名(通貨ペア)。
mn - マジックナンバー。1 を指定すると,どんなマジックナンバーを指定しても,最後に閉じたオーダーの型が返されます。
一点一点回答、すみません。
1 「プログラミングの天才?
2 - 公平に言うと、糞やその他の腐敗生成物以外、余分なものはありません(率直な意見ですが、別のスレッドで議論を始める準備ができています)。
3 - これで全て納得です。:)
4 - 本当にその通りです。そうなんです、ちょっと「勘違い」して「OrderSend」機能で入力してしまったんです。
Function-Brick parsing」テンプレートへのご投稿ありがとうございました。:)
1.皮肉は抜きにして考えましょう。快適で簡単な学習ができました。天才と何の関係があるんだ?
2.議論好き。
3.コード内のコメントから察するに、何も理解していないのでしょう。
4.そうなるんです。
ポイント2について、一例を挙げます。
不要なものが少ない
以下は、カスタム関数の実際の使用例です。
.
?ありがとうございます。
だから、関数名を適用しないと使えないし、変数「r」自体がその関数の値を決定するように設定されているんだ!
ここで、私にもちょっとした発見が!^^
ゆりさん、いつもありがとうございます。:)
最終的な明確化のために、このようなことも可能です。
あなたの例は正しくありません。パラメータを持つ関数を呼び出す 場合は、パラメータの値をカンマで区切って大括弧で囲んで指定する必要があります。また、すべての関数に値が割り当てられているわけではないことも知っておく必要があります。関数型がvoidの場合、何の意味もなく、何らかのアクションを実行したり、変数を計算したりすることを目的としています。後者の場合、この関数の結果を利用するために、これらの変数の名前を知っておく必要がある。
コンパイラはこの行で、変数が宣言されていないというエラーを出します。
せめてこれくらいはしてほしい。
ポイント2について、一例を挙げます。
不要なものが少ない
くだらない質問で申し訳ないのですが、なぜ最後に閉じた注文を見つけるために、履歴を全部掘り返しているのですか?端から1つ目を見つけて、すぐに出てくるんですね。
くだらない質問で申し訳ないのですが、なぜ最後に閉じた注文を探すために履歴を掘り返しているのですか?端から1つ目を見つけてすぐに退出する、という理解でいいのでしょうか。
以前、ユーザーがソートした履歴がそのまま保存される問題について議論されたことがありました。それゆえ(念のため)、検索はきっちりと。
ユーザーが行えるのは視覚的なソートのみで、ストーリー内の位置番号を変更することはできません。
ユーザーが行えるのは視覚的なソートのみで、ストーリー内の位置番号を変更することはできません。
実は、テスターでの注文は本当に期待するしかない。
気がつかなかったが、まあいいや、反論はしない。深さを10〜20にすれば十分でしょう。しかし、その全貌は......。それはちょっとやりすぎだと私は思います。