Помогите мне навести порядок в конце бара!

 

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



Здесь вы видите, например, график M15 EUR/USD.Теперь представьте, если бы у меня был какой-нибудь индикатор, который привел бы меня в длинную сделку прямо на открытии свечи, отмеченной X, так что она пошла вверх, затем последовала медвежья свеча, с очень низким минимумом, но это не важно, важно то, что на основе моих расчетов, оптимальным выходом здесь будет точка закрытия бара, отмеченного 1.Сложность в том, что я не знаю, как закрыть ордер по цене закрытия бара nr 1, и здесь мне нужна помощь!

Лучшее решение, которое я смог придумать на данный момент, следующее (в случае с этой воображаемой сделкой BUY):


/////////////////OrderSelect() and other stuff

if( OrderType() == OP_BUY ){
    
if( /* blablabla condition && */ Time[0]>OrderOpenTime()  ){

OrderClose( OrderTicket(), OrderLots(),OrderClosePrice() ,TAKEPROFITPIPS,CLR_NONE);             
RefreshRates();    

}}

Этот код закрывает сделку на покупку точно по Open[0], но не по Close[1].Вы видите, потому что если вы посмотрите на картинку и проверите бар, отмеченный 2, вы можете увидеть, что бар 2 не открылся по той цене, по которой закрылся предыдущий, он открылся по немного другой цене.И иногда случается огромный разрыв, как здесь:



Так что опыт подсказывает, что:

Close[1] != Open[0]

В очень редких ситуациях это так. Вот почему мне нужно, чтобы ордер был закрыт прямо на Close[1].

Единственное возможное решение, которое я нашел, это подсчет времени, например, это график M1 и M15, подсчитать количество секунд либо 60 для M1, либо 900 для M15 в любом случае и закрыть ордер на 59 или 599 секунде. Проблемы с этим в том, что тики составляют 6 секунд, я думаю (поправьте меня, если я ошибаюсь), и вы не можете точно попасть в это время, потому что из-за этой проблемы времени и дополнительной проблемы проскальзывания вы можете закрыть сделку намного позже закрытия бара.

Итак, давайте подытожим мой вопрос, можно ли считать время так, как я описал выше, если да, то как избежать проблемы проскальзывания и тикового запаздывания?

Или если вы предложите другие решения, как закрыть ордер прямо на Close[1], а не на Open[0], то я буду открыт для этого. Пожалуйста, помогите мне с этим, это очень важная проблема моего советника!

 
Proximus:

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

нет ситуации, когда можно сказать, что последний тик в данный момент находится за один тик до последнего тика текущего бара
 

Модуль, проверьте, когда нет остатка. удачи

if( !MathMod( TimeCurrent(), PERIOD_M5 * 60 ) ) 

      OrderClose( OrderTicket(), OrderLots(), Bid , slippage );
 
trevone:

Модуль, проверьте, когда нет остатка. удачи

Это не сработает ... это будет либо до конца бара, либо после него ... никогда в конце бара. Как сказал deVries, невозможно определить конец текущего бара, но мы можем определить начало следующего...
 
RaptorUK:
Это не будет работать ... это будет либо до конца бара, либо после него ... никогда в конце бара. Как сказал deVries, невозможно определить конец текущего бара, но мы можем определить начало следующего....


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


А как насчет другого решения, которое берет 1 секунду до закрытия бара?

Как это в случае с M1

if( Time[0]>=OrderOpenTime()+59  ) 

      OrderClose( OrderTicket(), OrderLots(), Bid , slippage );

В этом случае как решить проблему тиков, если она есть?

 
Proximus:

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


А как насчет другого решения, которое берет 1 секунду до закрытия бара?

Как это в случае с M1

Как в этом случае решить проблему тиков, если она есть?




если нет, то это заставляет вас ждать на целую минуту больше, а также в этом случае, если есть какой-либо....
 
Proximus:

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

В советнике (и индикаторе) все происходит только тогда, когда есть тик, вы не можете знать, когда последний тик бара, пока у вас нет первого тика на следующем баре... Даже если тик находится в 59 минут и 59 секунд после часа для бара H1, в течение этой секунды может быть еще один тик...

Проксимус:

А как насчет другого решения, которое берет 1 секунду до закрытия бара?

Как в случае с M1

Как в этом случае решить проблему тиков, если она есть?

. ... и вы не можете ждать последней секунды бара, потому что может не быть тиков в течение последних 5 секунд бара, и в этом случае вы никогда не "увидите" последнюю секунду бара.

 
RaptorUK:

Вещи происходят в советнике (и индикаторе) только тогда, когда есть тик, вы не можете знать, когда последний тик бара, пока у вас нет первого тика на следующем баре ... даже если тик находится в 59 минут и 59 секунд после часа для бара H1, все еще может быть другой тик в течение этой секунды ....

. ... и вы не можете ждать последней секунды бара, потому что может не быть тиков в течение последних 5 секунд бара, и в этом случае вы никогда не "увидите" последнюю секунду бара.

То есть я должен понимать, что если межбанковский обменный курс не меняется в данный период времени, то брокер не называет новые ценовые данные?

Я думал, что тик в MT4 означает, что он всегда обновляет цену через X периодов секунд, независимо от цены или объема. Так что, допустим, частота обновления будет 3 секунды, тогда вы будете знать, что на M1 вы должны были закрыть сделку на 57 секунде или раньше.


Учитывая эту ситуацию, не могу ли я использовать функцию:

RefreshRates();   

Вызвать последний тик на 58 секунде и выйти на 59 секунде?

 
Proximus:

То есть я должен понимать, что если межбанковский обменный курс не меняется в течение определенного периода времени, брокер не называет новые данные о цене?

Я думал, что тик в MT4 означает, что он всегда обновляет цену через X периодов секунд, независимо от цены или объема. Так что, допустим, частота обновления будет 3 секунды, тогда вы будете знать, что на M1 вы должны были закрыть эту сделку прямо на 57 секунде или раньше.

Если цены брокера не меняются, Bid и Ask, то нет нового тика ... около полуночи по Гринвичу на некоторых менее торгуемых парах может не быть тиков в течение минуты или более... новый тик не генерируется через заданное время, это происходит, когда есть изменение цены, Bid или Ask (и, возможно, в некоторых других обстоятельствах, изменение других параметров символа) ....

Proximus:

Учитывая эту ситуацию, не могу ли я использовать:

Вызов последнего тика на 58 секунде и выход на 59 секунде?

Как будет вызываться RefreshRates(), если нет тика?
 

Спасибо за разъяснение того, как работают тики в MT4.

RaptorUK:

Если цены брокера не меняются, Bid и Ask, то нет нового тика ... около полуночи по Гринвичу на некоторых менее торгуемых парах может не быть тиков в течение минуты или более... новый тик не генерируется через заданное время, это происходит, когда есть изменение цены, Bid или Ask (и, возможно, в некоторых других обстоятельствах, изменение других параметров символа) ....

Как будет вызываться RefreshRates(), если нет тика?

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


В любом случае, если кто-то может найти лучшее решение моей проблемы, чем это, то, пожалуйста, поделитесь им со мной, это очень важно! Спасибо заранее!

/////////////////OrderSelect() and other stuff

if( OrderType() == OP_BUY ){
    
if( /* blablabla condition && */ Time[0]>OrderOpenTime()  ){

OrderClose( OrderTicket(), OrderLots(),OrderClosePrice() ,TAKEPROFITPIPS,CLR_NONE);             
RefreshRates();    

}}
 
Proximus:

Спасибо за разъяснение того, как работают тики в MT4.

RaptorUK:

Если цены брокера не меняются, Bid и Ask, то нет нового тика... около полуночи по Гринвичу на некоторых менее торгуемых парах тиков может не быть минуту или больше... новый тик не генерируется через заданное время, это происходит, когда есть изменение цены, Bid или Ask (и, возможно, в некоторых других обстоятельствах, изменение других параметров символа)....

Как будет вызываться RefreshRates(), если нет тика?

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


В любом случае, если кто-то может найти лучшее решение моей проблемы, чем это, то, пожалуйста, поделитесь им со мной, это очень важно! Спасибо заранее!


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