public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('direction', 'choice', ['label' => 'Направление открытия сделки', 'required' => true, 'choices' => Signal::getDirectionsNames()]); $builder->add('indicatorValues', 'collection', ['label' => false, 'type' => new IndicatorValueType(), 'allow_add' => true, 'allow_delete' => true]); $builder->add('addIndicator', 'button', ['label' => 'Добавить индикатор', 'attr' => ['class' => 'addIndicator']]); $builder->add('stopLossPercent', 'integer', ['label' => 'Стоп лосс при достижении просадки (в % от цены открытия)', 'required' => false, 'attr' => ['max' => 100, 'min' => 0]]); $builder->add('takeProfitPercent', 'integer', ['label' => 'Тейк профит при достижении прибыли (в % от цены открытия)', 'required' => false, 'attr' => ['max' => 100, 'min' => 0]]); $builder->add('stopLoss', 'integer', ['label' => 'Стоп лосс (в валюте депозита)', 'required' => false]); $builder->add('takeProfit', 'integer', ['label' => 'Тейк профит (в валюте депозита)', 'required' => false]); $builder->add('deleteSignal', 'button', ['label' => 'Удалить сигнал', 'attr' => ['class' => 'deleteSignal']]); }
/** * Проверка на срабатывание всех индикаторов сигнала * @param Price $priceObject * @param int $direction * @param Signal $signal * @return bool */ private function indicatorsPassed(Price $priceObject, $direction, Signal $signal) { $indicatorValues = $signal->getIndicatorValues(); $indicatorsPassed = 0; foreach ($indicatorValues->toArray() as $indicatorValueObject) { /** @var IndicatorValue $indicatorValueObject */ $indicator = $indicatorValueObject->getIndicator(); $indicatorMethod = 'get' . $indicator->getStrategyMethod(); $priceIndicatorValue = $priceObject->{$indicatorMethod}(); $indicatorValue = $indicatorValueObject->getValue(); // Если индикатор является коммулятивным if ($priceIndicatorValue > 1) { $indicatorValue = Signal::SIGNAL_MAXIMUM_BUY; } elseif ($priceIndicatorValue < -1) { $indicatorValue = Signal::SIGNAL_MAXIMUM_SELL; } if ($direction == $signal::DIRECTION_BUY && $priceIndicatorValue >= $indicatorValue || $direction == $signal::DIRECTION_SELL && $priceIndicatorValue <= $indicatorValue) { $indicatorsPassed++; } } return $indicatorsPassed == count($indicatorValues); }
/** * Название направления сделки * @param int $direction * @return string */ public function getDirectionName($direction) { $directionNames = Signal::getDirectionsNames(); return array_key_exists($direction, $directionNames) ? $directionNames[$direction] : ''; }