Скрипты: Close All

 

Close All:

Простой код для закрытия всех открытых ордеров.

Автор: Jiayu Fu

 
Опишите разницу в версиях!
 

Я писал в сервисдеск чтобы в документацию внесли такую фишку, что можно при закрытии ордера использовать OrderClosePrice() но они молчат. Может решают не отключить-ли такой прибамбас...

И одно незначительное замечание по коду, строка

      if(OrderType()==OP_BUY || OrderType()==OP_SELL)

равнозначна строке

      if(OrderType() < OP_SELLLIMIT)

но проверка короче...

 
Alexey Viktorov:

...

но проверка короче...

В каком смысле короче? Но не факт, что лучше
 
Dmitry Fedoseev:
В каком смысле короче? Но не факт, что лучше
А чем хуже?
 
Alexey Viktorov:
А чем хуже?
Очень интересно, вы хотите, чтобы я ответил на ваш вопрос, но на мой вопрос не отвечая? 
 
Dmitry Fedoseev:
Очень интересно, вы хотите, чтобы я ответил на ваш вопрос, но на мой вопрос не отвечая? 

Дмитрий, я уже говорил тебе что я самоучка. Только в институте чуток учили васик, а С# и подобные языки вообще не знаю. Поэтому не хотелось-бы повторять всё что я читал на форумах по этому поводу. В этом случае можно и в ахинею поверить и выдавать её за истину, но мне не хотелось-бы выглядеть "комсомольцем".

Ну как минимум в проверке if(OrderType() == OP_BUY || OrderType() == OP_SELL) две проверки, а в OrderType() < OP_SELLLMIT только одна. То-есть в два раза меньше затрат времени.

 

1. В следующем выражении:  

 if(OrderType() == OP_BUY || OrderType() == OP_SELL)

 предполагая, что в природе существует примерно одинаковое количество ордеров buy и ордеров sell в половине случаев будет выполняться только половина выражения. Если OrderType() == OP_BUY, а знак |, то второе выражение не будет вычисляться.

2. Проверка на равенство менее затратна, чем проверка на больше или меньше.

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

 
Dmitry Fedoseev:

1. В следующем выражении:  

 предполагая, что в природе существует примерно одинаковое количество ордеров buy и ордеров sell в половине случаев будет выполняться только половина выражения. Если OrderType() == OP_BUY, а знак |, то второе выражение не будет вычисляться.

2. Проверка на равенство менее затратна, чем проверка на больше или меньше.

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

Наконец-то я сподобился проверить что пишут и пришёл к выводу что все мнения сугубо личные.

Вот скрипт

/********************Script program start function********************/
void OnStart()
{
  ulong start = GetMicrosecondCount(); int i, n = 0, t = OrdersTotal();
   for(i = 0; i <= 100000; i++)
    {
     for(n = 0; n < t; n++)
      {
       if(OrderSelect(n, SELECT_BY_POS))
       if(OrderType() == OP_SELL || OrderType() == OP_BUY) int k = i;//OrderType() < OP_SELLLIMIT) int k = i;//
      }
    }
   static ulong time = 0;
    time = MathMax(GetMicrosecondCount()-start, time);
      Alert("Ордеров ", n, " if(OrderType() == OP_SELL || OrderType() == OP_BUY) ", time);
}/********************************************************************/

Вот результат


Если разница и есть, то настолько незначительна, что заострять на этом внимание себе дороже.

 
Alexey Viktorov:

Дмитрий, я уже говорил тебе что я самоучка. Только в институте чуток учили васик, а С# и подобные языки вообще не знаю. Поэтому не хотелось-бы повторять всё что я читал на форумах по этому поводу. В этом случае можно и в ахинею поверить и выдавать её за истину, но мне не хотелось-бы выглядеть "комсомольцем".

Ну как минимум в проверке if(OrderType() == OP_BUY || OrderType() == OP_SELL) две проверки, а в OrderType() < OP_SELLLMIT только одна. То-есть в два раза меньше затрат времени.

влезу в ваш весёлый диалог :-)

Господа, вы сравниваете муравьёв на фоне Эвереста - время выполнения любых операторов уничижающе мало по сравнению с OrderClose.

вот так:

OrderType() < OP_SELLLMIT

делать нельзя никогда ни в одном языке. Считайте что с enum допустимы только сравнения == !=

Иначе в весёлый день будут пересмотрены коды операций и микрооптимизация превратит программу в тыкву. Если память не изменяет такое уже было с ENUM_TIMEFRAME при переходе MT4->MT5.


А вот чего действительно нехватает скрипту - это вызова RefreshRates и повторной попытки, если при закрытии получена ошибка Requote. Закрытие - это операция непредсказуемой длительности и цена вполне успеет убежать за пределы проскальзывания.

 
Maxim Kuznetsov:

влезу в ваш весёлый диалог :-)

Господа, вы сравниваете муравьёв на фоне Эвереста - время выполнения любых операторов уничижающе мало по сравнению с OrderClose.

вот так:

OrderType() < OP_SELLLMIT

делать нельзя никогда ни в одном языке. Считайте что с enum допустимы только сравнения == !=

Иначе в весёлый день будут пересмотрены коды операций и микрооптимизация превратит программу в тыкву. Если память не изменяет такое уже было с ENUM_TIMEFRAME при переходе MT4->MT5.


А вот чего действительно нехватает скрипту - это вызова RefreshRates и повторной попытки, если при закрытии получена ошибка Requote. Закрытие - это операция непредсказуемой длительности и цена вполне успеет убежать за пределы проскальзывания.

Убедительно, спасибо.
Причина обращения: