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

 
crossy:


Здесь, если Orderselect равен FALSE, как советник может вернуться к строке кода: for(int cnt=OrdersTotal(); cnt > 0; cnt-- )

???

Вы можете перейти к следующему значению в цикле, используя continue. . или выйти из цикла с помощью break... Щелкните по ссылкам для получения документации по каждому из них.
 
crossy:

Здесь, если Orderselect равен FALSE, как советник может вернуться к строке кода: for(int cnt=OrdersTotal(); cnt > 0; cnt-- )


???

Этот код неправильный...

cnt должен начинаться с OrdersTotal() - 1 и уменьшаться до cnt >= 0 ... ... первая запись - 0, а не 1.

Вот почему я попросил показать код. . и вы показали достаточно, чтобы определить проблему... возможно. ;-)

 
RaptorUK:

Этот код неправильный... ...

cnt должен начинаться с OrdersTotal() - 1 и уменьшаться до cnt >= 0. . . . . . первая запись - 0, а не 1.

Вот почему я попросил показать код. . и вы показали достаточно, чтобы определить проблему... возможно. ;-)


Очень правильно. Спасибо, Виземан!
 
crossy:

Очень правильно. Спасибо, Wizeman!


И еще одна идея:

Если у меня много условий, вы можете написать:

If( X>b && B>S && NB<F......)

{

BBB= 5;

}f.e.

Здесь эксперт должен вычислить каждое условие внутри скобки.

Но если вы ищете эффективность (4 000 строк кода...), я предпочитаю иметь:

If ( X>b )

{

while (B>S)

{

While (NB<F...)

{

BBB=5;

}

break;

}

break;

}

Являются ли эти 2 варианта одинаковыми?

Y.

 

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

Итак, это будет выглядеть так

   //--- first code
   If(X>b && B>S && NB<F......)
     {
      BBB=5;
     }
   
   // --- second code
   If(X>b)
     {
      while(B>S)
        {
         while(NB<F..)
           {
            BBB=5;
           }
         break;
         }
      break;
     }

Объяснение цикла "if, while и for" в mql4 https://book.mql4.com/operators/assign

Во втором коде все в порядке, поскольку вы используете break, однако, это долгий путь, чтобы получить BBB = 5. Я предпочитаю первый код, он использует меньше ресурсов.

 
crossy:


И еще одна идея:

Если у меня много условий, вы можете написать:

If( X>b && B>S && NB<F......)

{

BBB= 5;

}f.e.

Здесь эксперт должен вычислить каждое условие внутри скобки.

Но если вы ищете эффективность (4 000 строк кода...), я предпочитаю иметь:

Используя while подобным образом, вы можете оказаться в бесконечном цикле...
 
Спасибо вам обоим!
 
onewithzachy:

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

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


Особая благодарность onewithzachy,

Я не знал, что ORDERSELECT migth not catch, поэтому у вас могут быть неизвестные ошибки.

Мой код, который был 4016 строк кода, стал почти 4500 строк - но без ошибок.

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

Y.

 

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

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

У меня есть следующая строка кода:

CLOSE_Single_P(Pair1, "LONG",OrderT,OrderL);

как:

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;
}
for ( int vvv = OrdersTotal()-1; vvv >= 0; vvv-- )
{
if ( OrderSelect(vvv, SELECT_BY_POS, MODE_TRADES) )
{
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);
if ( Check )
break;
} }
}
}
return;
}

Моя ПРОБЛЕМА заключается в следующем: Иногда советник закрывает сделку очень хорошо, но иногда советник закрывает сделку, НО продолжает искать тикет для ее закрытия, хотя она уже была закрыта.

(Я получаю ошибку: "Неизвестный номер тикета...").

Я думаю, что у меня логическая ошибка.

Спасибо за помощь.

Y

 

Пожалуйста........