[ARCHIVE]フォーラムを乱立させないために、どんなルーキーの質問でも。プロフェッショナルの皆さん、通り過ぎないでください。あなたなしではどこにも行けない - 5. - ページ 348

 
FAQ:
なぜ、ポジションではなく、注文のチケットを記憶しないのか。また、そのような注文がない場合、直接転送ではどうなるのか。ゼロの注文は削除されるのか。


すでに試しました。これもうまくいきません。

//+-------------------------------------------------------------------------------------+
//| Удаление несработанных отложеннык шортов                                            |
//+-------------------------------------------------------------------------------------+
void DeletePendingSells(int& amountOfCurrPending)
{
   int total = OrdersTotal() - 1,
       ordersToDelete = level - amountOfCurrPending,  // Количество отложек, которые требуется удалить
       s_ticket = 1,                                  // Тикет искомого ордера
   amountOfCurrPendingBuys = 0;                       // Количество текущих отложек на покупку
   amountOfCurrPendingSells = 0;                      // Количество текущих отложек на продажу

   double OOP = 20.0;                                  // Зададим значение цены открытия отложки, которой не может быть..
   
   if (ordersToDelete == 0) return (0);

   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if(OrderType() != OP_SELLSTOP) continue;         // Работает только с шортовыми ордерами
      
      if (OOP > OrderOpenPrice())
      {
          OOP = OrderOpenPrice();                  // Ищется ордер, с минимальной ценой открытия
          s_ticket = OrderTicket();                // Получаем тикет ордера с минимальной ценой открытия
      }
   }
   if (s_ticket != -1)
   {
      OrderDelete(s_ticket,Black);
   }
   return (0);
}
 
hoz:


以前にも試したことがあります。これもダメなんです。

もっと気をつけなければならないことがある。
//+-------------------------------------------------------------------------------------+
//| Удаление несработанных отложеннык шортов                                            |
//+-------------------------------------------------------------------------------------+
void DeletePendingSells(int& amountOfCurrPending)
{
   int total = OrdersTotal() - 1,
       ordersToDelete = level - amountOfCurrPending,  // Количество отложек, которые требуется удалить
       s_ticket = 1,                                  // Тикет искомого ордера
   amountOfCurrPendingBuys = 0;                       // Количество текущих отложек на покупку
   amountOfCurrPendingSells = 0;                      // Количество текущих отложек на продажу

   double OOP = 20.0;                                  // Зададим значение цены открытия отложки, которой не может быть..
   
   if (ordersToDelete == 0) return (0);

   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if(OrderType() != OP_SELLSTOP) continue;         // Работает только с шортовыми ордерами
      
      if (OOP > OrderOpenPrice())
      {
          OOP = OrderOpenPrice();                  // Ищется ордер, с минимальной ценой открытия
          s_ticket = OrderTicket();                // Получаем тикет ордера с минимальной ценой открытия
      }
   }
   if (s_ticket != -1)
   {
      OrderDelete(s_ticket,Black);
   }
   return (0);
}
 

ついに動いた!原理的にはうまくいったし、前のバージョンもそうだった。主なバグは、関数そのものではなく、関数の呼び出しに ありました。

プロの目から見ると、静的変数でない限り、つまり値を特定しておく必要がない限り、関数に入るときはすべての変数をゼロにすべきですよね?

 
hoz:

ついに動いた!原理的にはうまくいったし、前のバージョンもそうだった。主なバグは、関数そのものではなく、関数の呼び出しにありました。

プロの目から見ると、静的なもの、つまり値を特定しておく必要がないもの以外は、関数に入るときにすべての変数をゼロにする必要がありますよね?

関数内の変数を、関数が誤動作しないような値や、最も見つけにくいエラーで初期化する。

私は通常、変数の目的に応じて、0か-1のどちらかを使用します。もし、関数内の変数に、見つかった位置のインデックスを格納するのであれば、それを -1 に初期化します。これを0に初期化すると、正しい位置を探し、それがない場合にも、インデックス0の位置を選ぶ ことができます。 -1の場合は、位置が選ばれません。これは、エラーを見つけるのが難しい例の一つで、関数内はすべて正しいように見えるが、出力はまったく間違っている......というものです。で、EAが思った通りのオーダー・ポジションで動かない...。

 

つまり、プログラマはその関数が何のためにあり、どのような操作を行うのかを明確に理解しなければならない。そして、その関数を頭の中から追い出し、その中にあるものを忘れてしまい、「ブラックボックス」として使用しなければならないのだ。

関数が使用するすべての変数は、引数として関数に渡さなければなりません。グローバル変数を 引数として渡さずに使用することは、それが例えばExterns(MTの場合)である場合にのみ正当化されます。関数内でグローバルを変更することは容認できません。戻り値が1つでも欠けている場合は、引数リストで変数を参照渡ししてください。

つまり、もしこの関数を捨てなければならなくなったとしても、この関数内のグローバルはすべて変更されているので、削ぎ落とされたバージョンがなぜ動作しないかを覚えておく必要はないのです。これは、万が一やり直しが発生しても、連鎖反応が起きないようにすることが目的です

 

みなさん、こんにちは。

Pound-Enのテスト。

この注文は、ストップロスよりも早くテイクプロフィットでクローズする必要がありました。

しかし、私の注文はなぜかTake Profitで決済されませんでした。

question: なぜ私の注文は、取引機能で 規定されているように、利益確定で終了しなかったのでしょうか?

モデリング方法 - すべてのティック。

リンク先の例

http://clip2net.com/s/55pdDU

ほとんどの場合、取引は10ピップスストップで終了します。

つまり、価格とストップの間の許容最小距離とはおそらく関係がないように思えるのです。

他に何か理由があるのでしょうか?

ありがとうございます。

 

インジケータからグローバル変数 へのデータ取り込みの支援

を約します。

6.5 ドル

EUR 6.6

GBP 3.3

など

よろしくお願いします。

/*デコンパイルは削除されます。警告*/.

 
FAQ:

つまり、プログラマはその関数が何のためにあり、どのような操作を行うのかを明確に理解しなければならない。そして、その関数を頭の中から追い出し、その中にあるものを忘れてしまい、「ブラックボックス」として使用しなければならないのだ。

関数が使用するすべての変数は、引数として関数に渡さなければなりません。グローバル変数を引数として渡さずに使用することは、それが例えばExterns(MTの場合)である場合にのみ正当化されます。関数内でグローバルを変更することは容認できません。戻り値が1つでも欠けている場合は、引数リストで変数を参照渡ししてください。

つまり、もしこの関数を捨てなければならなくなったとしても、この関数内のグローバルはすべて変更されているので、削ぎ落とされたバージョンがなぜ動作しないかを覚えておく必要はない。これはすべて、もし私がやり直すことになっても、連鎖反応を起こさないようにするためです。


ありがとうございます!そして、アルテムさん、もちろんです。理屈ではわかっていても、経験不足で気づかないことがある、そんな指摘に目を開かされました。

ただ、他にも誤解があるようです。EAにグローバル変数が ある場合、関数内では引数として渡すだけで使えるようにする、と書いてありましたね。

グローバル変数(externsではない)を作る理由はあるのでしょうか...引数で渡さなければならない場合、長い依存関数のチェーンは多くの引数を集め、引数を持つ関数名が非常に長くなってしまいます。

そしてまた、グローバル変数を作り、それを参照で関数に渡して好きなことをし、参照でグローバルに戻すことができますよね?

今日、あなたの投稿を読んで、私はそれを考え始め、いくつかの変数をグローバルから関数に移しました。そして、これらの変数が、私が宣言した関数とは関係のない別の関数で必要であることに気づきました。ここであなたの話を聞けば"グローバルと関数を変えるのはNG "ということは、必要な変数を直接取得する関数を別の場所で呼び出せばいいことが判明したのでしょうか?しかし、それはすでにコードを、いわばいい加減なものにしています。関数は必要なときに必要なだけ呼び出されるようにしたいものです。例えば、全鉱石を検索する機能、買い注文、売り注文などです。1回のティックに1回だけ呼び出され、それ以上は呼び出されないと考えるのが妥当である。しかし、最初に呼び出された場合、順序検索関数が返すこれらの変数を使用するすべての関数が、そのパラメータで渡せるわけではありません。そうすると、やはりグローバル変数に戻るのか、それとも?

 

iHigh(Symbol(),timeframe,shift)のシフト値の上限が 1000に 制限されている問題を解決 する方法を教えてください。

iTime(Symbol(),timeframe,1001)は1970.01.01 00:00を与える。
 
一体どうやってアラートをオフにするのでしょうか? なぜスペースバーを押した後、それは ?(!%"?:) ビープ音を鳴らし続けるのでしょうか?