記事「DoEasy - コントロール(第31部):ScrollBarコントロールのコンテンツのスクロール」についてのディスカッション - ページ 3

 
#include <DoEasy\Engine.mqh>

CEngine        engine;

....

   int h=37,w=100;
   string name=prefix+"EDIT_BUY_LIMIT";
   x=309;
   y=124;
   if(!EditCreate(name,x,y,w-16,h,"",clrBlack,clrWhite))
     {
      Alert(TextByLanguage(「編集要素の作成に失敗しました。,"Could not create Edit element \""),prefix+"EDIT_BUY_LIMIT"+", error: "+(string)GetLastError());
      return false;
     }


//+------------------------------------------------------------------+
//| 編集の作成|
//+------------------------------------------------------------------+
bool EditCreate(const string name,
                const int x,
                const int y,
                const int w,
                const int h,
                const string text,
                const color clr_txt,
                const color clr_bg,
                const string font="Calibri",
                const int font_size=11)
  {
   if(!engine.CreateEditField(0,name,0,false,x,y,w,h,font_size,CORNER_LEFT_LOWER,ALIGN_CENTER,false))
     {
      Print(DFUN,TextByLanguage("編集要素の作成に失敗しました!エラーコード="","Could not Edit element! Error code="),GetLastError()); 
      return false;   // --- ここで偽を返す
     }
 }
 
また、パネルにリンクしてエディットを作成する方法とは?
 
うわー、パネル描いちゃったよ、時間かけちゃったよ。そして、エディット・エレメントが作れないことが判明した...。
 
leonerd #:
うわー、パネル描いちゃったよ、時間かけちゃったよ。そして、エディット・エレメントを作れないことが判明した...。
完全にコンパイル可能な例を見せてください。
 
Artyom Trishkin #:
完全にコンパイル可能な例を見せてください。

そのようなオブジェクトがなければ、何をコンパイルすればいいのでしょう。

GRAPH_ELEMENT_TYPE_WF_RADIOBUTTONや他のオブジェクトはありますが、単純なEditはありません。エンジン・メソッドのCreateEditField()を使ってフィールドを作成することができますが、パネルにバインドする方法を教えてください。

CPanel *pnl=engine.CreateWFPanel("WFPanel",50,50,280,240,array_clr,200,true,true,false,-1,FRAME_STYLE_BEVEL,true,false);
if(pnl!=NULL)
  {
   if(!pnl.CreateNewElement(GRAPH_ELEMENT_TYPE_WF_RADIOBUTTON,InpRbnShiftX+dist_rbtn_x*i,InpRbnShiftY,50,20,clrNONE,255,true,false))
     ..
  }

 
leonerd #:

もし、そのようなオブジェクトがなければ、何をコンパイルすればいいのだろう。

GRAPH_ELEMENT_TYPE_WF_RADIOBUTTONやその他いろいろありますが、単純なEditはありません。エンジン・メソッドのCreateEditField()を使ってフィールドを作成しましたが、パネルにバインドする方法を教えてください。

ライブラリはまだ開発中です。グラフィカル・エレメントはまだ半分もできていません。入力フィールドはまだありません。あなたが作ろうとしているのは標準的なものだけです。

入力フィールド」オブジェクトが利用可能になれば、すべてが機能するようになる。標準オブジェクトをフォームにバインドするのは現実的ではありません。

 

わかりました。

また、このメソッドは正しく動作しません。

CArrayObj* pos_orders=engine.GetListAllOrdersByPosID(prev_pos_ticket);

最後の注文しか返してくれません。なぜか、注文をフィルタリングすると、削除された保留中の注文として扱われます。

ちょっとインプットしておきます。ポジションの最初の注文はリミッター(SELL STOP)でオープンされ、SL/TPを変更してポジションを何度か更新しました。その後、SLでクローズのイベントをキャッチしました。クローズしたポジションの 最初の注文を見つけたいのですが、上記の方法は正しく機能しません。

CEngine engine

....

    if(event.TypeEvent()==TRADE_EVENT_POSITION_CLOSED_BY_SL)
        {
         
         ulong prev_pos_ticket=event.TicketPositionPrevious();  // チケットの正しい位置はこちら 
         CArrayObj* pos_orders=engine.GetListAllOrdersByPosID(prev_pos_ticket); // ここでは、受信した配列の中で、位置(sl)の最後の順序のみ
        }
  
 
leonerd クローズしたポジションの 最初の注文を見つけたいのですが、上記の方法は正しく機能しません。

ポジションチケットとポジションIDは全く別のものです。チケットは常に変化し、ポジションを変更した取引を発生させた注文のチケットと同じになります。

MetaTrader 5の注文システムに関する記事やヘルプを読む必要があります。

 

ClosePosition()上では、全くフィリングも記入されません。

Trading.mqh trade_obj.ClosePosition(ticket,comment,deviation)
trade_obj には必要な記入があり、this.m_request.type_filling メソッドの中に入るとデフォルトの FOK になります。

 
leonerd ,comment,deviation)
trade_obj に必要な記入があり、this.m_request.type_fillingメソッドの中に入るとデフォルトのFOKになる。
調べてみます。ありがとうございます。