Циклы и закрытие или удаление заказов - страница 4

 
ggekko:

Здравствуйте, эксперты, каково ваше мнение о данном решении?

while(OrdersTotal()>0)
Это означает, что он несовместим с любым другим советником (включая его самого) и ручной торговлей. (Торговля на других графиках)
 
WHRoeder:
ggekko:

Здравствуйте, эксперты, каково ваше мнение о данном решении?

Это означает, что он несовместим с любым другим советником (включая его самого) и ручной торговлей. (Торгует на других графиках).

Конечно. Это полное закрытие всего.

Иногда бывают ситуации (например, вы хотите немедленно закрыть слишком много открытых сделок), когда "оригинальная" версия не работает. Эта версия подходит для этого.

 
ggekko:

Конечно. Это полное закрытие всех сделок.

Иногда бывают ситуации (например, вы хотите немедленно закрыть слишком много открытых сделок), когда "оригинальная" версия не работает. Эта версия подходит для этого.

Почему вы не пытаетесь реагировать на ошибки? Разве вы не должны анализировать ошибку и реагировать соответствующим образом? Для некоторых ошибок вы можете повторить попытку, для других вы должны прекратить попытки.
 

Здравствуйте,


У меня вопрос по поводу циклов while. Я хочу запускать текущего советника в цикле как можно чаще. Поэтому я решил поместить текущий код в цикл while с включенной в него функцией sleep, которая заставляет цикл while выполняться только каждые 1 миллисекунду.


Однако, когда я это сделал (у меня есть несколько вызовов функции Print("..."), которая отслеживает, что происходит в каждом цикле), я увидел, что код замирает и больше не выводится на экран.

Мне интересно, в чем может быть проблема. Можно ли запускать советника в цикле с частотой 1 мс? Не возникнет ли проблема, если пытаться, например, каждую миллисекунду получать с сервера последние данные о цене/аске? Не создаст ли это слишком большую нагрузку на сервер, что приведет к зависанию?

Возможно, это происходит из-за чего-то другого в моем алгоритме, но я не уверен.


Я запустил его на 200 мс циклах и все равно получил ту же проблему (хотя и не так быстро). Может ли быть проблема с печатью слишком большого количества строк в файл журнала?



Спасибо за любой совет по этому поводу.

с уважением,


C.

 
Может быть проблема с кодом - но без знания кода?
 

14967057:

У меня вопрос о циклах while. Я хочу запускать текущего советника в цикле как можно чаще.

Поэтому я думаю поместить текущий код в цикл while с включенной в него функцией sleep, которая заставляет while выполняться только каждые 1 миллисекунду.

Может ли возникнуть проблема при попытке получить последнюю цену покупки/продажи.

Может ли быть проблема с печатью слишком большого количества строк в файл журнала?

  1. Эта тема была посвящена закрытию и удалению ордеров. Не создавайте темы для вопросов не по теме. Создайте новую.
  2. Зачем вам нужен непрерывный цикл? Ничего не меняется. Все, что вы делаете, это тратите процессорное время.
  3. Вернитесь из start, и когда Bid/Ask изменится, ваш start будет вызван как можно быстрее.
  4. Да, вы заполнили всю доступную память строками быстрее, чем Windows может записать их на диск. Все программы выгружаются. Все зависает.
 

Здравствуйте,

Оказалось, что проблема, с которой я столкнулся, не связана с инкапсуляцией кода советника внутри цикла while с 1 мс sleep. Эта часть, кажется, в порядке (независимо от того, где я печатаю на экран или нет), так как у меня он работает уже последние полчаса без сбоев.


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

Спасибо за ответы gooly и Roesder.

regards,

 

Привет всем. Прочитал эту тему и у меня возник вопрос. Я пытаюсь сделать код, который удаляет отложенный ордер (только STOP, без LIMIT), но только если был активирован другой отложенный ордер (стартовый OP_SELL или OP_BUY). Код получился такой (но есть ошибки, но я не знаю где). Не могли бы вы взглянуть на мой код?

 bool   result;
   int   i, j, cmd, cmd2,total;

   total=OrdersTotal();

   for(i=0; i<total; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         cmd=OrderType();
         
         if(cmd!=OP_BUYSTOP && cmd!=OP_SELLSTOP)  //take an orders which was activated 
           {
           for(j=0; j<total; j++)   //another variable j 
     { 
     if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES)){ cmd2=OrderType();
     if(cmd2!=OP_BUY && cmd2!=OP_SELL)
           {
            
            OrderPrint();
            
            result=OrderDelete(OrderTicket());  //first pending order become to OP_SELL or OP_BUY, second pending order will be delete
            if(result!=TRUE) Print("LastError = ", GetLastError());
            break;
           }
        }
       }
     }
     }
   }
 

OrdersTotal() не корректно...

Я был удивлен тем, что циклическая последовательность кода, использующая OrdersTotal(), не дает правильных результатов (наблюдал у двух разных брокеров).

Я использую MT4 версии 1090 на рабочем столе Linux Ubuntu-MATE 16.04, под управлением WINE 3.0.

Вот что я использовал...

for(int cc = 0; cc < OrdersTotal(); cc++)
{
if (!OrderSelect(cc, SELECT_BY_POS, MODE_TRADES)) continue;
if (OrderSymbol() != Symbol() ) continue;
if (OrderType() > 1) continue; //--игнорировать отложенные сделки

OpenTradecnt++; //--подсчитывается для каждой существующей живой позиции данного символа
Print("количество открытых сделок по этому символу: ", OpenTradecnt);
}

Я заметил у двух разных брокеров, что значение OrdersTotal() не всегда совпадает с тем, что отображается на вкладке "Торговля" брокера MT4. Сначала я подумал, что это брокер заставляет OrdersTotal() работать неправильно. Когда я заметил это у второго брокера, я начал задаваться вопросом, может ли MT4 иметь внутреннюю "проблему", или мой код был неправильным, или это проблема с MT4, правильно синхронизирующимся с сервером....?

Прочитав эту ветку форума, я задаюсь вопросом, изменит ли результаты изменение цикла for..loop на read:

for(int cc = OrdersTotal() - 1; cc >= 0; cc--)
{
...........
}

ИЛИ, существует ли флаг или строка кода, которая обеспечит правильную синхронизацию OrdersTotal() во время события OnTick()?

Любое разъяснение по этому поводу было бы очень полезным и будет высоко оценено!

 

Пожалуйста, используйте кнопку </>, чтобы вставить свой код.


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