Вопросы от "чайника" - страница 56

 
Interesting:

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

При тяжелой обработке таймера его конечно лучше отрубить на время слипом или до первого тика (вариантов тут масса), но если обработка таймера не очень тяжелая и период достаточно большой таймер можно не отрубать.

Также в обработке таймера можно предусмотреть проверку на то рабочий день или нет.

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

А что касается тестирования в тестере через функцию OnTimer() мультивалютного эксперта. Допустим таймер установлен с интервалом 10 секунд. Он будет тикать и все выходные дни за тестируемый период? Я так понял Владимир именно это имел ввиду. То есть, если указать таймеру, что субботу и воскресенье пропускать, то тестирование будет проходить существенно быстрее.
 
tol64:
А что касается тестирования в тестере через функцию OnTimer() мультивалютного эксперта. Допустим таймер установлен с интервалом 10 секунд. Он будет тикать и все выходные дни за тестируемый период? Я так понял Владимир именно это имел ввиду. То есть, если указать таймеру, что субботу и воскресенье пропускать, то тестирование будет проходить существенно быстрее.

1. Я пытался вырубать таймер на выходные при не очень сложных расчетах, сильно большой разницы не почувствовал (хотя различия были конечно), сейчас пока решил не вырубать таймер.

2. Да, если таймер выставлен, то без разницы в тестере или в обычном режиме срабатывание будет происходить до тех пор пока таймер не будет вырублен. Если речь идет о тестере то при интервале в 10 секунд срабатывание будет происходить весь период тестирования - каждые 10 секунд.

При остановке таймера на выходные есть несколько решений:

а. Вырубить таймер с записью состояния в переменную. При первом тике по основному инструменту (или по сигналу от "шпиона") таймер можно запустить снова. У этого способа есть недостатки, связанные с вероятностью пропуска тика или с запаздыванием тика на не ликвидном рынке. Пропуск тика может быть также связан с отсутствием коннекта с торговым сервером.

б. Тормоза по слипу, на определенный период времени. Хорошо то что период точно задан, плохо то что при таком способе не только таймер но и весь эксперт будет неактивен до наступления часа "X".

Хотя в тестере отработка всех позиций и ордеров происходить будет.

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

в. Разделить начинку таймера на две группы, первая выполняется постоянно (к примеру определение состояния коннекта), а вторая по условиям (рабочие дни, есть коннект, торговля разрешена и т.п.).

 
Interesting:


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

Приветы! Ооочень интересно.Вчера посетила меня подобная идея,автооптимизация в выходные,но не успел накропать пост с вопросом.А хотел написать следуещее:

1.Возможно ли такое проделать?Как это может выглядеть в коде..В частности открытие закрытие сделок.Или только их местоопределение и расчеты-подсчеты.Тоесть на выходных по тайиеру переходит в опрелеленную функцию,где циклически перематывает историю,и определяет лучшие параметры ..Для этого уже тики онлайн не нужны,и функция просто будет крутится в цикле..

2.Есть где на примете прочитать про такое,в какой нить ветке?

3.Если применить к чемпионату,то не будет ли грузить машину? Это уже наверное к организаторам вопрос. 

 
MetaDriver:
Ну и считай всё в обычном эксперте, на подходящем тайфрейме, а результат выводи в OnTester(). Торговать при этом не обязательно вовсе. Какие-то проблемы?

спасибо разобрался

Возник очередной вопрос, как закрыть позицию по времени, если цена не достигла ни тейк ни стоп-лосс

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

Поэтому вопрос, какой примерно код должен быть, чтоб закрыть ордер по истечению определенного времени ( например 1 сутки ) 

 

AccountInfoDouble(ACCOUNT_BALANCE) != AccountInfoDouble(ACCOUNT_EQUITY)

вот так мне приходится проверять, открыта ли сделка...

OrdersTotal ()!=0 не проканывает ))) очень интересный глюк ) 

 
papaklass:
Для позиций есть PosirionTotal(). OrdersTotal() только для отложенных (Pending) ордеров.

if ( PositionsTotal() == 1 )

тоже самое ... нет реакции

// Открываемся нормально 

      if ( TimeActivation ( 1 ) )

         {

            if ( _1_operation == 1 && Buy ( 0.10 ) == 1 ) { Sleep (600000); }

            if ( _1_operation == -1 && Sell ( 0.10 ) == 1 ) { Sleep (600000); }               

         }

// Закрыться до наступления тейка или стопа не могу 

      if ( TimeActivation ( 2 ) )

         {

            if ( PositionsTotal() == 1 ) /// НЕ ХРЕНА НЕ РАБОТАЕТ )))

               {

                  if ( _1_operation == 1 && Sell ( 0.10 ) == 1 ) { Sleep (600000); }

                  if ( _1_operation == -1 && Buy ( 0.10 ) == 1 ) { Sleep (600000); }               

               }  

         } 

 
BaTTLeBLooM:

спасибо разобрался

Поэтому вопрос, какой примерно код должен быть, чтоб закрыть ордер по истечению определенного времени ( например 1 сутки ) 

Пожалуйста.

Примерно так: запоминаешь момент открытия в переменную. Сразу же прибавляешь к ней нужный промежуток времени ( например 1 сутки = 60*60*24).

Затем в каждом тике (или тайме) отслеживаешь, не стало ли текущее время больше чем контрольное.  Если стало - закрываешься.   //  if (TimeCurrent() > MyControlTime) CloseMyPosition();

Документация по MQL5: Дата и время / TimeCurrent
Документация по MQL5: Дата и время / TimeCurrent
  • www.mql5.com
Дата и время / TimeCurrent - Документация по MQL5
 
BaTTLeBLooM:

if ( PositionsTotal() == 1 )

тоже самое ... нет реакции

// Открываемся нормально 

      if ( TimeActivation ( 1 ) )

         {

            if ( _1_operation == 1 && Buy ( 0.10 ) == 1 ) { Sleep (600000); }

            if ( _1_operation == -1 && Sell ( 0.10 ) == 1 ) { Sleep (600000); }               

         }

// Закрыться до наступления тейка или стопа не могу 

      if ( TimeActivation ( 2 ) )

         {

            if ( PositionsTotal() == 1 ) /// НЕ ХРЕНА НЕ РАБОТАЕТ )))

               {

                  if ( _1_operation == 1 && Sell ( 0.10 ) == 1 ) { Sleep (600000); }

                  if ( _1_operation == -1 && Buy ( 0.10 ) == 1 ) { Sleep (600000); }               

               }  

         } 

Вообще-то, непонятно, что Вы тут написали, но PositionTotal() тут явно не причём.

Поставьте Print() перед проверкой, =1 ?:

Print("PositionsTotal=",PositionsTotal());
if ( PositionsTotal() == 1 ) /// НЕ ХРЕНА НЕ РАБОТАЕТ )))
 
tol64:

Константин Груздев в своей статье предложил интересный метод со "шпионами" и "агентами". )) Но у меня что-то его "агент" exSpy Control panel MCM не хочет работать. 

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

MetaDriver:

Я думаю в тестере эта технология работать не будет. 

 Работает.

 
MetaDriver:

Пожалуйста.

Примерно так: запоминаешь момент открытия в переменную. Сразу же прибавляешь к ней нужный промежуток времени ( например 1 сутки = 60*60*24).

Затем в каждом тике (или тайме) отслеживаешь, не стало ли текущее время больше чем контрольное.  Если стало - закрываешься.   //  if (TimeCurrent() > MyControlTime) CloseMyPosition();

В переменную - вариант, но если требуется более надежное закрытие, даже после перезапуска терминала/советника, можно использовать для идентификации ордера меджик и проверять время его открытия.

//закрывает ордера с заданным меджиком по прошествию определенного периода(в сек)
void closeOrderByTime(int magic,int period) {
        MqlTradeRequest request;
        MqlTradeResult tradeResult;
        MqlTradeCheckResult checkResult;
        ulong ticket = -1;
        int cnt = OrdersTotal();
        for (int i=cnt-1; i>=0; i--) {  
                ticket = OrderGetTicket(i);
                if (OrderGetInteger(ORDER_MAGIC) == magic && ticket>0 && TimeCurrent() > OrderGetInteger(ORDER_TIME_SETUP)+period) {
                        request.action = TRADE_ACTION_REMOVE;
                        request.order = ticket;
                        if(OrderCheck(request,checkResult) ) {
                                OrderSend(request, tradeResult);
                        } else {
                                MessageBox("Ошибка");
                        }
                }
        }
}