Советники: VR---Overturn - страница 2

 
evillive:
VOLDEMAR:
evillive:

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

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

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


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

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

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

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

      if((TimeCurrent()-OrderCloseTime()) > (delay*3600)) Typ=0; //перед условием для открытия первой позиции 


Что бы начать с начального лота ??? Я правильно понял ???
 
VOLDEMAR:
evillive:

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

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

      if((TimeCurrent()-OrderCloseTime()) > (delay*3600)) {Typ=10;Lot=0;Pro=0;} //перед условием для открытия первой позиции 
Что бы начать с начального лота ??? Я правильно понял ???
Да, всё верно. Метод, описанный выше, не помог, в таком виде советник станет ждать всё время (delay) часов после закрытия КАЖДОГО ордера, то есть если ордеров нет - он сначала ждёт, потом открывает позу. А ждать он не должен, он должен сбросить лот до начального по прошествии заданного временного интервала при условии что до этого закрылся с прибылью. Это поможет выбрать новое направление для первого входа и предположительно может улучшить результат.
 
evillive:
VOLDEMAR:
evillive:

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

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

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


Что бы начать с начального лота ??? Я правильно понял ???

Да, всё верно. Метод, описанный выше, не помог, в таком виде советник станет ждать всё время (delay) часов после закрытия КАЖДОГО ордера, то есть если ордеров нет - он сначала ждёт, потом открывает позу.

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

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

Дело в том, что я пытаюсь применить случайный вход для первой попытки, а не беру направление в зависимости от последней закрытой позиции, то есть надо примерно так:

1) закрылись с прибылью? да; если нет, открываемся по оригинальному алгоритму без паузы;

2) пришло время начинать сначала? да; если нет, открываемся по оригинальному алгоритму без паузы;

3) если выполнены 1) и 2) - ставим начальный лот и открываемся по генератору случайных чисел (ну там если rnd >0 BUY, rnd < 0 SELL).

 
evillive:
VOLDEMAR:

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

Дело в том, что я пытаюсь применить случайный вход для первой попытки, а не беру направление в зависимости от последней закрытой позиции, то есть надо примерно так:

1) закрылись с прибылью? да; если нет, открываемся по оригинальному алгоритму без паузы;

2) пришло время начинать сначала? да; если нет, открываемся по оригинальному алгоритму без паузы;

3) если выполнены 1) и 2) - ставим начальный лот и открываемся по генератору случайных чисел (ну там если rnd >0 BUY, rnd < 0 SELL).



Ну так в чем проблема то ? If ( прибыль > 0 || time == true ) сброс лотов ;

при этом тиме получает сигнал по следующему нашли последний ордер в истории по времени и вернули его время закрытия

(текущее время - время последнего закрытого одера)>60*60*20 то тиме = труе елсе фалс

 
VOLDEMAR:


Ну так в чем проблема то ? If ( прибыль > 0 || time == true ) сброс лотов ;

при этом тиме получает сигнал по следующему нашли последний ордер в истории по времени и вернули его время закрытия

(текущее время - время последнего закрытого одера)>60*60*20 то тиме = труе елсе фалс


Ну я так примерно и сделал, не знаю только если правильно:
      if((TimeCurrent()-OrderCloseTime() > delay*3600) && Pro>0) reset=true; //delay - пауза в часах
      if(reset) {Typ=10;Lot=0;Pro=0;}
      
      if(rnd>0) tiptr=0;
      if(rnd<0) tiptr=1;
      if(rnd==0) return; //для уравнивания вариантов ноль отбросим
      // Для первого ордера
      if(Typ==10 && Lot==0 && Pro==0)               // если нам из истории ордеров по нашему меджик номеру вернулись нули 
                                                    // значит нужно ткрыть первый ордер
        if(openorders(tiptr,StartLot))              // если первы ордер открыт 
            if(modify())                            // модифицируем его и в случае успешной модификации передадим управление терминалу
            {reset=false; return;}                  //сбросим флаг перезагрузки.
 
evillive:
VOLDEMAR:


Ну так в чем проблема то ? If ( прибыль > 0 || time == true ) сброс лотов ;

при этом тиме получает сигнал по следующему нашли последний ордер в истории по времени и вернули его время закрытия

(текущее время - время последнего закрытого одера)>60*60*20 то тиме = труе елсе фалс


Ну я так примерно и сделал, не знаю только если правильно:
      if((TimeCurrent()-OrderCloseTime() > delay*3600) && Pro>0) reset=true; //delay - пауза в часах
      if(reset) {Typ=10;Lot=0;Pro=0;}
      
      if(rnd>0) tiptr=0;
      if(rnd<0) tiptr=1;
      if(rnd==0) return; //для уравнивания вариантов ноль отбросим
      // Для первого ордера
      if(Typ==10 && Lot==0 && Pro==0)               // если нам из истории ордеров по нашему меджик номеру вернулись нули 
                                                    // значит нужно ткрыть первый ордер
        if(openorders(tiptr,StartLot))              // если первы ордер открыт 
            if(modify())                            // модифицируем его и в случае успешной модификации передадим управление терминалу
            {reset=false; return;}                  //сбросим флаг перезагрузки.


Вы не правильно выбираете ордер OrderCloseTime()

Вы берете любой, сделайте поиск самого последнего.

 
VOLDEMAR:


Вы не правильно выбираете ордер OrderCloseTime()

Вы берете любой, сделайте поиск самого последнего.


Это выше ваша функция history(Typ,Lot,Pro); сработала, там ордер был выбран и обработан, в том числе и время закрытия, просто я из кода вырезал только кусочек, который отличается от оригинала.

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

      //глобально задаём переменную
     static datetime lastresettime=0;
        
      //в функции void OnTick()после вызова history(Typ,Lot,Pro);
      if((TimeCurrent()-lastresettime > delay*3600) && Pro>0) reset=true;
      if(reset) {Typ=NULL;Lot=NULL;Pro=NULL;lastresettime=TimeCurrent();}
      
      if(rnd>0) tiptr=0;
      if(rnd<0) tiptr=1;
      if(rnd==0) return;
      // Для первого ордера
      if(Typ==NULL && Lot==NULL && Pro==NULL)               // если нам из истории ордеров по нашему меджик номеру вернулись нули 
                                                    // значит нужно ткрыть первый ордер
        if(openorders(tiptr,StartLot))              // если первы ордер открыт 
            if(modify())                            // модифицируем его и в случае успешной модификации передадим управление терминалу
            {reset=false;
            Print("resetted");
            return;
            }     
 
evillive:
VOLDEMAR:


Вы не правильно выбираете ордер OrderCloseTime()

Вы берете любой, сделайте поиск самого последнего.


Это выше ваша функция history(Typ,Lot,Pro); сработала, там ордер был выбран и обработан, в том числе и время закрытия, просто я из кода вырезал только кусочек, который отличается от оригинала.

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

      //глобально задаём переменную
     static datetime lastresettime=0;
        
      //в функции void OnTick()после вызова history(Typ,Lot,Pro);
      if((TimeCurrent()-lastresettime > delay*3600) && Pro>0) reset=true;
      if(reset) {Typ=NULL;Lot=NULL;Pro=NULL;lastresettime=TimeCurrent();}
      
      if(rnd>0) tiptr=0;
      if(rnd<0) tiptr=1;
      if(rnd==0) return;
      // Для первого ордера
      if(Typ==NULL && Lot==NULL && Pro==NULL)               // если нам из истории ордеров по нашему меджик номеру вернулись нули 
                                                    // значит нужно ткрыть первый ордер
        if(openorders(tiptr,StartLot))              // если первы ордер открыт 
            if(modify())                            // модифицируем его и в случае успешной модификации передадим управление терминалу
            {reset=false;
            Print("resetted");
            return;
            }     



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

EURUSD,H1: OrderSend error 131

Пишет каждую секунду, ордера не выставляет. Что бы это значило?

Причина обращения: