Мой эксперт выполняет двойную запись - страница 3

 
doshur:
Омг. Значит, сон не помогает?

Что мы можем сделать, чтобы избежать этого?

Мне это помогло. Я использовал совет snelle_modas плюс сон. Это сработало.

Но с тех пор я изменил способ открытия сделок. Теперь мне не нужно ни одно из этих решений. Вот что я написал вчера angevoyageur. Надеюсь, это поможет:

Привет,

Ну, в прошлый раз я решил эту проблему, используя функцию сна после торговли. Но с моим новым ботом это больше не нужно. Возможно, это потому, что открытие сделки теперь обрабатывается по-другому. Первый бот, с которым у меня была такая проблема (возможно, у других советников тоже был такой способ открытия сделки и поэтому тоже была проблема (например, metaquant)), использовал этот метод:

void SetOrder(ENUM_ORDER_TYPE type, double lot)
{
   int ticket = -1;
   ResetLastError();
   double price = 0;
   double ask, bid;
   ask = SymbolInfoDouble(Symbol(), SYMBOL_ASK);
   bid = SymbolInfoDouble(Symbol(), SYMBOL_BID);
   if (maxSpread != 0 && NormalizeDouble(ask - bid, _Digits) >= NormalizeDouble(maxSpread * point, _Digits)) return; 
   if (type == ORDER_TYPE_BUY) price = ask;
   if (type == ORDER_TYPE_SELL) price = bid;
   trade.PositionOpen(Symbol(), type, lot, price, 0, 0, "");
   Sleep(1000);
   int err = GetLastError();
   if (err > 0) Print(ErrorDescription(err));
}


Теперь я открываю ордера так, как я узнал из документации, и у меня больше нет этой проблемы:

void open_sell(double xlot, int xTP)
{
         MqlTradeRequest mrequest;
         MqlTick latest_price;      
         MqlTradeResult mresult;   
            if(!SymbolInfoTick(Symbol(),latest_price))
              {
               Alert("Error getting the latest price quote - error:",GetLastError(),"!!");
               return;
              }
         ZeroMemory(mrequest);
         mrequest.action=TRADE_ACTION_DEAL;                                // immediate order execution
         mrequest.price = NormalizeDouble(latest_price.bid,Digits());           // latest Bid price
         if (StopLoss!=0) mrequest.sl = NormalizeDouble(latest_price.bid + StopLoss*point,Digits()); // Stop Loss
         if (xTP!=0) mrequest.tp = NormalizeDouble(latest_price.bid - xTP*point,Digits()); // Take Profit
         mrequest.symbol = Symbol();                                          // currency pair
         mrequest.volume = xlot;                                              // number of lots to trade
         mrequest.magic = EA_Magic;                                          // Order Magic Number
         mrequest.type= ORDER_TYPE_SELL;                                     // Sell Order
         mrequest.type_filling = ORDER_FILLING_FOK;                          // Order execution type
         mrequest.deviation=100;                                             // Deviation from current price
         //--- send order
         OrderSend(mrequest,mresult);
         // get the result code
         if(mresult.retcode==10009 || mresult.retcode==10008) //Request is completed or order placed
           {
          // Print("A Sell order has been successfully placed with Ticket#:",mresult.order,"!!");
           }
         else
           {
            Print("The Sell order request could not be completed -error:",GetLastError());
            ResetLastError();
            return;
           }
}


Может это поможет. Я вижу, что doshur использует аналогичный способ открытия сделок, как и я, когда это вызывало такое поведение.

С уважением
 
Значит, есть проблема с классом ctrade?

Может ли кто-нибудь подтвердить это, прежде чем я изменю свой код?
 
doshur:
Значит, есть проблема с классом ctrade?

Может ли кто-нибудь подтвердить это, прежде чем я изменю свой код?

Я могу сказать, что у меня больше нет этой проблемы после удаления ctrade class.

Возможно, вы захотите создать вторую версию советника, которая использует "старомодный" способ открытия сделки, и посмотреть, поможет ли это.


С другой стороны, функция sleep тоже решила проблему для меня.

Documentation on MQL5: Common Functions / Sleep
Documentation on MQL5: Common Functions / Sleep
  • www.mql5.com
Common Functions / Sleep - Documentation on MQL5
 
doshur:
Значит, есть проблема с классом ctrade?

Может ли кто-нибудь подтвердить это, прежде чем я изменю свой код?
Пожалуйста, будьте терпеливы, я отвечу вам как можно скорее. Я постараюсь воспроизвести проблему, когда рынок будет открыт.
 
Я не знаю, играет ли брокер здесь разную роль, но похоже, что наш брокер один и тот же. Альпари.

Пожалуйста, удалите имя брокера, если это необходимо.
 
Klammeraffe:

Могу только сказать, что после удаления класса ctrade у меня больше нет этой проблемы.

Возможно, вы захотите создать вторую версию советника, которая использует "старомодный" способ открытия сделки, и посмотреть, поможет ли это.


С другой стороны, функция sleep тоже решила проблему для меня.

Это интересный момент.

Я использую класс ctrade для настройки значения стоплосса.

      
My_Trade.PositionModify(Symbol(), 
                        NormalizeDouble(dPositionStoploss,   Digits()), 
                        NormalizeDouble(dPositionTakeProfit, Digits())
                        ); 


Само открытие позиции происходит по старинке.

mrequest.action         = TRADE_ACTION_DEAL;                            // immediate order execution stoploss en takeprofit worden aangepast mrequest.price          = NormalizeDouble(Latest_Price.ask, Digits());  // latest ask price mrequest.symbol         = Symbol();                                     // currency pair mrequest.volume         = dTradePosition_Size;                          // number of lots to trade mrequest.magic          = EA_Magic_Number;                              // Order Magic Number mrequest.type           = ORDER_TYPE_BUY;                               // Buy Order mrequest.type_filling   = ORDER_FILLING_RETURN;                         // Order execution type mrequest.deviation      = 1000;                                         // Max prijs afwijking                                                                                                        OrderSend(mrequest,mresult); //--- send order

Возможно ли, что класс ctrade отправляет новый двойной ордер, когда я корректирую стоплосс-ордер? Это кажется странным.

 
Klammeraffe:

Я могу сказать, что у меня больше нет этой проблемы после удаления класса ctrade.

Возможно, вы захотите создать вторую версию советника, которая использует "старый" способ открытия сделки, и посмотреть, поможет ли это.


С другой стороны, функция sleep тоже решила проблему для меня.

Если вы посмотрите на класс ctrade. Есть ли разница между использованием этого класса и способом mqltraderequest?
 
snelle_moda:

Это хорошая мысль. Может быть, мне следует использовать только изменение цены BID?

BAR на графике также основан на цене BID?


Для триггерного сигнала моего эксперта меня интересует только изменение цены, на которой основан 1-минутный BAR.

Snelle_moda Вы все еще получаете двойную запись, используя mqltraderequest для отправки ордера?
Documentation on MQL5: Standard Constants, Enumerations and Structures / Data Structures / Trade Request Structure
Documentation on MQL5: Standard Constants, Enumerations and Structures / Data Structures / Trade Request Structure
  • www.mql5.com
Standard Constants, Enumerations and Structures / Data Structures / Trade Request Structure - Documentation on MQL5
 

могу ли я спросить, PositionSelect() проверяет клиентскую сторону или сторону сервера?

У меня есть сильное ощущение, что проблема вызвана задержкой, когда сервер (сторона брокера) обрабатывает запрос и не обновляет клиентскую сторону, поэтому PositionSelect() запускается снова.

Я действительно чувствую, что нет никакой разницы, когда мы используем cTrade против MqlTradeRequest, и функция Sleep должна помочь задержать все, чтобы наша клиентская сторона была "обновлена", прежде чем PositionSelect() будет запущен снова, вызывая двойную запись. Проверяю на вкладке журнала, >2013.12.20 08:35:00 Trades '800****': exchange buy 0.01 EURUSD at market placed for execution in 313 ms <

если ставить сон более 400, это должно быть безопасно?

Что вы думаете?

Documentation on MQL5: Standard Constants, Enumerations and Structures / Data Structures / Trade Request Structure
Documentation on MQL5: Standard Constants, Enumerations and Structures / Data Structures / Trade Request Structure
  • www.mql5.com
Standard Constants, Enumerations and Structures / Data Structures / Trade Request Structure - Documentation on MQL5
 
doshur:
Snelle_moda Вы все еще получаете двойную запись при использовании mqltraderequest для отправки ордера?


У меня была еще одна двойная запись с 03-10-2013. Я использую оба метода для отправки ордера. См. мое предыдущее сообщение.

Причина обращения: