Закрытие позиции при помощи OrderClose - страница 3

 
Istrrebitel:

 

      // Так я открываю ордера

      ticket3=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"Продаж",Magic,0,Red);
      ticket4=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"Продаж",Magic,0,Red);
      if (ticket3>0 || ticket4>0)
      PlaySound ("WooHoo!.wav");

      // так модифицирую:

      if(ticket3>0)
        {
         if(OrderSelect(ticket3,SELECT_BY_TICKET,MODE_TRADES)==true)
            if(!OrderModify(ticket3,Bid,SL1,TP1,0,clrNONE))
            Print ("Помилка модифікації ордера на продажу!");
        }
      if(ticket4>0)
        {
         if(OrderSelect(ticket4,SELECT_BY_TICKET,MODE_TRADES)==true)
            if(!OrderModify(ticket4,Bid,SL1,TP2,0,clrNONE))
            Print ("Помилка модифікації ордера на продажу!");
        }
     

       // ну и так пытаюсь закрыть:

   if(ticket3>0 && Bid<=MiddleLine)
      {
         if(OrderSelect(ticket3,SELECT_BY_TICKET,MODE_TRADES)==true)
            if(OrderClose(ticket3,Lots,Bid,Slippage,clrBisque)==true)
            PlaySound ("CoinsDrop2.wav");
      }
   if(ticket4>0 && Bid<=LowLine)
      {
         if(OrderSelect(ticket4,SELECT_BY_TICKET,MODE_TRADES)==true)
            if(OrderClose(ticket4,Lots,Bid,Slippage,clrBisque)==true)
            PlaySound ("CoinsDrop2.wav");
      }      


 Но ОНО не хочет работать на реале (вернее закрываются не все ордера)

Помогите пожалуйста, если еще нужна инфа просто скажите что именно...

Да вот полностью советник:

Абсолютно неверный код. От слова совсем. Видно полное непонимание того, что пытаетесь сделать и делаете.

При выборе ордера по тикету pool не имеет никакого значения - он игнорируется - т.е.,MODE_TRADES в функции выбора ордера по тикету вообще не нужен. Чтобы понять из какого списка выбран ордер при его выборе по тикету, нужно проверить время закрытия выбранного ордера и, если оно равно нулю, значит ордер ещё открыт и выбран из списка открытых позиций. Если время закрытия ордера не равно нулю, то это означает, что ордер уже закрыт, и был выбран из списка закрытых позиций.

Выбор ордера по тикету в вашем случае совсем не нужен - ведь тикет вы можете заранее не знать. Соответственно, ордер нужно выбирать по индексу. Далее проверять его магик, его тип и, если подходят, то закрывать.

Позиция Sell закрывается по цене Ask, позиция Buy - по цене Bid. А вы по какой цене их зарывать пытаетесь?

 
Artyom Trishkin:

Абсолютно неверный код. От слова совсем. Видно полное непонимание того, что пытаетесь сделать и делаете.

При выборе ордера по тикету pool не имеет никакого значения - он игнорируется - т.е.,MODE_TRADES в функции выбора ордера по тикету вообще не нужен. Чтобы понять из какого списка выбран ордер при его выборе по тикету, нужно проверить время закрытия выбранного ордера и, если оно равно нулю, значит ордер ещё открыт и выбран из списка открытых позиций. Если время закрытия ордера не равно нулю, то это означает, что ордер уже закрыт, и был выбран из списка закрытых позиций.

Выбор ордера по тикету в вашем случае совсем не нужен - ведь тикет вы можете заранее не знать. Соответственно, ордер нужно выбирать по индексу. Далее проверять его магик, его тип и, если подходят, то закрывать.

Позиция Sell закрывается по цене Ask, позиция Buy - по цене Bid. А вы по какой цене их зарывать пытаетесь?

Спасибо за критику, все подправил и теперь прекрасно работает. Насчет полного непонимания... ну это Вы перегибаете... И с ценами закрытия что-то у Вас не то...
 
Istrrebitel:
Спасибо за критику, все подправил и теперь прекрасно работает. Насчет полного непонимания... ну это Вы перегибаете... И с ценами закрытия что-то у Вас не то...

Правда?

Позиция Buy открывается по цене Ask, закрывается по цене Bid

Позиция Sell открывается по цене Bid, закрывается по цене Ask

И никак иначе.

Вы же позицию Sell пытаетесь закрыть по цене Bid:

Открытие:

ticket3=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"Продаж",Magic,0,Red);
ticket4=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"Продаж",Magic,0,Red);

Закрытие (обе позиции имеют тип Sell):

if(OrderClose(ticket3,Lots,Bid,Slippage,clrBisque)==true)
            PlaySound ("CoinsDrop2.wav");
      }
   if(ticket4>0 && Bid<=LowLine)
      {
         if(OrderSelect(ticket4,SELECT_BY_TICKET,MODE_TRADES)==true)
            if(OrderClose(ticket4,Lots,Bid,Slippage,clrBisque)==true)
 
Artyom Trishkin:

Правда?

Позиция Buy открывается по цене Ask, закрывается по цене Bid

Позиция Sell открывается по цене Bid, закрывается по цене Ask

И никак иначе.

Вы же позицию Sell пытаетесь закрыть по цене Bid:

Открытие:

Закрытие (обе позиции имеют тип Sell):

Ладно, убедил)))
 
Istrrebitel:
Ладно, убедил)))
Я вас не пытался убеждать. Я вам ответил на ваше заявление, что я что-то напутал с ценами.
 
Artyom Trishkin:

Правда?

Позиция Buy открывается по цене Ask, закрывается по цене Bid

Позиция Sell открывается по цене Bid, закрывается по цене Ask

И никак иначе.


А ведь точно, что и логично.   А я чего-то напутал думал раз sell открывается по биду, то и закрывать нужно.  Давно не работал с функцией OrderClose!

 
Евгений:


А ведь точно, что и логично.   А я чего-то напутал думал раз sell открывается по биду, то и закрывать нужно.  Давно не работал с функцией OrderClose!

и еще вопрос... если в OrderClose использовать Ask для sell то и в условии нужно тоже Ask ставить?  например if (Ask > "чего-то") или это уже по своему усмотрению
 

Подскажите пожалуйста что здесь не так:

bool CloseOrder1()
   {
    for(int i=OrdersTotal()-1; i>=0; i--)
      {
        if(!OrderSelect(i,SELECT_BY_POS))
          {
           Print ("Відсутні ордери");
          }
        if(OrderSymbol() != Symbol()) continue;
        if(OrderMagicNumber() != Magic1) continue;
        if(OrderType() == OP_BUY)
          {
           if(OrderClose(OrderTicket(),Lots,Bid,Slippage,clrAqua))
            PlaySound ("CoinsDrop2.wav");
          }
      }
      return (true);
   }

звук почему-то не воспроизводится...

 
Istrrebitel:

Подскажите пожалуйста что здесь не так:


звук почему-то не воспроизводится...

А ордер закрывается? Тогда звуковой файл не тот, или нет его, или не там.
 
Vitalie Postolache:
А ордер закрывается? Тогда звуковой файл не тот, или нет его, или не там.
Блин!)) Нашел ошибку: CoinsDrop2.wav так прописано в сове а в папке Sounds с пробелом перед точкой  - CoinsDrop2 .wav)))))) извиняюсь, не досмотрел...
Причина обращения: