Отправлено: 13.10.16 15:32. Заголовок: А на основании чего ..
А на основании чего открывается ордер не понятно? Зачем цикл? Если это доливочный ордер, то имеет смысл использовать массив ордеров с маджиком. Доливочный ордер открывается примерно так: Был открыт ордер по какому-то условию и он был добавлен в массив ордеров советника по данному инструменту с маджиком. К нему, уже при других условиях добавляются ордера как-то так
Отправлено: 13.10.16 16:33. Заголовок: Эдуард пишет: Здрав..
Эдуард пишет:
цитата:
Здравствуйте. Подскажите, почему ордер не открывается?
Эдуард, Вы здесь намешали мух с котлетами. Цикл, который Вы привели, обычно служит для нахождения ордеров по текущему символу. В этом цикле не должно быть команд торговых операций. Попробуйте запустить этот код онлайн на демо-счете, предварительно открыв хотя бы один ордер с ценой открытия выше МАшки. В итоге получите шквал открытых ордеров Buy.
В текущем же виде ордер никогда не будет открыт, т. к. Вы сравниваете цену открытия имеющегося ордера с ценой MA. Если ордера нет или если цена его открытия ниже МА, то новый ордер не будет открыт. Сформулируйте, что именно Вы хотели получить от этого кода.
Отправлено: 13.10.16 17:56. Заголовок: Эдуард пишет: А так..
Эдуард пишет:
цитата:
А так, почему на каждом тике открывает ?
Потому что Вы именно это и написали в коде: на каждом тике, если цена открытия свечи выше МАшки, то открывать ордер. Чтобы ордер открылся один раз, нужно предварительно произвести проверку, открывались уже ордера на текущей свече или нет. То есть циклом из первого Вашего поста собрать информацию, потом проанализировать ее и только затем выполнять код, приведенный во втором посте.
Отправлено: 13.10.16 19:57. Заголовок: Эдуард пишет: Когда..
Эдуард пишет:
цитата:
Когда свеча закрывается выше мувинга - Бай.
В частностях у Вас все верно. А вот собрано - неверно. Так, условие открытия написано верно:
цитата:
double ma = iMA(...); if (Open[0] > ma) { // Открыть Buy } if (Open[0] < ma) { // Открыть Sell }
Эдуард пишет:
цитата:
Хотелось бы понять, что не так.
Не так то, что перед открытием необходимо проверить наличие уже открытых ордеров на текущей свече. Иначе Вы на каждом тике будете открывать новый ордер. Для определения времени последнего открытого ордера используйте код наподобие такого:
цитата:
datetime GetLastOpenOrderTime() { datetime lastOpenOrderTime = 0; for (int i = OrdersTotal() - 1; i >= 0; i--) { if (!OrderSelect(i, SELECT_BY_POS)) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderType() != OP_BUY && OrderType() != OP_SELL) continue;
if (OrderMagicNumber() != i_magicNumber) continue;
Поэтому перед открытие нового ордера проверяйте время открытия последнего ордера путем сравнения времени открытия свечи и результата, который вернула функция GetLastOpenOrderTime().
цитата:
datetime lastTime = GetLastOpenOrderTime(); if (lastTime >= Time[0]) { // Новый ордер открывать нельзя, т. к. на этой свече уже был открыт ордер }
Эдуард пишет:
цитата:
Код писать не надо, он мне не нужен в принципе.
Тогда непонятно, зачем сюда пишете... Здесь ведь именно коды и обсуждаются.
Отправлено: 17.10.16 14:48. Заголовок: Эдуард пишет: Почем..
Эдуард пишет:
цитата:
Почему выдает ошибку ?
Имеется в виду ошибка компиляции? Если да, то компилятор указывает на то, что функция OnTick имеет тип void (т. е. без типа), а в теле функции четыре функции return возвращают значение. Нужно убрать возврат значения.
Отправлено: 17.10.16 14:51. Заголовок: Эдуард пишет: Когда..
Эдуард пишет:
цитата:
Когда надо делать перебор ордеров ?
Один раз в начале обработки события Tick или любого другого события. Собираем свои ордера в массив, а потом уже работаем с этим массивом. После выполнения любой торговой операции, если она успешна, необходимо вернуться к месту входа в функцию обработки события. Таким образом, сбор информации будет проведен еще один раз. И так до тех пор, пока не будет в очереди торговых операций, либо любая выполненная торговая операция приведет к ошибке. В случае ошибки (опять же - нужно обработать саму ошибку) следует закончить обработку события и ждать следующего события.
Отправлено: 25.10.16 09:00. Заголовок: Эдуард пишет: Подск..
Эдуард пишет:
цитата:
Подскажите на примере части кода. Какое условие прописать, чтобы ордера на одном уровне открывались так: Бай/Селл, то есть чередовались.
Не существует какого-то условия, чтобы его написал - и получил желаемое. Чаще всего, как и в этом случае, требуется составление целого алгоритма. Насколько я понял задачу, требуется:
1. После открытия первого ордера, например, Buy, ожидаем его закрытия по стопу, профиту или по рынку (принудительное закрытие). 2. По закрытию ордера ожидаем возврата цены к уровню открытия Buy и открываем Sell. 3. Ожидание закрытия Sell. 4. Ожидание возврата цены к уровню открытия Sell и открытие Buy.
Такой алгоритм нужен? Даже если он, то это несколько сотен строк кода. Ну и в самом алгоритме еще такой момент не предусмотрен: а что, если цена не вернется к начальному уровню открытия?
Все даты в формате GMT
2 час. Хитов сегодня: 1
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет