たんもん

 

皆様へご挨拶です。成行注文を決済するコードを(他のコードを改造して)作りました。



int l_pos_44 = 0;

if (CheckFirstOP(OP_BUY)>1)の場合{。

for (l_pos_44 = 0; l_pos_44 < OrdersTotal(); l_pos_44++) {。

OrderSelect(l_pos_44, SELECT_BY_POS, MODE_TRADES);

if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber || OrderType() != OP_BUY) continue;

double Price = OrderOpenPrice();

if (NormalizeDouble(MathAbs(Bid - Price), Digits) < NormalizeDouble(Dist, Digits)) { { (NormalizeDouble(Bid - Price), Digits) < NormalizeDouble(Dist, Digits))

Dist = MathAbs(Bid - Price);

int Ticket = OrderTicket();

double Lot = OrderLots();

OrderClose(Ticket, Lot, Bid, 3);

}

}


(売りポジションを閉じるための同じコード(明らかにOP_BUYの代わりにOP_SELL変数を使用))


int CheckFirstOP(int a_cmd_0) { { { { { int l_count_4

int l_count_4 = 0;

for (int l_pos_8 = 0; l_pos_8 < OrdersTotal(); l_pos_8++) { { (int l_pos_8 = 0; l_pos_8 < OrdersTotal(); l_pos_8++ )

if (オーダーセレクト(l_pos_8, SELECT_BY_POS)) { { {.

if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol()) { { { (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol())

if (OrderType() == a_cmd_0){

l_count_4++;

ブレーク

}

}

}

}

return (l_count_4);

}


1つ以上のポジションがオープンされている場合、ロングまたはショートのポジションをクローズするコードが必要です...合計2つのポジション(1つの買いと1つの売り)を保持するために...私は、最新のオープンポジション、すなわちこの場合、買いポジションのオープン価格が高いものと売りポジションのオープン価格が低いものを保持する必要もあります。問題は、このコードがポジションをクローズしていないことです。


when: "if (CheckFirstOP(OP_BUY) == 1)" then the code is closes the first positions imidiately after they are opened...i.e. after a buy and asell order are opened they are closed with the next tick.このコードは、最初のポジションが開かれた直後に閉じられます。そして、「if (CheckFirstOP(OP_BUY) > 1)"」では、どのポジションもクローズされることはありません。何が間違っているのかわかりません。

どなたか教えてください。

 

I forgot:


double Dist = 1000000.0;

 
Aljohin:

どなたか助けてください。

1.これはコードの一部ですが、例えば関数CheckFirstOP()を見せてください。

2.forループはインクリメントしています。ループの中で注文を閉じると正常に動作しませんので、→https://www.mql5.com/en/forum/119840 をご覧ください。

3.3. 変数の命名規則が...あまりよくありません。

4.4. フォーマットを保持するために、SRCボタンを使用してコードを投稿してください。このようなコードを読むのは非常に困難です。

 
gordon:

1.これはコードの一部です。例えば関数CheckFirstOP()を見せてください。

2.forループがインクリメントしている。ループ内で注文を閉じる場合、正しく動作しませんので、→https://www.mql5.com/en/forum/119840 をご覧ください。

3.3. 変数の命名規則が...あまりよくありません。

4.4. フォーマットを保持するために、SRCボタンを使用してコードを投稿してください。このようなコードを読むのは非常に困難です。


double Dist=1000000.0;
if ( CheckFirstOP(OP_BUY) > 1) {
      for ( l_pos_44 = 0; l_pos_44 < OrdersTotal(); l_pos_44++) {
          OrderSelect( l_pos_44, SELECT_BY_POS, MODE_TRADES);
          if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber || OrderType() != OP_BUY) continue;     
          double Price = OrderOpenPrice();
          if (NormalizeDouble(MathAbs(Bid - Price), Digits) > NormalizeDouble( Dist, Digits)) {              
             Dist = MathAbs(Bid - Price);                 
             int Ticket = OrderTicket();           
             double Lot = OrderLots();                          
             OrderClose( Ticket, Lot, OrderClosePrice(), 3); 
         }    
      }   
   }

int CheckFirstOP(int a_cmd_0) {
   int l_count_4 = 0;
   for (int l_pos_8 = 0; l_pos_8 < OrdersTotal(); l_pos_8++) {
      if (OrderSelect( l_pos_8, SELECT_BY_POS)) {
         if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol()) {
            if (OrderType() == a_cmd_0) {
               l_count_4++;
               break;
            }
         }
      }
   }
   return ( l_count_4);
}
my fault...i'm very new to this stuf...
 
gordon:

3.変数の命名規則が...あまり良くないですね。

デコンパイラの命名規則みたいだ.

"彼はこの種のものに慣れていない"

 
meikel:

デコンパイラの命名規則みたいです。

"彼はこの種のものに慣れていない"

私は買ったEAを改造したいのですが、そのコードも送られてきました(手違いだそうです)。

 
Ais:

こんにちは

選択された注文は、次の式で完全に閉じることができます: "OrderClose(OrderTicket (),OrderLots (),OrderClosePrice (), 0 );"

よろしくお願いします。

は私の問題を解決していません...

 
gordon:

2.forループがインクリメントしている。ループの中で注文をクローズするとうまくいきませんので、→https://www.mql5.com/en/forum/119840。

なぜインクリメントが効かないのか、MQL4の本には書いていない(と思う)のですが・・・とりあえずやってみました。


if ( CheckFirstOP(OP_BUY) > 1) {
      for(int i = OrdersTotal() - 1; i >= 0; i--) {
          OrderSelect( i, SELECT_BY_POS, MODE_TRADES);
          if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber || OrderType() != OP_BUY) continue;     
          double Price = OrderOpenPrice();
          if (NormalizeDouble(MathAbs(Bid - Price), Digits) > NormalizeDouble( Dist, Digits)) {              
             Dist = MathAbs(Bid - Price);                 
             int Ticket = OrderTicket();           
             double Lot = OrderLots();                          
             OrderClose( Ticket, Lot, OrderClosePrice(), 3); 
         }    
      }   
   }
it doesn't work, don't know why
 
Ais:

今すぐこの行を確認してください

もちろん、試してみましたが、何も変わりません...このプログラムには不思議なことがあります :) 単純なクロージングオーダーを書くのは難しくないでしょう...

 
it doesn't work, don't know why
注文インデックス5をクローズすると、注文インデックス6はインデックス5となり、7は6となる、など。 数え上げると、他のすべての未決済注文が欠落していることになります。
 
WHRoeder:
注文指数5を決済すると、注文指数6が指数5、7が6になります。カウントアップすると、他のすべてのオープンオーダーを見逃すことになります。

ああ、わかりました...とにかく、コードは1つのオープンオーダーだけを維持し、2つのオーダーが開かれたときに即座に動き始め、それらすべて(つまり2つのオーダー)を選択し分析した後にそれらのうちの1つをクローズします...従って、私はそれがオーダー選択における 大きな間違いであるとは思いません...インクリメント...とにかく、私はどんな結果も減少する方法を試してみました...多分私は間違った方法で試しています...わからない...誰か私のコードを試して、それが本当に取引を閉じるかどうか見ることができますか...または誰かが前に開いた順序(すなわち、買いのために高いオープンプライスと低いオープンプライスのもの)を選択して閉じるための簡単なコードを書くことができますか?

ありがとうございます。