ヘルプEAが取引を終了しない理由

 

ハロー、フレンズ。

私はあなたの助けを必要としています。

あるEAを作ったのですが、そのEAのプロセスの一部が、あるファクションを使ってトレードをクローズしなければなりません。ここに関連するkodの行があります。

なぜEAがトレードをクローズしないのか、どなたか教えていただけませんか?ありがとうございます。

(多分、メイン部分でORDERSELECTを使って いるので、関数でもORDERSELECTを使うことができないのでしょうか?)

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

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if ( OrderSymbol() == Pair && OrderType() == OP_BUY ) )

{

if ( MarketInfo(Pair,MODE_BID) >= Open_P_BUY + MarketInfo(Pair,MODE_POINT)*factor*TP )

{

CLOSE_Single_P(Pair, "LONG", OrderTicket(), OrderLots());

}

}

}

...

...

...

//-----------------------------------------------+

void CLOSE_Single_P(string SYMB, string TREN, int TICKET, double LOTT)

{

int Code, sig;

double PRC;

if ( TREN == "LONG" )

コード = 0;//OP_BUY

さもなくば

if ( TREN == "SHORT" )

コード = 1;//OP_SELL(売り)

for ( int k=0; k < オーダートータル(); k++ )

{

OrderSelect(k, SELECT_BY_POS, MODE_TRADES);

if( OrderSymbol() == SYMB && OrderType() == Code && OrderLots() == LOTT && OrderTicket() == TICKET )

{

if ( オーダータイプ() == OP_BUY )

PRC = MarketInfo(OrderSymbol(),MODE_BID);

さもなくば

if ( OrderType() == OP_SELL ) )

PRC = MarketInfo(OrderSymbol(),MODE_ASK)。

オーダークローズ(TICKET,LOTT,PRC,スリッページ,黄);

ブレーク

}

}

を返します。

}

 

読みやすくするために、SRCボタンを使ってコードを表示させてください :)

OrderSelect() のコードが間違っています。あなたのコードをこれと比較してみてください。 そして、まだ問題があるかどうか、返事を書いてください :)

   for(int cnt=0; cnt<OrdersTotal(); cnt++)
     {
      if (OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES) == true &&
          OrderSymbol()==Pair && 
          OrderType()==OP_BUY)
          {
          // code to close
          }
      }
 
crossy:

ハロー、フレンズ。

私はあなたの助けを必要としています。

あるEAを作ったのですが、そのEAのプロセスの一部が、あるファクションを使ってトレードをクローズしなければなりません。ここに関連するkodの行があります。

なぜEAがトレードをクローズしないのか、どなたか教えていただけませんか?ありがとうございます。

ループがあり、注文を閉じたり削除したりするときは、カウントダウンしなければならず、カウントアップしてはいけません

なぜClose_Single_P関数にループがあるのですか? これは単一の注文を閉じるように設計されていないのですか? 関数を呼び出すときに、シンボル、チケット番号、注文タイプ、ポジションサイズを渡します ... それだけで、注文は閉じられます ... ほぼ、閉じるための価格が必要ですが、それにはOrderClosePrice()を使用すれば、それが買いか売りかを気にする必要はありません ... 実際、関数は取り除き、関数呼び出しに代わるこの行を使ってください ... ... ....

OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Yellow);

ところで、Slippageはどこに設定していますか? また、4/5桁のブローカーを補償していますか?

注文関数を使用するとき、彼らは値を返します ... この戻り値は、関数が動作したかどうかを教えてくれます ... この戻り値を使用することを学ぶと、問題があったことを伝える場合は、ログにリリース情報を報告するプリント文を使用 ... その後、推測ではなく、何が間違っていた知っているだろう ... ... 。

注文をキャンセルしますか?

if ( MarketInfo(Pair,MODE_BID) >= Open_P_BUY + MarketInfo(Pair,MODE_POINT)*factor*TP )

......は本当ですか?

なぜその行が真である場合に実行されるprintステートメントを追加しない . ... その後、あなたはそれがあるかどうか知っているだろう ... ...

if ( MarketInfo(Pair,MODE_BID) >= Open_P_BUY + MarketInfo(Pair,MODE_POINT)*factor*TP )
   {
   Print("Trying to close Order: ", OrderTicket());                             // <---- tells you that the   if  returned true
   if (!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Yellow)
      Print("OrderClose failed, error # ", GetLastError());                          // <------- reports the error if the OrderClose failed . . 
   }
 
onewithzachy:

読みやすくするために、SRCボタンを使ってコードを表示してください :)

GetLastError()のリターンは何ですか?


約4000行のコードですが・・・。

とにかく、エラーメッセージが出ないのです。

 
crossy:


コードは4,000行ほどあるのですが...。

とにかく、私はどんなエラー・マッサージも受けません。

あなたは、あなたのコードのすべてを 投稿する必要はありません。.しかし、あなたが任意の コードを投稿するときにSRC ボタンを使用してください... ...

ログに報告しないので、エラーメッセージが出ません .返り値をチェック し、エラーを報告する必要があります。

 
RaptorUK:

ループがあり、注文の決済や削除(保留)を行う場合、カウントダウンしなければならずカウントアップしては いけません ....

なぜClose_Single_P関数にループがあるのですか? これは単一の注文を閉じるように設計されていないのですか? 関数を呼び出すときに、シンボル、チケット番号、注文タイプ、ポジションサイズを渡します ... それだけで、注文は閉じられます ... ほぼ、閉じるための価格が必要で、それにはOrderClosePrice()を使用し、それが買いか売りかを心配する必要はありません ... 実際、関数がなくなって、関数呼び出しに代わってこの行を使ってください ... ....

..ところで、Slippageをどこに設定していますか? そして、4/5桁のブローカーを補償していますか?

注文関数を使用するとき、彼らは値を返します ... この戻り値は、関数が動作したかどうかを教えてくれます ... この戻り値を使用することを学ぶと、問題があったことを伝える場合は、ログにリリース情報を報告するプリント文を使用 ... その後、推測ではなく、何が間違っていた知っているだろう ... ... 。

注文はキャンセルされるべきでしょうか?

.... が真実であることを確認しましたか?

その行が真である場合に実行されるprint文を追加してはどうでしょうか ... ... そうすれば、それが真であるかどうかがわかります ... ....


Raptorの賢明な提案に感謝します。いつも、賢明で分かりやすく助けてくれます。

今ご提案いただいたことを試してみます。

よろしくお願いします。

 

すでにチケットは選択されているのに、なぜ同じチケットを見つけるために2回目のorderSelectループを通過するのですか?

なぜOrderCloseの戻り値をチェック し、エラーをプリントアウトして原因を探らないのですか?

 
WHRoeder:

すでにチケットは選択されているのに、なぜ同じチケットを見つけるために2回目のorderSelectループを通過するのですか?

なぜOrderCloseの戻り値をチェックせず、エラーをプリントアウトして原因を突き止めようとしないのですか?


お疲れ様でした。

WHRoederのコメントを見るまで、私はいくつかの変更を行いましたが、何も役に立ちませんでした。

あなたは天才です、私はあなたが正しいと思います。

月曜日に 修正したEAを試してみるつもりです。

良い週末をお過ごしください。

 
crossy:


あなたの努力に感謝します。

私はいくつかの変更を行いましたが、WHRoederのコメントを見るまで、何も役に立ちませんでした。

あなたは天才です、私はあなたが正しいと思います。

私は月曜日に修正したEAを試してみるつもりです。

良い週末をお過ごしください。


さて、私の友人たちよ。

あなたの提案をすべて実行しましたが、EAが失敗しました。

他に何かアイデアはありますか?

 

もう一度やろう

  #include "..\libraries\stdlib.mq4" // drag and drop from libraries to very top of your code
  
  for(int cnt = OrdersTotal(); cnt >= 0; cnt--)  // from RaptorUK, count it down to zero 
     {
     if (OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES) == true && OrderSymbol() == Pair) // this is how to write OrderSelect()
        {
        if(OrderType()== OP_BUY) // the code below is to close buy position only
          {
          
          //---
           if(MarketInfo(Pair,MODE_BID) >= Open_P_BUY + MarketInfo(Pair,MODE_POINT) * factor * TP) // from RaptorUK, is this statemement true ?
             {
              //CLOSE_Single_P(Pair,"LONG",OrderTicket(),OrderLots()) // From RaptorUK & WHRoeder, you don't have to do OrderSelect() twice
             Print("Trying to close buy position : ", OrderTicket());                            
             if (!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Yellow)) // From Raptor UK, are you doing the slippage correctly ?
                Print("failed to close buy position ", ErrorDescription(GetLastError())  ); 
             }
             else
             {
             Print ("Not qualify to close buy position ", OrderTicket()); // from RaptorUK, is this statemement true ?, if not this print will tell you
             }
          //---
             
           }
           /*
           else
           {
           if (OrderType() == OP_SELL)
              {
              
              }
           }
           */
        }
     }
      

バレンティーノ・ロッシのMotoGPル・マン2回目の表彰台をまだ読んでいる間に、これを正しく書けるといいのですが... :)

 
onewithzachy:

もう一度やろう

バレンティーノ・ロッシのMotoGPル・マン2位表彰台を読みながら、この文章が正しく書かれていることを祈ります :)


ありがとうonewithzachy。

まず、小さな間違いがあると思います。

for(int cnt = OrdersTotal()-1 ; cnt >= 0; cnt--)

緑色と太字の訂正を追加する必要があります。

しかし、次の行がどのように役立つのか理解できません?

#include "..\libraries ╱dlib.mq4" です。

ありがとうございます、Yです。

理由: