Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Не поставляешь сигналы и не продаешь приложения? Не проблема, заработать могут все!
Vasiliy Sokolov
20274
Vasiliy Sokolov 2014.05.21 10:10  
simpleton:
Что-то здесь не так:

Надо бы заменить на что-то другое.

Пордоньте, я ошибся, вмест magic нужно использовать идентификатор ордера. Но вопрос где его взять, если в функцию PendingOrderNotFind передается только magic ордера? - Все просто, надо заменить функцию OrderSelect на более выразительную: FindOrderByMagic. Саму эту функцию придется написать самостоятельно. Но зная ее название не трудно догадаться что она должна делать:

void OnStart()
{
   int ArrayMagicNumber[]={1,2,3,4,5};
   int total = ArraySize(ArrayMagicNumber);
   for(int i = 0; i < total; i++)
   {
      int magic = ArrayMagicNumber[i];
      if(PendingOrderNotFind(magic))
         InstallPendingOrder(magic);
   }
}

///
/// Return true if pending order with magic 'magic' not find, if find - return false.
///
bool PendingOrderNotFind(int magic)
{
   // Нет активного ордера - возвращаем ложь.
   if(!FindOrderByMagic(magic))return false;
   //Если ордер не отложенный (Buy или Sell) - возвращаем ложь.
   if(OrderType() == ORDER_TYPE_BUY ||
      OrderType() == ORDER_TYPE_SELL)
      return false;
   return true;
}
///
/// Find order by it's magic. If pending order exits function select it,
/// and return true, otherwise return false.
/// \param mode - if it flag set in 'MODE_TRADES' (by default) order find in active pool orders,
/// if mode set in MODE_HISTORY - order will be try find in history pool orders.
///
bool FindOrderByMagic(int magic, int mode = MODE_TRADES)
{
   int total = 0;
   if(mode == MODE_HISTORY)
      total = OrdersHistoryTotal();
   else
      total = OrdersTotal();
   for(int i = 0; i < total; i++)
   {
      if(!OrderSelect(i, i, mode))continue;
      int currMagic = OrderMagicNumber();
      if(currMagic == magic)
         return true;
   }
   return false;
}
///
/// Install pending order with magic 'magic'.
///
void InstallPendingOrder(int magic)
{
   if(Bid<1.3800)
      bool res = OrderSend(Symbol(), OP_SELLLIMIT, 0.01, 1.3800, 3, 1.4000, 1.3600, "Open", magic, 0, clrNONE);
}
Victor Nikolaev
Модератор
14205
Victor Nikolaev 2014.05.21 10:40  
C-4:

Пордоньте, я ошибся, вмест magic нужно использовать идентификатор ордера. Но вопрос где его взять, если в функцию PendingOrderNotFind передается только magic ордера? - Все просто, надо заменить функцию OrderSelect на более выразительную: FindOrderByMagic. Саму эту функцию придется написать самостоятельно. Но зная ее название не трудно догадаться что она должна делать:


Атомную бомбу делаете?
Vasiliy Sokolov
20274
Vasiliy Sokolov 2014.05.21 12:56  
Vinin:

Атомную бомбу делаете?
Да не, просто такой досуг что-ли. А вообще лучше сразу новичков учить писать основательно, потом им же проще будет.
Alexander
2441
Alexander 2014.05.21 13:38  
C-4:
Да не, просто такой досуг что-ли. А вообще лучше сразу новичков учить писать основательно, потом им же проще будет.



Если Вы считаете, что это основательно, то Вы значительно преуспели - короткую простую функцию разложили на три бессмысленных да еще и с ошибками.
Victor Nikolaev
Модератор
14205
Victor Nikolaev 2014.05.21 13:45  
C-4:
Да не, просто такой досуг что-ли. А вообще лучше сразу новичков учить писать основательно, потом им же проще будет.


Я уже просто выкладывал готовый код из 10 строчек. А тут готовится что-то архи-огромное что бы сложить 1+ 1
Простак
315
Простак 2014.05.21 22:01  
C-4:

Пордоньте, я ошибся, вмест magic нужно использовать идентификатор ордера. Но вопрос где его взять, если в функцию PendingOrderNotFind передается только magic ордера? - Все просто, надо заменить функцию OrderSelect на более выразительную: FindOrderByMagic. Саму эту функцию придется написать самостоятельно. Но зная ее название не трудно догадаться что она должна делать:


Теперь здесь вызов выглядит как-то очень подозрительно:

   for(int i = 0; i < total; i++)
   {
      if(!OrderSelect(i, i, mode))continue;

Что-то тут опять не так.

Vasiliy Sokolov
20274
Vasiliy Sokolov 2014.05.22 09:06  
Vinin:

Я уже просто выкладывал готовый код из 10 строчек. А тут готовится что-то архи-огромное что бы сложить 1+ 1


У вас код меньше но избыточен. Вы используете по крайней мере один лишний цикл и один лишний массив. Поэтому дальше что-либо обсуждать даже не имеет смысла.

Roger:
Если Вы считаете, что это основательно, то Вы значительно преуспели - короткую простую функцию разложили на три бессмысленных да еще и с ошибками.

После этого даже отвечать не хочется: 

Roger:
Если предыдущий код обернуть условием совершать его только когда количество открытых ордеров меньше пяти, вообще не будет жрать машинное время.)

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

simpleton:

Теперь здесь вызов выглядит как-то очень подозрительно:

Что-то тут опять не так.

Блин, ну изменить второй "i" на SELECT_BY_POS.
Victor Nikolaev
Модератор
14205
Victor Nikolaev 2014.05.22 16:16  
Не буду ничего говорить. Сами до всего придете
Простак
315
Простак 2014.05.22 20:32  
C-4:


У вас код меньше но избыточен. Вы используете по крайней мере один лишний цикл и один лишний массив. Поэтому дальше что-либо обсуждать даже не имеет смысла.

После этого даже отвечать не хочется: 

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

Блин, ну изменить второй "i" на SELECT_BY_POS.

 

Да, у Vinin код использует ещё один цикл и ещё один массив. Однако, несмотря на это, он всё равно потенциально эффективнее, да ещё и удобнее для последующего использования. Во внутреннем цикле, в котором "стоимость" операций выше, у него используются менее затратные операции - обращение к элементам массива. У вас же циклы переставлены, и во внутреннем цикле используются потенциально более "дорогие" по операции.

Также, его код значительно лаконичнее и значительно понятнее. Выбрано удачное представление данных: для каждого значения magic'а подсчитывается количество текущих ордеров с данным magic'ом. Используя таким образом организованные данные, легко пишется сам код, и потом значительно легче развивать дальнейший код, что у Vinin также продемонстрировано пресловутым вторым циклом. Выходит, что представление данных - основа, и оно важнее кода.

По поводу вашего "блина": это - не последний "блин". Для случая, когда не открыто ни одного ордера, ни одного ордера никогда и не откроется. Функция FindOrderByMagic() в этом случае вернёт false, а функция PendingOrderNotFind() - тоже false, в первой же своей строке:

if(!FindOrderByMagic(magic))return false;

Следовательно, функция InstallPendingOrder() НЕ вызовется:

      if(PendingOrderNotFind(magic))
         InstallPendingOrder(magic);

А, ведь, именно эта и только эта функция, которая НЕ вызовется, и ставит ордера. Значит, для случая, когда ордеров нет, их никогда и не будет.

Так что, у кода Vinin есть ещё одно, самое главное преимущество: он работает, и, насколько я могу судить, вполне правильно, если не требовать корректности с абсолютной доскональностью и выжимания максимально возможной эффективности.

Я, когда публикую код, всегда его прогоняю. Всегда. Это - знак элементарного уважения к тем, кто будет пользоваться.

И очень сильно сомневаюсь, что в данном случае новички не только будут искать все эти ошибки, но и в состоянии квалифицированно это сделать, особенно, если это новички уровня начинателя ветки.

/ /12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий