Ребята помогите подсичтать количесво ордеров!) - страница 3

 
ABGammA:

Да думаю так будет проще, чем менять магики в сетке.

Я ищу последний ордер в сетке по тикету.(Открыть больше одного ордера на тик робот не может)

   int Ticket = 0;
   int OldTicket = 0;
   string NewComment;

   for(int i=0; i<=OrdersTotal()-1; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==magicnum)
              {
               Ticket = OrderTicket();
               if(Ticket> OldTicket)
                 {
                  OldTicket=OrderTicket();
                  NewComment = OrderComment();


А потом уже работаю с переменной NewComment, меня просто смутило что функция StringGetCharacter возвращает значение символа, а не сам символ, с двузначным числом в комментарии приходится извращаться в коде. Думала есть способ проще и удобней, мало ли) Мож я просто до него не дошла.

Как вариант, номер сделки выносить, например, в начало комментария. После поиска разделителя забираем строку до разделителя StringSetCharacter. Проверяем число символов в строке StringLen и уже конкретно увидим скольки значное число мы получили. От этого и пляшем.

Просто по логике робота, если из N ордеров, 1,2,3,4 были закрыты и существует N ордер, то надо сидеть и не жужжать, Если из N ордеров были закрыты 1,2,3,4 и N ордер тоже был закрыт, то он должен снова открыть N ордер.

Т.е. пока существует хотябы 1 ордер в середине сетки, робот будет стараться открыть ордера пока из комментария не получит максимально допустимый номер сделки. И отталкивается от последнего именно существующего ордера. Из N ордеров были закрыты 1,2,3, а также N-2, N-1 и N. То ордера N-2, N-1 и N надо снова открыть.

Если же сетки не существует, то робот обновляется и начинает строить новую сетку.

Поинтересуйтесь функциями StringFind() и StringSubsr().

Чтобы на одном тике несколько ордеров устанавливалось - все от вас зависит, если надо, то можно сделать, чуть подумать... Например, ту часть кода, которая выставляет ордера поместить в цикл...

 
Aleksey Mavrin:

Ну проще так проще. Попадётся брокер который трёт комменты, вернётесь к этому , удачи ;)

з.ы. магик - целое число, коммент - строковый тип. ВСЕГДА операции с целыми числами ПРОЩЕ и НАДЕЖНЕЕ чем со строками

з.ы.ы. Но раз уж вы любите строки, посмотрите ф-ию  StringSplit. С нею удобно в коммент множество пар-ров записать-прочитать. заодно проще определить что коммент "уже не тот")

Просто если менять магик, то надо будет переписывать с десяток функций которые от магика работают) Это ресурсозатратней)
 
ABGammA:
Просто если менять магик, то надо будет переписывать с десяток функций которые от магика работают) Это ресурсозатратней)

с десяток функций? ого как всё страшно. Люблю общаться с девушками, которые так молоды и наивны в вопросах программирования )) Хотите расскажу как это в два щелчка сделать? )

 
Aleksey Mavrin:

с десяток функций? ого как всё страшно. Люблю общаться с девушками, которые так молоды и наивны в вопросах программирования )) Хотите расскажу как это в два щелчка сделать? )

Спасибо)) До меня уже дошло))) Видимо недельный недосып сказывается, чет я протупила)))Да с магиками реально проще)

Тему можно закрывать) Всем спасибо за поддержу, Вы лучшие!))

 
ABGammA:

Спасибо)) До меня уже дошло))) Видимо недельный недосып сказывается, чет я протупила)))Да с магиками реально проще)

Тему можно закрывать) Всем спасибо за поддержу, Вы лучшие!))

Так мило :-), Заходите почаще, у нас ещё и напитки есть :-)

 
Aleksey Mavrin:

Так мило :-), Заходите почаще, у нас ещё и напитки есть :-)

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

if(OrderSymbol()==Symbol() && OrderMagicNumber()==magicnum)

Переписываем if(OrderSymbol()==Symbol() &&( OrderMagicNumber()>=magicnum || OrderMagicNumber()<=magicnum + MaxTrades)

Но если уменьшится пользователем MaxTrades во время открытых лотов, то ф-ция будет не корректна. И придется вводить доп переменную для проверки

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Тикет позиции. Уникальное число, которое присваивается каждой вновь открытой позиции. Как правило, соответствует тикету ордера, в результате которого она была открыта, за исключением случаев изменения тикета в результате служебных операций на сервере. Например, начисления свопов переоткрытием позиции. Для нахождения ордера, которым была открыта...
 
ABGammA:
А можете написать свой вариант? А то с тем что пришло мне в голову надо будет костыль писать, а хотелось бы получить более менее чистый код.

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

5557771 

5557772

...

555777NN

Где 555777 - магик эксперта

То функция просто должна проверить остаток от деления магика ордера на магик эксперта, если он целый и >0, то значит ордер наш.

проверка что целый - приводим рез-тат (он д.б. double) к ближайшему целому, если остаток он деления одного на другое =0, значит число целое. Это число и есть номер ордера.

Его присвоение ордеру - обратная манипуляция, сами же сделаете?

Функцию проверки магика вставляете с помощью ctrl-H  вместо выражения типа OrderMagic()==Magic, которое у вас в 10-ти местах. вуаля

з.ы. на вид может показаться лишние вычисления, это бред. операции со строками и жрут больше 

з.ы. в этом варианте не должно быть экспертов с магиками больше нашего. я думаю 100000 экспертов всем хватит))

Документация по MQL5: Основы языка / Операции и выражения / Арифметические операции
Документация по MQL5: Основы языка / Операции и выражения / Арифметические операции
  • www.mql5.com
Операция инкремента и декремента применяются только к переменным, к константам не применяются. Префиксныe инкремент (++i) и декремент (--k) применяются к переменной непосредственно перед использованием этой переменной в выражении. Могут возникнуть вычислительные проблемы при переносе вышеуказанного выражения из одной среды программирования в...
 
Aleksey Mavrin:

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

5557771 

5557772

...

555777NN

Где 555777 - магик эксперта

То функция просто должна проверить остаток от деления магика ордера на магик эксперта, если он целый и >0, то значит ордер наш.

проверка что целый - приводим рез-тат (он д.б. double) к ближайшему целому, если остаток он деления одного на другое =0, значит число целое. Это число и есть номер ордера.

Его присвоение ордеру - обратная манипуляция, сами же сделаете?

Функцию проверки магика вставляете с помощью ctrl-H  вместо выражения типа OrderMagic()==Magic, которое у вас в 10-ти местах. вуаля

з.ы. на вид может показаться лишние вычисления, это бред. операции со строками и жрут больше 

з.ы. в этом варианте не должно быть экспертов с магиками больше нашего. я думаю 100000 экспертов всем хватит))

А если робот использует 2 магика одновременно?) Например 1000 и 2000?) Отдельный магик на покупку, отдельный на продажу. Ладно костыль так костыль)) Все равно это проще чем танцы со строками.
 
ABGammA:
А если робот использует 2 магика одновременно?) Например 1000 и 2000?)

тогда для каждого возможное кол-во ордеров 999. для второго чуть больше даже.

В общем случае ко-во макс.ордеров равно минимуму из двух : 1. расстоянию между свои магиком и ближайшим большим 2. Минимальный магик*Х при таком Х, чтобы это число было больше нашего магика.

Спойлер - если использовать шестизначные магики - можно ничего не проверять и на всю жизнь точно хватит

ABGammA:
А если робот использует 2 магика одновременно?) Например 1000 и 2000?) Отдельный магик на покупку, отдельный на продажу. Ладно костыль так костыль)) Все равно это проще чем танцы со строками.

Тогда функцию сделайте принимающей магик как параметр, и используйте их хоть 10 ;)

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

Документация по MQL5: Математические функции / MathMin
Документация по MQL5: Математические функции / MathMin
  • www.mql5.com
Если в функцию передаются параметры разных типов, то параметр младшего типа автоматически приводится к старшему типу. Тип возвращаемого значения соответствует старшему типу.
 
Aleksey Mavrin:

тогда для каждого возможное кол-во ордеров 999. для второго чуть больше даже.

В общем случае ко-во макс.ордеров равно минимуму из двух : 1. расстоянию между свои магиком и ближайшим большим 2. Минимальный магик*Х при таком Х, чтобы это число было больше нашего магика.

Спойлер - если использовать шестизначные магики - можно ничего не проверять и на всю жизнь точно хватит

Тогда функцию сделайте принимающей магик как параметр, и используйте их хоть 10 ;)
Ну я так и подумала, что 999 ордеров точно хватит на 1 график в сетке. Тогда отсев ордеров будет выглядеть так

if(OrderSymbol()==Symbol() &&( OrderMagicNumber()>=magicnum || OrderMagicNumber()<=magicnum + 999)

При условии что магики должны всегда отличаться минимум на 1000 едениц.