View Full Version : Ilan 1.4 mod
Я как-то не осознавал что сигнал перезаписываться, если это так, то соответственно переменная не может одновременно иметь два разных значения, что объясняет нежелание открывать ордера (может я опять заблуждаюсь).
Но все же условия сигнала я задавал все время разные, и каждым условиям присваивал свои значения.
На счет увеличения или уменьшения переменной я честно не до конца понял, может это решение мне просто не подходит, поскольку в стратегии нет наращивания или сокращения количества индикаторов, просто используются разные сочетания индикаторов.
Может проще изменить название переменной и задать ей свое значение?
Scriptong
10-08-2010, 13:04
Я как-то не осознавал что сигнал перезаписываться, если это так, то соответственно переменная не может одновременно иметь два разных значения, что объясняет нежелание открывать ордера (может я опять заблуждаюсь).
Правильно сформулировано. Одна переменная не может иметь одновременно два разных значения. Если одновременно выполняется два или более условий, то получите значение Signal, соответствующее последнему в коде исполненному условию.
По поводу приращения Signal. Начнем с простого. Имеется три различных индикатора, в зависимости от показания которых вам нужно принять решение о последующем действии. Чтобы не перепутать различные сочетания индикаторов составьте таблицу:
Инд. 1 Инд. 2 Инд. 3 Действие
Нейтр. Нейтр. Нейтр. Ничего
Нейтр. Нейтр. BUY BUY
Нейтр. Нейтр. SELL SELL
Нейтр. BUY Нейтр. Ничего
Нейтр. BUY BUY BUY
Нейтр. BUY SELL Ничего
Нейтр. SELL Нейтр. SELL
Нейтр. SELL BUY Ничего
Нейтр. SELL SELL SELL
BUY Нейтр. Нейтр. BUY
BUY Нейтр. BUY BUY
BUY Нейтр. SELL Ничего
BUY BUY Нейтр. BUY
BUY BUY BUY BUY
BUY BUY SELL BUY
BUY SELL Нейтр. Ничего
BUY SELL BUY BUY
BUY SELL SELL SELL
SELL Нейтр. Нейтр. SELL
SELL Нейтр. BUY Ничего
SELL Нейтр. SELL SELL
SELL BUY Нейтр. Ничего
SELL BUY BUY BUY
SELL BUY SELL SELL
SELL SELL Нейтр. SELL
SELL SELL BUY SELL
SELL SELL SELL SELL
Нейтр. означает нейтральное положение индикатора, когда он не подает ни одного сигнала. В таблице приведены все 27 случаев сочетаний сигналов трех индикаторов. Понятно, что чем больше индикаторов, тем больше будет сочетаний. В графе "Действия" я привел просто пример действий, это не значит, что так должно быть всегда. Вы может распределить их по-другому.
Я исходил из того, что все сигналы равноценны. В таком случае не нужно ранжировать сигналы по весам, как я привел пример в предыдущем посте. Достаточно увеличивать или уменьшать значение Signal:
Signal = 0;
if (<Инд. 1 == BUY>)
Signal++;
if (<Инд. 2 == BUY>)
Signal++;
if (<Инд. 3 == BUY>)
Signal++;
if (<Инд. 1 == SELL>)
Signal--;
if (<Инд. 2 == SELL>)
Signal--;
if (<Инд. 3 == SELL>)
Signal--;
В итоге у вас сформируется такое же значение Signal, как и в случае с одним индикатором: 0 - нет сигнала, >0 - BUY, <0 - SELL
Спасибо, с комбинацией показаний индикаторов более-менее понятно, но такой подход обобщает сигналы и хорош для большого массива индикаторов или условий для них. В то же время такой подход ограничивает значение переменной только тремя положениями - нет/BUY/SELL. А как с тех же индикаторов, на ряду с указанными значениями переменной, вытянуть отдельное (специальное если хотите) условие сигнала?
Scriptong
11-08-2010, 14:22
Спасибо, с комбинацией показаний индикаторов более-менее понятно, но такой подход обобщает сигналы и хорош для большого массива индикаторов или условий для них. В то же время такой подход ограничивает значение переменной только тремя положениями - нет/BUY/SELL. А как с тех же индикаторов, на ряду с указанными значениями переменной, вытянуть отдельное (специальное если хотите) условие сигнала?
В этих случаях количество возможных комбинаций возрастает. Кроме сигналов типа "нет", "BUY" и "SELL" никто не запрещает ввести другие сигналы и комбинировать их как заблагорассудится.
Количество возможных комбинаций рассчитывается просто: X в степени Y, где X - количество индикаторов, Y - количество сигналов каждого индикатора.
То есть при трех индикаторах и трех сигналах получаем 27 (три в кубе).
При четырех индикаторах и пяти сигналах получим уже 1024 (четыре в пятой степени).
Здравствуйте Scriptong.
Опять я со своими баранами:)
НЕ могу понять как это у Вас получилось снять начало сигнала с Пульс Слуп, я имею ввиду последнюю интерпретацию, как Вы выразились "с учетом стратегии".
Получилось это отлично, но получить от этого индикатора чистый сигнал что бы я ни делал, я не смог. То там, то здесь сигнал пробивало, не смотря на проверку на нескольких барах.
В виду таких особенностей этого индикатора, я вернулся к Фишеру, который хоть не преподносил сюрпризов.
Фишер имеет свои особенности и по аналогии со Слупом, переделать его не смогу, поэтому надежда на Вас.
Подскажите пожалуйста как снять начало сигнала с Фишера.
Заранее благодарен.
Scriptong
02-09-2010, 19:54
НЕ могу понять как это у Вас получилось снять начало сигнала с Пульс Слуп, я имею ввиду последнюю интерпретацию, как Вы выразились "с учетом стратегии".
Ух, давайте попробуем подробнее. Я что-то никак не могу уловить суть. Что за "Пульс Слуп", какая "последняя интерпретация"?
Существует много способов ограничения сигнала. Самый простой и универсальный для каждого советника - запоминать направление последнего сигнала. В результате, если новый и последний сигнал совпадают, то не генерировать новый. В коде это будет выглядеть так:
if (условие для Buy)
if (LastSignal != 1)
{
Signal = 1;
LastSignal = 1;
}
if (условие для Sell)
if (LastSignal != -1)
{
Signal = -1;
LastSignal = -1;
}
Недостатком этого метода является неработоспособность в случаях, когда сигнал на какое-то время пропадает, а затем вновь возникает и следует вновь реагировать на него как на новый.
Для таких ситуаций нужно уже подходить к коду с учетом специфики стратегии. Для Pulse Slope достаточно изменить код так:
bool SlopeUp = False, SlopeDn = False;
if (UseSlope)
{
double SlopeBuf11 = iCustom(Symbol(), 0, "Pulse Slope_V3", Fperiod, method, price, FlatPips, 0, 1);
double SlopeBuf12 = iCustom(Symbol(), 0, "Pulse Slope_V3", Fperiod, method, price, FlatPips, 0, 2);
double SlopeBuf21 = iCustom(Symbol(), 0, "Pulse Slope_V3", Fperiod, method, price, FlatPips, 1, 1);
double SlopeBuf22 = iCustom(Symbol(), 0, "Pulse Slope_V3", Fperiod, method, price, FlatPips, 1, 2);
double SlopeBuf32 = iCustom(Symbol(), 0, "Pulse Slope_V3", Fperiod, method, price, FlatPips, 2, 2);
}
if (SlopeBuf11 != EMPTY_VALUE && SlopeBuf12 != EMPTY_VALUE && SlopeBuf21 == EMPTY_VALUE &&
(SlopeBuf22 != EMPTY_VALUE || SlopeBuf32 != EMPTY_VALUE))
SlopeUp = True;
if (SlopeBuf11 == EMPTY_VALUE && SlopeBuf21 != EMPTY_VALUE && SlopeBuf22 != EMPTY_VALUE &&
(SlopeBuf12 != EMPTY_VALUE || SlopeBuf32 != EMPTY_VALUE))
SlopeDn = True;
То есть производится проверка смены цвета индикатора. На зеленый цвет может измениться, если перед этим индикатор был красного или желтого цвета, а на красный, если до этого был зеленого или желтого цвета.
В итоге советник будет добавлять позиции только в момент смены цвета.
Если же вы хотите оперировать всегда лишь одним ордером (только BUY или только SELL), то изменять код нужно в функции открытия позиций. Так, новый BUY не должен открываться, если уже существует BUY. То же самое касается SELL. В случае получения разворотного сигнала, необходимо сначала закрыть имеющуюся сделку и открыть новую.
Речь идет об этой интерпретации.
Мне нужно снять такую же смену цвета индикатора Fisher.
Scriptong
06-09-2010, 08:06
Речь идет об этой интерпретации.
Мне нужно снять такую же смену цвета индикатора Fisher.
Такую же не получится, т.к. у Fisher'a всего два состояния, а не три.
Поэтому нужно просто отслеживать смену цвета индикатора.
Если с красного на зеленый, то Buy, если с зеленого на красный, то Sell. Все просто.
Благодарю за подскаску, получилось.
Scriptong подскажите как на базе советника OverTake, используя его ресурсы, сформулировать функцию закрытия позиций при достижении уровня безубытка
if (SellCount >=2 && BuyCount ==0 && Bid == APrice)
if (!CloseAllSell())
return(True);
Я понимаю что такое равенство может продолжатся мгновение, из-за чего возможно такой функцией серии не закрыть, но как написать работоспособную версию не знаю.
Может есть аналогичное решение с выставлением общего для серии стопа что было бы лучше.
Необходимость решения такой задачи обусловлена тем, что бы не дать цене уйти в убыток после доливки по тренду и резкого разворота.
Scriptong
08-09-2010, 16:39
В данном случае логичнее устанавливать уровень стопа всем открытым позициям, исходя из общей цены открытия.
В данном случае логичнее устанавливать уровень стопа всем открытым позициям, исходя из общей цены открытия.
Я смог написать следующее
if (SellLots == 0 && BuyCount>=2 && BuyLow < LastBuyPrice)
PriceTP = APrice + Spread;
Но такой расчет включается только после того, как цена его пройдет и зайдет в минус. Это логично, так как это тейк, а не стоп. А как написать то же самое но для стопа я не знаю, так как не нашел такого ресурса в коде.
Подскажите пожалуйста
Scriptong
09-09-2010, 21:03
Я смог написать следующее
if (SellLots == 0 && BuyCount>=2 && BuyLow < LastBuyPrice)
PriceTP = APrice + Spread;
Но такой расчет включается только после того, как цена его пройдет и зайдет в минус. Это логично, так как это тейк, а не стоп. А как написать то же самое но для стопа я не знаю, так как не нашел такого ресурса в коде.
Подскажите пожалуйста
Нет, профит трогать не нужно. Уровень стопа необходимо менять непосредственно при вызове OrderModify. Но это в итоге приведет к краху самого алгоритма, т.к. Buy и Sell станут жить независимо друг от друга. В данном советнике этого делать нельзя.
Понимаете, я уже его и так изменил до неузнаваемости и первоначальный алгоритм не используется.
А установка стопа будет исполнятся только при исполнении конкретного условия на ряду с другими, и вмешиваться в основной алгоритм не будет.
Пожалуйста опишите как это правильно выразить с учетом моего предыдущего поста, что бы цена после открытия второго ордера по тренду (в профите), не вернулась в минус.
Scriptong
10-09-2010, 19:27
Тогда нужно завести отдельную переменную, например PriceSL и рассчитывать ее значение по типу PriceTP, т.е. к APrice добавлять некоторое значение. Условие никакое не требуется, если у вас присутствует только один тип позиций. Просто пересчитывать значение при открытии новой позиции и все.
А там, где производится модификация ордеров, ставить PriceSL вместо нуля.
Тогда нужно завести отдельную переменную, например PriceSL и рассчитывать ее значение по типу PriceTP, т.е. к APrice добавлять некоторое значение. Условие никакое не требуется, если у вас присутствует только один тип позиций. Просто пересчитывать значение при открытии новой позиции и все.
А там, где производится модификация ордеров, ставить PriceSL вместо нуля.
Но где именно, там где модифицируется тейк или стоп, в блоке модификации сел или бай и кроме того вместо какого именно нуля?
Я ввел эту переменную, вставил ее в блок изменения уровня профита ордеров SELL, стоп выставляется, но куда бы я не ставил эту переменную в блоках изменения бай ничего не получилось.
Scriptong
13-09-2010, 08:16
В эксперте всего лишь четыре вызова функции OrderModify. Два вызова при доминирующем Buy и два вызова при доминирующем Sell. При текущем положении вещей сделать то, что вы просите принципиально невозможно из-за особенностей алгоритма.
Если вы изменили стратегию таким образом, что исключается существование встречных позиций, тогда можно провести необходимое вам изменение. Блоки 2.1 и 3.1 можно убрать, оставив тем самым только два вызова OrderModify. В каждом из этих вызовов достаточно указать PriceSL на месте установки стопа. Расчет значения переменной PriceSL нужно производить в том же месте, где и PriceTP.
В эксперте всего лишь четыре вызова функции OrderModify. Два вызова при доминирующем Buy и два вызова при доминирующем Sell. При текущем положении вещей сделать то, что вы просите принципиально невозможно из-за особенностей алгоритма.
Если вы изменили стратегию таким образом, что исключается существование встречных позиций, тогда можно провести необходимое вам изменение. Блоки 2.1 и 3.1 можно убрать, оставив тем самым только два вызова OrderModify. В каждом из этих вызовов достаточно указать PriceSL на месте установки стопа. Расчет значения переменной PriceSL нужно производить в том же месте, где и PriceTP.
Нашел проблему. Проблема была в недостаточном уровне удаленности тейка в блоке модификации бай.
Исправить не смог, просто удалил проверку удаленности и все заработало.
Еще одна просьба к Вам Scriptong, я пытаюсь описать один вариант модификации ордеров, ситуацию, которая имеет место после раскрытия полноценного лока.
Допустим условие: если в усреднении находятся 2 ордера сел и поступает противоположный сигнал, то выставляется равноценный по объему бай.
Допустим в замке мы переждали восходящий тренд и поступил сигнал сел, локирующий ордер сразу закрывается и появляется более благоприятная возможность закрытия селовских позиций.
Для того чтобы позиции сел, в совокупности с уже закрытым бай, закрылись в профите, цене необходимо пройти от цены закрытия лока вниз расстояние, которое будет равно цене отрытия лока за минусом средней цены селов - расстоянию, при котором открывался локовый ордер.
18431
Все в принципе работает, но вот с постановлением общего стопа таких селов после раскрытия лока, возникла проблема.
Я ввел расчет времени закрытия последнего бая и цены его закрытия, что бы иметь от чего отталкиваться.
if (BuyCloceTimeLast > SellLast && SellCount==2) // Если сел открылся раньше чем закрылся последний бай и присутствуют две коротких позиции
PriceSL = BuyCloseLast – (LastBuyPrice – Aprice); // уровень стопа равен: цена закрытия последнего бай – (цена открытия последнего бай – средняя цена например селл)
Но только это не работает, помогите пожалуйста.
Scriptong
15-09-2010, 10:47
PriceSL = BuyCloseLast – (LastBuyPrice – Aprice); // уровень стопа равен: цена закрытия последнего бай – (цена открытия последнего бай – средняя цена например селл)
Вы хотите решить довольно сложную задачу. Чтобы ее решить, недостаточно изменить имеющийся алгоритм. Необходимо разработать новый, а затем, согласно ему, вносить изменения в имеющийся код. Вполне возможно, что для этого потребуется создание нового советника, т.к. OverTake не является универсальным механизмом.
Если же говорить с общей точки зрения, то мой совет - уйдите от локов и окажется, что задача упрощается в несколько раз. Нужно будет лишь следить за одной сделкой, для которой рассчитывать уровни стопа и профита. Вместо лока просто закрыть все сделки. Вместо раскрытия лока - открыть сделку в нужном направлении.
Честно говоря, я уже думал по этому поводу, но проблема остается. Если просто закрывать и открывать новый ордер, то уровень профита нового, не перекроет убыток предыдущих ордеров даже с идентичным лотом.
Проблема остается та же, а именно необходимость вычисления нового уровня профита, который бы перекрывал предыдущие убытки (иначе наращивание убытка перевесит профит), плюс вычисление идентификации сделки, к которой нужно применить этот новый профит.
Мне кажется, что в одном, что в другом случае, проблемы и способы их решения аналогичны. Просто надо корректно их сформулировать.
Именно здесь нужна Ваша помощь.
Ведь разница между этими задачами только в том, что в одном случае новый профит применяется к цене открытия, в другом к цене закрытия компенсирующего ордера.
Кроме того, идентификация ситуации при которой необходимо применить новый профит, в случае с раскрытием лока проще, ведь мы имеем неординарную ситуацию – когда ордер закрыт, а предыдущие нет.
Scriptong
16-09-2010, 16:43
Честно говоря, я уже думал по этому поводу, но проблема остается. Если просто закрывать и открывать новый ордер, то уровень профита нового, не перекроет убыток предыдущих ордеров даже с идентичным лотом.
Эта проблема решается легче. Советник перед открытием очередной сделки сканирует историю счета от конца к началу до обнаружения прибыльной сделки. В итоге будут получены такие данные: количество убыточных сделок подряд, их суммарный объем и величина общего убытка.
Для перекрытия полученного убытка одной сделкой необходимо поставить небольшой профит с большим объемом сделки, либо большой профит с небольшим объемом, которые рассчитываются из общего убытка.
Поддерживаю. Напишете как это правильно выразить?
Scriptong
16-09-2010, 21:04
Поддерживаю. Напишете как это правильно выразить?
Вариант для тестера:
int count = 0; // Количество убыточных подряд
double Loss = 0; // Суммарный убыток
for (int i = OrdersHistoryTotal()-1; i >= 0; i--)
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderType() == OP_BUY)
if (OrderClosePrice() >= OrderOpenPrice())
break;
if (OrderType() == OP_SELL)
if (OrderClosePrice() <= OrderOpenPrice())
break;
count++;
Loss += MathAbs(OrderProfit()) + OrderSwap();
}
В реале работать будет не всегда. Во-первых, нет выбора своих позиций по магику и валюте. Во-вторых, история счета может быть пересортирована пользователем как угодно. Необходимо каждый раз просматривать всю историю и составлять список идущих друг за другом ордеров.
Остается вопрос как из этой суммы перейти на нужный объем или количество пунктов, и вообще что лучше и безопаснее большой лот или большой тейк?
Lots=Loss/TakeProfit //если компенсируем лотом???
TakeProfit=Loss/Lots //если компенсируем пунктами???
Я хоть близок к истине?
Scriptong
17-09-2010, 17:17
Остается вопрос как из этой суммы перейти на нужный объем или количество пунктов, и вообще что лучше и безопаснее большой лот или большой тейк?
Согласен, вопрос сложный и на него действительно нет ответа. Был бы ответ мы бы так не мучались. Ведь зная, насколько рынок рванет в ту или иную сторону, к такому вопросу не придешь.
Scriptong
17-09-2010, 17:29
Lots=Loss/TakeProfit //если компенсируем лотом???
TakeProfit=Loss/Lots //если компенсируем пунктами???
Я хоть близок к истине?
Об этом я как раз писал в своей последней статье - Объем сделки и вероятность ее успешности. (http://fxtrade.ru/mqlabs/16.09.2010-mqlabs-obem-sdelki-i-veroyatnost-ee-uspeshnosti), функция GetLots. Если выбросить из нее определение рисков и расчет от объема депозита, то останется следующее:
double lot = LotRound(Loss/TakeProfit/MarketInfo(Symbol(), MODE_TICKVALUE));
Определение TakeProfit из этого уравнения также можно вывести:
TakeProfit = MathCeil(Loss*MarketInfo(Symbol(), MODE_TICKVALUE)/lot)
Подскажите как изменить это условие
for (i = 0; i < SellCount; i++)
чтобы использовать не весь список ордеров SELL, а только последние например один или два ордера.
Было бы вообще хорошо если бы условие выбирало все кроме первого открытого ордера.
Scriptong
23-09-2010, 21:29
чтобы использовать не весь список ордеров SELL, а только последние например один или два ордера.
Было бы вообще хорошо если бы условие выбирало все кроме первого открытого ордера.
Что подразумевается под "первым" ордером: открытый раньше всех остальных или открытый по самой лучшей/худшей цене?
Primus inter pares:)
Первый по времени - открытый раньше всех остальных среди открытых
Scriptong
24-09-2010, 10:45
Если мы все еще говорим об эксперте OverTake, то необходимо немного модифицировать функцию FindOrders (блок 2):
for (int i = 0; i < OrdersTotal(); i++) // Используется весь список ордеров
if (OrderSelect(i, SELECT_BY_POS)) // Убедимся, что ордер выбран
if ((OrderMagicNumber() == MagicNumber || // Ордер открыт экспертом
!OpenCloseTrades) && // или включен режим ручной торговли
OrderSymbol() == Symbol()) // ордер должен принадлежать текущей валютной паре
{
CommonProfit += OrderProfit()+OrderSwap(); // Подсчет совокупного профита
LotLast = MathMax(LotLast, OrderLots()); // Поиск наибольшего объема
if (OrderType() == OP_BUY) // Для ордеров BUY
{
BuyTicket[BuyCount] = OrderTicket(); // Сохранение тикета
BuyLots += OrderLots(); // Подсчет объема
BuyAP += OrderLots()*OrderOpenPrice(); // Вычисление средней цены
if (BuyLast < OrderOpenTime())
{
BuyLast = OrderOpenTime(); // нахождение позднего ордера
BuyLastTicket = OrderTicket();
}
BuyLow = MathMin(BuyLow, OrderOpenPrice()); // Нижний BUY
BuyHigh = MathMax(BuyHigh, OrderOpenPrice()); // Верхний BUY
BuyProfit += OrderProfit()+OrderSwap(); // Подсчет профита
BuyCount++; // Количество BUY
}
if (OrderType() == OP_SELL)
{
SellTicket[SellCount] = OrderTicket(); // Сохранение тикета
SellLots += OrderLots(); // Подсчет объема
SellAP += OrderLots()*OrderOpenPrice(); // Вычисление средней цены
if (SellLast < OrderOpenTime())
{
SellLast = OrderOpenTime(); // нахождение позднего ордера
SellLastTicket = OrderTicket();
}
SellHigh = MathMax(SellHigh, OrderOpenPrice()); // Верхний SELL
SellLow = MathMin(SellLow, OrderOpenPrice()); // Нижний SELL
SellProfit += OrderProfit()+OrderSwap(); // Подсчет профита
SellCount++; // Количество SELL
}
}
В коде при этом нужно добавить объявление глобальных переменных BuyLastTicket и SellLastTicket. По окончании функции FindOrders в них будут находиться тикеты последних открытых ордеров.
Если нужно выбрать все ордера, кроме первого, то сделать наоборот: определить первый открытый ордер и запомнить его тикет. Все остальные найденные ордера тогда будут считаться более поздними.
А как найденные более поздние ордера использовать в блоке ModifyCheck что бы функция изменяла только эти ордера и не трогала первый?
Думаю все таки нужно уточнить, а то мы так будем переписываться...
Тем более если это чего то стоит, то желательно этим поделится.
Я сейчас тестирую нестандартные методы управления рисками, ну по крайней мере такого не читал.
Последняя идея которую я с Вашей помощью пытаюсь автоматизировать, заключается с следующем:
По показаниям индикаторов по тренду открывается ордер с объемом например 1.
Если цена движется в направлении открытого ордера, через энное количество пунктов, например 30 начинается работа меньшими лотами в том же направлении по принципу мартингейла, но с ограничением суммарного лота, первым лотом.
В смысле первый лот объемом 1, второй через 30 пунктов объемом 0.3, разрешение на открытие только одного колена объемом 0.6, если не попали в направление, тейк 10 п. если все нормально.
При этом, вот это мне и не удается, постоянно вычисляется средний стоп на уровне безубытка с учетом всех открытых позиций, а также вычисляется тейк последней или усреднение двух последних сделок, не трогая первую.
Первая сделка закрывается при смене сигнала на противоположный.
Таким образом мы открываем первую сделку как буфер, а остальными отрабатываем все пункты, при смене направления - если резко то в конце безубыток, если плавно - то кроме отработки мелким лотом плюс прибыль с первой сделки.
Убыток только во флэте, но это можно минимизировать соответствующими индикаторами, и кроме того убыток стабилен и минимален.
Мне нужна помощь только в модификации открытых ордеров, а точнее исключение первого ордера из блока модификации.
Все остальное уже работает.
Scriptong
26-09-2010, 14:07
Тогда поступите проще - нумеруйте ордера при открытии. Например, первый ордер в серии имеет номер 0, второй - 1, третий - 2 и т.д. В итоге при последующем нахождении ордера вы по его номеру сможете определить первый это ордер или нет и исключить его из списка следующих действий.
Для нумерации ордеров используйте поле MagicNumber. Например, 782 - идентификатор эксперта. Его умножаем на 100 и к полученному числу прибавляем номер ордера. Т.е. можем пронумеровать ордера от 0 до 99 - 100 ордеров (думаю, для ваших нужд хватит).
В итоге, при переборе ордеров свои ордера вычисляются так:
if (MathFloor(OrderMagicNumber()/100) == MagicNumber)
Для получения номера ордера в серии достаточно использовать такое условие:
ID = MathMod(OrderMagicNumber(), 100);
При открытии ордера в поле MagicNumber записывайте такое число:
MagicNumber*100 + N, где N - номер следующего ордера, который вы можете вычислить, зная номер последнего открытого ордера.
Таким образом вы сможете исключить ордера с любыми номерами, хоть с начала, хоть с конца.
Я пошел по пути оглашения минимального по времени отрытого ордера и его последующего исключения в одном блоке модификации.
Таким образом, каждый тип ордеров модифицируется двумя блоками - модификация стопа, в которой участвуют все ордера, и модификация тейка где участвуют все кроме первого ордера.
Все модифицируется и выставляется, но теперь я столкнулся с новой проблемой - стоп и тейк не могут существовать одновременно.
Как только цена подходит к тейку в месте его пробития он снимается и включается стоп. Со стопом аналогично, как только цена на него наступает он снимается и включается тейк. Остается только метка где раньше был стоп или тейк.
Как можно исключить такое противодействие?
Вот для наглядности
if (BuyLots < SellLots)
{
if (BuyLots == 0 && SellCount>=2)
PriceSL = APrice - Spread;
for (i = 0; i < SellCount; i++)
if (OrderSelect(SellTicket[i], SELECT_BY_TICKET) && OrderCloseTime() == 0)
if (WaitForTradeContext())
{
RefreshRates();
if (!OrderModify(OrderTicket(), 0, PriceSL, 0, 0))
return(False);
}
if (BuyLots == 0 && SellCount>=2)
PriceTP = LastSellPrice - TakeProfit * Point;
for (i = 0; i < SellCount; i++)
if (OrderSelect(SellTicket[i], SELECT_BY_TICKET) && OrderCloseTime() == 0 &&
OrderOpenTime() != SellFirst)
if (WaitForTradeContext())
{
RefreshRates();
if (!OrderModify(OrderTicket(), 0, 0, NP(PriceTP + Spread), 0))
return(False);
}
}
Scriptong
27-09-2010, 16:10
Как можно исключить такое противодействие?
Не могу сказать точно, т.к. не уверен, что правильно понимаю суть вопроса. Но если посмотреть на приведенный вами код, то видно, что при модификации стопа вы обнуляете профит, а при модификации профита - обнуляете стоп. Этот блок взят из OverTake, где действительно невозможно было существование профита и стопа одновременно.
Если алгоритмически у вас возможно одновременное существование стопа и профита, замените 0 для профита и стопа в соответствующих местах OrderModify на OrderTakeProfit() и OrderStopLoss().
Поменял все стабильно, но теперь по тейку начала закрыватся не только вторая, но и первая сделка, как это изменить?
Scriptong
29-09-2010, 13:37
Поменял все стабильно, но теперь по тейку начала закрыватся не только вторая, но и первая сделка, как это изменить?
Значит, нужно добавить для каждого типа позиций по одному блоку, которые различают "первую" и "вторую" позиции. Если первая, то не ставить стоп/профит, а если вторая - ставить.
Этого будет недостаточно, поскольку стоп нужно применить ко всем ордерам, а тейк только ко второму, а при усреднении то и к третьему ордеру.
Если бы OrderTakeProfit(), в блоке где рассчитывается стоп, не переносил значение профита на первую сделку с блока, где рассчитывается тейк, то тогда бы все работало. Но это не реально, поскольку в блоке расчета стопа должен задействоваться весь открытый массив.
Scriptong
30-09-2010, 16:54
Этого будет недостаточно, поскольку стоп нужно применить ко всем ордерам, а тейк только ко второму, а при усреднении то и к третьему ордеру.
Если бы OrderTakeProfit(), в блоке где рассчитывается стоп, не переносил значение профита на первую сделку с блока, где рассчитывается тейк, то тогда бы все работало. Но это не реально, поскольку в блоке расчета стопа должен задействоваться весь открытый массив.
Ну значит не один блок, а столько, сколько потребуется для различных вариантов. Для первого сделайте изменение только стопа, а вместо профита ставьте в OrderModify тот же профит - OrderTakeProfit(). Для второго - меняйте стоп и профит. Для третьего, если нужно, меняйте профит, не меняя стопа. В общем, сделать логику можно.
В этом случае обязательно потребуется ранжирование ордеров по номеру. Кстати, в последней статье - Уровни ДиНаполи (http://fxtrade.ru/mqlabs/30.09.2010-mqlabs-urovni-dinapoli) - я применил именно такой метод распознавания ордеров. Посмотрите функции Trade и FindOrders.
Если вы чего-то не знаете, то в этом нет ничего зазорного. Поэтому извиняться вам не за что. Чтобы донести до программиста суть вашего задания, нужно просто разложить по полочкам, при каких условиях советник должен совершать то или иное действие. На этом этапе заказчик сам обнаруживает множество противоречий или ошибок в стратегии, что избавляет его от многократных обращений к программисту за "латанием дыр".
Насчет приведенного вами советника. Здесь убрано условие для первоначальной позиции. Поэтому единовременно происходит открытие и Buy, и Sell. В дальнейшем, при открытии дополнительных позиций, условие начинает работать. Условие очень простое - для BUY предыдущий бар должен быть бычьим, для SELL - медвежьим.
По поводу уровня написания советника не думаю, что вам будет интересно выслушивать мои комментарии. Сама же стратегия, как говорилось выше, ущербная, так как практически не анализирует рынок. Здесь уместно сравнить ее с перекати-поле - куда ветер подует, туда и пойдем. Не скрою, даже с такой стратегией может повезти, но везение бесконечным быть не может.
В общем, высказывайте свои пожелания. Что смогу, сделаю/переделаю.
Здравствуйте. Помогите пожалуйста с советником Proverka_1.4_7.03.2009.mq4 Мне нужно чтобы он открывал первые сделки исключительно по индикатору, для примера скажем по RSI.
if (iRSI(NULL, PERIOD_H1, 13, PRICE_CLOSE, 1) < 30.0)
{
ticket = OrderSend(Symbol(), OP_BUY, и так далее...
if (iRSI(NULL, PERIOD_H1, 13, PRICE_CLOSE, 1) > 70.0)
{
ticket = OrderSend(Symbol(), OP_SELL, и так далее...
есть еще один момент, если в тестере в свойства эксперта>тестирование>позиции> установить Long only или Short only
советник не торгует в выбраном направлении.(желательно исправить).
Очень бы хотелось услышать Ваш комментарий по поводу уровня написания советника.
Scriptong
15-10-2010, 10:15
Помогите пожалуйста с советником Proverka_1.4_7.03.2009.mq4
К сожалению, мне неизвестен советник с таким названием. А исходный его код вы не предоставили. Поэтому обсуждать пока нечего.
К сожалению, мне неизвестен советник с таким названием. А исходный его код вы не предоставили. Поэтому обсуждать пока нечего.
Советник в этой "ветке" пост №146, Вы его смотрели.
Scriptong
18-10-2010, 10:33
Советник в этой "ветке" пост №146, Вы его смотрели.
Так это одна из версий Илана. Присоединение индикаторов этой стратегии не поможет, т.к. у нее нет самого главного - признания собственных ошибок.
С чисто программной точки зрения это делается элементарно:
1) Добавляются входные параметры для RSI - RSIPeriod, RSIPrice, LowLevel, HighLevel, RSITF
2) Добавляется чтение значения индикатора в блоке принятия решения об открытии первой позиции
3) Добавляется условие нахождения линии индикатора выше/ниже HighLevel/LowLevel.
Так это одна из версий Илана. Присоединение индикаторов этой стратегии не поможет, т.к. у нее нет самого главного - признания собственных ошибок.
С чисто программной точки зрения это делается элементарно:
1) Добавляются входные параметры для RSI - RSIPeriod, RSIPrice, LowLevel, HighLevel, RSITF
2) Добавляется чтение значения индикатора в блоке принятия решения об открытии первой позиции
3) Добавляется условие нахождения линии индикатора выше/ниже HighLevel/LowLevel.
Большое спасибо. Действительно элементарно(теперь когда посмотрел как это делается). На счет стратегии позвольте несколько слов, если ввести стоплосс, трейлингстоп и ограничиться максимальным количеством открытых ордеров 1, то это будет самый обыкновенный советник. Спасибо.
Scriptong
18-10-2010, 13:32
На счет стратегии позвольте несколько слов, если ввести стоплосс, трейлингстоп и ограничиться максимальным количеством открытых ордеров 1, то это будет самый обыкновенный советник. Спасибо.
Согласен. Только в этом случае код программы можно будет свести к двум-трем функциям.
Так это одна из версий Илана. Присоединение индикаторов этой стратегии не поможет, т.к. у нее нет самого главного - признания собственных ошибок.
С чисто программной точки зрения это делается элементарно:
1) Добавляются входные параметры для RSI - RSIPeriod, RSIPrice, LowLevel, HighLevel, RSITF
2) Добавляется чтение значения индикатора в блоке принятия решения об открытии первой позиции
3) Добавляется условие нахождения линии индикатора выше/ниже HighLevel/LowLevel.
Здравствуйте. Советник работает спасибо. Подскажите пожалуйста как немгого изменить функцию увеличения стартового лота при достижении определенного баланса.
Имеем: пользовательские настройки.
extern bool FixLot=true; //фиксированный или нет лот.
extern int LotStep = 2000; //шаг увеличения лота. т.е. сколько в депозите LotStep востолько увеличится LotSize.
Код советника:
//Вычисляем размер первого лота
double NewLot(string OrdType)
{
double tLots;
double minlot = MarketInfo(Symbol(), MODE_MINLOT);
if (OrdType=="buy")
{
if (FixLot) tLots = Buy_LotSize;
else tLots = NormalizeDouble(Buy_LotSize * NormalizeDouble(AccountBalance()/LotStep,0), LotDecimal);
}
if (OrdType=="sell")
{
if (FixLot) tLots = Sell_LotSize;
else tLots = NormalizeDouble(Sell_LotSize * NormalizeDouble(AccountBalance()/LotStep,0), LotDecimal);
}
if(tLots < minlot) tLots = minlot;
return(tLots);
В этом (авторском) варианте величина начального лота увеличивается на величину начального лота (удваивается) при достижении указанного депозита.
Мне же нужно чтобы величина начального лота при достижении указанного депозита увеличивалась на выбранную пользователем величину. Я вывел в пользовательские настройки эти величины:
extern string GeneralBlock = "-------Общие параметры-------";
extern bool FixLot = true; //фиксированный или нет лот.
extern int Balance = 5000; // Размер депозита для увеличения стартового лота
extern double Buy_LotSizePlus = 0.01; // Увеличение стартового лота на величину Buy_LotSizePlus
extern double Sell_LotSizePlus = 0.01; // Увеличение стартового лота на величину Sell_LotSizePlus
и переименовал LotStep на Balance. Внес измененя в код советника
//Вычисляем размер первого лота
double NewLot(string OrdType)
{
double iLots;
double minlot = MarketInfo(Symbol(), MODE_MINLOT);
if (OrdType=="buy")
{
if (FixLot) iLots = Buy_LotSize;
else iLots = NormalizeDouble(Buy_LotSize + Buy_LotSizePlus * NormalizeDouble(AccountBalance()/Balance,0), LotDecimal);
}
if (OrdType=="sell")
{
if (FixLot) iLots = Sell_LotSize;
else iLots = NormalizeDouble(Sell_LotSize + Sell_LotSizePlus * NormalizeDouble(AccountBalance()/Balance ,0), LotDecimal);
}
if(iLots < minlot) iLots = minlot;
return(iLots);
}
У меня не получается...
Scriptong
22-10-2010, 13:07
У меня не получается...
Не могу понять, что у вас не получается. Направление мысли - правильное, реализация, в принципе, тоже. Я могу только посоветовать немного универсализировать и уменьшить код:
double NewLot(string OrdType)
{
if (OrdType=="buy")
{
if (FixLot)
iLots = Buy_LotSize;
else
iLots = LotRound(Buy_LotSize + Buy_LotSizePlus * MathFloor(AccountBalance()/Balance));
}
if (OrdType=="sell")
{
if (FixLot)
iLots = Sell_LotSize;
else
iLots = LotRound(Sell_LotSize + Sell_LotSizePlus * MathFloor(AccountBalance()/Balance));
}
return(iLots);
}
Функция LotRound доступна в каждом моем советнике. Расчет минимального и максимального лота лучше производить в теле функции инициализации советника (также см. первый блок функции init в любом моем советнике).
Не могу понять, что у вас не получается. Направление мысли - правильное, реализация, в принципе, тоже. Я могу только посоветовать немного универсализировать и уменьшить код:
double NewLot(string OrdType)
{
if (OrdType=="buy")
{
if (FixLot)
iLots = Buy_LotSize;
else
iLots = LotRound(Buy_LotSize + Buy_LotSizePlus * MathFloor(AccountBalance()/Balance));
}
if (OrdType=="sell")
{
if (FixLot)
iLots = Sell_LotSize;
else
iLots = LotRound(Sell_LotSize + Sell_LotSizePlus * MathFloor(AccountBalance()/Balance));
}
return(iLots);
}
Функция LotRound доступна в каждом моем советнике. Расчет минимального и максимального лота лучше производить в теле функции инициализации советника (также см. первый блок функции init в любом моем советнике).
Спасибо, работает. Я не мог найти математическую функцию MathFloor, вернее я их нашел но не понимаю что они означают. Возможно в учебнике ошибка?
double MathCeil( double x)
Функция возвращает числовое значение, представляющую наименьшее целое число, которое больше или равно x.
Параметры:
x - Числовая величина.
Пример:
double y;
y=MathCeil(2.8);
Print("наименьшее целое число для 2.8 есть ",y);
y=MathCeil(-2.8);
Print("наименьшее целое число для -2.8 есть ",y);
/*Вывод:
наименьшее целое число для 2.8 есть 3
наименьшее целое число для -2.8 есть -2*/
double MathFloor( double x)
Функция возвращает числовое значение, представляющее наибольшее целое число, которое меньше или равно x.
Параметры:
x - Числовое значение.
Пример:
double y;
y=MathFloor(2.8);
Print("Наименьшее целое от 2.8 есть ",y);
y=MathFloor(-2.8);
Print("Наименьшее целое от -2.8 есть ",y);
/*Вывод:
Наименьшее целое от 2.8 есть 2
Наименьшее целое от -2.8 есть -3*/
я же говорю что мне сами примеры непонятны... в описании функций MathFloor и MathCeil наибольшее и наименьшее наверно надо поменять местами и выводы должны быть разные в одном случае наибольшее число в другом наименьшее ... написано одинаково а цыфры разные. Спасибо.
Scriptong
22-10-2010, 14:01
я же говорю что мне сами примеры непонятны... в описании функций MathFloor и MathCeil наибольшее и наименьшее наверно надо поменять местами и выводы должны быть разные в одном случае наибольшее число в другом наименьшее ... написано одинаково а цыфры разные. Спасибо.
Под наибольшим и наименьшим числом понимается не абсолютная величина числа. Поэтому -2 больше, чем -2.8 (-2 на оси абсцисс находится правее, чем -2.8), а -3 меньше -2.8. Отсюда справедливо, что MathFloor(-2.8) = -3, а MathCeil(-2.8) = -2. Также справедливо, что MathFloor(2.8) = 2, а MathCeil(2.8) = 3, т.к. 2 меньше, чем 2.8, а 3 больше, чем 2.8.
Под наибольшим и наименьшим числом понимается не абсолютная величина числа. Поэтому -2 больше, чем -2.8 (-2 на оси абсцисс находится правее, чем -2.8), а -3 меньше -2.8. Отсюда справедливо, что MathFloor(-2.8) = -3, а MathCeil(-2.8) = -2. Также справедливо, что MathFloor(2.8) = 2, а MathCeil(2.8) = 3, т.к. 2 меньше, чем 2.8, а 3 больше, чем 2.8.
Это я понимаю. А вот это нет:
/*Вывод:
наименьшее целое число для 2.8 есть 3
наименьшее целое число для -2.8 есть -2*/
/*Вывод:
Наименьшее целое от 2.8 есть 2
Наименьшее целое от -2.8 есть -3*/
Идет какаято игра слов. Если написать что MathFloor возвращает ближайшее меньшее а MathCeil ближайшее большее число то вопросов нет, все понятно.
Scriptong
22-10-2010, 15:06
/*Вывод:
Наименьшее целое от 2.8 есть 2
Наименьшее целое от -2.8 есть -3*/
Идет какаято игра слов. Если написать что MathFloor возвращает ближайшее меньшее а MathCeil ближайшее большее число то вопросов нет, все понятно.
Понял, о чем вы. Действительно не заметил. Сейчас проверил - в справке некорректная формулировка по отношению к MathCeil и MathFloor. Действительно сбивает с толку. В их стиле правильно нужно было бы так:
Наименьшее целое, которое больше 2.8, есть 3
Наименьшее целое, которое больше -2.8 есть -2
и так:
Наибольшее целое, которое меньше 2.8, есть 2
Наибольшее целое, которое меньше -2.8 есть -3
Сейчас припоминаю, что и у меня были подобные проблемы с восприятием этих функций. В конце концов запомнил так: Floor - пол, значит будет получено ближайшее меньшее целое число; Ceil - потолок, значит будет получено ближайшее большее целое число.
Наиболее корректно описание этих функций следовало бы составить так:
double MathFloor( double x)
Функция возвращает числовое значение, представляющее ближайшее целое число, которое меньше или равно x.
double MathCeil( double x)
Функция возвращает числовое значение, представляющую ближайшее целое число, которое больше или равно x.
Здравствуйте! Помогите пожалуйста новичку разобраться с настройками изначального советника Ilan 1.4, кредитное плечо 1:100
Вот мои примерные настройки, подскажите если, что не так.Какой должен быть депозит,чтоб хватило подушки безопасности от слива депо?
Спасибо!
MM Type 1
Use Close False
Use Add True
Lot Exponent 1.667
Slip 3.0
Lots 0.1
Lots Digits 2.0
Take Profit 10.0
Pip Step 30.0
Max Trades 10
Use Inquity Stop False
Total Inquity RisK 20
Use Trailing Stop False
Use Time Out False
Max Trade Open Hours 48
Scriptong
26-10-2010, 21:37
Здравствуйте! Помогите пожалуйста новичку разобраться с настройками изначального советника Ilan 1.4, кредитное плечо 1:100
Вот мои примерные настройки, подскажите если, что не так.Какой должен быть депозит,чтоб хватило подушки безопасности от слива депо?
Ilan - это одна из разновидностей метода Мартингейла. А с такой методикой никакого депозита не хватит. Ни в коем случае не пытайтесь использовать на реальном счете! Первое время может и повезти, но в недалеком будущем слив депозита любого размера обеспечен.
Спасибо за компетентный ответ! Подскажите тогда, почему на демо всё красиво и убедительно? Начинал на демо с 10 000, когда набралось 15 000 выдержал просадку 450 пунктов,сейчас депо вырос до 21 000 за три недели.Подскажите пожалуйста где собака зарыта? Разве на реале к примеру, при моих настройках при работе с лотом 0.1 при депо 3 000 не хватит? (даже при просадке 1 000 пунктов) Или на реале он работает только на слив?
Спасибо за компетентный ответ! Подскажите тогда, почему на демо всё красиво и убедительно? Начинал на демо с 10 000, когда набралось 15 000 выдержал просадку 450 пунктов,сейчас депо вырос до 21 000 за три недели.Подскажите пожалуйста где собака зарыта? Разве на реале к примеру, при моих настройках при работе с лотом 0.1 при депо 3 000 не хватит? (даже при просадке 1 000 пунктов) Или на реале он работает только на слив?
Протестируй на истории и в конце всегда слив :(
Я тестировал сначала три месяца - слив в конце, потом год и два года в конце всегда слив рано или поздно! :(
Более подробно не разбирался, просто интересно по тестировать было.
Почему в конце слив досконально ответить не могу, но догадываюсь. :rolleyes:
Если честно самому интересно. :confused:
Лично для меня, как Мартингейл так и Ilan сыр в мышеловке !!! :)
И вообще нарушение ММ к хорошему в долгосрочной перспективе не приведёт. :)
Scriptong
28-10-2010, 09:56
Почему в конце слив досконально ответить не могу, но догадываюсь. :rolleyes:
Если честно самому интересно. :confused:
Слив не в конце. Относительно выбранного диапазона тестирования он может находиться в любом месте. Во время падения баланса к нулю тестирование автоматически прекращается всвязи с нехваткой средств. Отсюда иллюзия получения слива в конце тестирования.
Печальный конец всех стратегий мартингейла объясняется просто. Большую часть времени цена колеблется в некотором диапазоне и возвращается к уровню открытия сделки. Но через какое-то время цена все же переходит на другой, т.е. не возвращается к моменту входа, а советник пытается и дальше усредняться, теряя депозит.
Так это одна из версий Илана. Присоединение индикаторов этой стратегии не поможет, т.к. у нее нет самого главного - признания собственных ошибок.
С чисто программной точки зрения это делается элементарно:
1) Добавляются входные параметры для RSI - RSIPeriod, RSIPrice, LowLevel, HighLevel, RSITF
2) Добавляется чтение значения индикатора в блоке принятия решения об открытии первой позиции
3) Добавляется условие нахождения линии индикатора выше/ниже HighLevel/LowLevel.
Уважаемый Scriptong, добавьте пожалуйста в этот советник двух уровневый трелинг стоп, например от комлексного советника.
пост 296 проверка.
Scriptong
14-11-2010, 10:17
Уважаемый Scriptong, добавьте пожалуйста в этот советник двух уровневый трелинг стоп, например от комлексного советника.
пост 296 проверка.
Вы имеете в виду снабжение Ilan'a трейлинг-стопом? В этом случае теряется даже элементарная идея советника - закрытие любого набора сделок с общей прибылью. Представьте себе ситуацию: у одного из добавленных ордеров появляется стоп в результате работы трейлинг-стопа. В то же время стоп остальных ордеров еще невозможно перенести в безубыток, т.к. цена еще не дошла даже до уровня их открытия.
Скорее всего, дополнительный ордер будет обособлено закрыт по стопу, оставив остальные ордера "не у дел".
Ваше предложение не имеет смысла само по себе, а только в комплексе с решением других проблем стратегии.
Вы имеете в виду снабжение Ilan'a трейлинг-стопом? В этом случае теряется даже элементарная идея советника - закрытие любого набора сделок с общей прибылью. Представьте себе ситуацию: у одного из добавленных ордеров появляется стоп в результате работы трейлинг-стопа. В то же время стоп остальных ордеров еще невозможно перенести в безубыток, т.к. цена еще не дошла даже до уровня их открытия.
Скорее всего, дополнительный ордер будет обособлено закрыт по стопу, оставив остальные ордера "не у дел".
Ваше предложение не имеет смысла само по себе, а только в комплексе с решением других проблем стратегии.
В моем "приготовлении" советник работает и приносит прибыль но я беру крохи(30 пунктов) с движения в 150-200 пунктов. Тралить нужно не каждый ордер в отдельности а серию если таковая образовалась. При моих настройках если ордеров два и тейк профит 30 оба ордера закрываются с плюсом. Суть в следующем установить тейк профит скажем 250 а трейлинг стоп1 - 30 пунктов, тогда когда цена дойдет до этой величины + спред установится общий стоп лосс а при дальшейшем движении цены включится в работу трейлинг стоп2. Возможно объясняю "коряво" не грамотно. В иланах, мартинах и проверке тейк профит общий для серии и не один и тотже для каждого ордера(усредненный) точно также должен быть общий трелинг стоп(усредненный) и если ордеров будет много (больше 3 то один или несколько закроются с убытком, ничего здесь не поделать) - переносить в безубыток серию(трелинг стоп1) и тралить её дальше (трейлинг стоп2).
Scriptong
15-11-2010, 13:54
Тралить нужно не каждый ордер в отдельности а серию если таковая образовалась.
Тогда речь уже идет о подтяжке стопа относительно уровня безубыточности серии. В таком случае требуется, чтобы общий профит был достаточно далеко от БУ. Только в такой ситуации стоп успеет подтянуться.
Тогда речь уже идет о подтяжке стопа относительно уровня безубыточности серии. В таком случае требуется, чтобы общий профит был достаточно далеко от БУ. Только в такой ситуации стоп успеет подтянуться.
Да совершенно верно.
Scriptong
17-11-2010, 19:05
В этом случае необходимо пересмотреть саму идеологию Ilan'a, т.к. условия реализации предложенного нововведения не очевидны. Только у меня существует три варианта внесения изменений. Что уж говорить о широкой общественности.
В этом случае необходимо пересмотреть саму идеологию Ilan'a, т.к. условия реализации предложенного нововведения не очевидны. Только у меня существует три варианта внесения изменений. Что уж говорить о широкой общественности.
С удовольствием потестировал бы все три.
Scriptong
21-11-2010, 13:22
С удовольствием потестировал бы все три.
:rolleyes: А почему не десять?
Просто гениально: вам даже много слов писать не пришлось не говоря уже о том, чтобы составить ТЗ. Пусть Scriptong напишет три советника, а мы посмотрим, нужны нам такие вообще или нет.
:rolleyes: А почему не десять?
Просто гениально: вам даже много слов писать не пришлось не говоря уже о том, чтобы составить ТЗ. Пусть Scriptong напишет три советника, а мы посмотрим, нужны нам такие вообще или нет.
Я извиняюсь, не могу составить грамотно ТЗ(могу объяснить своими словами). А на счет количества тестирую все Ваши советники.
Scriptong
22-11-2010, 11:19
Я извиняюсь, не могу составить грамотно ТЗ(могу объяснить своими словами).
Объясните своими словами. В этом случае понадобится больше времени на уяснение нюансов: вы объясняете - я задаю уточняющие вопросы - вы снова объясняете - я задаю следующие вопросы. И в таком режиме до тех пор, пока не отпадут уточняющие вопросы, т.е. пока не получим готовность уровня техзадания.
Объясните своими словами. В этом случае понадобится больше времени на уяснение нюансов: вы объясняете - я задаю уточняющие вопросы - вы снова объясняете - я задаю следующие вопросы. И в таком режиме до тех пор, пока не отпадут уточняющие вопросы, т.е. пока не получим готовность уровня техзадания.
Попробую. в советнике возможно наличие нескольких ордеров в "одну сторону"(они открываются пытаясь усредниться, зайти по лучшей цене), при этом если установить тейкпрофит в 30 пунктов то он будет 30 пунктов для одного ордера если откроется еще один то тейк профит пересчитается и будует уже другим не 30 пунктов при 3х ордерах уровень тейк профита для 1 ордера будет уже в убытке, хотя вся серия будет в плюсе. мне надо чтобы советник устанавливал стоп лосс на этот уровень(трелинг стоп1) при этом сам тейк профит нужно устанавливать на много дальше предположим 250 пунктов. получится что трелинг стоп1 установит стоп лосс для серии(или одного) ордера так как будто если это был уровень тейк профита в 30 пунктов, тоесть какбы "гарантрованные свои 30 пунктов " ну а если цена и дальше будет идти в нашу сторону в работу вступает трелинг стоп2 и точно также тралить всю серию (или один ордер). возможно надо использовать переменную AveragePrice
Scriptong
24-11-2010, 19:02
Итак, профит у всех ордеров должен быть общий. Но каким образом он должен рассчитываться? В случае с одной позицией понятно: просто на 250 пунктов от цены открытия сделки.
Но вот если сделки две, то установка профита на 250 пунктов от средней цены открытия даст общую прибыль 500 пунктов (если объем сделок равен). С тремя сделками получим уже 750 пунктов и т.д. Такой вариант?
По стопу вроде понятно - обычный трал средней цены открытия.
Итак, профит у всех ордеров должен быть общий. Но каким образом он должен рассчитываться? В случае с одной позицией понятно: просто на 250 пунктов от цены открытия сделки.
Но вот если сделки две, то установка профита на 250 пунктов от средней цены открытия даст общую прибыль 500 пунктов (если объем сделок равен). С тремя сделками получим уже 750 пунктов и т.д. Такой вариант?
По стопу вроде понятно - обычный трал средней цены открытия.
С тейк профитом ни чего делать не нужно он работает по средней цене (если ордеров несколько) и как обычный тейк профит если ордер один.
void Сorrect(string OrdType)
{
int trade;
double TP_all;
double AveragePrice;
AveragePrice = AveragePrice(OrdType);
for(trade=OrdersTotal()-1;trade>=0;trade--)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber) continue;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
{
if (OrdType=="buy")
{
if(OrderType()==OP_BUY)
{
TP_all = AveragePrice+Buy_TP*Point;
if (MathAbs(OrderTakeProfit() - TP_all) >= Tick)
{
Print("Модифицируем покупку. Безубыток = "+AveragePrice+", ТР = "+Buy_TP+" Новый уровень = "+TP_all);
OrderModify(OrderTicket(), 0, OrderStopLoss(), NP(TP_all), 0, Yellow);
}
}
}
if (OrdType=="sell")
{
if(OrderType()==OP_SELL)
{
TP_all = AveragePrice-Sell_TP*Point;
if (MathAbs(OrderTakeProfit() - TP_all) >= Tick)
{
Print("Модифицируем продажу. Безубыток = "+AveragePrice+", ТР = "+Sell_TP+" Новый уровень = "+TP_all);
OrderModify(OrderTicket(), 0, OrderStopLoss(), NP(TP_all), 0, Yellow);
}
}
}
}
}
}
просто если установить тейк профит маленький предположим 30 пунктов то трейлинг стоп1, 2 в работу просто не включатся.
Scriptong
25-11-2010, 19:21
Выходит, что профит в деньгах увеличивается с каждой новой сделкой, в пунктах оставаясь неизменной величиной?
Выходит, что профит в деньгах увеличивается с каждой новой сделкой, в пунктах оставаясь неизменной величиной?
Да так и получается в моем случае профит 30 пунктов (чтобы не жадничать) почти всегда срабатывает с одного двух ордерв. Я работаю на "бешенной" паре GBP/JPY на 4 часовом тф и движение в 150-200 пунктов в неделю как бы закономерны. Хочу переложить получение прибыли не на тейк профит а на трейлинг стоп.
Scriptong
28-11-2010, 20:27
Хочу переложить получение прибыли не на тейк профит а на трейлинг стоп.
В этом подходе получается, что мы все время недополучаем - вместо профита срабатывает стоп.
Итак, профит остается там же?
В этом подходе получается, что мы все время недополучаем - вместо профита срабатывает стоп.
Итак, профит остается там же?
Да выходит так, ну если сработает тейк это будет празник : )
Трелинг стоп1,2 я рассматриваю как некоторую гарантию получения прибыли если движение будет однонаправленным то сработает и профит
Scriptong
30-11-2010, 12:25
Четвертая версия Ilan'a.
Добавлены параметры TrailingStop1 и TrailingStop2. Первый срабатывает однократно, перенося уровень стопа на среднюю цену открытия позиций. Второй включается после вывода сделок в безубыток и работает как обычный трейлинг-стоп в пунктах.
Также в настроечные параметры перенесен переключатель UseTrailingStop, при помощи которого можно включать и выключать работу скользящего стопа.
Из входных параметров эксперта убраны неиспользуемые параметры. Такая же участь постигла некоторые глобальные переменные советника.
Четвертая версия Ilan'a.
Добавлены параметры TrailingStop1 и TrailingStop2. Первый срабатывает однократно, перенося уровень стопа на среднюю цену открытия позиций. Второй включается после вывода сделок в безубыток и работает как обычный трейлинг-стоп в пунктах.
Также в настроечные параметры перенесен переключатель UseTrailingStop, при помощи которого можно включать и выключать работу скользящего стопа.
Из входных параметров эксперта убраны неиспользуемые параметры. Такая же участь постигла некоторые глобальные переменные советника.
Большое спасибо!
Scriptong
02-12-2010, 15:17
Большое спасибо!
Пожалуйста
А есть ли советник, который не сливает депозит?
Scriptong
19-03-2011, 20:44
А есть ли советник, который не сливает депозит?
Есть. Правда, он его и не увеличивает...:)
Powered by vBulletin® Version 4.1.8 Copyright © 2012 vBulletin Solutions, Inc. All rights reserved.