Как выполнить только однократное действие по серии убытков?

 

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

1. В глобальной переменной советника (не терминала) вести учёт убытков. Переменную наращивать после убытка и сбрасывать после прибыли. После достижения критического значения выбрасывать из функции start() с соответствующим сообщением. Этот вариант не катит, т.к. при перезапуске советника теряются значения всех его переменных.

2. Количество убытков считывать непосредственно из истории сделок. Тоже не катит, т.к. после достижения критического значения будет постоянное выбрасывание из функции start() даже после перезапуска советника.

Кто-нибудь может предложить надёжный вариант?

 
KimIV:

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

1. В глобальной переменной советника (не терминала) вести учёт убытков. Переменную наращивать после убытка и сбрасывать после прибыли. После достижения критического значения выбрасывать из функции start() с соответствующим сообщением. Этот вариант не катит, т.к. при перезапуске советника теряются значения всех его переменных.


Это с какого перепугу значения глобальных переменных теряются?
 
PapaYozh:

Это с какого перепугу значения глобальных переменных теряются?
Может быть Вы имеете в виду глобальные переменные терминала, а не советника?
 

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

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

 
KimIV:
Может быть Вы имеете в виду глобальные переменные терминала, а не советника?


Естественно. Я думал, и Вы имели ввиду "глобальные переменные", а не "глобальные переменные".

;)

 
У меня сделано так:
запрограммирована серия убыточных сделок в день.
С приходом нового дня серия обнуляется.
 
Stells:
У меня сделано так:
запрограммирована серия убыточных сделок в день.
С приходом нового дня серия обнуляется.
Тоже хороший вариант. Можно зделать вообще любой период "заморозки" эксперта, по истечении которого советник возобновит работу.
 
   prevday=DayOfYear();

      int Orders=HistoryTotal();  // history orders total
        int Losses=0; // number of losses orders without a break

        for(int s=Orders-1;s>=0;s--)
                  {
                 if(OrderSelect(s,SELECT_BY_POS,MODE_HISTORY)==false) 
                   { 
                        Print("Ошибка в истории!"); 
                        break;
                   }
                if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) 
                  continue;
                 if(OrderProfit()>0 && TimeDayOfYear(OrderOpenTime())==prevday)  break;
                if(OrderProfit()<0 && TimeDayOfYear(OrderOpenTime())==prevday) Losses++;
                  }
                if(Losses>=Losses_orders) {torg=1;}else
                if(Losses<Losses_orders) {torg=-1;}
 

Всем спасибо за варианты, но ситуация всё равно пока не проясняется.

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

Переменные... пусть даже глобальные терминала... Откуда брать информацию для их заполнения? Тоже из истории? Тогда в них вообще нет смысла. По факту появления убытка? А как отследить срабатывание стопа без считывания истории?

 
KimIV:

Всем спасибо за варианты, но ситуация всё равно пока не проясняется.

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

Переменные... пусть даже глобальные терминала... Откуда брать информацию для их заполнения? Тоже из истории? Тогда в них вообще нет смысла. По факту появления убытка? А как отследить срабатывание стопа без считывания истории?

Можно рассмотреть вариант добавления на чарт графических объектов с внесением нужных данных в свойства.

Такие объекты статичны и даже при перезагрузке терминала информация не теряется.

Как вариант, тоже самое можно реализовать посредством записи инфы в файл.

 
OnGoing:

Можно рассмотреть вариант добавления на чарт графических объектов с внесением нужных данных в свойствах типа description и т.п.

Такие объекты статичны и даже при перезагрузке терминала информация не теряется.

Как вариант, тоже самое можно реализовать посредством записи инфы в файл.

Всё, что Вы перечислили - это рычаги управления, которые ничем не отличаются от внешнего параметра или от глобальной переменной терминала. Отличие лишь в удобстве использования. Вопрос состоит в том, как и чем двигать эти рычаги? Получается, что автоматизировать этот процесс не получается :-)))))))) Нужно, видимо, рычаг давать в руки пользователю и на рычаге написать, чтоб не забывал его дёргать в нужные моменты ))))))))

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

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