Уже наверное обсуждалось но не нашла. Проблема с реквотой.

 

Прошу прощения я новенькая в mql5. У меня проблема вот какого характера (я пока набрасываю библиотеку для себя):

1. Пишу советника.

2. OnTick заметила что он ругается на invalid stops когда у нас спред больше чем ask-SL для Buy (Это обсуждалось здесь но никто здравого ответа не представил, поэтому этот вопрос освещаю), то есть SL > bid цены получается.

Я не могу разобраться вот с реквотами. Пока суть моего теста проста -  я на 1 баре открываю сделку:

      req.action = TRADE_ACTION_DEAL;
      req.magic = Expert_MagicNumber;
      req.symbol = _Symbol;
      req.volume = value;
      req.price = last_tick.ask;
      req.sl = NormalizeDouble(last_tick.bid-ExtStep,_Digits);
      req.tp = NormalizeDouble(last_tick.ask+ExtTakeProfit+last_tick.ask-last_tick.bid,_Digits); // Спред считаю
      req.deviation = m_slippage;
      req.type = ORDER_TYPE_BUY;
      req.type_filling = ORDER_FILLING_FOK;
      req.type_time = ORDER_TIME_GTC;
      OrderSend(req,req_result);

Пока без проверок, но сделка открывается в тесте  и все ок.

Потом она закрывается по SL и на следующем после проверки баре:

if(PositionSelect(_Symbol)) //Можно не писать, и я знаю про проверку про magicnumber, пока это прототип поэтому этот вопрос опускаем.
     if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY || PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
         return;

я должна открыть сделку в противоположную сторону:

      datetime to_date=TimeCurrent();// по текущий момент
      HistorySelect(from_date,to_date);
      deal_ticket = HistoryDealGetTicket(HistoryDealsTotal()-1);
      HistoryDealGetDouble(deal_ticket,DEAL_PROFIT,profit);
      from_date=to_date;          // с самого начала

      if(profit > 0)
        {
         value= (double)InpLots;
         if(buy)
           {
            need_buy = true;
           }
         else
           {
            need_sell = true;
           }
        }
      else
        {
         value = LotCheck(HistoryDealGetDouble(deal_ticket,DEAL_VOLUME)*2);
         if(buy)
           {
            need_sell = true;
           }
         else
           {
            need_buy = true;
           }
        }
     }
   if(need_buy)
     {
      req.action = TRADE_ACTION_DEAL;
      req.magic = Expert_MagicNumber;
      req.symbol = _Symbol;
      req.volume = value;
      req.price = last_tick.ask;
      req.sl = NormalizeDouble(last_tick.bid-ExtStep,_Digits);
      req.tp = NormalizeDouble(last_tick.ask+ExtTakeProfit+last_tick.ask-last_tick.bid,_Digits);
      req.deviation = m_slippage;
      req.type = ORDER_TYPE_BUY;
      req.type_filling = ORDER_FILLING_FOK;
      req.type_time = ORDER_TIME_GTC;
      OrderSend(req,req_result);
      buy = true;
     }
   if(need_sell)
     {
      req.action = TRADE_ACTION_DEAL;
      req.magic = Expert_MagicNumber;
      req.symbol = _Symbol;
      req.volume = value;
      req.price = last_tick.bid; // <- Ошибка в коде была! Спасибо всем! Вопрос закрыт!
      req.sl = NormalizeDouble(last_tick.ask+ExtStep,_Digits);
      req.tp = NormalizeDouble(last_tick.bid-ExtTakeProfit-last_tick.ask+last_tick.bid,_Digits);
      req.deviation = m_slippage;
      req.type = ORDER_TYPE_SELL;
      req.type_filling = ORDER_FILLING_FOK;
      req.type_time = ORDER_TIME_GTC;
      OrderSend(req,req_result);
      buy= false;
     }

При открытии SELL он говорит requote, почему ? И в тестере он на следующем баре показывает что мы еще в сделке, хотя в логе уже сделка проведена:

2021.03.09 09:56:56.510 2021.03.05 10:00:00   instant buy 0.01 USDRUB at 74.39700 sl: 74.34401 tp: 74.45500 (74.35400 / 74.39700 / 74.35400)
2021.03.09 09:56:56.510 2021.03.05 10:00:00   deal #2 buy 0.01 USDRUB at 74.39700 done (based on order #2)
2021.03.09 09:56:56.510 2021.03.05 10:00:00   deal performed [#2 buy 0.01 USDRUB at 74.39700]
2021.03.09 09:56:56.510 2021.03.05 10:00:00   order performed buy 0.01 at 74.39700 [#2 buy 0.01 USDRUB at 74.39700]
2021.03.09 09:56:56.747 2021.03.05 10:00:29   stop loss triggered #2 buy 0.01 USDRUB 74.39700 sl: 74.34401 tp: 74.45500 [#3 sell 0.01 USDRUB at 74.34401]
2021.03.09 09:56:56.747 2021.03.05 10:00:29   deal #3 sell 0.01 USDRUB at 74.34334 done (based on order #3)
2021.03.09 09:56:56.747 2021.03.05 10:00:29   deal performed [#3 sell 0.01 USDRUB at 74.34334]
2021.03.09 09:56:56.747 2021.03.05 10:00:29   order performed sell 0.01 at 74.34334 [#3 sell 0.01 USDRUB at 74.34401]
2021.03.09 10:00:50.354 2021.03.05 10:00:29   LotsMin=0.01
2021.03.09 10:00:50.354 2021.03.05 10:00:29   LotsMax=1000.0
2021.03.09 10:00:50.354 2021.03.05 10:00:29   volume=0.02
2021.03.09 10:01:15.933 2021.03.05 10:00:29   requote 74.34334 / 74.38634 / 74.34334 (instant sell 0.02 USDRUB at 74.38634 sl: 74.39633 tp: 74.28534)
2021.03.09 10:01:15.933 2021.03.05 10:00:29   requote 74.34334 / 74.38634 (instant sell 0.02 USDRUB at 74.38634 sl: 74.39633 tp: 74.28534)

И еще вопрос, почему у меня сделки начинаются с номера 2 а не с 1 ?

Profit < 0 вроде все написала, объясните пожалуйста. Я вычитала что лучше открывать сделки по стакану, это понятно, но мне бы разобраться с этой проблемой. 

Спасибо заранее. Поиском пользовалась, не помогло. 

ZeroMemory(req); <- тоже не решает проблему.

Build у меня 2822 от 05.03.2021 если это важно. 

Реквота происходит и с демо счетом и в тестере

Я получаю реквоту даже на 1м баре, что может быть неправильного хм... Sell не открывает.

Документация по MQL5: Торговые функции / HistoryDealGetDouble
Документация по MQL5: Торговые функции / HistoryDealGetDouble
  • www.mql5.com
HistoryDealGetDouble - Торговые функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Пожалуйста вставляйте код правильно (при помощи кнопки  Code).
 
Вопрос закрыт спасибо, нашла ошибку в коде!
Причина обращения: