初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 81

 
oldiol: if(!m_Trade.PositionClose(_Symbol,100))//--- 現在のシンボルでポジションをクローズします。結果、立場が逆転!ポジションをクローズするためのヒントを頂ければ幸いです。
プログラムがサーバーに2つの同じリクエストを送るため、立場が逆転している。このプログラムは、先に送信されたリクエストの存在をチェックしない(サーバーでこのリクエストを処理した結果をチェックしない)ため、サーバーに2つの同じリクエストを送信しています。
 
Yedelkin:
プログラムがサーバーに2つの同じリクエストを送るため、立場が逆転している。このプログラムは、先に送られたリクエストをチェックしない(サーバーでこのリクエストを処理した結果をチェックしない)ため、サーバーに2つの同じリクエストを送信しています。
私のコードを正しいものに直してください。
 

Yedelkinは次のように書いている:そのコードは、以前に送信されたリクエストをチェックしない。このチェックはどの関数で行われるのか教えてください。

 
oldiol: 私のコードを正しいものに修正してください。

正しいコードの理解は人それぞれです。だから、最終的には「正しい」コードを書かなければならないのです。そしてもう一つのヒントとして、このコードが正しい方法で動作するかどうか試してみてください(sentRequestフラグの模式的な使用法)。

bool sentRequest=false;  //задать на уровне глобальных переменных программы
...

   if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
     {
      if(!sentRequest)
        {                           
         if(p_close1<buy_stop_level)
           {
            if(!m_Trade.PositionClose(_Symbol,100))
              Print("Метод PositionClose() потерпел неудачу. Код возврата=",m_Trade.ResultRetcode(),". Описание кода: ",m_Trade.ResultRetcodeDescription());
            else
               {
                Print("Метод PositionClose() выполнен успешно. Код возврата=",m_Trade.ResultRetcode()," (",m_Trade.ResultRetcodeDescription(),")");       
                sentRequest=true;
               }
            }  
         }
       else Print("Блок закрытия позиции: имеется POSITION_TYPE_BUY и ранее отосланный запрос на закрытие позиции");        
       }
    else 
      if(sentRequest) sentRequest=false;
 
Yedelkin:

正しいコードの理解は人それぞれです。だから、最終的には「正しい」コードを書かなければならないのです。そしてもう一つのヒントとして、このコードが正しいキーで動作するかどうか試してみてください(sentRequestフラグの模式的な使用法)。

ありがとうございました。試してみると...

 

結果は以下の通りです。このコードはロングポジションを適切にクローズし、ショートポジションをオープンしません...ロングポジションを再決済する際、EAが条件に従って決済しない。EAウィンドウには常にメッセージが表示されています。

このコードをExpert Advisor本体で使用するには、一度しか動作しない場合)どうすればよいのでしょうか?

 

oldiol: При повторном открытии лонга, эксперт не закрывает больше позу по условию. В окне эксперта всё время идут сообщения:    Как же использовать этот код в теле эксперта, если он работает только 1 раз)?

この件に関しては、非常にシンプルであるべきです。回路図のコードでは、オープンポジションが 買いポジションでない場合、sentRequestフラグをゼロに設定する必要があります(コードの最後の行)。オープンポジションが ない場合、またはオープンポジションが 買いポジションでない場合に、このフラグがコード内でゼロに設定されない理由を確認してください。

 

万歳!うまくいった))))if(sentRequest) sentRequest=false; を削除し、ブロックの前に if(PositionsTotal()==0) sentRequest=false; を書きました。

 
oldiol if(sentRequest) sentRequest=false; を削除し、ブロックの前に if(PositionsTotal()==0) sentRequest=false を書きました。
では、メインコードに位置のチェックはなかったのですか?そして、特定のシンボルの位置は、PositionGetSymbol 関数またはPositionSelect 関数を使って選択されることを追加します。
 

oldiol : ロングを再開するとき、EAが条件によってポジションをクローズすることはなくなりました。EAウィンドウに常にメッセージが表示されます。 このコードをEA本体で使用するにはどうしたらよいでしょうか? すみません、私のミスです...コードの中にもう一つ条件があります

if(PositionSelect(_Symbol)==true) //オープンポジションが ある
{.

ポジションクローズブロック

}// ...それゆえ

if(sentRequest) sentRequest=false;// 次の括弧の後ろに配置し、すべてが完璧に動作するようにしました。イェデルキン THANK YOU!

理由: