OrderSendのエラーに関して

 

日足オープン時に価格等の情報取得

15分後にその情報を基にオーダー情報を設定しオーダーした後、

SLとTPもModifiedで設定するという流れをしているんですが、、、


最初の成行オーダー自体にはSL、TPの設定はしていません。

テスター起動時に最初の1日目に関しては処理してほしい時間にオーダーが通り、

希望のSL,TPのModifiedも完了し、その後triggeredで決済されるという動きまではできたのですが、、


どうも次の日からはOrderSend Errorが出ます。

[failed market buy 0.01 GOLD sl:〇〇〇〇 tp:〇〇〇〇 Invalid request]

ということで、なぜかSLTPが前日のSLTPを成行オーダー時にセットしようとしてるんですよね。。。


とりあえずのコードを載せますので、アドバイスいただけますか?

void OnTick()
  {
//---
   if(isNewBar(_Symbol, PERIOD_D1))
     {
      Open = iOpen(_Symbol, PERIOD_D1, 0);
      Close = iClose(_Symbol, PERIOD_D1, 1);
      High = iHigh(_Symbol, PERIOD_D1, 1);
      Low = iLow(_Symbol, PERIOD_D1, 1);

      HL = High - Low;

      P = (Close + High + Low) / 3;
      R1 = P + (P - Low);
      S1 = P - (High - P);
      R2 = P + HL;
      S2 = P - HL;
      R3 = R1 + HL;
      S3 = S1 - HL;

      Sleep(900000);

      MqlTradeRequest request;
      MqlTradeResult result;

      request.action = TRADE_ACTION_DEAL;
      request.symbol = _Symbol;
      request.volume = input_volume;
      request.deviation = 5;
      request.magic = order_magic;
      request.comment = order_comment;
      request.type_filling = ORDER_FILLING_IOC;


      if(Open > P)
        {
         request.type = ORDER_TYPE_SELL;
         request.price = SymbolInfoDouble(_Symbol, SYMBOL_BID);
         Print("本日は売りです。 Open価格【"+DoubleToString(Open,_Digits)+"円】 P価格【"+DoubleToString(P, _Digits)+"円】 利確目標は「"+DoubleToString(Open - P, _Digits)+"」円");
        }
      else
        {
         request.type = ORDER_TYPE_BUY;
         request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
         Print("本日は買いです。 Open価格【"+DoubleToString(Open,_Digits)+"円】 P価格【"+DoubleToString(P, _Digits)+"円】 利確目標は「"+DoubleToString(P - Open, _Digits)+"」円");
        }
      Print("S1価格【"+DoubleToString(S1, _Digits)+"円】 R1価格【"+DoubleToString(R1, _Digits)+"円】");

      if(!OrderSend(request, result))
        {
         PrintFormat("OrderError %d", GetLastError());
        }

      Sleep(500);

      int total = PositionsTotal();

      for(int i = 0; i < total; i++)
        {
         ulong position_ticket = PositionGetTicket(i); //ポジションチケット
         ulong magic = PositionGetInteger(POSITION_MAGIC); //マジックナンバー
         double sl = PositionGetDouble(POSITION_SL); //SL
         double tp = PositionGetDouble(POSITION_TP); //TP
         ENUM_POSITION_TYPE type = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); //ポジションタイプ(注文方向)

         if(magic == order_magic && sl == 0 && tp == 0)
           {
            //SL,TPの設定
            if(type == POSITION_TYPE_BUY)
              {
               sl = NormalizeDouble(S1, _Digits);
               tp = NormalizeDouble(P, _Digits);
              }
            else
              {
               sl = NormalizeDouble(R1, _Digits);
               tp = NormalizeDouble(P, _Digits);
              }

            ZeroMemory(request);
            ZeroMemory(result);

            request.action = TRADE_ACTION_SLTP; //SLTP設定
            request.position = position_ticket;
            request.sl = sl;
            request.tp = tp;
            request.magic = order_magic;
            request.comment = order_comment;

            if(!OrderSend(request, result))
              {
               PrintFormat("Modified Error %d", GetLastError());
              }
           }
        }
     }
  }

よろしくお願いします。

 

factory TALBO:


ということで、なぜかSLTPが前日のSLTPを成行オーダー時にセットしようとしてるんですよね。。。

最初に request.sl と request.tp をリセットすればいいのと違いますか?


ところでこの質問と前の質問はここではなく、下記の所に投稿すべきです。

https://www.mql5.com/ja/forum/ea

MQL5フォーラム: エキスパートアドバイザーと自動取引
MQL5フォーラム: エキスパートアドバイザーと自動取引
  • www.mql5.com
このセクションは自動取引プロセスのために使われるカスタムエキスパートアドバイザーについてのディスカッションを目的としています。
 
Nagisa Unada #:

最初に request.sl と request.tp をリセットすればいいのと違いますか?


ところでこの質問と前の質問はここではなく、下記の所に投稿すべきです。

https://www.mql5.com/ja/forum/ea

すみません、トピックの振り分け気づきませんでした。


MqlTradeRequest = {0};ができなくて、あれと思ってたらMqlTradeRequest = {};だっただけでした。


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