Советники: VR---Overturn

 

VR---Overturn:

Советник может торговать в двух режимах: Мартингейл и антимартингейл...

Author: Владимир

 

Спасибо, давно хотел увидеть пример кода с функционалом обновлённого МКЛ4++

Думаю, если сюда добавить вход по нормальному ГСЧ (не того что в МКЛ, есть например этот) вместо жестко заданного направления входа, причём и в начале работы, и после стоплосса, то удастся немного уменьшить количество убыточных ходов.

 
evillive:

Спасибо, давно хотел увидеть пример кода с функционалом обновлённого МКЛ4++

Думаю, если сюда добавить вход по нормальному ГСЧ (не того что в МКЛ, есть например этот) вместо жестко заданного направления входа, причём и в начале работы, и после стоплосса, то удастся немного уменьшить количество убыточных ходов.


Да согласен и подтверждаю ... У меня есть несколько вариантов с торговой тактикой результаты лучше, в интернете часто продают такого советника за приличные деньги, что бы человек знал что покупает, я выложил бесплатно классическую версию без всяких премудростей и простую как два пальца.... Надеюсь данный код будет полезным не только как пример программирования, но и как пример тактик Мартингейл и Антимартингейл.
 
Большой респект и еще большее спасибо за подробный комментарий - как раз для нас лентяев, еще лучше было, чтобы советник сам определял (или какую кнопку ему приделать) по какому Мартину работать, хотя угадать невозможно - и с "+" может быстро уйти на минус и наоборот, так только для быстрого умножения при пипсовке-скальпинге - игре в угадайку )))
 

Дошли руки до вашего кода, несколько нубских вопросов:

1) Непонятно только как сработает ретурн в функции типа войд.

2) Ещё вот это

      if(Typ==0 && Lot==0 && Pro==0)          // если нам из истории ордеров по нашему меджик номеру вернулись нули 

Это если предыдущий был на покупку. А если предыдущий ордер был на продажу и Typ==1 что тогда будет?

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

3) В этой вот функции точно не нужно фигурные скобки ставить чтобы блоки if не пересекались? Путаницы не возникнет?

void OnTick()
  {
   if(!counter(BUY) && !counter(SEL)) // Проверим есть ли оредра советника ,если нет баев и нет селов
     {
      // Запросим данные из истории ордеров о последнем закрытом ордере и вернем требуемые нам значения
      // тип ордера, лот ордера, и его профит
      history(Typ,Lot,Pro);
     
      if (Pro>0 && TypTrade ==0) Lot=StartLot; // если советник работает в режиме мартингейл и профит больше ноля
                                              // то лот сделаем равным стартовому для позиции в том же направлении
                                             
      if (Pro<0 && TypTrade ==1) Lot=StartLot; // если советник работает в режиме антимартингейл и профит меньше ноля
                                              // то лот сделаем равным стартовому для позиции в том же направлении
     
      // Для первого ордера
      if(Typ==0 && Lot==0 && Pro==0)          // если нам из истории ордеров по нашему меджик номеру вернулись нули
                                              // значит нужно ткрыть первый ордер
        if(openorders(StartPoz,StartLot))     // если первы ордер открыт
            if(modify())return;               // модифицируем его и в случае успешной модификации передадим управление терминалу
      if(Typ==BUY && Lot!=0 && Pro>0)         // если последний закрытый ордер был на покупку и его профит больше нуля
         if(openorders(BUY,Lot*ALot))         // откроем ордер на покупку лотом в зависимости от типа TypTrade
            if(modify())return;               // модифицируем его и в случае успешной модификации передадим управление терминалу
      if(Typ==BUY && Lot!=0 && Pro<0)         // если последний закрытый ордер был на покупку и его профит меньше нуля
         if(openorders(SEL,Lot*MLot))         // откроем ордер на пр одажу лотом в зависимости от типа TypTrade
            if(modify())return;               // модифицируем его и в случае успешной модификации передадим управление терминалу
      if(Typ==SEL && Lot!=0 && Pro>0)         // если последний закрытый ордер был на продажу и его профит больше нуля
         if(openorders(SEL,Lot*ALot))         // откроем ордер на пр одажу лотом в зависимости от типа TypTrade
            if(modify())return;               // модифицируем его и в случае успешной модификации передадим управление терминалу
      if(Typ==SEL && Lot!=0 && Pro<0)         // если последний закрытый ордер был на продажу и его профит меньше нуля
         if(openorders(BUY,Lot*MLot))         // откроем ордер на покупку лотом в зависимости от типа TypTrade
            if(modify())return;               // модифицируем его и в случае успешной модификации передадим управление терминалу
     }
     else return ;                            // если ордера есть то передадим управление терминалу
  }
 
evillive:

Дошли руки до вашего кода, несколько нубских вопросов:

1) Непонятно только как сработает ретурн в функции типа войд.

2) Ещё вот это

      if(Typ==0 && Lot==0 && Pro==0)          // если нам из истории ордеров по нашему меджик номеру вернулись нули 

Это если предыдущий был на покупку. А если предыдущий ордер был на продажу и Typ==1 что тогда будет?

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

3) В этой вот функции точно не нужно фигурные скобки ставить чтобы блоки if не пересекались? Путаницы не возникнет?

void OnTick()
  {
   if(!counter(BUY) && !counter(SEL)) // Проверим есть ли оредра советника ,если нет баев и нет селов
     {
      // Запросим данные из истории ордеров о последнем закрытом ордере и вернем требуемые нам значения
      // тип ордера, лот ордера, и его профит
      history(Typ,Lot,Pro);
     
      if (Pro>0 && TypTrade ==0) Lot=StartLot; // если советник работает в режиме мартингейл и профит больше ноля
                                              // то лот сделаем равным стартовому для позиции в том же направлении
                                             
      if (Pro<0 && TypTrade ==1) Lot=StartLot; // если советник работает в режиме антимартингейл и профит меньше ноля
                                              // то лот сделаем равным стартовому для позиции в том же направлении
     
      // Для первого ордера
      if(Typ==0 && Lot==0 && Pro==0)          // если нам из истории ордеров по нашему меджик номеру вернулись нули
                                              // значит нужно ткрыть первый ордер
        if(openorders(StartPoz,StartLot))     // если первы ордер открыт
            if(modify())return;               // модифицируем его и в случае успешной модификации передадим управление терминалу
      if(Typ==BUY && Lot!=0 && Pro>0)         // если последний закрытый ордер был на покупку и его профит больше нуля
         if(openorders(BUY,Lot*ALot))         // откроем ордер на покупку лотом в зависимости от типа TypTrade
            if(modify())return;               // модифицируем его и в случае успешной модификации передадим управление терминалу
      if(Typ==BUY && Lot!=0 && Pro<0)         // если последний закрытый ордер был на покупку и его профит меньше нуля
         if(openorders(SEL,Lot*MLot))         // откроем ордер на пр одажу лотом в зависимости от типа TypTrade
            if(modify())return;               // модифицируем его и в случае успешной модификации передадим управление терминалу
      if(Typ==SEL && Lot!=0 && Pro>0)         // если последний закрытый ордер был на продажу и его профит больше нуля
         if(openorders(SEL,Lot*ALot))         // откроем ордер на пр одажу лотом в зависимости от типа TypTrade
            if(modify())return;               // модифицируем его и в случае успешной модификации передадим управление терминалу
      if(Typ==SEL && Lot!=0 && Pro<0)         // если последний закрытый ордер был на продажу и его профит меньше нуля
         if(openorders(BUY,Lot*MLot))         // откроем ордер на покупку лотом в зависимости от типа TypTrade
            if(modify())return;               // модифицируем его и в случае успешной модификации передадим управление терминалу
     }
     else return ;                            // если ордера есть то передадим управление терминалу
  }

1 - Просто будет выход из функции..

2 - Это проверка на то был ли у нас ордер, так как для работы советника мы должны вернуть данные закрытого ордера и работать с ними, а если это первый запуск советника и ордеров не было ...

3 - Мне так удобней, путаницы нет ...

 
При торговле по системе Антимартингейл необходимо четко определить границы увеличения лота, после которого трейдер должен вернуться к первоначальному лоту.
Например, после трех увеличений (0,01,0,02,0,05).
И как это задавать в настройках?
 
evillive:
При торговле по системе Антимартингейл необходимо четко определить границы увеличения лота, после которого трейдер должен вернуться к первоначальному лоту.
Например, после трех увеличений (0,01,0,02,0,05).
И как это задавать в настройках?


Никак, это просто описание принципов Мартингейла общего и анти мартингейла...

Но добавить код можно, он не сложный ...

 

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

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

Была попытка сделать вход во всех случаях по ГСЧ, но советник сделался слишком непредсказуем, параметры в тестере уже не подобрать, так как в следующий запуск результат не повторится.

 
evillive:

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

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

Была попытка сделать вход во всех случаях по ГСЧ, но советник сделался слишком непредсказуем, параметры в тестере уже не подобрать, так как в следующий запуск результат не повторится.


Мне немного не понятно чего вы хотите добиться или что хотите сделать ???

смысл останавливать советник через время ?

 
VOLDEMAR:
evillive:

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

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

Была попытка сделать вход во всех случаях по ГСЧ, но советник сделался слишком непредсказуем, параметры в тестере уже не подобрать, так как в следующий запуск результат не повторится.


Мне немного не понятно чего вы хотите добиться или что хотите сделать ???

смысл останавливать советник через время ?

Не останавливать а заставлять его сначала начинать. Если его просто остановить и снова запустить на том счёте, он не начнёт сначала, а с последнего закрытого ордера, нет?

Сделал пока так, может прокатит:

      if((TimeCurrent()-OrderCloseTime()) > (delay*3600)) {Typ=10;Lot=0;Pro=0;} //перед условием для открытия первой позиции 
Причина обращения: