Помогите с простым скриптом

 

Добрый день,хочу выполнить скрипт в 2 шага:

1.Скрипт открывает два отложенных ордера buystop и sellstop;

2.как только цена затрагивает один из ордеров,удаляется "противоположный"(например, открывается buystop,удаляется sellstop);

Если с  первым шагом проблем у меня не возникло,то со вторым....

Подскажите пожалуйста, как пожно реализовать 2 шаг.Слышала что можно сделать это через стандартный цикл  перебора ордеров (for (int i=OrdersTotal()-1; i>=0; i--) пока какой-то не подойдёт по магическому номеру,но как реализовать это не понимаю.

Буду рада любой помощи и любому совету.Заранее спасибо.

 
creepystaisy97:

Добрый день,хочу выполнить скрипт в 2 шага:

1.Скрипт открывает два отложенных ордера buystop и sellstop;

2.как только цена затрагивает один из ордеров,удаляется "противоположный"(например, открывается buystop,удаляется sellstop);

Если с  первым шагом проблем у меня не возникло,то со вторым....

Подскажите пожалуйста, как пожно реализовать 2 шаг.Слышала что можно сделать это через стандартный цикл  перебора ордеров (for (int i=OrdersTotal()-1; i>=0; i--) пока какой-то не подойдёт по магическому номеру,но как реализовать это не понимаю.

Буду рада любой помощи и любому совету.Заранее спасибо.


Если до срабатывания любого из ордеров нет открытых позиций, то я бы встроил в бесконечный цикл проверку открытой позиции, и удалял бы оставшиеся ордера:

 
  {
//---
  while(!IsStopped())
     {
      if(PositionSelect(_Symbol))
         {
         DeletePendingOrder();
         }
     }
  }
//+------------------------------------------------------------------+
//Удаление отложенных ордеров
void DeletePendingOrder()
{
 ulong order_ticket;
    HistorySelect(0,TimeCurrent());
    for (int i=OrdersTotal()-1;i>=0;i--)
    {
        order_ticket=OrderGetTicket(i);
        if (OrderGetString(ORDER_SYMBOL) == Symbol())
         {
            if(!trade.OrderDelete(order_ticket))
               {
               //--- сообщим о неудаче
               Print("Метод OrderDelete() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
               ". Описание кода: ",trade.ResultRetcodeDescription());
               }
            else
               {
               Print("Метод OrderDelete() выполнен успешно. Код возврата=",trade.ResultRetcode(),
               " (",trade.ResultRetcodeDescription(),")");
               }
         }
    } 
} 
 
0Aleksandr0:

это mql5?

 
creepystaisy97:

это mql5?


да.

 
0Aleksandr0:

да.

Спасибо большое за помощь.Только я(дырявая голова) забыла указать что пишу на mql4.Простите что потратила ваше время,я попробую переделать первую часть кода под mql5,чтобы ваш труд не пропал даром

 
creepystaisy97:

Спасибо большое за помощь.Только я(дырявая голова) забыла указать что пишу на mql4.Простите что потратила ваше время,я попробую переделать первую часть кода под mql5,чтобы ваш труд не пропал даром


Да я не перетрудился)
Скопировал со своего советника, есть с похожим функционалом просто)

 
creepystaisy97:

Добрый день,хочу выполнить скрипт в 2 шага:

1.Скрипт открывает два отложенных ордера buystop и sellstop;

2.как только цена затрагивает один из ордеров,удаляется "противоположный"(например, открывается buystop,удаляется sellstop);

Если с  первым шагом проблем у меня не возникло,то со вторым....

Подскажите пожалуйста, как пожно реализовать 2 шаг.Слышала что можно сделать это через стандартный цикл  перебора ордеров (for (int i=OrdersTotal()-1; i>=0; i--) пока какой-то не подойдёт по магическому номеру,но как реализовать это не понимаю.

Буду рада любой помощи и любому совету.Заранее спасибо.

Делать это в скрипте абсолютно неправильно. В этом случае придётся зацикливать работу скрипта, что не приветствуется. Но если в советнике это сделать, то алгоритм совсем простой:

  1. При открытии ордеров их тикеты запоминаются в разные переменные или в массив.
  2. На каждом тике поочерёдно выбираются ордера и проверяется тип ордера.
  3. Если OP_BUY или OP_SELL значит второй удаляется и ЕxpertRemove() либо ожидание следующей команды...
 
Alexey Viktorov:

Делать это в скрипте абсолютно неправильно. В этом случае придётся зацикливать работу скрипта, что не приветствуется. Но если в советнике это сделать, то алгоритм совсем простой:

  1. При открытии ордеров их тикеты запоминаются в разные переменные или в массив.
  2. На каждом тике поочерёдно выбираются ордера и проверяется тип ордера.
  3. Если OP_BUY или OP_SELL значит второй удаляется и ЕxpertRemove() либо ожидание следующей команды...

Добрый день еще раз,спасибо за описание шагов.Подскажите еще немного пожалуйста.вот такая ситуация,первый шаг у меня такой-скрипт открывает с наступлением определенного времени,два ордера.Могу ли я 1 шаг оставить как скрипт ,а 2 сделать советником.И если да то как?Или может целесообразнее сделать все шаги одним советником?Заранее спасибо:)))

 
creepystaisy97:

Добрый день еще раз,спасибо за описание шагов.Подскажите еще немного пожалуйста.вот такая ситуация,первый шаг у меня такой-скрипт открывает с наступлением определенного времени,два ордера.Могу ли я 1 шаг оставить как скрипт ,а 2 сделать советником.И если да то как?Или может целесообразнее сделать все шаги одним советником?Заранее спасибо:)))

Выделенное говорит о том, что это советник. Настоятельно рекомендую к прочтению справку по терминалу.

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