Группа "Стол заказов MQL"

Рейтинг 2081



РЕКОМЕНДУЮ




Лучшее от sergs



Исправить советник
2020-04-21 09:46:59Рейтинг 0

Сеточник Комментариев 18
2022-10-12 10:06:36Рейтинг 0

Арифметический сеточник Комментариев 77
2022-06-20 10:34:57Рейтинг 0

Сеточник с каналом Комментариев 10
2023-01-31 10:35:56Рейтинг 0

Доработать советник Комментариев 6
2020-08-24 10:26:31Рейтинг 0

Арифметический сеточник

Здравствуйте. Вот еще один вариант сеточника.
После запуска советник строит сетку с заданным шагом. Допустим 100 пунктов. Спреды учитывать не будем, чтобы не усложнять расчеты. Сделки будем открывать и закрывать после перехода цены с одного уровня на другой. Все ордера будут одинакового объема, равного стартовому лоту. На одном уровне могут быть несколько ордеров разного направления. Это нужно для удобства расчетов. Сразу же открываем на первом уровне 2 локовых ордера одинакового объема. Допустим 0,1 лота на евро-доллар. После достижения ценой второго уровня мы будем иметь 10$ прибыли и 10$ убытка. Ни один ордер не закрываем. Зато открываем еще 2 локовых ордера по 0,1 лота.

На третьем уровне мы будем иметь прибыль: лонг первого уровня 20$ + лонг второго уровня 10$ = 30$. Убыток от шорта первого уровня 20$. Закрываем эти ордера и получаем прибыль 10$. Остается шорт второго уровня. Его пока не закрываем. Сразу же открываем еще один лонг. Так, чтобы сумма лотов лонгов и шортов была одинаковой.

Подробнее о закрытии ордеров.
После перехода цены с одного уровня на другой нужно высчитать сумму прибылей всех прибыльных ордеров и вычесть из нее убыток самого убыточного ордера в валюте. Если есть несколько убыточных ордеров с одинаковым убытком, то выбирается самый старый. Если результат будет равен или больше, чем значение профита в валюте в настройках, то эти ордера закрываются. Если меньше, то ни один ордер не закрывается.
После закрытия ордеров необходимо сразу открыть столько позиций, чтобы суммы лотов всех лонгов и шортов были одинаковыми. Если на уровне ни один ордер не закрылся, то нужно открыть еще два лока при условии, что на этом уровне нет открытых ордеров. Если есть хотя бы один ордер, то открывать новых не нужно.
Просьба сделать сетку видимой на графике.
Настройки: лот, шаг, профит в валюте (не менее), максимальное количество ордеров, фильтр по спреду, магик, комментарий.
  • +2
  • Просмотров: 3661
  • 20 июня 2022, 10:34
  • sergs
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
Следующая запись в группе  
Помогите сделать советника по стрелочнику
19 июня 2022
20 июня 2022

Комментарии (77)

+
0
и как я все это объясню машине?
avatar

  34  AM2 Сообщений: 15864 - Андрей

  • 20 июня 2022, 19:14
+
0
Ну можно немного упростить. Например закрывать серию в любой плюс, а не в значение, которое больше профита в валюте.
avatar

  8  sergs Автор Сообщений: 224 - Сергей

  • 20 июня 2022, 19:22
+
0
Как изменить задание, чтобы машина поняла?
avatar

  8  sergs Автор Сообщений: 224 - Сергей

  • 20 июня 2022, 22:35
+
+1
Получили прибыль 10$, закрыв три ордера, а убыток в 10$ заперли в полный замок. Куда бы цена ни шла, убыток не изменится. Потеряли спреды, комиссии и будете ждать когда свопы съедят депозит?

Математика не продумана. Симметричные замки здесь не будут работать.
Вот если бы Вы открыли лот Buy 0.2 или 0.05, тогда бы бы был какой-то смысл.
Просто дальше продумать надо, что с этим делать.

А ТЗ указано только для получения прибыли в 10$ и закрытия убытка в замок.
Или Вы считаете, что дальше Андрей должен сам придумать продолжение алгоритма?

Возникла идея изначально не плохая, откройте страницу блога и привлеките интеллектуал сайта к обсуждению и совместной выработке ТЗ. Ну а далее…

Хотя народ здесь довольно пассивный в плане — а подумать.
К сожалению, в основном, предпочитает пользоваться объедками с чужого стола.
Лень даже руки помыть.

Редактирован: 21 июня 2022, 23:58
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 21 июня 2022, 23:53
+
0
Вы не правы. Мы же закрываем не 2 локовых ордера. Всегда закрывается 1 убыточный ордер и несколько прибыльных. А благодаря тому, что новые ордера открываются постоянно, регулярно будет возникать прибыльная комбинация для закрытия. Я проверял на истории. Никаких висяков не остается.
avatar

  8  sergs Автор Сообщений: 224 - Сергей

  • 22 июня 2022, 10:02
+
0
Вот смотрите продолжение истории, которая на первых двух рисунках.
На 4 и 5 уровнях ничего не закрываем, но открываем новые локи.

На 6 уровне закрываем лонг 3 уровня 30$ + лонг 4 уровня 20$ + лонг 5 уровня 10$ = 60$. Также закрываем шорт 2 уровня -40$. 60-40=20$. Открываем еще 2 лонга и продолжаем торговлю.


avatar

  8  sergs Автор Сообщений: 224 - Сергей

  • 22 июня 2022, 11:28
+
0
Вот, уже есть над чем подумать…
на 6-м уровне можно закрыть Sell 4-го уровня, зафиксировав прибыль в 10; и открыть один лонг. Как вариант.
Советник обозвать 10 баксов.
Вообще-то что-то здесь закопано. Осталось только продумать, что делать, если цена развернется, не дойдя до 6-го уровня.
Редактирован: 22 июня 2022, 11:47
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 22 июня 2022, 11:39
+
0
Сергей, здравствуйте.

Видимо, Вы плохо описали свою идею.
Пока я вижу, что Вы убыток, просто запираете в замок. Причем этот убыток в замке с каждым шагом будет нарастать. И что Вы планируете с ним делать?

Допустим, Вы пошли против ветра. Бывает. Чаще, чем хотелось бы.
Самый нижний убыточный ордер будет наращивать этот убыток быстрее, чем следующие ордера прибыль. Значит должна возникнуть мысль закрывать часть этого ордера. Ну или увеличивать лотность.
Но что тогда делать с новыми убыточными ордерами?
При чем, даже если цена развернется и самый нижний ордер начнет уменьшать убыток, то верхний Buy будет с таким же успехом наращивать убыток.

Равновесные замки в Вашей схеме работать на Вас не будут.

Или из Вас плохой рассказчик. Сформулируйте свою мысль более доступно для понимания непосвященными. Иначе Вам удачи не видать.

Я сам сторонник математического подхода. Разработал несколько таких алгоритмов. Индюки против математики ничто. Тлен. Монетка орёл-решка.

Вы дали пару картинок, а их по моему пониманию, должно быть мальца побольше.

Математику я предлагал в своём блоге:
kvashnin007.opentraders.ru/74118.html

Правда, сочувствующих не нашлось. Не повезло ребяткам и девчаткам.

avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 22 июня 2022, 11:37
+
0
Вообще-то я заметил Вашу любовь к брокеру.
Зачем ему платить лишние поборы, закрыв лонг 4-го уровня и тут же открывать лонг на шестом? Ведь лонг 4-го даст тот же результат, что и лонг 6-го.

Вообще надо продумать Вашу мысль. Зерно в ней есть несомненно.

Открывайте страницу блога по этой теме, будет интересно пободаться.

А может и советник родим!? Сами, если сможем.
Редактирован: 22 июня 2022, 17:10
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 22 июня 2022, 11:56
+
0
Если мы не закроем лонг 4-го уровня, мы не получим прибыль. Закрывать надо все прибыльные ордера. Если мы будем выбирать, то это невозможно будет закодировать.
Не вижу смысла открывать блог. Я проверял стратегию много раз на истории. На трендах идет стабильный заработок при умеренной просадке без висяков. На флетах сложнее. Надо ждать, когда начнется движение. Тогда все войдет в норму.
avatar

  8  sergs Автор Сообщений: 224 - Сергей

  • 22 июня 2022, 12:19
+
0
Закрыв ордер 4-го уровня, Вы просто фиксируете имеющуюся прибыль, а не получаете её. Просто она уже возникла, а фиксировать её можно в любой момент.
И всё…
6-й ордер Вам сможет дать точно такую же прибыль-убыток, как и 4-й.
Так зачем брокера радовать? Вся разница в том, что 4-й ордер сам по себе уже содержит профит.

А закодировать можно даже приготовление яичницы в 8 утра. Главное правильно формализовать ТЗ.
Редактирован: 22 июня 2022, 17:12
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 22 июня 2022, 15:22
+
0
Вообще то ордера закрываются сериями. Закрывать ордера по отдельности нет никакого смысла.
avatar

  8  sergs Автор Сообщений: 224 - Сергей

  • 22 июня 2022, 16:45
+
0
Не хочу спорить.
Но отдавать брокеру свои 3-5% заработанного, жаба давит.
Надо думать.

Смысл во всем существует. Просто не всегда есть смысл упрощать себе задачу, ценой ненужных расходов.

Красиво же сказал: смысл есть всегда, но не всегда есть смысл.
Надо записать.

Сергей я сейчас покончу блог с советником по идее Шамана и создам новый по идее Сергея_S.
Там проще будет общаться. Да и глядишь собутыльники подтянутся со стороны. А так, в написании Вашего советника, я пока проблем не вижу. Единственное что немного затянется. Надо окончательно составить концепцию в виде «Если… То».
И уж затем переходить к написанию.
Андрею проще. Получил ТЗ. Сложил готовые функции. Приложил свои извилины по временнЫм соображениям. И вуаля.
Потом возникают нестыковки с заказчиком и прочие неурядицы.
А когда сам пишешь, то все по фэншую, с абсолютным пониманием.
Остаётся мелочь — побороть технические ошибки. Будь они не ладны.
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 22 июня 2022, 17:07
+
0
Андрей, спасибо. Будем работать. Но задание не снимается.
avatar

  8  sergs Автор Сообщений: 224 - Сергей

  • 22 июня 2022, 17:13
+
0
Ну задание то, это не ко мне. Мал я ещё.
А вот для него составьте ТЗ в виде «если — то».
А лишнее видение не бывает лишним.
Будет над чем поизголяться.
Редактирован: 22 июня 2022, 17:45
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 22 июня 2022, 17:44
+
0
Вот что будет при смене тренда. На 5 и 4 уровнях мы не открываем сделок. На 3-ем открываем 2 лока.

На 2-ом закрываем все прибыльные шорты и получаем прибыль 60$. Закрываем один убыточный лонг -40$. 60-40=20$. Открываем еще 2 шорта и продолжаем торговлю.
avatar

  8  sergs Автор Сообщений: 224 - Сергей

  • 22 июня 2022, 14:26
+
0
Вот такая ситуация будет при прохождении ценой 15-и уровней без отката (моделировал на бумаге).

Как видите, ничего страшного не произойдет. Во всяком случае, по сравнению с усреднителем-мартингейлом.
avatar

  8  sergs Автор Сообщений: 224 - Сергей

  • 22 июня 2022, 14:51
+
0
15 уровней против ветра.., да Вы отважный человек.
А мне говорили, что торговать надо по движухе цены.
А Вы сознательная баба-Яга-против.
А что? Тоже своеобразная идея.
У меня такой вариант был, когда сеточник ваял. Индюк пищит: -продавай!!!
А я ему дулю в нос. Индюк — порождение толпы. А я не считаю правильным ходить куда все.

Делюсь бАльшим секретом. Только ж Вы никому!
Вместо того, чтоб озадачиваться вопросом куда цена ломанется, я предпочитаю думать о том, что делать, если она ломанётся в другую сторону.

А блог мой гляньте. Просто интересно. Правда там и трети наработок не проявлено. Но народ мало чем интересуется.
А зачем бисер метать?
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 22 июня 2022, 17:28
+
0
Да… Мартингейлом не стоит пренебрегать. Любым инструментом надо учиться пользоваться. Вон внук мой, когда-то кашу пытался руками жевать. Сейчас ложкой. На вилку косо поглядывает. Стрёмно как-то. Одно движение — четыре дырки.

А вообще-то мне Ваша математика потому м приглянулась, что мартышек не пользует.
Единственно что стартовый лот надо брать в % от свободной маржи. При сломе алгоритма снова от маржи. Пока такие мысли бродят.
Редактирован: 22 июня 2022, 17:40
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 22 июня 2022, 17:32
+
0
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 22 июня 2022, 19:36
+
0
Просто надо понимать, что при подходе к верхнему уровню может быть только две ситуации: Ордера на покупку дали прибыль больше чем самый убыточный ордер на продажу или нет. При подходе к нижнему – наоборот.

Это верно. Теоретически может быть ситуация, когда будут существовать прибыльные как баи, так и селы. Но я думаю, пока не стоит усложнять себе жизнь.
При развороте все то же.
avatar

  8  sergs Автор Сообщений: 224 - Сергей

  • 22 июня 2022, 20:14
+
0
Это только при развороте.
Может стоит закрывать такие ордера при возврате цены к предыдущему уровню?
Хотя думаю, что не следует. Просто выравнивать лоты.
Так и математика сохранится и брокер огорчится.
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 22 июня 2022, 20:33
+
0
Выравнивать в смысле следить, чтобы сумма баев и селов была одинаковой.
avatar

  8  sergs Автор Сообщений: 224 - Сергей

  • 22 июня 2022, 20:42
+
0
Вроде того.
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 22 июня 2022, 23:59
+
0
то что вы описали, это трудоемко и не для бесплатного
avatar

  34  AM2 Сообщений: 15864 - Андрей

  • 22 июня 2022, 19:53
+
0
Я тоже так подумал. Правда вся трудоёмкость заключается в неправильно поставленной задаче.
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 22 июня 2022, 20:04
+
0
вот болванка для вашего советника. кроет серию бай или селл по отдельности в плюс: www.opentraders.ru/downloads/3346/



какую то простую функцию я сюда могу добавить в рамках заказа
avatar

  34  AM2 Сообщений: 15864 - Андрей

  • 22 июня 2022, 21:25
+
0
А можно хотя бы стартовый лот сделать в настройках?
avatar

  8  sergs Автор Сообщений: 224 - Сергей

  • 22 июня 2022, 21:57
+
0
прорабатывайте пока алгоритм
avatar

  34  AM2 Сообщений: 15864 - Андрей

  • 22 июня 2022, 22:28
+
0
чуть чуть приблизился к первоначальному тз, но безоткат он не вытягивает: www.opentraders.ru/downloads/3346/

avatar

  34  AM2 Сообщений: 15864 - Андрей

  • 22 июня 2022, 22:58
+
0
Спасибо.
А с безоткатом надо что-то делать. Толи шаг увеличивать, толи специальные меры предпринимать.
Есть тут одна идейка. Надо подумать.
Редактирован: 22 июня 2022, 23:56
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 22 июня 2022, 23:54
+
0
Нужно ограничение по сделкам.
avatar

  8  sergs Автор Сообщений: 224 - Сергей

  • 23 июня 2022, 15:55
+
0
сейчас хоть тест проходит: www.opentraders.ru/downloads/3346/

avatar

  34  AM2 Сообщений: 15864 - Андрей

  • 23 июня 2022, 19:11
+
0
Спасибо. На центовом счете торговать можно.
avatar

  8  sergs Автор Сообщений: 224 - Сергей

  • 23 июня 2022, 21:05
+
0
Это советник для проверки идеи в тестере. Для реала надо дорабатывать проверки на валидность всего и вся.
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 24 июня 2022, 12:44
+
0
Андрей, если это не трудно, сделайте так что бы на каждом уровне Бай поз. ставились ниже Сел поз.и соответственно Сел поз. открывались выше Бай поз.
Показатели будут чуть получше и спред будет перекрываться. *yes* 
avatar

  18  Marik007 Сообщений: 400 - Forexman

  • 23 июня 2022, 23:26
+
0
Эта задача не выполнима по нескольким причинам.

1. Ордера открываются одновременно. Sell по цене Bid, Buy по цене Ask.
Из-за присутствия спрэда Ask выше Bid. Поэтому ордер Buy будет всегда выше ордера Sell. Это Ваша дань брокеру. Но это в тестере.
Стройте свечи по Ask, а не по Bid. Тогда некоторые ордера на покупку зрительно не будут выходить за свечи.
2. В реале из-за наличия кроме спреда проскальзывания и реквот, чудеса могут стать ещё чудеснее.
3. А в чем смысл? Ордера то все равно закрываются по встречным ценам.

Можно, конечно, добавить в алгоритм сдвиг на спред, но тогда не факт (вернее наоборот), что все ордера откроются.

Редактирован: 24 июня 2022, 00:01
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 23 июня 2022, 23:59
+
0
Как я и предполагал, идея требует большой коррекции.

Я написал советника по идее sergs.
Результат отработки выглядит — не надо завидЫвать. Поэтому и не выкладываю.



Все логично.
Эквити медленно, но под линейку почти не падает. Сказываются полные замки.
Дэпо по идее также под линейку должно расти. Здесь пока вижу непонятную ломанную линию.
И то, что не изображается — свободная маржа падает с таким же успехом под линейку, но чуть круче. И в тот момент, когда она становится исчезающе мала, должна нарисоваться кочерга.
А пока, при закрытии всех ордеров по окончанию тестирования, дэпо сравнялось с эквити. А так как он падал, то мы в заднице.

Андрей в своём советнике отступил от ТЗ.
После фиксирования прибыли он не выравнивает количество лотов, а просто открывает еще замок. В результате в общем замке разное количество лотов Buy-Sell. Это и даёт возможность хоть как-то работать. Хоть и при этом появилась просадка, от которой автор стремился избавиться.

В результате идея поломалась и советник получился абы какой.
Но справедливости ради скажу, что он при определенных настройках может немного зарабатывать некоторое время.

Есть мысль по-другому подойти к расчету ордеров, но это тоже получится другой советник. Считаю — изначально идея сырая. Возможно, мёртвая.


Редактирован: 5 июля 2022, 09:47
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 24 июня 2022, 11:44
+
0
Почему депо уменьшается? По стратегии этого не должно быть.
avatar

  8  sergs Автор Сообщений: 224 - Сергей

  • 24 июня 2022, 11:59
+
0
Я же написал, сам не понимаю.
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 24 июня 2022, 12:12
+
+1
РЕШИЛ ВЫЛОЖИТЬ СВОЙ СОВ, ЧТОБ НЕ ВЫГЛЯДИТЬ ПУСТОБРЕХОМ.

<code>//+------------------------------------------------------------------+
//|                                                Arifmetik_KAE.mq4 |
//|                                              Copyright 2022, KAE |
//|                                     https://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, KAE"
#property link      "https://www.forexsystems.biz"
#property strict

input double          Risk                = 0;         // Risk на сделку в процентах от свободной маржи. Ели "0", то StartLot
input double          StartLots           = 0.01;      // Start lot
input int             OrderStep           = 63;        // Order step (in pips)
input int             MinProfit           = 37;        // Minimal profit for close Average orders (in pips)
//---
input int             MagicNumber         = 1961;      // Magic Number 
input int             Slippage            = 30;        // Slippage (in pips)
//---
double op,lt,tp,pr;
int    tk,b,s;
double StoimPunkta, MinTP;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
     StoimPunkta = MarketInfo(Symbol(),MODE_TICKVALUE) / ( MarketInfo(Symbol(),MODE_TICKSIZE) / MarketInfo(Symbol(),MODE_POINT) );
     MinTP = StoimPunkta*MinProfit;
       Print("MinProfit за один пункт при lot=1.00,  ",+MinTP);
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   double StartLot=StartLots;
   
   if(Risk>0)
      StartLot = AccountFreeMargin()/100*Risk/MarketInfo(Symbol(), MODE_MARGINREQUIRED);
      StartLot = NL(StartLot);

   if(OrdersTotal()==0)
      {
      tk=OrderSend(NULL,OP_BUY, StartLot,ND(Ask),Slippage,0,0,"",MagicNumber);
      
      if(tk<0) 
         return;
      else
         tk=OrderSend(NULL,OP_SELL,StartLot,ND(Bid),Slippage,0,0,"",MagicNumber);
      }
    
   double
   BuyPriceMax=0,SelPriceMin=0,BuyPriceMaxLot=0,SelPriceMinLot=0;

   int
   BuyPriceMaxTic=0,SelPriceMinTic=0;
   
   double
   BuyLotsSum=0,SelLotsSum=0,WeighBuy=0, WeighSell=0,BuyAllProfit=0,SelAllProfit=0,
   BuyMaxPriceProfit=0,SelMinPriceProfit=0;

   b=0;s=0;pr=0;

   for(int i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               {
               op=NormalizeDouble(OrderOpenPrice(),Digits());
               lt=NormalizeDouble(OrderLots(),2);
               tk=OrderTicket();
               pr=OrderProfit()+OrderCommission()+OrderSwap();
               
               if(OrderType()==OP_BUY)
                  {
                  b++;
                  BuyLotsSum   += lt;
//                  WeighBuy     += lt*op;
                  BuyAllProfit += pr;
                  
                  if(op>BuyPriceMax || BuyPriceMax==0)
                     {
                     BuyPriceMax       = op;
                     BuyPriceMaxLot    = lt;
                     BuyPriceMaxTic    = tk;
                     BuyMaxPriceProfit = pr;
                     }
                  }
               // ===
               if(OrderType()==OP_SELL)
                  {
                  s++;
                  SelLotsSum   += lt;
//                  WeighSell    += lt*op;
                  SelAllProfit += pr;
                  
                  if(op<SelPriceMin || SelPriceMin==0)
                     {
                     SelPriceMin       = op;
                     SelPriceMinLot    = lt;
                     SelPriceMinTic    = tk;
                     SelMinPriceProfit = pr;
                     }
                  }
               }
       //-----------------------------------------------------------------------------------        
      if(Ask>=BuyPriceMax + OrderStep*Point)
         {
         if(BuyAllProfit + SelMinPriceProfit >= MinTP*SelPriceMinLot && SelMinPriceProfit!=0)
            {
            CloseAllType(OP_BUY);
            CloseTicket(SelPriceMinTic,OP_SELL);
            tk=OrderSend(NULL,OP_BUY, NormalizeDouble(SelLotsSum-SelPriceMinLot,2),NormalizeDouble(Ask,_Digits),Slippage,0,0,"",MagicNumber);
            }
         else
            {
            tk=OrderSend(NULL,OP_BUY, StartLot,NormalizeDouble(Ask,_Digits),Slippage,0,0,"",MagicNumber);
      
            if(tk<0) 
               return;
            else
               tk=OrderSend(NULL,OP_SELL,StartLot,NormalizeDouble(Bid,_Digits),Slippage,0,0,"",MagicNumber);
            }
         }
      //---
      if(Bid<=SelPriceMin - OrderStep*Point)
         {
         if(SelAllProfit + BuyMaxPriceProfit >= MinTP*BuyPriceMaxLot && BuyMaxPriceProfit!=0)
            {
            CloseAllType(OP_SELL);
            CloseTicket(BuyPriceMaxTic,OP_BUY);
            tk=OrderSend(NULL,OP_SELL, NormalizeDouble(BuyLotsSum-BuyPriceMaxLot,2),NormalizeDouble(Bid,_Digits),Slippage,0,0,"",MagicNumber);
            }
         else
            {
            tk=OrderSend(NULL,OP_BUY, StartLot,NormalizeDouble(Ask,_Digits),Slippage,0,0,"",MagicNumber);
      
            if(tk<0) 
               return;
            else
               tk=OrderSend(NULL,OP_SELL,StartLot,NormalizeDouble(Bid,_Digits),Slippage,0,0,"",MagicNumber);
            }
         }
}
//+------------------------------------------------------------------+
//| Закрытие позиции по тикету ордера                                |
//+------------------------------------------------------------------+
void CloseTicket(int tic,int type)
{
     if(!OrderSelect(tic, SELECT_BY_TICKET)) 
        Print("OrderSelect() вернул ошибку - ",GetLastError());
     else
        {
        if(type==OP_BUY)
           if(!OrderClose(tic,OrderLots(),NormalizeDouble(Bid,Digits),Slippage))
              Print("Order Close Buy вернул ошибку - ",GetLastError());
        if(type==OP_SELL)
           if(!OrderClose(tic,OrderLots(),NormalizeDouble(Ask,Digits),Slippage))
              Print("Order Close Sell вернул ошибку - ",GetLastError());
        }
}
//+------------------------------------------------------------------+
//| Закрытие всех ордеров по типу                                    |
//+------------------------------------------------------------------+
void CloseAllType(int ot)
{
   bool cl;

   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
            {
            if(OrderType()==OP_BUY && ot==OP_BUY)
               {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slippage);
               }
             if(OrderType()==OP_SELL && ot==OP_SELL)
               {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slippage);
               }
            }
}
//+------------------------------------------------------------------+
double NL(double lot) // нормализация лота
{
	double LotStep=MarketInfo(Symbol(), MODE_LOTSTEP);
	int k=0;
	if (LotStep<=0.001) k=3; else if (LotStep<=0.01) k=2; else if (LotStep<=0.1) k=1; // шаг лота

	double MinLot=MarketInfo(Symbol(), MODE_MINLOT);
	double MaxLot=MarketInfo(Symbol(), MODE_MAXLOT);
	return ND(MathMin(MaxLot, MathMax(MinLot, lot)), k); // венули нормализованный лот
}
//+------------------------------------------------------------------+
double ND(double d, int n=-1) 
{ 
      if (n<0) 
         return NormalizeDouble(d, Digits); 
    return NormalizeDouble(d, n); 
}
//+------------------------------------------------------------------+
</code>

Редактирован: 24 июня 2022, 12:51
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 24 июня 2022, 12:08
+
+1
Если закосить под алгоритм Андрея, то без настроек получим уже другую картинку.
Последняя дуга — результат безвременно закрытых ордеров.



//+------------------------------------------------------------------+
//|                                                Arifmetik_KAE.mq4 |
//|                                              Copyright 2022, KAE |
//|                                     https://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, KAE"
#property link      "https://www.forexsystems.biz"
#property strict

input double          Risk                = 0;         // Risk на сделку в процентах от свободной маржи. Ели "0", то StartLot
input double          StartLots           = 0.02;      // Start lot
input int             OrderStep           = 168;        // Order step (in pips)
input int             MinProfit           = 21;        // Minimal profit for close Average orders (in pips)
//---
input int             MagicNumber         = 1961;      // Magic Number 
input int             Slippage            = 30;        // Slippage (in pips)
//---
double op,lt,tp,pr;
int    tk,b,s;
double StoimPunkta, MinTP;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
     StoimPunkta = MarketInfo(Symbol(),MODE_TICKVALUE) / ( MarketInfo(Symbol(),MODE_TICKSIZE) / MarketInfo(Symbol(),MODE_POINT) );
     MinTP = StoimPunkta*MinProfit;
       Print("MinProfit за один пункт при lot=1.00,  ",+MinTP);
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   double StartLot=StartLots;
   
   if(Risk>0)
      StartLot = AccountFreeMargin()/100*Risk/MarketInfo(Symbol(), MODE_MARGINREQUIRED);
      StartLot = NL(StartLot);

   if(OrdersTotal()==0)
      {
      tk=OrderSend(NULL,OP_BUY, StartLot,ND(Ask),Slippage,0,0,"",MagicNumber);
      
      if(tk<0) 
         return;
      else
         tk=OrderSend(NULL,OP_SELL,StartLot,ND(Bid),Slippage,0,0,"",MagicNumber);
      }
    
   double
   BuyPriceMax=0,SelPriceMin=0,BuyPriceMaxLot=0,SelPriceMinLot=0;

   int
   BuyPriceMaxTic=0,SelPriceMinTic=0;
   
   double
   BuyLotsSum=0,SelLotsSum=0,WeighBuy=0, WeighSell=0,BuyAllProfit=0,SelAllProfit=0,
   BuyMaxPriceProfit=0,SelMinPriceProfit=0;

   b=0;s=0;pr=0;

   for(int i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               {
               op=NormalizeDouble(OrderOpenPrice(),Digits());
               lt=NormalizeDouble(OrderLots(),2);
               tk=OrderTicket();
               pr=OrderProfit()+OrderCommission()+OrderSwap();
               
               if(OrderType()==OP_BUY)
                  {
                  b++;
                  BuyLotsSum   += lt;
//                  WeighBuy     += lt*op;
                  BuyAllProfit += pr;
                  
                  if(op>BuyPriceMax || BuyPriceMax==0)
                     {
                     BuyPriceMax       = op;
                     BuyPriceMaxLot    = lt;
                     BuyPriceMaxTic    = tk;
                     BuyMaxPriceProfit = pr;
                     }
                  }
               // ===
               if(OrderType()==OP_SELL)
                  {
                  s++;
                  SelLotsSum   += lt;
//                  WeighSell    += lt*op;
                  SelAllProfit += pr;
                  
                  if(op<SelPriceMin || SelPriceMin==0)
                     {
                     SelPriceMin       = op;
                     SelPriceMinLot    = lt;
                     SelPriceMinTic    = tk;
                     SelMinPriceProfit = pr;
                     }
                  }
               }
       //-----------------------------------------------------------------------------------        
      if(Ask>=BuyPriceMax + OrderStep*Point)
         {
         if(BuyAllProfit + SelMinPriceProfit >= MinTP*SelPriceMinLot && SelMinPriceProfit!=0)
            {
            CloseAllType(OP_BUY);
            CloseTicket(SelPriceMinTic,OP_SELL);
            tk=OrderSend(NULL,OP_BUY, StartLot,NormalizeDouble(Ask,_Digits),Slippage,0,0,"",MagicNumber);
      
            if(tk<0) 
               return;
            else
               tk=OrderSend(NULL,OP_SELL,NL(StartLot),NormalizeDouble(Bid,_Digits),Slippage,0,0,"",MagicNumber);
            }
         else
            {
            tk=OrderSend(NULL,OP_BUY, StartLot,NormalizeDouble(Ask,_Digits),Slippage,0,0,"",MagicNumber);
      
            if(tk<0) 
               return;
            else
               tk=OrderSend(NULL,OP_SELL,StartLot,NormalizeDouble(Bid,_Digits),Slippage,0,0,"",MagicNumber);
            }
         }
      //---
      if(Bid<=SelPriceMin - OrderStep*Point)
         {
         if(SelAllProfit + BuyMaxPriceProfit >= MinTP*BuyPriceMaxLot && BuyMaxPriceProfit!=0)
            {
            CloseAllType(OP_SELL);
            CloseTicket(BuyPriceMaxTic,OP_BUY);
            tk=OrderSend(NULL,OP_BUY, NL(StartLot),NormalizeDouble(Ask,_Digits),Slippage,0,0,"",MagicNumber);
      
            if(tk<0) 
               return;
            else
               tk=OrderSend(NULL,OP_SELL,StartLot,NormalizeDouble(Bid,_Digits),Slippage,0,0,"",MagicNumber);
            }
         else
            {
            tk=OrderSend(NULL,OP_BUY, StartLot,NormalizeDouble(Ask,_Digits),Slippage,0,0,"",MagicNumber);
      
            if(tk<0) 
               return;
            else
               tk=OrderSend(NULL,OP_SELL,StartLot,NormalizeDouble(Bid,_Digits),Slippage,0,0,"",MagicNumber);
            }
         }
}
//+------------------------------------------------------------------+
//| Закрытие позиции по тикету ордера                                |
//+------------------------------------------------------------------+
void CloseTicket(int tic,int type)
{
     if(!OrderSelect(tic, SELECT_BY_TICKET)) 
        Print("OrderSelect() вернул ошибку - ",GetLastError());
     else
        {
        if(type==OP_BUY)
           if(!OrderClose(tic,OrderLots(),NormalizeDouble(Bid,Digits),Slippage))
              Print("Order Close Buy вернул ошибку - ",GetLastError());
        if(type==OP_SELL)
           if(!OrderClose(tic,OrderLots(),NormalizeDouble(Ask,Digits),Slippage))
              Print("Order Close Sell вернул ошибку - ",GetLastError());
        }
}
//+------------------------------------------------------------------+
//| Закрытие всех ордеров по типу                                    |
//+------------------------------------------------------------------+
void CloseAllType(int ot)
{
   bool cl;

   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
            {
            if(OrderType()==OP_BUY && ot==OP_BUY)
               {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slippage);
               }
             if(OrderType()==OP_SELL && ot==OP_SELL)
               {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slippage);
               }
            }
}
//+------------------------------------------------------------------+
double NL(double lot) // нормализация лота
{
	double LotStep=MarketInfo(Symbol(), MODE_LOTSTEP);
	int k=0;
	if (LotStep<=0.001) k=3; else if (LotStep<=0.01) k=2; else if (LotStep<=0.1) k=1; // шаг лота

	double MinLot=MarketInfo(Symbol(), MODE_MINLOT);
	double MaxLot=MarketInfo(Symbol(), MODE_MAXLOT);
	return ND(MathMin(MaxLot, MathMax(MinLot, lot)), k); // венули нормализованный лот
}
//+------------------------------------------------------------------+
double ND(double d, int n=-1) 
{ 
      if (n<0) 
         return NormalizeDouble(d, Digits); 
    return NormalizeDouble(d, n); 
}
//+------------------------------------------------------------------+
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 24 июня 2022, 13:09
+
+1
Если слегка поработаь с расчетом ордеров, то характеристики улучшатся.



//+------------------------------------------------------------------+
//|                                                Arifmetik_KAE.mq4 |
//|                                              Copyright 2022, KAE |
//|                                     https://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, KAE"
#property link      "https://www.forexsystems.biz"
#property strict

input double          Risk                = 0;         // Risk на сделку в процентах от свободной маржи. Ели "0", то StartLot
input double          StartLots           = 0.02;      // Start lot
input int             OrderStep           = 168;        // Order step (in pips)
input int             MinProfit           = 21;        // Minimal profit for close Average orders (in pips)
//---
input int             MagicNumber         = 1961;      // Magic Number 
input int             Slippage            = 30;        // Slippage (in pips)
//---
double op,lt,tp,pr;
int    tk,b,s;
double StoimPunkta, MinTP;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
     StoimPunkta = MarketInfo(Symbol(),MODE_TICKVALUE) / ( MarketInfo(Symbol(),MODE_TICKSIZE) / MarketInfo(Symbol(),MODE_POINT) );
     MinTP = StoimPunkta*MinProfit;
       Print("MinProfit за один пункт при lot=1.00,  ",+MinTP);
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   double StartLot=StartLots;
   
   if(Risk>0)
      StartLot = AccountFreeMargin()/100*Risk/MarketInfo(Symbol(), MODE_MARGINREQUIRED);
      StartLot = NL(StartLot);

   if(OrdersTotal()==0)
      {
      tk=OrderSend(NULL,OP_BUY, StartLot,ND(Ask),Slippage,0,0,"",MagicNumber);
      
      if(tk<0) 
         return;
      else
         tk=OrderSend(NULL,OP_SELL,StartLot,ND(Bid),Slippage,0,0,"",MagicNumber);
      }
    
   double
   BuyPriceMax=0,SelPriceMin=0,BuyPriceMaxLot=0,SelPriceMinLot=0;

   int
   BuyPriceMaxTic=0,SelPriceMinTic=0;
   
   double
   BuyLotsSum=0,SelLotsSum=0,WeighBuy=0, WeighSell=0,BuyAllProfit=0,SelAllProfit=0,
   BuyMaxPriceProfit=0,SelMinPriceProfit=0;

   b=0;s=0;pr=0;

   for(int i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               {
               op=NormalizeDouble(OrderOpenPrice(),Digits());
               lt=NormalizeDouble(OrderLots(),2);
               tk=OrderTicket();
               pr=OrderProfit()+OrderCommission()+OrderSwap();
               
               if(OrderType()==OP_BUY)
                  {
                  b++;
                  BuyLotsSum   += lt;
//                  WeighBuy     += lt*op;
                  BuyAllProfit += pr;
                  
                  if(op>BuyPriceMax || BuyPriceMax==0)
                     {
                     BuyPriceMax       = op;
                     BuyPriceMaxLot    = lt;
                     BuyPriceMaxTic    = tk;
                     BuyMaxPriceProfit = pr;
                     }
                  }
               // ===
               if(OrderType()==OP_SELL)
                  {
                  s++;
                  SelLotsSum   += lt;
//                  WeighSell    += lt*op;
                  SelAllProfit += pr;
                  
                  if(op<SelPriceMin || SelPriceMin==0)
                     {
                     SelPriceMin       = op;
                     SelPriceMinLot    = lt;
                     SelPriceMinTic    = tk;
                     SelMinPriceProfit = pr;
                     }
                  }
               }
       //-----------------------------------------------------------------------------------        
      if(Ask>=BuyPriceMax + OrderStep*Point)
         {
         if(BuyAllProfit + SelMinPriceProfit >= MinTP*SelPriceMinLot && SelMinPriceProfit!=0)
            {
            CloseAllType(OP_BUY);
            CloseTicket(SelPriceMinTic,OP_SELL);
            tk=OrderSend(NULL,OP_BUY, StartLot,NormalizeDouble(Ask,_Digits),Slippage,0,0,"",MagicNumber);
      
            if(tk<0) 
               return;
            else
               tk=OrderSend(NULL,OP_SELL,NL(StartLot*2),NormalizeDouble(Bid,_Digits),Slippage,0,0,"",MagicNumber);
            }
         else
            {
            tk=OrderSend(NULL,OP_BUY, StartLot,NormalizeDouble(Ask,_Digits),Slippage,0,0,"",MagicNumber);
      
            if(tk<0) 
               return;
            else
               tk=OrderSend(NULL,OP_SELL,StartLot,NormalizeDouble(Bid,_Digits),Slippage,0,0,"",MagicNumber);
            }
         }
      //---
      if(Bid<=SelPriceMin - OrderStep*Point)
         {
         if(SelAllProfit + BuyMaxPriceProfit >= MinTP*BuyPriceMaxLot && BuyMaxPriceProfit!=0)
            {
            CloseAllType(OP_SELL);
            CloseTicket(BuyPriceMaxTic,OP_BUY);
            tk=OrderSend(NULL,OP_BUY, NL(StartLot*2),NormalizeDouble(Ask,_Digits),Slippage,0,0,"",MagicNumber);
      
            if(tk<0) 
               return;
            else
               tk=OrderSend(NULL,OP_SELL,StartLot,NormalizeDouble(Bid,_Digits),Slippage,0,0,"",MagicNumber);
            }
         else
            {
            tk=OrderSend(NULL,OP_BUY, StartLot,NormalizeDouble(Ask,_Digits),Slippage,0,0,"",MagicNumber);
      
            if(tk<0) 
               return;
            else
               tk=OrderSend(NULL,OP_SELL,StartLot,NormalizeDouble(Bid,_Digits),Slippage,0,0,"",MagicNumber);
            }
         }
}
//+------------------------------------------------------------------+
//| Закрытие позиции по тикету ордера                                |
//+------------------------------------------------------------------+
void CloseTicket(int tic,int type)
{
     if(!OrderSelect(tic, SELECT_BY_TICKET)) 
        Print("OrderSelect() вернул ошибку - ",GetLastError());
     else
        {
        if(type==OP_BUY)
           if(!OrderClose(tic,OrderLots(),NormalizeDouble(Bid,Digits),Slippage))
              Print("Order Close Buy вернул ошибку - ",GetLastError());
        if(type==OP_SELL)
           if(!OrderClose(tic,OrderLots(),NormalizeDouble(Ask,Digits),Slippage))
              Print("Order Close Sell вернул ошибку - ",GetLastError());
        }
}
//+------------------------------------------------------------------+
//| Закрытие всех ордеров по типу                                    |
//+------------------------------------------------------------------+
void CloseAllType(int ot)
{
   bool cl;

   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
            {
            if(OrderType()==OP_BUY && ot==OP_BUY)
               {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slippage);
               }
             if(OrderType()==OP_SELL && ot==OP_SELL)
               {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slippage);
               }
            }
}
//+------------------------------------------------------------------+
double NL(double lot) // нормализация лота
{
	double LotStep=MarketInfo(Symbol(), MODE_LOTSTEP);
	int k=0;
	if (LotStep<=0.001) k=3; else if (LotStep<=0.01) k=2; else if (LotStep<=0.1) k=1; // шаг лота

	double MinLot=MarketInfo(Symbol(), MODE_MINLOT);
	double MaxLot=MarketInfo(Symbol(), MODE_MAXLOT);
	return ND(MathMin(MaxLot, MathMax(MinLot, lot)), k); // венули нормализованный лот
}
//+------------------------------------------------------------------+
double ND(double d, int n=-1) 
{ 
      if (n<0) 
         return NormalizeDouble(d, Digits); 
    return NormalizeDouble(d, n); 
}
//+------------------------------------------------------------------+


Но всё это уже другие советники.
Добавляя какие-то функции, можно ещё улучшать характеристики.
Но мне это уже не интересно.
Первоначальная идея не оправдалась в моём понимании.

Есть ребята и пошире в плечах.
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 24 июня 2022, 13:18
+
+1
Сергей просил добавить ограничение количества сделок в рынке, как у Андрея.

Прошу. Только это не спасёт отца русской демократии от фиаско.



//+------------------------------------------------------------------+
//|                                                Arifmetik_KAE.mq4 |
//|                                              Copyright 2022, KAE |
//|                                     https://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, KAE"
#property link      "https://www.forexsystems.biz"
#property strict

input double          Risk                = 0;         // Risk на сделку в процентах от свободной маржи. Ели "0", то StartLot
input double          StartLots           = 0.02;      // Start lot
input int             OrderStep           = 168;       // Order step (in pips)
input int             MinProfit           = 21;        // Minimal profit for close Average orders (in pips)
input int             MaxCountOrders      = 22;        // Count Orders максимальное число ордеров в рынке.
//---
input int             MagicNumber         = 1961;      // Magic Number 
input int             Slippage            = 30;        // Slippage (in pips)
//---
double op,lt,tp,pr;
int    tk,b,s;
double StoimPunkta, MinTP;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
     StoimPunkta = MarketInfo(Symbol(),MODE_TICKVALUE) / ( MarketInfo(Symbol(),MODE_TICKSIZE) / MarketInfo(Symbol(),MODE_POINT) );
     MinTP = StoimPunkta*MinProfit;
       Print("MinProfit за один пункт при lot=1.00,  ",+MinTP);
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   double StartLot=StartLots;
   
   if(Risk>0)
      StartLot = AccountFreeMargin()/100*Risk/MarketInfo(Symbol(), MODE_MARGINREQUIRED);
      StartLot = NL(StartLot);

   if(OrdersTotal()==0)
      {
      tk=OrderSend(NULL,OP_BUY, StartLot,ND(Ask),Slippage,0,0,"",MagicNumber);
      
      if(tk<0) 
         return;
      else
         tk=OrderSend(NULL,OP_SELL,StartLot,ND(Bid),Slippage,0,0,"",MagicNumber);
      }
    
   double
   BuyPriceMax=0,SelPriceMin=0,BuyPriceMaxLot=0,SelPriceMinLot=0;

   int
   BuyPriceMaxTic=0,SelPriceMinTic=0;
   
   double
   BuyLotsSum=0,SelLotsSum=0,WeighBuy=0, WeighSell=0,BuyAllProfit=0,SelAllProfit=0,
   BuyMaxPriceProfit=0,SelMinPriceProfit=0;

   b=0;s=0;pr=0;

   for(int i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               {
               op=NormalizeDouble(OrderOpenPrice(),Digits());
               lt=NormalizeDouble(OrderLots(),2);
               tk=OrderTicket();
               pr=OrderProfit()+OrderCommission()+OrderSwap();
               
               if(OrderType()==OP_BUY)
                  {
                  b++;
                  BuyLotsSum   += lt;
//                  WeighBuy     += lt*op;
                  BuyAllProfit += pr;
                  
                  if(op>BuyPriceMax || BuyPriceMax==0)
                     {
                     BuyPriceMax       = op;
                     BuyPriceMaxLot    = lt;
                     BuyPriceMaxTic    = tk;
                     BuyMaxPriceProfit = pr;
                     }
                  }
               // ===
               if(OrderType()==OP_SELL)
                  {
                  s++;
                  SelLotsSum   += lt;
//                  WeighSell    += lt*op;
                  SelAllProfit += pr;
                  
                  if(op<SelPriceMin || SelPriceMin==0)
                     {
                     SelPriceMin       = op;
                     SelPriceMinLot    = lt;
                     SelPriceMinTic    = tk;
                     SelMinPriceProfit = pr;
                     }
                  }
               }
       //-----------------------------------------------------------------------------------        
      if(Ask>=BuyPriceMax + OrderStep*Point && s+b<MaxCountOrders-1)
         {
         if(BuyAllProfit + SelMinPriceProfit >= MinTP*SelPriceMinLot && SelMinPriceProfit!=0)
            {
            CloseAllType(OP_BUY);
            CloseTicket(SelPriceMinTic,OP_SELL);
            tk=OrderSend(NULL,OP_BUY, StartLot,NormalizeDouble(Ask,_Digits),Slippage,0,0,"",MagicNumber);
      
            if(tk<0) 
               return;
            else
               tk=OrderSend(NULL,OP_SELL,NL(StartLot*2),NormalizeDouble(Bid,_Digits),Slippage,0,0,"",MagicNumber);
            }
         else
            {
            tk=OrderSend(NULL,OP_BUY, StartLot,NormalizeDouble(Ask,_Digits),Slippage,0,0,"",MagicNumber);
      
            if(tk<0) 
               return;
            else
               tk=OrderSend(NULL,OP_SELL,StartLot,NormalizeDouble(Bid,_Digits),Slippage,0,0,"",MagicNumber);
            }
         }
      //---
      if(Bid<=SelPriceMin - OrderStep*Point && s+b<MaxCountOrders-1)
         {
         if(SelAllProfit + BuyMaxPriceProfit >= MinTP*BuyPriceMaxLot && BuyMaxPriceProfit!=0)
            {
            CloseAllType(OP_SELL);
            CloseTicket(BuyPriceMaxTic,OP_BUY);
            tk=OrderSend(NULL,OP_BUY, NL(StartLot*2),NormalizeDouble(Ask,_Digits),Slippage,0,0,"",MagicNumber);
      
            if(tk<0) 
               return;
            else
               tk=OrderSend(NULL,OP_SELL,StartLot,NormalizeDouble(Bid,_Digits),Slippage,0,0,"",MagicNumber);
            }
         else
            {
            tk=OrderSend(NULL,OP_BUY, StartLot,NormalizeDouble(Ask,_Digits),Slippage,0,0,"",MagicNumber);
      
            if(tk<0) 
               return;
            else
               tk=OrderSend(NULL,OP_SELL,StartLot,NormalizeDouble(Bid,_Digits),Slippage,0,0,"",MagicNumber);
            }
         }
}
//+------------------------------------------------------------------+
//| Закрытие позиции по тикету ордера                                |
//+------------------------------------------------------------------+
void CloseTicket(int tic,int type)
{
     if(!OrderSelect(tic, SELECT_BY_TICKET)) 
        Print("OrderSelect() вернул ошибку - ",GetLastError());
     else
        {
        if(type==OP_BUY)
           if(!OrderClose(tic,OrderLots(),NormalizeDouble(Bid,Digits),Slippage))
              Print("Order Close Buy вернул ошибку - ",GetLastError());
        if(type==OP_SELL)
           if(!OrderClose(tic,OrderLots(),NormalizeDouble(Ask,Digits),Slippage))
              Print("Order Close Sell вернул ошибку - ",GetLastError());
        }
}
//+------------------------------------------------------------------+
//| Закрытие всех ордеров по типу                                    |
//+------------------------------------------------------------------+
void CloseAllType(int ot)
{
   bool cl;

   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
            {
            if(OrderType()==OP_BUY && ot==OP_BUY)
               {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slippage);
               }
             if(OrderType()==OP_SELL && ot==OP_SELL)
               {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slippage);
               }
            }
}
//+------------------------------------------------------------------+
double NL(double lot) // нормализация лота
{
	double LotStep=MarketInfo(Symbol(), MODE_LOTSTEP);
	int k=0;
	if (LotStep<=0.001) k=3; else if (LotStep<=0.01) k=2; else if (LotStep<=0.1) k=1; // шаг лота

	double MinLot=MarketInfo(Symbol(), MODE_MINLOT);
	double MaxLot=MarketInfo(Symbol(), MODE_MAXLOT);
	return ND(MathMin(MaxLot, MathMax(MinLot, lot)), k); // венули нормализованный лот
}
//+------------------------------------------------------------------+
double ND(double d, int n=-1) 
{ 
      if (n<0) 
         return NormalizeDouble(d, Digits); 
    return NormalizeDouble(d, n); 
}
//+------------------------------------------------------------------+


Думаю, что трал убытка тоже улучшит результат.
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 24 июня 2022, 14:28
+
0
Где фиаско то?
avatar

  8  sergs Автор Сообщений: 224 - Сергей

  • 24 июня 2022, 16:04
+
0
Фиаско может с каждым приключиться. Все зависит от условий рынка, параметров и дэпо.
На графике при закрытии тестера дэпо становится равным эквити.
А если просадка по свободной марже накопится больше дэпо, то увидишь кочергу.
Game Over. ФИАСКО, сэр.

Да… и графики этого не показывают. А на реале можно вывести эту инфу на экран. При желании — в виде графика.
Редактирован: 24 июня 2022, 16:50
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 24 июня 2022, 16:45
+
+1
Да… советник забыл.

//+------------------------------------------------------------------+
//|                                                Arifmetik_KAE.mq4 |
//|                                              Copyright 2022, KAE |
//|                                     https://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, KAE"
#property link      "https://www.forexsystems.biz"
#property strict

input double          Risk                = 0;         // Risk на сделку в процентах от свободной маржи. Ели "0", то StartLot
input double          StartLots           = 0.02;      // Start lot
input int             OrderStep           = 168;       // Order step (in pips)
input int             MinProfit           = 21;        // Minimal profit for close Average orders (in pips)
input int             StopLoss            = 201;       // Stop Loss  (in pips)
input int             MaxCountOrders      = 22;        // Count Orders максимальное число ордеров в рынке.
//---
input int             MagicNumber         = 1961;      // Magic Number 
input int             Slippage            = 30;        // Slippage (in pips)
//---
double op,lt,tp,pr;
int    tk,b,s;
double StoimPunkta, MinTP;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
     StoimPunkta = MarketInfo(Symbol(),MODE_TICKVALUE) / ( MarketInfo(Symbol(),MODE_TICKSIZE) / MarketInfo(Symbol(),MODE_POINT) );
     MinTP = StoimPunkta*MinProfit;
//       Print("MinProfit за один пункт при lot=1.00,  ",+MinTP);
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   double StartLot=StartLots;
   
   if(Risk>0)
      StartLot = AccountFreeMargin()/100*Risk/MarketInfo(Symbol(), MODE_MARGINREQUIRED);
   StartLot = NL(StartLot);

   if(OrdersTotal()==0)
      {
      tk=OrderSend(NULL,OP_BUY, StartLot,ND(Ask),Slippage,NSL(OP_BUY),0,"",MagicNumber);
      
      if(tk<0) 
         return;
      else
         tk=OrderSend(NULL,OP_SELL,StartLot,ND(Bid),Slippage,NSL(OP_SELL),0,"",MagicNumber);
      }
    
   double
   BuyPriceMax=0,SelPriceMin=0,BuyPriceMaxLot=0,SelPriceMinLot=0;

   int
   BuyPriceMaxTic=0,SelPriceMinTic=0;
   
   double
   BuyLotsSum=0,SelLotsSum=0,WeighBuy=0, WeighSell=0,BuyAllProfit=0,SelAllProfit=0,
   BuyMaxPriceProfit=0,SelMinPriceProfit=0;

   b=0;s=0;pr=0;

   for(int i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               {
               op=NormalizeDouble(OrderOpenPrice(),Digits());
               lt=NormalizeDouble(OrderLots(),2);
               tk=OrderTicket();
               pr=OrderProfit()+OrderCommission()+OrderSwap();
               
               if(OrderType()==OP_BUY)
                  {
                  b++;
                  BuyLotsSum   += lt;
//                  WeighBuy     += lt*op;
                  BuyAllProfit += pr;
                  
                  if(op>BuyPriceMax || BuyPriceMax==0)
                     {
                     BuyPriceMax       = op;
                     BuyPriceMaxLot    = lt;
                     BuyPriceMaxTic    = tk;
                     BuyMaxPriceProfit = pr;
                     }
                  }
               // ===
               if(OrderType()==OP_SELL)
                  {
                  s++;
                  SelLotsSum   += lt;
//                  WeighSell    += lt*op;
                  SelAllProfit += pr;
                  
                  if(op<SelPriceMin || SelPriceMin==0)
                     {
                     SelPriceMin       = op;
                     SelPriceMinLot    = lt;
                     SelPriceMinTic    = tk;
                     SelMinPriceProfit = pr;
                     }
                  }
               }
       //-----------------------------------------------------------------------------------        
      if(Ask>=BuyPriceMax + OrderStep*Point && s+b<MaxCountOrders-1)
         {
         if(BuyAllProfit + SelMinPriceProfit >= MinTP*SelPriceMinLot && SelMinPriceProfit!=0)
            {
            CloseAllType(OP_BUY);
            CloseTicket(SelPriceMinTic,OP_SELL);
            tk=OrderSend(NULL,OP_BUY, StartLot,NormalizeDouble(Ask,_Digits),Slippage,NSL(OP_BUY),0,"",MagicNumber);
      
            if(tk<0) 
               return;
            else
               tk=OrderSend(NULL,OP_SELL,NL(StartLot*2),NormalizeDouble(Bid,_Digits),Slippage,NSL(OP_SELL),0,"",MagicNumber);
            }
         else
            {
            tk=OrderSend(NULL,OP_BUY, StartLot,NormalizeDouble(Ask,_Digits),Slippage,NSL(OP_BUY),0,"",MagicNumber);
      
            if(tk<0) 
               return;
            else
               tk=OrderSend(NULL,OP_SELL,StartLot,NormalizeDouble(Bid,_Digits),Slippage,NSL(OP_SELL),0,"",MagicNumber);
            }
         }
      //---
      if(Bid<=SelPriceMin - OrderStep*Point && s+b<MaxCountOrders-1)
         {
         if(SelAllProfit + BuyMaxPriceProfit >= MinTP*BuyPriceMaxLot && BuyMaxPriceProfit!=0)
            {
            CloseAllType(OP_SELL);
            CloseTicket(BuyPriceMaxTic,OP_BUY);
            tk=OrderSend(NULL,OP_BUY, NL(StartLot*2),NormalizeDouble(Ask,_Digits),Slippage,NSL(OP_BUY),0,"",MagicNumber);
      
            if(tk<0) 
               return;
            else
               tk=OrderSend(NULL,OP_SELL,StartLot,NormalizeDouble(Bid,_Digits),Slippage,NSL(OP_SELL),0,"",MagicNumber);
            }
         else
            {
            tk=OrderSend(NULL,OP_BUY, StartLot,NormalizeDouble(Ask,_Digits),Slippage,NSL(OP_BUY),0,"",MagicNumber);
      
            if(tk<0) 
               return;
            else
               tk=OrderSend(NULL,OP_SELL,StartLot,NormalizeDouble(Bid,_Digits),Slippage,NSL(OP_SELL),0,"",MagicNumber);
            }
         }
}
//+------------------------------------------------------------------+
//| Закрытие позиции по тикету ордера                                |
//+------------------------------------------------------------------+
void CloseTicket(int tic,int type)
{
     if(!OrderSelect(tic, SELECT_BY_TICKET)) 
        Print("OrderSelect() вернул ошибку - ",GetLastError());
     else
        {
        if(type==OP_BUY)
           if(!OrderClose(tic,OrderLots(),NormalizeDouble(Bid,Digits),Slippage))
              Print("Order Close Buy вернул ошибку - ",GetLastError());
        if(type==OP_SELL)
           if(!OrderClose(tic,OrderLots(),NormalizeDouble(Ask,Digits),Slippage))
              Print("Order Close Sell вернул ошибку - ",GetLastError());
        }
}
//+------------------------------------------------------------------+
//| Закрытие всех ордеров по типу                                    |
//+------------------------------------------------------------------+
void CloseAllType(int ot)
{
   bool cl;

   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
            {
            if(OrderType()==OP_BUY && ot==OP_BUY)
               {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slippage);
               }
             if(OrderType()==OP_SELL && ot==OP_SELL)
               {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slippage);
               }
            }
}
//+------------------------------------------------------------------+
double NL(double lot) // нормализация лота
{
	double LotStep=MarketInfo(Symbol(), MODE_LOTSTEP);
	int k=0;
	if (LotStep<=0.001) k=3; else if (LotStep<=0.01) k=2; else if (LotStep<=0.1) k=1; // шаг лота

	double MinLot=MarketInfo(Symbol(), MODE_MINLOT);
	double MaxLot=MarketInfo(Symbol(), MODE_MAXLOT);
	return ND(MathMin(MaxLot, MathMax(MinLot, lot)), k); // венули нормализованный лот
}
//+------------------------------------------------------------------+
double NSL(int dir) // Нормализация цены стоплоса
{
	if (StopLoss==0) return 0;
	
	double StopLvl=MarketInfo(Symbol(), MODE_STOPLEVEL)*Point;
	
	if (dir==OP_BUY) 
	   { 
	   double _sl=Ask-StopLoss*Point;
	   return NP(MathMin(_sl, Ask-StopLvl)); 
	   }
	if (dir==OP_SELL) 
	   { 
	   double _sl=Bid+StopLoss*Point;
	   return NP(MathMax(_sl, Bid+StopLvl)); 
	   }
	return 0;
}
//+------------------------------------------------------------------+
double ND(double d, int n=-1) 
{ 
      if (n<0) 
         return NormalizeDouble(d, Digits); 
    return NormalizeDouble(d, n); 
}
//+------------------------------------------------------------------+
double NP(double d) 
{
       double TickSize=MarketInfo(Symbol(), MODE_TICKSIZE); 
       
       if (TickSize==0) 
         TickSize=1; 
    return ND(MathRound(d/TickSize)*TickSize); 
}
//+------------------------------------------------------------------+
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 24 июня 2022, 16:40
+
+1
Трал просадки дает снижение просадка, а за одно и прибыли.
Короче на любителя. Кому, что предпочтительнее.
Добавил еще заодно трал прибыли. Оба трала при =0 не работают.
Оставил SL и ограничение количества ордеров.

Правда тестер из меня ещё тот. Выкинуть лишнее всегда можно.
Пока, просто отключаю. Количество ордеров =100(так тоже отключается).

//+------------------------------------------------------------------+
//|                                                Arifmetik_KAE.mq4 |
//|                                              Copyright 2022, KAE |
//|                                     https://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, KAE"
#property link      "https://www.forexsystems.biz"
#property strict

input double          Risk                = 0;         // Risk на сделку в процентах от свободной маржи. Ели "0", то StartLot
input double          StartLots           = 0.02;      // Start lot
input int             OrderStep           = 168;       // Order step (in pips)
input int             MinProfit           = 21;        // Minimal profit for close Average orders (in pips)
input int             StopLoss            = 0;         // Stop Loss  (in pips)
input double          LevelStopLoss       = 0;         // Level Trail Loss (in $) если =0, то трал отключён.
input double          LevelStopProfit     = 0;         // Level Trail Profit (in $) если =0, то трал отключён.
input int             MaxCountOrders      = 122;       // Count Orders максимальное число ордеров в рынке.
//---
input int             MagicNumber         = 1961;      // Magic Number 
input int             Slippage            = 30;        // Slippage (in pips)
//---
double op,lt,tp,pr;
int    tk,b,s;
double StoimPunkta, MinTP;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
     StoimPunkta = MarketInfo(Symbol(),MODE_TICKVALUE) / ( MarketInfo(Symbol(),MODE_TICKSIZE) / MarketInfo(Symbol(),MODE_POINT) );
     MinTP = StoimPunkta*MinProfit;
//       Print("MinProfit за один пункт при lot=1.00,  ",+MinTP);
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   double StartLot=StartLots;
   
   if(Risk>0)
      StartLot = AccountFreeMargin()/100*Risk/MarketInfo(Symbol(), MODE_MARGINREQUIRED);
   StartLot = NL(StartLot);

   if(OrdersTotal()==0)
      {
      tk=OrderSend(NULL,OP_BUY, StartLot,ND(Ask),Slippage,NSL(OP_BUY),0,"",MagicNumber);
      
      if(tk<0) 
         return;
      else
         tk=OrderSend(NULL,OP_SELL,StartLot,ND(Bid),Slippage,NSL(OP_SELL),0,"",MagicNumber);
      }
    
   double
   BuyPriceMax=0,SelPriceMin=0,BuyPriceMaxLot=0,SelPriceMinLot=0;

   int
   BuyPriceMaxTic=0,SelPriceMinTic=0;
   
   double
   BuyLotsSum=0,SelLotsSum=0,WeighBuy=0, WeighSell=0,BuyAllProfit=0,SelAllProfit=0,
   BuyMaxPriceProfit=0,SelMinPriceProfit=0;

   b=0;s=0;pr=0;

   for(int i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               {
               op=NormalizeDouble(OrderOpenPrice(),Digits());
               lt=NormalizeDouble(OrderLots(),2);
               tk=OrderTicket();
               pr=OrderProfit()+OrderCommission()+OrderSwap();
               
               if(OrderType()==OP_BUY)
                  {
                  b++;
                  BuyLotsSum   += lt;
//                  WeighBuy     += lt*op;
                  BuyAllProfit += pr;
                  
                  if(op>BuyPriceMax || BuyPriceMax==0)
                     {
                     BuyPriceMax       = op;
                     BuyPriceMaxLot    = lt;
                     BuyPriceMaxTic    = tk;
                     BuyMaxPriceProfit = pr;
                     }
                  }
               // ===
               if(OrderType()==OP_SELL)
                  {
                  s++;
                  SelLotsSum   += lt;
//                  WeighSell    += lt*op;
                  SelAllProfit += pr;
                  
                  if(op<SelPriceMin || SelPriceMin==0)
                     {
                     SelPriceMin       = op;
                     SelPriceMinLot    = lt;
                     SelPriceMinTic    = tk;
                     SelMinPriceProfit = pr;
                     }
                  }
               }
       //----------------------------------------------------------------------------------- 
       double AllProf = BuyAllProfit + SelAllProfit;
       if((AllProf>=LevelStopProfit && LevelStopProfit!=0) || (-
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 24 июня 2022, 17:51
+
+1
Окончание совы. Все не вместилось

AllProf>=LevelStopLoss && LevelStopLoss!=0))
         {
         CloseAllType(OP_BUY);
         CloseAllType(OP_SELL);
         }
       //----------------------------------------------------------------------------------- 
      if(Ask>=BuyPriceMax + OrderStep*Point && s+b<MaxCountOrders-1)
         {
         if(BuyAllProfit + SelMinPriceProfit >= MinTP*SelPriceMinLot && SelMinPriceProfit!=0)
            {
            CloseAllType(OP_BUY);
            CloseTicket(SelPriceMinTic,OP_SELL);
            tk=OrderSend(NULL,OP_BUY, StartLot,NormalizeDouble(Ask,_Digits),Slippage,NSL(OP_BUY),0,"",MagicNumber);
      
            if(tk<0) 
               return;
            else
               tk=OrderSend(NULL,OP_SELL,NL(StartLot*2),NormalizeDouble(Bid,_Digits),Slippage,NSL(OP_SELL),0,"",MagicNumber);
            }
         else
            {
            tk=OrderSend(NULL,OP_BUY, StartLot,NormalizeDouble(Ask,_Digits),Slippage,NSL(OP_BUY),0,"",MagicNumber);
      
            if(tk<0) 
               return;
            else
               tk=OrderSend(NULL,OP_SELL,StartLot,NormalizeDouble(Bid,_Digits),Slippage,NSL(OP_SELL),0,"",MagicNumber);
            }
         }
      //---
      if(Bid<=SelPriceMin - OrderStep*Point && s+b<MaxCountOrders-1)
         {
         if(SelAllProfit + BuyMaxPriceProfit >= MinTP*BuyPriceMaxLot && BuyMaxPriceProfit!=0)
            {
            CloseAllType(OP_SELL);
            CloseTicket(BuyPriceMaxTic,OP_BUY);
            tk=OrderSend(NULL,OP_BUY, NL(StartLot*2),NormalizeDouble(Ask,_Digits),Slippage,NSL(OP_BUY),0,"",MagicNumber);
      
            if(tk<0) 
               return;
            else
               tk=OrderSend(NULL,OP_SELL,StartLot,NormalizeDouble(Bid,_Digits),Slippage,NSL(OP_SELL),0,"",MagicNumber);
            }
         else
            {
            tk=OrderSend(NULL,OP_BUY, StartLot,NormalizeDouble(Ask,_Digits),Slippage,NSL(OP_BUY),0,"",MagicNumber);
      
            if(tk<0) 
               return;
            else
               tk=OrderSend(NULL,OP_SELL,StartLot,NormalizeDouble(Bid,_Digits),Slippage,NSL(OP_SELL),0,"",MagicNumber);
            }
         }
}
//+------------------------------------------------------------------+
//| Закрытие позиции по тикету ордера                                |
//+------------------------------------------------------------------+
void CloseTicket(int tic,int type)
{
     if(!OrderSelect(tic, SELECT_BY_TICKET)) 
        Print("OrderSelect() вернул ошибку - ",GetLastError());
     else
        {
        if(type==OP_BUY)
           if(!OrderClose(tic,OrderLots(),NormalizeDouble(Bid,Digits),Slippage))
              Print("Order Close Buy вернул ошибку - ",GetLastError());
        if(type==OP_SELL)
           if(!OrderClose(tic,OrderLots(),NormalizeDouble(Ask,Digits),Slippage))
              Print("Order Close Sell вернул ошибку - ",GetLastError());
        }
}
//+------------------------------------------------------------------+
//| Закрытие всех ордеров по типу                                    |
//+------------------------------------------------------------------+
void CloseAllType(int ot)
{
   bool cl;

   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
            {
            if(OrderType()==OP_BUY && ot==OP_BUY)
               {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slippage);
               }
             if(OrderType()==OP_SELL && ot==OP_SELL)
               {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slippage);
               }
            }
}
//+------------------------------------------------------------------+
double NL(double lot) // нормализация лота
{
	double LotStep=MarketInfo(Symbol(), MODE_LOTSTEP);
	int k=0;
	if (LotStep<=0.001) k=3; else if (LotStep<=0.01) k=2; else if (LotStep<=0.1) k=1; // шаг лота

	double MinLot=MarketInfo(Symbol(), MODE_MINLOT);
	double MaxLot=MarketInfo(Symbol(), MODE_MAXLOT);
	return ND(MathMin(MaxLot, MathMax(MinLot, lot)), k); // венули нормализованный лот
}
//+------------------------------------------------------------------+
double NSL(int dir) // Нормализация цены стоплоса
{
	if (StopLoss==0) return 0;
	
	double StopLvl=MarketInfo(Symbol(), MODE_STOPLEVEL)*Point;
	
	if (dir==OP_BUY) 
	   { 
	   double _sl=Ask-StopLoss*Point;
	   return NP(MathMin(_sl, Ask-StopLvl)); 
	   }
	if (dir==OP_SELL) 
	   { 
	   double _sl=Bid+StopLoss*Point;
	   return NP(MathMax(_sl, Bid+StopLvl)); 
	   }
	return 0;
}
//+------------------------------------------------------------------+
double ND(double d, int n=-1) 
{ 
      if (n<0) 
         return NormalizeDouble(d, Digits); 
    return NormalizeDouble(d, n); 
}
//+------------------------------------------------------------------+
double NP(double d) 
{
       double TickSize=MarketInfo(Symbol(), MODE_TICKSIZE); 
       
       if (TickSize==0) 
         TickSize=1; 
    return ND(MathRound(d/TickSize)*TickSize); 
}
//+------------------------------------------------------------------+

avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 24 июня 2022, 17:57
+
0
Данный советник работает строго по ТЗ топикстартера.
От себя добавил некоторые функции и немного расширил функционал.
Подробнее о закрытии ордеров.
После перехода цены с одного уровня на другой нужно высчитать сумму прибылей всех прибыльных ордеров и вычесть из нее убыток самого убыточного ордера в валюте. Если есть несколько убыточных ордеров с одинаковым убытком, то выбирается самый старый. Если результат будет равен или больше, чем значение профита в валюте в настройках, то эти ордера закрываются. Если меньше, то ни один ордер не закрывается.

Доработки:

extern bool   Trade = true;   //использовать автоторговлю

-включение/отключение автоторговли согласно ТЗ. В случае Trade = false;
советник сам позиции не открывает, но отслеживает существующие позиции и
закрывает их согласно ТЗ.
Кроме того при отключении данной функции советник может быть использован как
помощник для закрытия позиций, открытых другим советником.

extern int    Magic        = 0;     //-1 все ордера по символу

-Советник может отслеживать только свои позиции или все позиции, том числе
открытые в ручную или другим советником по данной паре.
В связи с тем, что это облегчённая версия без проверок, использовать можно только или на демосчете или в тестере.
В связи с тем, то советник открывает позиции через шаг, следовательно тестировать нужно только или на минутках или по тикам. Минимальный период доступных данных в тестере это минутки. Даже режим «тики» в тестере — это данные с минутного графика.Поэтому не занимайтесь самообманом тестируя советники в других режимах «по ценам открытия» или тем более «по контрольным точкам»!!!
cloud.mail.ru/public/qg7C/mnqbNjUiZ

avatar

  16  ssg Сообщений: 817

  • 25 июня 2022, 17:26
+
0
Сергей, здравствуйте. Не понял, правда, о каком ТЗ Вы говорите, но сову гляну. Чуть позже.
Редактирован: 25 июня 2022, 20:12
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 25 июня 2022, 20:04
+
0
Здравствуйте. ТЗ-это описание стратегии озвученное sergs в самом верху топика.
avatar

  16  ssg Сообщений: 817

  • 25 июня 2022, 20:46
+
0
-включение/отключение автоторговли согласно ТЗ.

Кроме того при отключении данной функции советник может быть использован как
помощник для закрытия позиций, открытых другим советником.


Просто интересно каким образом. Вы имеете ввиду открыть первые сделки самому?
Это очень круть.

но отслеживает существующие позиции и
закрывает их согласно ТЗ.


Тоже интересное ТЗ. Откуда? Блин, очки другие купить что ли нужно.

А… понял, главное красиво втереть. Лохи они ведь такие. Одним словом лохи.

Всё время на одни и те же грабли наступают. Не надоело?

Разочарован. Честно говоря, ожидал отправки… в Википедию.
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 25 июня 2022, 21:37
+
0
Результаты ниже среднего. Из трех вариантов лучшим оказался сов Андрея главного.
avatar

  8  sergs Автор Сообщений: 224 - Сергей

  • 26 июня 2022, 10:39
+
0
Ну что ж. Проверка идеи не дала ожидаемого результата.
Ради проверки и затеивалось всё.
Спасибо за работу. Она всё одно на пользу.
По крайней мере Вы уже поняли возможности того, что не даёт спокойно спать.
Знакомая картина.

А Вы с моим блогом про слабо ознакомились?
Редактирован: 26 июня 2022, 10:48
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 26 июня 2022, 10:45
+
0
Из трех вариантов лучшим оказался…

Сергей, только я семь вариантов давал.

Не сдавайтесь так быстро.
Кажется пятый показывал неплохие результаты.
Это где Вы про фиаско соизволили поразмышлять.
Редактирован: 26 июня 2022, 11:16
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 26 июня 2022, 11:07
+
0
Неплохие меня не устраивают. Мне нужны хорошие.
avatar

  8  sergs Автор Сообщений: 224 - Сергей

  • 26 июня 2022, 11:16
+
0
Думайте дальше. Не останавливайтесь.

Удачи. Был рад.
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 26 июня 2022, 11:18
+
0
И вам того же.
avatar

  8  sergs Автор Сообщений: 224 - Сергей

  • 26 июня 2022, 11:27
+
0
Если откинуть в сторону, что у АМ2 советник написан не по Вашему ТЗ, то может быть это и лучший вариант. Не знаю не проверял в тестере.Мне достаточно посмотреть код советника, что бы сопоставить ТЗ и исполнениё.
Замените у себя главную функцию на этот вариант. Я всего лишь добавил комментарии о текущих лотах, а значит и открытых позициях.Проверьте и проанализируйте информацию на экране и в журнале. Правила закрытия в советнике и в ТЗ сопоставьте сами.

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//-----------------------
   double LB=0,LS=0;
   int i,tip;
   for (i=0; i<OrdersTotal(); i++){    
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
         if (OrderSymbol()==Symbol() && OrderMagicNumber()==maga){
            tip = OrderType();
            if (tip==OP_BUY)            
            {  
               LB+=OrderLots();
            }                                        
            if (tip==OP_SELL)        
            {
               LS+=OrderLots();
            }
         }
      }
   }
 //-------------------
   int r=0;

   if(OrdersTotal()>3)
     {
      if(Minus(0)+AllProfit(1)>pr)
        {
         CloseMinus(0);
         CloseAll(1);
        }

      if(Minus(1)+AllProfit(0)>pr)
        {
         CloseMinus(1);
         CloseAll(0);
        }
     }


   if(CountTrades()<1)
     {
      r=OrderSend(NULL,0,lot,NormalizeDouble(Ask,_Digits),slip,0,0,"",maga);
      r=OrderSend(NULL,1,lot,NormalizeDouble(Bid,_Digits),slip,0,0,"",maga);
      last=Bid;
     }

   if(MathAbs(last-Bid)>=step*_Point && CountTrades()<count)
     {
      r=OrderSend(NULL,0,lot,NormalizeDouble(Ask,_Digits),slip,0,0,"",maga);
      r=OrderSend(NULL,1,lot,NormalizeDouble(Bid,_Digits),slip,0,0,"",maga);
      last=Bid;
     }

   Comment("\n All Profit: ",AllProfit(),
           "\n Buy Profit: ",AllProfit(0),
           "\n Sell Profit: ",AllProfit(1),
           "\n Buy Minus: ",Minus(0),
           "\n Sell Minus: ",Minus(1),
           "\n Buy Lot: ",LB,
           "\n Sell Lot: ",LS);
  }
//+------------------------------------------------------------------+


Остальные предложенные варианты даже не комментирую.Не зачем.
Мой вариант написан строго по Вашему ТЗ, без вольностей и отклонений.
Не его вина, что стратегия не очень прибыльная.
Зато 2,5 года держит стабильно при оптимизации только за полгода в тестере.Только тестируйте или на М1 или на других таймфреймах но по тикам.
Не занимайтесь самообманом.
avatar

  16  ssg Сообщений: 817

  • 26 июня 2022, 11:27
+
0
Только добавлен цикл подсчета суммы лотов покупок и продаж.

<code>double LB=0,LS=0;
   
   for(int i=0; i<OrdersTotal(); i++)    
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==maga)
            {
            if(OrderType()==OP_BUY)            
               LB+=OrderLots();
            if(OrderType()==OP_SELL)        
               LS+=OrderLots();
            }
</code>


Правда эти переменные нигде не используются.
Но функция написана правильно. Правда я немного упростил.
Люблю чистоту.

А так полный аналог Андрея.
Разница, конечно, будет из-за разных задержек и разной генерации тиков. Мизерная. Но не принципиальная.

Не стоит тратить время.
Редактирован: 14 июля 2022, 09:55
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 26 июня 2022, 14:03
+
0
сову гляну.


Извините, обманул.
Для меня ex.4, что женщина в парандже от пяток до макушки.
Чаще лучше просто губу раскатать, чем увидеть, что там под покровом.
Редактирован: 26 июня 2022, 18:09
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 25 июня 2022, 19:58
+
0
Страшно предположить, что там под ex.4 спрятано. Или подлежит продаже?
Честно говоря, после всего мне даже не интересно.
Редактирован: 25 июня 2022, 21:40
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 25 июня 2022, 21:24
+
0
Освежите в памяти, или перечитайте две басни Крылова И.А.«Мартышка и очки» и «Лисица и виноград».
Хотя, учитывая:
Блин, очки другие купить что ли нужно.

сам приведу окончания басен:
… То к темю их прижмет, то их на хвост нанижет,
То их понюхает, то их полижет…

Как ни полезна вещь,— цены не зная ей,
Невежда про нее свой толк всё к худу клонит…


и другая басня:
Голодная кума Лиса залезла в сад,
В нем винограду кисти рделись.
У кумушки глаза и зубы разгорелись;
А кисти сочные как яхонты горят;
Лишь то беда, висят они высоко:
Отколь и как она к ним ни зайдет,
Хоть видит око,
Да зуб неймет.
Пробившись попусту час целой,
Пошла и говорит с досадою: «Ну, что ж!
На взгляд-то он хорош,
Да зелен — ягодки нет зрелой:
Тотчас оскомину набьешь».
avatar

  16  ssg Сообщений: 817

  • 26 июня 2022, 04:40
+
0
А ёжики плакали, но продолжали…

Не люблю мазохистов. Ты тратишь на них время, а им приятнее и приятнее.
Вот если бы они сами,… головой,… да об стену…

Чего же вы не скопипастили «Войну и мир»? Что? Не смогли в интернете найти?
Может вам ссылочку дать? Ах да… Не влезет. А я знаю в чью влезет.

Вы своё бесполезное фуфло всё пытаетесь кому-то впарить за бабки?
Всё так с апломбом. Так важно.
Что? Понты дороже денег? Очки для солидности наденьте.

Я тут одной товарке на Привозе говорю, что у неё бычки дурно пахнут,
а она мне: «-А вы до стенки не досцыте.» Тихо так кричит. Аж стонет

Вы мне её напомнили. Да и бычки ваши дурно пахнут.

Я и советник начал давать в закрытом виде, что бы шакалящие испытывали трудности в своем благородном деле. Я тут посмотрел в интернете:

Шака́л (тур. Çakal происходит от санскр. Sṛgālaḥ[1][2]) — обобщённое название трёх или четырёх видов семейства псовых (Canidae), обитающих в Африке, Азии и Юго-Восточной Европе[3]. Шакал занимает аналогичную экологическую нишу, что и койот в Северной Америке. Небольшой или средний по размеру хищник, часто питающийся падалью и остатками.


Оказывается википедия даже не догадывается, что шакалы и в Сибири живут.


Редактирован: 14 июля 2022, 09:57
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 26 июня 2022, 07:57
+
+1
В данном советнике надо прикручивать индикатор RSI и торговать от -60 до +60 с настройками ибо сливатор. Получается он устроен по принципу усреднения ордеров, а такие ордера закрываются в безубытлк только если входы сочетать с RSI индикатором… тупо ставить покупки и продажи однозначный слив на рельном счёте, вопрос времени.
avatar

  16  dimiew Сообщений: 1595 - Zheni

  • 28 июня 2022, 09:35
+
0
Заказывай.
avatar

  8  sergs Автор Сообщений: 224 - Сергей

  • 28 июня 2022, 10:11
+
0
Уже давно такой придуман называется Swan 3 Ma Dual, там система вывода в безубыток мартингейл убийца депозитов. И доходность низкая что-то около 20-30% год, но надо искать на просторах тырнета некосячный вариант. Если напишу диссертацию по таким соведлам сделаю заказ, но есть более интересные входы по свечным анализам*war* 
avatar

  16  dimiew Сообщений: 1595 - Zheni

  • 28 июня 2022, 11:31
+
+1
Zheni, Вы, конечно, извините, но этот советник создавался для проверки идеи Сергея. Не ставилась задача создать абы что, лишь бы что-то там зарабатывалО.
Идея оказалась не совсем удачной. Вычеркнули и пошли проверять следующую. По другому никак. И Вам рекомендую, если это имеет значение.

Вот вам порождение этой идеи, которая при наличии опыта и ответственности, не сливает. Но в нём нет того «АХ», на который изначально рассчитывали. Правда от первоначальной идеи пришлось отползти слегка.

<code>//+------------------------------------------------------------------+
//|                                                Arifmetik_KAE.mq4 |
//|                                              Copyright 2022, KAE |
//|                                     https://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, KAE"
#property link      "https://www.forexsystems.biz"
#property strict

input double          Risk                = 0;         // Risk (in %) на сделку в процентах от свободной маржи. Ели "0", то StartLot
input double          StartLots           = 0.02;      // Start lot
input double          LotK                = 2.1;       // K Lot   Коэффициент увеличения лота
input int             OrderStep           = 168;       // Order step (in pips)
input int             MinProfit           = 21;        // Minimal profit (in pips) for close Average orders
input int             MaxCountOrders      = 22;        // Count Orders максимальное число ордеров в рынке.
input double          LevelStopLoss       = 0;         // Level Loss   (in $).
input double          LevelStopProfit     = 0;         // Level Profit (in $).
input int             LevelBU             = 0;         // Level BU     (in pips).
//---
input int             MagicNumber         = 1961;      // Magic Number 
input int             Slippage            = 30;        // Slippage (in pips)
//---
double op,lt,tp,pr;
int    tk,b,s;
double StoimPunkta, MinTP;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
     StoimPunkta = MarketInfo(Symbol(),MODE_TICKVALUE) / ( MarketInfo(Symbol(),MODE_TICKSIZE) / MarketInfo(Symbol(),MODE_POINT) );
     MinTP = StoimPunkta*MinProfit; // В деньгах
//       Print("MinProfit за один пункт при lot=1.00,  ",+MinTP);
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   double StartLot=StartLots;
   
   if(Risk>0)
      StartLot = AccountFreeMargin()/100*Risk/MarketInfo(Symbol(), MODE_MARGINREQUIRED);
      StartLot = NL(StartLot);

   if(OrdersTotal()==0)
      {
      tk=OrderSend(NULL,OP_BUY, StartLot,ND(Ask),Slippage,0,0,"",MagicNumber);
      
      if(tk<0) 
         return;
      else
         tk=OrderSend(NULL,OP_SELL,StartLot,ND(Bid),Slippage,0,0,"",MagicNumber);
      }
    
   double
   BuyPriceMax=0,SelPriceMin=0,BuyPriceMaxLot=0,SelPriceMinLot=0;

   int
   BuyPriceMaxTic=0,SelPriceMinTic=0;
   
   double
   BuyLotsSum=0,SelLotsSum=0,WeighBuy=0, WeighSell=0,BuyAllProfit=0,SelAllProfit=0,
   BuyMaxPriceProfit=0,SelMinPriceProfit=0;

   b=0;s=0;pr=0;

   for(int i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               {
               op=NormalizeDouble(OrderOpenPrice(),Digits());
               lt=NormalizeDouble(OrderLots(),2);
               tk=OrderTicket();
               pr=OrderProfit()+OrderCommission()+OrderSwap();
               
               if(OrderType()==OP_BUY)
                  {
                  b++;
                  BuyAllProfit += pr+OrderCommission()+OrderSwap();
                  
                  if(op>BuyPriceMax || BuyPriceMax==0)
                     {
                     BuyPriceMax       = op;
                     BuyPriceMaxLot    = lt;
                     BuyPriceMaxTic    = tk;
                     BuyMaxPriceProfit = pr;
                     }
                  }
               // ===
               if(OrderType()==OP_SELL)
                  {
                  s++;
                  SelAllProfit += pr+OrderCommission()+OrderSwap();
                  
                  if(op<SelPriceMin || SelPriceMin==0)
                     {
                     SelPriceMin       = op;
                     SelPriceMinLot    = lt;
                     SelPriceMinTic    = tk;
                     SelMinPriceProfit = pr;
                     }
                  }
               }
         double AllProfit = BuyAllProfit + SelAllProfit;
       //-----------------------------------------------------------------------------------        
      if(Ask>=BuyPriceMax + OrderStep*Point && s+b<MaxCountOrders-1)
         {
         if(BuyAllProfit + SelMinPriceProfit >= MinTP*SelPriceMinLot && SelMinPriceProfit!=0)
            {
            CloseAllType(OP_BUY);
            CloseTicket(SelPriceMinTic,OP_SELL);
            
            tk=OrderSend(NULL,OP_BUY, StartLot,NormalizeDouble(Ask,_Digits),Slippage,0,0,"",MagicNumber);
      
            if(tk<0) 
               return;
            else
               tk=OrderSend(NULL,OP_SELL,NL(MathCeil(StartLot*100*LotK)/100),NormalizeDouble(Bid,_Digits),Slippage,0,0,"",MagicNumber);
            }
         else
            {
            tk=OrderSend(NULL,OP_BUY, StartLot,NormalizeDouble(Ask,_Digits),Slippage,0,0,"",MagicNumber);
      
            if(tk<0) 
               return;
            else
               tk=OrderSend(NULL,OP_SELL,StartLot,NormalizeDouble(Bid,_Digits),Slippage,0,0,"",MagicNumber);
            }
         }
      //---
      if(Bid<=SelPriceMin - OrderStep*Point && s+b<MaxCountOrders-1)
         {
         if(SelAllProfit + BuyMaxPriceProfit >= MinTP*BuyPriceMaxLot && BuyMaxPriceProfit!=0)
            {
            CloseAllType(OP_SELL);
            CloseTicket(BuyPriceMaxTic,OP_BUY);
            
            tk=OrderSend(NULL,OP_BUY, NL(MathCeil(StartLot*100*LotK)/100),NormalizeDouble(Ask,_Digits),Slippage,0,0,"",MagicNumber);
      
            if(tk<0) 
               return;
            else
               tk=OrderSend(NULL,OP_SELL,StartLot,NormalizeDouble(Bid,_Digits),Slippage,0,0,"",MagicNumber);
            }
         else
            {
            tk=OrderSend(NULL,OP_BUY, StartLot,NormalizeDouble(Ask,_Digits),Slippage,0,0,"",MagicNumber);
      
            if(tk<0) 
               return;
            else
               tk=OrderSend(NULL,OP_SELL,StartLot,NormalizeDouble(Bid,_Digits),Slippage,0,0,"",MagicNumber);
            }
         }
         //---              
         if((AllProfit>=LevelStopProfit && LevelStopProfit!=0) || (-AllProfit>=LevelStopLoss && LevelStopLoss!=0))
            CloseAll();
                
         if(LevelBU>0) 
            BU();
}
//+------------------------------------------------------------------+
//| Закрытие позиции по тикету ордера                                |
></code>

Редактирован: 28 июня 2022, 16:38
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 28 июня 2022, 16:20
+
0
Дерьмо это, а не советник. Да прости меня, автор.
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 28 июня 2022, 16:42
+
0
Андрей, зайди в письма.
avatar

  8  sergs Автор Сообщений: 224 - Сергей

  • 28 июня 2022, 16:45
+
0
Ok.
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 28 июня 2022, 17:00
+
0
есть более интересные входы по свечным анализам


Во-первых это выражение голословно по двум причинам:
1. Не плохо бы пальчиком ткнуть хотя бы в ту сторону.
2. Есть много хорошего и кроме свечного анализа.

Я, например, знаю одного трейдера, который лет 17 назад открылся на понижение Иены и только периодически снимает часть прибыли, а вторую не глядя ни на какие там индикаторы, пирамидит.

Хотел бы Вас увидеть в дисскусии с ним о том, что есть, а что лучше.

У каждого додика своя…
Главное чтобы именно Вам была польза.
А зарабатывать может и сова с ошибочным кодом, не говоря уж о идее.
Она всё равно сольёт. Попозже. Советник — всего лишь помощник.

И ещё. Главное не только вход в рынок, но и сопровождение сделок. Равно, как и выход из него.
Редактирован: 5 июля 2022, 09:58
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 28 июня 2022, 16:54
+
0
Продолжение совы, если надо склеите.

<code>//+------------------------------------------------------------------+
void CloseTicket(int tic,int type)
{
     if(!OrderSelect(tic, SELECT_BY_TICKET)) 
        Print("OrderSelect() вернул ошибку - ",GetLastError());
     else
        {
        if(type==OP_BUY)
           if(!OrderClose(tic,OrderLots(),NormalizeDouble(Bid,Digits),Slippage))
              Print("Order Close Buy вернул ошибку - ",GetLastError());
        if(type==OP_SELL)
           if(!OrderClose(tic,OrderLots(),NormalizeDouble(Ask,Digits),Slippage))
              Print("Order Close Sell вернул ошибку - ",GetLastError());
        }
}
//+------------------------------------------------------------------+
//| Закрытие всех ордеров по типу                                    |
//+------------------------------------------------------------------+
void CloseAllType(int ot)
{
   bool cl;

   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
            {
            if(OrderType()==OP_BUY && ot==OP_BUY)
               {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slippage);
               }
             if(OrderType()==OP_SELL && ot==OP_SELL)
               {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slippage);
               }
            }
}
//+------------------------------------------------------------------+
double NL(double lot) // нормализация лота
{
	double LotStep=MarketInfo(Symbol(), MODE_LOTSTEP);
	int k=0;
	if (LotStep<=0.001) k=3; else if (LotStep<=0.01) k=2; else if (LotStep<=0.1) k=1; // шаг лота

	double MinLot=MarketInfo(Symbol(), MODE_MINLOT);
	double MaxLot=MarketInfo(Symbol(), MODE_MAXLOT);
	return ND(MathMin(MaxLot, MathMax(MinLot, lot)), k); // венули нормализованный лот
}
//+------------------------------------------------------------------+
double ND(double d, int n=-1) 
{ 
      if (n<0) 
         return NormalizeDouble(d, Digits); 
    return NormalizeDouble(d, n); 
}
//+------------------------------------------------------------------+
bool CloseAll()
{ 
   for(int i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
              {
              if(OrderType()==OP_BUY)
                if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage))
                  Sleep(500);
              if(OrderType()==OP_SELL)
                if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage))
                  Sleep(500);
              }
   return true;
}
//+------------------------------------------------------------------+
bool BU()
{ 
   for(int i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
              {
              double  sl = 0;
                      tp = OrderTakeProfit();
                      op = OrderOpenPrice();
                      lt = OrderLots();
              double _lt = NormalizeDouble(lt/2,2);
                           
              if(OrderType()==OP_BUY && Bid >= op+LevelBU*Point)
                {
                sl = NSL(OP_BUY,op);
                if(sl == OrderStopLoss())continue;
                 
                if(OrderModify(OrderTicket(),op,sl,0,0,clrNONE))
                  if(!OrderClose(OrderTicket(),_lt,Bid,Slippage))
                    Sleep(500);
                }
              //---
              if(OrderType()==OP_SELL &&  Ask <= op-LevelBU*Point)
                {
                sl = NSL(OP_SELL,op);
                if(sl == OrderStopLoss())continue;
                 
                if(OrderModify(OrderTicket(),op,sl,0,0,clrNONE))
                  if(!OrderClose(OrderTicket(),_lt,Ask,Slippage))
                    Sleep(500);
                }
              }
   return true;
}
//************************************************************************************************
double NSL(int dir, double oop) // Нормализация цены стоплоса
{
   double SL = LevelBU; 

	if (SL==0) return 0;
	
	double StopLvl=MarketInfo(Symbol(), MODE_STOPLEVEL)*Point;
	double _pr=NP((dir==OP_BUY)?Bid:Ask);
	
	if (dir==OP_BUY) 
	   { 
	   double _sl=oop-SL*Point;
	   return NP(MathMin(_sl, _pr-StopLvl)); 
	   }
	if (dir==OP_SELL) 
	   { 
	   double _sl=oop+SL*Point;
	   return NP(MathMax(_sl, _pr+StopLvl)); 
	   }
	return 0;
}
//+------------------------------------------------------------------+
double NP(double d) 
{
       double TickSize=MarketInfo(Symbol(), MODE_TICKSIZE); 
       
       if (TickSize==0) 
         TickSize=1; 
    return ND(MathRound(d/TickSize)*TickSize); 
}
//+------------------------------------------------------------------+
</code</code>


За месяц без особой настройки из 1000$:



переменные для USDCHF:

Прибыль 982.67 $ при просадке 5.64%

LotK=0.7 OrderStep=33 MinProfit=16 MaxCountOrders=28 LevelStopLoss=0 LevelStopProfit=0 LevelBU=330 Risk=0 StartLots=0.02 MagicNumber=1961 Slippage=30

Если использовать RSI, то только для замены шага сетки.
Можно и ещё всякой лабуды навесить, но, во-первых, это уже будет другой советник. Во-вторых — всё равно сливной.

А вообще-то пересмотрите своё отношение к индикаторам.

Редактирован: 28 июня 2022, 19:56
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 28 июня 2022, 16:36
+
0
пожалуйста склейте все сами, а то какие то мучения
avatar

  22  igrun Сообщений: 1569 - igrun

  • 28 июня 2022, 17:56
+
+1
Качайте с облака склейку.
disk.yandex.ru/d/CBcsqjPSOufJyQ
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 28 июня 2022, 18:52
+
0
На здоровье.
И Вам не хворать.
avatar

  6  kvashnin007 Сообщений: 521 - Андрей

  • 2 июля 2022, 07:32

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий
Начать торговлю с Альпари