[ARCHIVE!] フォーラムを散らかさないように、どんなルーキーの質問でも。プロフェッショナルは、通り過ぎないでください。あなたなしではどこにも行けない - 4. - ページ 579

 
lottamer:

えっと...オープンオーダーのチェックの条件って、どうしてこう書けなかったんだろう。

if OrdersTotal() > 0

すべてがクリアでわかりやすい...だろう

この条件をどう書けばいいのか、1時間も悩んでしまいました...。


ただし、シンボルに未決済の注文が ある場合は、トリガーされます。
 
rigonich:

ただし、あらゆる商品の未決済または保留の注文がトリガーとなります。


うまくいくといいのですが......ポジションもツールも1つです。

でも、うまくいかないんです!

コードにエラーがあると表示されるのですが。

これに対して

---------------------------

int start()

{

//----

IfOrdersTotal()>0

PlaySound("alert.wav")。

//----

return(0)です。

}

-----------------------------

8つのエラーを出す!!!

 

//---------------------------

int start()

  {

//----

   if (OrdersTotal()>0)

PlaySound ("alert.wav");

//----

  }

 return(0);

 
//-----------------------------

これはどうでしょう?
 
BeerGod:

これはどうでしょう?


絢爛豪華ありがとうございました。

 
Desead:


チャートからロボットを削除するとdeinitが呼ばれるわけですが、この条件は他の方法では追跡できません...おそらく、保留中の残りのロボットをすべて削除する別のスクリプトを書く方が簡単ですが、他に方法はありません。

ところで、もうひとつ思うことがあります。

保留中の注文を削除する問題が解決されたようです。別の関数で「必要な」(削除すべき)注文の量を決め、この関数を呼び出し、条件(Total>0)でwhileし、削除のサイクル for(int i=Total-1;i<=0l; i--)、再び「必要な」と削除試行のカウントを計算して、所定のレベルに達したときにwhileから終了 するようにしています。こうすることで、すべてが削除されます。

カウント終了後、何らかの理由でオーダーが消滅した場合、無限ループに陥る可能性があります。


なぜできないのか?例えば、端末レベルでグローバル変数を 作成し、その値を代入して、この変数の起動と値の変更をservice -->global variablesでチェックしてから電源を切るようにします。
 
BeerGod:

それで?


そして、これで何をしようとしているのか、聞いてもいいでしょうか。

for(int i=0; i<OrdersTotal(); i++)

ブルートフォース方式でオープンポジションを 数えようとしているように見えるが...。

 

ごきげんよう!!!きれいな解答が見つからない。ここでは、典型的な注文 設定を紹介します。しかし、私のロボットにパラメータでゼロを与えると、すなわち、ストップとテイクプロフィットがないと、何も動作しません。

 if(!srabotka){
           OrderSend (Symbol( ), OP_BUY, lot ,NormalizeDouble(Ask, Digits), 5, NormalizeDouble( Ask- (stop*Point),Digits),   NormalizeDouble( Ask+( 45*Point),Digits), NULL, 450, 0, CLR_NONE);
           int Error=GetLastError();if (Error==0){  
           Sleep(2000); RefreshRates(); 
           OrderSend (Symbol( ), OP_SELL,  lot ,NormalizeDouble(Bid, Digits), 5, NormalizeDouble( Bid+ (stop*Point),Digits), NormalizeDouble( Bid-( 45*Point),Digits), NULL, 450, 0, CLR_NONE); 
           Error=GetLastError();
           if (Error==0){  profit = NormalizeDouble( Ask+( 45*Point),Digits); //tsena=Ask; perenos = false;  
           srabotka= true; }}}
           
           if (Error!=0){ string errorcomment = "Ошибка открытия  ордера OP_BUY"  + " " + Symbol() +  " " + ErrorDescript(Error); 
            Print (errorcomment);}
 

ifを設定して、2回目にゼロで注文を入力することもできますが、ちょっと面倒です。

 
lottamer:


ここで、彼らが何をしようとしているのか、聞いてもいいでしょうか?

for(int i=0; i<OrdersTotal(); i++)

オープンポジションを数えようとしているような気がするのですが......。


まあ、指定されたパラメーターで注文を選択するわけですからね。

例)https://www.mql5.com/ru/forum/131859/page3#434221

関数 NumberOfPositions()。

この関数は、現時点でのオープンポジションの数を返します。 より正確なカウントポジションの選択は、外部パラメータで指定します。

  • sy- 市場商品の名前。このパラメータが設定されている場合、この関数は指定された楽器の位置のみを考慮します。初期値」は、あらゆる市場商品を意味する。NULLは 現在の楽器を意味します。
  • op- 貿易業務、ポジションタイプ。有効な値:OP_BUYOP_SELL、または-1。初期値-1 は任意の位置を意味する。
  • mn- 位置の識別子,MagicNumber.デフォルトの値である- 1は、任意の識別子を意味する。
  • //+----------------------------------------------------------------------------+
    //|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
    //+----------------------------------------------------------------------------+
    //|  Версия   : 19.02.2008                                                     |
    //|  Описание : Возвращает количество позиций.                                 |
    //+----------------------------------------------------------------------------+
    //|  Параметры:                                                                |
    //|    sy - наименование инструмента   (""   - любой символ,                   |
    //|                                     NULL - текущий символ)                 |
    //|    op - операция                   (-1   - любая позиция)                  |
    //|    mn - MagicNumber                (-1   - любой магик)                    |
    //+----------------------------------------------------------------------------+
    int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
      int i, k=OrdersTotal(), kp=0;
    
      if (sy=="0") sy=Symbol();
      for (i=0; i<k; i++) {
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
          if (OrderSymbol()==sy || sy=="") {
            if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
              if (op<0 || OrderType()==op) {
                if (mn<0 || OrderMagicNumber()==mn) kp++;
              }
            }
          }
        }
      }
      return(kp);
    }

 
lottamer:


これで何をしようとしているのか、聞いてもいいでしょうか?

for(int i=0; i<OrdersTotal(); i++)

オープンポジションを数えようとしているような気がする...。

...でも、気持ちに負けず、ルールを参考にしてください。この場合、ループは整数変数iを 含むパラメータ(注文の「リスト」内)を試しており、その値は反復するたびに1ずつ増加する。 注文番号が試されているのである。:)))
 
BeerGod:

この方法では、与えられたパラメータに従って注文を選択します。

例)https://www.mql5.com/ru/forum/131859/page3#434221

関数 NumberOfPositions()。

この関数は、現時点でのオープンポジションの数を返します。 カウントするポジションをより正確に選択するには、外部パラメータで指定します。

  • sy- 市場商品の名前。このパラメータが設定されている場合、この関数は指定された楽器の位置のみを考慮します。初期値」は、あらゆる市場商品を意味する。NULLは 現在の楽器を意味します。
  • op- 貿易業務、ポジションタイプ。有効な値:OP_BUYOP_SELL、または-1。初期値-1 は任意の位置を意味する。
  • mn- 位置の識別子,MagicNumber.デフォルト値-1 は、任意の識別子を意味する。


ありがとうございます...そのフォーラムのスレッドをブックマークに追加します。:))