Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 230

 
Aleksey Mavrin:

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

не всегда конечно же, но часто бывает что цена просто летит за минуту и советник тупо закрывает по фиксированной цене.
 
Nargiz Ravanova:

я сделала как вы сказали, просто почему то после закрытия советник открывает закрывает сделки пару раз, несмотря на то что после функции CloseAll() стоит у меня слип на час.

datetime sleep = TimeCurrent();
if(sleep > TimeCurrent())
     return;
//---
double op = CalculateProfit();

if(op >= Profit && LastTime == 0)
     LastTime = TimeCurrent();
if(LastTime > 0 && TimeCurrent() - LastTime >= Second)

    {
     CloseAll();
     LastTime = 0;

     SendNotification("Trade is end");
     sleep = TimeCurrent()+60*60;
    }

Как-то так. Конечно просто на коленке написано.

 
Konstantin Nikitin:

Как-то так. Конечно просто на коленке написано.

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

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

 
Nargiz Ravanova:

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

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

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

 
Nargiz Ravanova:

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

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

Так думаю понятней будет?

input double Profit   = 100.0;
input int    Second   = 10;
//+------------------------------------------------------------------+
void CloseAllSleep(void)
    {
     static datetime sleep_all = TimeCurrent();
     static datetime LastTime = 0;
     if(sleep_all > TimeCurrent())
          return;
//---
     if(LastTime == 0)
         {
          if(CalculateProfit() < Profit)
               return;
          LastTime = TimeCurrent();
         }
     if(TimeCurrent() - LastTime >= Second)
          return;
//---
     if(!CloseAll())
          return;
     LastTime = 0;

     SendNotification("Trade is end");
     sleep_all = TimeCurrent()+60*60;
    }

//--- Считаем профит открытых позиций
double CalculateProfit(void)
    {
     return 0.0;
    }
//--- Закрываем все позиции
bool CloseAll(void)
    {
     return true;
    }

И опять это чисто для понимая. А уж что и как нужно реализовать, думать вам самому.

 
Nargiz Ravanova:
не всегда конечно же, но часто бывает что цена просто летит за минуту и советник тупо закрывает по фиксированной цене.

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

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

 
Konstantin Nikitin:

Так думаю понятней будет?

И опять это чисто для понимая. А уж что и как нужно реализовать, думать вам самому.

если честно не понятно, ничего забудьте, что нить придумаю.

 
Aleksey Mavrin:

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

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

тут простой слип не можем исправить, а вы про скорость говорите))))
 
Nargiz Ravanova:
тут простой слип не можем исправить, а вы про скорость говорите))))

Ставящему перед собой высокие цели в их достижении помогает всевышний! ;)

 
Nargiz Ravanova:
тут простой слип не можем исправить, а вы про скорость говорите))))

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

Функцию Sleep() нельзя вызывать из пользовательских индикаторов, так как индикаторы выполняются в интерфейсном потоке и не должны его тормозить.

Так что разбирайтесь с использованием флагов, Оно вам пригодиться в будущем.