Почему открываются дополнительные ордера? - страница 2

 
Vladimir Karputov:

Всё приходит, просто Вы ничего не контролируете. Нужно проверять как минимум в два этапа:

  • OrderSend - если вернул true
    • это ещё не гарантия - нужно проверить тикет сделки
      • если тикет не равен нулю (точнее тикет больше нуля) - вот это уже гарантия

Так что, вот так будет правильнее?

  bool res=false;

  for(int i=0;i<3 && !res;i++)
  {
    res=OrderSend(Request,Results);
    if(res)
    {
      if(Results.deal>0)
      {
        if(Results.volume==volume) break;
        else
        {
          Request.volume=volume-Results.volume;
          res=false;
        }
      }
      else res=false;
    }
  }
 

Геннадий!

Вы для какого рынка пишите ФОРТС или ФОРЕКС? 

 
prostotrader:

Геннадий!

Вы для какого рынка пишите ФОРТС или ФОРЕКС? 

И так и так...это общая функция
 
Gennady Mazur:
И так и так...это общая функция
Генадий выложите весь код от начала и до конца, легче будет понять что вы делаете не так.
 
Sergey Gritsay:
Генадий выложите весь код от начала и до конца, легче будет понять что вы делаете не так.

Сергей, начальный код функции закрытия в самом начале поста...
теперь он уже немного модифицировался(с учетом всего вышесказанного), но я его еще не проверял...

bool ClosePosition(string symbol, ulong deviation=10, ENUM_ORDER_TYPE_FILLING filling=ORDER_FILLING_FOK, double volume=0)

{

  PositionSelect(symbol);

  if(volume==0) volume=PositionGetDouble(POSITION_VOLUME);

  ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)PositionGetInteger(POSITION_TYPE);

  MqlTradeRequest Request;

  MqlTradeResult Results;

  ZeroMemory(Request);

  ZeroMemory(Results);

  Request.action=TRADE_ACTION_DEAL;

  if(type==ORDER_TYPE_BUY)

  {

    Request.type=ORDER_TYPE_SELL;

    Request.price=SymbolInfoDouble(symbol,SYMBOL_BID);

  }

  else if(type==ORDER_TYPE_SELL)

  {

    Request.type=ORDER_TYPE_BUY;

    Request.price=SymbolInfoDouble(symbol,SYMBOL_ASK);

  }

  Request.symbol=symbol;

  Request.volume=volume;      

  Request.deviation=deviation; 

  Request.type_filling=filling;

  bool res=false;

  for(int i=0;i<3 && !res;i++)

  {

    res=OrderSend(Request,Results);

    if(res)

    {

      if(Results.deal>0)

      {

        if(Results.volume==volume) break;

        else

        {

          Request.volume-=Results.volume;

          res=false;

        }

      }

      else res=false;

    }

  }

  if(res) return(true);

  return(false);

}

 

Пожалуйста, вставляйте код правильно: Правильно вставляем код на форуме.

Так как код, который вставляете Вы, в виде текста, абсолютно не читаем. 

 
Gennady Mazur:

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

bool ClosePosition(string symbol, ulong deviation=10, ENUM_ORDER_TYPE_FILLING filling=ORDER_FILLING_FOK, double volume=0)

{


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

void PositionClose()
  {
   int total=PositionsTotal();
   for(int i=total-1;i>=0;i--)
     {
      if(!Position.SelectByIndex(i))continue;
      if(Position.Magic()!=Magic)continue;
      if(Position.Symbol()!=_Symbol)continue;
      trade.PositionClose(Position.Identifier());
     }
  }


 

 ...

 
Vladimir Karputov:

Пожалуйста, вставляйте код правильно: Правильно вставляем код на форуме.

Так как код, который вставляете Вы, в виде текста, абсолютно не читаем. 

bool Trade::ClosePosition(string symbol, ulong deviation=10, ENUM_ORDER_TYPE_FILLING filling=ORDER_FILLING_FOK, double volume=0)
{
  PositionSelect(symbol);
  if(volume==0) volume=PositionGetDouble(POSITION_VOLUME);
  ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
  MqlTradeRequest Request;
  MqlTradeResult Results;
  ZeroMemory(Request);
  ZeroMemory(Results);
  Request.action=TRADE_ACTION_DEAL;
  if(type==POSITION_TYPE_BUY)
  {
    Request.type=ORDER_TYPE_SELL;
    Request.price=SymbolInfoDouble(symbol,SYMBOL_BID);
  }
  else if(type==POSITION_TYPE_SELL)
  {
    Request.type=ORDER_TYPE_BUY;
    Request.price=SymbolInfoDouble(symbol,SYMBOL_ASK);
  }
  Request.symbol=symbol;
  Request.volume=volume;      
  Request.deviation=deviation;
  Request.type_filling=filling;
  bool res=false;
  for(int i=0;i<3 && !res;i++)
  {
    res=OrderSend(Request,Results);
    if(res)
    {
      if(Results.deal>0)
      {
        if(Results.volume==volume) break;
        else
        {
          Request.volume-=Results.volume;
          res=false;
        }
      }
      else res=false;
    }
  }
  if(res) return(true);
  return(false);
}
 
Sergey Gritsay:

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

void PositionClose()
  {
   int total=PositionsTotal();
   for(int i=total-1;i>=0;i--)
     {
      if(!Position.SelectByIndex(i))continue;
      if(Position.Magic()!=Magic)continue;
      if(Position.Symbol()!=_Symbol)continue;
      trade.PositionClose(Position.Identifier());
     }
  }


 

 ...

нет, я его вызываю не по несколько раз...а только при наличии сигнала на закрытие и наличии позиции...
код из стандартной библиотеки меня немного не устраивает, особенно при торговле на ФОРТС...
конечно, можно присвоить филлинг исполнение и при инициализации...но мне как то так спокойнее.
 
Gennady Mazur:

Да, теперь будет три попытки:

   bool res=false;
   for(int i=0;i<3 && !res;i++)
     {
      res=OrderSend(Request,Results);
      if(res)
        {
         if(Results.deal>0)
           {
            if(Results.volume==volume) break;
            else
              {
               Request.volume-=Results.volume;
               res=false;
              }
           }
         else res=false;
        }
     }
Хотя эти объёмы.... Явно тут будет косяк (чёрный лебедь).