Помощь: Почему советник не закрывает сделку - страница 5

 
crossy:

O.K. Вот модифицированная версия, в которой я получил ту же ошибку.

Y.

Функция вообще не нужна ... ... ... избавьтесь от нее.

 

Давай сделаем это снова, часть 2 :(

 ...
   for(int cnt = OrdersTotal()-1; cnt >= 0 ; cnt--) 
   {
      CodeY = false;
      if ( OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) )
      {
         // Do the selection and OrderClose() INSIDE HERE ..., please
         
         
         /*
         CodeY    = true;
         OrderS   = OrderSymbol();
         OrderT   = OrderTicket();
         OrderM   = OrderMagicNumber();
         OrderTyp = OrderType();
         OrderL   = OrderLots();
         */
      }   
      //if ( CodeY && OrderS == Pair1 && OrderTyp == OP_BUY && OrderM == MAG &&.... ) // this selection goes up there
    
         //CLOSE_Single_P(Pair1,"LONG",OrderT,OrderL);

//-----------------------------------------------+
/*
void CLOSE_Single_P(string SYMB, string TREN, int TICKET, double LOTT)
{
   double PRC;
   bool Check = false;

   for ( int cntt=0; cntt<20000; cntt++ )
   {
      if ( Check )
      {
         Check_Ini();
         return;
      }
      Check = false;
      if ( TREN == "LONG" )
         PRC = MarketInfo(SYMB,MODE_BID);
      else
      if ( TREN == "SHORT" )
         PRC = MarketInfo(SYMB,MODE_ASK);
         
      Check = OrderClose(TICKET,LOTT,PRC,Slippage,Yellow); // close it up there, and you have to rewrite the parameters
   }
   */
 

Сделайте это... ( повторяется отсюда: https://www.mql5.com/en/forum/139543 )

if ( CodeY && OrderS == Pair1 && OrderTyp == OP_BUY && OrderM == MAG &&.... )
   {
   Print("Trying to close Order: ", OrderTicket());                             // <---- tells you that the   if  returned true
   if ( ! OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Yellow)
      Print("OrderClose failed, error # ", GetLastError());                          // <------- reports the error if the OrderClose failed . . 
   } 

... и Функция вам вообще не понадобится.

 
onewithzachy:

Давайте сделаем это снова, часть 2 :(


Мне нужна ваша поддержка, пожалуйста, так как у меня отпуск, и я вернусь в воскресенье в пятницу.

Я сделаю то, что вы посоветовали, и надеюсь на успех.

Спасибо вам обоим.

Y.

 
crossy:


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


Хорошо, приятного отдыха :-)
 
crossy:


Мне нужна ваша помощь, пожалуйста, так как у меня отпуск, и я вернусь в воскресенье.

Я сделаю то, что вы посоветовали, и надеюсь на успех.

Спасибо вам обоим.

Y.

Приятно провести время :D

В это воскресенье я буду смотреть F1 Монако :D

 
onewithzachy:

Хорошо провести время :D

У меня есть F1 Монако, чтобы посмотреть в это воскресенье :D

А завтра FP3 и квалификация ;-)
 
crossy:


Спасибо, onewithzachy,

Во-первых, я думаю, что у вас есть небольшая ошибка:

for(int cnt = OrdersTotal() -1 ; cnt >= 0; cnt--)

Вы должны добавить зеленую и жирную коррекцию.

Но я не понимаю, как следующая строка может нам помочь?

#include "..\libraries\stdlib.mq4"

Спасибо, Y.

Я нахожу это намного проще, и это работает для меня:

//---------------------------------------------+

void CheckForClose()
{
int i, res, order_id;

//-------+
for(i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
order_id= OrderTicket();


//--перемещение и закрытие
if (OrderType() == OP_BUY)
{
if (Is_Close_Buy==true) //--сигнал к закрытию
{
RefreshRates();//обновление ставок
res= 0;
res= OrderClose(order_id,Lots,Bid,3,Gold);
while(IsTradeAllowed() == false) Sleep(100); //---подождите немного, чтобы получить ответ от сервера
if (res>0){
PlaySound("cash_register.wav");} //--счастливый звук, надеемся заработать деньги !!!!
if (res<0)
{
PlaySound("creak.wav");
Print("OrderSend failed with error #",GetLastError());
return(0);
}
return;
}
}// end close Проверка ордера на покупку
//---
if (OrderType() == OP_SELL)
{
if (Is_Close_Sell==true) //--сигнал к закрытию
{
RefreshRates();// Обновление ставок
res= 0;
res= OrderClose(order_id,Lots,Ask,3,Gold);
while(IsTradeAllowed() == false) Sleep(100); //---подождать немного, чтобы получить ответ от сервера
if (res>0){
PlaySound("cash_register.wav");}
if(res<0)
{
PlaySound("creak.wav");
Print("OrderSend failed with error #",GetLastError());
return(0);
}
return;
}
}// end close Sell Order check
}//--------+
return;
}

//----------------------------------------------+

 
RaptorUK:
А завтра FP3 и квалификация ;-)

@ RaptorUK, я подумываю о том, чтобы надеть шлем для аварийных ситуаций, так я хотя бы смогу думать наперед, чем сейчас. Разве не так, эти водители думают наперед? :D


@ skaboy, я прошу вас вежливо, если вы не возражаете, не могли бы вы использовать кнопку SRC для публикации вашего кода. Мы просили об этом слишком много раз только в этой теме.


@ Crossy, Прошла почти неделя с момента вашего первого сообщения. Конечно, я понимаю, что у вас может не быть ясной головы сейчас, имея дело с 4000 линиями, прямо сейчас я сам тоже здесь. Если вы все еще не понимаете, вы можете попросить нас написать этот код Close для вас. Однако вы все равно должны написать код хоть немного - и показать нам. :D, код RaptorUK чуть выше там более прямой, чем мой, подумайте об этом и затем вы можете двигаться дальше с вашим советником.

С тем, как вы пишете код здесь - слишком много ненужного повторяющегося кода - вы должны немного беспокоиться с вашими 4000 строк кода, что это может замедлить ваш советник и заставить его пропустить тик. Это нормально пропустить пару пунктов, но что случится, если вы пропустите 10 пунктов? И, вероятно, ваши 4000 строк могут быть сокращены до 400 строк. Кто знает? Ваш советник станет более легким и быстрым. :D

 
skaboy:

Я нахожу это гораздо более простым, и это работает для меня:


Это не работает, если у вас есть несколько заказов, которые нужно закрыть... прочитайте это и научитесь: Циклы и закрытие или удаление ордеров