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

 

Здравствуйте, друзья,

Мне нужна ваша помощь.

Я создал советника, который в процессе своей работы должен закрывать сделку с помощью фукции. Вот соответствующие строки kod's.

Может ли кто-нибудь помочь мне, почему советник не закрывает сделку? Спасибо.

(Возможно, так как если я использую ORDERSELECT в основной части, то он не может использовать ORDERSELECT в функции, также????)

for(int cnt=0; cnt < OrdersTotal(); cnt++)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if ( OrderSymbol() == Pair && OrderType() == OP_BUY )

{

if ( MarketInfo(Pair,MODE_BID) >= Open_P_BUY + MarketInfo(Pair,MODE_POINT)*factor*TP )

{

CLOSE_Single_P(Pair, "LONG", OrderTicket(), OrderLots());

}

}

}

...

...

...

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

void CLOSE_Single_P(string SYMB, string TREN, int TICKET, double LOTT)

{

int Code, sig;

double PRC;

if ( TREN == "LONG" )

Code = 0;//OP_BUY

иначе

if ( TREN == "SHORT" )

Код = 1;//ОП_ПРОДАЖА

for ( int k=0; k < OrdersTotal(); k++ )

{

OrderSelect(k, SELECT_BY_POS, MODE_TRADES);

if( OrderSymbol() == SYMB && OrderType() == Code && OrderLots() == LOTT && OrderTicket() == TICKET )

{

if ( OrderType() == OP_BUY )

PRC = MarketInfo(OrderSymbol(),MODE_BID);

иначе

if ( OrderType() == OP_SELL )

PRC = MarketInfo(OrderSymbol(),MODE_ASK);

OrderClose(TICKET,LOTT,PRC,Slippage,Yellow);

break;

}

}

return;

}

 

Используйте кнопку SRC для отображения вашего кода для лучшего чтения, пожалуйста :)

Вы неправильно закодировали OrderSelect(). Сравните свой код с этим. Затем напишите, осталась ли у вас проблема или нет :)

   for(int cnt=0; cnt<OrdersTotal(); cnt++)
     {
      if (OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES) == true &&
          OrderSymbol()==Pair && 
          OrderType()==OP_BUY)
          {
          // code to close
          }
      }
 
crossy:

Здравствуйте, друзья,

Мне нужна ваша помощь.

Я создал советника, который в процессе своей работы должен закрывать сделку с помощью фукции. Вот соответствующие строки kod's.

Может ли кто-нибудь помочь мне, почему советник не закрывает сделку? Спасибо.

Когда у вас есть цикл и вы закрываете или удаляете (отложенные) ордера, вы ДОЛЖНЫ считать вниз, а не вверх....

Почему у вас есть цикл в функции Close_Single_P? Разве она не предназначена для закрытия одного ордера? Когда вы вызываете функцию, вы передаете символ, номер тикета, тип ордера и размер позиции... это все, что вам нужно для закрытия ордера... ну почти, вам нужна цена для закрытия, и для этого вы можете использовать OrderClosePrice() и тогда вам не нужно беспокоиться о том, покупка это или продажа... на самом деле, просто избавьтесь от функции и используйте эту строку вместо вызова функции....

OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Yellow);

... кстати, где вы устанавливаете Slippage? и компенсируете ли вы 4/5-значных брокеров?

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

Должен ли ваш заказ быть закрыт? Вы проверили, что это...

if ( MarketInfo(Pair,MODE_BID) >= Open_P_BUY + MarketInfo(Pair,MODE_POINT)*factor*TP )

... это правда?

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

if ( MarketInfo(Pair,MODE_BID) >= Open_P_BUY + MarketInfo(Pair,MODE_POINT)*factor*TP )
   {
   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:

Используйте кнопку SRC для отображения вашего кода для лучшего чтения, пожалуйста :)

Что тогда возвращает GetLastError()?


В коде около 4 000 строк...

В любом случае, я не получаю никакого сообщения об ошибке.

 
crossy:


В коде около 4 000 строк...

В любом случае, я не получаю никаких сообщений об ошибках.

Вы не обязаны публиковать весь свой код. . но когда вы публикуете ЛЮБОЙ код, пожалуйста, используйте кнопку SRC...

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

 
RaptorUK:

Когда у вас есть цикл, и вы закрываете или удаляете (отложенные) ордера, вы ДОЛЖНЫ вести отсчет вниз, а не вверх....

Почему у вас есть цикл в функции Close_Single_P? Разве она не предназначена для закрытия одного ордера? Когда вы вызываете функцию, вы передаете символ, номер тикета, тип ордера и размер позиции... это все, что вам нужно для закрытия ордера... ну почти, вам нужна цена для закрытия, и для этого вы можете использовать OrderClosePrice() и тогда вам не нужно беспокоиться о том, покупка это или продажа... на самом деле, просто избавьтесь от функции и используйте эту строку вместо вызова функции....

. . кстати, где вы устанавливаете Slippage? и компенсируете ли вы 4/5-значных брокеров?

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

Должен ли ваш заказ быть закрыт? Вы проверили, что это...

. ... это правда?

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


Спасибо Raptor за ваши мудрые предложения. ВСЕГДА вы помогаете мне мудро и четко.

Я попробую то, что вы только что предложили.

С наилучшими пожеланиями.

 

Вы уже выбрали билет, зачем проходить через второй цикл OrderSelect, чтобы найти тот же самый билет?

Почему вы не проверяете возвращаемое значение OrderClose и не распечатываете ошибку, чтобы выяснить ПОЧЕМУ?

 
WHRoeder:

Вы уже выбрали билет, зачем проходить через второй цикл OrderSelect, чтобы найти тот же самый билет?

Почему вы не проверяете возвращаемое значение OrderClose и не выводите ошибку, чтобы выяснить, ПОЧЕМУ?


Спасибо, друзья, за ваши усилия.

Я сделал несколько изменений, но ничего не помогло, пока я не увидел комментарий WHRoeder.

Вы гениальны, я думаю, вы правы.

Я попробую модифицированный советник в понедельник.

Хороших выходных.

 
crossy:


Спасибо, друзья, за ваши усилия.

Я сделал несколько изменений, но ничего не помогло, пока я не увидел комментарий WHRoeder.

Вы гениальны, я думаю, вы правы.

Я попробую модифицированный советник в понедельник.

Хороших выходных.


Ну, мои друзья,

Я сделал все ваши предложения, но советник не работает.

Есть еще идеи?

 

Давайте сделаем это снова

  #include "..\libraries\stdlib.mq4" // drag and drop from libraries to very top of your code
  
  for(int cnt = OrdersTotal(); cnt >= 0; cnt--)  // from RaptorUK, count it down to zero 
     {
     if (OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES) == true && OrderSymbol() == Pair) // this is how to write OrderSelect()
        {
        if(OrderType()== OP_BUY) // the code below is to close buy position only
          {
          
          //---
           if(MarketInfo(Pair,MODE_BID) >= Open_P_BUY + MarketInfo(Pair,MODE_POINT) * factor * TP) // from RaptorUK, is this statemement true ?
             {
              //CLOSE_Single_P(Pair,"LONG",OrderTicket(),OrderLots()) // From RaptorUK & WHRoeder, you don't have to do OrderSelect() twice
             Print("Trying to close buy position : ", OrderTicket());                            
             if (!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Yellow)) // From Raptor UK, are you doing the slippage correctly ?
                Print("failed to close buy position ", ErrorDescription(GetLastError())  ); 
             }
             else
             {
             Print ("Not qualify to close buy position ", OrderTicket()); // from RaptorUK, is this statemement true ?, if not this print will tell you
             }
          //---
             
           }
           /*
           else
           {
           if (OrderType() == OP_SELL)
              {
              
              }
           }
           */
        }
     }
      

Пока я все еще читаю второй подиум Валентино Росси в MotoGP Ле-Ман, надеюсь, я пишу это правильно :)

 
onewithzachy:

Давайте сделаем это снова

Пока я еще читаю второй подиум Валентино Росси в MotoGP Le Mans, надеюсь, что пишу правильно :)


Спасибо onewithzachy,

Сначала я думаю, что у вас есть небольшая ошибка:

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

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

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

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

Спасибо, Y.

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