どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 713

 
7Konstantin7:

ありがとうございます。私はできませんが、ただ、誰かがその機能で数行走り書きするか、フクロウを落とすことができると思いました、最終版です。難しいとは思わないが、誰も助けてはくれないと思う。

参加者間で転送することが可能であれば、サイトmql5が与えることができる)4つのクレジットがあります。

1.ループの中で最も早いオープンポジションを 見つけ、そのチケットを返却する?

 
artmedia70:

1.ループの中で最も早いオープンポジションを見つけて、チケットに戻すことができますか?

コード上ではどうなのか想像がつきませんが)、どうにかEAに保留中の注文を削除 する機能を追加することができました、コードは苦手なので、ちょっとだけ。
 
7Konstantin7:
コード上ではどうなるのか想像もつきませんが)奇跡的にEAに保留注文の削除を追加することができました、コードは苦手で少ししかできません。

持っていくだけで、ループで閉じる様子がわかる

1:

int i, total = OrdersTotal(); bool rez;

for(i = total-1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS) && другие нужные условия)
{
if(OrderType() < 2)
rez = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 40);
if(OrderType() > 1)
rez = OrderDelete(OrderTicket());
}
}

2:

//Всё тоже самое только поменяй направление цикла
for(i = 0; i < total; i++)
そうすれば、どのような順番で注文が締め切られるかが分かります。確認したわけではないので何とも言えません。必要ないしかし、これは別の問題で、ここで何度も議論されたことなので、何度も繰り返したくはない。
 
AlexeyVik:

持っていくだけで、ループで閉じる様子がわかる

1:

2:

であれば、どの順番で注文が終了するかがわかります。確認してないので何とも言えません。必要ない。しかし、これは別の話題で、ここで何度も議論されているので、すべてを繰り返すつもりはありません。
この問題は、すでにプライベートでは解決しているのですが...。
 
artmedia70:
もう内輪で解決したんだから...。
まあ、あなたのプライベートは読まないけど...。どうなっているんだろう。
 
AlexeyVik:
まあ、あなたのプライベートメッセージは読まないけど...。と、何が何だかわからなくなる。
ああ、彼は読まないんだ...私のスリッパはどうしたんですか?;)
 
artmedia70:
ああ、彼は読まないんだ...私のスリッパはどこへ行ってしまったのでしょうか!!!!;)

イオアン・ワシリエヴィチが取って、シュパックが取らなかったものを思い出してください......」。だから、私はあなたのスリッパです。


さようなら。もう寝ます。

 
AlexeyVik:

イオアン・ワシリエヴィチがシュパックを取ったもの取らないものをリストアップしていたことを思い出してください......。だから、私はあなたのスリッパです。


さようなら。もう寝ます。

スリッパのこと、他の人に聞いてみようかな...。おやすみなさい...
 
AlexeyVik:

持っていくだけで、ループで閉じる様子がわかる

1:

2:

そうすれば、注文がどのような順番で終了するかが分かります。確認してないので何とも言えない。必要ない。しかし、これは別の問題で、ここで何度も議論されてきたことであり、すべてを繰り返す気はない。

ありがとうございます、すでに問題は解決しました。

artmedia70 です。

ジョンに送られるかと思った)ありがとうございました。

 

皆さんこんにちは!すでに711ページで同じような質問をしましたが、残念ながら誰も回答してくれませんでしたが、もしかしたら今、誰かが...

5桁の 注文でカウンターオーダーをクローズする際の問題に直面しています。つまり、買い注文が20個、売り注文が33個、合計の利益が出た時点で決済する必要があるんだ。そして、関数OrderCloseBy()を使って買い注文20件と売り注文20件を決済し、関数OrderClose()を使って残りの売り注文13件を決済したいのです。

スプレッドが4桁で固定されていれば、スプレッドのクローズに問題はありませんし、関数OrderCloseBy()を使用する際にもスプレッドを保存しています。スプレッドが5桁の場合、スプレッドが浮いているため、総利益に達しても注文が決済されず、OrderCloseBy()関数がログで主張しているのだと思います。同時に、テスターで動かすと、すべて正常に閉まります。

一方向の注文は、利益の合計に達した時点で問題なく決済されます。

このような問題に遭遇した人、そしてそれを解決するための選択肢は何か?

注文をクローズする機能を持たせます。

また、OrderCloseBy()関数は、5桁の注文でも機能するのでしょうか?

  //-----------------------------------------------------------------------
  // функция подсчета открытых ордеров
  //-----------------------------------------------------------------------

  void OrderOpen()
   {
     Orders_BUY=0; Orders_SELL=0;
     for(int a=0; a<=OrdersTotal(); a++)
     {
      if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true && OrderType()==OP_BUY && OrderMagicNumber() == Magic) Orders_BUY=Orders_BUY+1;
      if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true && OrderType()==OP_SELL && OrderMagicNumber() == Magic) Orders_SELL=Orders_SELL+1;

      //if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_BUY) Orders_BUY=Orders_BUY+1;
      //if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_SELL) Orders_SELL=Orders_SELL+1;
      ProfitAll=ProfitAll+OrderProfit()+OrderSwap()+OrderCommission();
     }
   }
  
  //-----------------------------------------------------------------------
  // функция закрытия ордеров сначала разнонаправленных
  //-----------------------------------------------------------------------
  void ClosePos()
   {
   int ticket_1=0, ticket_2=0;
    
     for (int a=0; a<=OrdersTotal(); a++)
       {
         if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true) 
            {
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) // проверка по символу и магику
               {
                if(OrderType() == OP_BUY) ticket_1 = OrderTicket();
                if(OrderType() == OP_SELL) ticket_2= OrderTicket();   
               } 
            }
        }    
      if(ticket_1 != 0 && ticket_2 != 0) {          // если найдены разнонаправленные ордера
      res = OrderCloseBy(ticket_1,ticket_2,clrRed); }   // закроем их
       
      if(ticket_1 == 0 && ticket_2 != 0) {  CloseOrder_by_type(OP_SELL,Symbol());  }
      if(ticket_1 != 0 && ticket_2 == 0) {  CloseOrder_by_type(OP_BUY,Symbol());  }
    
    }

//---- Закрытие ордера по типу и комментарию ----//
void CloseOrder_by_type(int type, string sym)
{
   for(int k= OrdersTotal()-1;k>=0;k--)
   {
    
      if(OrderSelect(k,SELECT_BY_POS,MODE_TRADES)==true)
       {
           
      if(type == OrderType() && sym==OrderSymbol()&& OrderMagicNumber()==Magic)
         if(OrderType()<=1){ res = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),350);}
         else { res = OrderDelete(OrderTicket());}
         if(!res)
               Print("Ошибка закрытия ордера. Код ошибки=",GetLastError());
            else
               Print("ордер успешно закрыт.");   
           
       }
   }
}  
理由: