サイクルオペレーター「for」の質問 - ページ 10

 
WhooDoo22:

アドバイスいただいたコーディング演習の「無効なチケット」エラーを修正しました。私はあなたの個人的な観覧のための専門家アドバイザーのコピーを添付しました。

この演習のOrderClose()関数のセクションは、私は完了したと信じています。

この演習のPrint()関数のセクションは、私は完了すると信じています。

残っているのは3番目のセクション、OrderModify()関数だけだと思います。

ありがとうございました。

あなたは問題を解決していません、あなたはそれを回避しました、これは問題が理解されていないときの典型です。 私はすでに言ったように、症状ではなく原因を解決してください... .

あなたはまだUSDJPYチケット番号を印刷していません、元の要件を確認して ください。

あなたのMarketInfo()呼び出しは、それらが動作する場合でも、間違っている ... ...

 

サイモン

OrderModify()関数が エラーなしで実行されます。

OrderPrint()関数は、エラーなしで実行されます。

OrderClose()関数はエラーなしで実行されます。

回答を投稿してください。

ありがとうございます。

ファイル:
 
WhooDoo22:


回答を投稿してください。


RaptorUK です。

あなたは問題を解決していません、あなたはそれを回避しました、これは問題が理解されていない場合の典型です。 私がすでに言ったように、症状ではなく原因を解決してください ... ...

あなたはまだUSDJPYチケット番号を印刷していません、元の要件を確認してください。

あなたのMarketInfo()コールは、たとえ動作していても間違っています.

そして、さらに ... .

USDJPYの注文がない場合、以前と同じ状況でOrderStopLoss(), OrderTakeProfit(), OrderSelect() and OrderType() の呼び出しが失敗しています。

これは何をするためのものですか? このコードの行に何を期待していますか? そのドキュメントを調べずに答えてください。

GetLastError();

コードの最後のブロックでは、なぜコードのこの行を実行したいのですか?. . .

   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}

only if ... ...

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       

しかし、あなたは、TPやSLに関係なく、常にこのコードの行とそれに続くすべてのコードを実行するのですか?

   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);} 

あなたのMarketInfo()コールはまだ間違っています ... 理由を知るにはドキュメントを見てください。

 

サイモン


問題を修正したのではなく、問題を回避したのです...。

私がまだ修正していない問題は何だと思われますか?


USDJPYのチケット番号がまだ印刷されていないのですが...。

オーダーチケットの番号です。



あなたのMarketInfo()呼び出しは、たとえそれが機能するとしても、間違っています ... ...

MetaEditor辞書 MarketInfo()関数の例。

サンプル

// MarketInfo() function example;

   double bid   =MarketInfo("EURUSD",MODE_BID);
   double ask   =MarketInfo("EURUSD",MODE_ASK);
   double point =MarketInfo("EURUSD",MODE_POINT);
   int    digits=MarketInfo("EURUSD",MODE_DIGITS);
   int    spread=MarketInfo("EURUSD",MODE_SPREAD);

これは、私のOrderClose()関数のコードブロックのサンプルです。

// OrderClose() function code block example;

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
      Print(OrderCloseTime());
      GetLastError();
     }

私のOrderClose()関数のコードサンプルの形式がおかしいと思われる点は何ですか?MetaEditor辞書で提供されている'MarketInfo()'サンプルとほぼ同じに見えますが、どうでしょうか?


また、それに加えて.


これは何をするためのものですか? あなたはこのコードの行に何を期待していますか? それはドキュメントを調べることなくお答えください。

GetLastError();

GetLastError() 関数は、テストの実行中に 'Experts' ページにエラーを出力します。この関数がエラーを発見しなかった場合、ゼロ(0)が表示されます。上に示したスナップショットでは、ゼロが印刷されていることに注目してください。


最後のコードのブロックでは、なぜこの行を実行したいのか .. . .

if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}

only if ... .

if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))

しかし、あなたは、TPやSLに関係なく、常にこのコード行とそれに続くすべてのコードを実行するのですか?

if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}


ええ、あなたがこれを持ち出してくれたのは嬉しいことです。なぜなら、これを行う理由を説明するつもりだからです。

もし他のすべてのコードブロックが複数行コメント "/* - */" を使ってプログラム実行から省略され、Start() と Return(0) 関数の中に残っている2つのコードブロックだけが...。

   int i;
   double bid_ask,
          OM_Param_3,
          OM_Param_4;

// code block 1;   

while(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()!="USDJPY")
   
   i++;

// code block 2;

   if((OrderStopLoss()==0)&&(OrderTakeProfit()==0))
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))   
     {
      Print(OrderTicket());     
      GetLastError();
     }

の下にあるコードブロック2は、関数呼び出しです。

     {
      Print(OrderTicket());     
      GetLastError();
     }

Print()関数は、エキスパートペインに無限に数字を表示し、印刷し続けます。私は、もし私が追加した場合、信じていた...

if((OrderStopLoss()==0)&&(OrderTakeProfit()==0))

なぜなら、この直下のOrderModify()関数が実行されると、SLとTPはもはやゼロではなく、Print()関数を停止させることになるからだ。

今、私は、プログラムの実行方法のために、これはそうではないことを理解しています。プログラムは上から下へ実行されるので、プログラムが最初のサイクルをすべて終了したときに、もう一度上から下へ実行しようとすると、USDJPY 通貨ペアに注文がないため、「エキスパート」ペインへのチケットの印刷に失敗するのだと理解しています。


ありがとうございました。

 
WhooDoo22:

サイモン


あなたは問題を解決していません、あなたはそれを回避しました....

私がまだ修正していない問題とは何ですか?

根本的な問題は、あなたのwhileループのコード化によって引き起こされます......その問題は、OrderClose関数に無効なチケットとOrderModifyに不明なチケット2が 発生する原因でした.あなたはその症状に対処したため、まだ修正されていません。

WhooDoo22 です。

MarketInfo()の呼び出しは、たとえ動作していても間違っている ... ...

MetaEditor辞書 MarketInfo()関数の例。


申し訳ありませんが、私のミス、あなたはその問題を修正している ... ... あなたは、私が言及していた問題が何であったかを知っていますか?

WhooDoo 22です。

サイモン。

これは何をするためのものですか? このコードの行に何を期待していますか? そのドキュメントを調べずに答えてください。

GetLastError() 関数は、テストの実行中に 'Experts' ページにエラーを表示します。この関数がエラーを発見しなかった場合、ゼロ(0)が表示されます。私が上に提供したスナップショットで印刷されたゼロに注目してください。


いいえ、GetLastError()はログにプリントしません。この関数は最後に発生した エラーを返し、 最後に発生したエラーコードが 格納されている特殊な変数 last_error の値がゼロにされます。そのため、次にGetLastError()を呼び出すと、0が返されます。"

画像の0は、おそらく、..

Print(OrderCloseTime());

オーダーはもう選択されていないので、オーダープールにはなく、クローズされているので、ヒストリープールにあるため、エラーになります。あなたがしようとしていることを行うには、次のようなものが必要です。

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      int ClosedTicketNum = OrderTicket();   //  <---- add this line
      
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
      
      OrderSelect(ClosedTicketNum, SELECT_BY_TICKET);   //  <---- add this line

      Print(OrderCloseTime());
      GetLastError();
     }

. .この2行を追加して、試してみてください。

WhooDoo 22です。

Print()関数は、エキスパートペインに無限に数字を表示し、プリントし続けます。私は、もし私が追加した場合、信じていた...

if((OrderStopLoss()==0)&&(OrderTakeProfit()==0))

なぜなら、この直下のOrderModify()関数が実行されると、SLとTPはもはやゼロではなく、Print()関数を停止させる原因になるからです。

今、私は、プログラムの実行方法のために、これはそうではないことを理解しています。プログラムは上から下へ実行されるので、プログラムが最初のサイクルをすべて終了したときに、もう一度上から下へ実行しようとすると、USDJPY通貨ペアの注文がないので、「エキスパート」ペインにチケットを印刷することに失敗するのだと理解しています。

私はあなたが私のポイントを見逃していると思う... ...私はいくつかの中括弧を追加した場合、多分それは明確になるだろう... ...。...あなたはこれをしました... ...

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
      {
      if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
      }

   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
      Print(OrderCloseTime());
      GetLastError();
     }

......あなたはこれを行うことを意味するのですか?

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
      {
      if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
      if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
         {
         OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
         Print(OrderCloseTime());
         GetLastError();
         }
      )
 
WhooDoo22:

Simonです。

USDJPYのチケット番号がまだ印刷されていません。


要件は......「USDJPYのチケット番号= ""という形でログにチケット番号を印刷する」でした。

 

サイモン


根本的な問題は、あなたのwhileループのコード化によって引き起こされます...OrderClose関数の無効なチケットとOrderModifyの不明なチケット2の原因となっていた問題は、あなたが症状に対処した原因では修正されていません。

私はこの問題をそれ自体で細かく議論し、他のポイントに気を取られることなく、問題解決に考えを集中させたいと考えています。


申し訳ありません、私のミスです、あなたはその問題を解決しました ... ... 私が言及していた問題が何であったか知っていますか?

はい、ご指摘ありがとうございます。


"この関数は、最後に発生したエラーを返すと、最後のエラーコードが格納されている特殊な last_error 変数の値がゼロになります。そのため、次にGetLastError()を呼び出すと、0が返されます。"

MetaEditorの辞書にはこうあります。

intGetLastError( )
この関数は、最後に発生した エラーを返すと、最後のエラーコードが格納されている特殊なlast_error 変数の値がゼロになります。そのため、次にGetLastError()を呼び出すと、0が返されます。

この関数は、最後に発生した エラーを返し、次に最後のエラーコードが格納されている特別なラストエラー変数の値がゼロに なります...

緑は理解できる黄色は理解 できない。


. ..この2行を追加して試してみてください。

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      int ClosedTicketNum = OrderTicket();   //  <---- add this line
      
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
      
      OrderSelect(ClosedTicketNum, SELECT_BY_TICKET);   //  <---- add this line

      Print(OrderCloseTime());
      GetLastError();
     }

そうします。


私はあなたが私のポイントを見逃していると思う... ...私はいくつかのブレースを追加した場合、多分それは明確になります... ...。.あなたはこれをした.......

私はこれを行うことを意味すると信じています....

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
      {
      if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
      if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
         {
         OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
         Print(OrderCloseTime());
         GetLastError();
         }
      }

これは、私が条件...を希望したからです。

if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))

は、中括弧("{ }")内のコードのセクションに適用されることを望んだからです。


要件は......「チケット番号をログに "Ticket number for USDJPY = " という形で出力する」でした。

できるようになりました。


ありがとうございます。

 
WhooDoo22:


"この関数は最後に発生したエラーを返し、その後、最後のエラーコードが格納されている特殊な last_error 変数の値はゼロになります。そのため、次にGetLastError()を呼び出すと、0が返されます。"

MetaEditorの辞書にはこうあります。

intGetLastError( )
この関数は、最後に発生した エラーを返すと、最後のエラーコードが格納されている特殊な変数last_error の値がゼロになります。したがって、次にGetLastError()を呼び出すと、0が返されます。

この関数は、最後に発生した エラーを返し、次に最後のエラーコードが格納されている特別なラストエラー変数の値がゼロに なります...

緑が理解でき黄色が理解 できない。

OK、ドキュメントからわかるように、GetLastError()は何も表示しません ... エラー番号を返すだけ です ... 。従って、これを使うには何かする必要があります。.

Print("The last error was error number: ", GetLastError());

//  or . . .

int ErrorNumber = GetLastError();

//  or . . .

if(GetLastError() == 130)

GetLast Error()を呼び出すと、エラーが返され、最後のエラーを保持するために内部で使用していた変数がゼロにクリアされます ... もし、これを実行した場合 ...

OrderDelete(-1);   //  should produce an error 4108 or 3

Print("Last error was number ", GetLastError());    //  should print - Last error was number 4108

Print("Last error was number ", GetLastError());    //  should print - Last error was number 0  the previous call cleared the GetlastError internal variable
 

2回目のGetLastError()の呼び出しは、最初の呼び出しがエラー番号を保持する変数をゼロにしたので、0を返します ... また、最新のエラーのみが保持されることに留意してください。

 
WhooDoo22:


私はあなたが私のポイントを見逃していると思う... ...私はいくつかのブレースを追加した場合、多分それは明確になるだろう... ...。... あなたはこれをやった ...

私はこれをするつもりだったと思います.

これは、私が条件...を望んだからです。

を中括弧("{ }")内のコードのセクションに適用することを望んだからです。

しかし、あなたはそうしなかった ... ... あなたは設計時にそれを見逃し、コーディング時にそれを見逃し、コードを読み、それがあなたの意図したとおりに実行されるかどうかをチェック した時にそれを見逃し、そしてテスト時にそれを見逃した ... ... 。中括弧は、あなたが手の甲のように知っていなければならない基本的な事柄の一つです。

なぜ見逃したのかを理解し、その問題に対処する必要があります ... ... 他の誰も、あなたのためにコードを書くためにお金を払わない限り、あなたのためにそれをすることはできません。

 

サイモン


あなたの画像の0は、おそらく... ..

Print(OrderCloseTime());


なーんてね!(笑)

では、ドキュメントレーンを旅してみましょうか。ハハハ。

datetimeOrderCloseTime( )
現在選択されているオーダーのクローズタイムを返します。注文の終了時刻が0でない場合、選択された注文は終了し、口座の履歴から取得されます。未決済注文と保留中の注文のクローズ時間は0に等しくなります。

注:注文はOrderSelect() 関数で事前に選択されている必要があります。


まず、私が最近コーディングしたOrderClose()関数のコードブロックを見てみましょう...

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
      Print(OrderCloseTime());
     }

次に、「エキスパート」ペインのスナップショットで、表示された結果を覗いてみましょう。

エキスパート」ペインの結果。

ああ、これは何だろう?)


新しく添付された専門家アドバイザーのために応答を投稿してください。それはまだあなたの練習が含まれているすべての基準を満たしていますか?


あなたがコード化した方法によって引き起こされる根本的な問題は、ループをしながら... ...OrderClose関数の無効なチケットとOrderModifyの不明チケット2を引き起こしていた問題は、あなたが症状に対処した原因を修正されていません。

私はこの問題をそれ自体で細かく議論し、他のポイントに気を取られることなく問題解決に考えを集中させたいと考えています。


ありがとうございます。

ファイル: