エキスパートアドバイザー - 雑多な質問 - ページ 29

 
honest_knave:
OrderTicketを取得し、名前を作成したコードをアップロードしてください。

(OBJECT_****関数を使って いるので、オブジェクトのドキュメントとは少し違うのです。)

下のコードはOnTick()の中にあります。

for(i=OrdersTotal()-1;i>=0;i--)
  {
   if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
   if(Symbol()!=OrderSymbol()) continue;
   ObjectCreate(0,"#"+IntegerToString(OrderTicket())+" -"+"Object Button",OBJ_BUTTON,0,0,0);
  }

今、私は以下のようにOnChartEvent()でそのオブジェクトを呼び出そうとしています。

if(id==CHARTEVENT_OBJECT_CLICK && sparam=="#"+IntegerToString(OrderTicket())+" -"+"Object Button")
  {
   // when click this button - do something...
  }

ありがとうございました。

 
は、orderloopの内部ではないので、OrderTicket()を知らないはずです。
 
Marco vd Heijden:
は、orderloopの内部ではないので、OrderTicket()を知らないはずです。
だから、可能性はないのでしょうか?
 
Max Enrik:
では、可能性はないのでしょうか?

たいていのことは可能です。しかし、あなたが何を実現しようとしているのかが不明です。このボタンは何ですか?クリックされたときに何をしたいのでしょうか?

おそらく、望む結果を得ることはできますが、アプローチを変更する必要があるかもしれません。

 
honest_knave:

たいていのことは可能です。しかし、あなたが何を実現しようとしているのかが不明です。このボタンは何ですか?クリックされたときに何をしたいのでしょうか?

おそらく望む結果を得ることができますが、アプローチを変更する必要があるかもしれません。


私の目的は、このボタンオブジェクトを クリックすると、チケット番号とその利益が表示され、クラウド注文が終了することです。

このコメントはモバイルデバイスから書きました。10時間後、この問題について調査する予定です。 コメントありがとうございました。
 
Max Enrik:

私の目的は、このボタンオブジェクトは、私がそれらをクリックすると、その順序の雲が閉じ、チケットナンバーズとその利益を表示することができることです。

このコメントはモバイルデバイスから書きました。コメントありがとうございます。

オブジェクト名の中に、これらのボタンを識別するユニークなタグを用意してください。あなたは、"#"を使用しているようです。

if(id==CHARTEVENT_OBJECT_CLICK && StringSubstr(sparam,0,1)=="#") // this is one of your order buttons being clicked

次に、オブジェクト名の残りの部分、またはボタンテキストのいずれかから注文番号を抽出します。

今のところ、OrderTicket()を使う必要はありません。

 

彼のオブジェクトは、オーダーチケットによって識別されます。

"#"+IntegerToString(OrderTicket())+" -"+"Object Button"

つまり、すべてのオブジェクトはチケット番号を文字列名に持っていて、そのオブジェクトがどのオーダーに属しているかを見つけることができるようになっています。

つまり、すべてのオブジェクトは、文字列名に「#」を持つことになります。

つまり、ボタンをクリックすると、まずオブジェクトの文字列名から注文チケット 番号を抽出し、次に orderselectloop を実行し、選択された注文チケットがボタンの文字列名から抽出された注文チケット番号と一致すれば、注文が見つかったことになるのです。

あるいは、単純に

SELECT_BY_TICKET

チャートイベントの内部で注文を選択する。

もし、オブジェクトにチケット番号と名前を与えるだけで、他には何も与えなければ、もっと簡単でしょう。

ObjectCreate(0,"IntegerToString(OrderTicket()),OBJ_BUTTON,0,0,0);

なぜなら、そうすれば、彼はただ直接チケットを選択したり、番号を比較したりできるからです。

 

先日、OrderSelect() Loopを試してみました。まずは近日中にもう一度やってみます。
そして、最新のコメントを深く研究します。

貴重な時間をありがとうございました。

 

下記のコードをtest.mq4ファイルで試してみたところ、完全に動作しており、今のところ問題は発生していませんが、まだテスト中です。

Q: もし、以下のコードが悪いのであれば、改善していただけませんか?

if(id==CHARTEVENT_OBJECT_CLICK)
  {
   for(i=OrdersTotal()-1; i>=0; i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if(OrderSymbol()!=Symbol()) continue;

      if(sparam=="#"+IntegerToString(OrderTicket())+" -"+"Object Button")
        {
         if(!OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,CLR_NONE))
           {
            Print("# Error ",GetLastError());
           }
        }
     }
  }

事前にありがとうございます。

( I am working on it )

 

ざっと見たところ、うまくいくはずです。しかし、効率を向上させることができます。

グラフに描かれたオブジェクトが何種類あるか考えてみてください。それらのオブジェクトの*どれかをクリックすると、すべての注文をループして一致するものを探そうとすることになります。多くのオブジェクトは、おそらく注文とは何の関係もないでしょう。これは非効率的です。

そこで、sparamの最初の文字が "#"であるかどうかをチェック することを提案しました。これは、自動的にそのオブジェクトが注文に関連していることを識別します。

さらに、オーダーをループする必要はありません。オブジェクト名および/またはオブジェクトテキストは、すでにチケット番号を含んでいます。ですから、そこからチケット番号を抽出して、オーダーを閉じます。

あなたはオーダーを開きました。チケット番号12345が与えられて います。

名前"#12345" のOBJ_BUTTON を作成します。

OnChartEvent()のコードは、こんな感じでしょうか(未パイル、未テスト、深夜...)。

if(id==CHARTEVENT_OBJECT_CLICK && StringSubstr(sparam,0,1)=="#") // this is an order button
  {
   int ticket=(int)StringSubstr(sparam,1); // extract the ticket number
   if(OrderSelect(ticket,SELECT_BY_TICKET)) // select the order
     {
      if(!OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,CLR_NONE)) // close the order
        {
         Print("# Error ",GetLastError());
        }
     }
  }
(失敗したときのために、OrderSelectも処理したいでしょう)