MarketRule1.And(MarketRule2) как работает?
Atom Ответить
25.03.2013


Как работает комбинация правил MarketRule1.And(MarketRule2).Do(smth)? Она сработает сразу как только выполнятся оба правила? Не важно в каком порядке? И теоретически может быть, что к моменту срабатывания комбинации одно из двух правил может сработать несколько раз? Если да, то лечится так: MarketRule1.Once().And(MarketRule2.Once()).Do(smth)? Спасибо.

Теги:


Спасибо:




3 Ответов
Moadip

Фотография
Автор статей Программист
Дата: 25.03.2013
Ответить


В данном случае правила можно считать условием, пока не выполняться оба условия, метод в .Do() не будет вызван.
И не важно в каком порядке выполнятся правила.

По поводу срабатывания одного правила несколько раз.
Какая разница сколько сработает одно правило(условие)? Пока второе не сработает, обработчик не будет вызван.

Из справки:

Когда цена последней сделки будет выше 135000 И ниже 140000:
Код

var priceMore = new Unit(135000m, UnitTypes.Limit);
var priceLess = new Unit(140000m, UnitTypes.Limit);

MarketRuleHelper
    .And(new IMarketRule[] {Security.WhenLastTradePriceMore(priceMore), Security.WhenLastTradePriceLess(priceLess)})
    .Do(() => this.AddInfoLog(string.Format("Цена последней сделки находится в диапазоне от {0} до {1}", priceMore, priceLess)))
    .Apply(this);


Цена может очень долго болтаться ниже 135000. Т.е. постоянно будет срабатывать правило Security.WhenLastTradePriceLess(priceLess).
Но только когда цена поднимется выше 135000, сработает второе правило - Security.WhenLastTradePriceMore(priceMore), и только тогда вызовется:
Код

this.AddInfoLog(string.Format("Цена последней сделки находится в диапазоне от {0} до {1}", priceMore, priceLess))
Спасибо:

FlashPlayer

Фотография
Дата: 25.03.2013
Ответить


Спасибо за ответ. Насчет Once() я действительно протупил. Оно там ни к чему - даже не знаю, зачем про него написал) Запутался..

А вот по поводу примера, я считаю он не очень корректно отображает всю прелесть And(). Ведь пример воспринимается, как будто правило должно сработать, только если цена будет между 135 и 140. Более того, он воспринимается, как будто оба правила должны наступить одновременно. Но как я понимаю это не так - ведь если цена последней сделки жила так: 145 - и сразу -> 130 метод в примере тоже сработает. Ведь так? Или должно быть именно одновременное срабатывание двух правил? Тогда как это технически проверяется?

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

Moadip

Фотография
Автор статей Программист
Дата: 26.03.2013
Ответить


Цитата:
Более того, он воспринимается, как будто оба правила должны наступить одновременно. Но как я понимаю это не так - ведь если цена последней сделки жила так: 145 - и сразу -> 130 метод в примере тоже сработает. Ведь так? Или должно быть именно одновременное срабатывание двух правил? Тогда как это технически проверяется?

Проведите эксперимент.Smile
Возьмите два правила и проверьте как AND с ними работает. Необязательно с правилами как в примере.
Например эти: MarketRuleHelper.WhenFinished и MarketRuleHelper.WhenNewTrades
Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy