Как правильно выбрать последний ордер в истории? - страница 3

 
Andrei Fandeev:

Но если документация НЕ даёт гарантии, то придётся все функции, использующие Хистори, переписать.

Я бы не стал ориентироваться на Документацию в данном вопросе. Особенно, когда отсутствует какая-либо информация по нему.

Artyom Trishkin:

Поищите ветки на mql4.com - там много разговоров было на этот счёт.


Хронологически по MT4:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Вопрос по SELECT_BY_POS

Renat Fatkhullin, 2007.07.17 17:46

Сделки в Account History сортируются по дате (исправлено) закрытия, а не по номеру тикета.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Вопрос по SELECT_BY_POS

Renat Fatkhullin, 2007.07.18 05:49

Дело в том, что основной объем Account History приходит с сервера, а потом история совершенных сделок накапливается (если не было перелогинов) на торговом терминале транзакция за транзакцией без соблюдения правила пересортировки по закрытию. Вообще-то не имеет значения, в какой сортировке хранится массив совершенных сделок в памяти терминала, так как список "на люди" показывается уже в интерфейсе в любой нужной сортировке.

Вам не стоит закладываться в правило, что в Account History сделки всегда отсортированы по дате закрытия. В любом случае, сегодня мы поглубже посмотрим на этот момент - скорее всего будет проще для всех, если мы поставим жесткое правило сортировки по дате закрытия.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Выпущен MetaTrader 4 Client Terminal build 600 с обновленным языком MQL4 и Маркетом приложений

Renat Fatkhullin, 2014.03.12 15:18

Мы давно уже привели историю сделок в упорядоченный вид, но детали надо по коду смотреть. Сразу ответить не смогу.

Хронологически по MT5:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Renat Fatkhullin, 2013.05.01 16:11

voix_kas:

Является ли номер тикета сделки/ордера сквозным автоинкрементом для всего сервера?

Является, но принципиально не гарантируется их тождественность времени.

Поясню цитату. Сортировка по ORDER_TICKET и ORDER_TIME_SETUP_MSC/ORDER_TIME_DONE_MSC - не одно и то же. Думаю, DEAL это не касается.


Подвожу итог:

MT4-история торгов отсортирована по времени закрытия и это правило меняться не будет.


ЗЫ Во время тщательного поиска встречал инфу от матерых форумчан, что есть/была зависимость от сортировки в GUI. Подтверждений этим словам (поиск говорит, что более 10 лет такие утверждения проскакивают) не было, но были конструктивные опровержения. Все похоже на то, что кто-то не до конца разобрался и написал. На его авторитете (и/или вырванном из контекста вылеченного баг-репорта) другие подхватили инфу и себе на корку записали. Повторяя и записывая на другие корки, продлевая миф.

 
Andrei Fandeev:

Автор пишет "Если предыдущий ордер закрылся с минусом по стопу, то нужно перевернуться"
т.е. ваш код найдет не это, а последний закрывшийся по СЛ (и он не обязательно будет предыдущий )

И кстати формулировка у автора не совсем ясная.
Нужно именно "с минусом" или именно "по стопу"?
Потому как в плюс но со стопом может закрыться ордер с тралом СЛ.
Так же и в минус но по ТейкПрофиту может закрыться ордер, например в сеточных стратегиях.

Поправка: Нужно с минусом и по стопу! Предыдущий ордер в истории.

 
Спасибо за ответы. Я обязательно попробую )
 
fxsaber:

MT4-история торгов отсортирована по времени закрытия и это правило меняться не будет.

странный итог, как и спор на ровном месте

тут ситуация один в один как правильно писать выражение:

int a,b;
double c;
c = a/b;

или 

if(b!=0) c = a/b;

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

ЗЫ: и если не ошибаюсь, то сама история ордеров ведь на сервере хранится? и терминал синхронизирует эту историю? - если да, тогда все зависит не от терминала МТ4, а от того что там с серверным программным обеспечением
 
Igor Makanu:

странный итог, как и спор на ровном месте

Для меня итог другой - если есть хоть малейшие сомнения в корректности работы кода - следует переделать на максимально-возможно корректную работу.
Тем более там всего-то пару строк добавить.
Код ведь предназначен с работой деньгами, не для игрушек. Тем более с чужими (заказчика либо инвестора либо подписчика на сигналы).

А цикл всё-таки лучше делать наоборот, к нулю. И проверку по времени делать первую - так мы исключим лишние проверки по символу, магику и прочему. Т.е. чуть ускорим.

 
Развели разговоров на 3 страницы...
#property strict
//+------------------------------------------------------------------+
enum typeSumbol{ AllSymbols,  ExpertSymbol };
enum typeMagic { AllMagic,    ExpertMagic  };
//+------------------------------------------------------------------+
input typeSumbol    TypeSumbol     = ExpertSymbol;
input typeMagic     TypeMagic      = ExpertMagic;
input int           Magic          = 1000,
                    SL             = 0,
                    TP             = 0;
//+------------------------------------------------------------------+
void OnTick()
{
     //-----
     static datetime  closeTime = 0;
     int ticket = 0;
     
     for(int i=OrdersHistoryTotal()-1; i>=0; i--)
     {
          if( !OrderSelect(i, SELECT_BY_POS,MODE_HISTORY) ) continue;
          if( OrderCloseTime() <= closeTime )               continue;
          if( TypeMagic == ExpertMagic )
               if( OrderMagicNumber() != Magic )            continue;
          if( TypeSumbol == ExpertSymbol )
               if( OrderSymbol() != _Symbol )               continue;
          if( OrderType() != ORDER_TYPE_BUY &&
              OrderType() != ORDER_TYPE_SELL )              continue;
          
          closeTime = OrderCloseTime();
          ticket = OrderTicket();
     }
     //-----
     if( ticket == 0 )
          return;
     if( !OrderSelect(ticket, SELECT_BY_TICKET,MODE_HISTORY) )
          return;
     if( OrderStopLoss() == 0 )
          return;
     if( OrderComment() != "[sl]" )
          return;
     if( OrderProfit() + OrderSwap() + OrderCommission() >= 0 )
          return;
     
     int       stopLevel = (int)SymbolInfoInteger(OrderSymbol(), SYMBOL_TRADE_STOPS_LEVEL)+1;
     double    point     = SymbolInfoDouble(OrderSymbol(), SYMBOL_POINT),
               bid       = SymbolInfoDouble(OrderSymbol(), SYMBOL_BID),
               ask       = SymbolInfoDouble(OrderSymbol(), SYMBOL_ASK);
     
     switch( OrderType() )
     {
          case ORDER_TYPE_BUY:
               if( OrderSend( OrderSymbol(),
                              ORDER_TYPE_SELL,
                              OrderLots(),
                              ask, 5,
                              (SL == 0 ? 0 : stopLevel > SL ? (ask - stopLevel*point) : (ask - SL*point)),
                              (TP == 0 ? 0 : stopLevel > TP ? (ask + stopLevel*point) : (ask + TP*point)),
                              "", Magic ) ) printf("Вместо убыточного SELL %d, взята позиция BUY", ticket);
               break;
                    
          case ORDER_TYPE_SELL:
               if( OrderSend( OrderSymbol(),
                              ORDER_TYPE_BUY,
                              OrderLots(),
                              bid, 5,
                              (SL == 0 ? 0 : stopLevel > SL ? (bid + stopLevel*point) : (bid + SL*point)),
                              (TP == 0 ? 0 : stopLevel > TP ? (bid - stopLevel*point) : (bid - TP*point)),
                              "", Magic ) ) printf("Вместо убыточного BUY %d, взята позиция SELL", ticket);
               break;
     }
}
 
Andrei Fandeev:

А цикл всё-таки лучше делать наоборот, к нулю. И проверку по времени делать первую - так мы исключим лишние проверки по символу, магику и прочему. Т.е. чуть ускорим.

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

даже варианты с if(!=) continue; будут аналогичны по производительности if() { if()  {if() }}         и аналогичны if((==)  && (==)   &&  (===) )

ЗЫ: я по привычке еще со времен  турбопаскаля (там директивой прекомпилятора включался режим сокращенной проверки условий и бывало, что то забудет подключить то еще какие "непонятки" были у меня в то время) - и как привык 20 лет назад писать сложные условия путем составления простых условий, так часто и пишу то сих пор, т.е. речь идет о:

if(a==b  && a>c && a<d)...

аналогично:

if(a==b){
  if(a>c){
    if(a<d)....
  }
}

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

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

 
Igor Makanu:

даже варианты с if(!=) continue; будут аналогичны по производительности if() { if()  {if() }}         и аналогичны if((==)  && (==)   &&  (===) )

Где-то год или два назад я лично читал от МетаКвоты сообщение, что с текущего билда IF прекращает дальнейшую проверку если не выполнено очередное условие.
Хотя возможно это касалось только МТ5, не помню.
Но с тех пор стараюсь именно по этой логике размещать проверки.

Поправьте, кто знает ТОЧНЫЙ ответ, пожалуйста.

 
Konstantin Nikitin:
Развели разговоров на 3 страницы...

"Голодающему надо ПОДСКАЗАТЬ как ловить рыбу ...."
В Вы дали её ему ))))

 
Andrei Fandeev:

Где-то год или два назад я лично читал от МетаКвоты сообщение, что с текущего билда IF прекращает дальнейшую проверку если не выполнено очередное условие.
Хотя возможно это касалось только МТ5, не помню.
Но с тех пор стараюсь именно по этой логике размещать проверки.

Поправьте, кто знает ТОЧНЫЙ ответ, пожалуйста.

Оператор continue

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