Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 846

 
Pokrov:

У меня после функций прописан GetLastError и если возникает ошибка разве она в этот блок не поступит (так как написано) и команды не будут выполняться? Я так понимаю цепочку например  OrderSend()  ->  GetLastError -> блок ошибок Sleep(3000)  RefreshRates() -> выход из блока и если условия остались опять идет запрос OrderSend(). Или мои рассуждения и представления не верны. Я понимаю,что вы мне предлагаете прописать возвращаемое return значение 1 или 0 в блок, но у меня функции простые не привязаны к булевым значения типа SignalBuy, если я правильно понимаю туда и должны потом возвращаться значения return.           

Делаете цикл на количество торговых попыток при ошибке. Обновляете торговое окружение. Сбрасываете значение прошлой ошибки, отсылаете торговый запрос с проверкой на возвращаемый результат. Если вернули ошибку, анализируете её и, в зависимости от кода ошибки, либо полностью прерываете цикл, либо проводите необходимые действия по устранению ошибки и переходите к следующей итеррации цикла. Если торговая операция прошла успешно, прерываете цикл и возвращаете в вызывающую программу значение, соответствующее логике программы для дальнейшей обработки результата торгового запроса (либо флаг успешности выполнения функции, либо номер тикета открытого ордера, и т.д.).
 
Pokrov:

У меня после функций прописан GetLastError и если возникает ошибка разве она в этот блок не поступит (так как написано) и команды не будут выполняться? Я так понимаю цепочку например  OrderSend()  ->  GetLastError -> блок ошибок Sleep(3000)  RefreshRates() -> выход из блока и если условия остались опять идет запрос OrderSend(). Или мои рассуждения и представления не верны. Я понимаю,что вы мне предлагаете прописать возвращаемое return значение 1 или 0 в блок, но у меня функции простые не привязаны к булевым значения типа SignalBuy, если я правильно понимаю туда и должны потом возвращаться значения return.           

Я ещё дополню то, что в твоём примере после получения ошибки никакой реакции. Что проверяли, что нет, разве что поспать решили чуток или обновили данные. Просто выход по завершению функции OnTick()
 
Добрый день!

Нужен совет. В соответствии с условиями позиция должна закрывается и после 121 секунд потом должна открыться новая позиция. Как это сделать c Sleep(121000)?

if(GetProfitOpenHigestInPoint(NULL,OP_BUY,magic) > PiespieduClose*10)
{
ClosePosWithMaxProfitInCurrency(NULL,OP_BUY,magic);
Sleep(121000);
OpenPosition(NULL, OP_BUY, LotSize(),0,0,magic); 
}
 
abeiks:
Добрый день!

Нужен совет. В соответствии с условиями позиция должна закрывается и после 121 секунд потом должна открыться новая позиция. Как это сделать c Sleep(121000)?

OnTimer() в помощь
 
artmedia70:
OnTimer() в помощь
Спасибо! OnTimer() не пользовался никогда .  Эта часть кода находится в void OnTick().  Получится тогда функцию OpenPosition( обработать по OnTimer()? Если можете, пожалуйста, поправьте код как надо правильно туда вставить OnTimer()..
void OnTick()
{
...

if(GetProfitOpenHigestInPoint(NULL,OP_BUY,magic) > PiespieduClose*10)
{
ClosePosWithMaxProfitInCurrency(NULL,OP_BUY,magic);
EventSetTimer(121); 
OpenPosition(NULL, OP_BUY, LotSize(),0,0,magic); 
}

...   
}
 

народ только что переустановиль виндовс 7 после хотель установить Мт4 проблема втом что файлы не скачивается что делать ?

 
Алексей и Артем, спасибо за квалифицированные комментарии и советы!  
 
abeiks:
Спасибо! OnTimer() не пользовался никогда .  Эта часть кода находится в void OnTick().  Получится тогда функцию OpenPosition( обработать по OnTimer()? Если можете, пожалуйста, поправьте код как надо правильно туда вставить OnTimer()..

Таймер запускается в OnInit()

EventSetTimer(1); // раз в секунду

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

В OnTick() Проверяете эту переменную. Если больше 121, и нет позиции - открываете позицию - и, после проверки успешности её открытия, сбрасываете переменную в ноль.

Как только позиция будет закрыта, таймер видит её время закрытия (он это делает постоянно раз в секунду) и, если от текущего времени до времени закрытия позиции прошло меньше 121-й секунды, запускается отсчёт времени - каждую секунду значение переменно прибавляете на 1.

Примерно так. Где может быть баг - если позиция ещё не закрыта, то время её закрытия равно нулю. Это может вызвать проблему с запуском отсчёта. Можно сбрасывать переменную в -1, например.

Да, не забудьте в OnDeinit() уничтожить таймер:

//+------------------------------------------------------------------+
   void OnDeinit(const int reason) {EventKillTimer();}
//+------------------------------------------------------------------+
 
artmedia70:

Таймер запускается в OnInit()

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

В OnTick() Проверяете эту переменную. Если больше 121, и нет позиции - открываете позицию - и, после проверки успешности её открытия, сбрасываете переменную в ноль.

Как только позиция будет закрыта, таймер видит её время закрытия (он это делает постоянно раз в секунду) и, если от текущего времени до времени закрытия позиции прошло меньше 121-й секунды, запускается отсчёт времени - каждую секунду значение переменно прибавляете на 1.

Примерно так. Где может быть баг - если позиция ещё не закрыта, то время её закрытия равно нулю. Это может вызвать проблему с запуском отсчёта. Можно сбрасывать переменную в -1, например.

Да, не забудьте в OnDeinit() уничтожить таймер:

Ясно, спасибо. Наделся одной строкой это сделать, но видимо надо будет по дольше поработать.

 
abeiks:

Ясно, спасибо. Наделся одной строкой это сделать, но видимо надо будет по дольше поработать.

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