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

 

お薦めです。

すべての問題を解いたときには、プロの仲間入りをしていると考えていいでしょう。

物事をできるだけ難しくすることが、一番身につく。

そうでないと、簡単なことでもずっと苦労し続けることになる。

 

まず最初に、あなたのコメントに本当に感謝します。

コメント後、もう一度Order Modificationのコードブロックを作ってテストしてみることにしました。

 

Marco vd Heijden さん

あなたの素晴らしいコメントと例の後、私はすでにテイクプロフィット価格のためのドラッグのためのコードを書いています。
しかし、実は私は継続的な更新に反対しています。なぜですか?テイクプロフィットのドラッグのコードブロックを書いてから、私のチャートがゆっくりと変化するのがわかります。多分、その部分にミスがあったのだと思います。この問題を解決した後に確認するつもりです。

(自分で解決しようとして、何度も試した結果、" for "ループ演算子を使えば、計算を止めることはできないのではないかと思いました)

テイクプロフィットとストップロスのサイズはすでに計算済みで、そのため以下のコードから " Switch " 演算子を削除したことをお伝えして おきます。
私はただ、利食い価格が「線」価格と等しくなったときに、次に利食い価格「 != 」が「線」価格になるまで、ストップを計算・更新することを試みています。
Q:
下記のコードを修正するのに苦労しています。どうしたらいいでしょうか?
Q: 私はこの問題に対して「Switch」演算子を使っていないのですが、間違っていますか?

//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   for(int order=OrdersTotal(); order>=0; order--)
     {
      bool selected=OrderSelect(order,SELECT_BY_POS);
        {
         if(selected==1)
           {
            if(Symbol()==OrderSymbol()) // only for current chart symbol
              {
               /* I just try for - if price not equal != "Line OBJPROP_PRICE "
                  stop updates */


               // if objects not found - create them
               // ...
               // if objects exist
               // ...
               while(price!=ObjectGetDouble(0,"line",OBJPROP_PRICE,0))
                 {
                  PlaySound("ok.wav");
                  price=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);
                  Comment(price);
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+

OrderModify()のドキュメントや本を読みましたが、私の懸念にぴったりな例はありませんでした。

よろしくお願いします。

 

スレッドの更新を怠っていたので、あなたがやっていることを見逃しているかもしれません。

まず、シンプルにすること。

for(int order=OrdersTotal(); order>=0; order--)
     {
      bool selected=OrderSelect(order,SELECT_BY_POS);
        {
         if(selected==1)
となるはずです。
for(int order=OrdersTotal()-1; order>=0; order--)
     {
      if(OrderSelect(order,SELECT_BY_POS)

また、線を動かす頻度も考えてください。1秒に1回でしょうか?おそらくそうではないでしょう。

あなたのコードをOnChartEvent()に入れてください。

void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
  {
   if(id==CHARTEVENT_OBJECT_DRAG && sparam=="line") // the chart event of dragging the line

同じ関数を 未決済注文のたびに何度も呼び出しています。

while(price!=ObjectGetDouble(0,"line",OBJPROP_PRICE,0))
  {
   PlaySound("ok.wav");
   price=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);
   Comment(price);
  }

注文ループに入る前に一度だけ呼び出す。

double lineprice=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);
for(int order=OrdersTotal()-1; order>=0; order--)
  {  
 

whileループの原理を理解していることを確認してください。

なぜなら、何らかの理由で他のEAが ラインプライスの値を変更しようとすると、このコードは無限ループに陥り、あなたのターミナルがフリーズする可能性が高いからです。

これは通常、異常終了に終わります。

しかし、あなたはlineというオブジェクトを使っているので、OrderModify()によってサーバーに送られるtpとslのレベルについて話すときほど危険は大きくありませんから、lineに干渉する他のEAを書く予定がなければ、問題ないでしょう。

 
honest_knave:

スレッドの更新が追いついていないので、何をやっているのか見逃しているかもしれません。


オーダーループに入る前に一度かけてみてください。

double lineprice=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);
for(int order=OrdersTotal(); order>=0; order--)
  {  

彼がやろうとしていることを理解してください。

行が移動したかどうかを確認するために、彼は2回コールして値を比較しなければなりません。

これは、値を2回読まないと不可能です。

while(price!=ObjectGetDouble(0,"line",OBJPROP_PRICE,0))// if price differs from "line" value do:
  {
   PlaySound("ok.wav");
   price=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);// now overwrite old line value with new line value.
   Comment(price);
  }
 
Marco vd Heijden:

彼がやろうとしていることを理解してください。

彼は、ラインが移動したかどうかを確認するために、2回コールして値を比較しなければなりません。

それは、値を2回読み込まないと不可能です。

もう一度説明してください。

CHARTEVENT_OBJECT_DRAG があり、スパラムが "line" であれば、ラインは移動したことになります。

まれに同じ値段で時間的に動くことがありますが、そのペナルティは大したことはありません。

 

同じことを行うには多くの方法があります。

CHARTEVENTを使用する場合、テスターでは動作しないことを忘れないでください。

 
よし、君たちに任せるよ。頑張ってください。
 

マルコさん、ナベさん、ウィリアムさん、皆さんの有益なコメントをすでに読ませていただきました!本当にありがとうございます。

今、私はすでにいくつかのことをチェックし、また、私はステップバイステップでOrderModify()を書く(/およびチェックする)ことができると判断しました。なぜなら、このOrderModify()は、私にとって本当に本当に危険だからです。
というのも、このOrderModify()は私にとって本当に危険なもので、すでに何度か間違った修正に直面しました。しかし、同じ問題に直面したとき、その問題がどこから来るのかが確実に分かっていて、同じことをチャートで試しても、その問題や課題は二度と起きなかったのです。数時間後、私は再び同じ問題に直面しました。
私はまだその問題のための正確な原因を知らない。私が言っている問題とは何なのでしょうか?そのうちの一つを、私はすでに以前のコメントでお伝えしています。また、私のトレードパネル EAで1つのポジションを開設しました。(私のトレードパネルにはまだ売り指値や売り逆指値の注文がありません。)

このブロックのコードを共有するべきだと思うのだが、まだ作業中なので、今は共有できない。私はそのブロックのコードをOnChartEvent()に移動したいです。

問題: 注文がクローズしたら、そのオブジェクトを削除するコードが書けません。例えば、Stop Loss, Take Profit, Open, Close arrows こんな感じです。
質問ト レードパネルのオブジェクトの前にストップロス、テイクプロフィットのラインもあります。前回作成したオブジェクトが原因であることは分かっています。しかし、もしあなたが私を理解しているならば、どうすればトレードパネル・オブジェクトを他のオブジェクトの前に置くことができるでしょうか。

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