Кто нибудь делал советник на индикаторе Зиг заг, отзовитесь, нужна помощь!
Доработка советников: общая тема📌
От Garfik, 4 августа, 2011 в Уголок Программиста
23 часа назад, Rigal сказал:Я не понимаю, что вы считаете в табличке выше - возможно, в этом есть какое-то зерно, но его нужно прорастить.
Сдается мне, вы говорите о том, сколько умножений выдержит депозит.
А в контексте гораздо более осмысленно было бы оценить, может ли эта система приносить больше прибыли за счет умножения.
Если я неправильно вас понял - вы меня поправьте, пожалуйста?
Процент риска в целом не имеет значения, можно рассматривать систему с постоянным лотом и множить лот.
У вас максимальное число непрерывных проигрышей выше числа непрерывных выигрышей.
Более того, средний непрерывный выигрыш один, а средний непрерывный проигрыш - 3.
Такой баланс предлагает считать, что после проигрыша выгоднее делить риск пополам, а не умножать, потому, что после проигрыша гораздо более вероятен проигрыш.
Ну и у вас статистика из 67 сделок и не видно, какой интервал протестирован - даже этот малоинтересный результат вполне может быть результатом cherry picking.
Давайте вы, если хотите, чтобы кто-то сел и поработал, вы как-то сядьте и поработайте сперва, чтобы убедиться хотя бы для себя, что эта работа имеет смысл?
. . . какой интервал протестирован - H1
23 часа назад, Rigal сказал:Что важнее: процент проигрышных и выигрышных сделок - в районе трети.
То есть система может быть прибыльна только за счет высокого RR.
Такие системы имеют отрицательное матожидание с мартингейлом.
"То есть система может быть прибыльна только за счет высокого RR." В советнике это реализовано, ТП вообще может быть отсутствовать в расчете на рост безграничной прибыли, но как видно из теста, что не всегда это работает. Ну а по поводу увеличения риска после получения SL можно воздух сотресать до бесконечности пока не сделаем тест. И я считаю, что процент проигрышных и выигрышных сделок - в районе трети за период 16 месяцев на ТФ Н1 совсем не плох.
Если я сделаю тест (ТФ Н1, ТП=1.62*SL) в ручном режиме на симуляторе за шесть месяцев Вас такой объём работы устроит?
1 час назад, drobayura сказал:"То есть система может быть прибыльна только за счет высокого RR." В советнике это реализовано, ТП вообще может быть отсутствовать в расчете на рост безграничной прибыли, но как видно из теста, что не всегда это работает. Ну а по поводу увеличения риска после получения SL можно воздух сотресать до бесконечности пока не сделаем тест. И я считаю, что процент проигрышных и выигрышных сделок - в районе трети за период 16 месяцев на ТФ Н1 совсем не плох.
Если я сделаю тест (ТФ Н1, ТП=1.62*SL) в ручном режиме на симуляторе за шесть месяцев Вас такой объём работы устроит?
Вот результаты теста в ручном режиме на симуляторе с 03.10.22 по сегодняшний день (ТФ Н1, ТП=1.62*SL без трала с начальным депозитом 1000)
да не надо делать тестов в ручном режиме за 6 месяцев.
Вообще делать тесты за 6 месяцев не надо.
Меньше, чем за пятилетку - вы занимаетесь cherry picking. На русском это называется подгонка фактов под теорию.
2 часа назад, drobayura сказал:Ну а по поводу увеличения риска после получения SL можно воздух сотресать до бесконечности пока не сделаем тест
Сотресать воздух можно сколько угодно и по поводу того, сколько будет дважды два.
Есть такая наука матстатистика.
Она позволяет оценить вероятности событий, исходя из количества этих событий, на статистически значимой выборке.
У вас выше во всех тестах
а) выборка статистически не значимая
б) если проигнорировать пункт а) и довериться вашим данным - они говорят, что вероятность потери вдвое выше вероятности выигрыша
В итоге, умножая на два в любом месте, вы просите вдвое больший убыток вдвое чаще, чем удвоенную прибыль.
При этом вы упорно не делаете более длительного теста и не показали ни сета, ни отчета тестера.
Памятуя ваши подвиги на форуме в прошлом, я не очень склонен доверять вашим скриншотам и уж подавно вашим намереньям - так что если вы хотите какие-то изменения в коде, вы будьте так любезны, выложите ваш сет и результат теста.
Я прогоню его на нормальных котировках за нормальный период и у меня будет возможность убедиться в том, что я был неправ, когда я эти изменения внесу
А я перечитал историю нашего с вами, @drobayura, общения.
Вопрос закрыт, спасибо за неоценимый вклад, не болейте.
7 часов назад, Rigal сказал:А я перечитал историю нашего с вами, @drobayura, общения.
Вопрос закрыт, спасибо за неоценимый вклад, не болейте.
Чем же я Вас обидел, вроде всегда общался с Вами корректно. Прошу прощения, если ,что не так. Мне очень жаль.
cm ea manual grid.mq4Здравствуйте уважаемые программисты! Могли бы вы изменить немного этот помощник для торговли . Когда я закрываю сеть открытых ордеров, старые отложки не удаляются, а продолжают в том же порядке открываться. для обнуления я отключаю функцию открытия отложек, они удаляются, снова включаю чтобы строилась новая сетка. Можете это сделать на автомате, чтобы при закрытии ордеров отложенные старые ордера удалялись и строилась новая сетка. Что-то похожее есть в пирамидинге, но там нет панели управления и много мне ненужного, а мне нужно просто открывать отложки в нужном направлении
int TrailingStopOrders = 20; // Фиксированный размер трала StopOrders
int TrailingStepStop = 3; // Шаг трала StopOrders
int TrailingLimitOrders = 30; // Фиксированный размер трала LimitOrders
int TrailingStepLimit = 3; // Шаг трала LimitOrders
color clModifyBuyOrder = clrNONE; // Цвет значка модификации покупки
color clModifySellOrder = clrNONE; // Цвет значка модификации продажи
//===============================================================================================
//------------------------- Сопровождение Stop ордеров простым тралом --------------------------+
//===============================================================================================
void TrailingStopOrder(stringsymb="0",int type=-1,int mg=-1) {
double di=0, pa=0, pb=0, p=0, sl=0, tp=0;
if(symb=="0") { symb=Symbol();}
p=MarketInfo(symb,MODE_POINT);
int msl=(int)MarketInfo(symb, MODE_STOPLEVEL);
if(TrailingStopOrders<msl) {
Alert("TrailingStopOrder(): Значение меньше допустимого=",TrailingStopOrders/Sign,", Минимум=",msl/Sign);
TrailingStopOrders=msl;} else{TrailingStopOrders=TrailingStopOrders;}
for(int i=0; i<OrdersTotal(); i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if((OrderSymbol()==symb||symb=="")&&(type<0||OrderType()==type)&&(mg<0||OrderMagicNumber()==mg)) {
if(OrderType()==OP_BUYSTOP) {
pa=MarketInfo(symb,MODE_ASK);
if(OrderOpenPrice()-pa>(TrailingStopOrders+TrailingStepStop-1)*p) {
di=OrderOpenPrice()-pa-(TrailingStopOrders*p);
if(OrderStopLoss()>0) sl=OrderStopLoss()-di; else sl=0;
if(OrderTakeProfit()>0) tp=OrderTakeProfit()-di; else tp=0;
ModifyOrder(symb,pa+(TrailingStopOrders*p), sl, tp, clModifyBuyOrder);
}}
if(OrderType()==OP_SELLSTOP) {
pb=MarketInfo(symb,MODE_BID);
if(pb-OrderOpenPrice()>(TrailingStopOrders+TrailingStepStop-1)*p) {
di=pb-OrderOpenPrice()-(TrailingStopOrders*p);
if(OrderStopLoss()>0) sl=OrderStopLoss()+di; else sl=0;
if(OrderTakeProfit()>0) tp=OrderTakeProfit()+di; else tp=0;
ModifyOrder(symb,pb-(TrailingStopOrders*p), sl, tp, clModifySellOrder);
}}
}}}}
//===============================================================================================
//------------------------- Сопровождение Limit ордеров простым тралом -------------------------+
//===============================================================================================
void TrailingLimitOrder(stringsymb="0",int type=-1,int mg=-1) {
double di=0, pa=0, pb=0, p=0, sl=0, tp=0;
if(symb=="0") { symb=Symbol();}
p=MarketInfo(symb,MODE_POINT);
int msl=(int)MarketInfo(symb, MODE_STOPLEVEL);
if(TrailingLimitOrders<msl) {
Alert("TrailingLimitOrder(): Значение меньше допустимого=",TrailingLimitOrders/Sign,", Минимум=",msl/Sign);
TrailingLimitOrders=msl; } else { TrailingLimitOrders=TrailingLimitOrders; }
for(int i=0; i<OrdersTotal(); i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if((OrderSymbol()==symb||symb=="")&&(type<0||OrderType()==type)&&(mg<0||OrderMagicNumber()==mg)) {
if(OrderType()==OP_BUYLIMIT) {
pa=MarketInfo(symb,MODE_ASK);
if(pa-OrderOpenPrice()>(TrailingLimitOrders+TrailingStepLimit-1)*p) {
di=pa-OrderOpenPrice()-(TrailingLimitOrders*p);
if(OrderStopLoss()>0) sl=OrderStopLoss()+di; else sl=0;
if(OrderTakeProfit()>0) tp=OrderTakeProfit()+di; else tp=0;
ModifyOrder(symb,pa-(TrailingLimitOrders*p), sl, tp, clModifyBuyOrder);
}}
if(OrderType()==OP_SELLLIMIT) {
pb=MarketInfo(symb,MODE_BID);
if(OrderOpenPrice()-pb>(TrailingLimitOrders+TrailingStepLimit-1)*p) {
di=OrderOpenPrice()-pb-(TrailingLimitOrders*p);
if(OrderStopLoss()>0) sl=OrderStopLoss()-di; else sl=0;
if(OrderTakeProfit()>0) tp=OrderTakeProfit()-di; else tp=0;
ModifyOrder(symb,pb+(TrailingLimitOrders*p), sl, tp, clModifySellOrder);
}}
}}}}
еще нашёл такой код для трала отложек
cmea manual gird.mq4 Добавил трал к лимиту но в тестере через определенное время останавливается тест
Изменено 6 мая, 2023 пользователем Lexa000
4 часа назад, Lexa000 сказал:cmea manual gird.mq4 Добавил трал к лимиту но в тестере через определенное время останавливается тест
Оказалось два трала конфликтуют
cmea manual gird.mq4Вот такой вышел помощник трал лимитом

Получилось неплохо
cmea manual gird.mq4еще немного подредактировал
ButtonCreate(0,"cm off",0,225,y,210,20,Text(LANGUAGE,"Отключение после взятия профита","Shutdown after taking profit"),"Arial",8,clrBlack,clrLightGray,clrLightGray,clrNONE);
В кнопках вообще не разбираюсь, просто удалил функцию
Добрый день,программисты! Подскажите,пожалуйста,почему советник открывает покупки с шагом,а продажи разом,без шага? Спасибо
В 07.05.2023 в 18:31, Lexa000 сказал:cmea manual gird.mq4еще немного подредактировал
ButtonCreate(0,"cm off",0,225,y,210,20,Text(LANGUAGE,"Отключение после взятия профита","Shutdown after taking profit"),"Arial",8,clrBlack,clrLightGray,clrLightGray,clrNONE);
В кнопках вообще не разбираюсь, просто удалил функцию
Здравствуйте уважаемые программисты! Кто может помочь подправить советник, чтобы он тралил сеть ордеров не нарушая дистанцию между ордерами?
В 09.05.2023 в 18:25, Lexa000 сказал:Здравствуйте уважаемые программисты! Кто может помочь подправить советник, чтобы он тралил сеть ордеров не нарушая дистанцию между ордерами?
Я не совсем понимаю задачу в такой формулировке.
Каким образом трал нарушает дистанцию между ордерами?
Если он тралит все ордера разом - он и закроет их все разом.
Если он тралит каждый ордер отдельно - он закроет только те, что тралит. На дистанцию это как бы не должно влиять?
1 час назад, Rigal сказал:Я не совсем понимаю задачу в такой формулировке.
Каким образом трал нарушает дистанцию между ордерами?
Если он тралит все ордера разом - он и закроет их все разом.
Если он тралит каждый ордер отдельно - он закроет только те, что тралит. На дистанцию это как бы не должно влиять?
Уважаемый Rigal, я говорил об отложенных ордерах, когда-то LUKA написал советник в 2013 тянулка 1+1 такой советник, который тянет два лимитных ордера на определенной дистанции. Я его проверить не могу, потому что он уже не торгует. Мне будет достаточно трала даже двух лимитных ордеров. Или другой вариант, если открывать лимитные ордера по одному, чтобы они также увеличивались плюс один как открываются по два, как то так
13 минут назад, Lexa000 сказал:Уважаемый Rigal, я говорил об отложенных ордерах, когда-то LUKA написал советник в 2013 тянулка 1+1 такой советник, который тянет два лимитных ордера на определенной дистанции. Я его проверить не могу, потому что он уже не торгует. Мне будет достаточно трала даже двух лимитных ордеров. Или другой вариант, если открывать лимитные ордера по одному, чтобы они также увеличивались плюс один как открываются по два, как то так
Мне из вашего объяснения по-прежнему непонятно, что вы хотите.
У вас, вероятно, есть контекст - вы знаете, что написал Luka и как оно должно бы работать.
Я - нет. И было бы здорово, если бы мне не нужно было поднимать весь этот контекст.
Опишите, пожалуйста, желаемое поведение, подробно.
Я уверен, что писать там на полчаса и с нуля мне будет гораздо быстрее, чем ковыряться в чужом коде.
54 минуты назад, Rigal сказал:Мне из вашего объяснения по-прежнему непонятно, что вы хотите.
У вас, вероятно, есть контекст - вы знаете, что написал Luka и как оно должно бы работать.
Я - нет. И было бы здорово, если бы мне не нужно было поднимать весь этот контекст.
Опишите, пожалуйста, желаемое поведение, подробно.
Я уверен, что писать там на полчаса и с нуля мне будет гораздо быстрее, чем ковыряться в чужом коде.
Спасибо что вы обратили внимание на мое сообщение! Иногда приходится выставлять отложенные ордера: OP_BUYSTOP, OP_BUYLIMIT, OP_SELLSTOP, OP_SELLLIMIT. Я больше по лимитным ордерам. Я ищу способ открытия лимитных ордеров по нарастающей, можно по одному, по два и более. Но когда цена уходит от лимитного ордера, нужно его переместить ближе к цене. Но, если я открою несколько лимитных ордеров и воспользуюсь тралом, который я добавил в советник, то он переместит все лимитные ордера на одну цену, а мне нужно чтобы они все перемещались вместе друг от руга примерно в пределах 10 пунктов.
В 09.05.2023 в 06:54, Viktor2005 сказал:Добрый день,программисты! Подскажите,пожалуйста,почему советник открывает покупки с шагом,а продажи разом,без шага? Спасибо
Мы обсудили в личке, но чтобы не тратить чье-то еще время:

Должно быть больше, или равно.
В 10.05.2023 в 23:14, Lexa000 сказал:Спасибо что вы обратили внимание на мое сообщение! Иногда приходится выставлять отложенные ордера: OP_BUYSTOP, OP_BUYLIMIT, OP_SELLSTOP, OP_SELLLIMIT. Я больше по лимитным ордерам. Я ищу способ открытия лимитных ордеров по нарастающей, можно по одному, по два и более. Но когда цена уходит от лимитного ордера, нужно его переместить ближе к цене. Но, если я открою несколько лимитных ордеров и воспользуюсь тралом, который я добавил в советник, то он переместит все лимитные ордера на одну цену, а мне нужно чтобы они все перемещались вместе друг от руга примерно в пределах 10 пунктов.
![]()
Добрался до компа.
Глядя на скрин: а вас не смущает, что ваши стопы растут по мере движения цены?
Это такой антипирамидинг, он традиционно снижает среднюю прибыль, поскольку выталкивает безубыток в сторону худшей цены.
Замечания по коду:
1. OnTimer вам, вероятно, не нужен. Протестировать его в МТ4 нельзя нормально, а работать в перерывах между тиками вам не надо - код не мультивалютный. Ну и сам таймер не инициализируется в любом случае
2. У вас в советнике два трала. Один - по профиту, другой - лимиток. Причем трал лимиток написан в рассчете на одну лимитку.
Позвольте полюбопытствовать: а зачем вам много лимиток сразу? Это ж просто лишние хлопоты: таскать их по графику, ухаживать за ними всячески, пересчитывать?
Не проще ли держать открытой одну лимитку на заданной дистанции от рыночного ордера, или цены?
И как только она становится рыночным ордером - это повод открыть новую лимитку? По той же логике: на заданном расстоянии от текущей цены.
UPD:
Я реализовал отдельный метод TrailLimitGrid и вызвал его в OnTick для OP_BUYLIMIT и OP_SELLLIMIT, а вызов оригинального второго трала заглушил.
Этот метод должен делать ровно то, что вы описали: тралить всю сетку по тому же принципу, по которому тралился бы один ордер.
Глянул в тестере - тралит.
Но после активации ордеров он у вас плодит новые сетки, судя по всему - с этим вы уже сами разбирайтесь, возможно, так задумано?
Изменено 13 мая, 2023 пользователем Rigal
7 часов назад, Rigal сказал:Добрался до компа.
Глядя на скрин: а вас не смущает, что ваши стопы растут по мере движения цены?
Это такой антипирамидинг, он традиционно снижает среднюю прибыль, поскольку выталкивает безубыток в сторону худшей цены.
Замечания по коду:
1. OnTimer вам, вероятно, не нужен. Протестировать его в МТ4 нельзя нормально, а работать в перерывах между тиками вам не надо - код не мультивалютный. Ну и сам таймер не инициализируется в любом случае
2. У вас в советнике два трала. Один - по профиту, другой - лимиток. Причем трал лимиток написан в рассчете на одну лимитку.
Позвольте полюбопытствовать: а зачем вам много лимиток сразу? Это ж просто лишние хлопоты: таскать их по графику, ухаживать за ними всячески, пересчитывать?
Не проще ли держать открытой одну лимитку на заданной дистанции от рыночного ордера, или цены?
И как только она становится рыночным ордером - это повод открыть новую лимитку? По той же логике: на заданном расстоянии от текущей цены.
UPD:
Я реализовал отдельный метод TrailLimitGrid и вызвал его в OnTick для OP_BUYLIMIT и OP_SELLLIMIT, а вызов оригинального второго трала заглушил.
Этот метод должен делать ровно то, что вы описали: тралить всю сетку по тому же принципу, по которому тралился бы один ордер.
Глянул в тестере - тралит.
Но после активации ордеров он у вас плодит новые сетки, судя по всему - с этим вы уже сами разбирайтесь, возможно, так задумано?
Спасибо большое!
У меня эта стратегия заключается как вмешательство в торговлю если что-то идет не по плану. А скрин я взял в интернете, так как сложно описать все словами. Там для того чтобы сетка начиналась сначала, нужно сначала отключить функцию, потом снова включит. Мне достаточно того что вы сделали

Ещё раз спасибо, отложки тралит на определенном расстоянии как я хотел.
Могли бы вы мне подсказать, где я мог бы найти подобную информацию чтобы лучше разбираться в коде. Я пытался найти в интернете, но не смог найти, и мне сложно понять чем отличаются условия для одного ордера и для всех
1 час назад, Lexa000 сказал:Спасибо большое!
У меня эта стратегия заключается как вмешательство в торговлю если что-то идет не по плану. А скрин я взял в интернете, так как сложно описать все словами. Там для того чтобы сетка начиналась сначала, нужно сначала отключить функцию, потом снова включит. Мне достаточно того что вы сделали
Ещё раз спасибо, отложки тралит на определенном расстоянии как я хотел.
Могли бы вы мне подсказать, где я мог бы найти подобную информацию чтобы лучше разбираться в коде. Я пытался найти в интернете, но не смог найти, и мне сложно понять чем отличаются условия для одного ордера и для всех
Я тут подредактировал код чтобы лимитки начинали сначала
вот это OT=OrderType();
if(OT==OP_BUY) b++;
if(OT==OP_SELL) s++; заменил на
OT=OrderType();
if(tip==OP_BUY && (OT==OP_BUYLIMIT || OT==OP_BUYSTOP)) error=OrderDelete(Ticket=0);
if(tip==OP_SELL && (OT==OP_SELLLIMIT || OT==OP_SELLSTOP)) error=OrderDelete(Ticket=0); это.
И сетка не растет, как было до этого.
Это в блоке bool CloseByOrders()
Теперь такой результат

Изменено 13 мая, 2023 пользователем Lexa000
4 часа назад, Lexa000 сказал:Могли бы вы мне подсказать, где я мог бы найти подобную информацию чтобы лучше разбираться в коде. Я пытался найти в интернете, но не смог найти, и мне сложно понять чем отличаются условия для одного ордера и для всех
Я там комментировал в коде.
Кроме кода почитать нечего - это оригинальный код.
Вот он весь:
/* трал сетки лимиток */ void TrailLimitGrid(int _type) { int sign = (_type == OP_BUYLIMIT ? 1 : -1); double currentPrice = (_type == OP_BUYLIMIT ? Ask : Bid); double bestPrice = (_type == OP_BUYLIMIT ? 0 : DBL_MAX); int count = 0; //сперва ищем наилучший ордер этого типа for(int i = OrdersTotal(); i >= 0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() && (Magic == -1 || OrderMagicNumber() == Magic) && OrderType() == _type) { count++; if(sign * (OrderOpenPrice() - bestPrice) > 0) bestPrice = OrderOpenPrice(); } } //на этом этапе мы знаем цену лимитки, которую нужно таскать за ценой. Остальные сдвигать на ту же величину if(count > 0) { //если у нас вообще нашлись лимитки double distance = sign * (currentPrice - bestPrice); if(distance > (TrailingStop + TrailingStep - 1) * Point()) { //да, дистанция от текущей цены до наилучшего ордера уже больше, чем трал + шаг, надо двигать double targetPrice = currentPrice - sign * TrailingStop * Point(); double delta = targetPrice - bestPrice; //повторяем цикл, модифицируем все ордера этого типа for(int i = OrdersTotal(); i >= 0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() && (Magic == -1 || OrderMagicNumber() == Magic) && OrderType() == _type) { double newPrice = NormalizeDouble(OrderOpenPrice() + delta, Digits); double newSL = (OrderStopLoss() > DBL_EPSILON ? NormalizeDouble(OrderStopLoss() + delta, Digits) : 0.0); double newTP = (OrderTakeProfit() > DBL_EPSILON ? NormalizeDouble(OrderTakeProfit() + delta, Digits) : 0.0); OrderModify(OrderTicket(), newPrice, newSL, newTP, OrderExpiration(), (_type == OP_BUYLIMIT ? clrBlue : clrRed)); } } } } } /* трал сетки лимиток */
Изменено 13 мая, 2023 пользователем Rigal
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем
