注文が選択されているかどうかを確認する方法 - ページ 10

 
artmedia70:
問題ないと思います。何を偉そうに...。あるメイン関数A()で注文を選択し、メイン関数A()から呼び出された別の関数B()で、関数A()で選択された注文を処理する必要があるのです。そして、注文がまだ選択されているかどうかは、関数B()で確実にわかるはずなのですが・・・。そこで、関数A()で選択された順番のチケットを関数B()に渡します。関数B()では、どのリストから注文が選択されたかを確認し、どこに何を返すかを決めて関数A()に戻せばよいのですが...

あなたは私を誤解しています。なぜか半数の人がそうなんです。関数A()で選択されたその注文を関数B()で処理する必要はないのです。関数B()は他の 注文でも動作し、どの注文であっても、関数A()とは関係なく、関数B()は独自のロジックを持ちます。注文数、総利益、コメント、TP・SLなどをカウントできます。関数B()がどのような処理をしていても、関数B()が呼ばれる 前に関数A()が選択したオーダーはもう選択されておらず、関数B()が処理した別のランダムなオーダーが選択され、おそらくループ内のオーダーも検索しているという事実のために、関数A()に戻った時点では、関数B()がオーダーに対して行った処理の論理は破られていない、というように、関数を関数A()に戻すことが課題である。

artmedia70:
では、端末を再起動した後、変数 last_select がどうなるかを想像してみましょう(厄介な奴にライトを消される)

再起動後、必要に応じて last_select 変数は 0 に初期化されます。

 

10ページもあるんですよ、ボソボソと。以下は、この関数が別の(ハイライトされていない)注文で動作するようにするためのコードです。

//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Получаем актуальную информацию об ордере                                  |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
bool fGet_OrderDetails (int fi_Ticket)              // OrderTicket()
{
    int lia_cmd[] = {1,-1,-1,1,1,-1};
//----
    //---- На текущий момент может быть выделенным другой ордер
    int li_LastTicket = OrderTicket();
    if (li_LastTicket != fi_Ticket)
    {   
        if (!OrderSelect (fi_Ticket, SELECT_BY_TICKET))
        {fSet_Comment (fi_Ticket, fi_Ticket, 100, "fGet_OrderDetails()", True, GetLastError()); return (false);}
    }
    if (bi_curTicket != fi_Ticket)
    {
        bi_Type = OrderType();
        bd_OpenPrice = NDD (OrderOpenPrice());
        bd_Lots = OrderLots();
        bi_cmd = lia_cmd[bi_Type];
        bi_curTicket = fi_Ticket;
    }
    bd_curSL = NDD (OrderStopLoss());
    bd_curTP = NDD (OrderTakeProfit());
    //---- Выделяем первоначальный ордер
    if (li_LastTicket != fi_Ticket) {if (li_LastTicket > 0) OrderSelect (li_LastTicket, SELECT_BY_TICKET);}
//----
    return (true);
}
これはあくまで一例です。ポイントを理解した人がキャッチする。
 
TarasBY:

10ページもあるんですよ、ボソボソと。以下は、この関数が別の(割り当てられていない)注文で動作するようにするためのコードです。

これはあくまで一例です。ポイントを理解した人がキャッチする。

そういう問題じゃないんです。EAにはローカル変数、グローバル変数があり、ターミナル変数があります。プログラム側としては、これらの変数はインタラクティブなものであり、その値はEAにとって絶対に不可解な形でいつでも変化しうるものです。順番選択 記号はまさにそのような変数である。Metaquotesがグラフィックオブジェクトの "select "属性へのアクセスを許可していれば、同様になります。この場合、選択した注文の番号を知る必要があるときはいつでも注文を選択し、Expert Advisorのロジックで必要とされる場合にのみ選択した注文を記憶する、という結論が必然的に導き出されます。つまり、こうだ...。
 
tara:
これでは意味がない。EAにはローカル変数、グローバル変数があり、端末の変数がある。これらの変数は、プログラムから見るとインタラクティブなものであり、その値はいつEAにとって不可解な形で変化してもおかしくない。順番選択記号はまさにそのような変数である。Metaquotesがグラフィックオブジェクトの "select "属性へのアクセスを許可していれば、同様になります。この場合、選択した注文の番号を知る必要があるときはいつでも注文を選択し、Expert Advisorのロジックで必要とされる場合にのみ選択した注文を記憶する、という結論が必然的に導き出されます。つまり、こうだ...。

全く同感です。

  • まず、私たちが持っているもの(MQL4の機能)を考慮しなければなりません。
  • 第二に、私自身は、未決済注文を含むすべての取引注文を 一括して処理する仕組みを採用しています。注文を列挙し、それぞれの注文に対して必要なアクションを行います(順番に)。

追伸:そして、上記のチェックを「念のため」コードで行っています・・・。:)

 

:)

Happy Holidays!私にとっては-20年、人生で最悪というわけではありません。

 
TarasBY:

10ページもあるんですよ、ボソボソと。以下は、この関数が異なる(ハイライトされていない)順序で動作するように提供するコードです。

これはあくまで一例です。ポイントを理解した人がキャッチする。

そう、そこです。

int li_LastTicket = OrderTicket();

あなたのコードは、その前にOrderSelectの呼び出しがなかった場合、4105の実行エラーを発生させます。各ティック終了時にGetLastErrorチェックを入れて、このエラーを検出するだけです。

 
tara:

:)

Happy Holidays!私にとっては-20年、人生で最悪というわけではありません。

おめでとうございます。Faith and Truthに20年間仕えたのですか?
 
borilunad:
おめでとうございます。Faith and Truthに20年間仕えたのですか?
そうなんです。
 
tara:
彼女、私の愛する人。
だから、オーバーエンリストって、昔は、いや、今も、ピースって呼ばれてるのかな...?:)
 
borilunad:
だから、オーバーエンリスト、昔は、いや、今もそう呼ばれているのだが、断片的な...?:)
そう言えば気が済むのでしょうか?)
理由: