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

 
Aleksey Vyazmikin:

ありがとうございました。探したけど見つからなかった...。

では、次の質問ですが、ステップが25だとすると、25で割り切れる数への丸めをどうアレンジするか、もしかしたら関数があるのでは?

https://www.mql5.com/ru/docs/standardlibrary/tradeclasses/csymbolinfo/csymbolinfonormalizeprice

Документация по MQL5: Стандартная библиотека / Торговые классы / CSymbolInfo / NormalizePrice
Документация по MQL5: Стандартная библиотека / Торговые классы / CSymbolInfo / NormalizePrice
  • www.mql5.com
Стандартная библиотека / Торговые классы / CSymbolInfo / NormalizePrice - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

ありがとうございます。でも、標準のトレード・ライブラリは使っていません。

 
Vladislav Andruschenko:
コードなし、コメントなし。

ええ、それは変ですね。ファイルを添付したが、確認しなかった。私のミスです。今、私はコードとテスターが[Invalid stops]で行を与えるコードの抜粋の両方を添付しています。ポジションを変更する際に、MqlTradeRequestの構造が どのように機能するのか理解したいです。私の場合は、SARのストップを変更したときです。テスターから[Invalid stops]のメッセージが消えないのですが。RTSスプライスツール。

//+------------------------------------------------------------------+
//| Модификация Stop Loss открытой позиции                           |
//+------------------------------------------------------------------+
//--- объявление запроса и результата
   MqlTradeRequest request;
   MqlTradeResult  result;

   int total=PositionsTotal(); // количество открытых позиций  
   Print("total = ",total," ");
//--- перебор всех открытых позиций
   for(int i=0; i<total; i++)
     {
      if(PositionSelect(_Symbol)==true) // есть открытая позиция
        {
         //--- параметры ордера
         ulong  position_ticket=PositionGetTicket(i);// тикет позиции
         string position_symbol=PositionGetString(POSITION_SYMBOL); // символ 
         int    digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); // количество знаков после запятой
         ulong  magic=PositionGetInteger(POSITION_MAGIC); // MagicNumber позиции

         if(PositionSelect(position_symbol)) // если позицию удалось выделить, значит - позиция существует
           {
            //--- обнуление значений запроса и результата
            ZeroMemory(request);
            ZeroMemory(result);
            //--- установка параметров операции
            request.action = TRADE_ACTION_SLTP;   // тип торговой операции
            request.position = position_ticket;   // тикет позиции
            request.symbol = position_symbol;     // символ 
            request.sl= STP;                      // Stop Loss позиции
            request.tp = 0;                       // Take Profit позиции

            //--- отсылаем ордер
            int number=OrderSend(request,result);
            // анализируем код возврата торгового сервера
            if(result.retcode==10009 || result.retcode==10008) //Request is completed or order placed
              {
               Alert("Ордер Sell успешно помещен, тикет ордера # ",result.order," ");
              }
            else
              {
               Alert("Запрос на установку ордера Sell не выполнен - код ошибки:",GetLastError());
               return;
              }
           }
        }
     }
ファイル:
SAR_SAR.mq5  27 kb
 
DCodec:

ええ、それは変ですね。ファイルを添付したが、確認しなかった。私のミスです。今、私はコードとテスターが[Invalid stops]という行を出すコードの抜粋の両方を添付しています。ポジションを変更する際に、MqlTradeRequestの構造が どのように機能するのか理解したいです。私の場合は、SARのストップを変更したときです。テスターから[Invalid stops]のメッセージが消えないのですが。RTSスプライスツール。

これは、一見するとエラーを探すべきコード断片ではありません。同じポジションのトリプルセレクトが気になる程度です。冗長である。

不正確なストップにエラーがある場合、これらのストップが計算される場所から検索を開始する必要があるでしょう。

 
DCodec:

ええ、それは変ですね。ファイルを添付したが、確認しなかった。私のミスです。今、私はコードとテスターが[Invalid stops]で行を与えるコードの抜粋の両方を添付しています。ポジションを変更する際に、MqlTradeRequestの構造が どのように機能するのか理解したいです。私の場合は、SARのストップを変更したときです。テスターから[Invalid stops]のメッセージが消えないのですが。RTSスプライス。

完全な理解のためには、どのような種類のアカウントハッジまたはネッティングがあるのかを特定する必要があります。

アカウントタイプがWasgeの場合

if(PositionSelect(_Symbol)==true) // есть открытая позиция

シンボルの位置を決めたものの、自分が見たかったものとは違うかもしれない......。

ulong  position_ticket=PositionGetTicket(i);// тикет позиции

しかし、今は思い通りのポジションを選ぶことができます。

この関数は、オープンポジションのリスト内のインデックスによってポジションのチケットを返し、このポジションを自動的に選択して、それに対する更なる 作業を行うために、以下を使用します。


次に、正しいポジションを選択するためにもう一度トライします

if(PositionSelect(position_symbol)) // если позицию удалось выделить, значит - позиция существует

ここでも、間違ったポジションを選んでいる確率が非常に高いです

ポジションを独立して表現する場合(ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)、各シンボルに対して複数のポジションを同時にオープンすることができます。この場合、PositionSelectは最小の目盛りを持つ ポジションを選択します。


この場合、OrderSend()関数がどのように動作するかを確認するには、そうするのが良いのですが、そのまま実行して、エラーが消えない場合は、エラーコードだけでなく、ポジションチケット、ポジション価格、新しいストップとテイクの価格もプリントしておくと良いでしょう。これが最低ラインです。

 
Alexey Viktorov:

完全な理解のためには、どのような種類のアカウントハッジまたはネッティングを指定する必要があります。

コメントありがとうございます。アカウントの種類はネッティングです。RTSスプライス。そこが厄介なところでしょうか。1つのシンボルに1つのポジション。どのように選んでも、そのポジションにたどり着くことができるのです。これらは、保留中のオーダー ではないのですね?だから余計にわからなくなるんです。どうしたんですか?すべてのバリエーションを試しました。

 
DCodec:

コメントありがとうございます。アカウントタイプのネッティング。RTS スプライスインスツルメント。そこが厄介なところでしょうか。1つのシンボルに1つのポジション。どのように選んでも、そのポジションにたどり着くことができるのです。これらは、保留中のオーダー ではないのですね?だから余計にわからなくなるんです。どうしたんですか?すべてのバリエーションを試しました。

これに対する答えはないのでしょうか?

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

初心者の方からの質問 MQL5 MT5 MetaTrader 5

アレクセイ・ビクトロフ さん 2017.11.22 09:29

この場合、OrderSend()関数がどのように動作するかは、そのようにして確認する必要がありますが、本来であれば、エラーコードだけでなく、ポジションチケット、ポジション価格、新しいストップとテイクの価格もプリントして おくとよいでしょう。これが最低ラインです。


 
DCodec:

だから余計にわからないんです--WHAT'S WRONG?!!!(何が悪い?すべてのオプションを試した。

この行をエラーの発生する場所に挿入してください。

Print(ToString(request) + ToString(result));

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

mql5言語の特殊性、微妙なニュアンスとトリック

fxsaber さん 2017.02.25 16:27

MqlTrade-structuresの文字列への変換
#define TOSTRING(A)  #A + " = " + (string)(A) + "\n"
#define TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n"

string ToString( const MqlTradeTransaction &Trans )
{
  return(TOSTRING(Trans.deal) + TOSTRING(Trans.order) + TOSTRING(Trans.symbol) +
         TOSTRING2(Trans.type) + TOSTRING2(Trans.order_type) + TOSTRING2(Trans.order_state) +
         TOSTRING2(Trans.deal_type) + TOSTRING2(Trans.time_type) +
         TOSTRING(Trans.time_expiration) + TOSTRING(Trans.price) + TOSTRING(Trans.price_trigger) +
         TOSTRING(Trans.price_sl) + TOSTRING(Trans.price_tp) + TOSTRING(Trans.volume) +
         TOSTRING(Trans.position) + TOSTRING(Trans.position_by));
}

string ToString( const MqlTradeRequest &Request )
{
  return(TOSTRING2(Request.action) + TOSTRING(Request.magic) + TOSTRING(Request.order) +
         TOSTRING(Request.symbol) + TOSTRING(Request.volume) + TOSTRING(Request.price) +
         TOSTRING(Request.stoplimit) + TOSTRING(Request.sl) +  TOSTRING(Request.tp) +
         TOSTRING(Request.deviation) + TOSTRING2(Request.type) + TOSTRING2(Request.type_filling) +
         TOSTRING2(Request.type_time) + TOSTRING(Request.expiration) + TOSTRING(Request.comment) +
         TOSTRING(Request.position) + TOSTRING(Request.position_by));
}

string ToString( const MqlTradeResult &Result )
{
  return(TOSTRING(Result.retcode) + TOSTRING(Result.deal) + TOSTRING(Result.order) +
         TOSTRING(Result.volume) + TOSTRING(Result.price) + TOSTRING(Result.bid) +  
         TOSTRING(Result.ask) + TOSTRING(Result.comment) + TOSTRING(Result.request_id) +  
         TOSTRING(Result.retcode_external));
}

#undef TOSTRING
#undef TOSTRING2

 
fxsaber:

この行をエラーの発生する場所に挿入してください。


貼り付けました。以下はテスターの結果です。

2017.11.22 18:22:51.127 2016.11.09 12:00:00 為替買い 1.00 RTS 98080でスプライス sl: 94130 (98070 / 98080 / 98070)
2017.11.22 18:22:51.127 2016.11.09 12:00:00 取引 #4 買 1.00 RTS Splice at 98080 完了(注文 #4 に基づいています。)
2017.11.22 18:22:51.127 2016.11.09 12:00:00 取引実行 【#4買い1.00 RTSスプライス@98080】の続きです。
2017.11.22 18:22:51.127 2016.11.09 12:00:00 注文実行 98080で買い1.00【#4 98080で買い1.00 RTSスプライス】。
2017.11.22 18:22:53.561 2016.11.09 14:05:00:00 failed modify #4 buy 1.00 RTS Splice sl: 94130, tp: 0 -> sl: 94316, tp: 0 [Invalid stops] (ストップが無効です。
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.action =TRADE_ACTION_SLTP(6)である。
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.magic = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 リクエスト.オーダー = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 リクエスト.シンボル = RTS スプライス
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.volume = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 リクエスト.プライス = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.stoplimit = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.sl = 94316.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.tp = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.deviation = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.type = ORDER_TYPE_BUY (0件)
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.type_filling = ORDER_FILLING_FOK (0件)
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.type_time = ORDER_TIME_GTC (0)です。
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.expiration = 1970.01.01 00:00:00
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.comment=。
2017.11.22 18:22:53.576 2016.11.09 14:05:00 リクエスト.ポジション = 4
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.position_by = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.retcode = 10016
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.deal = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.order = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.volume = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.price = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.bid = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.ask = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.comment = Invalid stops
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.request_id = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.retcode_external = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 アラート:TPとSLのエラーコードによる位置修正エラーです。4756

 
DCodec:

入れてください。テスターの結果はこちらです。

サーバーモードとテスターモード?

理由: