Как правильно открыть ордер по рынку? - страница 5

 
Gennady Mazur:

Я недавно подымал тему по повторному открытию ордеров. Думал, что проблему решил, т.к. неделю все работало очень четко. Но сегодня столкнулся с аналогичной проблемой только при открытии.
На Финаме открылось очень много ордеров, на Открытие 9...хотя во всех случаях должен был открыться только один ордер.

Вот вырезка кода из советника

    if(OpenOrders<1)
    {
        Coment="Open Sell "+string(OpenOrders+1);
        ret=OpenSellPosition(_Symbol,volume,Coment,Sleeppage,Filling);
    }
    
    
  if(ret)
  {
    OpenOrders++;
    PriceLastOpen=price;
  }

bool OpenSellPosition(string symbol, double volume, string comment="", ulong deviation=10, ENUM_ORDER_TYPE_FILLING filling=ORDER_FILLING_FOK)
{
  MqlTradeRequest Request;
  MqlTradeResult Results;
  ZeroMemory(Request);
  ZeroMemory(Results);
  Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
  Request.action=TRADE_ACTION_DEAL;
  Request.type=ORDER_TYPE_SELL;
  Request.symbol=symbol;
  Request.volume=volume;      
  Request.deviation=deviation;
  Request.comment=comment;  
  Request.type_filling=filling;
  bool res=false;
  res=OrderSend(Request,Results);
  if(res)
  {
    if(Results.deal>0) return(true);
    else return(false);
  }
  return(false);
}

 т.е. из кода видно, что при успешной операции увеличивается переменная OpenOrders, которая изначально равна 0

и если она более 0, то дальнейшего открытия ордера не должно быть, но вся куча ордеров открыта с комментом Ордер1. 

  В функции открытия ордера проверяю наличие положительного ответа и получение тикета ордера, но почему то эта функция возврвщает фалсе, при том что ордер на самом деле установлен.

Объясните что не так, как решить данную проблему? 

Дополнительно можно проверить открытие позиции попыткой её выбрать. И лучше несколько попыток

         int n = 0;
          do
           {
            n++;
           }
          while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
Здесь и задержка, и подтверждение того что позиция уже на месте.

И ещё я обратил внимание на отсутствие проверки OrderCheck(Request, checkResult) а это плохо.
 

Да, и ещё в рыночном ордере - цена = 0

Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID); забудьте про это 

bool SendOrderSyncMode()
  {
   MqlTradeRequest request={0};
   MqlTradeResult  result={0};
   order_ticket=0;
   request.action = TRADE_ACTION_DEAL;
   request.magic  = 9876543211;
   request.symbol = Symbol();
   request.volume = 1;
   request.price  = 0;
   request.type=ORDER_TYPE_BUY;
   request.comment="Sync mode";
   request.type_filling=ORDER_FILLING_FOK;
   request.type_time=ORDER_TIME_DAY;
   if(OrderSend(request,result))
     {
      if((result.retcode==TRADE_RETCODE_DONE) || (result.retcode==TRADE_RETCODE_PLACED))
        {
         if(result.order>0)
           {
            order_ticket=result.order;
            Print(__FUNCTION__," Order sent in sync mode");
            return(true);
           }
         else
           {
            Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
           }
        }
      else
        {
         Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
        }
     }
   else
     {
      Print(__FUNCTION__," Order not sent in sync mode.");
     }
   return(false);
  }
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   switch(trans.type)
     {
      case TRADE_TRANSACTION_HISTORY_ADD:
        if((order_ticket > 0) && (trans.order == order_ticket))
      {
        //Вот здесь и смотрим что произошло
      }
      break;
     }
  }
 
Alexey Viktorov:
Дополнительно можно проверить открытие позиции попыткой её выбрать. И лучше несколько попыток

         int n = 0;
          do
           {
            n++;
           }
          while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
Здесь и задержка, и подтверждение того что позиция уже на месте.

И ещё я обратил внимание на отсутствие проверки OrderCheck(Request, checkResult) а это плохо.

А если позиция уже была?

Или позиция уже есть но ордер залился не полностью? 

 
Alexey Viktorov:
Дополнительно можно проверить открытие позиции попыткой её выбрать. И лучше несколько попыток

         int n = 0;
          do
           {
            n++;
           }
          while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
Здесь и задержка, и подтверждение того что позиция уже на месте.

И ещё я обратил внимание на отсутствие проверки OrderCheck(Request, checkResult) а это плохо.

Ну вполне возможно и вставлю OrderCheck(Request, checkResult)
Спасибо

но такой цикл мне не особенно нравится 

 
prostotrader:

Да, и ещё в рыночном ордере - цена = 0

Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID); забудьте про это 

bool SendOrderSyncMode()
  {
   MqlTradeRequest request={0};
   MqlTradeResult  result={0};
   order_ticket=0;
   request.action = TRADE_ACTION_DEAL;
   request.magic  = 9876543211;
   request.symbol = Symbol();
   request.volume = 1;
   request.price  = 0;
   request.type=ORDER_TYPE_BUY;
   request.comment="Sync mode";
   request.type_filling=ORDER_FILLING_FOK;
   request.type_time=ORDER_TIME_DAY;
   if(OrderSend(request,result))
     {
      if((result.retcode==TRADE_RETCODE_DONE) || (result.retcode==TRADE_RETCODE_PLACED))
        {
         if(result.order>0)
           {
            order_ticket=result.order;
            Print(__FUNCTION__," Order sent in sync mode");
            return(true);
           }
         else
           {
            Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
           }
        }
      else
        {
         Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
        }
     }
   else
     {
      Print(__FUNCTION__," Order not sent in sync mode.");
     }
   return(false);
  }
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   switch(trans.type)
     {
      case TRADE_TRANSACTION_HISTORY_ADD:
        if((order_ticket > 0) && (trans.order == order_ticket))
      {
        //Вот здесь и смотрим что произошло
      }
      break;
     }
  }
Большое спасибо за такое подробное описание...и объяснение...
а на счет цены....да, больше привык к МТ4, а там надо всегда цену ставить...
 
Sergey Chalyshev:

Повторяю

Кроме этого надо еще проверить, статус ордера и появился он уже в истории или нет.

Биржа не работает с позициями, только ордера. 

Серьезно?
 
Gennady Mazur:
Вы были бы правы, если бы я ставил отложки, но я работаю по рынку, и тут тикет получается с помощью Results.deal
Все равно сначала ордер отсылается, потом он исполняется.   
 
Sergey Chalyshev:

Непонял, что значит ваша улыбка? 

Не ожидал от вас такое услышать. Какие паузы, или прикалываетесь? 

Пауза после OrderSend() что бы информация о рынке и история успели обновиться.
 
Sergey Chalyshev:

Плохая наследственнось Форекс.

...

Будьте добры подбирать выражения. А то ведь можно поговорить и о генетической мутации адептов ФООООРТС.
 
Sergey Chalyshev:

А если позиция уже была?

Или позиция уже есть но ордер залился не полностью? 

Ага. А я-то всё о своём, о hedge. Признаю, был не совсем прав. Или совсем не прав. :-)
Причина обращения: