как узнать проскальзывание отложенных ордеров в истории счёта - страница 2

 
Alexey Viktorov #:

Они говорят о МТ4.

Два пути.

  1. Брокер, который прописывает скольжения в комментариях. Есть несколько таких на MT4.
  2. Использовать в своем советнике одно из полей ордера в качестве данных цены открытия. Например, для BuyLimit при каждой модификации OpenPrice делать SL = OpenPrice - OffsetConst. И SL не использовать у позиций. Тогда в истории позиций всегда сможете узнать цену BuyLimit, как BuyLimit_Price = Position_StopLoss + OffsetConst.
 
Valeriy Yastremskiy #:
Он никуда не попадает, он становится рыночным с тем же тикетом. А у рыночного ордера есть цена открытия. Ее и сравниваем с ценой установки отложенного.

Это как?

Если я в истории найду рыночный ордер по тикету, то его цена будет одна OrderOpenPrice()
А у отложенного не будет в истории не цены не его тикета, его вообще не будет ни где.
Что сравнивать в итоге?

 
forex2030 #:

Это как?

Если я в истории найду рыночный ордер по тикету, то его цена будет одна OrderOpenPrice()
А у отложенного не будет в истории не цены не его тикета, его вообще не будет ни где.
Что сравнивать в итоге?

Вот ещё один вариант, при условии что ТП не менялся. СЛ меняется чаще чем ТП… Так вот если ТП при открытии поставлен OrderOpenPrice(отложка) + 100 *_Point то если закрытый ордер будет не 100 пунктов, то вывод очевиден.

 
forex2030 #:

Это как?

Если я в истории найду рыночный ордер по тикету, то его цена будет одна OrderOpenPrice()
А у отложенного не будет в истории не цены не его тикета, его вообще не будет ни где.
Что сравнивать в итоге?

Так и есть. Цену отложки ни терминал ни рыночное окружение не запоминает. Эти среды много чего не хранят. Это ваша обязанность. Запомните их в массивах например. Истории модификаций стопов тоже не  хранятся.
 
Valeriy Yastremskiy #:
Это ваша обязанность. Запомните их в массивах например.

Как мне их запомнить, от чего отталкиваться?

Мне надо определить как открылся отложенный ордер где-то там когда-то.
На чистом графике по символу получить данные открытия отложенного ордера например вчера.
Не пойму как решить этот вопрос.

 
fxsaber #:
2. Использовать в своем советнике одно из полей ордера в качестве данных цены открытия.

    Поддерживаю второй путь.

    Как раз писал советник, в котором необходимо определить горизонтальную линию, по сигналу от которой был открыт ордер.

    Записываю цену линии в мэджик.

    #property strict
    
    #define MAGIC_PRICE_LEN  7
    #define MAGIC_MULTIPLIER (int)MathPow(10, MAGIC_PRICE_LEN)
    #define MAGIC_EA_ID_MIN  1
    #define MAGIC_EA_ID_MAX  213
    
    input int inpExpertId = 199;
    
    struct STRUCT_LEVEL_PROPS
      {
       double price;
       int    priceClipped;
       int    magic;
       int    expertId;
       STRUCT_LEVEL_PROPS(){price = -1; priceClipped = -1; magic = -1; expertId = -1;}
      };
    
    void OnStart()
      {
       double price = NormalizeDouble(Bid - 1234 * _Point, _Digits);
       Alert(StringFormat("price %s (digits: %i), MAGIC_PRICE_LEN %i", prcToStr(price), _Digits, MAGIC_PRICE_LEN));
       STRUCT_LEVEL_PROPS resultPrcToMagic;
       levelPropsCalculate(price, resultPrcToMagic);
       Alert(StringFormat("magic %i, from price %s", resultPrcToMagic.magic, prcToStr(resultPrcToMagic.price)));
       STRUCT_LEVEL_PROPS resultMagicToPrc;
       levelPropsCalculate(resultPrcToMagic.magic, resultMagicToPrc, NormalizeDouble(Bid, _Digits));
       Alert(StringFormat("price %s from magic %i", prcToStr(resultMagicToPrc.price), resultMagicToPrc.magic));
      }
    
    void levelPropsCalculate(double price, STRUCT_LEVEL_PROPS &level)
      {
       level.price = price;
       int priceInt = doubleToInt(price * MathPow(10, _Digits));
       level.priceClipped = priceInt % MAGIC_MULTIPLIER;
       level.expertId = inpExpertId;
       level.magic = level.expertId * MAGIC_MULTIPLIER + level.priceClipped;
      }
    
    void levelPropsCalculate(int magic, STRUCT_LEVEL_PROPS &level, double anyPrice)
    // В anyPrice передавать любую известную цену, которая будет как можно ближе к level.price. Я передаю цену открытия ордера
      {
       level.magic         = magic;
       level.expertId      = magic / MAGIC_MULTIPLIER;;
       level.priceClipped  = magic % MAGIC_MULTIPLIER;
       int priceClippedLen = StringLen(IntegerToString(level.priceClipped));
       int anyPriceInt     = doubleToInt(anyPrice * MathPow(10, _Digits));
       int subtrahend      = anyPriceInt % doubleToInt(MathPow(10, priceClippedLen));
       level.price         = NormalizeDouble((anyPriceInt - subtrahend + level.priceClipped) * _Point, _Digits);
      }
    
    int doubleToInt(double value)
      {
       return(int(NormalizeDouble(value, 0)));
      }
    
    string prcToStr(double price)
      {
       return(DoubleToString(price, _Digits));
      }

    Наколхозил конечно, но работает:

    В частности, вот это точно можно было написать получше:

    int priceClippedLen = StringLen(IntegerToString(level.priceClipped));

    через логарифм, к примеру. Но у меня это аварийное решение (на случай ели горизонтальная линия на графике больше не существует, чего быть не должно), поэтому я заморачиваться не стал.

    В общем, можно писать цену открытия в мэджик.

     
    Vladislav Boyko #:

    Поддерживаю второй путь.

    Как раз писал советник, в котором необходимо определить горизонтальную линию, по сигналу от которой был открыт ордер.

    Записываю цену линии в мэджик.

    Наколхозил конечно, но работает:

    В частности, вот это точно можно было написать получше:

    через логарифм, к примеру. Но у меня это аварийное решение (на случай ели горизонтальная линия на графике больше не существует, чего быть не должно), поэтому я заморачиваться не стал.

    В общем, можно писать цену открытия в мэджик.

    Можно еще пару цифр с мэджика освободить для какого-нибудь другого идентификатора:

    #define MAGIC_PRICE_LEN  5 // было 7