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

 
honest_knave:

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

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

そこで、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も処理したほうがよさそうです)

うわっ!?私はそのことを知りませんでした。

だから、あなたは2回言及し、私は正確にそれについて理解していなかった。
今、私は自分自身のためにそれをテストし、私のメインのEAファイルにそれを持って来るでしょう。

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

 

他のオブジェクトにOrderTicket()を使っているのですが、そのオブジェクトをクリックすると注文が終了してしまうのです。
私はあなたの方法が好きでしたが、それは他のオブジェクトに影響を与えるように見えます。

このような名前のオブジェクトは 他にもありますが、そのうちの1つです。

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

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

 
Max Enrik:

私は他のオブジェクトのためにOrderTicket()を使用して、今私はそのオブジェクトをクリックしたときに見る - オーダーが閉じます。
私はあなたの方法が好きでしたが、それは他のオブジェクトに影響を与えるように見えます。

このような名前のオブジェクトは 他にもありますが、そのうちの1つです。

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

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

よりエレガントな解決策は、ネーミング・システムを変更することです。

それでも、注文番号を取り除くことは可能です。ただ、正確な命名形式次第です。

しかし、その前に、このボタンのOBJPROP_TEXTは何でしょうか?他のオブジェクトも同じOBJPROP_TEXTを持っているのでしょうか?

 
honest_knave:

よりエレガントな解決策は、ネーミング・システムを変更することです。
それでも、注文番号を削除することは可能です。ただ、正確な命名形式次第です。
しかし、その前に、このボタンのOBJPROP_TEXTは何でしょうか?他のオブジェクトにも同じOBJPROP_TEXTがあるか?

そうなんです。ボタンオブジェクトの 名前は変更できることは知っています(Prefixも使っています)もしボタン名を変更したら、例えばシステムを削除したり、他のものを変更することができます。

以下は、ButtonとHLineの名前です。

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

(もちろん、オブジェクトの名前はもう少し違いますが、同じ方法です。)

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

 

マーケットクローズ

もしかしたら、見つけたかもしれませんが、よくわかりません。
もし、これがまずかったら、教えてください。

if(id==CHARTEVENT_OBJECT_CLICK && StringFind(sparam,"close order button",0)>=0)

よろしくお願いします。

//--- 2回目の編集

おいおい、まんさん。

どうもありがとうございます。今のところ問題はありません。正しく動作します!

 

#クロスオーバー・オブジェクト - オープン

私はこの問題に何度も直面し、時には合格し、時にはあきらめましたが、今もう一度あきらめたくありません。
私は2つのオブジェクト " HLine and Button " を持っていますが、それらはクロスオーバーしています。( BUTTON Width = 20, HLINE Width = ご承知の通り )

Q: BUTTONオブジェクトを クリックすると、HLINEオブジェクトが選択されずにクロスオーバーしてしまうのですが、どうしたらいいでしょうか?
(HLINEが交差しない場所であれば、簡単に選択することができます。)

ありがとうございます。

( 私はそれに取り組んでいます。良いコメントがあれば、より良いお願いします。)

 

#Pipsの利益-オープン|#Pipsの利益-とりあえずクローズ|解決 しました。

ウィリアム さん - 私はあなたの" Pip, Point ... "計算コードを使用しています。" 計算コードを使っています。
現在、以下のコードで利益をpips値で得ようと試みています。2つの注文がありますが、1つは正しく表示され( OP_BUY )、2つ目は正しく表示されません - 399 - 実際の400 ( OP_SELL )です。

Q: Profit in Pipsの計算が間違ってるんでしょうか?

change_to_pips( OrderTakeProfit() - OrderOpenPrice() )

ありがとうございます。

(昨日、いろいろなサイトのフォーラムをチェックしたのですが、私には有益なものではありませんでした。)

 

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

MQL4言語とアプリケーションのマーケットを更新したMetaTrader 4 Build 574がリリースされました。

whroeder1, 2014.01.27 14:11

  1. そんな読めない、理解できないコードを書かないでください。
    if (MyOrdersTotal() == 0 && (Hour()​>=​StartHour ​&& Hour()​<​EndHour && StartHour​<​EndHour) || (Hour()​>=​StartHour || Hour()​<​EndHour && StartHour​>​EndHour))
    読みやすく簡略化し、and/orを混ぜるときは必ず括弧を付けましょう。
    bool    isHourOKnorm = StartHour < EndHour
                         && StartHour <= Hour() && Hour() < EndHour,
            isHourOKwrap = StartHour > EndHour
                         && (StartHour <= Hour() || Hour() < EndHour),
         isHourOK       = isHourOKnorm || isHourOKwrap;
    if(MyOrdersTotal() == 0 && isHourOK)
  2. StartHour == EndHour (つまり、24時間すべて)の場合はどうでしょうか。

ウィリアム さんの複雑な条件の" if "演算子の例で、驚くべきものの一つです。
ありがとうございます


この2日間、私の " if " 演算子の複雑な条件を修正するのに苦労しましたが、上記の素晴らしい例を見つけるまで、私の問題を解決することは出来ませんでした。

 

この問題を解決するために本当に苦労しています。

#296

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

 

以下のコードは、完璧に動作するときと、そうでないときがあります。この問題を解決することができません。単一注文の時は完璧に動作しますが、複数注文を出すとこの機能は 正しく動作しません。
私を助けてください、そして、もう少し説明してください(その下のコードで何が間違っているのか)それは私のために良いだろう。

( 只今、作業中です。 )

if(id==CHARTEVENT_OBJECT_CLICK && (StringFind(sparam,Button_1,0)>=0 || StringFind(sparam,Button_2,0)>=0))
  {
   ticketnumber=(int) StringSubstr(sparam,1);

   if(OrderSelect(ticketnumber,SELECT_BY_TICKET))
     {
      if(StringFind(sparam,Button_1,0)>=0)
        {
         // ...
        }

      if(StringFind(sparam,Button_2,0)>=0)
        {
         //...
        }

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

         update_1();
         update_2();
         update_3();
        }
     }
  }

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